include ; use ; use ; use ; use ; /* * A wedge to keep overhangs reasonable when putting things on walls. The * slope is at 45 degrees in the X-Z plane. * * size: [x, y] */ module wedge(size) { difference() { translate([0, size[1]/2, 0]) rotate([0, 45, 0]) cube([size[0]*2/sqrt(2), size[1], size[0]*2/sqrt(2)], center=true); translate([-size[0], -epsilon, 0]) cube([2*size[0], size[1] + 2*epsilon, size[0]]); translate([-size[0], -epsilon, -size[0]]) cube([size[0], size[1] + 2*epsilon, size[0] + epsilon]); } } /* * A side of the housing, with ventillation holes */ module housing_side(case_thickness, height, depth, slot_r=2*mm, slot_count=3) { offset = case_thickness + 2*slot_r; spacing = slot_r*3; difference() { union() { /* Wall */ cube([case_thickness, height, depth]); /* Stop for the back */ translate([case_thickness, case_thickness, depth - case_thickness]) wedge([2*case_thickness, slot_r]); /* Nut traps */ translate([case_thickness, height - case_thickness - 4*mm, case_thickness]) nut_trap_bot(thickness=4*mm); translate([case_thickness, height - case_thickness - 4*mm, depth - case_thickness - 8*mm]) nut_trap_top(thickness=4*mm); } for (i = [0 : 4 : 4*slot_count - 1]) { /* First row of slots */ hull() { translate([-epsilon, offset, depth - offset - i*spacing]) truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon); translate([-epsilon, offset, depth - offset - (i + 3)*spacing]) truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon); } /* Second row of slots */ hull() { translate([-epsilon, offset + spacing, depth - offset - i*spacing]) truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon); translate([-epsilon, offset + spacing, depth - offset - (i + 3)*spacing]) truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon); } } } } /* * A nut trap for the bottom pair of nuts */ module nut_trap_bot(thickness, nut_tolerance=0.05*mm, nut_depth=4*mm, bolt_tolerance=0.3*mm) { difference() { /* Body */ translate([0, -2*thickness, 0]) cube([2*thickness, 2*thickness, 2*thickness]); /* Nut trap */ translate([thickness, -2*thickness - epsilon, thickness]) rotate([0, 90, 90]) rotate([0, 0, 30]) cylinder(r=6.4*mm / 2 + nut_tolerance, h=nut_depth + epsilon, $fn=6); /* Bolt hole */ translate([thickness, -2*thickness - epsilon, thickness]) rotate([0, 0, 90]) truncated_teardrop(radius=(3*mm + bolt_tolerance)/2, length=2*thickness + 2*epsilon); } } /* * A nut trap for the top pair of nuts */ module nut_trap_top(thickness, nut_tolerance=0.05*mm, nut_depth=4*mm, bolt_tolerance=0.3*mm) { translate([0, -2*thickness, 0]) wedge([2*thickness, 2*thickness]); nut_trap_bot(thickness, nut_tolerance, nut_depth, bolt_tolerance); } /* * An M3 bolt hole */ module bolt_hole(h=7*mm, bolt_tolerance=0.3*mm, layer_thickness=0.25*mm) { /* Bolt hole */ translate([0, 0, 4*mm + layer_thickness]) polyhole(d=3*mm + bolt_tolerance, h=h + 2*epsilon); /* Cap hole */ translate([0, 0, -epsilon]) polyhole(d=5.5*mm + bolt_tolerance, h=4*mm + epsilon); } /* * The front, top, and sides of the housing */ module housing_fts(size, case_thickness) { /* Front panel */ difference() { cube([size[0], size[2], case_thickness]); /* DPH3205 panel cutout */ translate([size[0]/2, 39*mm/2 + case_thickness + 2*mm, 0]) { dph_panel_hole(); /* DPH3205 bezel, for reference */ translate([0, 0, -1*mm]) color([0.5, 0.5, 0.5, 0.25]) %cube([79*mm, 43*mm, 1*mm], center=true); } /* Binding post cutouts */ translate([size[0]/2, size[2] - 25*mm, -epsilon]) { translate([3/8*inch, 0, 0]) rotate([0, 0, 90]) binding_post(h=case_thickness + 2*epsilon); translate([-3/8*inch, 0, 0]) rotate([0, 0, 90]) binding_post(h=case_thickness + 2*epsilon); } } /* Top */ cube([size[0], case_thickness, size[1]]); /* Left */ housing_side(case_thickness, size[2], size[1]); /* Right */ translate([size[0], 0, 0]) mirror([1, 0, 0]) housing_side(case_thickness, size[2], size[1]); } /* The bottom and back of the housing */ module housing_bb(size, case_thickness) { in_size = [size[0] - 2*case_thickness, size[1] - case_thickness, size[2] - case_thickness]; sink_offset = 10*mm; dph_offset = 14*mm; /* Bottom */ difference() { union() { cube([in_size[0], in_size[1], case_thickness]); /* Boxes for DPH3205 mounting holes */ translate([in_size[0]/2 - 93*mm/2 + dph_offset, in_size[1] - case_thickness - 71*mm, case_thickness]) dph_mounting_boxes(h=4*mm); /* Boxes for mounting holes */ for (x = [0, in_size[0] - 8*mm]) for (y = [0, in_size[1] - 8*mm - case_thickness]) translate([x, y, case_thickness]) cube([8*mm, 8*mm, 4*mm]); } /* DPH3205 mounting holes */ translate([in_size[0]/2 - 93*mm/2 + dph_offset, in_size[1] - case_thickness - 71*mm, 0]) dph_mounting_holes(h=case_thickness + 4*mm); /* Hole for accessing the PD Buddy Sink */ translate([sink_offset, in_size[1] - case_thickness, -epsilon]) rotate([0, 0, -90]) cube([8*mm, 26*mm, case_thickness + epsilon]); /* Holes for case bolts */ for (x = [4*mm, in_size[0] - 4*mm]) for (y = [4*mm, in_size[1] - 4*mm - case_thickness]) translate([x, y, 0]) bolt_hole(); } /* Back */ difference() { translate([0, in_size[1] - case_thickness, 0]) cube([in_size[0], case_thickness, in_size[2]]); /* DPH3205 fan hole */ translate([in_size[0]/2 + dph_offset, in_size[1] - case_thickness - epsilon, case_thickness + 4*mm + 42*mm - 15*mm]) rotate([0, 0, 90]) truncated_teardrop(radius=15*mm, length=case_thickness + 2*epsilon); /* PD Buddy Sink hole */ translate([sink_offset + 8*mm, in_size[1] - case_thickness - epsilon, 8*mm]) cube([10*mm, case_thickness + 2*epsilon, 5*mm]); translate([sink_offset + 8*mm - 2*mm, in_size[1] - case_thickness + 1*mm, 8*mm - 2*mm]) cube([14*mm, case_thickness + 2*epsilon, 9*mm]); } /* PD Buddy Sink mount */ translate([sink_offset, in_size[1] - case_thickness, 0]) rotate([0, 0, -90]) sink_mount(); } case_thickness = 3*mm; size = [150*mm, 90*mm, 80*mm]; housing_fts(size, case_thickness); translate([0, 100*mm, 0]) //#translate([case_thickness, -20*mm, case_thickness]) //rotate([90, 0, 0]) housing_bb(size, case_thickness);