$fn = 50; module PCB() { minkowski() { cube([130,75+4+20,1.8]); cylinder(r=0.8,h=0.8); } } module box(height) { difference() { minkowski() { cube([130-4,57,height]); cylinder(r=8,h=2); } translate([0,0,2]) cube([130-4,57,height+2]); } } module louver(x, z, num) { for (i=[0:num]) translate([0,0,i*7]) rotate([-45,0,0]) cube([x,3,z]); } module honeycomb(num_x, num_y, size) { for (i=[0:num_y]) { translate([0,i*2.4*size,0]) for (k=[0:num_x]) { if( k%2==0) { offset = 2.4*size*0.5; translate([k*2.2*size,offset,0]) rotate([0,0,360/12]) cylinder($fn=6, r=size, h=3); } else { offset = 0; translate([k*2.2*size,offset,0]) rotate([0,0,360/12]) cylinder($fn=6, r=size, h=3); } } } } module mount() { rotate([90,90,0]) { translate([-4,0,0]) cylinder(r=2.5,h=12); translate([-4,-2.5,0]) cube([14,5,12]); translate([10,0,0]) cylinder(r=5,h=12); translate([-20,-5,2+4]) cube([30,10,12-2-4]); } } module screwhole() { translate([0,60+10,0]) rotate([90,0,0]) { cylinder(r=1.4,h=12+10); cylinder(r=3,h=7.8); } } module rail() { rotate([90,0,0]) { difference() { linear_extrude(height=57+8+2) polygon([[-1.4,0],[1.4,0],[2.4,4],[-2.4,4]]); translate([-5,0,57+10]) rotate([-45,0,0]) cube([10,10,10]); } } } module base(height) { difference() { union() { difference() { union() { box(height); translate([-4,57+8,81.8]) rail(); translate([130,57+8,81.8]) rail(); } translate([5,-15,2.6]) louver(120,25,9); translate([130-4+15,3,2.6]) rotate([0,0,90]) louver(50,25,9); translate([-15,53,2.6]) rotate([0,0,-90]) louver(50,25,9); translate([5+1,5+1,-0.5]) honeycomb(13,4,4); } translate([-1.4,20,0]) cube([1.4,12,80+2]); translate([126,20,0]) cube([1.4,12,80+2]); } translate([-2,27,5]) rotate([90,0,0]) PCB(); translate([20+8/2,57+10,53]) mount(); translate([100+8/2,57+10,53]) mount(); translate([-4,0,5]) screwhole(); translate([-4,0,8+66.6]) screwhole(); translate([130,0,5]) screwhole(); translate([130,0,8+66.6]) screwhole(); } } module top() { difference() { translate([0,0,82.4]) minkowski() { cube([130-4,57,7.6]); cylinder(r=8,h=2); } translate([0,0,74]) rotate([7,0,0]) cube([130-4,57,8]); translate([0,-8,74+4+6]) rotate([7,0,0]) cube([130-4,57+2*8,8]); minkowski() { translate([-4,57+8,81.8]) rail(); cylinder(r=0.4,h=0.4); } minkowski() { translate([130,57+8,81.8]) rail(); cylinder(r=0.4,h=0.4); } } } //color([0,1,0]) difference() { base(80); translate([-50,56.8,-10]) cube([250,20,100]); // subtract back } //color([0,0,1]) % difference() { base(80+10); translate([-50,-20,-10]) cube([250,20+56.8,120]); // subtract front } //color([1,0,0]) % top();