User:Dorkmo/Ideas/Battery/SCAD/Sandbox: Difference between revisions
< User:Dorkmo | Ideas | Battery | SCAD
Jump to navigation
Jump to search
| (30 intermediate revisions by the same user not shown) | |||
| Line 127: | Line 127: | ||
==cage== | ==cage== | ||
===cage with side locking divots=== | |||
updated 20150311 | |||
w/ old parameters | |||
<nowiki> | <nowiki> | ||
height = | height = 90; | ||
tub_width = | tub_width = 36; | ||
tub_length = 70; | tub_length = 70; | ||
basethickness = 5; | basethickness = 5; | ||
tub_wall = 5; | tub_wall = 2; | ||
tub_outsidewall = 4; | |||
tubs_rows = 5; | |||
tubs_columns = 2; | |||
spacing = | spacing = 1.940055; | ||
center_dividers = 00; //1 yes 0 no | |||
cage_height = 60; | cage_height = 60; | ||
cage_wall = | cage_wall = 5.5; | ||
cage_endwall = 2; | cage_endwall = 2; | ||
cage_base = 5; | cage_base = 5; | ||
mesh_opening = 1 ; | mesh_opening = 1.5 ; | ||
mesh_angle = 45; | mesh_angle = 45; | ||
mesh_spacing = | mesh_spacing = 3.5; | ||
wire_diameter = 2; | wire_diameter = 2; | ||
wire_holeoffc = 0; | wire_holeoffc = 0; | ||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
//begin underlying cage module | //begin underlying cage module | ||
module cage() | module cage() | ||
{ | { | ||
union() | |||
{ | { | ||
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false); | difference() | ||
{ | |||
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false); | |||
//cut hole for powder to sit in | //cut hole for powder to sit in | ||
translate([cage_wall, cage_endwall, cage_base]) | |||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)+0.001,(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false); | |||
} | } | ||
} | }//end difference begin union | ||
//side locking divots | |||
//1 | |||
translate([((tub_width-(spacing*3))/2)/2,0,((tub_width-(spacing*3))/2)/2]) | |||
rotate([0,0,90]) | |||
divot_sphere_d(); | |||
//2 | |||
translate([((tub_width-(spacing*3))/2)/2,0,cage_height-(((tub_width-(spacing*3))/2)/2)]) | |||
rotate([0,0,90]) | |||
divot_sphere_d(); | |||
//3 | |||
translate([((tub_width-(spacing*3))/2)/2,tub_length-(spacing*2),((tub_width-(spacing*3))/2)/2]) | |||
rotate([0,0,270]) | |||
divot_sphere_d(); | |||
//4 | |||
translate([((tub_width-(spacing*3))/2)/2,tub_length-(spacing*2),cage_height-(((tub_width-(spacing*3))/2)/2)]) | |||
rotate([0,0,270]) | |||
divot_sphere_d(); | |||
}//end union | |||
//end cage | //end cage | ||
| Line 239: | Line 268: | ||
difference() | difference() | ||
{ | { | ||
translate([( | translate([(cage_divot_height/2)/sin(45)*sin(45),0,0]) | ||
{ | { | ||
sphere(r = ( | sphere(r = (cage_divot_height/2)/sin(45)); | ||
} | } | ||
translate([( | translate([(cage_divot_height/2)/sin(45),0,0]) | ||
cube(size = [(( | cube(size = [((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2)], center=true); | ||
} | } | ||
} | } | ||
| Line 271: | Line 300: | ||
//1 | //1 | ||
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-((( | translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))]) | ||
{ | { | ||
#divot_sphere(); | #divot_sphere(); | ||
} | } | ||
//2 | //2 | ||
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-((( | translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))]) | ||
{ | { | ||
#divot_sphere(); | #divot_sphere(); | ||
} | } | ||
//3 | //3 | ||
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-((( | translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))]) | ||
{ | { | ||
mirror([1,0,0]) | mirror([1,0,0]) | ||
| Line 289: | Line 318: | ||
} | } | ||
//4 | //4 | ||
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-((( | translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))]) | ||
{ | { | ||
mirror([1,0,0]) | mirror([1,0,0]) | ||
| Line 300: | Line 329: | ||
//end cage | //end cage | ||
//divot by depth module | |||
module divot_sphere_d() | |||
{ | |||
translate([0,0,0]) | |||
{ | |||
difference() | |||
{ | |||
translate([(spacing/(1-cos(45)))*sin(45),0,0]) | |||
{ | |||
sphere(r = (spacing/(1-cos(45)))); | |||
} | |||
translate([(spacing/(1-cos(45))),0,0]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true); | |||
} | |||
} | |||
} | |||
} | |||
//end divot module | |||
//calculate mesh wall minimum thickness | //calculate mesh wall minimum thickness | ||
| Line 310: | Line 358: | ||
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2)); | |||
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2)); | |||
echo("cage cavity z",cage_height-cage_base); | |||
<nowiki> | echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3"); | ||
height = | |||
tub_width = | echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10 | ||
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams"); | |||
//calculate mesh wall minimum thickness | |||
echo("mesh dividers thickness",sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90))); | |||
</nowiki> | |||
testprint1 parameteres | |||
20150125 | |||
*smaller mesh holes (mesh min thickness 0.95061) | |||
*shorter cage height | |||
results | |||
*mesh holes too small, closed up near center. | |||
*lower side lock divot malformed | |||
**infill shrunk inwards on a few lower layers | |||
<nowiki> | |||
height = 90; | |||
tub_width = 36; | |||
tub_length = 70; | tub_length = 70; | ||
basethickness = 5; | basethickness = 5; | ||
tub_wall = | tub_wall = 2; | ||
tub_outsidewall = 4; | |||
tubs_rows = 1; | |||
tubs_columns = 1; | |||
spacing = | spacing = 1.940055; | ||
cage_height = | center_dividers = 00; //1 yes 0 no | ||
cage_wall = | cage_height = 40; | ||
cage_wall = 6; | |||
cage_endwall = 2; | cage_endwall = 2; | ||
cage_base = 5; | cage_base = 5; | ||
mesh_opening = 1 ; | mesh_opening = 1.1 ; | ||
mesh_angle = | mesh_angle = 60; | ||
mesh_spacing = 2.5; | mesh_spacing = 2.9; | ||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
</nowiki> | |||
testprint2 parameteres | |||
20150126 | |||
changes | |||
*45% thicker mesh wall | |||
*holes sized to midpoint between failed testprint1 and original cage | |||
*gcode changes | |||
**slowed down print speed | |||
**entered more accurate filament diameter 2.8mm on 3mm | |||
<nowiki> | |||
height = 90; | |||
tub_width = 46; | |||
tub_length = 70; | |||
basethickness = 5; | |||
tub_wall = 2; | |||
tub_outsidewall = 4; | |||
tubs_rows = 5; | |||
tubs_columns = 2; | |||
spacing = 1.940055; | |||
center_dividers = 00; //1 yes 0 no | |||
cage_height = 40; | |||
cage_wall = 8; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
mesh_opening = 1.25 ; | |||
mesh_angle = 52.5; | |||
mesh_spacing = 3.2; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
/ | cage_lid_depthinto = 7; | ||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
</nowiki> | |||
===cage with divots=== | |||
<nowiki> | |||
height = 80; | |||
tub_width = 65; | |||
tub_length = 70; | |||
outsidewall = 5; | |||
basethickness = 5; | |||
tub_wall = 5; | |||
spacing = 5; | |||
cage_height = 60; | |||
cage_wall = 7.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
wedge_hieght = 10; | |||
mesh_opening = 1 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 2.5; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
lid_depthinto = 7; | |||
divot_height = 5.5; | |||
//begin underlying cage module | |||
module cage() | |||
{ | { | ||
difference() | |||
{ | |||
// | cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false); | ||
//cut hole for powder to sit in | |||
translate([cage_wall, cage_endwall, cage_base]) | |||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false); | |||
} | } | ||
} | } | ||
//end cage | |||
//begin mesh hole grid module | |||
module holes() | |||
{ | |||
intersection() | |||
{ | |||
translate([0,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0]) | |||
cube([cage_wall+0.2,1+((((tub_length-(spacing*2))-(cage_endwall*2)))),cage_height], center=false); | |||
//need to translate closer to the cube here with llarge holes | |||
// | |||
translate([0,0,-mesh_spacing]) | |||
{ | |||
rotate([0,-mesh_angle,0]) | |||
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))]) | |||
{ | |||
//for - pair of rows to height | |||
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
translate(h*[0,0,mesh_spacing]) | |||
{ | |||
//for - second row | |||
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
//translate second row | |||
translate([0,-mesh_spacing/2,mesh_spacing/2]) | |||
{ | |||
//make second row copies | |||
translate(w*[0,mesh_spacing,0]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false); | |||
} | |||
} | |||
} | |||
} | |||
= | //for - create first row | ||
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
* | { | ||
translate(w*[0,mesh_spacing,0]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
//need to tweak | |||
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
////end cube | |||
} | |||
} | |||
} | |||
////end mesh hole grid module | |||
//////divot | |||
module divot_sphere() | |||
{ | |||
difference() | |||
{ | |||
translate([(divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (divot_height/2)/sin(45)); | |||
} | |||
translate([(divot_height/2)/sin(45),0,0]) | |||
cube(size = [((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2)], center=true); | |||
} | |||
} | |||
////end divot module | |||
//begin final cage construction | |||
difference() | |||
//begin | |||
{ | { | ||
cage(); | |||
//begin holes | |||
translate([(((tub_width-(spacing*3))/2)-cage_wall)+0.0, cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | |||
{ | { | ||
holes(); | |||
} | } | ||
translate([(cage_wall)-0.0,cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#holes(); | |||
} | |||
} | |||
//end holes | |||
// | //begin divots | ||
//1 | |||
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
//2 | |||
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
//3 | |||
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
//4 | |||
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
//end divots | |||
} | |||
//end cage | |||
//calculate mesh wall minimum thickness | |||
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90))); | |||
//calculate verticle height of mesh holes to take away from max height of holes | |||
//works okay up to 45 then bugs out. might be because its before the scale down | |||
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))); | |||
/ | </nowiki> | ||
===cage without divots=== | |||
//begin | <nowiki> | ||
height = 80; | |||
tub_width = 65; | |||
tub_length = 70; | |||
outsidewall = 5; | |||
basethickness = 5; | |||
tub_wall = 5; | |||
spacing = 5; | |||
cage_height = 60; | |||
cage_wall = 7.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
wedge_hieght = 10; | |||
mesh_opening = 1 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 2.5; | |||
//begin underlying cage module | |||
module cage() | |||
{ | { | ||
difference() | |||
{ | { | ||
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false); | |||
//cut hole for powder to sit in | |||
translate([cage_wall, cage_endwall, cage_base]) | |||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false); | |||
} | } | ||
} | } | ||
//end cage | //end cage | ||
//begin mesh hole grid module | |||
module holes() | |||
{ | |||
intersection() | |||
{ | |||
translate([0,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0]) | |||
cube([cage_wall+0.2,1+((((tub_length-(spacing*2))-(cage_endwall*2)))),cage_height], center=false); | |||
// | //need to translate closer to the cube here with llarge holes | ||
translate([0,0,-mesh_spacing]) | |||
{ | |||
rotate([0,-mesh_angle,0]) | |||
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))]) | |||
{ | |||
//for - pair of rows to height | |||
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
translate(h*[0,0,mesh_spacing]) | |||
{ | |||
//for - second row | |||
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
//translate second row | |||
translate([0,-mesh_spacing/2,mesh_spacing/2]) | |||
{ | |||
//make second row copies | |||
translate(w*[0,mesh_spacing,0]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false); | |||
} | |||
} | |||
} | |||
} | |||
//for - create first row | |||
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
translate(w*[0,mesh_spacing,0]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
//need to tweak | |||
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} | |||
////end cube | |||
} | |||
} | |||
} | |||
////end mesh hole grid module | |||
//begin final cage construction | |||
difference() | |||
{ | |||
cage(); | |||
translate([(((tub_width-(spacing*3))/2)-cage_wall)+0.0, cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | |||
{ | |||
holes(); | |||
} | |||
translate([(cage_wall)-0.0,cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#holes(); | |||
} | |||
} | |||
} | |||
//end cage | |||
//calculate mesh wall minimum thickness | |||
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90))); | |||
===cage with | |||
//calculate verticle height of mesh holes to take away from max height of holes | |||
//works okay up to 45 then bugs out. might be because its before the scale down | |||
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))); | |||
</nowiki> | |||
===cage with new mesh module=== | |||
*mesh module needs adjusted a little. missing a little from side | |||
<nowiki> | <nowiki> | ||
height = 80; | height = 80; | ||
tub_width = 65; | tub_width = 65; | ||
| Line 613: | Line 798: | ||
mesh_opening = 1 ; | mesh_opening = 1 ; | ||
mesh_angle = | mesh_angle = 60; | ||
mesh_spacing = 2 | mesh_spacing = 2; | ||
| Line 633: | Line 818: | ||
module holes() | module holes() | ||
{ | { | ||
intersection() | |||
{ | |||
translate([0,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0]) | |||
cube([cage_wall+0.2,1+((((tub_length-(spacing*2))-(cage_endwall*2)))),cage_height], center=false); | |||
//need to translate closer to the cube here with llarge holes | |||
translate([0,0,-mesh_spacing]) | |||
{ | |||
rotate([0,-mesh_angle,0]) | |||
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))]) | |||
{ | |||
//for - pair of rows to height | |||
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | ||
{ | { | ||
translate(h*[0,0,mesh_spacing]) | translate(h*[0,0,mesh_spacing]) | ||
{ | |||
//for - second row | |||
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
//translate second row | |||
translate([0,-mesh_spacing/2,mesh_spacing/2]) | |||
{ | { | ||
//make second row copies | |||
translate(w*[0,mesh_spacing,0]) | translate(w*[0,mesh_spacing,0]) | ||
{ | { | ||
rotate([0,0 | rotate([45,0,0]) | ||
{ | { | ||
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false); | |||
} | } | ||
} | } | ||
} | } | ||
// | } | ||
//for - create first row | |||
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | { | ||
translate(w*[0,mesh_spacing,0]) | translate(w*[0,mesh_spacing,0]) | ||
{ | |||
rotate([45,0,0]) | |||
{ | |||
//need to tweak | |||
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false); | |||
} | } | ||
} | } | ||
//end mesh hole grid module | } | ||
} | |||
} | |||
} | |||
////end cube | |||
} | |||
} | |||
} | |||
////end mesh hole grid module | |||
//begin final cage construction | //begin final cage construction | ||
| Line 677: | Line 886: | ||
{ | { | ||
cage(); | cage(); | ||
translate([((tub_width-(spacing*3))/2)-cage_wall | translate([(((tub_width-(spacing*3))/2)-cage_wall)+0.0, cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | ||
{ | { | ||
holes(); | holes(); | ||
} | } | ||
translate([cage_wall+(( | translate([(cage_wall)-0.0,cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | ||
{ | { | ||
| Line 700: | Line 909: | ||
//works okay up to 45 then bugs out. might be because its before the scale down | //works okay up to 45 then bugs out. might be because its before the scale down | ||
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))); | echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))); | ||
</nowiki> | </nowiki> | ||
=== | ===cage with old mesh=== | ||
<nowiki> | <nowiki> | ||
height = 80; | |||
height = | tub_width = 65; | ||
tub_width = | |||
tub_length = 70; | tub_length = 70; | ||
outsidewall = 5; | outsidewall = 5; | ||
| Line 715: | Line 935: | ||
spacing = 5; | spacing = 5; | ||
cage_height = | cage_height = 60; | ||
cage_wall = | cage_wall = 7.5; | ||
cage_endwall = | cage_endwall = 2; | ||
cage_base = 5; | cage_base = 5; | ||
wedge_hieght = 10; | wedge_hieght = 10; | ||
mesh_opening = | mesh_opening = 1 ; | ||
mesh_angle = 45; | mesh_angle = 45; | ||
mesh_spacing = | mesh_spacing = 2.5; | ||
difference() | //begin underlying cage module | ||
module cage() | |||
{ | |||
difference() | |||
{ | |||
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false); | |||
//cut hole for powder to sit in | |||
translate([cage_wall, cage_endwall, cage_base]) | |||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false); | |||
} | |||
} | |||
//end cage | |||
//begin mesh hole grid module | |||
module holes() | |||
{ | |||
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | { | ||
translate(h*[0,0,mesh_spacing]) | |||
{ | { | ||
//scale command here to make openings perfect squares | |||
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))]) | |||
{ | { | ||
rotate([0,90-mesh_angle,0]) | rotate([0,90-mesh_angle,0]) | ||
{ | { | ||
| Line 748: | Line 977: | ||
rotate([0,0,45]) | rotate([0,0,45]) | ||
{ | { | ||
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(cage_wall/sin(90-mesh_angle)))], center=false); | |||
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*( | |||
} | } | ||
} | } | ||
} | } | ||
//begin second row | //begin second row | ||
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | { | ||
translate([mesh_spacing/2,mesh_spacing/2,-mesh_spacing/2]) | translate([mesh_spacing/2,mesh_spacing/2,-mesh_spacing/2]) | ||
| Line 762: | Line 990: | ||
rotate([0,0,45]) | rotate([0,0,45]) | ||
{ | { | ||
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(cage_wall/sin(90-mesh_angle)))], center=false); | |||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
| Line 775: | Line 1,000: | ||
} | } | ||
} | } | ||
//end mesh hole grid module | |||
//begin final cage construction | |||
difference() | |||
{ | |||
cage(); | |||
translate([((tub_width-(spacing*3))/2)-cage_wall-((sin(mesh_angle)*sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2), cage_endwall-(mesh_spacing/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | |||
{ | |||
holes(); | |||
} | |||
translate([cage_wall+((sin(mesh_angle)*sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2), cage_endwall-(mesh_spacing/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#holes(); | |||
} | |||
} | |||
} | |||
//end cage | |||
echo(( | //calculate mesh wall minimum thickness | ||
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90))); | |||
//calculate verticle height of mesh holes to take away from max height of holes | |||
//works okay up to 45 then bugs out. might be because its before the scale down | |||
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))); | |||
</nowiki> | |||
===inside cage=== | |||
<nowiki> | <nowiki> | ||
height = | |||
tub_width = | height = 60; | ||
tub_width = 95; | |||
tub_length = 70; | tub_length = 70; | ||
outsidewall = 5; | |||
basethickness = 5; | basethickness = 5; | ||
tub_wall = | tub_wall = 5; | ||
spacing = 5; | |||
cage_height = 40; | |||
cage_wall = 10; | |||
cage_endwall = 5; | |||
cage_height = | |||
cage_wall = | |||
cage_endwall = | |||
cage_base = 5; | cage_base = 5; | ||
wedge_hieght = 10; | |||
mesh_opening = | mesh_opening = 2 ; | ||
mesh_angle = 45; | mesh_angle = 45; | ||
mesh_spacing = | mesh_spacing = 4; | ||
mesh_width = 17; | |||
mesh_height = 10; | |||
difference() | |||
{ | |||
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false); | |||
translate([cage_wall, cage_endwall, cage_base]) | |||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false); | |||
translate([((tub_width-(spacing*3))/2)-cage_wall-((sin(mesh_angle)*sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2), cage_endwall-(mesh_spacing/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base]) | |||
{ | { | ||
for (h = [1 : mesh_height]) | |||
{ | { | ||
translate(h*[0,0,mesh_spacing]) | |||
{ | { | ||
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))]) | |||
{ | { | ||
rotate([0,90-mesh_angle,0]) | |||
{ | |||
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
translate(w*[0,mesh_spacing,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
//could put a scale command here to make opening a perfect square | |||
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(10/sin(90-mesh_angle)))], center=false); | |||
} | |||
} | |||
} | |||
//begin second row | |||
#for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)]) | |||
{ | |||
translate([mesh_spacing/2,mesh_spacing/2,-mesh_spacing/2]) | |||
{ | |||
translate(w*[0,mesh_spacing,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
//could put a scale command here to make opening a perfect square | |||
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(10/sin(90-mesh_angle)))], center=false); | |||
} | |||
} | |||
} | |||
} | |||
//end second row | |||
} | } | ||
} | } | ||
} | } | ||
/ | } | ||
} | |||
} | |||
echo(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))); | |||
echo((tub_length-(spacing*2))-(cage_endwall*2)); | |||
echo((((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2)); | |||
</nowiki> | |||
==cage lid== | |||
===cuts in lip=== | |||
updated 20150301 | |||
<nowiki> | |||
height = 90; | |||
tub_width = 46; | |||
tub_length = 70; | |||
basethickness = 5; | |||
tub_wall = 2; | |||
tub_outsidewall = 4; | |||
tubs_rows = 5; | |||
tubs_columns = 2; | |||
spacing = 1.940055; | |||
center_dividers = 00; //1 yes 0 no | |||
cage_height = 60; | |||
cage_wall = 8; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
mesh_opening = 1.5 ; | |||
mesh_angle = 52.5; | |||
mesh_spacing = 3.5; | |||
wire_count = 7; //number of wires into each cage | |||
// | wire_diameter = 2; | ||
wire_holeoffc = 0; | |||
cage_lid_cut = 0; //1 yes 0 no cavity in lid or not? | |||
cage_minicleat = 2; | |||
yn_cage_minicleat = 1; //1 yes 0 no | |||
yn_cage_cleat = 0; //1 yes 0 no | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
shrink_cage_lid = 0.5; | |||
base_chamfer_depth = 0.9; //max 1.0 | |||
base_wire_cone = 0.2; //diameter added to wire_diameter | |||
union() | |||
{ | |||
difference() | |||
{ | |||
union() | |||
{ | { | ||
translate([shrink_cage_lid/2,shrink_cage_lid/2,0]) | |||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))-shrink_cage_lid,((tub_length-(spacing*2))-(cage_endwall*2))-shrink_cage_lid,cage_lid_depthinto], center=false); | |||
} | |||
translate([-1,-1,cage_lid_depthinto]) | |||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false); | |||
} | |||
//spheres lock ins | |||
//1 | |||
translate([(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | |||
{ | |||
divot_sphere(); | |||
} | |||
//2 | |||
translate([(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | |||
{ | { | ||
divot_sphere(); | |||
} | } | ||
//3 | |||
// | translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))-(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | ||
{ | |||
mirror([1,0,0]) | |||
{ | |||
// | divot_sphere(); | ||
} | |||
} | |||
//4 | |||
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))-(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | |||
{ | |||
{ | mirror([1,0,0]) | ||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//end spheres | |||
//minicleats | |||
//1 | |||
translate([((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(2),cage_lid_depthinto+2]) | |||
{ | |||
for(w = [-(wire_count-1)/2 : (wire_count-1)/2]) | |||
{ | |||
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0]) | |||
{ | |||
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1); | |||
} | |||
} | } | ||
} | } | ||
//// | //2 | ||
translate([-((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(2),cage_lid_depthinto+2]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
for(w = [-(wire_count-1)/2 : (wire_count-1)/2]) | |||
{ | { | ||
translate([0, | translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0]) | ||
{ | { | ||
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1); | |||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
//end mini cleats | |||
} | |||
//end union begin difference | |||
translate([1,1,1]) | |||
{ | |||
if (cage_lid_cut==1) cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,cage_lid_depthinto+3], center=false); | |||
} | |||
//chamfer underside of lip | |||
translate([-2,-1,cage_lid_depthinto-1]) | |||
spacing | |||
cage_wall | |||
cage_endwall | |||
{ | { | ||
rotate([45,0,0]) | |||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | } | ||
} | |||
translate([ | translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,cage_lid_depthinto-1]) | ||
{ | { | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2, | rotate([45,0,0]) | ||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([-1,-2,cage_lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,cage_lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | } | ||
//chamfer | //end chamfer | ||
translate([-2,-1, | |||
//chamfer base | |||
translate([-2,base_chamfer_depth-1,-1]) | |||
{ | { | ||
rotate([45,0,0]) | rotate([45,0,0]) | ||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | #cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | ||
} | } | ||
} | } | ||
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1, | translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1-base_chamfer_depth,-1]) | ||
{ | { | ||
rotate([45,0,0]) | rotate([45,0,0]) | ||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | #cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | ||
} | } | ||
} | } | ||
translate([-1,-2, | translate([-1+base_chamfer_depth,-2,-1]) | ||
{ | { | ||
rotate([45,0,90]) | rotate([45,0,90]) | ||
{ | { | ||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | #cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | ||
} | } | ||
} | } | ||
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2, | translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1-base_chamfer_depth,-2,-1]) | ||
{ | { | ||
rotate([45,0,90]) | rotate([45,0,90]) | ||
{ | { | ||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | #cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | ||
} | } | ||
} | } | ||
//end chamfer | //end chamfer | ||
//begin wire | |||
translate([ | //begin wire holes | ||
translate([-1,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2),cage_lid_depthinto]) | |||
{ | { | ||
} | for(w = [-(wire_count-1)/2 : (wire_count-1)/2]) | ||
//end wire | { | ||
//end difference | translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0]) | ||
{ | |||
rotate([0,0,45]) | |||
{ | |||
#cube(size=[sqrt(2),sqrt(2),3]); | |||
} | |||
} | |||
} | |||
} | |||
//end wire holes | |||
//end difference | |||
} | } | ||
//begin union | //begin union | ||
| Line 1,150: | Line 1,329: | ||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)-(wire_diameter*1.5)-1+wire_holeoffc,0]) | translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)-(wire_diameter*1.5)-1+wire_holeoffc,0]) | ||
{ | { | ||
if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2); | |||
} | } | ||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)+(wire_diameter*1.5)+1+wire_holeoffc,0]) | translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)+(wire_diameter*1.5)+1+wire_holeoffc,0]) | ||
| Line 1,156: | Line 1,335: | ||
mirror([0,1,0]) | mirror([0,1,0]) | ||
{ | { | ||
cleat(2, | if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2); | ||
} | } | ||
} | } | ||
| Line 1,168: | Line 1,347: | ||
difference() | difference() | ||
{ | { | ||
translate([( | translate([(cage_divot_height/2)/sin(45)*sin(45),0,0]) | ||
{ | { | ||
sphere(r = ( | sphere(r = (cage_divot_height/2)/sin(45)); | ||
} | } | ||
translate([( | translate([(cage_divot_height/2)/sin(45),0,0]) | ||
cube(size = [(( | cube(size = [((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2)], center=true); | ||
} | } | ||
} | } | ||
| Line 1,198: | Line 1,377: | ||
} | } | ||
} | } | ||
//end cleat | |||
</nowiki> | //mini_cleat module | ||
module mini_cleat(sides,height) | |||
{ | |||
=== | union() | ||
{ | |||
#cube(size = [sides,sides,height]); | |||
translate([0,0,height]) | |||
{ | |||
polyhedron | |||
(points = [ [0,0,0],[sides,0,0],[sides,sides,0],[0,sides,0], | |||
[sides,0,sides],[sides*2,0,sides],[sides*2,sides,sides],[sides,sides,sides] | |||
], | |||
faces = [ [0,1,2],[0,2,3], // | |||
[0,5,1],[0,4,5], // | |||
[1,5,6],[1,6,2], | |||
[2,6,7],[2,7,3], | |||
[3,7,4],[3,4,0], | |||
[4,7,6],[4,6,5] | |||
] | |||
); | |||
} | |||
} | |||
} | |||
//end mini cleat module | |||
</nowiki> | |||
===no cavity with multiple cleats=== | |||
<nowiki> | <nowiki> | ||
height = | height = 90; | ||
tub_width = | tub_width = 36; | ||
tub_length = 70; | tub_length = 70; | ||
basethickness = 5; | basethickness = 5; | ||
tub_wall = 5; | tub_wall = 2; | ||
tub_outsidewall = 4; | |||
tubs_rows = 5; | |||
tubs_columns = 2; | |||
spacing = | spacing = 1.940055; | ||
center_dividers = 00; //1 yes 0 no | |||
cage_height = 60; | cage_height = 60; | ||
cage_wall = | cage_wall = 5.5; | ||
cage_endwall = 2; | cage_endwall = 2; | ||
cage_base = 5; | cage_base = 5; | ||
mesh_opening = 1 ; | mesh_opening = 1.5 ; | ||
mesh_angle = 45; | mesh_angle = 45; | ||
mesh_spacing = | mesh_spacing = 3.5; | ||
wire_diameter = 2; | wire_count = 7; //number of wires into each cage | ||
wire_diameter = 0.8; | |||
wire_holeoffc = 0; | |||
cage_lid_cut = 0; //1 yes 0 no cavity in lid or not? | |||
cage_minicleat = 2; | |||
yn_cage_minicleat = 1; //1 yes 0 no | |||
yn_cage_cleat = 0; //1 yes 0 no | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
union() | union() | ||
{ | { | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2), | difference() | ||
{ | |||
translate([-1,-1, | union() | ||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false); | cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_lid_depthinto], center=false); | ||
} | translate([-1,-1,cage_lid_depthinto]) | ||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false); | |||
} | |||
//spheres lock ins | //spheres lock ins | ||
//1 | |||
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | |||
{ | |||
divot_sphere(); | |||
} | |||
//2 | |||
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | |||
{ | |||
divot_sphere(); | |||
} | |||
//3 | |||
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//4 | |||
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//end spheres | |||
//minicleats | |||
// | //1 | ||
translate([((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(wire_diameter/2),cage_lid_depthinto+2]) | |||
{ | |||
for(w = [-(wire_count-1)/2 : (wire_count-1)/2]) | |||
{ | |||
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0]) | |||
{ | |||
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1); | |||
} | |||
} | |||
} | } | ||
// | |||
translate([1,1, | //2 | ||
translate([-((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(wire_diameter/2),cage_lid_depthinto+2]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | { | ||
for(w = [-(wire_count-1)/2 : (wire_count-1)/2]) | |||
{ | |||
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0]) | |||
{ | |||
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1); | |||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
spacing = | //end mini cleats | ||
cage_wall = | |||
cage_endwall = 2; | } | ||
//end union begin difference | |||
translate([1,1,1]) | |||
{ | |||
if (cage_lid_cut==1) cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,cage_lid_depthinto+3], center=false); | |||
} | |||
//chamfer underside of lip | |||
translate([-2,-1,cage_lid_depthinto-1]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,cage_lid_depthinto-1]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([-1,-2,cage_lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,cage_lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
//end chamfer | |||
//begin wire holes | |||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2),-1]) | |||
{ | |||
for(w = [-(wire_count-1)/2 : (wire_count-1)/2]) | |||
{ | |||
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0]) | |||
{ | |||
#cylinder(r = wire_diameter/2, h = cage_lid_depthinto+2+2); | |||
} | |||
} | |||
difference() | } | ||
//end wire holes | |||
//end difference | |||
} | |||
//begin union | |||
//cleat | |||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)-(wire_diameter*1.5)-1+wire_holeoffc,0]) | |||
{ | |||
if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2); | |||
} | |||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)+(wire_diameter*1.5)+1+wire_holeoffc,0]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2); | |||
} | |||
} | |||
//end cleat | |||
} | |||
//divot | |||
module divot_sphere() | |||
{ | { | ||
difference() | |||
{ | { | ||
translate([(cage_divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | { | ||
sphere(r = (cage_divot_height/2)/sin(45)); | |||
} | |||
translate([(cage_divot_height/2)/sin(45),0,0]) | |||
cube(size = [((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2)], center=true); | |||
} | } | ||
} | } | ||
// | |||
translate([0,(( | ////cleat module | ||
{ | module cleat(size,height) | ||
{ | |||
translate([0,0,-size]) | |||
{ | |||
difference() | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [size,size,height/sin(45)], center=false); | |||
} | |||
} | |||
translate([-size*3/2,-size*3/2,0]) | |||
{ | |||
#cube(size = [size*3,size*3,size],center=false); | |||
} | |||
} | |||
} | |||
} | } | ||
// | //end cleat | ||
//mini_cleat module | |||
module mini_cleat(sides,height) | |||
{ | { | ||
union() | |||
{ | { | ||
#cube(size = [sides,sides,height]); | |||
translate([0,0,height]) | |||
translate([ | |||
{ | { | ||
polyhedron | |||
(points = [ [0,0,0],[sides,0,0],[sides,sides,0],[0,sides,0], | |||
[sides,0,sides],[sides*2,0,sides],[sides*2,sides,sides],[sides,sides,sides] | |||
], | |||
faces = [ [0,1,2],[0,2,3], // | |||
[0,5,1],[0,4,5], // | |||
[1,5,6],[1,6,2], | |||
[2,6,7],[2,7,3], | |||
[3,7,4],[3,4,0], | |||
[4,7,6],[4,6,5] | |||
] | |||
); | |||
} | } | ||
} | } | ||
} | } | ||
//end mini cleat module | |||
</nowiki> | |||
===small lip with divots and cleat=== | |||
<nowiki> | |||
height = 80; | |||
tub_width = 65; | |||
tub_length = 70; | |||
outsidewall = 5; | |||
basethickness = 5; | |||
tub_wall = 5; | |||
spacing = 5; | |||
cage_height = 60; | |||
cage_wall = 7.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
wedge_hieght = 10; | |||
spacing = 5; | |||
cage_height = 60; | |||
cage_wall = 7.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
wedge_hieght = 10; | |||
mesh_opening = 1 ; | mesh_opening = 1 ; | ||
| Line 1,420: | Line 1,673: | ||
wire_diameter = 2; | wire_diameter = 2; | ||
wire_holeoffc = 0; | |||
lid_depthinto = 7; | |||
divot_height = 5.5; | |||
union() | union() | ||
{ | { | ||
difference() | difference() | ||
{ | { | ||
union() | |||
{ | |||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),lid_depthinto], center=false); | |||
translate([-1,-1,lid_depthinto]) | |||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false); | |||
} | |||
//spheres lock ins | |||
//1 | |||
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | |||
{ | |||
divot_sphere(); | |||
} | |||
//2 | |||
// | translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | ||
{ | |||
divot_sphere(); | |||
} | |||
// | //3 | ||
translate([((tub_width-(spacing*3))/2) | translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | ||
{ | |||
mirror([1,0,0]) | |||
{ | |||
} | divot_sphere(); | ||
// | } | ||
} | |||
//4 | |||
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//end spheres | |||
} | } | ||
//end union begin difference | |||
translate([1,1,1]) | |||
// | { | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,lid_depthinto+3], center=false); | |||
} | |||
//chamfer underside of lip | |||
translate([-2,-1,lid_depthinto-1]) | |||
{ | { | ||
rotate([45,0,0]) | |||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | } | ||
} | |||
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,lid_depthinto-1]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | } | ||
} | } | ||
translate([-1,-2,lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
//end chamfer | |||
//begin wire hole | |||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2),-1]) | |||
{ | |||
cylinder(r = wire_diameter/2, h = 3); | |||
} | |||
//end wire hole | |||
//end difference | |||
} | } | ||
//begin union | |||
//cleat | |||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)-(wire_diameter*1.5)-1+wire_holeoffc,0]) | |||
{ | |||
cleat(2,lid_depthinto+2); | |||
} | |||
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)+(wire_diameter*1.5)+1+wire_holeoffc,0]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
cleat(2,lid_depthinto+2); | |||
} | |||
} | |||
//end cleat | |||
} | |||
//divot | |||
module divot_sphere() | |||
{ | |||
difference() | difference() | ||
{ | |||
translate([(divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (divot_height/2)/sin(45)); | |||
} | |||
translate([(divot_height/2)/sin(45),0,0]) | |||
cube(size = [((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2)], center=true); | |||
} | |||
} | |||
////cleat module | |||
module cleat(size,height) | |||
{ | |||
translate([0,0,-size]) | |||
{ | |||
difference() | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [size,size,height/sin(45)], center=false); | |||
} | |||
} | |||
translate([-size*3/2,-size*3/2,0]) | |||
{ | |||
#cube(size = [size*3,size*3,size],center=false); | |||
} | |||
} | |||
} | |||
} | |||
</nowiki> | |||
===chamfered small lip=== | |||
=== | |||
<nowiki> | <nowiki> | ||
height = 80; | height = 80; | ||
tub_width = 65; | tub_width = 65; | ||
tub_length = | tub_length = 70; | ||
outsidewall = 5; | outsidewall = 5; | ||
basethickness = 5; | basethickness = 5; | ||
| Line 1,554: | Line 1,837: | ||
wedge_hieght = 10; | wedge_hieght = 10; | ||
mesh_opening = 1 | mesh_opening = 1 ; | ||
mesh_angle = 45; | mesh_angle = 45; | ||
mesh_spacing = | mesh_spacing = 2.5; | ||
wire_diameter = 2; | wire_diameter = 2; | ||
lid_depthinto = 4; | |||
lid_depthinto = | |||
difference() | |||
{ | |||
union() | union() | ||
{ | { | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),lid_depthinto], center=false); | |||
translate([-1,-1,lid_depthinto]) | |||
translate([ | |||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false); | |||
} | |||
//spheres lock ins | |||
//end spheres | |||
} | } | ||
// | //end union begin difference | ||
translate([ | translate([1,1,1]) | ||
{ | { | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,lid_depthinto+3], center=false); | |||
} | } | ||
// | //chamfer underside of lip | ||
translate([ | translate([-2,-1,lid_depthinto-1]) | ||
{ | { | ||
rotate([45,0,0]) | |||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | } | ||
} | } | ||
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,lid_depthinto-1]) | |||
translate([ | |||
{ | { | ||
rotate([45,0,0]) | |||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | } | ||
translate([-1,-2,lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | } | ||
} | } | ||
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,lid_depthinto-1]) | |||
translate([ | { | ||
rotate([45,0,90]) | |||
{ | { | ||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
} | } | ||
</nowiki> | |||
===chamfered small lip with divots=== | |||
<nowiki> | |||
height = 80; | |||
tub_width = 65; | |||
tub_length = 70; | |||
outsidewall = 5; | |||
basethickness = 5; | |||
tub_wall = 5; | |||
spacing = 5; | |||
cage_height = 60; | |||
cage_wall = 7.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
wedge_hieght = 10; | |||
mesh_opening = 1 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 2.5; | |||
wire_diameter = 2; | |||
lid_depthinto = 7; | |||
divot_height = 5.5; | |||
difference() | difference() | ||
{ | { | ||
union() | |||
{ | { | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),lid_depthinto], center=false); | |||
translate([-1,-1,lid_depthinto]) | |||
{ | |||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false); | |||
} | } | ||
translate([(spacing/( | //spheres lock ins | ||
//1 | |||
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | |||
{ | { | ||
divot_sphere(); | |||
} | } | ||
//2 | |||
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | |||
{ | |||
divot_sphere(); | |||
} | } | ||
//3 | |||
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | } | ||
// | } | ||
//4 | |||
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)]) | |||
{ | { | ||
mirror([1,0,0]) | |||
{ | { | ||
divot_sphere(); | |||
} | |||
} | |||
//end spheres | |||
} | |||
//end union begin difference | |||
translate([1,1,1]) | |||
{ | { | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,lid_depthinto+3], center=false); | |||
} | |||
//chamfer underside of lip | |||
translate([-2,-1,lid_depthinto-1]) | |||
{ | { | ||
rotate([45,0,0]) | |||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | } | ||
} | } | ||
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,lid_depthinto-1]) | |||
translate([ | |||
{ | { | ||
rotate([0,0 | rotate([45,0,0]) | ||
{ | { | ||
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([-1,-2,lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | |||
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,lid_depthinto-1]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false); | |||
} | |||
} | } | ||
} | } | ||
//divot | |||
module divot_sphere() | |||
{ | |||
difference() | |||
{ | |||
translate([(divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (divot_height/2)/sin(45)); | |||
} | } | ||
translate([(divot_height/2)/sin(45),0,0]) | |||
cube(size = [((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2)], center=true); | |||
} | } | ||
} | |||
</nowiki> | </nowiki> | ||
=== | ===big lip with cleat=== | ||
<nowiki> | <nowiki> | ||
height = | |||
tub_width = | height = 80; | ||
tub_width = 65; | |||
tub_length = 70; | tub_length = 70; | ||
outsidewall = 5; | |||
basethickness = 5; | basethickness = 5; | ||
tub_wall = | tub_wall = 5; | ||
spacing = 5; | |||
spacing = | |||
cage_height = 60; | cage_height = 60; | ||
cage_wall = | cage_wall = 7.5; | ||
cage_endwall = 2; | cage_endwall = 2; | ||
cage_base = 5; | cage_base = 5; | ||
wedge_hieght = 10; | |||
mesh_opening = 1 | mesh_opening = 1 ; | ||
mesh_angle = 45; | mesh_angle = 45; | ||
mesh_spacing = | mesh_spacing = 2.5; | ||
wire_diameter = 2; | wire_diameter = 2; | ||
union() | |||
{ | |||
difference() | difference() | ||
{ | { | ||
union() | union() | ||
{ | |||
//lip | |||
// | cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),2], center=false); | ||
translate([cage_wall, cage_endwall, 2]) | |||
{ | { | ||
translate([ | //insert | ||
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),2], center=false); | |||
} | |||
} | |||
translate([((tub_width-(spacing*3))/2)/2,cage_endwall+2,-3]) | |||
{ | |||
rotate([45,0,90]) | |||
{ | |||
//cavity for wire exit and cleat | |||
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))-4,(sin(45)*6),(sin(45)*6)], center=false); | |||
} | } | ||
} | |||
//hole for wire | |||
translate([((tub_width-(spacing*3))/2)/2,(tub_length-(spacing*2))/2,-1]) | |||
// | |||
translate([- | |||
{ | { | ||
cylinder(h = 6, r=wire_diameter/2); | |||
} | } | ||
} | |||
//cleats | |||
// | translate([(((tub_width-(spacing*3))/2)/2)-0,((tub_length-(spacing*2))/2)-(wire_diameter*1.5)-3,1.75]) | ||
{ | |||
mirror([0,0,1]) | |||
{ | { | ||
cleat(); | |||
} | } | ||
} | } | ||
//2 | |||
translate([(((tub_width-(spacing*3))/2)/2)-0,((tub_length-(spacing*2))/2)+(wire_diameter*1.5)+3,1.75]) | |||
{ | { | ||
mirror([0,0,1]) | |||
{ | { | ||
mirror([0,1,0]) | |||
{ | { | ||
cleat(); | |||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
////cleat module | |||
module cleat() | |||
{ | |||
difference() | |||
{ | |||
cube(size=[2,8,3.5], center=true); | |||
translate([-0.8,-2,-0.5]) | |||
{ | |||
rotate([0,-20,15]) | |||
{ | |||
cube(size=[2,15,5], center=true); | |||
} | |||
} | |||
translate([0.8,-2,-0.5]) | |||
{ | |||
rotate([0,20,-15]) | |||
{ | |||
cube(size=[2,15,5], center=true); | |||
} | |||
} | |||
translate([-1.5,4.5,-1]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size = [3,4,6]); | |||
} | |||
} | |||
} | |||
} | |||
/ | </nowiki> | ||
==tub== | |||
===single cell tub=== | |||
<nowiki> | |||
height = 60; | |||
oa_width = 80; | |||
oa_length = 105; | |||
outsidewall = 5; | |||
basethickness = 5; | |||
membranethickness = 5; | |||
tub_wall = 5; | |||
spacing = 5; | |||
cage_height = 40; | |||
cage_wall = 10; | |||
cage_base = 5; | |||
difference() | |||
{ | |||
cube(size = [oa_width, oa_length, height], center=false); | |||
translate([outsidewall,outsidewall,basethickness]) | |||
cube(size = [oa_width-(outsidewall*2), oa_length-(outsidewall*2), height-basethickness], center=false); | |||
} | |||
</nowiki> | |||
===tub with sphere divot=== | |||
*incomplete | |||
*spacer is versine | |||
<nowiki> | |||
height = 80; | |||
tub_width = 65; | |||
tub_length = 90; | |||
outsidewall = 5; | |||
basethickness = 5; | |||
tub_wall = 5; | |||
spacing = 5; | |||
cage_height = 60; | |||
cage_wall = 7.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
wedge_hieght = 10; | |||
mesh_opening = 1.5 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 3.5; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
lid_depthinto = 7; | |||
divot_height = 5.5; | |||
union() | |||
{ | { | ||
//outerwalls | |||
difference() | |||
{ | |||
cube(size = [tub_width, tub_length, height], center=false); | |||
translate([outsidewall,outsidewall,basethickness]) | |||
{ | |||
cube(size = [tub_width-(outsidewall*2), tub_length-(outsidewall*2), height-basethickness+1], center=false); | |||
} | |||
} | |||
//end walls | |||
//begin supports | |||
//1 | |||
translate([(tub_width/2)-((spacing-1)/2),tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(10)]) | |||
{ | |||
divider(); | |||
} | |||
//2 | |||
translate([(tub_width/2)-((spacing-1)/2),tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)]) | |||
{ | |||
divider(); | |||
} | } | ||
//3 | //3 | ||
translate([ | translate([(tub_width/2)-((spacing-1)/2),tub_wall+(tub_length-(outsidewall*2)),height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(10)]) | ||
{ | { | ||
mirror([0,1,0]) | mirror([0,1,0]) | ||
{ | { | ||
divider(); | |||
} | } | ||
} | } | ||
//4 | //4 | ||
translate([ | translate([(tub_width/2)-((spacing-1)/2),tub_wall+(tub_length-(outsidewall*2)),height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)]) | ||
{ | { | ||
mirror([0,1,0]) | mirror([0,1,0]) | ||
{ | { | ||
divider(); | |||
} | } | ||
} | } | ||
// | //end supports | ||
} | } | ||
translate([5,-20,0]) | |||
translate([ | |||
{ | { | ||
tub_spacerdivot(); | |||
} | } | ||
// | //divider modules | ||
module divider() | |||
translate([ | { | ||
difference() | |||
{ | |||
union() | |||
{ | |||
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]); | |||
translate([0,0,(spacing+cage_endwall+2)*2]) | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]); | |||
} | |||
} | |||
} | |||
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]); | |||
} | |||
} | |||
} | |||
} | |||
//end divider module | |||
//////tub divot | |||
module tub_spacerdivot() | |||
{ | |||
difference() | |||
{ | { | ||
translate([(spacing/(1-cos(45)))*sin(45),0,0]) | |||
{ | { | ||
sphere(r = (spacing/(1-cos(45)))); | |||
} | } | ||
translate([(spacing/(1-cos(45))),0,0]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true); | |||
} | } | ||
} | } | ||
} | } | ||
// | ////end tub divot module | ||
// | |||
translate([( | echo(spacing/(1-cos(45))); | ||
</nowiki> | |||
===grooves module=== | |||
<nowiki> | |||
width=10; | |||
height = 92; | |||
tub_wallgroove = 1.5; | |||
wall_length = 115; | |||
////groove module | |||
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift) | |||
{ | |||
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2]) | |||
{ | { | ||
intersection() | |||
{ | { | ||
intersection() | |||
{ | { | ||
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)]) | |||
{ | { | ||
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift]) | |||
} | { | ||
} | rotate([0,45,0]) | ||
{ | |||
//end | rotate([0,0,45]) | ||
{ | |||
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true); | |||
} | |||
} | |||
} | |||
} | |||
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2]) | |||
{ | |||
#cube(size = [groove_length,tub_wallgroove,groove_height]); | |||
} | |||
} | |||
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | |||
} | |||
} | |||
}//end intersection | |||
} | } | ||
} | } | ||
////end | ////end groove mdoule | ||
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),height,tub_wallgrooveshift); | |||
/ | </nowiki> | ||
===groove module with angle=== | |||
*still buggy | |||
<nowiki> | |||
height = 90; | |||
tub_width = 36; | |||
tub_length = 70; | |||
basethickness = 5; | |||
tub_wall = 2; | |||
tub_outsidewall = 4; | |||
tub_wallgroovedepth = 1.5; | |||
tub_wallgroovewidth = 10; | |||
tub_wallgroovecorners = 4; | |||
grooves_yn = 1; //1 yes 0 no | |||
eyelets_rowside = 2; | |||
eyelets_columnside = 3; | |||
eyelets_belowtop = 10; | |||
eyelets_walltoceneter = 5; | |||
eyelets_od = 7; | |||
eyelets_id = 3; | |||
eyelets_width = 5; | |||
tubs_rows = 4; | |||
tubs_columns = 2; | |||
spacing = 1.940055; | |||
wall_spacers_yn = 0; //1 yes 0 no | |||
center_dividers = 0; //1 yes 0 no | |||
cage_height = 60; | |||
cage_wall = 5.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
mesh_opening = 1.5 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 3.5; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
////groove module | |||
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift,groove_angle) | |||
{ | { | ||
translate([(g*groove_width*2)+(groove_width*sin(45)* | translate([((cos(groove_angle)*((groove_height/cos(groove_angle))+((groove_width*tan(groove_angle))))))-height/2,-.0001,height/2]) //problem here | ||
{ | |||
intersection() | |||
{ | |||
intersection() | |||
{ | |||
for(g = [(-(tan(groove_angle)*((groove_height/tan(groove_angle))+((groove_width*sin(groove_angle)*sin(groove_angle))*tan(groove_angle))))/groove_width/2) : (groove_length/groove_width/2)]) //got a problem here | |||
{ | |||
translate([(g*groove_width*2)+(groove_width*sin(45)*cos(groove_angle)),0,groove_shift]) | |||
{ | { | ||
rotate([0, | rotate([0,groove_angle,0]) | ||
{ | { | ||
rotate([0,0,45]) | rotate([0,0,45]) | ||
{ | { | ||
#cube(size = [groove_width* | #cube(size = [groove_width*cos(groove_angle)*cos(45),groove_width*cos(groove_angle)*cos(45),(groove_height/cos(groove_angle))+(sin(groove_angle)*groove_width)+(abs(groove_shift/cos(groove_angle)*2))], center=true); | ||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
translate([(-groove_height/2)-(groove_width*sin( | translate([(-groove_height/2)-(groove_width*sin(groove_angle)*sin(groove_angle)),0,-groove_height/2]) | ||
{ | { | ||
#cube(size = [groove_length,tub_wallgroove,groove_height]); | #cube(size = [groove_length,tub_wallgroove,groove_height]); | ||
} | } | ||
} | } | ||
translate([((-groove_height/2)-(groove_width*sin( | translate([((-groove_height/2)-(groove_width*sin(groove_angle)*sin(groove_angle)))+(groove_length/2),0,0]) | ||
{ | { | ||
rotate([0,0,45]) | rotate([0,0,45]) | ||
{ | { | ||
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | |||
} | } | ||
} | } | ||
| Line 2,109: | Line 2,421: | ||
////end groove mdoule | ////end groove mdoule | ||
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),height,0,45); | |||
cube(10); | |||
</nowiki> | |||
===groove module with angle - rework=== | |||
*need to tweak so variable angle shifts top edge not bottom | |||
<nowiki> | <nowiki> | ||
| Line 2,149: | Line 2,439: | ||
tub_outsidewall = 4; | tub_outsidewall = 4; | ||
tub_wallgroovedepth = 1.5; | tub_wallgroovedepth = 1.5; | ||
tub_wallgroovewidth = | tub_wallgroovewidth = 10; | ||
tub_wallgroovecorners =4; | tub_wallgroovecorners = 4; | ||
grooves_yn = 1; //1 yes 0 no | grooves_yn = 1; //1 yes 0 no | ||
| Line 2,184: | Line 2,474: | ||
tub_divot_height = 5.5; | tub_divot_height = 5.5; | ||
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift,groove_angle) | |||
intersection() | |||
{ | |||
for(g = [0 : 2+((groove_length/groove_width)+((tan(groove_angle)*groove_height)/groove_width))/2]) | |||
{ | { | ||
translate([(g*groove_width*2),0,groove_shift]) | |||
{ | |||
translate([(sin(groove_angle)*(-((groove_height/cos(groove_angle))+(sin(groove_angle)*groove_width)+(abs(groove_shift/cos(groove_angle)*2)))/2))-((groove_width*cos(groove_angle)*cos(45))*sin(45)*cos(groove_angle)),0,groove_height/2]) | |||
{ | { | ||
rotate([0,groove_angle,0]) | |||
{ | { | ||
rotate([0,0,45]) | |||
{ | { | ||
cube(size = [((( | #cube(size = [groove_width*cos(groove_angle)*cos(45),groove_width*cos(groove_angle)*cos(45),(groove_height/cos(groove_angle))+(sin(groove_angle)*groove_width)+(abs(groove_shift/cos(groove_angle)*2))], center=true); | ||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
} | |||
#cube(size = [groove_length,tub_wallgroove,groove_height]); | |||
translate([groove_length/2,0,groove_height/2]) | |||
{ | { | ||
rotate([0,0,45]) | |||
{ | { | ||
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | |||
} | } | ||
} | } | ||
}//end module | |||
} //end | |||
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),height,0,45); | |||
cube(10); | |||
</nowiki> | |||
===tub with grooves=== | |||
<nowiki> | |||
height = 90; | |||
tub_width = 36; | |||
tub_length = 70; | |||
basethickness = 5; | |||
tub_wall = 2; | |||
tub_outsidewall = 4; | |||
tub_wallgroovedepth = 1.5; | |||
tub_wallgroovewidth = 15; | |||
tub_wallgroovecorners =4; | |||
grooves_yn = 1; //1 yes 0 no | |||
// | |||
tubs_rows = 2; | |||
tubs_columns = 2; | |||
spacing = 1.940055; | |||
wall_spacers_yn = 0; //1 yes 0 no | |||
center_dividers = 0; //1 yes 0 no | |||
cage_height = 60; | |||
cage_wall = 5.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
mesh_opening = 1.5 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 3.5; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
difference() | |||
{ | { | ||
union() | union() | ||
{ | { | ||
// | |||
//tubs | |||
for (c = [0 : tubs_columns-1]) | |||
{ | |||
translate([0,c*(tub_length+tub_wall),0]) | |||
{ | |||
for (r = [0 : tubs_rows-1]) | |||
{ | { | ||
translate([r*(tub_width+tub_wall),0,0]) | |||
{ | |||
tub(); | |||
} | |||
} | } | ||
} | |||
//end | } | ||
//end tubs | |||
// | //outer walls | ||
translate([-tub_outsidewall+tub_wall,-tub_outsidewall+tub_wall,0]) | |||
{ | |||
difference() | |||
{ | |||
cube(size = [((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall,height]); | |||
translate([tub_outsidewall,tub_outsidewall,0]) | |||
{ | |||
#cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]); | |||
} | |||
} | |||
} | |||
//end outer walls | |||
} //end union | |||
////grooves | |||
//1 | //1 | ||
rotate([0,0,0]) | |||
{ | |||
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height); | |||
} | |||
} | |||
//2 | //2 | ||
rotate([0,0,90]) | |||
{ | |||
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0]) | |||
{ | |||
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height); | |||
} | |||
} | |||
//3 | //3 | ||
rotate([0,0,180]) | |||
{ | |||
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0]) | |||
{ | |||
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height); | |||
} | |||
} | |||
//4 | //4 | ||
rotate([0,0,270]) | |||
{ | |||
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0]) | |||
{ | |||
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height); | |||
} | |||
} | |||
// | |||
translate([( | ////end grooves | ||
} //end difference | |||
//////end render | |||
//////begin modules | |||
////tub module | |||
module tub() | |||
{ | |||
union() | |||
{ | |||
//walls | |||
difference() | |||
{ | |||
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false); | |||
translate([tub_wall,tub_wall,basethickness]) | |||
{ | |||
cube(size = [tub_width, tub_length, height-basethickness+1], center=false); | |||
} | |||
} | |||
//end walls | |||
//spheres lock ins | |||
//1 | |||
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | { | ||
mirror([0 | mirror([1,0,0]) | ||
{ | { | ||
#divot_sphere(); | |||
} | } | ||
} | } | ||
//6 | //2 | ||
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | ||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//3 | |||
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//4 | |||
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//5 | |||
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
} | |||
//6 | |||
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | { | ||
mirror([0,0,0]) | mirror([0,0,0]) | ||
| Line 2,556: | Line 2,888: | ||
rotate([0,0,45]) | rotate([0,0,45]) | ||
{ | { | ||
cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),(groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))], center=true); | #cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),(groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))], center=true); | ||
} | } | ||
} | } | ||
| Line 2,563: | Line 2,895: | ||
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2]) | translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2]) | ||
{ | { | ||
cube(size = [groove_length,tub_wallgroove,groove_height]); | #cube(size = [groove_length,tub_wallgroove,groove_height]); | ||
} | } | ||
} | } | ||
| Line 2,570: | Line 2,902: | ||
rotate([0,0,45]) | rotate([0,0,45]) | ||
{ | { | ||
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | #cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | ||
} | } | ||
} | } | ||
| Line 2,579: | Line 2,911: | ||
////end groove mdoule | ////end groove mdoule | ||
//// | ////calculations | ||
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto); | |||
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area z",height); | |||
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2)); | |||
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2)); | |||
echo("cage cavity z",cage_height-cage_base); | |||
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3"); | |||
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10 | |||
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams"); | |||
</nowiki> | |||
===tub with grooves and eyelets=== | |||
<nowiki> | |||
height = 90; | |||
tub_width = 36; | |||
tub_length = 70; | |||
basethickness = 5; | |||
tub_wall = 2; | |||
tub_outsidewall = 4; | |||
tub_wallgroovedepth = 1.5; | |||
tub_wallgroovewidth = 15; | |||
tub_wallgroovecorners =4; | |||
grooves_yn = 1; //1 yes 0 no | |||
eyelets_rowside = 2; | |||
eyelets_columnside = 3; | |||
eyelets_belowtop = 10; | |||
eyelets_walltoceneter = 5; | |||
eyelets_od = 7; | |||
eyelets_id = 3; | |||
eyelets_width = 5; | |||
tubs_rows = 4; | |||
tubs_columns = 2; | |||
spacing = 1.940055; | |||
wall_spacers_yn = 0; //1 yes 0 no | |||
center_dividers = 0; //1 yes 0 no | |||
cage_height = 60; | |||
cage_wall = 5.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
mesh_opening = 1.5 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 3.5; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
union()//eyelets | |||
{ | |||
difference()//grooves | |||
{ | |||
union() | |||
{ | |||
//tubs | |||
for (c = [0 : tubs_columns-1]) | |||
{ | |||
translate([0,c*(tub_length+tub_wall),0]) | |||
{ | |||
for (r = [0 : tubs_rows-1]) | |||
{ | |||
translate([r*(tub_width+tub_wall),0,0]) | |||
{ | |||
tub(); | |||
} | |||
} | |||
} | |||
} | |||
//end tubs | |||
//outer walls | |||
translate([-tub_outsidewall+tub_wall,-tub_outsidewall+tub_wall,0]) | |||
== | { | ||
difference() | |||
{ | |||
cube(size = [((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall,height]); | |||
translate([tub_outsidewall,tub_outsidewall,0]) | |||
{ | |||
cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]); | |||
} | |||
} | |||
} | |||
//end outer walls | |||
} //end union | |||
////grooves | |||
//1 | |||
rotate([0,0,0]) | |||
{ | |||
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,0); | |||
} | |||
} | |||
//2 | |||
rotate([0,0,90]) | |||
{ | |||
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
} | |||
} | |||
//3 | |||
rotate([0,0,180]) | |||
{ | |||
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))))); | |||
} | |||
} | |||
//4 | |||
rotate([0,0,270]) | |||
{ | |||
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0]) | |||
{ | { | ||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,0); | |||
} | |||
} | |||
translate([- | ////end grooves | ||
} //end difference | |||
//begin eyelets | |||
//1 rowside | |||
translate([(tub_wall-tub_outsidewall),(tub_wall-tub_outsidewall)-eyelets_walltoceneter,height-eyelets_belowtop]) | |||
{ | |||
for (e = [1:eyelets_rowside]) | |||
{ | { | ||
difference() | translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0]) | ||
{ | { | ||
rotate([0,0,180]) | |||
{ | |||
eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2)); | |||
} | |||
} | |||
} | |||
} | |||
//2 | |||
//3 | |||
translate([(tub_wall-tub_outsidewall),((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2),height-eyelets_belowtop]) | |||
{ | |||
for (e = [1:eyelets_rowside]) | |||
{ | |||
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0]) | |||
{ | |||
rotate([0,0,0]) | |||
{ | |||
#eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2)); | |||
} | |||
} | |||
} | |||
} | |||
//4 | |||
//end eyelets | |||
} //end union | |||
//////end render | |||
//////begin modules | |||
////tub module | |||
module tub() | |||
{ | |||
union() | |||
{ | |||
//walls | |||
difference() | |||
{ | |||
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false); | |||
translate([tub_wall,tub_wall,basethickness]) | |||
{ | |||
cube(size = [tub_width, tub_length, height-basethickness+1], center=false); | |||
} | |||
} | |||
//end walls | |||
//spheres lock ins | |||
//1 | |||
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
//2 | |||
translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//3 | |||
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//4 | |||
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//5 | |||
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
} | |||
//6 | |||
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
} | |||
//end spheres | |||
//begin spacers | |||
//1 | |||
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_wall,cage_height*4/5]) | |||
{ | |||
if (center_dividers==1) divider(); | |||
} | |||
//2 | |||
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)]) | |||
{ | |||
if (center_dividers==1) divider(); | |||
} | |||
//3 | |||
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_length+tub_wall,cage_height*4/5]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
if (center_dividers==1) divider(); | |||
} | |||
} | |||
//4 | |||
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_length+tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
if (center_dividers==1) divider(); | |||
} | |||
} | |||
//the end_wall's side spacers | |||
//s1 | |||
translate([(tub_width+(tub_wall*2))*1/4,tub_wall,(cage_height/2)+basethickness]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
if (wall_spacers_yn==1) tub_spacer(8); | |||
} | |||
} | |||
//s2 | |||
translate([(tub_width+(tub_wall*2))*3/4,tub_wall,(cage_height/2)+basethickness]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
if (wall_spacers_yn==1) tub_spacer(8); | |||
} | |||
} | |||
//s3 | |||
translate([(tub_width+(tub_wall*2))*1/4,tub_wall+tub_length,(cage_height/2)+basethickness]) | |||
{ | |||
rotate([0,0,270]) | |||
{ | |||
if (wall_spacers_yn==1) tub_spacer(8); | |||
} | |||
} | |||
//s4 | |||
translate([(tub_width+(tub_wall*2))*3/4,tub_wall+tub_length,(cage_height/2)+basethickness]) | |||
{ | |||
rotate([0,0,270]) | |||
{ | |||
if (wall_spacers_yn==1) tub_spacer(8); | |||
} | |||
} | |||
//walls spacers | |||
//w1 | |||
translate([tub_wall,(tub_length+(tub_wall*2))/2,(cage_height/2)+basethickness]) | |||
{ | |||
rotate([0,0,0]) | |||
{ | |||
if (wall_spacers_yn==1) tub_spacer(8); | |||
} | |||
} | |||
//w2 | |||
translate([(tub_width+tub_wall),(tub_length+(tub_wall*2))/2,(cage_height/2)+basethickness]) | |||
{ | |||
rotate([0,0,180]) | |||
{ | |||
if (wall_spacers_yn==1) tub_spacer(8); | |||
} | |||
} | |||
//base spacers | |||
//b1 | |||
translate([(tub_width+(tub_wall*2))/2,(tub_length+(tub_wall*2))*1/5,basethickness]) | |||
{ | |||
rotate([0,270,90]) | |||
{ | |||
tub_spacer(tub_width-(spacing*2)); | |||
} | |||
} | |||
//b2 | |||
translate([(tub_width+(tub_wall*2))/2,(tub_length+(tub_wall*2))*4/5,basethickness]) | |||
{ | |||
rotate([0,270,90]) | |||
{ | |||
tub_spacer(tub_width-(spacing*2)); | |||
} | |||
} | |||
//end spacers | |||
} | |||
} | |||
////end tub module | |||
//divider modules | |||
module divider() | |||
{ | |||
difference() | |||
{ | |||
union() | union() | ||
{ | { | ||
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]); | |||
translate([0,0,(spacing+cage_endwall+2)*2]) | |||
{ | |||
rotate([0,45,0]) | |||
translate([0,( | { | ||
{ | cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]); | ||
rotate([0, | } | ||
{ | } | ||
} | |||
} | translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2]) | ||
} | { | ||
rotate([45,0,0]) | |||
{ | |||
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]); | |||
} | |||
} | |||
} | |||
{ | } | ||
rotate([45,0,0]) | //end divider module | ||
{ | |||
//spacer module | |||
} | module tub_spacer(length) | ||
} | { | ||
translate([-(spacing-1),-length/2,0]) | |||
{ | |||
difference() | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
cube(size = [((spacing-1)/sin(45)),length,((spacing-1)/sin(45))]); | |||
} | |||
} | translate([-(spacing-1)-0.1,0,-(spacing-1)]) | ||
{ | |||
#cube(size = [((spacing-1)/sin(45))/sin(45),length,((spacing-1)/sin(45))/sin(45)]); | |||
} | |||
} | |||
} | |||
} | |||
//end spacer | |||
//divot | |||
module divot_sphere() | |||
{ | |||
difference() | |||
{ | |||
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (tub_divot_height/2)/sin(45)); | |||
} | |||
translate([(tub_divot_height/2)/sin(45),0,0]) | |||
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true); | |||
} | |||
} | |||
//end divot module | |||
////groove module | |||
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift) | |||
{ | |||
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2]) | |||
{ | |||
intersection() | |||
{ | |||
intersection() | |||
{ | |||
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)]) | |||
{ | |||
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift]) | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true); | |||
} | |||
} | |||
} | |||
} | |||
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2]) | |||
{ | |||
#cube(size = [groove_length,tub_wallgroove,groove_height]); | |||
} | |||
} | |||
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | |||
} | |||
} | |||
}//end intersection | |||
} | |||
} | |||
////end groove mdoule | |||
////begin eyelet module | |||
module eyelet(od,id,eyelet_width,standoff) | |||
{ | |||
translate([-eyelet_width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder | |||
{ | |||
difference() | |||
{ | |||
union() | |||
{ | |||
translate([0,standoff,standoff]) | |||
{ | |||
cube(size=[eyelet_width,od,(od/2)+od]); | |||
} | |||
translate([0,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = od/2,h = eyelet_width, $fn=60); | |||
} | |||
} | |||
translate([0,0,0]) | |||
{ | |||
cube(size=[eyelet_width,(od/2)+standoff,((od)+od)+standoff]); | |||
} | |||
} | |||
translate([-1,eyelet_width+2,-(((eyelet_width+2)/sin(45))/sin(45))/2]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
#cube(size=[eyelet_width+2,((od+standoff+2)/sin(45)),((eyelet_width+2)/sin(45))]); | |||
} | |||
} | |||
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = id/2,h = eyelet_width+2, $fn=60); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
////end eyelet module | |||
////calculations | |||
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto); | |||
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area z",height); | |||
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2)); | |||
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2)); | |||
echo("cage cavity z",cage_height-cage_base); | |||
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3"); | |||
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10 | |||
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams"); | |||
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth)-floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth))*tub_wallgroovewidth)+tub_wallgroovewidth)); | |||
//2 | |||
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
//3 | |||
echo((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
//2+3 | |||
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)); | |||
//(2+3)/absfloor | |||
echo((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))); | |||
//3 | |||
echo((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))))); | |||
</nowiki> | |||
===tub with grooves eyelits slidelocks=== | |||
update 20150120 | |||
in progress. needs updated grooves. | |||
<nowiki> | |||
height = 90; | |||
tub_width = 36; | |||
tub_length = 70; | |||
basethickness = 5; | |||
tub_wall = 2; | |||
tub_outsidewall = 4; | |||
tub_wallgroovedepth = 1.5; | |||
tub_wallgroovewidth = 15; | |||
tub_wallgroovecorners =4; | |||
grooves_yn = 1; //1 yes 0 no | |||
eyelets_rowside = 2; | |||
eyelets_columnside = 3; | |||
eyelets_belowtop = 10; | |||
eyelets_walltoceneter = 5; | |||
eyelets_od = 7; | |||
eyelets_id = 3; | |||
eyelets_width = 5; | |||
tubs_rows = 1; | |||
tubs_columns = 1; | |||
spacing = 1.940055; | |||
wall_spacers_yn = 0; //1 yes 0 no | |||
center_dividers = 0; //1 yes 0 no | |||
cage_height = 60; | |||
cage_wall = 5.5; | |||
cage_endwall = 2; | |||
cage_base = 5; | |||
mesh_opening = 1.5 ; | |||
mesh_angle = 45; | |||
mesh_spacing = 3.5; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
union()//eyelets | |||
{ | |||
difference()//grooves | |||
{ | |||
union() | |||
{ | |||
//tubs | |||
for (c = [0 : tubs_columns-1]) | |||
{ | |||
translate([0,c*(tub_length+tub_wall),0]) | |||
{ | |||
for (r = [0 : tubs_rows-1]) | |||
{ | |||
translate([r*(tub_width+tub_wall),0,0]) | |||
{ | |||
tub(); | |||
} | |||
} | |||
} | |||
} | |||
//end tubs | |||
//outer walls | |||
translate([-tub_outsidewall+tub_wall,-tub_outsidewall+tub_wall,0]) | |||
{ | |||
difference() | |||
{ | |||
cube(size = [((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall,height]); | |||
translate([tub_outsidewall,tub_outsidewall,0]) | |||
{ | |||
cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]); | |||
} | |||
} | |||
} | |||
//end outer walls | |||
} //end union | |||
////grooves | |||
//1 | |||
rotate([0,0,0]) | |||
{ | |||
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,0); | |||
} | |||
} | |||
//2 | |||
rotate([0,0,90]) | |||
{ | |||
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
} | |||
} | |||
//3 | |||
rotate([0,0,180]) | |||
{ | |||
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))))); | |||
} | |||
} | |||
//4 | |||
rotate([0,0,270]) | |||
{ | |||
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,0); | |||
} | |||
} | |||
////end grooves | |||
} //end difference | |||
//begin eyelets | |||
//1 rowside | |||
translate([(tub_wall-tub_outsidewall),(tub_wall-tub_outsidewall)-eyelets_walltoceneter,height-eyelets_belowtop]) | |||
{ | |||
for (e = [1:eyelets_rowside]) | |||
{ | |||
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0]) | |||
{ | |||
rotate([0,0,180]) | |||
{ | |||
eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2)); | |||
} | |||
} | |||
} | |||
} | |||
//2 | |||
//3 | |||
translate([(tub_wall-tub_outsidewall),((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2),height-eyelets_belowtop]) | |||
{ | |||
for (e = [1:eyelets_rowside]) | |||
{ | |||
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0]) | |||
{ | |||
rotate([0,0,0]) | |||
{ | |||
#eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2)); | |||
} | |||
} | |||
} | |||
} | |||
//4 | |||
//end eyelets | |||
} //end union | |||
//////end render | |||
//////begin modules | |||
////tub module | |||
module tub() | |||
{ | |||
union() | |||
{ | |||
//walls | |||
difference() | |||
{ | |||
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false); | |||
translate([tub_wall,tub_wall,basethickness]) | |||
{ | |||
cube(size = [tub_width, tub_length, height-basethickness+1], center=false); | |||
} | |||
} | |||
//end walls | |||
//spheres lock ins | |||
//1 | |||
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
//2 | |||
translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//3 | |||
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//4 | |||
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//5 | |||
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
} | |||
//6 | |||
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
} | |||
//end spheres | |||
//begin locks | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
} | |||
////upper lock rails | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
} | |||
//end locks | |||
} | |||
} | |||
////end tub module | |||
//divider modules | |||
module divider() | |||
{ | |||
difference() | |||
{ | |||
union() | |||
{ | |||
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]); | |||
translate([0,0,(spacing+cage_endwall+2)*2]) | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]); | |||
} | |||
} | |||
} | |||
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]); | |||
} | |||
} | |||
} | |||
} | |||
//end divider module | |||
//spacer module | |||
module tub_spacer(length) | |||
{ | |||
translate([-(spacing-1),-length/2,0]) | |||
{ | |||
difference() | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
cube(size = [((spacing-1)/sin(45)),length,((spacing-1)/sin(45))]); | |||
} | |||
translate([-(spacing-1)-0.1,0,-(spacing-1)]) | |||
{ | |||
#cube(size = [((spacing-1)/sin(45))/sin(45),length,((spacing-1)/sin(45))/sin(45)]); | |||
} | |||
} | |||
} | |||
} | |||
//end spacer | |||
//divot | |||
module divot_sphere() | |||
{ | |||
difference() | |||
{ | |||
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (tub_divot_height/2)/sin(45)); | |||
} | |||
translate([(tub_divot_height/2)/sin(45),0,0]) | |||
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true); | |||
} | |||
} | |||
//end divot module | |||
////groove module | |||
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift) | |||
{ | |||
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2]) | |||
{ | |||
intersection() | |||
{ | |||
intersection() | |||
{ | |||
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)]) | |||
{ | |||
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift]) | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true); | |||
} | |||
} | |||
} | |||
} | |||
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2]) | |||
{ | |||
#cube(size = [groove_length,tub_wallgroove,groove_height]); | |||
} | |||
} | |||
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | |||
} | |||
} | |||
}//end intersection | |||
} | |||
} | |||
////end groove mdoule | |||
////begin eyelet module | |||
module eyelet(od,id,eyelet_width,standoff) | |||
{ | |||
translate([-eyelet_width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder | |||
{ | |||
difference() | |||
{ | |||
union() | |||
{ | |||
translate([0,standoff,standoff]) | |||
{ | |||
cube(size=[eyelet_width,od,(od/2)+od]); | |||
} | |||
translate([0,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = od/2,h = eyelet_width, $fn=60); | |||
} | |||
} | |||
translate([0,0,0]) | |||
{ | |||
cube(size=[eyelet_width,(od/2)+standoff,((od)+od)+standoff]); | |||
} | |||
} | |||
translate([-1,eyelet_width+2,-(((eyelet_width+2)/sin(45))/sin(45))/2]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
#cube(size=[eyelet_width+2,((od+standoff+2)/sin(45)),((eyelet_width+2)/sin(45))]); | |||
} | |||
} | |||
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = id/2,h = eyelet_width+2, $fn=60); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
////end eyelet module | |||
////calculations | |||
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto); | |||
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area z",height); | |||
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2)); | |||
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2)); | |||
echo("cage cavity z",cage_height-cage_base); | |||
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3"); | |||
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10 | |||
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams"); | |||
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth)-floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth))*tub_wallgroovewidth)+tub_wallgroovewidth)); | |||
//2 | |||
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
//3 | |||
echo((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
//2+3 | |||
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)); | |||
//(2+3)/absfloor | |||
echo((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))); | |||
//3 | |||
echo((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))))); | |||
//slidelocking module | |||
module slidelock(spacing) | |||
{ | |||
difference() | |||
{ | |||
translate([0,-spacing,0]) //translate all | |||
{ | |||
//left | |||
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate left | |||
}//end translate left | |||
//right | |||
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate right | |||
}//end translate right | |||
//bottom | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([90,45,90]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate bottom | |||
}//end translate bottom | |||
//bump | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,spacing*(2/5),((spacing/(1-cos(45)))*cos(45))-spacing*(2/5)])//set bump fraction | |||
{ | |||
rotate([90,45,90]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate bump | |||
}//end translate bump | |||
}//end translate all | |||
//trim left | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate left | |||
}//end translate left | |||
//trim right | |||
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate right | |||
}//end translate right | |||
//trim back | |||
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true); | |||
} | |||
}//end difference | |||
}///end slidelocking module | |||
//slidelocking module | |||
module slidelockupper(spacing) | |||
{ | |||
difference() | |||
{ | |||
translate([0,-spacing,0]) //translate all | |||
{ | |||
//left | |||
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate left | |||
}//end translate left | |||
//right | |||
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate right | |||
}//end translate right | |||
}//end translate all | |||
//trim left | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate left | |||
}//end translate left | |||
//trim right | |||
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate right | |||
}//end translate right | |||
//trim back | |||
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true); | |||
} | |||
}//end difference | |||
}///end slidelocking module | |||
//divot by depth module | |||
module divot_sphere_d() | |||
{ | |||
translate([0,0,0]) | |||
{ | |||
difference() | |||
{ | |||
translate([(spacing/(1-cos(45)))*sin(45),0,0]) | |||
{ | |||
sphere(r = (spacing/(1-cos(45)))); | |||
} | |||
translate([(spacing/(1-cos(45))),0,0]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true); | |||
} | |||
} | |||
} | |||
} | |||
//end divot module | |||
//divot by height | |||
module divot_sphere() | |||
{ | |||
difference() | |||
{ | |||
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (tub_divot_height/2)/sin(45)); | |||
} | |||
translate([(tub_divot_height/2)/sin(45),0,0]) | |||
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true); | |||
} | |||
} | |||
//end divot | |||
</nowiki> | |||
===target width to actual width=== | |||
chooses a width that allows for the grooves to align | |||
still need to integrate into tub scad | |||
<nowiki> | |||
tub_wallgroovewidthactual=((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*round(((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*tub_wallgroovewidth))); | |||
echo("groove width=",tub_wallgroovewidthactual); | |||
</nowiki> | |||
===rounded corners=== | |||
updated 20151001 | |||
*grooves messed up :( | |||
<nowiki> | |||
height = 160; | |||
tub_width = 38; | |||
tub_length = 88; | |||
basethickness = 5; | |||
tub_wall = 2; | |||
tub_outsidewall = 4; | |||
tub_wallgroovedepth = 2; | |||
tub_wallgroovewidth = 15; | |||
tub_wallgroovecorners =08; | |||
tub_wallgrooveshift = 0; //-0.5 1st try, messes up groove matchup | |||
grooves_yn = 1; //1 yes 0 no | |||
eyelets_rowside = 2; | |||
eyelets_columnside = 3; | |||
eyelets_belowtop = 10; | |||
eyelets_walltoceneter = 5; | |||
eyelets_od = 7; | |||
eyelets_id = 3; | |||
eyelets_width = 5; | |||
tubs_rows = 1; | |||
tubs_columns = 1; | |||
spacing = 1.940055; | |||
wall_spacers_yn = 0; //1 yes 0 no | |||
center_dividers = 0; //1 yes 0 no | |||
cage_height = 120; | |||
cage_wall = 7; | |||
cage_endwall = 2; | |||
cage_base = 4; | |||
mesh_opening = 1.875 ; | |||
mesh_angle = 50; | |||
mesh_spacing = 4.1; | |||
wire_diameter = 2; | |||
wire_holeoffc = 0; | |||
cage_lid_depthinto = 7; | |||
cage_divot_height = 5.5; | |||
tub_lid_depthinto = 7; | |||
tub_divot_height = 5.5; | |||
//******************************************* | |||
tub_wallgroovewidthactual=((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*round(((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*tub_wallgroovewidth))); | |||
echo("groove width=",tub_wallgroovewidthactual); | |||
echo(tan(45)*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners) | |||
-(floor((tub_width+(2*tub_outsidewall)-tub_wallgroovecorners)/tub_wallgroovewidthactual)*tub_wallgroovewidthactual)); | |||
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual); | |||
echo((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners); | |||
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidthactual)*tub_wallgroovewidthactual))); | |||
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))-((2*tub_wallgroovewidthactual)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))/(2*tub_wallgroovewidthactual)))))); | |||
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)) | |||
; | |||
union()//eyelets | |||
{ | |||
difference()//grooves | |||
{ | |||
union() | |||
{ | |||
//tubs | |||
for (c = [0 : tubs_columns-1]) | |||
{ | |||
translate([0,c*(tub_length+tub_wall),0]) | |||
{ | |||
for (r = [0 : tubs_rows-1]) | |||
{ | |||
translate([r*(tub_width+tub_wall),0,0]) | |||
{ | |||
tub(); | |||
} | |||
} | |||
} | |||
} | |||
//end tubs | |||
//outer walls | |||
translate([-tub_outsidewall+tub_wall+(tub_wallgroovecorners/2),-tub_outsidewall+tub_wall+(tub_wallgroovecorners/2),0]) | |||
{ | |||
difference() | |||
{ | |||
$fn=50; | |||
minkowski() | |||
{ | |||
cube(size = [(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,(((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height-1]); | |||
cylinder(r=(tub_wallgroovecorners/2),h=(1)); | |||
} | |||
translate([tub_outsidewall-(tub_wallgroovecorners/2),tub_outsidewall-(tub_wallgroovecorners/2),0]) | |||
{ | |||
cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]); | |||
} | |||
} | |||
} | |||
//end outer walls | |||
} //end union | |||
////grooves | |||
//1 | |||
rotate([0,0,0]) | |||
{ | |||
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidthactual,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,0); | |||
} | |||
} | |||
//2 | |||
rotate([0,0,90]) | |||
{ | |||
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidthactual,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))-(tub_wallgrooveshift*1)); | |||
} | |||
} | |||
//3 | |||
rotate([0,0,180]) | |||
{ | |||
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidthactual,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))-((2*tub_wallgroovewidthactual)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))/(2*tub_wallgroovewidthactual)))))-(tub_wallgrooveshift*2)); | |||
} | |||
} | |||
//4 | |||
rotate([0,0,270]) | |||
{ | |||
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0]) | |||
{ | |||
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)- | |||
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)- | |||
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual) | |||
+ | |||
((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)- | |||
(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)- | |||
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual) | |||
+ | |||
((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)- | |||
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)- | |||
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)) | |||
- | |||
((2*tub_wallgroovewidthactual) | |||
* | |||
floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)- | |||
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)- | |||
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual) | |||
+ | |||
((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)- | |||
(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)- | |||
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual) | |||
+ | |||
((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)- | |||
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)- | |||
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)) | |||
/ | |||
(2*tub_wallgroovewidthactual)))))-(tub_wallgrooveshift*3)); | |||
} | |||
} | |||
////end grooves | |||
} //end difference | |||
//begin eyelets | |||
//1 rowside | |||
translate([(tub_wall-tub_outsidewall),(tub_wall-tub_outsidewall)-eyelets_walltoceneter,height-eyelets_belowtop]) | |||
{ | |||
for (e = [1:eyelets_rowside]) | |||
{ | |||
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0]) | |||
{ | |||
rotate([0,0,180]) | |||
{ | |||
eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2)); | |||
} | |||
} | |||
} | |||
} | |||
//2 | |||
//3 | |||
translate([(tub_wall-tub_outsidewall),((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2),height-eyelets_belowtop]) | |||
{ | |||
for (e = [1:eyelets_rowside]) | |||
{ | |||
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0]) | |||
{ | |||
rotate([0,0,0]) | |||
{ | |||
#eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2)); | |||
} | |||
} | |||
} | |||
} | |||
//4 | |||
//end eyelets | |||
} //end union | |||
//////end render | |||
//////begin modules | |||
////tub module | |||
module tub() | |||
{ | |||
union() | |||
{ | |||
//walls | |||
difference() | |||
{ | |||
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false); | |||
translate([tub_wall+spacing,tub_wall+spacing,basethickness]) | |||
{ | |||
$fn=50; | |||
minkowski() | |||
{ | |||
cube(size = [tub_width-(spacing*2), tub_length-(spacing*2), height-basethickness+1-1], center=false); | |||
cylinder(r=spacing,h=1); | |||
} | |||
} | |||
} | |||
//end walls | |||
//spheres lock ins | |||
//1 | |||
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
//2 | |||
translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([1,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//3 | |||
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//4 | |||
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
divot_sphere(); | |||
} | |||
} | |||
//5 | |||
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
} | |||
//6 | |||
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))]) | |||
{ | |||
mirror([0,0,0]) | |||
{ | |||
rotate([0,0,90]) | |||
{ | |||
#divot_sphere(); | |||
} | |||
} | |||
} | |||
//end spheres | |||
//begin locks | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelock(spacing); | |||
} | |||
} | |||
////upper lock rails | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
} | |||
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)]) | |||
{ | |||
mirror([0,1,0]) | |||
{ | |||
#slidelockupper(spacing); | |||
} | |||
} | |||
//end locks | |||
} | |||
} | |||
////end tub module | |||
//divider modules | |||
module divider() | |||
{ | |||
difference() | |||
{ | |||
union() | |||
{ | |||
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]); | |||
translate([0,0,(spacing+cage_endwall+2)*2]) | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]); | |||
} | |||
} | |||
} | |||
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]); | |||
} | |||
} | |||
} | |||
} | |||
//end divider module | |||
//spacer module | |||
module tub_spacer(length) | |||
{ | |||
translate([-(spacing-1),-length/2,0]) | |||
{ | |||
difference() | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
cube(size = [((spacing-1)/sin(45)),length,((spacing-1)/sin(45))]); | |||
} | |||
translate([-(spacing-1)-0.1,0,-(spacing-1)]) | |||
{ | |||
#cube(size = [((spacing-1)/sin(45))/sin(45),length,((spacing-1)/sin(45))/sin(45)]); | |||
} | |||
} | |||
} | |||
} | |||
//end spacer | |||
//divot | |||
module divot_sphere() | |||
{ | |||
difference() | |||
{ | |||
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (tub_divot_height/2)/sin(45)); | |||
} | |||
translate([(tub_divot_height/2)/sin(45),0,0]) | |||
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true); | |||
} | |||
} | |||
//end divot module | |||
////groove module | |||
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift) | |||
{ | |||
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2]) | |||
{ | |||
intersection() | |||
{ | |||
intersection() | |||
{ | |||
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)]) | |||
{ | |||
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift]) | |||
{ | |||
rotate([0,45,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true); | |||
} | |||
} | |||
} | |||
} | |||
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2]) | |||
{ | |||
#cube(size = [groove_length,tub_wallgroove,groove_height]); | |||
} | |||
} | |||
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true); | |||
} | |||
} | |||
}//end intersection | |||
} | |||
} | |||
////end groove mdoule | |||
////begin eyelet module | |||
module eyelet(od,id,eyelet_width,standoff) | |||
{ | |||
translate([-eyelet_width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder | |||
{ | |||
difference() | |||
{ | |||
union() | |||
{ | |||
translate([0,standoff,standoff]) | |||
{ | |||
cube(size=[eyelet_width,od,(od/2)+od]); | |||
} | |||
translate([0,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = od/2,h = eyelet_width, $fn=60); | |||
} | |||
} | |||
translate([0,0,0]) | |||
{ | |||
cube(size=[eyelet_width,(od/2)+standoff,((od)+od)+standoff]); | |||
} | |||
} | |||
translate([-1,eyelet_width+2,-(((eyelet_width+2)/sin(45))/sin(45))/2]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
#cube(size=[eyelet_width+2,((od+standoff+2)/sin(45)),((eyelet_width+2)/sin(45))]); | |||
} | |||
} | |||
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = id/2,h = eyelet_width+2, $fn=60); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
////end eyelet module | |||
////calculations | |||
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto); | |||
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall); | |||
echo("tub print area z",height); | |||
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2)); | |||
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2)); | |||
echo("cage cavity z",cage_height-cage_base); | |||
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3"); | |||
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10 | |||
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams"); | |||
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth)-floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth))*tub_wallgroovewidth)+tub_wallgroovewidth)); | |||
//2 | |||
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
//3 | |||
echo((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth); | |||
//2+3 | |||
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)); | |||
//(2+3)/absfloor | |||
echo((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))); | |||
//3 | |||
echo((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))))); | |||
//slidelocking module | |||
module slidelock(spacing) | |||
{ | |||
difference() | |||
{ | |||
translate([0,-spacing,0]) //translate all | |||
{ | |||
//left | |||
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate left | |||
}//end translate left | |||
//right | |||
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate right | |||
}//end translate right | |||
//bottom | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([90,45,90]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate bottom | |||
}//end translate bottom | |||
//bump | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,spacing*(2/5),((spacing/(1-cos(45)))*cos(45))-spacing*(2/5)])//set bump fraction | |||
{ | |||
rotate([90,45,90]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate bump | |||
}//end translate bump | |||
}//end translate all | |||
//trim left | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate left | |||
}//end translate left | |||
//trim right | |||
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate right | |||
}//end translate right | |||
//trim back | |||
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true); | |||
} | |||
}//end difference | |||
}///end slidelocking module | |||
//slidelocking module | |||
module slidelockupper(spacing) | |||
{ | |||
difference() | |||
{ | |||
translate([0,-spacing,0]) //translate all | |||
{ | |||
//left | |||
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate left | |||
}//end translate left | |||
//right | |||
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate right | |||
}//end translate right | |||
}//end translate all | |||
//trim left | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate left | |||
}//end translate left | |||
//trim right | |||
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate right | |||
}//end translate right | |||
//trim back | |||
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true); | |||
//trim bottom | |||
translate([0,(-((spacing/(1-cos(45)))*2)/2)-spacing,(-(spacing/(1-cos(45)))*cos(45))-1]) | |||
{ | |||
rotate([90,45,90]) | |||
{ | |||
#cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2],center=true); | |||
}//end rotate bottom | |||
}//end translate bottom | |||
} | |||
}//end difference | |||
}///end slidelocking module | |||
//divot by depth module | |||
module divot_sphere_d() | |||
{ | |||
translate([0,0,0]) | |||
{ | |||
difference() | |||
{ | |||
translate([(spacing/(1-cos(45)))*sin(45),0,0]) | |||
{ | |||
sphere(r = (spacing/(1-cos(45)))); | |||
} | |||
translate([(spacing/(1-cos(45))),0,0]) | |||
{ | |||
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true); | |||
} | |||
} | |||
} | |||
} | |||
//end divot module | |||
//divot by height | |||
module divot_sphere() | |||
{ | |||
difference() | |||
{ | |||
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0]) | |||
{ | |||
sphere(r = (tub_divot_height/2)/sin(45)); | |||
} | |||
translate([(tub_divot_height/2)/sin(45),0,0]) | |||
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true); | |||
} | |||
} | |||
//end divot | |||
</nowiki> | |||
==tub cells lid== | |||
==tub main lid== | |||
===eyelet module=== | |||
<nowiki> | |||
module eyelet(od,id,width,standoff) | |||
{ | |||
translate([-width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder | |||
{ | |||
difference() | |||
{ | |||
union() | |||
{ | |||
translate([0,standoff,standoff]) | |||
{ | |||
cube(size=[width,od,(od/2)+od]); | |||
} | |||
translate([0,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = od/2,h = width, $fn=60); | |||
} | |||
} | |||
translate([0,0,0]) | |||
{ | |||
cube(size=[width,(od/2)+standoff,((od)+od)+standoff]); | |||
} | |||
} | |||
translate([-1,width+2,-(((width+2)/sin(45))/sin(45))/2]) | |||
{ | |||
rotate([45,0,0]) | |||
{ | |||
#cube(size=[width+2,((od+standoff+2)/sin(45)),((width+2)/sin(45))]); | |||
} | |||
} | |||
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff]) | |||
{ | |||
rotate([0,90,0]) | |||
{ | |||
cylinder(r = id/2,h = width+2, $fn=60); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
eyelet(5,2,2,5); | |||
</nowiki> | |||
==locks== | |||
===slide divot lock=== | |||
updated 20150113 | |||
<nowiki> | |||
spacing = 5; | |||
slidelock(spacing); | |||
module slidelock(spacing) | |||
{ | |||
difference() | |||
{ | |||
translate([0,-spacing,0]) //translate all | |||
{ | |||
//left | |||
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate left | |||
}//end translate left | |||
//right | |||
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate right | |||
}//end translate right | |||
//bottom | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,0,-(spacing/(1-cos(45)))*cos(45)]) | |||
{ | |||
rotate([90,45,90]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate bottom | |||
}//end translate bottom | |||
//bump | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,spacing*(2/5),((spacing/(1-cos(45)))*cos(45))-spacing*(2/5)])//set bump fraction | |||
{ | |||
rotate([90,45,90]) | |||
{ | |||
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]); | |||
}//end rotate bump | |||
}//end translate bump | |||
}//end translate all | |||
//trim left | |||
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
#cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate left | |||
}//end translate left | |||
//trim right | |||
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1]) | |||
{ | |||
rotate([0,0,45]) | |||
{ | |||
#cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]); | |||
}//end rotate right | |||
}//end translate right | |||
//trim back | |||
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2]) | |||
{ | |||
#cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true); | |||
} | |||
}//end difference | |||
//divot by depth module | |||
module divot_sphere(slider_divot_height) | |||
translate([spacing,0,0]) | |||
{ | |||
{ | |||
difference() | |||
{ | |||
translate([(spacing/(1-cos(45)))*sin(45),0,0]) | |||
{ | |||
#sphere(r = (spacing/(1-cos(45)))); | |||
} | |||
translate([(spacing/(1-cos(45))),0,0]) | |||
#cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true); | |||
} | |||
} | |||
} | |||
//end divot module | |||
} | } | ||
</nowiki> | </nowiki> | ||
===sphere lock in divot=== | ===sphere lock in divot=== | ||
Latest revision as of 03:09, 2 October 2015
mesh
new mesh module idea
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
intersection()
{
translate([0.1,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0])
cube([cage_wall+0.2,(((tub_length-(spacing*2))-(cage_endwall*2))),cage_height], center=false);
//need to translate closer to the cube here with llarge holes
translate([0,0,-mesh_spacing])
{
rotate([0,-mesh_angle,0])
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
//for - pair of rows to height
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(h*[0,0,mesh_spacing])
{
//for - second row
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
//translate second row
translate([0,-mesh_spacing/2,mesh_spacing/2])
{
//make second row copies
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false);
}
}
}
}
//for - create first row
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
//need to tweak
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false);
}
}
}
}
}
}
////end cube
}
}
echo((cage_height/sin(90))*sin(mesh_angle));
echo((tub_width-(spacing*3))/2);
mesh
tweaking the pattern for holes through the cage
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
cage_wall = 10 ;
width = 20;
height = 20;
cube(size = [20,20,20], center=true);
for (h = [0 : height])
{
translate(h*[0,0,mesh_spacing])
{
rotate([0,mesh_angle,0])
{
for (w = [0 : width])
{
translate(w*[0,mesh_spacing,0])
{
rotate([0,0,45])
{
//could put a scale command here to make opening a perfect square
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(10/sin(90-mesh_angle)))], center=false);
}
}
}
}
}
}
cage
cage with side locking divots
updated 20150311
w/ old parameters
height = 90;
tub_width = 36;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tubs_rows = 5;
tubs_columns = 2;
spacing = 1.940055;
center_dividers = 00; //1 yes 0 no
cage_height = 60;
cage_wall = 5.5;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
//begin underlying cage module
module cage()
{
union()
{
difference()
{
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false);
//cut hole for powder to sit in
translate([cage_wall, cage_endwall, cage_base])
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)+0.001,(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false);
}
}//end difference begin union
//side locking divots
//1
translate([((tub_width-(spacing*3))/2)/2,0,((tub_width-(spacing*3))/2)/2])
rotate([0,0,90])
divot_sphere_d();
//2
translate([((tub_width-(spacing*3))/2)/2,0,cage_height-(((tub_width-(spacing*3))/2)/2)])
rotate([0,0,90])
divot_sphere_d();
//3
translate([((tub_width-(spacing*3))/2)/2,tub_length-(spacing*2),((tub_width-(spacing*3))/2)/2])
rotate([0,0,270])
divot_sphere_d();
//4
translate([((tub_width-(spacing*3))/2)/2,tub_length-(spacing*2),cage_height-(((tub_width-(spacing*3))/2)/2)])
rotate([0,0,270])
divot_sphere_d();
}//end union
//end cage
//begin mesh hole grid module
module holes()
{
intersection()
{
translate([0,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0])
cube([cage_wall+0.2,1+((((tub_length-(spacing*2))-(cage_endwall*2)))),cage_height], center=false);
//need to translate closer to the cube here with llarge holes
translate([0,0,-mesh_spacing])
{
rotate([0,-mesh_angle,0])
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
//for - pair of rows to height
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(h*[0,0,mesh_spacing])
{
//for - second row
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
//translate second row
translate([0,-mesh_spacing/2,mesh_spacing/2])
{
//make second row copies
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false);
}
}
}
}
//for - create first row
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
//need to tweak
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false);
}
}
}
}
}
}
////end cube
}
}
}
////end mesh hole grid module
//////divot
module divot_sphere()
{
difference()
{
translate([(cage_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (cage_divot_height/2)/sin(45));
}
translate([(cage_divot_height/2)/sin(45),0,0])
cube(size = [((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2)], center=true);
}
}
////end divot module
//begin final cage construction
difference()
{
cage();
//begin holes
translate([(((tub_width-(spacing*3))/2)-cage_wall)+0.0, cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
holes();
}
translate([(cage_wall)-0.0,cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
mirror([1,0,0])
{
#holes();
}
}
//end holes
//begin divots
//1
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))])
{
#divot_sphere();
}
//2
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))])
{
#divot_sphere();
}
//3
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//4
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//end divots
}
//end cage
//divot by depth module
module divot_sphere_d()
{
translate([0,0,0])
{
difference()
{
translate([(spacing/(1-cos(45)))*sin(45),0,0])
{
sphere(r = (spacing/(1-cos(45))));
}
translate([(spacing/(1-cos(45))),0,0])
{
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true);
}
}
}
}
//end divot module
//calculate mesh wall minimum thickness
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90)));
//calculate verticle height of mesh holes to take away from max height of holes
//works okay up to 45 then bugs out. might be because its before the scale down
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle)));
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2));
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2));
echo("cage cavity z",cage_height-cage_base);
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3");
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams");
//calculate mesh wall minimum thickness
echo("mesh dividers thickness",sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90)));
testprint1 parameteres 20150125
- smaller mesh holes (mesh min thickness 0.95061)
- shorter cage height
results
- mesh holes too small, closed up near center.
- lower side lock divot malformed
- infill shrunk inwards on a few lower layers
height = 90; tub_width = 36; tub_length = 70; basethickness = 5; tub_wall = 2; tub_outsidewall = 4; tubs_rows = 1; tubs_columns = 1; spacing = 1.940055; center_dividers = 00; //1 yes 0 no cage_height = 40; cage_wall = 6; cage_endwall = 2; cage_base = 5; mesh_opening = 1.1 ; mesh_angle = 60; mesh_spacing = 2.9; wire_diameter = 2; wire_holeoffc = 0; cage_lid_depthinto = 7; cage_divot_height = 5.5; tub_lid_depthinto = 7; tub_divot_height = 5.5;
testprint2 parameteres 20150126
changes
- 45% thicker mesh wall
- holes sized to midpoint between failed testprint1 and original cage
- gcode changes
- slowed down print speed
- entered more accurate filament diameter 2.8mm on 3mm
height = 90; tub_width = 46; tub_length = 70; basethickness = 5; tub_wall = 2; tub_outsidewall = 4; tubs_rows = 5; tubs_columns = 2; spacing = 1.940055; center_dividers = 00; //1 yes 0 no cage_height = 40; cage_wall = 8; cage_endwall = 2; cage_base = 5; mesh_opening = 1.25 ; mesh_angle = 52.5; mesh_spacing = 3.2; wire_diameter = 2; wire_holeoffc = 0; cage_lid_depthinto = 7; cage_divot_height = 5.5; tub_lid_depthinto = 7; tub_divot_height = 5.5;
cage with divots
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
wire_diameter = 2;
wire_holeoffc = 0;
lid_depthinto = 7;
divot_height = 5.5;
//begin underlying cage module
module cage()
{
difference()
{
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false);
//cut hole for powder to sit in
translate([cage_wall, cage_endwall, cage_base])
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false);
}
}
//end cage
//begin mesh hole grid module
module holes()
{
intersection()
{
translate([0,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0])
cube([cage_wall+0.2,1+((((tub_length-(spacing*2))-(cage_endwall*2)))),cage_height], center=false);
//need to translate closer to the cube here with llarge holes
translate([0,0,-mesh_spacing])
{
rotate([0,-mesh_angle,0])
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
//for - pair of rows to height
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(h*[0,0,mesh_spacing])
{
//for - second row
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
//translate second row
translate([0,-mesh_spacing/2,mesh_spacing/2])
{
//make second row copies
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false);
}
}
}
}
//for - create first row
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
//need to tweak
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false);
}
}
}
}
}
}
////end cube
}
}
}
////end mesh hole grid module
//////divot
module divot_sphere()
{
difference()
{
translate([(divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (divot_height/2)/sin(45));
}
translate([(divot_height/2)/sin(45),0,0])
cube(size = [((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2)], center=true);
}
}
////end divot module
//begin final cage construction
difference()
{
cage();
//begin holes
translate([(((tub_width-(spacing*3))/2)-cage_wall)+0.0, cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
holes();
}
translate([(cage_wall)-0.0,cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
mirror([1,0,0])
{
#holes();
}
}
//end holes
//begin divots
//1
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))])
{
#divot_sphere();
}
//2
translate([cage_wall,(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))])
{
#divot_sphere();
}
//3
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*1/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//4
translate([cage_wall+(((tub_width-(spacing*3))/2)-(cage_wall*2)),(((tub_length-(spacing*2))-(cage_endwall*2))*3/4)+cage_endwall,cage_height-(((lid_depthinto-divot_height)/2)+(divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//end divots
}
//end cage
//calculate mesh wall minimum thickness
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90)));
//calculate verticle height of mesh holes to take away from max height of holes
//works okay up to 45 then bugs out. might be because its before the scale down
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle)));
cage without divots
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
//begin underlying cage module
module cage()
{
difference()
{
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false);
//cut hole for powder to sit in
translate([cage_wall, cage_endwall, cage_base])
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false);
}
}
//end cage
//begin mesh hole grid module
module holes()
{
intersection()
{
translate([0,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0])
cube([cage_wall+0.2,1+((((tub_length-(spacing*2))-(cage_endwall*2)))),cage_height], center=false);
//need to translate closer to the cube here with llarge holes
translate([0,0,-mesh_spacing])
{
rotate([0,-mesh_angle,0])
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
//for - pair of rows to height
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(h*[0,0,mesh_spacing])
{
//for - second row
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
//translate second row
translate([0,-mesh_spacing/2,mesh_spacing/2])
{
//make second row copies
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false);
}
}
}
}
//for - create first row
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
//need to tweak
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false);
}
}
}
}
}
}
////end cube
}
}
}
////end mesh hole grid module
//begin final cage construction
difference()
{
cage();
translate([(((tub_width-(spacing*3))/2)-cage_wall)+0.0, cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
holes();
}
translate([(cage_wall)-0.0,cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
mirror([1,0,0])
{
#holes();
}
}
}
//end cage
//calculate mesh wall minimum thickness
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90)));
//calculate verticle height of mesh holes to take away from max height of holes
//works okay up to 45 then bugs out. might be because its before the scale down
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle)));
cage with new mesh module
- mesh module needs adjusted a little. missing a little from side
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 60;
mesh_spacing = 2;
//begin underlying cage module
module cage()
{
difference()
{
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false);
//cut hole for powder to sit in
translate([cage_wall, cage_endwall, cage_base])
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false);
}
}
//end cage
//begin mesh hole grid module
module holes()
{
intersection()
{
translate([0,-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))),0])
cube([cage_wall+0.2,1+((((tub_length-(spacing*2))-(cage_endwall*2)))),cage_height], center=false);
//need to translate closer to the cube here with llarge holes
translate([0,0,-mesh_spacing])
{
rotate([0,-mesh_angle,0])
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
//for - pair of rows to height
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(h*[0,0,mesh_spacing])
{
//for - second row
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
//translate second row
translate([0,-mesh_spacing/2,mesh_spacing/2])
{
//make second row copies
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening], center=false);
}
}
}
}
//for - create first row
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([45,0,0])
{
//need to tweak
cube(size = [(cage_wall*2)+(cage_height/sin(90))*sin(mesh_angle),mesh_opening,mesh_opening],center=false);
}
}
}
}
}
}
////end cube
}
}
}
////end mesh hole grid module
//begin final cage construction
difference()
{
cage();
translate([(((tub_width-(spacing*3))/2)-cage_wall)+0.0, cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
holes();
}
translate([(cage_wall)-0.0,cage_endwall+((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
mirror([1,0,0])
{
#holes();
}
}
}
//end cage
//calculate mesh wall minimum thickness
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90)));
//calculate verticle height of mesh holes to take away from max height of holes
//works okay up to 45 then bugs out. might be because its before the scale down
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle)));
cage with old mesh
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
//begin underlying cage module
module cage()
{
difference()
{
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false);
//cut hole for powder to sit in
translate([cage_wall, cage_endwall, cage_base])
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false);
}
}
//end cage
//begin mesh hole grid module
module holes()
{
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(h*[0,0,mesh_spacing])
{
//scale command here to make openings perfect squares
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
rotate([0,90-mesh_angle,0])
{
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([0,0,45])
{
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(cage_wall/sin(90-mesh_angle)))], center=false);
}
}
}
//begin second row
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate([mesh_spacing/2,mesh_spacing/2,-mesh_spacing/2])
{
translate(w*[0,mesh_spacing,0])
{
rotate([0,0,45])
{
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(cage_wall/sin(90-mesh_angle)))], center=false);
}
}
}
}
}
}
}
}
}
//end mesh hole grid module
//begin final cage construction
difference()
{
cage();
translate([((tub_width-(spacing*3))/2)-cage_wall-((sin(mesh_angle)*sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2), cage_endwall-(mesh_spacing/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
holes();
}
translate([cage_wall+((sin(mesh_angle)*sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2), cage_endwall-(mesh_spacing/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
mirror([1,0,0])
{
#holes();
}
}
}
//end cage
//calculate mesh wall minimum thickness
echo(sin(45)*((mesh_spacing-((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/sin(90)));
//calculate verticle height of mesh holes to take away from max height of holes
//works okay up to 45 then bugs out. might be because its before the scale down
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle)));
inside cage
height = 60;
tub_width = 95;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 40;
cage_wall = 10;
cage_endwall = 5;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 2 ;
mesh_angle = 45;
mesh_spacing = 4;
mesh_width = 17;
mesh_height = 10;
difference()
{
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false);
translate([cage_wall, cage_endwall, cage_base])
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false);
translate([((tub_width-(spacing*3))/2)-cage_wall-((sin(mesh_angle)*sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2), cage_endwall-(mesh_spacing/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
for (h = [1 : mesh_height])
{
translate(h*[0,0,mesh_spacing])
{
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
rotate([0,90-mesh_angle,0])
{
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([0,0,45])
{
//could put a scale command here to make opening a perfect square
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(10/sin(90-mesh_angle)))], center=false);
}
}
}
//begin second row
#for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate([mesh_spacing/2,mesh_spacing/2,-mesh_spacing/2])
{
translate(w*[0,mesh_spacing,0])
{
rotate([0,0,45])
{
//could put a scale command here to make opening a perfect square
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(10/sin(90-mesh_angle)))], center=false);
}
}
}
}
//end second row
}
}
}
}
}
}
echo(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)));
echo((tub_length-(spacing*2))-(cage_endwall*2));
echo((((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2));
cage lid
cuts in lip
updated 20150301
height = 90;
tub_width = 46;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tubs_rows = 5;
tubs_columns = 2;
spacing = 1.940055;
center_dividers = 00; //1 yes 0 no
cage_height = 60;
cage_wall = 8;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 52.5;
mesh_spacing = 3.5;
wire_count = 7; //number of wires into each cage
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_cut = 0; //1 yes 0 no cavity in lid or not?
cage_minicleat = 2;
yn_cage_minicleat = 1; //1 yes 0 no
yn_cage_cleat = 0; //1 yes 0 no
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
shrink_cage_lid = 0.5;
base_chamfer_depth = 0.9; //max 1.0
base_wire_cone = 0.2; //diameter added to wire_diameter
union()
{
difference()
{
union()
{
translate([shrink_cage_lid/2,shrink_cage_lid/2,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))-shrink_cage_lid,((tub_length-(spacing*2))-(cage_endwall*2))-shrink_cage_lid,cage_lid_depthinto], center=false);
}
translate([-1,-1,cage_lid_depthinto])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false);
}
//spheres lock ins
//1
translate([(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
divot_sphere();
}
//2
translate([(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
divot_sphere();
}
//3
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))-(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//4
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))-(shrink_cage_lid/2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//end spheres
//minicleats
//1
translate([((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(2),cage_lid_depthinto+2])
{
for(w = [-(wire_count-1)/2 : (wire_count-1)/2])
{
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0])
{
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1);
}
}
}
//2
translate([-((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(2),cage_lid_depthinto+2])
{
mirror([1,0,0])
{
for(w = [-(wire_count-1)/2 : (wire_count-1)/2])
{
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0])
{
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1);
}
}
}
}
//end mini cleats
}
//end union begin difference
translate([1,1,1])
{
if (cage_lid_cut==1) cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,cage_lid_depthinto+3], center=false);
}
//chamfer underside of lip
translate([-2,-1,cage_lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,cage_lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-1,-2,cage_lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,cage_lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
//end chamfer
//chamfer base
translate([-2,base_chamfer_depth-1,-1])
{
rotate([45,0,0])
{
#cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1-base_chamfer_depth,-1])
{
rotate([45,0,0])
{
#cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-1+base_chamfer_depth,-2,-1])
{
rotate([45,0,90])
{
#cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1-base_chamfer_depth,-2,-1])
{
rotate([45,0,90])
{
#cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
//end chamfer
//begin wire holes
translate([-1,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2),cage_lid_depthinto])
{
for(w = [-(wire_count-1)/2 : (wire_count-1)/2])
{
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0])
{
rotate([0,0,45])
{
#cube(size=[sqrt(2),sqrt(2),3]);
}
}
}
}
//end wire holes
//end difference
}
//begin union
//cleat
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)-(wire_diameter*1.5)-1+wire_holeoffc,0])
{
if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2);
}
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)+(wire_diameter*1.5)+1+wire_holeoffc,0])
{
mirror([0,1,0])
{
if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2);
}
}
//end cleat
}
//divot
module divot_sphere()
{
difference()
{
translate([(cage_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (cage_divot_height/2)/sin(45));
}
translate([(cage_divot_height/2)/sin(45),0,0])
cube(size = [((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2)], center=true);
}
}
////cleat module
module cleat(size,height)
{
translate([0,0,-size])
{
difference()
{
rotate([45,0,0])
{
rotate([0,0,45])
{
cube(size = [size,size,height/sin(45)], center=false);
}
}
translate([-size*3/2,-size*3/2,0])
{
#cube(size = [size*3,size*3,size],center=false);
}
}
}
}
//end cleat
//mini_cleat module
module mini_cleat(sides,height)
{
union()
{
#cube(size = [sides,sides,height]);
translate([0,0,height])
{
polyhedron
(points = [ [0,0,0],[sides,0,0],[sides,sides,0],[0,sides,0],
[sides,0,sides],[sides*2,0,sides],[sides*2,sides,sides],[sides,sides,sides]
],
faces = [ [0,1,2],[0,2,3], //
[0,5,1],[0,4,5], //
[1,5,6],[1,6,2],
[2,6,7],[2,7,3],
[3,7,4],[3,4,0],
[4,7,6],[4,6,5]
]
);
}
}
}
//end mini cleat module
no cavity with multiple cleats
height = 90;
tub_width = 36;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tubs_rows = 5;
tubs_columns = 2;
spacing = 1.940055;
center_dividers = 00; //1 yes 0 no
cage_height = 60;
cage_wall = 5.5;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_count = 7; //number of wires into each cage
wire_diameter = 0.8;
wire_holeoffc = 0;
cage_lid_cut = 0; //1 yes 0 no cavity in lid or not?
cage_minicleat = 2;
yn_cage_minicleat = 1; //1 yes 0 no
yn_cage_cleat = 0; //1 yes 0 no
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
union()
{
difference()
{
union()
{
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_lid_depthinto], center=false);
translate([-1,-1,cage_lid_depthinto])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false);
}
//spheres lock ins
//1
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
divot_sphere();
}
//2
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
divot_sphere();
}
//3
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//4
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((cage_lid_depthinto-cage_divot_height)/2)+(cage_divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//end spheres
//minicleats
//1
translate([((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(wire_diameter/2),cage_lid_depthinto+2])
{
for(w = [-(wire_count-1)/2 : (wire_count-1)/2])
{
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0])
{
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1);
}
}
}
//2
translate([-((((((tub_width-(spacing*3))/2)-(cage_wall*2))+2)/2)-cage_minicleat)+((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,((((tub_length-(spacing*2))-(cage_endwall*2))*1/2))+(wire_diameter/2),cage_lid_depthinto+2])
{
mirror([1,0,0])
{
for(w = [-(wire_count-1)/2 : (wire_count-1)/2])
{
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0])
{
if (yn_cage_minicleat==1) mini_cleat(cage_minicleat,1);
}
}
}
}
//end mini cleats
}
//end union begin difference
translate([1,1,1])
{
if (cage_lid_cut==1) cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,cage_lid_depthinto+3], center=false);
}
//chamfer underside of lip
translate([-2,-1,cage_lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,cage_lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-1,-2,cage_lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,cage_lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
//end chamfer
//begin wire holes
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2),-1])
{
for(w = [-(wire_count-1)/2 : (wire_count-1)/2])
{
translate(w*[0,((((tub_length-(spacing*2))-(cage_endwall*2)-2))/(wire_count+1)),0])
{
#cylinder(r = wire_diameter/2, h = cage_lid_depthinto+2+2);
}
}
}
//end wire holes
//end difference
}
//begin union
//cleat
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)-(wire_diameter*1.5)-1+wire_holeoffc,0])
{
if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2);
}
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)+(wire_diameter*1.5)+1+wire_holeoffc,0])
{
mirror([0,1,0])
{
if (yn_cage_cleat==1) cleat(2,cage_lid_depthinto+2);
}
}
//end cleat
}
//divot
module divot_sphere()
{
difference()
{
translate([(cage_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (cage_divot_height/2)/sin(45));
}
translate([(cage_divot_height/2)/sin(45),0,0])
cube(size = [((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2),((cage_divot_height/2)/sin(45)*2)], center=true);
}
}
////cleat module
module cleat(size,height)
{
translate([0,0,-size])
{
difference()
{
rotate([45,0,0])
{
rotate([0,0,45])
{
cube(size = [size,size,height/sin(45)], center=false);
}
}
translate([-size*3/2,-size*3/2,0])
{
#cube(size = [size*3,size*3,size],center=false);
}
}
}
}
//end cleat
//mini_cleat module
module mini_cleat(sides,height)
{
union()
{
#cube(size = [sides,sides,height]);
translate([0,0,height])
{
polyhedron
(points = [ [0,0,0],[sides,0,0],[sides,sides,0],[0,sides,0],
[sides,0,sides],[sides*2,0,sides],[sides*2,sides,sides],[sides,sides,sides]
],
faces = [ [0,1,2],[0,2,3], //
[0,5,1],[0,4,5], //
[1,5,6],[1,6,2],
[2,6,7],[2,7,3],
[3,7,4],[3,4,0],
[4,7,6],[4,6,5]
]
);
}
}
}
//end mini cleat module
small lip with divots and cleat
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
wire_diameter = 2;
wire_holeoffc = 0;
lid_depthinto = 7;
divot_height = 5.5;
union()
{
difference()
{
union()
{
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),lid_depthinto], center=false);
translate([-1,-1,lid_depthinto])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false);
}
//spheres lock ins
//1
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
divot_sphere();
}
//2
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
divot_sphere();
}
//3
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//4
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//end spheres
}
//end union begin difference
translate([1,1,1])
{
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,lid_depthinto+3], center=false);
}
//chamfer underside of lip
translate([-2,-1,lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-1,-2,lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
//end chamfer
//begin wire hole
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2),-1])
{
cylinder(r = wire_diameter/2, h = 3);
}
//end wire hole
//end difference
}
//begin union
//cleat
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)-(wire_diameter*1.5)-1+wire_holeoffc,0])
{
cleat(2,lid_depthinto+2);
}
translate([((((tub_width-(spacing*3))/2)-(cage_wall*2)))/2,(((tub_length-(spacing*2))-(cage_endwall*2))*1/2)+(wire_diameter*1.5)+1+wire_holeoffc,0])
{
mirror([0,1,0])
{
cleat(2,lid_depthinto+2);
}
}
//end cleat
}
//divot
module divot_sphere()
{
difference()
{
translate([(divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (divot_height/2)/sin(45));
}
translate([(divot_height/2)/sin(45),0,0])
cube(size = [((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2)], center=true);
}
}
////cleat module
module cleat(size,height)
{
translate([0,0,-size])
{
difference()
{
rotate([45,0,0])
{
rotate([0,0,45])
{
cube(size = [size,size,height/sin(45)], center=false);
}
}
translate([-size*3/2,-size*3/2,0])
{
#cube(size = [size*3,size*3,size],center=false);
}
}
}
}
chamfered small lip
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
wire_diameter = 2;
lid_depthinto = 4;
difference()
{
union()
{
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),lid_depthinto], center=false);
translate([-1,-1,lid_depthinto])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false);
}
//spheres lock ins
//end spheres
}
//end union begin difference
translate([1,1,1])
{
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,lid_depthinto+3], center=false);
}
//chamfer underside of lip
translate([-2,-1,lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-1,-2,lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
}
chamfered small lip with divots
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
wire_diameter = 2;
lid_depthinto = 7;
divot_height = 5.5;
difference()
{
union()
{
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),lid_depthinto], center=false);
translate([-1,-1,lid_depthinto])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+2,((tub_length-(spacing*2))-(cage_endwall*2))+2,2], center=false);
}
//spheres lock ins
//1
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
divot_sphere();
}
//2
translate([0,((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
divot_sphere();
}
//3
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*1/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//4
translate([((tub_width-(spacing*3))/2)-(cage_wall*2),((tub_length-(spacing*2))-(cage_endwall*2))*3/4,((lid_depthinto-divot_height)/2)+(divot_height/2)])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//end spheres
}
//end union begin difference
translate([1,1,1])
{
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2)-2,(tub_length-(spacing*2))-(cage_endwall*2)-2,lid_depthinto+3], center=false);
}
//chamfer underside of lip
translate([-2,-1,lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-2,(tub_length-(spacing*2))-(cage_endwall*2)+1,lid_depthinto-1])
{
rotate([45,0,0])
{
cube(size = [(((tub_width-(spacing*3))/2)-(cage_wall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([-1,-2,lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
translate([(((tub_width-(spacing*3))/2)-(cage_wall*2))+1,-2,lid_depthinto-1])
{
rotate([45,0,90])
{
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))+4,sqrt(2),sqrt(2)], center=false);
}
}
}
//divot
module divot_sphere()
{
difference()
{
translate([(divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (divot_height/2)/sin(45));
}
translate([(divot_height/2)/sin(45),0,0])
cube(size = [((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2),((divot_height/2)/sin(45)*2)], center=true);
}
}
big lip with cleat
height = 80;
tub_width = 65;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 45;
mesh_spacing = 2.5;
wire_diameter = 2;
union()
{
difference()
{
union()
{
//lip
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),2], center=false);
translate([cage_wall, cage_endwall, 2])
{
//insert
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),2], center=false);
}
}
translate([((tub_width-(spacing*3))/2)/2,cage_endwall+2,-3])
{
rotate([45,0,90])
{
//cavity for wire exit and cleat
cube(size = [((tub_length-(spacing*2))-(cage_endwall*2))-4,(sin(45)*6),(sin(45)*6)], center=false);
}
}
//hole for wire
translate([((tub_width-(spacing*3))/2)/2,(tub_length-(spacing*2))/2,-1])
{
cylinder(h = 6, r=wire_diameter/2);
}
}
//cleats
translate([(((tub_width-(spacing*3))/2)/2)-0,((tub_length-(spacing*2))/2)-(wire_diameter*1.5)-3,1.75])
{
mirror([0,0,1])
{
cleat();
}
}
translate([(((tub_width-(spacing*3))/2)/2)-0,((tub_length-(spacing*2))/2)+(wire_diameter*1.5)+3,1.75])
{
mirror([0,0,1])
{
mirror([0,1,0])
{
cleat();
}
}
}
}
////cleat module
module cleat()
{
difference()
{
cube(size=[2,8,3.5], center=true);
translate([-0.8,-2,-0.5])
{
rotate([0,-20,15])
{
cube(size=[2,15,5], center=true);
}
}
translate([0.8,-2,-0.5])
{
rotate([0,20,-15])
{
cube(size=[2,15,5], center=true);
}
}
translate([-1.5,4.5,-1])
{
rotate([45,0,0])
{
cube(size = [3,4,6]);
}
}
}
}
tub
single cell tub
height = 60;
oa_width = 80;
oa_length = 105;
outsidewall = 5;
basethickness = 5;
membranethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 40;
cage_wall = 10;
cage_base = 5;
difference()
{
cube(size = [oa_width, oa_length, height], center=false);
translate([outsidewall,outsidewall,basethickness])
cube(size = [oa_width-(outsidewall*2), oa_length-(outsidewall*2), height-basethickness], center=false);
}
tub with sphere divot
- incomplete
- spacer is versine
height = 80;
tub_width = 65;
tub_length = 90;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 60;
cage_wall = 7.5;
cage_endwall = 2;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_diameter = 2;
wire_holeoffc = 0;
lid_depthinto = 7;
divot_height = 5.5;
union()
{
//outerwalls
difference()
{
cube(size = [tub_width, tub_length, height], center=false);
translate([outsidewall,outsidewall,basethickness])
{
cube(size = [tub_width-(outsidewall*2), tub_length-(outsidewall*2), height-basethickness+1], center=false);
}
}
//end walls
//begin supports
//1
translate([(tub_width/2)-((spacing-1)/2),tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(10)])
{
divider();
}
//2
translate([(tub_width/2)-((spacing-1)/2),tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)])
{
divider();
}
//3
translate([(tub_width/2)-((spacing-1)/2),tub_wall+(tub_length-(outsidewall*2)),height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(10)])
{
mirror([0,1,0])
{
divider();
}
}
//4
translate([(tub_width/2)-((spacing-1)/2),tub_wall+(tub_length-(outsidewall*2)),height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)])
{
mirror([0,1,0])
{
divider();
}
}
//end supports
}
translate([5,-20,0])
{
tub_spacerdivot();
}
//divider modules
module divider()
{
difference()
{
union()
{
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]);
translate([0,0,(spacing+cage_endwall+2)*2])
{
rotate([0,45,0])
{
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]);
}
}
}
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]);
}
}
}
}
//end divider module
//////tub divot
module tub_spacerdivot()
{
difference()
{
translate([(spacing/(1-cos(45)))*sin(45),0,0])
{
sphere(r = (spacing/(1-cos(45))));
}
translate([(spacing/(1-cos(45))),0,0])
{
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true);
}
}
}
////end tub divot module
echo(spacing/(1-cos(45)));
grooves module
width=10;
height = 92;
tub_wallgroove = 1.5;
wall_length = 115;
////groove module
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift)
{
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2])
{
intersection()
{
intersection()
{
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)])
{
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift])
{
rotate([0,45,0])
{
rotate([0,0,45])
{
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true);
}
}
}
}
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2])
{
#cube(size = [groove_length,tub_wallgroove,groove_height]);
}
}
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0])
{
rotate([0,0,45])
{
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true);
}
}
}//end intersection
}
}
////end groove mdoule
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),height,tub_wallgrooveshift);
groove module with angle
- still buggy
height = 90;
tub_width = 36;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tub_wallgroovedepth = 1.5;
tub_wallgroovewidth = 10;
tub_wallgroovecorners = 4;
grooves_yn = 1; //1 yes 0 no
eyelets_rowside = 2;
eyelets_columnside = 3;
eyelets_belowtop = 10;
eyelets_walltoceneter = 5;
eyelets_od = 7;
eyelets_id = 3;
eyelets_width = 5;
tubs_rows = 4;
tubs_columns = 2;
spacing = 1.940055;
wall_spacers_yn = 0; //1 yes 0 no
center_dividers = 0; //1 yes 0 no
cage_height = 60;
cage_wall = 5.5;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
////groove module
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift,groove_angle)
{
translate([((cos(groove_angle)*((groove_height/cos(groove_angle))+((groove_width*tan(groove_angle))))))-height/2,-.0001,height/2]) //problem here
{
intersection()
{
intersection()
{
for(g = [(-(tan(groove_angle)*((groove_height/tan(groove_angle))+((groove_width*sin(groove_angle)*sin(groove_angle))*tan(groove_angle))))/groove_width/2) : (groove_length/groove_width/2)]) //got a problem here
{
translate([(g*groove_width*2)+(groove_width*sin(45)*cos(groove_angle)),0,groove_shift])
{
rotate([0,groove_angle,0])
{
rotate([0,0,45])
{
#cube(size = [groove_width*cos(groove_angle)*cos(45),groove_width*cos(groove_angle)*cos(45),(groove_height/cos(groove_angle))+(sin(groove_angle)*groove_width)+(abs(groove_shift/cos(groove_angle)*2))], center=true);
}
}
}
}
translate([(-groove_height/2)-(groove_width*sin(groove_angle)*sin(groove_angle)),0,-groove_height/2])
{
#cube(size = [groove_length,tub_wallgroove,groove_height]);
}
}
translate([((-groove_height/2)-(groove_width*sin(groove_angle)*sin(groove_angle)))+(groove_length/2),0,0])
{
rotate([0,0,45])
{
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true);
}
}
}//end intersection
}
}
////end groove mdoule
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),height,0,45);
cube(10);
groove module with angle - rework
- need to tweak so variable angle shifts top edge not bottom
height = 90;
tub_width = 36;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tub_wallgroovedepth = 1.5;
tub_wallgroovewidth = 10;
tub_wallgroovecorners = 4;
grooves_yn = 1; //1 yes 0 no
eyelets_rowside = 2;
eyelets_columnside = 3;
eyelets_belowtop = 10;
eyelets_walltoceneter = 5;
eyelets_od = 7;
eyelets_id = 3;
eyelets_width = 5;
tubs_rows = 4;
tubs_columns = 2;
spacing = 1.940055;
wall_spacers_yn = 0; //1 yes 0 no
center_dividers = 0; //1 yes 0 no
cage_height = 60;
cage_wall = 5.5;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift,groove_angle)
intersection()
{
for(g = [0 : 2+((groove_length/groove_width)+((tan(groove_angle)*groove_height)/groove_width))/2])
{
translate([(g*groove_width*2),0,groove_shift])
{
translate([(sin(groove_angle)*(-((groove_height/cos(groove_angle))+(sin(groove_angle)*groove_width)+(abs(groove_shift/cos(groove_angle)*2)))/2))-((groove_width*cos(groove_angle)*cos(45))*sin(45)*cos(groove_angle)),0,groove_height/2])
{
rotate([0,groove_angle,0])
{
rotate([0,0,45])
{
#cube(size = [groove_width*cos(groove_angle)*cos(45),groove_width*cos(groove_angle)*cos(45),(groove_height/cos(groove_angle))+(sin(groove_angle)*groove_width)+(abs(groove_shift/cos(groove_angle)*2))], center=true);
}
}
}
}
}
#cube(size = [groove_length,tub_wallgroove,groove_height]);
translate([groove_length/2,0,groove_height/2])
{
rotate([0,0,45])
{
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true);
}
}
}//end module
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),height,0,45);
cube(10);
tub with grooves
height = 90;
tub_width = 36;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tub_wallgroovedepth = 1.5;
tub_wallgroovewidth = 15;
tub_wallgroovecorners =4;
grooves_yn = 1; //1 yes 0 no
tubs_rows = 2;
tubs_columns = 2;
spacing = 1.940055;
wall_spacers_yn = 0; //1 yes 0 no
center_dividers = 0; //1 yes 0 no
cage_height = 60;
cage_wall = 5.5;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
difference()
{
union()
{
//tubs
for (c = [0 : tubs_columns-1])
{
translate([0,c*(tub_length+tub_wall),0])
{
for (r = [0 : tubs_rows-1])
{
translate([r*(tub_width+tub_wall),0,0])
{
tub();
}
}
}
}
//end tubs
//outer walls
translate([-tub_outsidewall+tub_wall,-tub_outsidewall+tub_wall,0])
{
difference()
{
cube(size = [((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall,height]);
translate([tub_outsidewall,tub_outsidewall,0])
{
#cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]);
}
}
}
//end outer walls
} //end union
////grooves
//1
rotate([0,0,0])
{
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height);
}
}
//2
rotate([0,0,90])
{
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0])
{
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height);
}
}
//3
rotate([0,0,180])
{
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0])
{
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height);
}
}
//4
rotate([0,0,270])
{
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0])
{
#if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height);
}
}
////end grooves
} //end difference
//////end render
//////begin modules
////tub module
module tub()
{
union()
{
//walls
difference()
{
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false);
translate([tub_wall,tub_wall,basethickness])
{
cube(size = [tub_width, tub_length, height-basethickness+1], center=false);
}
}
//end walls
//spheres lock ins
//1
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//2
translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//3
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//4
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//5
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,1,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//6
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//end spheres
//begin spacers
//1
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_wall,cage_height*4/5])
{
if (center_dividers==1) divider();
}
//2
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)])
{
if (center_dividers==1) divider();
}
//3
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_length+tub_wall,cage_height*4/5])
{
mirror([0,1,0])
{
if (center_dividers==1) divider();
}
}
//4
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_length+tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)])
{
mirror([0,1,0])
{
if (center_dividers==1) divider();
}
}
//the end_wall's side spacers
//s1
translate([(tub_width+(tub_wall*2))*1/4,tub_wall,(cage_height/2)+basethickness])
{
rotate([0,0,90])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//s2
translate([(tub_width+(tub_wall*2))*3/4,tub_wall,(cage_height/2)+basethickness])
{
rotate([0,0,90])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//s3
translate([(tub_width+(tub_wall*2))*1/4,tub_wall+tub_length,(cage_height/2)+basethickness])
{
rotate([0,0,270])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//s4
translate([(tub_width+(tub_wall*2))*3/4,tub_wall+tub_length,(cage_height/2)+basethickness])
{
rotate([0,0,270])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//walls spacers
//w1
translate([tub_wall,(tub_length+(tub_wall*2))/2,(cage_height/2)+basethickness])
{
rotate([0,0,0])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//w2
translate([(tub_width+tub_wall),(tub_length+(tub_wall*2))/2,(cage_height/2)+basethickness])
{
rotate([0,0,180])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//base spacers
//b1
translate([(tub_width+(tub_wall*2))/2,(tub_length+(tub_wall*2))*1/5,basethickness])
{
rotate([0,270,90])
{
tub_spacer(tub_width-(spacing*2));
}
}
//b2
translate([(tub_width+(tub_wall*2))/2,(tub_length+(tub_wall*2))*4/5,basethickness])
{
rotate([0,270,90])
{
tub_spacer(tub_width-(spacing*2));
}
}
//end spacers
}
}
////end tub module
//divider modules
module divider()
{
difference()
{
union()
{
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]);
translate([0,0,(spacing+cage_endwall+2)*2])
{
rotate([0,45,0])
{
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]);
}
}
}
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]);
}
}
}
}
//end divider module
//spacer module
module tub_spacer(length)
{
translate([-(spacing-1),-length/2,0])
{
difference()
{
rotate([0,45,0])
{
cube(size = [((spacing-1)/sin(45)),length,((spacing-1)/sin(45))]);
}
translate([-(spacing-1)-0.1,0,-(spacing-1)])
{
#cube(size = [((spacing-1)/sin(45))/sin(45),length,((spacing-1)/sin(45))/sin(45)]);
}
}
}
}
//end spacer
//divot
module divot_sphere()
{
difference()
{
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (tub_divot_height/2)/sin(45));
}
translate([(tub_divot_height/2)/sin(45),0,0])
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true);
}
}
//end divot module
////groove module
module grooves(tub_wallgroove,groove_width,groove_length,groove_height)
{
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2])
{
intersection()
{
intersection()
{
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)])
{
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,0])
{
rotate([0,45,0])
{
rotate([0,0,45])
{
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),(groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))], center=true);
}
}
}
}
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2])
{
#cube(size = [groove_length,tub_wallgroove,groove_height]);
}
}
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0])
{
rotate([0,0,45])
{
#cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true);
}
}
}//end intersection
}
}
////end groove mdoule
////calculations
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto);
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall);
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall);
echo("tub print area z",height);
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2));
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2));
echo("cage cavity z",cage_height-cage_base);
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3");
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams");
tub with grooves and eyelets
height = 90;
tub_width = 36;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tub_wallgroovedepth = 1.5;
tub_wallgroovewidth = 15;
tub_wallgroovecorners =4;
grooves_yn = 1; //1 yes 0 no
eyelets_rowside = 2;
eyelets_columnside = 3;
eyelets_belowtop = 10;
eyelets_walltoceneter = 5;
eyelets_od = 7;
eyelets_id = 3;
eyelets_width = 5;
tubs_rows = 4;
tubs_columns = 2;
spacing = 1.940055;
wall_spacers_yn = 0; //1 yes 0 no
center_dividers = 0; //1 yes 0 no
cage_height = 60;
cage_wall = 5.5;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
union()//eyelets
{
difference()//grooves
{
union()
{
//tubs
for (c = [0 : tubs_columns-1])
{
translate([0,c*(tub_length+tub_wall),0])
{
for (r = [0 : tubs_rows-1])
{
translate([r*(tub_width+tub_wall),0,0])
{
tub();
}
}
}
}
//end tubs
//outer walls
translate([-tub_outsidewall+tub_wall,-tub_outsidewall+tub_wall,0])
{
difference()
{
cube(size = [((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall,height]);
translate([tub_outsidewall,tub_outsidewall,0])
{
cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]);
}
}
}
//end outer walls
} //end union
////grooves
//1
rotate([0,0,0])
{
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,0);
}
}
//2
rotate([0,0,90])
{
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
}
}
//3
rotate([0,0,180])
{
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))));
}
}
//4
rotate([0,0,270])
{
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,0);
}
}
////end grooves
} //end difference
//begin eyelets
//1 rowside
translate([(tub_wall-tub_outsidewall),(tub_wall-tub_outsidewall)-eyelets_walltoceneter,height-eyelets_belowtop])
{
for (e = [1:eyelets_rowside])
{
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0])
{
rotate([0,0,180])
{
eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2));
}
}
}
}
//2
//3
translate([(tub_wall-tub_outsidewall),((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2),height-eyelets_belowtop])
{
for (e = [1:eyelets_rowside])
{
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0])
{
rotate([0,0,0])
{
#eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2));
}
}
}
}
//4
//end eyelets
} //end union
//////end render
//////begin modules
////tub module
module tub()
{
union()
{
//walls
difference()
{
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false);
translate([tub_wall,tub_wall,basethickness])
{
cube(size = [tub_width, tub_length, height-basethickness+1], center=false);
}
}
//end walls
//spheres lock ins
//1
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//2
translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//3
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//4
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//5
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,1,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//6
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//end spheres
//begin spacers
//1
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_wall,cage_height*4/5])
{
if (center_dividers==1) divider();
}
//2
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)])
{
if (center_dividers==1) divider();
}
//3
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_length+tub_wall,cage_height*4/5])
{
mirror([0,1,0])
{
if (center_dividers==1) divider();
}
}
//4
translate([((tub_width+(tub_wall*2))/2)-((spacing-1)/2),tub_length+tub_wall,height-((spacing+cage_endwall+2)*2)-(sin(45)*(sin(45)*(spacing-1)))-(height*5/8)])
{
mirror([0,1,0])
{
if (center_dividers==1) divider();
}
}
//the end_wall's side spacers
//s1
translate([(tub_width+(tub_wall*2))*1/4,tub_wall,(cage_height/2)+basethickness])
{
rotate([0,0,90])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//s2
translate([(tub_width+(tub_wall*2))*3/4,tub_wall,(cage_height/2)+basethickness])
{
rotate([0,0,90])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//s3
translate([(tub_width+(tub_wall*2))*1/4,tub_wall+tub_length,(cage_height/2)+basethickness])
{
rotate([0,0,270])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//s4
translate([(tub_width+(tub_wall*2))*3/4,tub_wall+tub_length,(cage_height/2)+basethickness])
{
rotate([0,0,270])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//walls spacers
//w1
translate([tub_wall,(tub_length+(tub_wall*2))/2,(cage_height/2)+basethickness])
{
rotate([0,0,0])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//w2
translate([(tub_width+tub_wall),(tub_length+(tub_wall*2))/2,(cage_height/2)+basethickness])
{
rotate([0,0,180])
{
if (wall_spacers_yn==1) tub_spacer(8);
}
}
//base spacers
//b1
translate([(tub_width+(tub_wall*2))/2,(tub_length+(tub_wall*2))*1/5,basethickness])
{
rotate([0,270,90])
{
tub_spacer(tub_width-(spacing*2));
}
}
//b2
translate([(tub_width+(tub_wall*2))/2,(tub_length+(tub_wall*2))*4/5,basethickness])
{
rotate([0,270,90])
{
tub_spacer(tub_width-(spacing*2));
}
}
//end spacers
}
}
////end tub module
//divider modules
module divider()
{
difference()
{
union()
{
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]);
translate([0,0,(spacing+cage_endwall+2)*2])
{
rotate([0,45,0])
{
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]);
}
}
}
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]);
}
}
}
}
//end divider module
//spacer module
module tub_spacer(length)
{
translate([-(spacing-1),-length/2,0])
{
difference()
{
rotate([0,45,0])
{
cube(size = [((spacing-1)/sin(45)),length,((spacing-1)/sin(45))]);
}
translate([-(spacing-1)-0.1,0,-(spacing-1)])
{
#cube(size = [((spacing-1)/sin(45))/sin(45),length,((spacing-1)/sin(45))/sin(45)]);
}
}
}
}
//end spacer
//divot
module divot_sphere()
{
difference()
{
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (tub_divot_height/2)/sin(45));
}
translate([(tub_divot_height/2)/sin(45),0,0])
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true);
}
}
//end divot module
////groove module
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift)
{
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2])
{
intersection()
{
intersection()
{
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)])
{
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift])
{
rotate([0,45,0])
{
rotate([0,0,45])
{
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true);
}
}
}
}
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2])
{
#cube(size = [groove_length,tub_wallgroove,groove_height]);
}
}
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0])
{
rotate([0,0,45])
{
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true);
}
}
}//end intersection
}
}
////end groove mdoule
////begin eyelet module
module eyelet(od,id,eyelet_width,standoff)
{
translate([-eyelet_width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder
{
difference()
{
union()
{
translate([0,standoff,standoff])
{
cube(size=[eyelet_width,od,(od/2)+od]);
}
translate([0,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = od/2,h = eyelet_width, $fn=60);
}
}
translate([0,0,0])
{
cube(size=[eyelet_width,(od/2)+standoff,((od)+od)+standoff]);
}
}
translate([-1,eyelet_width+2,-(((eyelet_width+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
#cube(size=[eyelet_width+2,((od+standoff+2)/sin(45)),((eyelet_width+2)/sin(45))]);
}
}
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = id/2,h = eyelet_width+2, $fn=60);
}
}
}
}
}
////end eyelet module
////calculations
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto);
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall);
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall);
echo("tub print area z",height);
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2));
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2));
echo("cage cavity z",cage_height-cage_base);
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3");
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams");
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth)-floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth))*tub_wallgroovewidth)+tub_wallgroovewidth));
//2
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
//3
echo((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
//2+3
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth));
//(2+3)/absfloor
echo((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))));
//3
echo((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))));
tub with grooves eyelits slidelocks
update 20150120
in progress. needs updated grooves.
height = 90;
tub_width = 36;
tub_length = 70;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tub_wallgroovedepth = 1.5;
tub_wallgroovewidth = 15;
tub_wallgroovecorners =4;
grooves_yn = 1; //1 yes 0 no
eyelets_rowside = 2;
eyelets_columnside = 3;
eyelets_belowtop = 10;
eyelets_walltoceneter = 5;
eyelets_od = 7;
eyelets_id = 3;
eyelets_width = 5;
tubs_rows = 1;
tubs_columns = 1;
spacing = 1.940055;
wall_spacers_yn = 0; //1 yes 0 no
center_dividers = 0; //1 yes 0 no
cage_height = 60;
cage_wall = 5.5;
cage_endwall = 2;
cage_base = 5;
mesh_opening = 1.5 ;
mesh_angle = 45;
mesh_spacing = 3.5;
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
union()//eyelets
{
difference()//grooves
{
union()
{
//tubs
for (c = [0 : tubs_columns-1])
{
translate([0,c*(tub_length+tub_wall),0])
{
for (r = [0 : tubs_rows-1])
{
translate([r*(tub_width+tub_wall),0,0])
{
tub();
}
}
}
}
//end tubs
//outer walls
translate([-tub_outsidewall+tub_wall,-tub_outsidewall+tub_wall,0])
{
difference()
{
cube(size = [((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall,height]);
translate([tub_outsidewall,tub_outsidewall,0])
{
cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]);
}
}
}
//end outer walls
} //end union
////grooves
//1
rotate([0,0,0])
{
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,0);
}
}
//2
rotate([0,0,90])
{
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
}
}
//3
rotate([0,0,180])
{
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))));
}
}
//4
rotate([0,0,270])
{
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,0);
}
}
////end grooves
} //end difference
//begin eyelets
//1 rowside
translate([(tub_wall-tub_outsidewall),(tub_wall-tub_outsidewall)-eyelets_walltoceneter,height-eyelets_belowtop])
{
for (e = [1:eyelets_rowside])
{
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0])
{
rotate([0,0,180])
{
eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2));
}
}
}
}
//2
//3
translate([(tub_wall-tub_outsidewall),((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2),height-eyelets_belowtop])
{
for (e = [1:eyelets_rowside])
{
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0])
{
rotate([0,0,0])
{
#eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2));
}
}
}
}
//4
//end eyelets
} //end union
//////end render
//////begin modules
////tub module
module tub()
{
union()
{
//walls
difference()
{
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false);
translate([tub_wall,tub_wall,basethickness])
{
cube(size = [tub_width, tub_length, height-basethickness+1], center=false);
}
}
//end walls
//spheres lock ins
//1
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//2
translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//3
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//4
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//5
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,1,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//6
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//end spheres
//begin locks
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
#slidelock(spacing);
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
#slidelock(spacing);
}
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelock(spacing);
}
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelock(spacing);
}
}
////upper lock rails
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
#slidelockupper(spacing);
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
#slidelockupper(spacing);
}
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelockupper(spacing);
}
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelockupper(spacing);
}
}
//end locks
}
}
////end tub module
//divider modules
module divider()
{
difference()
{
union()
{
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]);
translate([0,0,(spacing+cage_endwall+2)*2])
{
rotate([0,45,0])
{
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]);
}
}
}
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]);
}
}
}
}
//end divider module
//spacer module
module tub_spacer(length)
{
translate([-(spacing-1),-length/2,0])
{
difference()
{
rotate([0,45,0])
{
cube(size = [((spacing-1)/sin(45)),length,((spacing-1)/sin(45))]);
}
translate([-(spacing-1)-0.1,0,-(spacing-1)])
{
#cube(size = [((spacing-1)/sin(45))/sin(45),length,((spacing-1)/sin(45))/sin(45)]);
}
}
}
}
//end spacer
//divot
module divot_sphere()
{
difference()
{
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (tub_divot_height/2)/sin(45));
}
translate([(tub_divot_height/2)/sin(45),0,0])
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true);
}
}
//end divot module
////groove module
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift)
{
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2])
{
intersection()
{
intersection()
{
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)])
{
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift])
{
rotate([0,45,0])
{
rotate([0,0,45])
{
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true);
}
}
}
}
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2])
{
#cube(size = [groove_length,tub_wallgroove,groove_height]);
}
}
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0])
{
rotate([0,0,45])
{
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true);
}
}
}//end intersection
}
}
////end groove mdoule
////begin eyelet module
module eyelet(od,id,eyelet_width,standoff)
{
translate([-eyelet_width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder
{
difference()
{
union()
{
translate([0,standoff,standoff])
{
cube(size=[eyelet_width,od,(od/2)+od]);
}
translate([0,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = od/2,h = eyelet_width, $fn=60);
}
}
translate([0,0,0])
{
cube(size=[eyelet_width,(od/2)+standoff,((od)+od)+standoff]);
}
}
translate([-1,eyelet_width+2,-(((eyelet_width+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
#cube(size=[eyelet_width+2,((od+standoff+2)/sin(45)),((eyelet_width+2)/sin(45))]);
}
}
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = id/2,h = eyelet_width+2, $fn=60);
}
}
}
}
}
////end eyelet module
////calculations
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto);
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall);
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall);
echo("tub print area z",height);
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2));
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2));
echo("cage cavity z",cage_height-cage_base);
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3");
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams");
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth)-floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth))*tub_wallgroovewidth)+tub_wallgroovewidth));
//2
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
//3
echo((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
//2+3
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth));
//(2+3)/absfloor
echo((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))));
//3
echo((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))));
//slidelocking module
module slidelock(spacing)
{
difference()
{
translate([0,-spacing,0]) //translate all
{
//left
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate left
}//end translate left
//right
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate right
}//end translate right
//bottom
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([90,45,90])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate bottom
}//end translate bottom
//bump
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,spacing*(2/5),((spacing/(1-cos(45)))*cos(45))-spacing*(2/5)])//set bump fraction
{
rotate([90,45,90])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate bump
}//end translate bump
}//end translate all
//trim left
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate left
}//end translate left
//trim right
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate right
}//end translate right
//trim back
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2])
{
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true);
}
}//end difference
}///end slidelocking module
//slidelocking module
module slidelockupper(spacing)
{
difference()
{
translate([0,-spacing,0]) //translate all
{
//left
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate left
}//end translate left
//right
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate right
}//end translate right
}//end translate all
//trim left
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate left
}//end translate left
//trim right
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate right
}//end translate right
//trim back
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2])
{
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true);
}
}//end difference
}///end slidelocking module
//divot by depth module
module divot_sphere_d()
{
translate([0,0,0])
{
difference()
{
translate([(spacing/(1-cos(45)))*sin(45),0,0])
{
sphere(r = (spacing/(1-cos(45))));
}
translate([(spacing/(1-cos(45))),0,0])
{
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true);
}
}
}
}
//end divot module
//divot by height
module divot_sphere()
{
difference()
{
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (tub_divot_height/2)/sin(45));
}
translate([(tub_divot_height/2)/sin(45),0,0])
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true);
}
}
//end divot
target width to actual width
chooses a width that allows for the grooves to align
still need to integrate into tub scad
tub_wallgroovewidthactual=((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*round(((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*tub_wallgroovewidth)));
echo("groove width=",tub_wallgroovewidthactual);
rounded corners
updated 20151001
- grooves messed up :(
height = 160;
tub_width = 38;
tub_length = 88;
basethickness = 5;
tub_wall = 2;
tub_outsidewall = 4;
tub_wallgroovedepth = 2;
tub_wallgroovewidth = 15;
tub_wallgroovecorners =08;
tub_wallgrooveshift = 0; //-0.5 1st try, messes up groove matchup
grooves_yn = 1; //1 yes 0 no
eyelets_rowside = 2;
eyelets_columnside = 3;
eyelets_belowtop = 10;
eyelets_walltoceneter = 5;
eyelets_od = 7;
eyelets_id = 3;
eyelets_width = 5;
tubs_rows = 1;
tubs_columns = 1;
spacing = 1.940055;
wall_spacers_yn = 0; //1 yes 0 no
center_dividers = 0; //1 yes 0 no
cage_height = 120;
cage_wall = 7;
cage_endwall = 2;
cage_base = 4;
mesh_opening = 1.875 ;
mesh_angle = 50;
mesh_spacing = 4.1;
wire_diameter = 2;
wire_holeoffc = 0;
cage_lid_depthinto = 7;
cage_divot_height = 5.5;
tub_lid_depthinto = 7;
tub_divot_height = 5.5;
//*******************************************
tub_wallgroovewidthactual=((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*round(((2*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners))+(2*(tub_length+(2*tub_outsidewall)-tub_wallgroovecorners)))/(2*tub_wallgroovewidth)));
echo("groove width=",tub_wallgroovewidthactual);
echo(tan(45)*(tub_width+(2*tub_outsidewall)-tub_wallgroovecorners)
-(floor((tub_width+(2*tub_outsidewall)-tub_wallgroovecorners)/tub_wallgroovewidthactual)*tub_wallgroovewidthactual));
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual);
echo((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners);
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidthactual)*tub_wallgroovewidthactual)));
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))-((2*tub_wallgroovewidthactual)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))/(2*tub_wallgroovewidthactual))))));
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))
;
union()//eyelets
{
difference()//grooves
{
union()
{
//tubs
for (c = [0 : tubs_columns-1])
{
translate([0,c*(tub_length+tub_wall),0])
{
for (r = [0 : tubs_rows-1])
{
translate([r*(tub_width+tub_wall),0,0])
{
tub();
}
}
}
}
//end tubs
//outer walls
translate([-tub_outsidewall+tub_wall+(tub_wallgroovecorners/2),-tub_outsidewall+tub_wall+(tub_wallgroovecorners/2),0])
{
difference()
{
$fn=50;
minkowski()
{
cube(size = [(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,(((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height-1]);
cylinder(r=(tub_wallgroovecorners/2),h=(1));
}
translate([tub_outsidewall-(tub_wallgroovecorners/2),tub_outsidewall-(tub_wallgroovecorners/2),0])
{
cube(size = [(((tub_width+tub_wall)*tubs_rows)+tub_wall)-(tub_wall*2),(((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2),height+1]);
}
}
}
//end outer walls
} //end union
////grooves
//1
rotate([0,0,0])
{
translate([tub_wall-tub_outsidewall+(tub_wallgroovecorners/2),tub_wall-tub_outsidewall,0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidthactual,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,0);
}
}
//2
rotate([0,0,90])
{
translate([(tub_wall-tub_outsidewall)+(tub_wallgroovecorners/2),-(tub_wall-tub_outsidewall)-(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidthactual,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))-(tub_wallgrooveshift*1));
}
}
//3
rotate([0,0,180])
{
translate([-(tub_wall-tub_outsidewall)-(tub_wallgroovecorners/2)-((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners),-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2)),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidthactual,(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners,height,((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))-((2*tub_wallgroovewidthactual)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))/(2*tub_wallgroovewidthactual)))))-(tub_wallgrooveshift*2));
}
}
//4
rotate([0,0,270])
{
translate([-tub_wall-tub_outsidewall-((((tub_length+tub_wall)*tubs_columns)+tub_wall)-(tub_wall*2))+(tub_wallgroovecorners/2),(tub_wall-tub_outsidewall),0])
{
if(grooves_yn==1)grooves(tub_wallgroovedepth,tub_wallgroovewidth,((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall-tub_wallgroovecorners,height,((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)
+
((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-
(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)
+
((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))
-
((2*tub_wallgroovewidthactual)
*
floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)
+
((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-
(2*tub_wallgroovewidthactual*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual)
+
((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-
(2*tub_wallgroovewidthactual*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-
tub_wallgroovecorners)/(2*tub_wallgroovewidthactual))))-tub_wallgroovewidthactual))
/
(2*tub_wallgroovewidthactual)))))-(tub_wallgrooveshift*3));
}
}
////end grooves
} //end difference
//begin eyelets
//1 rowside
translate([(tub_wall-tub_outsidewall),(tub_wall-tub_outsidewall)-eyelets_walltoceneter,height-eyelets_belowtop])
{
for (e = [1:eyelets_rowside])
{
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0])
{
rotate([0,0,180])
{
eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2));
}
}
}
}
//2
//3
translate([(tub_wall-tub_outsidewall),((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2),height-eyelets_belowtop])
{
for (e = [1:eyelets_rowside])
{
translate([(((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)/(eyelets_rowside+1)*e,0,0])
{
rotate([0,0,0])
{
#eyelet(eyelets_od,eyelets_id,eyelets_width,tub_wallgroovedepth+eyelets_walltoceneter-(eyelets_od/2));
}
}
}
}
//4
//end eyelets
} //end union
//////end render
//////begin modules
////tub module
module tub()
{
union()
{
//walls
difference()
{
cube(size = [tub_width+(tub_wall*2), tub_length+(tub_wall*2), height], center=false);
translate([tub_wall+spacing,tub_wall+spacing,basethickness])
{
$fn=50;
minkowski()
{
cube(size = [tub_width-(spacing*2), tub_length-(spacing*2), height-basethickness+1-1], center=false);
cylinder(r=spacing,h=1);
}
}
}
//end walls
//spheres lock ins
//1
translate([tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
#divot_sphere();
}
}
//2
translate([tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([1,0,0])
{
divot_sphere();
}
}
//3
translate([tub_width+tub_wall,(tub_length*1/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//4
translate([tub_width+tub_wall,(tub_length*3/4)+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
divot_sphere();
}
}
//5
translate([(tub_width*1/2)+tub_wall,tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,1,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//6
translate([(tub_width*1/2)+tub_wall,tub_length+tub_wall,height-(((tub_lid_depthinto-tub_divot_height)/2)+(tub_divot_height/2))])
{
mirror([0,0,0])
{
rotate([0,0,90])
{
#divot_sphere();
}
}
}
//end spheres
//begin locks
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
#slidelock(spacing);
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
#slidelock(spacing);
}
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelock(spacing);
}
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,basethickness+spacing+(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelock(spacing);
}
}
////upper lock rails
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
#slidelockupper(spacing);
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_length+tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
#slidelockupper(spacing);
}
translate([(spacing/4)+(tub_width*1/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelockupper(spacing);
}
}
translate([(-spacing/4)+(tub_width*3/4)+tub_wall,tub_wall,cage_height+basethickness+spacing-(((tub_width-(spacing*3))/2)/2)])
{
mirror([0,1,0])
{
#slidelockupper(spacing);
}
}
//end locks
}
}
////end tub module
//divider modules
module divider()
{
difference()
{
union()
{
cube(size=[spacing-1,spacing+cage_endwall+2,(spacing+cage_endwall+2)*2]);
translate([0,0,(spacing+cage_endwall+2)*2])
{
rotate([0,45,0])
{
cube(size=[(sin(45)*(spacing-1)),spacing+cage_endwall+2,(sin(45)*(spacing-1))]);
}
}
}
translate([0,spacing+cage_endwall+2,-(((spacing+cage_endwall+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
cube(size=[spacing-1,((spacing+cage_endwall+2)/sin(45)),((spacing+cage_endwall+2)/sin(45))]);
}
}
}
}
//end divider module
//spacer module
module tub_spacer(length)
{
translate([-(spacing-1),-length/2,0])
{
difference()
{
rotate([0,45,0])
{
cube(size = [((spacing-1)/sin(45)),length,((spacing-1)/sin(45))]);
}
translate([-(spacing-1)-0.1,0,-(spacing-1)])
{
#cube(size = [((spacing-1)/sin(45))/sin(45),length,((spacing-1)/sin(45))/sin(45)]);
}
}
}
}
//end spacer
//divot
module divot_sphere()
{
difference()
{
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (tub_divot_height/2)/sin(45));
}
translate([(tub_divot_height/2)/sin(45),0,0])
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true);
}
}
//end divot module
////groove module
module grooves(tub_wallgroove,groove_width,groove_length,groove_height,groove_shift)
{
translate([((cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))))-height/2,-.0001,height/2])
{
intersection()
{
intersection()
{
for(g = [(-(cos(45)*((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45))))/groove_width/2) : (groove_length/groove_width/2)])
{
translate([(g*groove_width*2)+(groove_width*sin(45)*sin(45)),0,groove_shift])
{
rotate([0,45,0])
{
rotate([0,0,45])
{
#cube(size = [groove_width*sin(45)*sin(45),groove_width*sin(45)*sin(45),((groove_height/sin(45))+((groove_width*sin(45)*sin(45))/cos(45)))+(abs(groove_shift/cos(45)*2))], center=true);
}
}
}
}
translate([(-groove_height/2)-(groove_width*sin(45)*sin(45)),0,-groove_height/2])
{
#cube(size = [groove_length,tub_wallgroove,groove_height]);
}
}
translate([((-groove_height/2)-(groove_width*sin(45)*sin(45)))+(groove_length/2),0,0])
{
rotate([0,0,45])
{
cube(size = [groove_length*cos(45),groove_length*cos(45),groove_height],center=true);
}
}
}//end intersection
}
}
////end groove mdoule
////begin eyelet module
module eyelet(od,id,eyelet_width,standoff)
{
translate([-eyelet_width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder
{
difference()
{
union()
{
translate([0,standoff,standoff])
{
cube(size=[eyelet_width,od,(od/2)+od]);
}
translate([0,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = od/2,h = eyelet_width, $fn=60);
}
}
translate([0,0,0])
{
cube(size=[eyelet_width,(od/2)+standoff,((od)+od)+standoff]);
}
}
translate([-1,eyelet_width+2,-(((eyelet_width+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
#cube(size=[eyelet_width+2,((od+standoff+2)/sin(45)),((eyelet_width+2)/sin(45))]);
}
}
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = id/2,h = eyelet_width+2, $fn=60);
}
}
}
}
}
////end eyelet module
////calculations
echo("space above cages for extra fluid is", height-basethickness-spacing-cage_height-tub_lid_depthinto);
echo("tub print area x",((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall);
echo("tub print area y",((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall);
echo("tub print area z",height);
echo("cage cavity y",((tub_width-(spacing*3))/2)-(cage_wall*2));
echo("cage cavity x",(tub_length-(spacing*2))-(cage_endwall*2));
echo("cage cavity z",cage_height-cage_base);
echo("powder volume per cage",((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10,"cm3");
echo("grams nickle hydroxide per cage",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10),"grams");//density is 4.10
echo("total grams nickle hydroxide",(((((tub_width-(spacing*3))/2)-(cage_wall*2)))/10*(((tub_length-(spacing*2))-(cage_endwall*2)))/10*(cage_height-cage_base-cage_lid_depthinto)/10)*(4.10)*(tubs_columns*tubs_rows),"grams");
echo(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth)-floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/tub_wallgroovewidth))*tub_wallgroovewidth)+tub_wallgroovewidth));
//2
echo((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
//3
echo((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth);
//2+3
echo(((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth));
//(2+3)/absfloor
echo((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth))));
//3
echo((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))-((2*tub_wallgroovewidth)*floor(((((((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_width+tub_wall)*tubs_rows)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth)+((((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)-(2*tub_wallgroovewidth*floor(((((tub_length+tub_wall)*tubs_columns)+(tub_outsidewall*2)-tub_wall)-tub_wallgroovecorners)/(2*tub_wallgroovewidth))))-tub_wallgroovewidth))/(2*tub_wallgroovewidth)))));
//slidelocking module
module slidelock(spacing)
{
difference()
{
translate([0,-spacing,0]) //translate all
{
//left
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate left
}//end translate left
//right
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate right
}//end translate right
//bottom
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([90,45,90])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate bottom
}//end translate bottom
//bump
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,spacing*(2/5),((spacing/(1-cos(45)))*cos(45))-spacing*(2/5)])//set bump fraction
{
rotate([90,45,90])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate bump
}//end translate bump
}//end translate all
//trim left
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate left
}//end translate left
//trim right
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate right
}//end translate right
//trim back
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2])
{
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true);
}
}//end difference
}///end slidelocking module
//slidelocking module
module slidelockupper(spacing)
{
difference()
{
translate([0,-spacing,0]) //translate all
{
//left
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate left
}//end translate left
//right
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate right
}//end translate right
}//end translate all
//trim left
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate left
}//end translate left
//trim right
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate right
}//end translate right
//trim back
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2])
{
cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true);
//trim bottom
translate([0,(-((spacing/(1-cos(45)))*2)/2)-spacing,(-(spacing/(1-cos(45)))*cos(45))-1])
{
rotate([90,45,90])
{
#cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2],center=true);
}//end rotate bottom
}//end translate bottom
}
}//end difference
}///end slidelocking module
//divot by depth module
module divot_sphere_d()
{
translate([0,0,0])
{
difference()
{
translate([(spacing/(1-cos(45)))*sin(45),0,0])
{
sphere(r = (spacing/(1-cos(45))));
}
translate([(spacing/(1-cos(45))),0,0])
{
cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true);
}
}
}
}
//end divot module
//divot by height
module divot_sphere()
{
difference()
{
translate([(tub_divot_height/2)/sin(45)*sin(45),0,0])
{
sphere(r = (tub_divot_height/2)/sin(45));
}
translate([(tub_divot_height/2)/sin(45),0,0])
cube(size = [((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2),((tub_divot_height/2)/sin(45)*2)], center=true);
}
}
//end divot
tub cells lid
tub main lid
eyelet module
module eyelet(od,id,width,standoff)
{
translate([-width/2,-(od/2)-standoff,-((od)+od)-standoff+(od/2)])//orgin set at the center of hole cylinder
{
difference()
{
union()
{
translate([0,standoff,standoff])
{
cube(size=[width,od,(od/2)+od]);
}
translate([0,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = od/2,h = width, $fn=60);
}
}
translate([0,0,0])
{
cube(size=[width,(od/2)+standoff,((od)+od)+standoff]);
}
}
translate([-1,width+2,-(((width+2)/sin(45))/sin(45))/2])
{
rotate([45,0,0])
{
#cube(size=[width+2,((od+standoff+2)/sin(45)),((width+2)/sin(45))]);
}
}
translate([-1,((od)/2)+standoff,((od/2)+od)+standoff])
{
rotate([0,90,0])
{
cylinder(r = id/2,h = width+2, $fn=60);
}
}
}
}
}
eyelet(5,2,2,5);
locks
slide divot lock
updated 20150113
spacing = 5;
slidelock(spacing);
module slidelock(spacing)
{
difference()
{
translate([0,-spacing,0]) //translate all
{
//left
translate([-(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate left
}//end translate left
//right
translate([(spacing/(1-cos(45)))*cos(45),0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([0,0,45])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate right
}//end translate right
//bottom
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,0,-(spacing/(1-cos(45)))*cos(45)])
{
rotate([90,45,90])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate bottom
}//end translate bottom
//bump
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,spacing*(2/5),((spacing/(1-cos(45)))*cos(45))-spacing*(2/5)])//set bump fraction
{
rotate([90,45,90])
{
cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+spacing*2]);
}//end rotate bump
}//end translate bump
}//end translate all
//trim left
translate([(-(spacing/(1-cos(45)))*cos(45))-spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
#cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate left
}//end translate left
//trim right
translate([((spacing/(1-cos(45)))*cos(45))+spacing,-spacing*2,(-(spacing/(1-cos(45)))*cos(45))-spacing-1])
{
rotate([0,0,45])
{
#cube(size = [(spacing/sin(45)),(spacing/sin(45)),((spacing/(1-cos(45)))*cos(45)*2)+(spacing*2)+spacing+2]);
}//end rotate right
}//end translate right
//trim back
translate([0,((spacing/(1-cos(45)))*2)/2,spacing/2])
{
#cube(size = [((spacing/(1-cos(45)))*2)+1,((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)+spacing+1], center=true);
}
}//end difference
//divot by depth module
module divot_sphere(slider_divot_height)
translate([spacing,0,0])
{
{
difference()
{
translate([(spacing/(1-cos(45)))*sin(45),0,0])
{
#sphere(r = (spacing/(1-cos(45))));
}
translate([(spacing/(1-cos(45))),0,0])
#cube(size = [((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2),((spacing/(1-cos(45)))*2)], center=true);
}
}
}
//end divot module
}
sphere lock in divot
height = 60;
tub_width = 95;
tub_length = 70;
outsidewall = 5;
basethickness = 5;
tub_wall = 5;
spacing = 5;
cage_height = 40;
cage_wall = 7.5;
cage_endwall = 1;
cage_base = 5;
wedge_hieght = 10;
mesh_opening = 1 ;
mesh_angle = 35;
mesh_spacing = 2;
lock_radius = 5;
lock_depth = 1;
lock_distancefromcenter = 0;
module half()
{
difference()
{
union()
{
//lock_sphere padding added to endwall
difference()
{
translate([((tub_width-(spacing*3))/2)/2,lock_depth-lock_radius,(cage_height)/2])
{
sphere(lock_radius+cage_endwall);
}
translate([(((tub_width-(spacing*3))/2)/2)-(lock_radius+cage_endwall),-(((lock_radius+cage_endwall)*2)-(cage_endwall+lock_depth)),((cage_height)/2)-(lock_radius+cage_endwall)])
{
cube(size = [((lock_radius+cage_endwall)*2),((lock_radius+cage_endwall)*2)-lock_depth-cage_endwall,(lock_radius+cage_endwall)*2]);
}
}
mirror([0,1,0])
{
translate([0,-(tub_length-(spacing*2)),0])
{
difference()
{
translate([((tub_width-(spacing*3))/2)/2,lock_depth-lock_radius,(cage_height)/2])
{
sphere(lock_radius+cage_endwall);
}
translate([(((tub_width-(spacing*3))/2)/2)-(lock_radius+cage_endwall),-(((lock_radius+cage_endwall)*2)-(cage_endwall+lock_depth)),((cage_height)/2)-(lock_radius+cage_endwall)])
{
cube(size = [((lock_radius+cage_endwall)*2),((lock_radius+cage_endwall)*2)-lock_depth-cage_endwall,(lock_radius+cage_endwall)*2]);
}
}
}
}
difference()
{
cube(size = [(tub_width-(spacing*3))/2,tub_length-(spacing*2),cage_height], center=false);
//delete half of it
cube(size = [((tub_width-(spacing*3))/2)/2,(tub_length-(spacing*2)),cage_height], center=false);
translate([cage_wall, cage_endwall, cage_base])
cube(size = [((tub_width-(spacing*3))/2)-(cage_wall*2),(tub_length-(spacing*2))-(cage_endwall*2),cage_height-cage_base+1], center=false);
translate([((tub_width-(spacing*3))/2)-cage_wall-((sin(mesh_angle)*sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/2), cage_endwall-(mesh_spacing/2)+(((((tub_length-(spacing*2))-(cage_endwall*2))-(((floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing))*mesh_spacing)+sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))))/2), cage_base])
{
for (h = [1 : floor(((cage_height-cage_base-((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle))))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(h*[0,0,mesh_spacing])
{
scale([1,1,(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/sin(90-mesh_angle))*sin(90))])
{
rotate([0,90-mesh_angle,0])
{
for (w = [1 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate(w*[0,mesh_spacing,0])
{
rotate([0,0,45])
{
//could put a scale command here to make opening a perfect square
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(cage_wall/sin(90-mesh_angle)))], center=false);
}
}
}
//begin second row
for (w = [0 : floor((((tub_length-(spacing*2))-(cage_endwall*2))-(sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening))))/mesh_spacing)])
{
translate([mesh_spacing/2,mesh_spacing/2,-mesh_spacing/2])
{
translate(w*[0,mesh_spacing,0])
{
rotate([0,0,45])
{
//could put a scale command here to make opening a perfect square
cube(size = [mesh_opening,mesh_opening,(mesh_opening*2)+(sin(90)*(cage_wall/sin(90-mesh_angle)))], center=false);
}
}
}
}
//end second row
}
}
}
}
}
}
}
//cutout lock_sphere
translate([((tub_width-(spacing*3))/2)/2,lock_depth-lock_radius,(cage_height)/2])
{
sphere(lock_radius);
}
mirror([0,1,0])
{
translate([0,-(tub_length-(spacing*2)),0])
{
translate([((tub_width-(spacing*3))/2)/2,lock_depth-lock_radius,(cage_height)/2])
{
sphere(lock_radius);
}
}
}
}
}
half();
mirror([1,0,0])
{
translate([-((tub_width-(spacing*3))/2),0,0])
{
half();
}
}
//calculate verticle height of mesh holes to take away from max height of holes
//works okay up to 45 then bugs out. might be because its before the scale down
echo((((((sin(90)*(cage_wall/sin(90-mesh_angle))))-((sin(mesh_angle)*((sqrt((mesh_opening*mesh_opening)+(mesh_opening*mesh_opening)))/(sin(90))))))/sin(90))*sin(mesh_angle)));