"""Single-direction thrust ball bearing, 511, 512 and 513 series, bore up to 50 mm. Bore d, outside diameter D, height T, shaft washer outside d1, housing washer bore D1, washer thickness t and chamfer r are sourced and make the fit. detail = "full": two washers with raceways and the balls between them. 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 = "51104" # Bearing number detail = "full" # full: rings and rolling elements; simple: one solid # number: (d, D, T, housing washer bore D1, washer thickness t, r). NTN Ball and Roller Bearings CAT. No. 2203-3/E (2024), pp. B-150 to B-151 (PDF pages 226-227), https://www.ntnglobal.com/en/products/catalog/pdf/2203E.pdf BEARINGS = {"51100": (10, 24, 9, 11, 2.5, 0.3), "51101": (12, 26, 9, 13, 2.5, 0.3), "51102": (15, 28, 9, 16, 2.5, 0.3), "51103": (17, 30, 9, 18, 2.5, 0.3), "51104": (20, 35, 10, 21, 2.5, 0.3), "51105": (25, 42, 11, 26, 3, 0.6), "51106": (30, 47, 11, 32, 3, 0.6), "51107": (35, 52, 12, 37, 3.5, 0.6), "51108": (40, 60, 13, 42, 3.8, 0.6), "51109": (45, 65, 14, 47, 4, 0.6), "51110": (50, 70, 14, 52, 4, 0.6), "51200": (10, 26, 11, 12, 3.3, 0.6), "51201": (12, 28, 11, 14, 3.3, 0.6), "51202": (15, 32, 12, 17, 3.5, 0.6), "51203": (17, 35, 12, 19, 3.5, 0.6), "51204": (20, 40, 14, 22, 4.1, 0.6), "51205": (25, 47, 15, 27, 4.3, 0.6), "51206": (30, 52, 16, 32, 5, 0.6), "51207": (35, 62, 18, 37, 5.2, 1), "51208": (40, 68, 19, 42, 5.5, 1), "51209": (45, 73, 20, 47, 6, 1), "51210": (50, 78, 22, 52, 7, 1), "51305": (25, 52, 18, 27, 5, 1), "51306": (30, 60, 21, 32, 6.4, 1), "51307": (35, 68, 24, 37, 7.2, 1), "51308": (40, 78, 26, 42, 7.6, 1), "51309": (45, 85, 28, 47, 8.3, 1), "51310": (50, 95, 31, 52, 9.2, 1)} d, D, T, D1, t, r = BEARINGS[designation] W = T 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") else: pitch_r = (D + D1) / 4 depth = 0.25 * t # raceway depth in each washer ball = T - 2 * t + 2 * depth race = ball / 2 + 0.02 * ball half = math.sqrt(race * race - (race - depth) ** 2) angles = [math.asin(half / race) * (i - 4) / 4 for i in range(9)] low_face_z, low_top = -T / 2, -T / 2 + t high_top, high_face_z = T / 2 - t, T / 2 low_groove = [(pitch_r + race * math.sin(a), -race * math.cos(a)) for a in reversed(angles)] high_groove = [(pitch_r + race * math.sin(a), race * math.cos(a)) for a in angles] shaft_washer = [(d / 2 + r, low_face_z), (D / 2 - r, low_face_z), (D / 2, low_face_z + r), (D / 2, low_top)] + low_groove + [(d / 2, low_top), (d / 2, low_face_z + r)] housing_washer = [(D1 / 2, high_face_z - r), (D1 / 2, high_top)] + [p for p in reversed(high_groove)][::-1][:0] + high_groove + [(D / 2, high_top), (D / 2, high_face_z - r), (D / 2 - r, high_face_z), (D1 / 2 + r, high_face_z)] with model.sketch("shaft_section", on="XZ", name="Shaft washer section") as sk: sk.polyline("shaft_ring", shaft_washer, closed=True) model.revolve("shaft_washer", "shaft_section", axis="Z", op="new", body="shaft_washer_body", name="Shaft washer") with model.sketch("housing_section", on="XZ", name="Housing washer section") as sk: sk.polyline("housing_ring", housing_washer, closed=True) model.revolve("housing_washer", "housing_section", axis="Z", op="new", body="housing_washer_body", name="Housing washer") 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") model.material("steel-generic") model.appearance(color="#b9bdc2") result = model.result()