2020 Extrusion Foot
A foot that caps the bottom end of a vertical 2020 aluminium extrusion. A cup slips over the profile end, and a key on each inner wall enters one of the four slots so the foot is centered and cannot turn. An optional M5 countersunk hole lets you fix it with a screw into the tapped center bore, with the head flush in the wide sole. The default foot measures 32 x 32 x 14 mm. Print it sole down with no supports, in TPU for grip or in PLA/PETG with a rubber pad under it. Adjustable parameters: slot width, key height, fit clearance, sole width and thickness, cup depth, wall thickness and the center screw hole.
# 2020 Foot - end cap foot for a vertical 20 x 20 extrusion
#
# Use: push the cup over the bottom end of a vertical 2020 profile. A key on
# each inner wall enters one of the four slots, so the foot is centered and
# cannot turn. Optionally fix it with an M5 countersunk screw from below into
# the tapped center bore of the profile; the head sits flush in the sole.
# The wide sole spreads the load; print it in TPU, or stick a rubber pad under
# a PLA/PETG print, for an anti-slip foot.
#
# Print orientation: as modeled, sole on the bed and cup open upward. The walls
# and keys are vertical and the countersink is a 45 deg cone, so no supports.
#
# Assumed 2020 dimensions (B-type, 6 mm slot) - adjust to your extrusion.
@param 5.6..6.6..0.1 group:"Extrusion" desc:"Slot opening width (mm, assumed 6.2)"
slot_w = 6.2
@param 0.5..2.0..0.1 group:"Extrusion" desc:"Key height into the slot (mm, keep below the 1.8 lip)"
key_h = 1.5
@param 0.1..0.5..0.05 group:"Extrusion" desc:"Fit clearance per side for the profile and keys (mm)"
fit = 0.2
@param 28..50 group:"Foot" desc:"Sole width (mm, wider than the cup)"
sole_w = 32
@param 3..8..0.5 group:"Foot" desc:"Sole thickness (mm)"
sole_t = 4
@param 4..20 group:"Foot" desc:"Cup depth over the profile end (mm)"
cup_h = 10
@param 1.6..4..0.2 group:"Foot" desc:"Cup wall thickness (mm)"
wall = 2.4
@param group:"Foot" desc:"M5 countersunk hole for a screw into the center bore"
center_screw = true
profile = 20 # 20 x 20 extrusion
hole_d = 5.6 # M5 clearance (+0.1 for print shrink)
csk_d = 10.4 # M5 countersunk head 10 + clearance
# --- Sole and cup ---
in_w = profile + fit * 2
out_w = in_w + wall * 2
corner_r = 4
sole = box sole_w sole_w sole_t | floor | edges =Z | fillet corner_r
cup_outer = box out_w out_w (cup_h + 0.5) | floor | edges =Z | fillet 2 | translate 0 0 (sole_t - 0.5)
cup_inner = box in_w in_w (cup_h + 1) | floor | translate 0 0 sole_t
cup = (sole + cup_outer) - cup_inner
# --- Keys: 45 deg trapezoid ridges on the four inner walls, one per slot ---
w0 = slot_w - fit * 2 # width at the wall
w1 = w0 - key_h * 2 # width at the tip
key = polyline [(-w0 / 2 - 0.3, 0), (w0 / 2 + 0.3, 0), (w1 / 2, key_h + 0.3), (-w1 / 2, key_h + 0.3)]
| extrude cup_h | translate 0 (-in_w / 2 - 0.3) sole_t
keys = union [key | rotate 0 0 a for a in [0, 90, 180, 270]]
foot0 = cup + keys
# --- Optional M5 countersunk screw hole (cone opens toward the sole) ---
csk = cone (csk_d / 2 + 0.05) (hole_d / 2) (csk_d / 2 + 0.05 - hole_d / 2) | floor | translate 0 0 -0.05
bore = cylinder (hole_d / 2) (sole_t * 3)
foot = if center_screw then foot0 - [csk, bore] else foot0
# --- Intent ---
assert w1 >= 2 # key tip still a usable key
assert (csk_d - hole_d) / 2 < sole_t - 1 # countersink leaves at least 1 mm of floor
assert foot.solids == 1
assert foot.bbox.x ~ sole_w
assert foot.bbox.y ~ sole_w
assert foot.bbox.z ~ sole_t + cup_h
assert foot.bbox.min[2] ~ 0 tol:0.01
foot