Sanding Block
A hand sanding block that wraps a sheet of sandpaper around its short side: under the base, up both faces and into a slot on top at each side, where a tapered bar is pressed in to pinch the paper. It needs no clips or screws; the bars jam by their taper and lift out with a fingernail under the lip. The block length and the wrap length are calculated from the sheet size, so a quarter sheet of 115 x 140 mm wraps with nothing left over. The top long edges are rounded so the paper does not tear and both ends are scooped for the fingers. The default block is 119 x 70 x 25 mm, laid out with the two bars as 119 x 92 mm. Prints flat with no supports: block on its base, bars upside down on their lips. Parameters: sheet width and length, block height, tuck depth, slot width and edge radius.
# Sanding Block - hand block sized to a quarter sheet, paper held by two tapered bars
#
# A hand sanding block that wraps a sheet of sandpaper around its short side: under the
# base, up both faces and into a slot on top at each side, where a tapered bar is pressed in
# to pinch the paper. No clips or screws; the bars jam by their taper and lift out with a
# fingernail under the lip. The block length and wrap length come from the sheet size, so a
# quarter sheet (115 x 140 mm) wraps with nothing left over and nothing short.
# The top long edges are rounded so the paper does not tear, and both ends are scooped
# for the fingers. Prints flat, no supports: block on its base, bars upside down on their lips.
@param 60..150 desc:"Sheet width, along the block (mm)"
$sheet_w = 115
@param 100..200 desc:"Sheet length, the wrap direction (mm)"
$sheet_l = 140
@param 18..35 desc:"Block height (mm)"
$height = 25
@param 8..15 desc:"Paper tucked into each slot (mm)"
$tuck = 10
@param 2.5..5 step:0.5 desc:"Slot width (mm)"
$slot_w = 3.5
@param 3..8 desc:"Top edge radius (mm)"
$edge_r = 6
# --- Block size from the sheet --------------------------------------------------------
$len = $sheet_w + 4 # a little longer than the paper is wide
$wrap = $sheet_l - 2 * ($height + $tuck) # across: what is left after both faces and tucks
assert $wrap >= 40 # the sheet is long enough to wrap this height
$slot_d = $tuck + 2
$slot_y = $wrap / 2 - $edge_r - 4 # slots just inside the rounded edges
assert $slot_y > 6 # the two slots do not meet in the middle
$block0 = box $len $wrap $height center:(true, true, false)
$block1 = $block0 | edges >Z =X | fillet $edge_r # round the two long top edges
# finger scoops in both ends
$scoop = cylinder 14 ($wrap + 2) | rotate 90 0 0
$scoops = union [$scoop | translate ($len / 2 + 10) 0 ($height / 2 + 2), $scoop | translate (-($len / 2 + 10)) 0 ($height / 2 + 2)]
$block2 = $block1 - $scoops
# slots: closed at the ends, full paper width long
$slot = box ($sheet_w - 4) $slot_w ($slot_d + 1) center:(true, true, false) | translate 0 0 ($height - $slot_d)
$slots = union [$slot | translate 0 $slot_y 0, $slot | translate 0 (-$slot_y) 0]
$block = $block2 - $slots
# --- Bars: tapered in thickness from loose at the tip to a jam fit, with a lip on top --------
$bar_l = $sheet_w - 6
$tip = $slot_w - 1.2
$fat = $slot_w + 0.3 # pinches the paper (two layers of paper fill the rest)
$bar_prof = workplane YZ | polyline [(-($tip / 2), 0), ($tip / 2, 0), ($fat / 2, $slot_d - 1), (-($fat / 2), $slot_d - 1)]
$bar_body = $bar_prof | extrude $bar_l | translate (-($bar_l / 2)) 0 0
$lip = box $bar_l ($fat + 3) 2 center:(true, true, false) | translate 0 0 ($slot_d - 1)
$bar = $bar_body + $lip
assert $bar.solids == 1
# --- Print layout: block, then the two bars upside down on their lips in front of it
# (the taper then narrows going up, so there is no overhang) ----------------------------
$bar_flat = $bar | rotate 180 0 0 | translate 0 0 ($slot_d + 1)
$b1 = $bar_flat | translate 0 (-($wrap / 2) - 8) 0
$b2 = $bar_flat | translate 0 (-($wrap / 2) - 8 - $fat - 3 - 4) 0
$out = union [$block, $b1, $b2]
# --- Checks ---------------------------------------------------------------------------
assert $out.solids == 3
assert clear($block, $b1)
assert clear($b1, $b2)
assert $block.bbox.x ~ $len
assert $block.bbox.y ~ $wrap
assert $block.bbox.z ~ $height
assert $b1.bbox.min[2] ~ 0 tol:0.01
assert $block.volume < $block0.volume
print "block (mm)" $wrap
$out