width=85.6; height=53.98 + 3; bobbyh = .7;//measured at .6 height and 1.6 at the bubble for a single stalk // it's also 1.5 wide, but we're not using that measurement here. bobbyl = 50; // length of bobby pin bobbyscooch = 10;// how much the bobby pin can scooch up: should be at least 7. coinThick=1.75+.2; coinR = 12.13 + .1 + (bobbyh/2) + .1; thumbSlot = 7-1; walls=.8; roundy=.5; invisit = 1; $fn = 30; dollarR=13.254+.1 + .7 + (bobbyh/2); dollarT=2+.1 + .2; /** * @param Tracks: array of arrays like [ [y,z,thumb,rad,thick], [y,z] ] */ module coinCard(tracks) { difference(){ //Base block minkowski(){ cube([dollarT+2*walls-2*roundy,width-2*roundy,height-2*roundy]); translate([roundy,roundy,roundy])sphere(roundy); } for( track = tracks ) { // Inner slot for(i=[1:1:len(track)-1]) { hull() { #translate([walls,track[i][0],track[i][1]])rotate([0,90,0]) cylinder(r=track[0][3],h = track[0][4]); #translate([walls,track[i-1][0],track[i-1][1]])rotate([0,90,0]) cylinder(r=track[0][3],h = track[0][4]); } } //thumb slot if(track[0][2]) { for(i=[1:1:len(track)-1]) { color(c=[i/(len(track)-1),i%2/(len(track)-1),i%3/(len(track)-1)])hull() { translate([-invisit,track[i][0],track[i][1]])rotate([0,90,0])cylinder(r=thumbSlot,h = coinThick+invisit); translate([-invisit,track[i-1][0],track[i-1][1]])rotate([0,90,0])cylinder(r=thumbSlot,h = coinThick+invisit); } } } } // cut through the model (easier debugging) //translate([-1,0,0])cube([25,45,100]); } } // dollar coins and quarters /*translate([-10,0,0])coinCard([ [ [width-coinR-walls,height-coinR-walls,true,coinR,coinThick], [0,height-coinR-walls] ], [ [width-dollarR-walls,dollarR+walls,true,dollarR,dollarT], [0, dollarR+walls] ], ]);*/ pennyR = (19.05/2) + .7; pennyT = 1.52 + .2; dimeR = (17.91 /2) + .7 + .1; dimeT = 1.35 + .2; nicR = (21.21/2) + .7; nicT = 1.95 + .2; angle = 50; zigZ = cos(angle)*2;//6/5;//sqrt(2); zigY = sin(angle)*2;//8/5;//sqrt(2); difference(){ union(){ // A nickel in front of the dimes, and pennies translate([0,0,0])coinCard([ [ [width-pennyR-walls,height-pennyR-walls,true,pennyR,pennyT], [0,height-pennyR-walls] ], [ [width-dimeR-walls, dimeR+walls+(dimeR*zigZ),true,dimeR,dimeT], [width-dimeR-walls - (dimeR*zigY), dimeR+walls ], [width-dimeR-walls - (dimeR*zigY*2), dimeR+walls+(dimeR*zigZ)], [width-dimeR-walls - (dimeR*zigY*3), dimeR+walls], [nicR+walls, height-(pennyR*2)-walls - nicR-walls] ], [ [nicR+walls, height-(pennyR*2)-walls-nicR-walls,true,nicR,nicT], [0, height-(pennyR*2)-walls - nicR-walls] ], ]); // dollar coins and quarters color("green")translate([dollarT+2*walls + dollarT + 1*walls+.1,0,0])mirror([1,0,0])coinCard([ [ [width-coinR-walls,height-coinR-walls,true,coinR,coinThick], [0,height-coinR-walls] ], [ [width-dollarR-walls,dollarR+walls,true,dollarR,dollarT], [0, dollarR+walls] ], ]); } // cut a little hole for us to put our bobbypin through #translate([4,bobbyl-bobbyscooch,dollarR*2 + walls-invisit])cube([dollarT,bobbyscooch,2+invisit]); #translate([walls,bobbyl-bobbyscooch,height - (pennyR*2) - (walls*2)-invisit]) cube([dollarT,bobbyscooch,2+invisit]); // a spot for the bobby pin to slide next to the dime zig-zag #translate([walls,0,height - (pennyR*2) - (walls*2)-1.6-.4]) cube([dollarT,bobbyl,1.6+.4]); } /*translate([20,0,0])coinCard([ [ [width-pennyR-walls,height-pennyR-walls,true,pennyR,pennyT], [0,height-pennyR-walls] ], [[width-pennyR-walls,height-pennyR-walls,false,pennyR,pennyT],[width-pennyR-walls,pennyR+walls]], [ [width-pennyR-walls,pennyR+walls,true,pennyR,pennyT], [pennyR+walls,pennyR+walls] ], ]);*/