Dowel Jig
A U-shaped drilling guide that centres dowel holes on the edge of a board. Two fences hug the faces of the board so the guide holes in the bridge land exactly on the middle of its thickness, and a row of holes at a fixed pitch keeps the drill square to the edge. The fence spacing is calculated from the board thickness, so the jig can be regenerated for 12 mm plywood or 40 mm hardwood, with 6, 8 or 10 mm dowels. Each hole centre is marked by a V notch on both fences to line up with pencil marks, and the dowel size and board thickness are engraved on one fence. The default for 8 mm dowels in an 18 mm board with three holes at 32 mm pitch measures 88 x 26 x 36 mm. It is modelled upside down and prints that way, bridge on the bed, with no supports; in use, flip it over the board edge and drill through the guide holes with a depth stop. Parameters: dowel diameter, board thickness, number of holes, pitch, guide length, fence depth and thickness, and the clearances for the board and the drill.
# Dowel Jig - edge drilling guide that centres 6/8/10 mm dowel holes on a board of any thickness
#
# A U-shaped jig that sits over the edge of a board: two fences hug the faces of the board
# so the guide holes in the bridge are centred on its thickness, and a row of holes at a
# fixed pitch guides the drill square to the edge. The fence spacing is set from the board
# thickness, so the same jig design fits 12 mm plywood or 40 mm hardwood.
# Each hole centre is marked by a V notch on both fences, to line up with pencil marks.
# Modelled and printed upside down: bridge on the bed, fences pointing up, holes vertical,
# no supports. In use, flip it over the board edge and drill through the guide holes with
# a depth stop. The dowel size and board thickness are engraved on one fence.
@param choices:["6", "8", "10"] desc:"Dowel diameter (mm)"
$dowel = "8"
@param 10..45 desc:"Board thickness (mm)"
$board_t = 18
@param 1..5 desc:"Number of guide holes"
$holes = 3
@param 16..50 desc:"Hole pitch (mm)"
$pitch = 32
@param 12..25 desc:"Guide length (bridge thickness, mm)"
$guide_h = 16
@param 12..30 desc:"Fence depth below the bridge (mm)"
$fence_h = 20
@param 3..6 desc:"Fence thickness (mm)"
$fence_t = 4
@param 0.1..0.6 step:0.1 desc:"Clearance between fence and board, per side (mm)"
$fit = 0.2
@param 0.1..0.5 step:0.1 desc:"Clearance of the guide hole over the drill (mm)"
$drill_fit = 0.2
$d = if $dowel == "6" then 6 else (if $dowel == "8" then 8 else 10)
$end = 12 # bridge beyond the end holes
$len = ($holes - 1) * $pitch + 2 * $end
$inner = $board_t + 2 * $fit # between the fences
$wid = $inner + 2 * $fence_t
$h = $guide_h + $fence_h
# --- Bridge and fences (print orientation: bridge on the bed) --------------------------
$bridge = box $len $wid $guide_h center:(true, true, false)
$fence = box $len $fence_t $fence_h center:(true, true, false)
$fences = union [$fence | translate 0 (($inner + $fence_t) / 2) $guide_h,
$fence | translate 0 (-($inner + $fence_t) / 2) $guide_h]
$body = $bridge + $fences
# --- Guide holes, centred on the board thickness ------------------------------------
def hx($i) = ($i - ($holes - 1) / 2) * $pitch
$hole = cylinder (($d + $drill_fit) / 2) ($guide_h + 2) center:(true, true, false) | translate 0 0 -1
$hole_set = union [$hole | translate hx(i) 0 0 for i in range($holes)]
# --- V notches on the outer faces of both fences at each hole centre --------------------
$v = 1.5
$notch = polygon 4 ($v * sqrt(2)) | extrude ($h + 2) | translate 0 0 -1 # polygon 4 is a diamond: half of it bites the fence as a 90 deg V
$notches = union [$notch | translate hx(i // 2) (if i % 2 == 0 then $wid / 2 else -($wid / 2)) 0 for i in range($holes * 2)]
# --- Size label on the outer face of one fence. It is rotated 180 deg so that it reads
# the right way up when the jig is flipped over onto a board.
$label = text ("DOWEL " + $d + " / T" + $board_t) 5 | rotate 180 | extrude 1 | rotate 90 0 0
| translate 0 (-($wid / 2) + 0.6) ($guide_h + $fence_h / 2)
$label_fits = $label.bbox.x < $len - 4 and $label.bbox.z < $fence_h - 2
$jig0 = ($body - $hole_set) - $notches
$jig = if $label_fits then $jig0 - $label else $jig0
# --- Checks -------------------------------------------------------------------------
assert $jig.solids == 1
assert $jig.bbox.x ~ $len
assert $jig.bbox.y ~ $wid
assert $jig.bbox.z ~ $h
assert $d + 6 <= $board_t # at least 3 mm of wood each side of the dowel
assert $jig.volume < $body.volume
print "length (mm)" $len
print "label engraved" $label_fits
$jig