"""Cylindrical roller bearing, NU2 and NU3 series, bore up to 50 mm. Bore d, outside diameter D, width B, chamfer r and the raceway diameters Fw (inner) and Ew (outer) are sourced and make the fit. detail = "full": a plain inner ring, an outer ring with a rib at each end, and the rollers between them, whose diameter follows from (Ew - Fw) / 2. Rib height, roller length and roller count 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 = "NU204" # Bearing number detail = "full" # full: rings and rolling elements; simple: one solid # number: (d, D, B, r, Fw, Ew). NTN Ball and Roller Bearings CAT. No. 2203-3/E (2024), pp. B-71 to B-72 (PDF pages 147-148), https://www.ntnglobal.com/en/products/catalog/pdf/2203E.pdf BEARINGS = {"NU204": (20, 47, 14, 1, 26.5, 41.5), "NU205": (25, 52, 15, 1, 31.5, 46.5), "NU206": (30, 62, 16, 1, 37.5, 55.5), "NU207": (35, 72, 17, 1.1, 44, 64), "NU208": (40, 80, 18, 1.1, 49.5, 71.5), "NU209": (45, 85, 19, 1.1, 54.5, 76.5), "NU210": (50, 90, 20, 1.1, 59.5, 81.5), "NU304": (20, 52, 15, 1.1, 27.5, 45.5), "NU305": (25, 62, 17, 1.1, 34, 54), "NU306": (30, 72, 19, 1.1, 40.5, 62.5), "NU307": (35, 80, 21, 1.5, 46.2, 70.2), "NU308": (40, 90, 23, 1.5, 52, 80), "NU309": (45, 100, 25, 1.5, 58.5, 88.5), "NU310": (50, 110, 27, 2, 65, 97)} # 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, Fw, Ew = 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: roller = (Ew - Fw) / 2 pitch_r = (Ew + Fw) / 4 rib_width = 0.14 * W rib_r = Ew / 2 - 0.3 * roller roller_length = W - 2 * rib_width - 0.1 * W clear = 0.01 * roller inner = [(d / 2 + r, -W / 2), (Fw / 2 - r / 2, -W / 2), (Fw / 2, -W / 2 + r / 2), (Fw / 2, W / 2 - r / 2), (Fw / 2 - r / 2, W / 2), (d / 2 + r, W / 2), (d / 2, W / 2 - r), (d / 2, -W / 2 + r)] outer = [(rib_r, -W / 2), (D / 2 - r, -W / 2), (D / 2, -W / 2 + r), (D / 2, W / 2 - r), (D / 2 - r, W / 2), (rib_r, W / 2), (rib_r, W / 2 - rib_width), (Ew / 2, W / 2 - rib_width), (Ew / 2, -W / 2 + rib_width), (rib_r, -W / 2 + rib_width)] 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") with model.sketch("roller_section", on="XZ", name="Roller section") as sk: sk.polyline("roller_half", [(pitch_r, -roller_length / 2), (pitch_r + roller / 2 - clear, -roller_length / 2), (pitch_r + roller / 2 - clear, roller_length / 2), (pitch_r, roller_length / 2)], closed=True) model.revolve("roller", "roller_section", axis=((pitch_r, 0, 0), (0, 0, 1)), op="new", body="roller_body", name="Roller") rollers = max(6, int(2 * math.pi * pitch_r / (1.25 * roller))) model.circular_pattern("rollers", axis="Z", count=rollers, bodies=["roller_body"], name="Rollers") bore_face, od_face, low_face, high_face = "inner.side(inner_ring.side7)", "outer.side(outer_ring.side2)", "inner.side(inner_ring.side0)", "inner.side(inner_ring.side5)" 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()