$fn = 50; width = 45; length = 60; height = 20; corner_radius = 2; wall_thickness = 1.5; post_diameter = 8; post_height = 0; hole_diameter = 3; lid_height = 4; lid_tolerance = .3; hook_height = 1; hook_tolerance = 0.75; hook_slit_height = 2.5; airslit_height = 1.75; ridge_height = 14; ridge_width = 1; ridge_depth = 2.5; netconn_width = 17; netconn_length = 6; netconn_height = 20; netconn_tolerance = .3; powerconn_width = 10; powerconn_height = 15; /* 12 */ powerconn_length = 6; powerconn_tolerance = .3; module posts(x, y, z, h, r){ translate([x, y, z]) cylinder(r = r, h = h); translate([-x, y, z]) cylinder(r = r, h = h); translate([-x, -y, z]) cylinder(r = r, h = h); translate([x, -y, z]) cylinder(r = r, h = h); } union() { difference() { // box hull() { posts( x=(width/2 - corner_radius), y=(length/2 - corner_radius), z=0, h=height, r=corner_radius); } // hollow hull() { posts( x=(width/2 - corner_radius - wall_thickness), y=(length/2 - corner_radius - wall_thickness), z=wall_thickness, h=height, r=corner_radius); } // ventilation slits left 1 for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) { translate([(-width/2)-wall_thickness, (-length/4), i]) cube([10, length/5, airslit_height], center=true); } // ventilation slits top for(i = [(wall_thickness+post_height+3):(airslit_height*2):(height-5)]) { translate([-8, -(length/2), i]) cube([18, 10, airslit_height], center=true); } // network connector hole 1 translate([(netconn_width-netconn_tolerance)/2, (length/2), wall_thickness+2+10]) cube([netconn_width+netconn_tolerance, netconn_length, netconn_height], center=true); // network connector hole 2 translate([-(netconn_width-netconn_tolerance)/2, (length/2), wall_thickness+2+10]) cube([netconn_width+netconn_tolerance, netconn_length, netconn_height], center=true); // power connector hole translate([9.75 /*(powerconn_width+powerconn_tolerance)/2*/, -(length/2), wall_thickness+4+(powerconn_height/2)]) cube([powerconn_width+powerconn_tolerance, powerconn_length, powerconn_height+powerconn_tolerance*2], center=true); // cable hole translate([(width/2)-3, -12, wall_thickness+10]) rotate([00, 90, 0]) cylinder(r = 6/2, h = 6); // holes for cable binders translate([(width/2)-3, length/4, wall_thickness+12]) rotate([00, 90, 0]) cylinder(r = 4/2, h = 6); translate([(width/2)-3, length/4, wall_thickness+6]) rotate([00, 90, 0]) cylinder(r = 4/2, h = 6); // LED hole translate([12, -15, -wall_thickness]) cylinder(r = 5.5/2, h = 6); } // hooks upward facing side translate([-(width/2)-0.25, length/8, height-(hook_height/2)]) cube([2.5, 7, hook_height], center=true); translate([-(width/2)-0.25, -length/8, height-(hook_height/2)]) cube([2.5, 7, hook_height], center=true); // hooks downward facing side translate([(width/2)+0.25, length/8, height-(hook_height/2)]) cube([2.5, 7, hook_height], center=true); translate([(width/2)+0.25, -length/8, height-(hook_height/2)]) cube([2.5, 7, hook_height], center=true); // ridges to hold the pcb translate([(width/2)-wall_thickness, 0, ridge_height/2+(height-ridge_height)]) cube([ridge_depth, ridge_width, ridge_height], center=true); translate([-((width/2)-wall_thickness), 0, ridge_height/2+(height-ridge_height)]) cube([ridge_depth, ridge_width, ridge_height], center=true); } /* lid */ translate([0, 0, 50]) { /* match at Z=16.5, otherwise 50*/ difference() { union() { difference() { hull() { posts( x=(width/2 - corner_radius + wall_thickness + lid_tolerance), y=(length/2 - corner_radius + lid_tolerance), z=0, h=lid_height+wall_thickness, r=corner_radius); } hull() { posts( x=(width/2 - corner_radius ), y=(length/2 - corner_radius)+5, z=-(wall_thickness), h=lid_height+wall_thickness, r=corner_radius); } // slits for hooks (upward facing side) translate([-((width/2)+wall_thickness/2), length/8, lid_height-((hook_slit_height)/2)]) cube([4, 9, hook_slit_height], center=true); translate([-((width/2)+wall_thickness/2), -length/8, lid_height-((hook_slit_height)/2)]) cube([4, 9, hook_slit_height], center=true); // slits for hooks (downward facing side) translate([(width/2)+(wall_thickness/2), length/8, lid_height-((hook_slit_height)/2)]) cube([4, 9, hook_slit_height], center=true); translate([(width/2)+(wall_thickness/2), -length/8, lid_height-((hook_slit_height)/2)]) cube([4, 9, hook_slit_height], center=true); } // hooks downward facing side *translate([(width/2)-lid_lip, 0, 1]) cube([2, 5, hook_thickness], center=true); *translate([(width/2)-lid_lip, length/4, 1]) cube([2, 5, hook_thickness], center=true); *translate([(width/2)-lid_lip, -length/4, 1]) cube([2, 5, hook_thickness], center=true); } // drilling holes translate([0, 0, -wall_thickness]) cylinder(r = hole_diameter, h = 10); translate([0, -(length/3), -wall_thickness]) cylinder(r = hole_diameter, h = 10); } } // support posts for pcb /*difference() { translate([0, length/4, wall_thickness]) cylinder(r = post_diameter/2, h = post_height); translate([0, length/4, wall_thickness]) cylinder(r = hole_diameter/2, h = post_height+3); } difference() { translate([0, -length/4, wall_thickness]) cylinder(r = post_diameter/2, h = post_height); translate([0, -length/4, wall_thickness]) cylinder(r = hole_diameter/2, h = post_height+3); } */