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
4 changes 4 added
- 19638148tolerance_class addedNote: ISO 492 normal tolerance class
- 29309899width added14 0/−0.120
- 42771306bore added? 0/−0.010 (SD) (ACS)
- 64593396outside_diameter added⌀47 0/−0.011 (SD) (ACS)
1.1.0 has 1 broken requirement.
| @@ -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 | |
| 2 | diameter 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.""" | |
| 2 | import math | |
| 3 | ||
| 3 | 4 | from steve import Model |
| 4 | 5 | |
| 5 | 6 | designation = "7204" # Bearing number |
| 7 | detail = "full" # full: rings and rolling elements; simple: one solid | |
| 6 | 8 | |
| 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. | |
| 8 | BEARINGS = {"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 | |
| 10 | BEARINGS = {"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)} | |
| 9 | 11 | |
| 10 | d, 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). | |
| 14 | BORE_DEVIATION = ((2.5, "-0.008"), (10, "-0.008"), (18, "-0.008"), (30, "-0.010"), (50, "-0.012"), (80, "-0.015")) | |
| 15 | OD_DEVIATION = ((6, "-0.008"), (18, "-0.008"), (30, "-0.009"), (50, "-0.011"), (80, "-0.013"), (120, "-0.015")) | |
| 16 | WIDTH_DEVIATION = ((2.5, "-0.040"), (10, "-0.120"), (18, "-0.120"), (30, "-0.120"), (50, "-0.120"), (80, "-0.150")) | |
| 17 | ||
| 18 | ||
| 19 | def lower_deviation(rows, size): | |
| 20 | return next(value for upto, value in rows if size <= upto) | |
| 21 | ||
| 22 | d, D, W, r = BEARINGS[designation] | |
| 11 | 23 | model = Model() |
| 12 | with 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) | |
| 15 | model.extrude("body", "rings", distance=width, both=True, name="Bearing") | |
| 16 | model.material("steel-generic", color="#b9bdc2") | |
| 24 | if 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)" | |
| 31 | else: | |
| 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})" | |
| 55 | model.material("steel-generic") | |
| 56 | model.appearance(color="#b9bdc2") | |
| 57 | model.standard("ISO") | |
| 58 | model.size("bore", bore_face, tol=("0", lower_deviation(BORE_DEVIATION, d)), modifiers=["SD", "ACS"]) | |
| 59 | model.size("outside_diameter", od_face, tol=("0", lower_deviation(OD_DEVIATION, D)), modifiers=["SD", "ACS"]) | |
| 60 | model.size("width", [low_face, high_face], tol=("0", lower_deviation(WIDTH_DEVIATION, d))) | |
| 61 | model.note("tolerance_class", "ISO 492 normal tolerance class") | |
| 17 | 62 | result = model.result() |
| 18 | 63 |
| @@ -1,17 +1,24 @@ | ||
| 1 | 1 | name = "steve/angular-contact-ball-bearing" |
| 2 | version = "1.0.0" | |
| 2 | version = "1.1.0" | |
| 3 | 3 | runtime = "steve" |
| 4 | 4 | license = "MIT" |
| 5 | summary = "Angular contact ball bearing, 72 and 73 series, bore 10 to 50 mm, as a boundary-dimension envelope." | |
| 6 | description = """Angular contact ball bearing (72 and 73 series) as an envelope for assemblies: one solid with the boundary dimensions. Rolling elements, cage and \ | |
| 7 | the 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.""" | |
| 5 | summary = "Angular contact ball bearing, 72 and 73 series, bore 10 to 50 mm,." | |
| 6 | description = """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.""" | |
| 8 | 7 | tags = ["bearing", "ball-bearing", "angular-contact", "iso-15", "metric"] |
| 8 | changes = "Looks like a bearing: rings and rolling elements. detail = simple keeps one solid ring." | |
| 9 | 9 | |
| 10 | 10 | [parameters.designation] |
| 11 | 11 | type = "choice" |
| 12 | 12 | default = "7204" |
| 13 | 13 | choices = ["7200", "7201", "7202", "7203", "7204", "7205", "7206", "7207", "7208", "7209", "7210", "7300", "7301", "7302", "7303", "7304", "7305", "7306", "7307", "7308", "7309", "7310"] |
| 14 | 14 | label = "Bearing number" |
| 15 | ||
| 16 | [parameters.detail] | |
| 17 | type = "choice" | |
| 18 | default = "full" | |
| 19 | choices = ["full", "simple"] | |
| 20 | label = "Detail" | |
| 21 | description = "full: rings and rolling elements. simple: one solid ring with the same boundary dimensions, for big assemblies." | |
| 15 | 22 | |
| 16 | 23 | [[presets]] |
| 17 | 24 | id = "7200" |
| @@ -167,3 +174,10 @@ | ||
| 167 | 174 | aliases = ["7310 bearing", "angular contact ball bearing 7310", "50x110x27 ball-bearing"] |
| 168 | 175 | standard = "ISO 15" |
| 169 | 176 | |
| 177 | [[presets]] | |
| 178 | id = "7204-simple" | |
| 179 | title = "7204, simple (one solid)" | |
| 180 | params = { designation = "7204", detail = "simple" } | |
| 181 | aliases = ["7204 simple"] | |
| 182 | standard = "ISO 15" | |
| 183 |
| @@ -1,7 +1,10 @@ | ||
| 1 | 1 | # Angular contact ball bearing |
| 2 | 2 | |
| 3 | 72 and 73 series, bore 10 to 50 mm, as an envelope for assemblies: one solid with the boundary dimensions. Axis along Z, | |
| 4 | centred on the origin. Rolling elements, cage and the gaps between the rings aren't modelled. | |
| 3 | ## Geometry | |
| 4 | ||
| 5 | 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. | |
| 6 | ||
| 7 | **For the fit:** the sourced dimensions below. **For looks only, not for design:** every other proportion named above. | |
| 5 | 8 | |
| 6 | 9 | ## Source |
| 7 | 10 | |
| @@ -32,5 +35,7 @@ | ||
| 32 | 35 | | 7309 | 45 | 100 | 25 | |
| 33 | 36 | | 7310 | 50 | 110 | 27 | |
| 34 | 37 | |
| 35 | No tolerance class is stated here yet. Maker names identify the source; this part isn't made by or affiliated with any maker. | |
| 38 | Maker names identify the source; this part isn't made by or affiliated with any maker. | |
| 36 | 39 | |
| 40 | Corner 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 |