| import FreeCAD as App | |
| import FreeCADGui as Gui | |
| from FreeCAD import Vector, Placement, Rotation | |
| import Part | |
| import math | |
| def createBearing(): | |
| doc = App.newDocument("Bearing") | |
| INNER_RING_INNER_DIAMETER = 25.0 | |
| INNER_RING_OUTER_DIAMETER = 35.0 | |
| OUTER_RING_INNER_DIAMETER = 45.0 | |
| OUTER_RING_OUTER_DIAMETER = 52.0 | |
| BEARING_WIDTH = 15.0 | |
| BALL_DIAMETER = 7.0 | |
| NUMBER_OF_BALLS = 8 | |
| INNER_RING_RADIUS_INNER = INNER_RING_INNER_DIAMETER / 2 | |
| INNER_RING_RADIUS_OUTER = INNER_RING_OUTER_DIAMETER / 2 | |
| OUTER_RING_RADIUS_INNER = OUTER_RING_INNER_DIAMETER / 2 | |
| OUTER_RING_RADIUS_OUTER = OUTER_RING_OUTER_DIAMETER / 2 | |
| BALL_RADIUS = BALL_DIAMETER / 2 | |
| PCD_BALLS = (INNER_RING_RADIUS_OUTER + OUTER_RING_RADIUS_INNER) / 2 | |
| outer_ring_outer_cyl = doc.addObject("Part::Cylinder", "OuterRing_OuterCylinder") | |
| outer_ring_outer_cyl.Radius = OUTER_RING_RADIUS_OUTER | |
| outer_ring_outer_cyl.Height = BEARING_WIDTH | |
| outer_ring_outer_cyl.Placement.Base = Vector(0, 0, 0) | |
| outer_ring_inner_cyl = doc.addObject("Part::Cylinder", "OuterRing_InnerBore") | |
| outer_ring_inner_cyl.Radius = OUTER_RING_RADIUS_INNER | |
| outer_ring_inner_cyl.Height = BEARING_WIDTH | |
| outer_ring_inner_cyl.Placement.Base = Vector(0, 0, 0) | |
| outer_ring_cut = doc.addObject("Part::Cut", "OuterRing") | |
| outer_ring_cut.Base = outer_ring_outer_cyl | |
| outer_ring_cut.Tool = outer_ring_inner_cyl | |
| inner_ring_outer_cyl = doc.addObject("Part::Cylinder", "InnerRing_OuterCylinder") | |
| inner_ring_outer_cyl.Radius = INNER_RING_RADIUS_OUTER | |
| inner_ring_outer_cyl.Height = BEARING_WIDTH | |
| inner_ring_outer_cyl.Placement.Base = Vector(0, 0, 0) | |
| inner_ring_inner_cyl = doc.addObject("Part::Cylinder", "InnerRing_InnerBore") | |
| inner_ring_inner_cyl.Radius = INNER_RING_RADIUS_INNER | |
| inner_ring_inner_cyl.Height = BEARING_WIDTH | |
| inner_ring_inner_cyl.Placement.Base = Vector(0, 0, 0) | |
| inner_ring_cut = doc.addObject("Part::Cut", "InnerRing") | |
| inner_ring_cut.Base = inner_ring_outer_cyl | |
| inner_ring_cut.Tool = inner_ring_inner_cyl | |
| for i in range(NUMBER_OF_BALLS): | |
| angle_deg = 360 * i / NUMBER_OF_BALLS | |
| angle_rad = math.radians(angle_deg) | |
| x = PCD_BALLS * math.cos(angle_rad) | |
| y = PCD_BALLS * math.sin(angle_rad) | |
| ball = doc.addObject("Part::Sphere", f"Ball_{i+1:02d}") | |
| ball.Radius = BALL_RADIUS | |
| ball.Placement.Base = Vector(x, y, BEARING_WIDTH / 2) | |
| CAGE_THICKNESS = BALL_DIAMETER * 0.5 | |
| CAGE_INNER_RADIUS_EFFECTIVE = PCD_BALLS - CAGE_THICKNESS / 2 | |
| CAGE_OUTER_RADIUS_EFFECTIVE = PCD_BALLS + CAGE_THICKNESS / 2 | |
| cage_base_outer = doc.addObject("Part::Cylinder", "Cage_BodyOuter") | |
| cage_base_outer.Radius = CAGE_OUTER_RADIUS_EFFECTIVE | |
| cage_base_outer.Height = BEARING_WIDTH | |
| cage_base_outer.Placement.Base = Vector(0, 0, 0) | |
| cage_base_inner = doc.addObject("Part::Cylinder", "Cage_BodyInner") | |
| cage_base_inner.Radius = CAGE_INNER_RADIUS_EFFECTIVE | |
| cage_base_inner.Height = BEARING_WIDTH | |
| cage_base_inner.Placement.Base = Vector(0, 0, 0) | |
| cage_ring = doc.addObject("Part::Cut", "Cage_RingBase") | |
| cage_ring.Base = cage_base_outer | |
| cage_ring.Tool = cage_base_inner | |
| current_cage_shape = cage_ring | |
| for i in range(NUMBER_OF_BALLS): | |
| angle_deg = 360 * i / NUMBER_OF_BALLS | |
| angle_rad = math.radians(angle_deg) | |
| x = PCD_BALLS * math.cos(angle_rad) | |
| y = PCD_BALLS * math.sin(angle_rad) | |
| pocket_radius = BALL_RADIUS * 1.05 | |
| pocket_height = BEARING_WIDTH * 1.1 | |
| ball_pocket = doc.addObject("Part::Cylinder", f"CagePocket_{i+1:02d}") | |
| ball_pocket.Radius = pocket_radius | |
| ball_pocket.Height = pocket_height | |
| ball_pocket.Placement.Base = Vector(x, y, (BEARING_WIDTH - pocket_height) / 2) | |
| cut_cage = doc.addObject("Part::Cut", f"Cage_Slotted_{i+1:02d}") | |
| cut_cage.Base = current_cage_shape | |
| cut_cage.Tool = ball_pocket | |
| current_cage_shape = cut_cage | |
| doc.recompute() | |
| Gui.activeDocument().activeView().viewAxometric() | |
| Gui.SendMsgToActiveView("ViewFit") | |
| return doc | |
| if __name__ == "__main__": | |
| createBearing() | |
| import FreeCADGui | |
| FreeCADGui.activeDocument().activeView().viewAxometric() | |
| FreeCADGui.SendMsgToActiveView("ViewFit") | |