include include include use use module shell_base(pcb_dim, margins, t) { dim = dim_pcb_to_case(pcb_dim, margins, t); difference() { // full body rounded_cube(dim=dim, radius=t); // cut away upper half translate([0,0,dim[2]/2]) cube([dim[0], dim[1], dim[2]/2]); // main PCB space translate([3*t, t, t]) rounded_cube([dim[0]-6*t, dim[1]-2*t, dim[2]-2*t], t); // remove front and back translate([0, 2*t, 2*t]) rounded_cube([dim[0], dim[1]-4*t, dim[2]-4*t], t); // panel holder for (x_off = [t-panel_dim_0_tol/2, dim[0]-2*t-panel_dim_0_tol/2]) { translate([x_off, t-panel_dim_0_tol/2, t-panel_dim_0_tol/2]) { rounded_cube( [ t+panel_dim_0_tol, dim[1]-2*t+panel_dim_1_2_tol, dim[2]-2*t+panel_dim_1_2_tol ], t ); } } // bolt drillings for (x = [dim[0]/4, dim[0]-dim[0]/4]) { translate([x,0,dim[2]/2-1.5*bolt_ds]) rotate([-90,0,0]) cylinder(d=bolt_ds+bolt_ds_tol, h=1.1*t, $fn=30); } } } module shell_connector(pcb_dim, margins, t) { dim = dim_pcb_to_case(pcb_dim, margins, t); size_x = dim[0]-6*t; size_y = bolt_l-t; size_z = dim[2]/2+3*bolt_ds; 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_ds]) rotate([90,0,0]) cylinder(d=bolt_ds+bolt_ds_tol, 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_ds]) rotate([-90,0,0]) cylinder(d=nut_d+nut_d_tol, h=nut_h, $fn=30); } } echo(min_shell_bolt_length=t+size_y); } module pcb_case_shell(pcb_dim, drillings, margins, t) { difference () { union() { shell_base(pcb_dim, margins, t); shell_connector(pcb_dim, margins, t); for (drilling = drillings) { translate([ 2*t+margins[0][0]+drilling[0], bolt_l+margins[1][0]+drilling[1], 0 ]) cylinder(d=nut_d+2, h=t+margins[2][0], $fn=30); } } for (drilling = drillings) { translate([ 2*t+margins[0][0]+drilling[0], bolt_l+margins[1][0]+drilling[1], 0 ]) { cylinder(d=bolt_ds+bolt_ds_tol, h=t+margins[2][0], $fn=30); cylinder(d=nut_d+nut_d_tol, h=nut_h, $fn=30); } } } } module pcb_case_shell_bottom(pcb_dim, drillings, margins, t) { pcb_case_shell(pcb_dim, drillings, margins, t); } module pcb_case_shell_top(pcb_dim, margins, t) { dim = dim_pcb_to_case(pcb_dim, margins, t); translate([0, dim[1], dim[2]]) rotate([180,0,0]) pcb_case_shell(pcb_dim, [], margins, t); }