include include use module shell_base(dim, t) { radius = t; difference() { rounded_cube(dim, radius); translate([0,0,dim[2]/2]) cube([dim[0], dim[1], dim[2]/2]); translate([3*t, t, t]) rounded_cube([dim[0]-6*t, dim[1]-2*t, dim[2]-2*t], radius); translate([0, 2*t, 2*t]) rounded_cube([dim[0], dim[1]-4*t, dim[2]-4*t], radius); for (x_off = [t, dim[0]-2*t]) { translate([x_off, t, t]) rounded_cube([t, dim[1]-2*t, dim[2]-2*t], radius); } for (x = [dim[0]/4, dim[0]-dim[0]/4]) { translate([x,0,dim[2]/2-1.5*bolt_d]) rotate([-90,0,0]) cylinder(r=bolt_r, h=1.1*t, $fn=30); } } } module shell_connector(dim, t) { size_x = dim[0]-6*t; size_y = 2*nut_h; size_z = dim[2]/2+3*bolt_d; difference () { // base body translate([3*t,dim[1]-t-size_y,0]) cube([size_x,size_y,size_z]); // bolt holes for (x = [dim[0]/4, dim[0]-dim[0]/4]) { translate([x,dim[1]-t,dim[2]/2+1.5*bolt_d]) rotate([90,0,0]) cylinder(r=bolt_r, h=size_y, $fn=30); } // nut holes for (x = [dim[0]/4, dim[0]-dim[0]/4]) { translate([x,dim[1]-t-size_y,dim[2]/2+1.5*bolt_d]) rotate([-90,0,0]) cylinder(r=nut_r, h=nut_h, $fn=30); } } echo(min_shell_bolt_length=t+size_y); } module pcb_case_shell(dim, t, h, sockets) { difference () { union() { shell_base(dim, t); shell_connector(dim, t); for (socket = sockets) { echo(socket=socket); translate([socket[0], socket[1], 0]) cylinder(d=nut_d+2, h=h, $fn=30); } } for (socket = sockets) { translate([socket[0], socket[1], 0]) { cylinder(d=bolt_d, h=h, $fn=30); cylinder(d=0.9*nut_d, h=nut_h, $fn=30); } } } } module pcb_case_shell_bottom(dim, t, h, sockets) { pcb_case_shell(dim, t, h, sockets); } module pcb_case_shell_top(dim, t) { translate([0,dim[1],dim[2]]) rotate([180,0,0]) pcb_case_shell(dim, t, 0, []); }