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