File size: 4,286 Bytes
41d6e2b
f1a45cb
09bcf95
 
3c38be2
 
09bcf95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c38be2
09bcf95
 
 
f1a45cb
09bcf95
 
 
f1a45cb
09bcf95
 
 
 
f1a45cb
09bcf95
 
 
 
f1a45cb
09bcf95
 
 
f1a45cb
09bcf95
f1a45cb
09bcf95
 
f1a45cb
09bcf95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f1a45cb
 
 
 
 
 
 
09bcf95
41d6e2b
dddf9a7
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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")