"""Button head socket cap screw, inch series, ASME B18.3, #0 to 1/2 in, UNC and UNF, any length. Envelope model for assemblies: domed head of diameter A max and height H max (a spherical cap through the head's rim and top), hexagon socket (nominal key size J, depth T = key engagement min, measured from the top of the head) and a plain shank at the basic major diameter D of ASME B1.1 (the thread is not modelled). The head's bearing face is on the XY plane at the origin, the head above it, the shank along -Z; `length` (inches) is the nominal length L under the head. The model is in millimetres (1 in = 25.4 mm). """ import math from steve import Model size = "#10-24" # Thread (Unified, ASME B1.1) length = 0.5 # in Nominal length under the head material = "steel" # Material # Thread designation: nominal size THREADS = { "#0-80": "#0", "#1-64": "#1", "#1-72": "#1", "#2-56": "#2", "#2-64": "#2", "#3-48": "#3", "#3-56": "#3", "#4-40": "#4", "#4-48": "#4", "#5-40": "#5", "#5-44": "#5", "#6-32": "#6", "#6-40": "#6", "#8-32": "#8", "#8-36": "#8", "#10-24": "#10", "#10-32": "#10", "1/4-20": "1/4", "1/4-28": "1/4", "5/16-18": "5/16", "5/16-24": "5/16", "3/8-16": "3/8", "3/8-24": "3/8", "7/16-14": "7/16", "7/16-20": "7/16", "1/2-13": "1/2", "1/2-20": "1/2", } # Sources (README): D from NBS Handbook H28 (1969) Table 2.7; the rest ASME B18.3-2012 Table 11 # (https://www.globalfastener.com/standards/detail_20308.html), same values in B18.3-2003. # Inches. ASME B1.1 basic major diameter D; ASME B18.3 Table (button head socket cap screws): head diameter A max, # head height H max, hexagon socket size J (nominal key), key engagement T min. # nominal: (D, A, H, J, T) DIMENSIONS = { "#0": (0.0600, 0.114, 0.032, 0.035, 0.020), "#1": (0.0730, 0.139, 0.039, 0.050, 0.028), "#2": (0.0860, 0.164, 0.046, 0.050, 0.028), "#3": (0.0990, 0.188, 0.052, 0.0625, 0.035), "#4": (0.1120, 0.213, 0.059, 0.0625, 0.035), "#5": (0.1250, 0.238, 0.066, 0.078125, 0.044), "#6": (0.1380, 0.262, 0.073, 0.078125, 0.044), "#8": (0.1640, 0.312, 0.087, 0.09375, 0.052), "#10": (0.1900, 0.361, 0.101, 0.125, 0.070), "1/4": (0.2500, 0.437, 0.132, 0.15625, 0.087), "5/16": (0.3125, 0.547, 0.166, 0.1875, 0.105), "3/8": (0.3750, 0.656, 0.199, 0.21875, 0.122), "1/2": (0.5000, 0.875, 0.265, 0.3125, 0.175), } # material choice: (STEVE material library id, appearance colour) MATERIALS = { "steel": ("steel-generic", "#2b2d30"), # alloy steel, black oxide "stainless-18-8": ("stainless-304", "#c9ccd0"), "stainless-316": ("stainless-316", "#c9ccd0"), } INCH = 25.4 D, A, H, J, T = DIMENSIONS[THREADS[size]] d = D * INCH dk = A * INCH k = H * INCH s = J * INCH t = T * INCH shank = length * INCH dome_r = ((dk / 2) ** 2 + k * k) / (2 * k) # sphere through the rim (dk/2, 0) and the top (0, k) rim_angle = math.degrees(math.atan2(dome_r - k, dk / 2)) material_id, colour = MATERIALS[material] model = Model() with model.sketch("profile", on="XZ", name="Profile") as sk: sk.line("tip", (0, -shank), (d / 2, -shank)) sk.line("shank_side", (d / 2, -shank), (d / 2, 0)) sk.line("bearing_face", (d / 2, 0), (dk / 2, 0)) sk.arc("dome", (0, k - dome_r), dome_r, rim_angle, 90) sk.line("axis_line", (0, k), (0, -shank)) model.revolve("body", "profile", axis="Z", name="Screw") model.plane("head_top", on="XY", offset=k, name="Head top") with model.sketch("socket_sketch", on="head_top", name="Hexagon socket") as sk: sk.polygon("hex", (0, 0), s / 2, 6, inscribed=False) model.extrude("socket", "socket_sketch", distance=-t, op="cut", name="Socket") model.material(material_id, color=colour) result = model.result()