"""Socket head cap screw, inch series, ASME B18.3 (1960 series), #0 to 1/2 in, UNC and UNF, any length. Envelope model for assemblies: cylindrical head (head diameter A max, head height H max), hexagon socket (nominal key size J, depth T = key engagement min) 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). """ from steve import Model size = "#4-40" # 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 1 # (https://www.globalfastener.com/standards/detail_20304.html), same values in B18.3-2003. # Inches. ASME B1.1 basic major diameter D; ASME B18.3 Table 1 (socket head cap screws, 1960 series): 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.096, 0.060, 0.050, 0.025), "#1": (0.0730, 0.118, 0.073, 0.0625, 0.031), "#2": (0.0860, 0.140, 0.086, 0.078125, 0.038), "#3": (0.0990, 0.161, 0.099, 0.078125, 0.044), "#4": (0.1120, 0.183, 0.112, 0.09375, 0.051), "#5": (0.1250, 0.205, 0.125, 0.09375, 0.057), "#6": (0.1380, 0.226, 0.138, 0.109375, 0.064), "#8": (0.1640, 0.270, 0.164, 0.140625, 0.077), "#10": (0.1900, 0.312, 0.190, 0.15625, 0.090), "1/4": (0.2500, 0.375, 0.250, 0.1875, 0.120), "5/16": (0.3125, 0.469, 0.312, 0.25, 0.151), "3/8": (0.3750, 0.562, 0.375, 0.3125, 0.182), "7/16": (0.4375, 0.656, 0.438, 0.375, 0.213), "1/2": (0.5000, 0.750, 0.500, 0.375, 0.245), } # 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 material_id, colour = MATERIALS[material] model = Model() with model.sketch("head_sketch", on="XY", name="Head") as sk: sk.circle("head_circle", (0, 0), dk / 2) model.extrude("head", "head_sketch", distance=k, name="Head") with model.sketch("shank_sketch", on="XY", name="Shank") as sk: sk.circle("shank_circle", (0, 0), d / 2) model.extrude("shank", "shank_sketch", distance=-shank, name="Shank") 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()