slop=0.5; bigslop=slop*2; prongthick=5; prongwidth=5; ratchetstep=15; ratchettooth=3; ratchettoothheight=5; ratchettoothsmoothr=1; ratchettoothslope=0.75; overlap=0.5; cupbigrad=35; stalklength=50; overclipcupgap=5; overclipheight=15; armendwallthick=2.5; armendbasethick=1.2; ratchetpawl=ratchetstep-ratchettooth-bigslop*2; include 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(){ pawlusewidth = ratchetpawl-ratchettoothsmoothr*2; mirror([0,1,0]) { cube([stalklength, prongwidth, prongthick]); translate([stalklength, prongwidth/2, 0]) cylinder(r=prongwidth/2, h=prongthick, $fn=20); 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]); } } } } module FilamentCupCup(){ xstraight = cupbigrad; linear_extrude(height=prongthick) { FlatArc(0,0, cupbigrad,cupbigrad+prongwidth, 89,271, $fn=80); } for (my=[0,1]) mirror([0,my,0]) { translate([0,cupbigrad,0]) cube([xstraight, prongwidth, prongthick]); } } module FilamentCup() { FilamentHandle(); dx = cupbigrad + prongwidth; dy = cupbigrad + prongwidth + overclipcupgap; translate([dx, dy, 0]) FilamentCupCup(); translate([0, -1, 0]); cube([prongwidth, dy+1, prongthick]); propshift = stalklength - overclipheight - prongthick; proptaken = propshift + prongthick; echo(cupbigrad, dx, propshift, proptaken); translate([propshift, -1, 0]) cube([prongwidth, sqrt(cupbigrad*cupbigrad - proptaken*proptaken) + overclipcupgap + prongthick + 1, prongthick]); } //ArmEnd(); FilamentCup();