Sign in with STEVE

Compare versions

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

Requirements

at each version’s default parameters

4 changes 4 added

  1. 19638148tolerance_class addedNote: ISO 492 normal tolerance class
  2. 29309899width added14 0/−0.120
  3. 42771306bore added? 0/−0.010 (SD) (ACS)
  4. 64593396outside_diameter added⌀47 0/−0.011 (SD) (ACS)

1.1.0 has 1 broken requirement.

part.py +55 −10
@@ -1,18 +1,63 @@
1"""Angular contact ball bearing, 72 and 73 series, bore up to 50 mm: envelope for assemblies, one solid with the boundary dimensions bore d, outside
2diameter D and width B. Rolling elements, cage and the gaps between the rings are not modelled. Axis along Z, centred on the origin."""
1"""Angular contact ball bearing, 72 and 73 series, bore up to 50 mm. Bore d, outside diameter D, width B and chamfer r are sourced and make the fit. detail = "full": separate rings with a gap, raceways, balls, and the outer ring cut low on one side as the type is. 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 = "7204" # Bearing number
7detail = "full" # full: rings and rolling elements; simple: one solid
68
7# number: (d, D, B). NTN Ball and Roller Bearings CAT. No. 2203-3/E (2024), pp. B-52 to B-57 (PDF pages 128 to 133), boundary dimensions.
8BEARINGS = {"7200": (10, 30, 9), "7201": (12, 32, 10), "7202": (15, 35, 11), "7203": (17, 40, 12), "7204": (20, 47, 14), "7205": (25, 52, 15), "7206": (30, 62, 16), "7207": (35, 72, 17), "7208": (40, 80, 18), "7209": (45, 85, 19), "7210": (50, 90, 20), "7300": (10, 35, 11), "7301": (12, 37, 12), "7302": (15, 42, 13), "7303": (17, 47, 14), "7304": (20, 52, 15), "7305": (25, 62, 17), "7306": (30, 72, 19), "7307": (35, 80, 21), "7308": (40, 90, 23), "7309": (45, 100, 25), "7310": (50, 110, 27)}
9# number: (d, D, B, r). NTN Ball and Roller Bearings CAT. No. 2203-3/E (2024), PDF pages 128-133, https://www.ntnglobal.com/en/products/catalog/pdf/2203E.pdf
10BEARINGS = {"7200": (10, 30, 9, 0.6), "7201": (12, 32, 10, 0.6), "7202": (15, 35, 11, 0.6), "7203": (17, 40, 12, 0.6), "7204": (20, 47, 14, 1), "7205": (25, 52, 15, 1), "7206": (30, 62, 16, 1), "7207": (35, 72, 17, 1.1), "7208": (40, 80, 18, 1.1), "7209": (45, 85, 19, 1.1), "7210": (50, 90, 20, 1.1), "7300": (10, 35, 11, 0.6), "7301": (12, 37, 12, 1), "7302": (15, 42, 13, 1), "7303": (17, 47, 14, 1), "7304": (20, 52, 15, 1.1), "7305": (25, 62, 17, 1.1), "7306": (30, 72, 19, 1.1), "7307": (35, 80, 21, 1.5), "7308": (40, 90, 23, 1.5), "7309": (45, 100, 25, 1.5), "7310": (50, 110, 27, 2)}
911
10d, D, width = BEARINGS[designation]
12# Requirements: ISO 492 normal tolerance class, deviations in mm (upper deviation 0), by size range (over, up to and including). NTN CAT. No. 2203-3/E, Table 6.4,
13# pp. A-58 to A-59, https://www.ntnglobal.com/en/products/catalog/pdf/2203E.pdf (checked 2026-11-03).
14BORE_DEVIATION = ((2.5, "-0.008"), (10, "-0.008"), (18, "-0.008"), (30, "-0.010"), (50, "-0.012"), (80, "-0.015"))
15OD_DEVIATION = ((6, "-0.008"), (18, "-0.008"), (30, "-0.009"), (50, "-0.011"), (80, "-0.013"), (120, "-0.015"))
16WIDTH_DEVIATION = ((2.5, "-0.040"), (10, "-0.120"), (18, "-0.120"), (30, "-0.120"), (50, "-0.120"), (80, "-0.150"))
17
18
19def lower_deviation(rows, size):
20 return next(value for upto, value in rows if size <= upto)
21
22d, D, W, r = BEARINGS[designation]
1123model = 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")
24if detail == "simple":
25 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),
26 (d / 2, W / 2 - r), (d / 2, -W / 2 + r)]
27 with model.sketch("section", on="XZ", name="Section") as sk:
28 sk.polyline("ring", outline, closed=True)
29 model.revolve("inner", "section", axis="Z", name="Bearing")
30 bore_face, od_face, low_face, high_face = "inner.side(ring.side6)", "inner.side(ring.side2)", "inner.side(ring.side0)", "inner.side(ring.side4)"
31else:
32 section = (D - d) / 2
33 pitch_r = (D + d) / 4
34 ball = min(0.55 * section, 0.75 * W)
35 race = ball / 2 + 0.02 * ball
36 shoulder = 0.30 * ball
37 open_side = 0.46 * ball # the outer ring's low shoulder
38 ri, ro, ro_low = pitch_r - shoulder, pitch_r + shoulder, pitch_r + open_side
39 start, stop = math.asin(shoulder / race), math.pi - math.asin(open_side / race)
40 groove_in = [(pitch_r - race * math.cos(a - math.pi / 2), race * math.sin(a - math.pi / 2)) for a in [start + (math.pi - 2 * start) * i / 8 for i in range(9)]]
41 groove_out = [(pitch_r + race * math.cos(a - math.pi / 2), race * math.sin(a - math.pi / 2)) for a in [start + (stop - start) * i / 8 for i in range(9)]]
42 inner = [(d / 2 + r, -W / 2), (ri, -W / 2)] + groove_in + [(ri, W / 2), (d / 2 + r, W / 2), (d / 2, W / 2 - r), (d / 2, -W / 2 + r)]
43 outer = [(ro, -W / 2), (D / 2 - r, -W / 2), (D / 2, -W / 2 + r), (D / 2, W / 2 - r), (D / 2 - r, W / 2), (ro_low, W / 2)] + list(reversed(groove_out))
44 with model.sketch("inner_section", on="XZ", name="Inner ring section") as sk:
45 sk.polyline("inner_ring", inner, closed=True)
46 model.revolve("inner", "inner_section", axis="Z", op="new", body="inner_body", name="Inner ring")
47 with model.sketch("outer_section", on="XZ", name="Outer ring section") as sk:
48 sk.polyline("outer_ring", outer, closed=True)
49 model.revolve("outer", "outer_section", axis="Z", op="new", body="outer_body", name="Outer ring")
50 balls = max(5, int(2 * math.pi * pitch_r / (1.25 * ball)))
51 model.sphere("ball", ball / 2, at=(pitch_r, 0, 0), op="new", body="ball_body", name="Ball")
52 model.circular_pattern("balls", axis="Z", count=balls, bodies=["ball_body"], name="Balls")
53 bore_face = f"inner.side(inner_ring.side{len(inner) - 1})"
54 od_face, low_face, high_face = "outer.side(outer_ring.side2)", "inner.side(inner_ring.side0)", f"inner.side(inner_ring.side{len(inner) - 4})"
55model.material("steel-generic")
56model.appearance(color="#b9bdc2")
57model.standard("ISO")
58model.size("bore", bore_face, tol=("0", lower_deviation(BORE_DEVIATION, d)), modifiers=["SD", "ACS"])
59model.size("outside_diameter", od_face, tol=("0", lower_deviation(OD_DEVIATION, D)), modifiers=["SD", "ACS"])
60model.size("width", [low_face, high_face], tol=("0", lower_deviation(WIDTH_DEVIATION, d)))
61model.note("tolerance_class", "ISO 492 normal tolerance class")
1762result = model.result()
1863
pypart.toml +18 −4
@@ -1,17 +1,24 @@
11name = "steve/angular-contact-ball-bearing"
2version = "1.0.0"
2version = "1.1.0"
33runtime = "steve"
44license = "MIT"
5summary = "Angular contact ball bearing, 72 and 73 series, bore 10 to 50 mm, as a boundary-dimension envelope."
6description = """Angular contact ball bearing (72 and 73 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 = "Angular contact ball bearing, 72 and 73 series, bore 10 to 50 mm,."
6description = """Angular contact ball bearing, 72 and 73 series, bore up to 50 mm. Bore d, outside diameter D, width B and chamfer r are sourced and make the fit. detail = \"full\": separate rings with a gap, raceways, balls, and the outer ring cut low on one side as the type is. 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", "ball-bearing", "angular-contact", "iso-15", "metric"]
8changes = "Looks like a bearing: rings and rolling elements. detail = simple keeps one solid ring."
99
1010[parameters.designation]
1111type = "choice"
1212default = "7204"
1313choices = ["7200", "7201", "7202", "7203", "7204", "7205", "7206", "7207", "7208", "7209", "7210", "7300", "7301", "7302", "7303", "7304", "7305", "7306", "7307", "7308", "7309", "7310"]
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 = "7200"
@@ -167,3 +174,10 @@
167174aliases = ["7310 bearing", "angular contact ball bearing 7310", "50x110x27 ball-bearing"]
168175standard = "ISO 15"
169176
177[[presets]]
178id = "7204-simple"
179title = "7204, simple (one solid)"
180params = { designation = "7204", detail = "simple" }
181aliases = ["7204 simple"]
182standard = "ISO 15"
183
README.md +8 −3
@@ -1,7 +1,10 @@
11# Angular contact ball bearing
22
372 and 73 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
5Angular contact ball bearing, 72 and 73 series, bore up to 50 mm. Bore d, outside diameter D, width B and chamfer r are sourced and make the fit. detail = "full": separate rings with a gap, raceways, balls, and the outer ring cut low on one side as the type is. 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
@@ -32,5 +35,7 @@
3235| 7309 | 45 | 100 | 25 |
3336| 7310 | 50 | 110 | 27 |
3437
35No tolerance class is stated here yet. Maker names identify the source; this part isn't made by or affiliated with any maker.
38Maker names identify the source; this part isn't made by or affiliated with any maker.
3639
40Corner chamfers r and the tolerance class below come from the same NTN tables (Table 6.4, pp. A-58 to A-59, ISO 492 normal class).
41