include use use // bend radius on hdd inlet R = 2; // size of the core box W = hdd_width + vrail_width/2; H = hdd_height + hrail_height; // strap dimensions SW=5; SH=1.5; // dimensions of the SATA power connector spc_width=25; spc_height=8.2; support_bar_width = 10; module front() { intersection() { union() { translate([0, 0, 0*H]) tray(front_depth, inlet=[1]); for (i = [1:num_hdd_y-1]) translate([0, 0, i*H]) tray(front_depth); translate([0, 0, num_hdd_y*H]) tray(front_depth, inlet=[-1], rail=false); } translate([0, 0, num_hdd_y*H/2]) ccube([2*W, front_depth, num_hdd_y*H + hrail_height]); } } module back() { intersection() { union() { translate([0, 0, 0*H]) tray(back_depth, inlet=[1], power_hole=false); for (i = [1:num_hdd_y-1]) translate([0, 0, i*H]) tray(back_depth, power_hole=false); translate([0, 0, num_hdd_y*H]) tray(back_depth, inlet=[-1], rail=false, power_hole=false); } translate([0, 0, num_hdd_y*H/2]) ccube([2*W, front_depth, num_hdd_y*H + hrail_height]); } } module ccube(x) cube(x, center=true); module tray(D, power_hole=true, straps=true, inlet=[-1,1], rail=true, support_bar=true) //translate([0, D/2, H/2]) union() { difference() { union() { // horizontal rail ccube([hdd_width, D, hrail_height]); // vertical rails for (i = [-1,1]) translate([i*(W/2 - vrail_width/8), 0, 0]) ccube([vrail_width/4, D, H]); } // round corners for easy hdd insertion for (i = inlet) translate([0, 0, i*(hdd_height + hrail_height)/2]) hdd_inlet(D); // notches to attach cable strap if (straps) { // horizontal strap holes for (i = [-0.65, -0.12, 0.25, 0.65]) for (k = [-1, 1]) translate([i*hdd_width/2, 0, k*(hrail_height/2 - SH/2)]) strap_hole(); // vertical strap holes for (i = [-1, 1]) translate([i * (hdd_width/2 + SH/2 - epsilon), 0, -hrail_height]) rotate([0, 90, 0]) strap_hole(D); } // hole for support bar if (support_bar) translate([0, D/4, 0]) ccube([W, D, support_bar_width]); // hole for SATA power connector and cable if (power_hole) translate([-hdd_width/2 + 30, 0]) ccube([spc_width, D, spc_height]); // space for rail if (rail) for (i = [0:1]) mirror([i, 0, 0]) translate([-hdd_width/2 - rail_thickness, -D, hrail_height/2 - rail_thickness]) rail(); // female side connectors for (i = [-1,1]) connector_pos(D, i, -1); } // male side connectors for (i = [-1,1]) connector_pos(D, i, 1); } module connector_pos(D, lr, gender) translate([lr*(W/2 + vrail_width/4), -D/2, H*lr*gender*0.3]) connector(); module connector() { intersection() { translate([0, 2.5, 0]) ccube([vrail_width-4, 5, 10]); rotate([45, 0, 0]) ccube([vrail_width-4, 5, 5]); } } module strap_hole(D) { ccube([SW, D, SH]); } module hdd_inlet(D) render() for (i = [0,1]) mirror([i, 0, 0]) for (j = [0,1]) mirror([0, j, 0]) for (k = [0,1]) mirror([0, 0, k]) difference() { union() { translate([0, D/2-R, 0]) cube([hdd_width/2 + R, D, hdd_height/2 + R]); cube([hdd_width/2, D/2-R, hdd_height/2]); }; translate([hdd_width/2 + R, D/2-R, 0]) rotate([0, 0, 0]) cylinder(r=R, h=H, center=true); translate([0, D/2-R, hdd_height/2 + R]) rotate([0, 90, 0]) cylinder(r=R, h=W, center=true); } front();