// -*- C -*- fdia=1.75; slop=0.5; bigslop=slop*2; hubeffrad = 30; // + 55; hubbigrad = 20; hublwidth = 3; hubstemwidth = 2; hublthick = 10; hubaxlelen = 25; hubaxlerad = 5; prongthick=5; prongwidth=5; ratchetstep=15; ratchettooth=3; ratchettoothheight=5; ratchettoothsmoothr=1; ratchettoothslope=0.75; overlap=0.5; cupbigrad=20; xstraightmul = 1.75; propxshift = 0; doveclipheight = 10; teethh=3; teethgapx=4+fdia; prongstalkxwidth=3; stalklength=35; overclipcupgap=5; overclipdepth=15; overcliproundr=2.0; overclipthick=0.5; overclipsmaller=-2.5; overclipbigger=0.0; wingspoke=3; wingsize=6; wingthick=3; armendwallthick=2.5; armendbasethick=1.2; ratchetpawl=ratchetstep-ratchettooth-bigslop*2; include include include channelwidth = prongthick + slop; channeldepth = prongwidth + ratchettoothheight; totalwidth = armendwallthick*2 + channelwidth; totalheight = channeldepth + armendbasethick; stalkwidth = prongwidth + prongstalkxwidth; module ArmEnd(length=120){ ////toplevel translate([ratchettoothsmoothr, channelwidth/2, -armendbasethick]) { rotate([0,0,-90]) DoveClipPairBase(h=doveclipheight); } difference(){ translate([0, -armendwallthick, -armendbasethick]) cube([length, totalwidth, totalheight]); translate([-1, 0, 0]) cube([length+1 - ratchettooth, channelwidth, channeldepth+1]); translate([-1, 0, ratchettoothheight]) cube([length+2, channelwidth, channeldepth+1]); } for (dx = [0 : ratchetstep : length - ratchetstep]) translate([dx,0,0]) { 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 - ratchettoothsmoothr]); } } } module FilamentCupHandle(){ pawlusewidth = ratchetpawl-ratchettoothsmoothr*2; mirror([0,1,0]) { cube([stalklength, stalkwidth, prongthick]); translate([stalklength, stalkwidth/2, 0]) cylinder(r=stalkwidth/2, h=prongthick, $fn=20); translate([ratchettoothsmoothr, stalkwidth, 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 - 1]); } } } } module FilamentCupCup(){ xstraight = cupbigrad * xstraightmul; 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() { ////toplevel FilamentCupHandle(); dx = cupbigrad + prongwidth; gapy = prongwidth; dy = cupbigrad + gapy + overclipcupgap; translate([dx, dy, 0]) FilamentCupCup(); translate([0, -1, 0]); cube([prongwidth, dy+1, prongthick]); midrad = cupbigrad + prongwidth/2; propshift = stalklength - overclipdepth - prongthick + propxshift; proptaken = propshift; echo(cupbigrad, dx, midrad, propshift, proptaken); translate([propshift, -1, 0]) { // something is wrong with the y calculation cube([prongwidth, dy - sqrt(midrad*midrad - proptaken*proptaken) - prongwidth/2, prongthick]); } translate([0, overclipcupgap, 0]) rotate([0,0, 102 + fdia]) FilamentTeeth(fdia=fdia, h=teethh); } module CupSecuringClipSolid(w,d,h1,h2){ rotate([0,-90,0]) translate([0,-h1/2,-w/2]) linear_extrude(height=w) { polygon(points=[[0,0], [d,0], [d,h2], [0,h1]]); } } module CupSecuringClipSolidSmooth(xrad=0, xdepth=0){ hbase = totalheight + prongstalkxwidth - overcliproundr*2; minkowski(){ CupSecuringClipSolid(w=totalwidth, d=overclipdepth + xdepth, h1=hbase - overclipsmaller, h2=hbase + overclipbigger); cylinder($fn=20, h=0.01, r=overcliproundr+xrad); } } module CupSecuringClip(){ ////toplevel wingswidth = wingspoke*2 + overclipthick*2 + overcliproundr*2 + totalwidth; difference(){ union(){ CupSecuringClipSolidSmooth(xrad=overclipthick, xdepth=0); translate([-wingswidth/2, -wingsize/2, 0]) cube([wingswidth, wingsize, wingthick]); } translate([0,0,-0.1]) CupSecuringClipSolidSmooth(xrad=0, xdepth=0.2); } } module ArmDoveClipPin(){ ////toplevel DoveClipPin(h=doveclipheight); } module Hub(){ ////toplevel difference(){ cylinder($fn=60, h=hublthick, r=hubbigrad); translate([0,0,-1]) cylinder($fn=30, h=hublthick+2, r=(hubbigrad-hublwidth)); } axlerad = hubaxlerad + slop; difference(){ cylinder(h=hubaxlelen, r=axlerad+hublwidth); translate([0,0,-1]) cylinder($fn=60, h=hubaxlelen+2, r=axlerad); } hole = hubeffrad - hubbigrad - DoveClip_depth() - hublwidth*2; holewidth = DoveClip_width() - hubstemwidth*2; for (ang=[0,120,240]) rotate([0,0,ang]) { difference() { translate([hubeffrad,0,0]) DoveClipPairSane(h=doveclipheight, baseextend = (hubeffrad - DoveClip_depth() - hubbigrad + hublwidth)); if (hole>hublwidth && holewidth > 2) { translate([hubbigrad + hublwidth, -holewidth/2, -1]) cube([hole, holewidth, hublthick+2]); } } } xmin = axlerad+hublwidth/2; xmax = hubbigrad-hublwidth/2; for (ang = [0 : 60 : 359]) rotate([0,0,ang]) rotate([90,0,0]) { translate([0,0,-hublwidth/2]) linear_extrude(height=hublwidth) polygon([[xmin,0.05], [xmax,0.05], [xmax,hublthick-0.2], [xmin, hubaxlelen-0.2]]); } } //ArmEnd(); //FilamentCup(); //CupSecuringClip(); //Hub();