use use $fa = ($preview) ? 12 : 1; $fs = ($preview) ? 2 : 1; $incolor = true; // Config BallDiameter = 65; BallClearance = 2; BallSealWidth = 2; PlateLip = 2; PlateDiameter = BallDiameter + 2*(BallClearance + BallSealWidth + PlateLip); PlateThick = BallSealWidth/2 + 1; //plate_full(); PlateSep = 0; pd = PlateDiameter+PlateSep; pt = PlateThick; echo("PD=", pd); translate([pd+5,0]) plate_top(thickness=pt); translate([0,pd+5]) plate_mid(thickness=pt); translate([pd+5,pd+5]) cap_compression(PlateDiameter, pt); translate([-(pd+5),0]) mold_wall(PlateDiameter, pt, BallDiameter); translate([0,-(pd+5)]) plate_under(); stack(pt, expand=false) { cap_compression(PlateDiameter, pt); //plate_under(); //plate_mid(thickness=pt); plate_top(thickness=pt); mold_wall(PlateDiameter, pt, BallDiameter); } module stack(pt, ed=10 ,expand=false) { d = expand ? pt + ed : pt+.01; for (i = [0:$children-1]) { translate([0,0,d*i]) children(i); } } module mold_wall(pd, pt, bd, wt=3) { threadc = $incolor ? "green" : undef; difference() { union() { translate([0,0,8]) cylinder(d=pd+wt, h=bd/2+pt-8); color(threadc) metric_thread( diameter=pd+wt, length=8.01, internal=false); } translate([0,0,-.1]) cylinder(d1=pd-1, d2=pd+1, h=bd/2+pt+.2); } } module cap_compression(pd, pt, th=7, wt=3) { difference() { cylinder(d=pd+2*wt, h=th); translate([0,0,-.01]) cylinder(d=pd-6, h=5); translate([0,0,pt]) metric_thread(diameter=pd+wt,length=th+.01, internal=true); } } module plate( d=PlateDiameter, thickness = PlateThick) { translate([0,0,-thickness]) cylinder(d=d, h=thickness+.01); } module plate_mid(thickness = 1) { translate([0,0,thickness]) { ball(bottom=false); plate(thickness=thickness); register_seal(); } } module plate_top(thickness = 1) { translate([0,0,thickness]) { ball(bottom=false); difference() { plate(thickness=thickness); register_seal(); } } } module plate_under(thickness = 1) { translate([0,0,thickness]) { underball(); plate(thickness=thickness); register_seal(); } } module ball( bd=BallDiameter, insert=true, top = true, bottom = true) { insertc = $incolor ? "gold" : undef; maxz = top ? bd/2 : 0; minz = bottom ? -bd/2 : 0; echo("maxz:", maxz); echo("minz:", minz); difference() { intersection() { sphere(d=bd); translate([0,0,(maxz+minz)/2]) cube([bd, bd, maxz-minz],center=true); } color(insertc) if (insert) for (iz = [-bd/2, bd/2]) { rot = (iz < 0) ? 180 : 0; //translate([0,0,bd/2])thread_insertM3($die=true); translate([0,0,iz]) rotate([0,rot,0]) thread_insertM3($die=true); } } } module register_seal( bd = BallDiameter, cl = BallClearance, // Clearance around ball sw = BallSealWidth, // Width of register ) { rotate_extrude() translate([bd/2+cl,0,0]) circle(d=sw); } module underball() { intersection() { translate([0,0,9]) { rotate_extrude(angle=360) translate([10+15/2,0,0]) circle(d=20); translate([0,0,-4]) cylinder(d=55, h=10, center=true); } cylinder(d=70,h=35); } }