// This file contains all the parts for a rack enclosure
// It has the format required for a customizable project on Thingiverse
// Note: Calculated variables does not show up in the customizer, hence the *1; 

$fn = 50*1;

part = "f"; // [a:Extrusion no holes,b:Extrusion front holes,c:Extrusion front and side holes,d:End open,e:End grid,f:End chimney,g:End closed,h:Nut-less Trap,i:Panel,j:Panel with handle,k:Handle]

Units = 3;

//Hole size for 4mm screws or freedom unit equivalent
Four_mm_screw = 3.8;

//Hole size for 5mm screws or freedom unit equivalent
Five_mm_screw = 4.8;

//Constants, do not change !
sixinch   = 155*1;       // cm = 6"  
width     = 155-20-20;   // 11.5cm between rails
unit      = (44.5/19)*6; // 1U = 14.05cm
gauge     = 3*1;
gauge_box = 2*1;
slip      = 0.35*1;      // extra slip between parts

go();

module go(){
    if (part=="a"){
        extrusion(Units,true,false,false);
    }else if (part=="b"){
        extrusion(Units,true,true,false);
    }else if (part=="c"){
        extrusion(Units,true,true,true);
    }else if (part=="d"){
        rack_end(0);
    }else if (part=="e"){
        rack_end(1);
    }else if (part=="f"){
        rack_end(2);
    }else if (part=="g"){
        rack_end(3);
    }else if (part=="h"){
        trap(Units);
    }else if (part=="i"){
        sidepanel(Units,false);
    }else if (part=="j"){
        sidepanel(Units,true);
    }else if (part=="k"){
        tophandle();
    translate([0,30,0]){tophandle();}
    }
}




module chimney() {    
    for(i=[0:8:80]){
        echo(i);
        translate([20 + (width-80)/2  +i,-1,20]){
            minkowski(){
                cube([0.01,50,30]);    
                sphere(d=2,h=1);        
            }
        }
    }
}




// Nut-less Trap
module trap(u){
    difference(){
        union(){
            translate([-2.4,0,4]){
                cube([4.8,unit*u,1.5]);
            }    
            translate([-2.4,unit*u,0]){
                rotate([90,0,0]){
                    linear_extrude(unit*u){
                        polygon(points=[[0,0],[4.8,0],[7,4],[-2.2,4]]);
                    }
                }
            }
        }                        
        for(i=[1:u]){
            translate([0,unit*i-unit/2,-1]){
                cylinder(d=Four_mm_screw,h=10);
            }                       
        }
    }
}



//0: open
//1: grid
//2: chimney
//3: closed
module rack_end(type){    
    width = sixinch+1; 
    difference(){
        union(){
            translate([1.25,1.25,1.25]){
                minkowski(){
                    w = width-2.5;            
                    cube([w, w, gauge-2.5]);                        
                    sphere(r=1.25);
                }
            }
        }
        if(type==0 || type==1){
            translate([20,20,-1]){ cube([width-40,width-40,gauge+2]);}  
        }
    
        translate([10,10,-0.1])                { cylinder(d=5,h=10); cylinder(d1=10,d2=6,h=3.5);}
        translate([width-10,10,-0.1])        { cylinder(d=5,h=10); cylinder(d1=10,d2=6,h=3.5);}
        translate([10,width-10,-0.1])        { cylinder(d=5,h=10); cylinder(d1=10,d2=6,h=3.5);}
        translate([width-10,width-10,-0.1]){ cylinder(d=5,h=10); cylinder(d1=10,d2=6,h=3.5);}  
  
        rotate([-90,0,0]){
            if(type==2){
                translate([0,-5,0]){chimney();}
                translate([0,-5,(width-29)/2]){chimney();}
                translate([0,-5,width-29]){chimney();}
            }
        }    
    }  
    if(type==1){
        intersection(){
            union(){
                sz=8;
                grid = 15;
                for(i=[-grid*8:12:grid*8]){        
                    translate([sz/2+i+70,sz/2+78,gauge/2]){
                        rotate([0,0,45]){
                        cube([2,width*1.5,gauge],center=true);        
                        }
                    }
                    translate([sz/2+i+70,sz/2+82,gauge/2]){
                        rotate([0,0,-45]){
                            cube([2,width*1.5,gauge],center=true);        
                        }
                    }
                }
            }
            translate([15,15,-1]){cube([125,125,10]);}
        }
    }    
}



module tophandle(){
    rotate([0,180,0]){
        difference(){
            union(){
                rotate([0,45,0]){
                    extrusion(4,false,false,false);
                }
                translate([sixinch,20,0]){
                    rotate([0,45,180]){
                        extrusion(4,false,false,false);
                    }
                }
            }    
            wedge();            
            translate([90,90,10]){
                cube([200,200,20],center=true);
            }       
            translate([10,10,0]){handlescrew();}
            translate([sixinch-10,10,0]){handlescrew();}        
        }
        intersection(){
            translate([0,0,-27.4]){
                extrusion(11,false,false,false);
            }
            wedge();        
        } 
    }    
}




module handlescrew(){
    translate([0,0,-39]){cylinder(d=5,h=40); }
    translate([0,0,-4]){cylinder(d1=10,d2=6,h=3.5);}
    translate([0,0,-34]){cylinder(d=10,h=30);}
}



module wedge(){
    translate([sixinch/2,-10,15]){
        rotate([0,45+45/2,0]){
            cube([80,80,30]);
        }
        translate([0,80,0]){
            rotate([0,45+45/2,180]){
                cube([80,80,30]);
            }
        }
        translate([-20,0,-100]){
            cube([40,80,100]);
        }
    }
}




module extrusion(u,center,front,side){
    len=unit*u;
    difference(){
        translate([0,2,2]){
            minkowski(){
                cube([len,16,16]);
                sphere(d=4);
            }
        } 
        translate([-5,10,1.99]){
            rotate([0,90,0]){linear_extrude(len+10){polygon(points=[[0,-2.5],[2,-4],[2,4],[0,2.5]]);}}
        }
        translate([-5,10,18.01]){
            rotate([0,-90,180]){linear_extrude(len+10){polygon(points=[[0,-2.5],[2,-4],[2,4],[0,2.5]]);}}
        }    
        translate([-5,18.01,10]){
            rotate([90,0,90]){linear_extrude(len+10){polygon(points=[[0,-2.5],[2,-4],[2,4],[0,2.5]]);}}
        }    
        translate([-5,1.99,10]){
            rotate([-90,0,-90]){linear_extrude(len+10){polygon(points=[[0,-2.5],[2,-4],[2,4],[0,2.5]]);}}
        }    
        if(center){
            translate([-5,10,10]){
                rotate([0,90,0]){
                    cylinder(d=4.6,h=len+10);
                }
            }
        }     
        //holes
        if(front){
            for(i=[0:30]){
                translate([unit/2+i*unit,10,-5]){ cylinder(d=3.8,h=30);}
            }
        }    
        if(side){
            for(i=[0:30]){
                translate([unit/2+i*unit,25,10]){ rotate([90,0,0]){cylinder(d=3.8,h=30);}}
            }
        }
        //length cutoff
        translate([-2,0,0]){cube([4,60,60],center=true);}
        translate([len+2,0,0]){cube([4,60,60],center=true);}    
    }
}



module screw(){
    cylinder(r1=screw_head/2, r2=screw_dia/2, h=screw_head_height);
    cylinder(r=screw_dia/2, h=40);    
    translate([0,0,-0.99]){cylinder(r=screw_head/2, h=1);}    
}



module insideprofile(l){
    difference(){
        union(){
            translate([7.6,10,0]){cube([4.8,10,l]);}
            translate([0,7.6,0]){cube([20,4.8,l]);}  
            
            translate([6.5,10-2.1,0]){cube([7   ,10,l]);}
            translate([2.1,6.5,0]){cube([15.8,7   ,l]);}  
        }
        translate([4,4,-1]){
            cube([12,12,l+2]);
        }
    } 
    translate([20,20,0]){
        rotate([0,-90,0]){
            linear_extrude(20){
                polygon (points=[[0,0],[l,0],[0,l]]);
            }
        }
    }    
}





module sidepanel(u,handle){
    difference(){
        baseplate(u);
        if(handle){
              translate([(sixinch-80)/2,         9,-4]) { cube([80,20,10]);}
              translate([(sixinch-80)/2,        19,-4]) { cylinder(d=20,h=10);}
              translate([sixinch-(sixinch-80)/2,19,-4]) { cylinder(d=20,h=10);}
        }
    }
}



module baseplate(u){
    difference(){
        union(){
            translate([1.25,1.25,1.25]){
                minkowski(){
                    cube([sixinch-2.5,unit*u-2.5,gauge-2.5]);
                    sphere(r=1.25);
                }
            }
        }
        //Rack mount holes
        translate([10-0.5,unit/2,-gauge/2])                 {cylinder(r=2.3,gauge*2);}
        translate([sixinch-10+0.5,unit/2,-gauge/2])         {cylinder(r=2.3,gauge*2);}
        translate([10-0.5,u*unit-(unit/2),-gauge/2])        {cylinder(r=2.3,gauge*2);}
        translate([sixinch-10+0.5,u*unit-(unit/2),-gauge/2]){cylinder(r=2.3,gauge*2);}
        if(u>=5){
            translate([10-0.5,(u*unit)/2,-gauge/2])         {cylinder(r=2.3,gauge*2);}
            translate([sixinch-10+0.5,(u*unit)/2,-gauge/2]) {cylinder(r=2.3,gauge*2);}
        }  
    }    
}