"""ISO 7045 pan head screw with cross recess. Envelope: head, a simplified cross recess, plain shank. The head's bearing face is on the XY plane at the origin; the shank points down -Z.""" from steve import Model size = "M3" # Thread size length = 10 # mm Length under the head # size: (head diameter dk, head height k, cross recess number) HEADS = { 'M2': (4.0, 1.6, 1), 'M2.5': (5.0, 2.0, 1), 'M3': (5.6, 2.4, 1), 'M4': (8.0, 3.1, 2), 'M5': (9.5, 3.8, 2), 'M6': (12.0, 4.6, 3), 'M8': (16.0, 6.0, 4), } NOMINAL = { 'M2': 2.0, 'M2.5': 2.5, 'M3': 3.0, 'M4': 4.0, 'M5': 5.0, 'M6': 6.0, 'M8': 8.0, } dk, k, recess = HEADS[size] d = NOMINAL[size] arm = 0.55 * dk slot = 0.12 * dk model = Model() with model.sketch("head_sketch", on="XY", name="Head") as sk: sk.circle("head", (0, 0), dk / 2) model.extrude("head", "head_sketch", distance=k) with model.sketch("shank_sketch", on="XY", name="Shank") as sk: sk.circle("shank", (0, 0), d / 2) model.extrude("shank", "shank_sketch", distance=-length) model.plane("head_top", on="XY", offset=k, name="Head top") with model.sketch("cross_x", on="head_top", name="Recess X") as sk: sk.center_rect("bar", (0, 0), arm, slot) model.extrude("recess_x", "cross_x", distance=-0.5 * k, op="cut") with model.sketch("cross_y", on="head_top", name="Recess Y") as sk: sk.center_rect("bar", (0, 0), slot, arm) model.extrude("recess_y", "cross_y", distance=-0.5 * k, op="cut") result = model.result()