Miter Box
A saw guide for cutting stock square and at 45 degrees. The U channel is sized to the width and height of the stock, and three slots through the walls guide a hand saw: one square across and one at 45 degrees each way. The slot width is the saw blade thickness plus a small clearance, the walls stand above the stock so the blade is guided over the cut, and shallow grooves in the base under each slot let the saw finish the cut without sawing the box. Two countersunk holes at the ends take screws to fix it to a bench or a sacrificial board, and the angle is engraved on the wall top beside each slot. The default for 45 x 30 mm stock and a 0.8 mm blade measures 215 x 62 x 44 mm. Prints base down with no supports. Parameters: stock width and height, blade thickness, slot clearance, wall and base thickness, and the clearance between stock and walls.
# Miter Box - saw guide with 90 and 45 deg slots, sized to the stock and the saw blade
#
# A U channel that holds a piece of stock between two walls, with three slots cut through
# the walls to guide a hand saw: one square across (90 deg) and one at 45 deg each way.
# The channel width comes from the stock, the slot width from the saw blade thickness, and
# the walls are taller than the stock so the blade is guided above the cut. Shallow grooves
# in the base under each slot let the saw finish the cut without sawing the box.
# Two countersunk holes at the ends take screws to fix it to a bench or a sacrificial board.
# The angle of each slot is engraved on the wall top beside it.
# Prints base down with no supports.
@param 15..120 desc:"Stock width (mm)"
$stock_w = 45
@param 10..60 desc:"Stock height (mm)"
$stock_h = 30
@param 0.4..2 step:0.1 desc:"Saw blade thickness (mm)"
$blade_t = 0.8
@param 0.2..0.6 step:0.1 desc:"Slot clearance over the blade (mm)"
$slot_fit = 0.4
@param 6..14 desc:"Wall thickness (mm)"
$wall = 8
@param 5..12 desc:"Base thickness (mm)"
$base = 6
@param 0.3..1.5 step:0.1 desc:"Clearance between stock and walls (mm)"
$fit = 0.6
$inner = $stock_w + $fit
$W = $inner + 2 * $wall
$wall_h = $stock_h + 8 # guide above the stock
$H = $base + $wall_h
$slot = $blade_t + $slot_fit
$groove = 2 # saw relief in the base under each slot
$seg = $W + 10 # length needed by one 45 deg slot
$L = max(3 * $seg, 150)
$pitch = $L / 3 # the three slots are centred in thirds of the length
# --- Channel --------------------------------------------------------------------
$block = box $L $W $H center:(true, true, false)
$channel = box ($L + 2) $inner ($wall_h + 1) center:(true, true, false) | translate 0 0 $base
$body = $block - $channel
# --- Slots: a thin plate across the box, rotated about Z, down to the base top minus the groove
$plate = box ($W * 2) $slot ($wall_h + $groove + 1) center:(true, true, false) | translate 0 0 ($base - $groove)
$slots = union [$plate | rotate 0 0 45 | translate (-$pitch) 0 0,
$plate | rotate 0 0 90,
$plate | rotate 0 0 -45 | translate $pitch 0 0]
# the 45 deg slots must stay clear of the ends of the box
$reach = $pitch + ($W * 2 / 2) * cos(45)
assert $reach < $L / 2 + 20 # (the plate is oversize; the walls end at W/2)
assert $pitch - $W / 2 - 3 > -($L / 2)
# --- Screw holes at the ends, countersunk for a 4 mm wood screw --------------------------
$sx = $L / 2 - 10
$screw = cylinder 2.2 ($base + 2) center:(true, true, false) | translate 0 0 -1
$csk = cone 4.5 2.2 2.3 center:(true, true, false) | translate 0 0 ($base - 2.3 + 0.01)
$screw_cut = union [$screw | translate $sx 0 0, $screw | translate (-$sx) 0 0,
$csk | translate $sx 0 0, $csk | translate (-$sx) 0 0]
# --- Angle labels on the top of the far wall ----------------------------------------
$ty = $inner / 2 + $wall / 2
$lab = union [text "45" 4 | extrude 1 | translate (-$pitch - 14) ($ty - 2) ($H - 0.6),
text "90" 4 | extrude 1 | translate (8) ($ty - 2) ($H - 0.6),
text "45" 4 | extrude 1 | translate ($pitch + 8) ($ty - 2) ($H - 0.6)]
$box0 = $body - $slots
$box1 = $box0 - $screw_cut
$mbox = $box1 - $lab
# --- Checks -----------------------------------------------------------------------
assert $mbox.solids == 1
assert $mbox.bbox.x ~ $L
assert $mbox.bbox.y ~ $W
assert $mbox.bbox.z ~ $H
assert $mbox.volume < $body.volume
assert $groove < $base - 2 # the groove leaves a floor
print "length (mm)" $L
print "slot (mm)" $slot
$mbox