Wall Key Hook
A wall-mounted key rack with a configurable number of hooks, fixed with two countersunk M4 or M3 screws. Each hook is a tapered wedge with a 45-degree underside, so the rack prints standing up with no supports, and in that orientation the bending load runs along the layers instead of across them; the gently sloped top keeps keys sliding toward the wall. Each hook is designed for 2 kg with a large safety margin in PLA. The default 4-hook version measures 148 x 31 x 50 mm, and the back plate width follows the hook count automatically. Print it standing on the long bottom edge of the back plate; a brim is recommended because the plate is tall and thin. Adjustable parameters: number of hooks, hook spacing, plate height and thickness, hook width, reach, tip and root thickness, screw size and screw hole position.
# Wall Key Hook - adjustable number of hooks, two countersunk screw holes
#
# n hooks rise at 45deg from the front face (-Y side) of the back plate (X = width, Z = height).
# Because the hook undersides are 45deg, printing the plate standing up (long bottom edge down)
# needs no supports, and the bending stress stays within the layers (resists layer splitting).
#
# Design load: 2kg (= 20N) per hook. A key ring is 0.1-0.3kg and a tote bag 1kg,
# with x2 allowed for the impact of hanging and removing.
#
# Modeled in "lying down" coordinates (back plate on XY, front face +Z, up the wall = +Y),
# then stood up at the end with rotate 90 0 0.
@param 1..8 desc:"Number of hooks"
n = 4
@param 20..60 desc:"Hook spacing (mm)"
pitch = 32
@param 30..80 desc:"Back plate height (mm)"
plate_h = 50
@param 4..10 step:0.5 desc:"Back plate thickness (mm)"
plate_t = 6
@param 8..20 desc:"Hook width (mm)"
hook_w = 12
@param 15..40 desc:"Hook reach (from the plate to the tip, mm)"
reach = 25
@param 4..12 desc:"Vertical thickness at the hook tip (mm)"
tip_t = 8
@param 12..30 desc:"Vertical thickness at the hook root (mm)"
root_t = 20
@param choices:["M3", "M4"] desc:"Mounting screw (countersunk)"
screw = "M4"
@param 10..40 desc:"Screw hole distance from the ends (mm)"
screw_inset = 14
# --- Screws (clearance hole / countersunk head diameter; +0.4 relief on the head) ---
thru_d = if screw == "M3" then 3.4 else 4.5
head_d = (if screw == "M3" then 6.0 else 8.0) + 0.4
csk_h = (head_d - thru_d) / 2 # 90deg countersink, so depth = radius difference
# --- Back plate (lying-down coordinates: z=0 is the wall side, z=plate_t is the front) ---
W = (n - 1) * pitch + 2 * (screw_inset + 12)
corner_r = 4
plate = box W plate_h plate_t | floor
| edges =Z | fillet corner_r
| edges >Z | fillet 1.5
# --- Hook: draw the (up y, reach z) profile on the YZ plane and extrude along X ---
# underside: 45deg from root y0 to the tip / top: gentle slope from tip to root (keys slide toward the wall)
y0 = plate_h * -0.5 + 6 # root of the underside (6mm above the plate bottom)
ytip = y0 + reach # 45deg, so it rises by the reach
hook = workplane YZ | sketch [
(y0 - 1, plate_t - 1),
(ytip, plate_t + reach),
(ytip + tip_t, plate_t + reach),
(y0 + root_t, plate_t - 1)
] | extrude hook_w | translate (hook_w / -2) 0 0
| edges =X | fillet 1.5
x0 = (n - 1) * pitch / -2
hooks = union [hook | translate (x0 + i * pitch) 0 0 for i in range(n)]
# --- Countersunk screw holes (left and right, at mid-height) ---
sx = W / 2 - screw_inset
csk = union [
cylinder (thru_d / 2) (plate_t * 3),
cone (thru_d / 2) (head_d / 2 + 0.5) (csk_h + 0.5) | floor | translate 0 0 (plate_t - csk_h)
]
holes = union [csk | translate sx 0 0, csk | translate (sx * -1) 0 0]
plate | union hooks | diff holes
| rotate 90 0 0 | floor