Corner Clamp
A right-angle clamp for box and frame corners that needs no screws. The L-shaped frame has two channels at 90 degrees; each board sits in its channel against the inner fence, which sets the right angle, and a wedge tapped into the gap behind it presses it against the fence. The wedges jam by their 1 in 8 taper and knock out again with a tap on the tip. The channel width is calculated from the board thickness, so the design can be regenerated for 9 mm plywood or 25 mm boards. The default for 15 mm boards with 70 mm arms is a 75 x 75 x 29 mm frame plus two wedges, laid out as 75 x 118 mm. Everything prints flat with no supports. Parameters: board thickness, arm length, channel height, wall and base thickness, and the wedge gap.
# Corner Clamp - right-angle clamp for box and frame corners, held by tapped-in wedges
#
# An L-shaped frame with two channels at 90 deg. Each board sits in a channel against the
# inner fence (the reference faces that set the right angle), and a wedge tapped into the gap
# behind it presses it against the fence. No screws: the wedges jam by their taper (1 in 8)
# and knock out again with a tap on the tip. Channel width comes from the board thickness,
# so the same design fits 9 mm plywood or 25 mm boards.
# Prints flat, no supports: the frame on its base, the two wedges on their sides.
@param 6..30 desc:"Board thickness (mm)"
$board_t = 15
@param 40..120 desc:"Arm length along each board (mm)"
$arm = 70
@param 15..40 desc:"Channel height (mm)"
$height = 25
@param 4..10 desc:"Wall thickness (mm)"
$wall = 5
@param 4..10 desc:"Base thickness (mm)"
$base = 4
@param 6..12 desc:"Wedge gap behind the board (mm)"
$gap = 8
# --- Frame: base plate, inner L fence, outer walls ------------------------------------
$ch = $board_t + $gap # channel width: board plus the wedge gap
$ox = $ch + $wall # outer wall inner face is at ch, outer face at ox
$lo = -$wall # the fence extends from -wall to 0
$size = $arm + $wall # overall extent from the fence's outer face
$plate = box $size $size $base center:(false, false, false) | translate $lo $lo 0
# inner fence L: along X (y in [-wall, 0]) and along Y (x in [-wall, 0])
$fence_x = box $size $wall $height center:(false, false, false) | translate $lo $lo $base
$fence_y = box $wall $size $height center:(false, false, false) | translate $lo $lo $base
# outer walls: at y = ch for x beyond the other channel, and at x = ch likewise
$outer_x = box ($arm - $ox) $wall $height center:(false, false, false) | translate $ox $ch $base
$outer_y = box $wall ($arm - $ox) $height center:(false, false, false) | translate $ch $ox $base
# end stops close each channel at the arm end, leaving the corner open for the other board
$frame = union [$plate, $fence_x, $fence_y, $outer_x, $outer_y]
assert $arm - $ox > 20 # the outer wall has length to guide the wedge
# --- Wedge: taper 1 in 8 over the channel length, with a head to tap on ------------------
$wl = $arm - $ox - 2 # wedge length along its channel
$tip = $gap - 3 # it starts loose
$fat = $tip + $wl / 8 # and jams before the head
assert $fat > $gap + 1 # the taper reaches past the gap, so it always jams
$wh = $height - 3
$wedge_prof = workplane XY | polyline [(0, 0), ($wl, 0), ($wl, $fat), (0, $tip)]
$wedge_body = $wedge_prof | extrude $wh
$head = box 6 ($fat + 4) $wh center:(false, true, false) | translate $wl ($fat / 2) 0
$wedge = $wedge_body + $head
assert $wedge.solids == 1
# --- Print layout: frame, then the two wedges lying beside it --------------------------
$w1 = $wedge | translate $lo ($size + 6) 0
$w2 = $wedge | translate $lo ($size + 6 + $fat + 10) 0
$out = union [$frame, $w1, $w2]
assert $out.solids == 3
assert clear($frame, $w1)
assert clear($w1, $w2)
assert $frame.bbox.x ~ $size
assert $frame.bbox.z ~ ($base + $height)
assert $ch - $board_t == $gap
print "frame (mm)" $size
print "wedge taper (mm over length)" ($fat - $tip)
$out