Sharpening Guide
Angle wedges for sharpening on a whetstone. Set a wedge on the stone beside the blade, rest the flat of the blade on its sloped face, then lift the blade off the wedge and keep that angle while stroking. The set has one wedge per angle: 15 degrees for razors and fillet knives, 20 for kitchen knives and 25 for pocket knives and chisels, with the angle engraved on the side; a single angle or a custom angle can be printed instead. The slope is calculated from the angle over the wedge length and the thin end keeps a 2 mm nose so it does not chip. The default set of three 60 x 30 mm wedges lays out as 60 x 106 x 30 mm. Prints flat on the base with no supports. Parameters: which wedges, custom angle, wedge length and width.
# Sharpening Guide - angle wedges for a whetstone, 15 / 20 / 25 deg, angle engraved
#
# A wedge that sits on the whetstone beside the blade: rest the flat of the blade on the
# sloped face, then lift it off the wedge and keep that angle while stroking. One wedge per
# angle: 15 deg for razors and fillet knives, 20 for kitchen knives, 25 for pocket knives
# and chisels. The slope is calculated from the angle over the wedge length, the thin end
# keeps a 2 mm nose so it does not chip, and the angle is engraved on the side.
# "set" prints all three; a single angle prints one. Flat on the base, no supports.
@param choices:["set", "15", "20", "25", "custom"] desc:"Which wedge(s)"
$which = "set"
@param 10..35 desc:"Custom angle (deg)"
$custom = 17
@param 40..80 desc:"Wedge length (mm)"
$length = 60
@param 20..40 desc:"Wedge width (mm)"
$width = 30
$nose = 2
def wdg($a) = workplane XZ
| polyline [(0, 0), ($length, 0), ($length, $nose + $length * tan($a)), (0, $nose)]
| extrude $width
| translate 0 (-($width / 2)) 0 # the XZ workplane extrudes along +Y: centre it
def label($a) = text ("" + $a + " DEG") 4 | extrude 1 | rotate 90 0 0
| translate ($length * 0.55) (-($width / 2) + 0.5) (($nose + $length * tan($a)) * 0.4)
def done($a) = wdg($a) - label($a)
$angles_n = if $which == "set" then 3 else 1
def ang($i) = if $which == "set" then 15 + 5 * $i else if $which == "custom" then $custom else (if $which == "15" then 15 else if $which == "20" then 20 else 25)
$pitch = $width + 8
$out = union [done(ang(i)) | translate 0 ((i - ($angles_n - 1) / 2) * $pitch) 0 for i in range($angles_n)]
# --- Checks: the slope of each wedge is its angle ---------------------------------------
assert $out.solids == $angles_n
def rise($a) = $length * tan($a)
assert $out.bbox.z ~ ($nose + rise(ang($angles_n - 1)))
assert $out.bbox.x ~ $length
assert $out.bbox.y ~ ($angles_n * $pitch - 8)
print "tallest (mm)" $out.bbox.z
$out