Bench Dog
A bench dog for 20 mm or 3/4 inch dog holes that stops the work against a vise or a second dog. The shaft is split by a slot from the tip so its two prongs squeeze in the hole and the dog stays at the height it is set to, and a flat runs along the shaft and head. That flat is the face printed on the bed, so the dog prints lying down with the layers along the shaft, strong against side loads, with no supports. The flat head has a face flush with the shaft for a square stop; the round head keeps the full disc for round stock. The default 60 mm dog with a 26 mm head measures 70 x 26 x 19 mm. Parameters: hole diameter, head shape, shaft length, head diameter and height, oversize taken up by the split, and split length.
# Bench Dog - for 19 or 20 mm dog holes, split shaft for friction, flat along the side
#
# A bench dog that drops into the dog holes of a workbench and stops the work against the
# vise or a second dog. The shaft is split by a slot from the tip, so its two prongs
# squeeze in the hole and the dog stays at the height it is set to. A flat runs the length
# of the shaft and head: it is the face printed on the bed, so the dog prints lying down
# with the layers along the shaft (strong against side loads), with no supports.
# "flat" gives the head a flat face flush with the shaft for a square stop; "round" keeps
# the full disc, which works with round stock and lets the dog turn.
@param choices:["20", "19.05"] desc:"Dog hole diameter (mm, 19.05 = 3/4 inch)"
$hole = "20"
@param choices:["flat", "round"] desc:"Head shape"
$head_kind = "flat"
@param 40..100 desc:"Shaft length (mm)"
$length = 60
@param 22..32 desc:"Head diameter (mm)"
$head_d = 26
@param 6..14 desc:"Head height (mm)"
$head_h = 10
@param 0..0.6 step:0.1 desc:"Shaft oversize over the hole, taken up by the split (mm)"
$squeeze = 0.3
@param 20..60 desc:"Split length from the tip (mm)"
$split_l = 35
$hd = if $hole == "20" then 20 else 19.05
$rs = ($hd + $squeeze) / 2
$rh = $head_d / 2
$flat = 1.0 # depth of the flat on the shaft
$zc = $rs - $flat # axis height when the flat lies on the bed
assert $split_l < $length - 8
# --- Head and shaft along X, axis on y = 0, z = zc; then cut flat at z = 0 ----------------
$shaft = cylinder $rs $length | rotate 0 90 0 | translate ($head_h + $length / 2) 0 $zc
$head = cylinder $rh $head_h | rotate 0 90 0 | translate ($head_h / 2) 0 $zc
$tip_ch = 1.5 # chamfer on the tip for an easy start
$body0 = union [$head, $shaft]
$body1 = $body0 | faces >X | chamfer $tip_ch
$bed_cut = box ($length + $head_h + 4) ($head_d + 4) 10 center:(true, true, false) | translate (($length + $head_h) / 2) 0 -10
$body2 = $body1 - $bed_cut
# flat head: cut everything above the shaft's top line on the head
$top_cut = box ($head_h + 2) ($head_d + 4) 10 center:(true, true, false) | translate ($head_h / 2) 0 (2 * $rs - $flat)
$body3 = if $head_kind == "flat" then $body2 - $top_cut else $body2
# split: a slot across the shaft from the tip, through the full height
$slot = box $split_l 1.4 ($head_d + 2) center:(false, true, true) | translate ($head_h + $length - $split_l) 0 $zc
$dog = $body3 - $slot
# --- Checks --------------------------------------------------------------------------------
assert $dog.solids == 1
assert $dog.bbox.x ~ ($head_h + $length)
assert $dog.bbox.y ~ $head_d
assert $dog.bbox.min[2] ~ 0 tol:0.01
assert $dog.bbox.z ~ (if $head_kind == "flat" then 2 * $rs - $flat else $head_d - $flat - ($rh - $rs))
assert 2 * $rs > $hd # it squeezes
print "shaft dia (mm)" (2 * $rs)
$dog