include use module hdd_connector(w,h,d) { difference() { cube([w, d, h]); translate([1, 2, 1]) cube([w - 2, d, h - 2]); } } // board module backplane_pcb() { color("sienna") difference() { cube([backplane_width, backplane_thickness, backplane_height]); // screw holes for ... for (p = [// ... PCB screws [0, bar_thickness/2], [0, tray_height - bar_thickness/2], [tray_width/2 - bar_thickness, tray_height - bar_thickness/2], [tray_width/2 + bar_thickness, tray_height - bar_thickness/2], // .. assembly hooks [rail_width/2 + bar_thickness/2, bar_thickness/2], [tray_width/4, tray_height - bar_thickness/2] ]) translate([p[0] - backplane_hoffset, 0, p[1] - backplane_voffset]) rotate([-90, 0, 0]) screw_hole(); } } module backplane_populated() { backplane_pcb(); // front connector (power + data) color("darkgrey") translate([backplane_con_hoffset, 0, backplane_con_voffset]) mirror([0, 1, 0]) { hdd_connector(backplane_con_width/ 3 * 2 + 1, backplane_con_height, backplane_con_depth); translate([backplane_con_width / 3 * 2, 0, 0]) hdd_connector(backplane_con_width / 3 * 1, backplane_con_height, backplane_con_depth); } // back connector (data) translate([backplane_con_hoffset + backplane_con_width / 3 * 2, backplane_thickness, backplane_con_voffset]) mirror([0, 1, 0]) rotate([90, 0, 0]) hdd_connector(backplane_con_width / 3 * 1, backplane_con_height, backplane_con_depth); } backplane_populated();