Sign in with STEVE

Compare versions

3 files changed, +64 −17 1.1.0: Looks like a bearing: rings and rolling elements. detail = simple keeps one solid ring.

part.py +38 −10
@@ -1,18 +1,46 @@
1"""Single-direction thrust ball bearing, 511, 512 and 513 series, bore up to 50 mm: envelope for assemblies, one solid with the boundary dimensions bore d, outside
2diameter D and height T. Rolling elements, cage and the gaps between the rings are not modelled. Axis along Z, centred on the origin."""
1"""Single-direction thrust ball bearing, 511, 512 and 513 series, bore up to 50 mm. Bore d, outside diameter D, height T, shaft washer outside d1, housing washer bore D1, washer thickness t and chamfer r are sourced and make the fit. detail = "full": two washers with raceways and the balls between them. The rolling element size and count, shoulder heights and clearances are proportions for looks, not for design, and never change the fit dimensions. The cage is not drawn. detail = "simple": one solid ring. Axis along Z, centred on the origin."""
2import math
3
34from steve import Model
45
56designation = "51104" # Bearing number
7detail = "full" # full: rings and rolling elements; simple: one solid
68
7# number: (d, D, T). NTN Ball and Roller Bearings CAT. No. 2203-3/E (2024), pp. B-150 to B-151 (PDF pages 226 and 227), boundary dimensions.
8BEARINGS = {"51100": (10, 24, 9), "51101": (12, 26, 9), "51102": (15, 28, 9), "51103": (17, 30, 9), "51104": (20, 35, 10), "51105": (25, 42, 11), "51106": (30, 47, 11), "51107": (35, 52, 12), "51108": (40, 60, 13), "51109": (45, 65, 14), "51110": (50, 70, 14), "51200": (10, 26, 11), "51201": (12, 28, 11), "51202": (15, 32, 12), "51203": (17, 35, 12), "51204": (20, 40, 14), "51205": (25, 47, 15), "51206": (30, 52, 16), "51207": (35, 62, 18), "51208": (40, 68, 19), "51209": (45, 73, 20), "51210": (50, 78, 22), "51305": (25, 52, 18), "51306": (30, 60, 21), "51307": (35, 68, 24), "51308": (40, 78, 26), "51309": (45, 85, 28), "51310": (50, 95, 31)}
9# number: (d, D, T, housing washer bore D1, washer thickness t, r). NTN Ball and Roller Bearings CAT. No. 2203-3/E (2024), pp. B-150 to B-151 (PDF pages 226-227), https://www.ntnglobal.com/en/products/catalog/pdf/2203E.pdf
10BEARINGS = {"51100": (10, 24, 9, 11, 2.5, 0.3), "51101": (12, 26, 9, 13, 2.5, 0.3), "51102": (15, 28, 9, 16, 2.5, 0.3), "51103": (17, 30, 9, 18, 2.5, 0.3), "51104": (20, 35, 10, 21, 2.5, 0.3), "51105": (25, 42, 11, 26, 3, 0.6), "51106": (30, 47, 11, 32, 3, 0.6), "51107": (35, 52, 12, 37, 3.5, 0.6), "51108": (40, 60, 13, 42, 3.8, 0.6), "51109": (45, 65, 14, 47, 4, 0.6), "51110": (50, 70, 14, 52, 4, 0.6), "51200": (10, 26, 11, 12, 3.3, 0.6), "51201": (12, 28, 11, 14, 3.3, 0.6), "51202": (15, 32, 12, 17, 3.5, 0.6), "51203": (17, 35, 12, 19, 3.5, 0.6), "51204": (20, 40, 14, 22, 4.1, 0.6), "51205": (25, 47, 15, 27, 4.3, 0.6), "51206": (30, 52, 16, 32, 5, 0.6), "51207": (35, 62, 18, 37, 5.2, 1), "51208": (40, 68, 19, 42, 5.5, 1), "51209": (45, 73, 20, 47, 6, 1), "51210": (50, 78, 22, 52, 7, 1), "51305": (25, 52, 18, 27, 5, 1), "51306": (30, 60, 21, 32, 6.4, 1), "51307": (35, 68, 24, 37, 7.2, 1), "51308": (40, 78, 26, 42, 7.6, 1), "51309": (45, 85, 28, 47, 8.3, 1), "51310": (50, 95, 31, 52, 9.2, 1)}
911
10d, D, width = BEARINGS[designation]
12d, D, T, D1, t, r = BEARINGS[designation]
13W = T
1114model = Model()
12with model.sketch("rings", on="XY", name="Rings") as sk:
13 sk.circle("outer", (0, 0), D / 2)
14 sk.circle("bore", (0, 0), d / 2)
15model.extrude("body", "rings", distance=width, both=True, name="Bearing")
16model.material("steel-generic", color="#b9bdc2")
15if detail == "simple":
16 outline = [(d / 2 + r, -W / 2), (D / 2 - r, -W / 2), (D / 2, -W / 2 + r), (D / 2, W / 2 - r), (D / 2 - r, W / 2), (d / 2 + r, W / 2),
17 (d / 2, W / 2 - r), (d / 2, -W / 2 + r)]
18 with model.sketch("section", on="XZ", name="Section") as sk:
19 sk.polyline("ring", outline, closed=True)
20 model.revolve("inner", "section", axis="Z", name="Bearing")
21else:
22 pitch_r = (D + D1) / 4
23 depth = 0.25 * t # raceway depth in each washer
24 ball = T - 2 * t + 2 * depth
25 race = ball / 2 + 0.02 * ball
26 half = math.sqrt(race * race - (race - depth) ** 2)
27 angles = [math.asin(half / race) * (i - 4) / 4 for i in range(9)]
28 low_face_z, low_top = -T / 2, -T / 2 + t
29 high_top, high_face_z = T / 2 - t, T / 2
30 low_groove = [(pitch_r + race * math.sin(a), -race * math.cos(a)) for a in reversed(angles)]
31 high_groove = [(pitch_r + race * math.sin(a), race * math.cos(a)) for a in angles]
32 shaft_washer = [(d / 2 + r, low_face_z), (D / 2 - r, low_face_z), (D / 2, low_face_z + r), (D / 2, low_top)] + low_groove + [(d / 2, low_top), (d / 2, low_face_z + r)]
33 housing_washer = [(D1 / 2, high_face_z - r), (D1 / 2, high_top)] + [p for p in reversed(high_groove)][::-1][:0] + high_groove + [(D / 2, high_top), (D / 2, high_face_z - r), (D / 2 - r, high_face_z), (D1 / 2 + r, high_face_z)]
34 with model.sketch("shaft_section", on="XZ", name="Shaft washer section") as sk:
35 sk.polyline("shaft_ring", shaft_washer, closed=True)
36 model.revolve("shaft_washer", "shaft_section", axis="Z", op="new", body="shaft_washer_body", name="Shaft washer")
37 with model.sketch("housing_section", on="XZ", name="Housing washer section") as sk:
38 sk.polyline("housing_ring", housing_washer, closed=True)
39 model.revolve("housing_washer", "housing_section", axis="Z", op="new", body="housing_washer_body", name="Housing washer")
40 balls = max(5, int(2 * math.pi * pitch_r / (1.25 * ball)))
41 model.sphere("ball", ball / 2, at=(pitch_r, 0, 0), op="new", body="ball_body", name="Ball")
42 model.circular_pattern("balls", axis="Z", count=balls, bodies=["ball_body"], name="Balls")
43model.material("steel-generic")
44model.appearance(color="#b9bdc2")
1745result = model.result()
1846
pypart.toml +18 −4
@@ -1,17 +1,24 @@
11name = "steve/thrust-ball-bearing"
2version = "1.0.0"
2version = "1.1.0"
33runtime = "steve"
44license = "MIT"
5summary = "Single-direction thrust ball bearing, 511, 512 and 513 series, bore 10 to 50 mm, as a boundary-dimension envelope."
6description = """Single-direction thrust ball bearing (511, 512 and 513 series) as an envelope for assemblies: one solid with the boundary dimensions. Rolling elements, cage and \
7the gaps between the rings are not modelled. Axis along Z, centred on the origin. Dimensions from a maker's public catalogue (see the README); not affiliated with any maker."""
5summary = "Single-direction thrust ball bearing, 511, 512 and 513 series, bore 10 to 50 mm,."
6description = """Single-direction thrust ball bearing, 511, 512 and 513 series, bore up to 50 mm. Bore d, outside diameter D, height T, shaft washer outside d1, housing washer bore D1, washer thickness t and chamfer r are sourced and make the fit. detail = \"full\": two washers with raceways and the balls between them. The rolling element size and count, shoulder heights and clearances are proportions for looks, not for design, and never change the fit dimensions. The cage is not drawn. detail = \"simple\": one solid ring. Axis along Z, centred on the origin. Dimensions from a maker's public catalogue (see the README); not affiliated with any maker."""
87tags = ["bearing", "thrust-bearing", "ball-bearing", "iso-104", "metric"]
8changes = "Looks like a bearing: rings and rolling elements. detail = simple keeps one solid ring."
99
1010[parameters.designation]
1111type = "choice"
1212default = "51104"
1313choices = ["51100", "51101", "51102", "51103", "51104", "51105", "51106", "51107", "51108", "51109", "51110", "51200", "51201", "51202", "51203", "51204", "51205", "51206", "51207", "51208", "51209", "51210", "51305", "51306", "51307", "51308", "51309", "51310"]
1414label = "Bearing number"
15
16[parameters.detail]
17type = "choice"
18default = "full"
19choices = ["full", "simple"]
20label = "Detail"
21description = "full: rings and rolling elements. simple: one solid ring with the same boundary dimensions, for big assemblies."
1522
1623[[presets]]
1724id = "51100"
@@ -209,3 +216,10 @@
209216aliases = ["51310 bearing", "single-direction thrust ball bearing 51310", "50x95x31 thrust-bearing"]
210217standard = "ISO 104"
211218
219[[presets]]
220id = "51104-simple"
221title = "51104, simple (one solid)"
222params = { designation = "51104", detail = "simple" }
223aliases = ["51104 simple"]
224standard = "ISO 104"
225
README.md +8 −3
@@ -1,7 +1,10 @@
11# Single-direction thrust ball bearing
22
3511, 512 and 513 series, bore 10 to 50 mm, as an envelope for assemblies: one solid with the boundary dimensions. Axis along Z,
4centred on the origin. Rolling elements, cage and the gaps between the rings aren't modelled.
3## Geometry
4
5Single-direction thrust ball bearing, 511, 512 and 513 series, bore up to 50 mm. Bore d, outside diameter D, height T, shaft washer outside d1, housing washer bore D1, washer thickness t and chamfer r are sourced and make the fit. detail = "full": two washers with raceways and the balls between them. The rolling element size and count, shoulder heights and clearances are proportions for looks, not for design, and never change the fit dimensions. The cage is not drawn. detail = "simple": one solid ring. Axis along Z, centred on the origin.
6
7**For the fit:** the sourced dimensions below. **For looks only, not for design:** every other proportion named above.
58
69## Source
710
@@ -38,5 +41,7 @@
3841| 51309 | 45 | 85 | 28 |
3942| 51310 | 50 | 95 | 31 |
4043
41No tolerance class is stated here yet. Maker names identify the source; this part isn't made by or affiliated with any maker.
44Maker names identify the source; this part isn't made by or affiliated with any maker.
4245
46Washer thickness t, housing washer bore D1 and chamfers r are in `part.py` (`BEARINGS`), from the same tables. No tolerance class is stated yet.
47