Sign in with STEVE

steve/angular-contact-ball-bearing

Angular contact ball bearing, 72 and 73 series, bore 10 to 50 mm,.

v1.1.0 Latest STEVE MIT 0
Isometric
part.py 63 lines · Python · STEVE runtime · checked
Download
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
4from steve import Model
5
6designation = "7204" # Bearing number
7detail = "full" # full: rings and rolling elements; simple: one solid
8
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)}
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 = 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 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")
62result = model.result()
63

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.

Angular contact ball bearing

Geometry

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.

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-52 to B-57 (PDF pages 128 to 133); checked against the 62 and 63 series of the same catalogue, which have the same boundary dimensions. ISO 15 sets the boundary dimensions of these series.

Number d D B
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

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

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).

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

    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) L59
  3. width inner.side(inner_ring.side0), inner.side(inner_ring.side11) L60
  4. tolerance_class L61

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
    added29309899width14 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 1 hour 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 1 hour ago v1.1.0