"""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.""" import math from steve import Model designation = "7204" # Bearing number detail = "full" # full: rings and rolling elements; simple: one solid # 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 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)} # 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, # pp. A-58 to A-59, https://www.ntnglobal.com/en/products/catalog/pdf/2203E.pdf (checked 2026-11-03). BORE_DEVIATION = ((2.5, "-0.008"), (10, "-0.008"), (18, "-0.008"), (30, "-0.010"), (50, "-0.012"), (80, "-0.015")) OD_DEVIATION = ((6, "-0.008"), (18, "-0.008"), (30, "-0.009"), (50, "-0.011"), (80, "-0.013"), (120, "-0.015")) WIDTH_DEVIATION = ((2.5, "-0.040"), (10, "-0.120"), (18, "-0.120"), (30, "-0.120"), (50, "-0.120"), (80, "-0.150")) def lower_deviation(rows, size): return next(value for upto, value in rows if size <= upto) d, D, W, r = BEARINGS[designation] model = Model() if detail == "simple": 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), (d / 2, W / 2 - r), (d / 2, -W / 2 + r)] with model.sketch("section", on="XZ", name="Section") as sk: sk.polyline("ring", outline, closed=True) model.revolve("inner", "section", axis="Z", name="Bearing") bore_face, od_face, low_face, high_face = "inner.side(ring.side6)", "inner.side(ring.side2)", "inner.side(ring.side0)", "inner.side(ring.side4)" else: section = (D - d) / 2 pitch_r = (D + d) / 4 ball = min(0.55 * section, 0.75 * W) race = ball / 2 + 0.02 * ball shoulder = 0.30 * ball open_side = 0.46 * ball # the outer ring's low shoulder ri, ro, ro_low = pitch_r - shoulder, pitch_r + shoulder, pitch_r + open_side start, stop = math.asin(shoulder / race), math.pi - math.asin(open_side / race) 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)]] 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)]] 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)] 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)) with model.sketch("inner_section", on="XZ", name="Inner ring section") as sk: sk.polyline("inner_ring", inner, closed=True) model.revolve("inner", "inner_section", axis="Z", op="new", body="inner_body", name="Inner ring") with model.sketch("outer_section", on="XZ", name="Outer ring section") as sk: sk.polyline("outer_ring", outer, closed=True) model.revolve("outer", "outer_section", axis="Z", op="new", body="outer_body", name="Outer ring") balls = max(5, int(2 * math.pi * pitch_r / (1.25 * ball))) model.sphere("ball", ball / 2, at=(pitch_r, 0, 0), op="new", body="ball_body", name="Ball") model.circular_pattern("balls", axis="Z", count=balls, bodies=["ball_body"], name="Balls") bore_face = f"inner.side(inner_ring.side{len(inner) - 1})" 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})" model.material("steel-generic") model.appearance(color="#b9bdc2") model.standard("ISO") model.size("bore", bore_face, tol=("0", lower_deviation(BORE_DEVIATION, d)), modifiers=["SD", "ACS"]) model.size("outside_diameter", od_face, tol=("0", lower_deviation(OD_DEVIATION, D)), modifiers=["SD", "ACS"]) model.size("width", [low_face, high_face], tol=("0", lower_deviation(WIDTH_DEVIATION, d))) model.note("tolerance_class", "ISO 492 normal tolerance class") result = model.result()