$fn=99; R=1; //radius of the holes R1=1.2; //thickness of the wall Depth=152; FrontHeight=120; BackHeight=30; Width=70; //****************************************** //**** RoundedCylinderZ(x1,y1,x2,y2,r0) **** //****************************************** //On the Z=0 plane //!!! BEWARE, VARIABLES CANNOT BE MODIFIED DURING RUN TIME! // VARIABLES ARE EFFECTIVELY CONSTANTS THAT DO NOT CHANGE. module RoundedCylinderZ(x1,y1,x2,y2,r0) { length=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); union() { translate([x1,y1,0]) sphere(r0); translate([x2,y2,0]) sphere(r0); if(x2==x1) { translate ([x1,y1,0]) rotate([-90,0,0]) cylinder(length,r0,r0); } else { alpha=atan((x2-x1)/(y2-y1)); if(y2-y1<0) { translate ([x1,y1,0]) rotate([0,0,-alpha-180]) rotate([-90,0,0]) cylinder(length,r0,r0); } else { translate ([x1,y1,0]) rotate([0,0,-alpha]) rotate([-90,0,0]) cylinder(length,r0,r0); } } } } rotate([90,0,0]) difference(){ hull() { RoundedCylinderZ(-R1,-R1,Depth+R1,-R1,R1); RoundedCylinderZ(-R1,-R1,-R1,FrontHeight+R1,R1); RoundedCylinderZ(Depth+R1,-R1,Depth+R1,BackHeight+R1,R1); RoundedCylinderZ(-R1,FrontHeight+R1,Depth+R1,BackHeight+R1,R1); translate([0,0,Width+2*R1]) union(){ RoundedCylinderZ(-R1,-R1,Depth+R1,-R1,R1); RoundedCylinderZ(-R1,-R1,-R1,FrontHeight+R1,R1); RoundedCylinderZ(Depth+R1,-R1,Depth+R1,BackHeight+R1,R1); RoundedCylinderZ(-R1,FrontHeight+R1,Depth+R1,BackHeight+R1,R1); } } union() { translate([0,0,R]) cube([Depth,FrontHeight+10+R,Width]); // color("red") linear_extrude(Width+4*R) polygon( points=[[10,10],[Depth-10,10],[Depth-10,BackHeight-10],[10,FrontHeight-10]] ); color("red") translate([2*R,2*R,Width/2+R]) rotate([0,270,0]) rotate([0,0,45]) union(){ for(i=[20*R:10*R:20*R]) { translate([i,-20*R,0]) cube([8*R,8*R,8*R+Depth]); } for(i=[10*R:10*R:30*R]) { translate([i,-10*R,0]) cube([8*R,8*R,8*R]); } for(i=[0:10*R:40*R]) { translate([i,0,0]) cube([8*R,8*R,8*R]); } for(i=[-10*R:10*R:50*R]) { translate([i,10*R,0]) cube([8*R,8*R,8*R]); } for(i=[-20*R:10*R:60*R]) { translate([i,20*R,0]) cube([8*R,8*R,8*R]); } for(i=[-10*R:10*R:70*R]) { translate([i,30*R,0]) cube([8*R,8*R,8*R]); } for(i=[0:10*R:80*R]) { translate([i,40*R,0]) cube([8*R,8*R,8*R]); } for(i=[10*R:10*R:90*R]) { translate([i,50*R,0]) cube([8*R,8*R,8*R]); } for(i=[20*R:10*R:90*R]) { translate([i,60*R,0]) cube([8*R,8*R,8*R]); } for(i=[30*R:10*R:80*R]) { translate([i,70*R,0]) cube([8*R,8*R,8*R]); } for(i=[40*R:10*R:70*R]) { translate([i,80*R,0]) cube([8*R,8*R,8*R]); } for(i=[50*R:10*R:60*R]) { translate([i,90*R,0]) cube([8*R,8*R,8*R]); } } color("red") translate([2*R,-4*R,Width/2+R]) rotate([0,270,270]) rotate([0,0,45]) union(){ for(i=[20*R:10*R:20*R]) { translate([i,-20*R,0]) cube([8*R,8*R,8*R]); } for(i=[10*R:10*R:30*R]) { translate([i,-10*R,0]) cube([8*R,8*R,8*R]); } for(i=[0:10*R:40*R]) { translate([i,0,0]) cube([8*R,8*R,8*R]); } for(i=[-10*R:10*R:50*R]) { translate([i,10*R,0]) cube([8*R,8*R,8*R]); } for(i=[-20*R:10*R:60*R]) { translate([i,20*R,0]) cube([8*R,8*R,8*R]); } for(i=[-10*R:10*R:70*R]) { translate([i,30*R,0]) cube([8*R,8*R,8*R]); } for(i=[0:10*R:80*R]) { translate([i,40*R,0]) cube([8*R,8*R,8*R]); } for(i=[10*R:10*R:90*R]) { translate([i,50*R,0]) cube([8*R,8*R,8*R]); } for(i=[20*R:10*R:100*R]) { translate([i,60*R,0]) cube([8*R,8*R,8*R]); } for(i=[30*R:10*R:110*R]) { translate([i,70*R,0]) cube([8*R,8*R,8*R]); } for(i=[40*R:10*R:110*R]) { translate([i,80*R,0]) cube([8*R,8*R,8*R]); } for(i=[50*R:10*R:100*R]) { translate([i,90*R,0]) cube([8*R,8*R,8*R]); } for(i=[60*R:10*R:90*R]) { translate([i,100*R,0]) cube([8*R,8*R,8*R]); } for(i=[70*R:10*R:80*R]) { translate([i,110*R,0]) cube([8*R,8*R,8*R]); } } color("red") translate([0,0,-2*R]) rotate([0,0,45]) union(){ for(i=[100*R:10*R:100*R]) { translate([i,-100*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[90*R:10*R:110*R]) { translate([i,-90*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[80*R:10*R:110*R]) { translate([i,-80*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[70*R:10*R:110*R]) { translate([i,-70*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[60*R:10*R:110*R]) { translate([i,-60*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[50*R:10*R:100*R]) { translate([i,-50*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[40*R:10*R:100*R]) { translate([i,-40*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[30*R:10*R:100*R]) { translate([i,-30*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[20*R:10*R:100*R]) { translate([i,-20*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[10*R:10*R:90*R]) { translate([i,-10*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[10*R:10*R:90*R]) { translate([i,0,0]) cube([8*R,8*R,8*R+Width]); } for(i=[20*R:10*R:90*R]) { translate([i,10*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[30*R:10*R:80*R]) { translate([i,20*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[40*R:10*R:80*R]) { translate([i,30*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[50*R:10*R:80*R]) { translate([i,40*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[60*R:10*R:80*R]) { translate([i,50*R,0]) cube([8*R,8*R,8*R+Width]); } for(i=[70*R:10*R:70*R]) { translate([i,60*R,0]) cube([8*R,8*R,8*R+Width]); } } color("red") translate([4*R+Depth,2*R,Width/2+R]) rotate([0,270,0]) rotate([0,0,45]) union(){ for(i=[20*R:10*R:20*R]) { translate([i,-20*R,0]) cube([8*R,8*R,8*R]); } for(i=[10*R:10*R:30*R]) { translate([i,-10*R,0]) cube([8*R,8*R,8*R]); } for(i=[0:10*R:20*R]) { translate([i,0,0]) cube([8*R,8*R,8*R]); } for(i=[-10*R:10*R:10*R]) { translate([i,10*R,0]) cube([8*R,8*R,8*R]); } for(i=[-20*R:10*R:0]) { translate([i,20*R,0]) cube([8*R,8*R,8*R]); } for(i=[-10*R:10*R:-10*R]) { translate([i,30*R,0]) cube([8*R,8*R,8*R]); } } } }