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")