Circle Jig
A trammel for cutting circles and arcs with a trim router. The round end replaces the router's base plate, with a hole for the bit and countersunk holes on the router's mounting circle; the arm has a pivot hole every 10 mm. Drop a 4 mm nail or screw through the hole at the radius wanted into the centre of the circle and swing the router round. The number beside each hole is the distance from the bit centre, so the cut radius is that number plus or minus half the bit diameter. The mounting circle diameter, number of screws, their angle and the screw size are parameters, so the base can be matched to any router. The default for a 90 mm base with three M4 screws on a 62 mm circle and radii from 40 to 150 mm measures 207 x 90 x 6 mm. Prints flat with no supports. Parameters: base diameter, mounting circle, screw count, angle and size, bit clearance hole, smallest and largest radius, plate thickness and arm width.
# Circle Jig - router trammel: a base that bolts under the router and a pivot arm with a radius scale
#
# A trammel for cutting circles and arcs with a trim router. The round end replaces the
# router's base plate: a hole for the bit and countersunk holes on the router's mounting
# circle. The arm has a pivot hole every 10 mm; drop a 4 mm nail or screw through the one at
# the radius wanted into the centre of the circle and swing the router round. The number
# beside each hole is the distance from the bit centre, so the cut radius is that number
# plus or minus half the bit diameter (outside or inside of the circle).
# The mounting circle, hole count and screw size are parameters, so the base can be
# matched to any router. Prints flat, no supports.
@param 60..120 desc:"Router base diameter (mm)"
$base_d = 90
@param 40..100 desc:"Mounting hole circle diameter (PCD, mm)"
$pcd = 62
@param 2..4 desc:"Number of mounting screws"
$n_screw = 3
@param 0..90 desc:"Angle of the first mounting hole (deg)"
$screw_a0 = 30
@param choices:["M4", "M5", "M6"] desc:"Mounting screw"
$screw = "M4"
@param 20..40 desc:"Bit clearance hole diameter (mm)"
$bit_hole = 30
@param 100..250 step:10 desc:"Largest pivot radius (mm)"
$r_max = 150
@param 20..60 step:10 desc:"Smallest pivot radius (mm)"
$r_min = 40
@param 5..8 step:0.5 desc:"Plate thickness (mm)"
$t = 6
@param 30..50 desc:"Arm width (mm)"
$arm_w = 40
$sd = if $screw == "M4" then 4.5 else if $screw == "M5" then 5.5 else 6.6
$csk_d = $sd * 2
assert $pcd + $sd + 6 < $base_d # screw heads inside the disc
assert $pcd - $sd - 4 > $bit_hole # and outside the bit hole
assert $r_min > $pcd / 2 + $sd / 2 + 2.25 + 2 # first pivot beyond the mounting circle
# --- Plate: disc plus arm along +X --------------------------------------------------------
$len = $r_max + 12
$disc = circle ($base_d / 2)
$arm = rect $len $arm_w at:($len / 2, 0)
$plate = union [$disc, $arm] | extrude $t
# bit hole and mounting screws (countersunk from the top: the router sits under the plate,
# so the screw heads must be flush with the top surface)
$bit = cylinder ($bit_hole / 2) ($t + 2) center:(true, true, false) | translate 0 0 -1
$shank = cylinder ($sd / 2) ($t + 2) center:(true, true, false) | translate 0 0 -1
$csk = cone ($sd / 2) ($csk_d / 2) ($csk_d / 2 - $sd / 2) center:(true, true, false) | translate 0 0 ($t - ($csk_d / 2 - $sd / 2) + 0.01)
$screw_cut = union [($shank + $csk) | translate (($pcd / 2) * cos($screw_a0 + i * 360 / $n_screw)) (($pcd / 2) * sin($screw_a0 + i * 360 / $n_screw)) 0 for i in range($n_screw)]
# pivot holes every 10 mm from r_min to r_max, numbered
$n_piv = floor(($r_max - $r_min) / 10) + 1
def px($i) = $r_min + $i * 10
$pivots = union [cylinder 2.25 ($t + 2) center:(true, true, false) | translate px(i) 0 -1 for i in range($n_piv)]
$labels = union [text ("" + px(i)) 3.2 | rotate 90 | extrude 1 | translate (px(i) + 1.6) 7 ($t - 0.5) for i in range($n_piv)]
$name = text "RADIUS TO BIT CENTRE" 3.2 | extrude 1 | translate ($r_min + 50) (-14) ($t - 0.5)
$j1 = $plate - $bit
$j2 = $j1 - $screw_cut
$j3 = $j2 - $pivots
$j4 = $j3 - $labels
$jig = $j4 - $name
# --- Checks -----------------------------------------------------------------------------
assert $jig.solids == 1
assert $jig.bbox.x ~ ($len + $base_d / 2)
assert $jig.bbox.y ~ $base_d
assert $jig.bbox.z ~ $t
assert $jig.volume < $plate.volume
print "pivot holes" $n_piv
print "overall length (mm)" ($len + $base_d / 2)
$jig