slop=0.5; bigslop=slop*2; prongthick=5; prongwidth=5; ratchetstep=15; ratchettooth=3; ratchettoothheight=5; ratchettoothsmoothr=1; ratchettoothslope=0.75; overlap=0.5; armendwallthick=2.5; armendbasethick=1.2; ratchetpawl=ratchetstep-ratchettooth-bigslop*2; include channelwidth = prongthick + slop; channeldepth = prongwidth + ratchettoothheight; totalwidth = armendwallthick*2 + channelwidth; totalheight = channeldepth + armendbasethick; doveclipheight = totalheight; module ArmEnd(length=120){ translate([ratchettoothsmoothr, channelwidth/2, -armendbasethick]) { rotate([0,0,-90]) DoveClipPairBase(h=doveclipheight); } for (dx = [0 : ratchetstep : length]) translate([dx,0,0]) { difference(){ translate([0, -armendwallthick, -armendbasethick]) cube([ratchetstep+overlap, totalwidth, totalheight]); translate([-1, 0, 0]) cube([ratchetstep+overlap+2, channelwidth, channeldepth+1]); } translate([ratchettoothsmoothr+0.5, armendwallthick/2, 0]) minkowski(){ rotate([90,0,0]) cylinder($fn=20, r=ratchettoothsmoothr, h=armendwallthick); multmatrix([ [ 1, 0, ratchettoothslope, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ]]) cube([ratchettooth - ratchettoothsmoothr*2, channelwidth, ratchettoothheight]); } } } module FilamentHandle(stalklength=50){ pawlusewidth = ratchetpawl-ratchettoothsmoothr*2; mirror([0,1,0]) { cube([stalklength, prongwidth, prongthick]); translate([ratchettoothsmoothr, prongwidth, 0]) { minkowski(){ cylinder($fn=20,r=ratchettoothsmoothr, h=1); multmatrix([ [ 1, -ratchettoothslope, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ]]) cube([pawlusewidth, ratchettoothheight - ratchettoothsmoothr, prongthick]); } } } } //ArmEnd(); FilamentHandle();