Push Stick
A push stick for a table saw or router table. A long sole rides on top of the workpiece, a heel at the back hooks over the end of the board and pushes it through the cut, and a closed handle above the sole, angled 30 degrees, has a finger slot so the hand wraps around a bar instead of pinching a flat. The bar comes down as a post onto the sole, leaving the front of the sole clear to see the cut. The default is 200 x 12 x 155 mm. Print it lying flat on its side as modelled, with no supports and solid infill or at least five walls, so the layers run along the sole in the plane the pushing forces act in. Parameters: sole length, thickness, heel drop and thickness, grip bar width, length and angle, finger slot height and edge rounding.
# Push Stick - table saw push shoe with a heel and a closed D handle
#
# A push stick for a table saw or router table: a long sole that rides on top of the
# workpiece, a heel at the back that hooks over the end of the board and pushes it through
# the cut, and a closed handle above the sole, angled 30 deg, with a finger slot so the hand
# wraps around a bar instead of pinching a flat.
# Print it lying flat on its side (the model is already on its side: Y is the thickness),
# no supports. Layers then run along the sole, in the plane the pushing forces act in.
# Use 100 % infill or at least 5 walls so the heel does not shear.
@param 150..300 desc:"Sole length (mm)"
$length = 200
@param 8..20 desc:"Thickness (mm)"
$thick = 12
@param 6..20 desc:"Heel: how far it drops below the sole to catch the board (mm)"
$heel_h = 12
@param 12..30 desc:"Heel thickness along the sole (mm)"
$heel_t = 18
@param 20..40 desc:"Grip bar width (mm)"
$grip_w = 28
@param 20..40 desc:"Finger slot height (mm)"
$slot_h = 26
@param 100..160 desc:"Grip bar length (mm)"
$grip_l = 130
@param 15..45 desc:"Grip angle above the sole (deg)"
$angle = 30
@param 0..4 step:0.5 desc:"Edge rounding (mm, 0 = none)"
$round = 2
# --- Side profile (X along the sole, Z up; the rear heel is at X = 0) --------------------
$body_h = 22 # sole thickness above the board
$web = 8 # material between the finger slot and the sole top
$sole_top = $heel_h + $body_h
$ca = cos($angle)
$sa = sin($angle)
$ta = tan($angle)
$slot_x0 = 24 # the slot starts this far along the bar
$slot_l = $grip_l - $slot_x0 - 30 # and ends short of the bar tip
# bar top at the rear, so that the slot's lower edge clears the sole top by the web
$zr = $sole_top + $web + ($grip_w + $slot_h) / $ca - $slot_x0 * $ta
$tip_top_x = $grip_l * $ca
$tip_top_z = $zr + $grip_l * $sa
$tip_low_x = $tip_top_x + $grip_w * $sa
$tip_low_z = $tip_top_z - $grip_w * $ca
$nose = 6 # chamfer on the front of the sole
$outline = workplane XZ
| polyline [(0, 0), ($heel_t, 0), ($heel_t, $heel_h), ($length, $heel_h), ($length, $sole_top - $nose),
($length - $nose, $sole_top), ($tip_low_x, $sole_top), ($tip_low_x, $tip_low_z), ($tip_top_x, $tip_top_z), (0, $zr)]
| extrude $thick
# finger slot: a rounded slot parallel to the bar, just under it
$sr = min($slot_h / 2 - 0.1, 10)
$slot = workplane XZ
| rect ($slot_l - 2 * $sr) ($slot_h - 2 * $sr) | offset $sr
| rotate $angle
| extrude ($thick + 2)
| translate 0 0 0
# slot centre: start of the slot along the bar top, then down by grip_w + slot_h / 2 (perpendicular)
$scx = ($slot_x0 + $slot_l / 2) * $ca + ($grip_w + $slot_h / 2) * $sa
$scz = $zr + ($slot_x0 + $slot_l / 2) * $sa - ($grip_w + $slot_h / 2) * $ca
$slot_p = $slot | translate $scx 0 $scz
$stick0 = $outline - $slot_p
$stick1 = if $round > 0 then ($stick0 | edges =Y | fillet $round) else $stick0
$stick = $stick1 | translate 0 ($thick / 2) 0
# --- Checks ---------------------------------------------------------------------------
assert $stick.solids == 1
assert $stick.bbox.x ~ max($length, $tip_low_x)
assert $stick.bbox.y ~ $thick
assert $stick.bbox.z ~ $tip_top_z
assert $stick.volume < $outline.volume # the slot was cut
assert $tip_low_x < $length - $nose - 10 # the bar tip lands on the sole, not beyond it
print "overall (mm)" $stick.bbox.z
$stick