Sign in with STEVE

steve/cylindrical-roller-bearing

Cylindrical roller bearing, NU2 and NU3 series, bore 10 to 50 mm,.

v1.1.0 Latest STEVE MIT 0
Isometric
part.py 60 lines · Python · STEVE runtime · checked
Download
1"""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."""
2import math
3
4from steve import Model
5
6designation = "NU204" # Bearing number
7detail = "full" # full: rings and rolling elements; simple: one solid
8
9# 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
10BEARINGS = {"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)}
11
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, Fw, Ew = BEARINGS[designation]
23model = Model()
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 roller = (Ew - Fw) / 2
33 pitch_r = (Ew + Fw) / 4
34 rib_width = 0.14 * W
35 rib_r = Ew / 2 - 0.3 * roller
36 roller_length = W - 2 * rib_width - 0.1 * W
37 clear = 0.01 * roller
38 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)]
39 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)]
40 with model.sketch("inner_section", on="XZ", name="Inner ring section") as sk:
41 sk.polyline("inner_ring", inner, closed=True)
42 model.revolve("inner", "inner_section", axis="Z", op="new", body="inner_body", name="Inner ring")
43 with model.sketch("outer_section", on="XZ", name="Outer ring section") as sk:
44 sk.polyline("outer_ring", outer, closed=True)
45 model.revolve("outer", "outer_section", axis="Z", op="new", body="outer_body", name="Outer ring")
46 with model.sketch("roller_section", on="XZ", name="Roller section") as sk:
47 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)
48 model.revolve("roller", "roller_section", axis=((pitch_r, 0, 0), (0, 0, 1)), op="new", body="roller_body", name="Roller")
49 rollers = max(6, int(2 * math.pi * pitch_r / (1.25 * roller)))
50 model.circular_pattern("rollers", axis="Z", count=rollers, bodies=["roller_body"], name="Rollers")
51 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)"
52model.material("steel-generic")
53model.appearance(color="#b9bdc2")
54model.standard("ISO")
55model.size("bore", bore_face, tol=("0", lower_deviation(BORE_DEVIATION, d)), modifiers=["SD", "ACS"])
56model.size("outside_diameter", od_face, tol=("0", lower_deviation(OD_DEVIATION, D)), modifiers=["SD", "ACS"])
57model.size("width", [low_face, high_face], tol=("0", lower_deviation(WIDTH_DEVIATION, d)))
58model.note("tolerance_class", "ISO 492 normal tolerance class")
59result = model.result()
60

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. Dimensions from a maker's public catalogue (see the README); not affiliated with any maker.

Cylindrical roller bearing

Geometry

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.

For the fit: the sourced dimensions below. For looks only, not for design: every other proportion named above.

Source

NTN, Ball and Roller Bearings, CAT. No. 2203-3/E (2024), https://www.ntnglobal.com/en/products/catalog/pdf/2203E.pdf, pp. B-71 to B-72 (PDF pages 147 and 148). ISO 15 sets the boundary dimensions of these series.

Number d D B
NU204 20 47 14
NU205 25 52 15
NU206 30 62 16
NU207 35 72 17
NU208 40 80 18
NU209 45 85 19
NU210 50 90 20
NU304 20 52 15
NU305 25 62 17
NU306 30 72 19
NU307 35 80 21
NU308 40 90 23
NU309 45 100 25
NU310 50 110 27

Maker names identify the source; this part isn't made by or affiliated with any maker.

Raceway diameters Fw and Ew and chamfers r are in part.py (BEARINGS), from the same tables; the ISO 492 normal class is from Table 6.4, pp. A-58 to A-59.

Standard
ISO · independency principle L54
General tolerance
None stated
No inspection list while a requirement is broken.
4 requirements 2 broken At the default parameters.
  1. bore inner.side(inner_ring.side7) L55

    Broken: a size needs a feature of size (a hole, a shaft, a sphere or two opposed parallel faces), and it names cone faces. Point it at one, or use model.distance between two features.

  2. outside_diameter outer.side(outer_ring.side2) L56
  3. width inner.side(inner_ring.side0), inner.side(inner_ring.side5) L57

    Broken: a size needs a feature of size (a hole, a shaft, a sphere or two opposed parallel faces), and it names cone and plane faces. Point it at one, or use model.distance between two features.

  4. tolerance_class L58

Select a requirement to show its faces in the 3D view; edges aren’t marked there. This build’s 3D preview doesn’t map its faces, so a requirement’s faces can’t be shown there. Requirements are written in the part’s code and compiled by the steve runtime at each build; nothing is exported as a file.

  1. 1.1.0 Latest Compare with 1.0.0

    Looks like a bearing: rings and rolling elements. detail = simple keeps one solid ring.

    Requirements since 1.0.0: 4 added
    added19638148tolerance_classNote: ISO 492 normal tolerance class
    added29309899width? 0/−0.120
    added42771306bore? 0/−0.010 (SD) (ACS)
    added64593396outside_diameter⌀47 0/−0.011 (SD) (ACS)
  2. 1.0.0
More #bearing
STEVEMIT

steve/deep-groove-ball-bearing

Deep groove ball bearing, metric: 6xx, MR, 60, 62, 63, 68 and 69 series, open, ZZ or 2RS, optional flange.

3 52 sizes 0 2 hours ago v2.2.0
STEVEMIT

steve/thrust-ball-bearing

Single-direction thrust ball bearing, 511, 512 and 513 series, bore 10 to 50 mm,.

0 29 sizes 0 2 hours ago v1.1.0