include <../lib/chamfered-cube.scad> include <../lib/rounded-cube.scad> // All units in mm $fn=128; outerWall=4; innerWall=2; layerClearance = 0.5; verStr="v11"; font="Montserrat"; ep = 0.01; // smallest unit to ensure overlap between shapes // as a convention, outer dimensions refer to measurements from outside wall to // outside wall, as if you put a caliper around the whole thing. Inner // dimesions refers to inside or void dimensions: the space available to be // filled. layer1H = 44; layer2H = 40; outerBoxLength = 300; outerBoxWidth = 154; outerBoxHeight = layer1H + layer2H + 2*outerWall; innerBoxLength = outerBoxLength - 2*outerWall; innerBoxWidth = outerBoxWidth - 2*outerWall; audioTraySide = 64; audioTrayHeight = 15; audioTrayIS = audioTraySide - 2*innerWall; audioTrayIH = audioTrayHeight - innerWall; module shellBottom(dims) { lipClearance = innerWall + 0.2; bottomShellH = dims[2]*0.75; difference() { union() { difference() { // main body chamferedCube(dims, chamfer=4); // top-cut (75% up) translate([-outerWall, -outerWall, bottomShellH]) cube([dims[0] + 2*outerWall, dims[1] + 2*outerWall, dims[2]]); } // add lip to mate with top translate([lipClearance, lipClearance, bottomShellH - 2]) chamferedCube( [dims[0] - 2*lipClearance, dims[1] - 2*lipClearance, 6 - 1], chamfer=1); } // carve out the interior translate([outerWall, outerWall, outerWall]) cube([dims[0] - 2*outerWall, dims[1] - 2*outerWall, dims[2]]); // carve out a 0.6mm sliver for the fabric to sit in /* fabricClearance = 0.6; translate([ lipClearance - fabricClearance, lipClearance - fabricClearance, bottomShellH - 4]) difference() { roundedCube( [ dims[0] - 2*lipClearance + 2*fabricClearance, dims[1] - 2*lipClearance + 2*fabricClearance, 7], [2, 2, 0]); translate([fabricClearance, fabricClearance, -ep]) roundedCube( [dims[0] - 2*lipClearance, dims[1] - 2*lipClearance, 8], [2, 2, 0]); } */ // version marker color("black") translate([0.6, 26, 8]) rotate([90, 0,-90]) linear_extrude(0.61) text(text = verStr, font = font, size = 8); } } module shellTop(dims) { topShellH = dims[2]*0.25; difference() { union() { difference() { // main body chamferedCube(dims, chamfer=4); // top-cut (75% up) translate([-outerWall, -outerWall, topShellH + 4]) cube([dims[0] + 2*outerWall, dims[1] + 2*outerWall, dims[2]]); } } // carve out the interior translate([outerWall, outerWall, outerWall]) cube([dims[0] - 2*outerWall, dims[1] - 2*outerWall, dims[2]]); // carve out the interior of the lip translate([innerWall - 0.2, innerWall - 0.2, topShellH]) chamferedCube( [dims[0] - 2*innerWall + 0.4, dims[1] - 2*innerWall + 0.4, dims[2]], chamfer = 2); /* // carve out a 0.6mm sliver for the fabric to sit in fabricClearance = 0.6; translate([ layerClearance, layerClearance, topShellH - 4]) difference() { roundedCube( [ dims[0] - 2*layerClearance, dims[1] - 2*layerClearance, 7], [2, 2, 0]); translate([fabricClearance, fabricClearance, -ep]) roundedCube( [ dims[0] - 2*layerClearance - 2*fabricClearance, dims[1] - 2*layerClearance - 2*fabricClearance, 8], [2, 2, 0]); } */ // version marker color("black") translate([0.6, 26, 8]) rotate([90, 0,-90]) linear_extrude(0.61) text(text = verStr, font = font, size = 8); } } module layer1() { oH = layer1H; oL = innerBoxLength - 2*layerClearance; // outer length oW = innerBoxWidth - 2*layerClearance; // outer width iL = oL - 2*innerWall; // inner length iW = oW - 2*innerWall; // inner width iH = oH - innerWall; // inner height handleDia = 42; cableDia = 130; translate([innerWall, innerWall, innerWall]) union() { difference() { // main shell translate([-innerWall, -innerWall, -innerWall]) roundedCube([oW, oL, oH], [1, 1, 1]); translate([0, 169, 0]) mirror([0, 1, 0]) union() { // screwdriver handle translate([handleDia / 2, handleDia / 2, handleDia / 2]) sphere(d=handleDia); translate([handleDia / 2, handleDia / 2, handleDia / 2]) cylinder(d=handleDia, h = handleDia / 2 + innerWall); translate([handleDia / 2, handleDia / 2 + 3, handleDia / 2]) sphere(d=handleDia); translate([handleDia / 2, handleDia / 2 + 3, handleDia / 2]) cylinder(d=handleDia, h = handleDia / 2 + innerWall); translate([(handleDia - 32) / 2, handleDia / 2, 7]) cube([32, 103 - handleDia/2, oH]); // screw bits bitL = 112; bitW = 22; // plain cube version (we're going to oversize and chamfer to get // diagonal edges) // translate([(handleDia - bitW) / 2, handleDia / 2, 0]) cube([bitW, bitL + handleDia/2, oH]); translate([(handleDia - bitW) / 2 - 5, handleDia / 2 - 5, -ep]) chamferedCube([bitW + 10, bitL + handleDia/2 + 10, 16], chamfer=5); // power block cutout translate([(handleDia - 32) / 2 - 4, handleDia / 2 + 80, 7]) cube([40, 68, oH]); // fingerway cut-outs translate([handleDia*0.6, 55, 0]) cube([24, 36, oH]); } // lower-right cubby translate([handleDia + 2*innerWall, 0, 0]) cube([iW - handleDia - 3*innerWall, 150, oH]); // cable cut-out translate([iW/2, iL - cableDia/2 - innerWall, 0]) cylinder(d=cableDia, h=oH); // upper-left bits union() { // PortaPow translate([6.5, 249.5, 22]) rotate([0, 0, 45]) cube([44.5, 10.5, oH]); // USB thumbdrive translate([5, 272, 1]) rotate([0, 0, 45]) cube([13, 5, oH]); // fingerway translate([16, 271, iH + 15]) sphere(d=46); } // SD-card adapter + SIM removal tool union() { translate([iW - 27, 278, 9.5]) rotate([0, 0, -45]) cube([25, 2.5, 33]); translate([iW - 8, 280, 4.5]) rotate([0, 0, -135]) cube([8.75, 1.5, 38]); // fingerway translate([iW - 16, 271, iH + 15]) sphere(d=46); } // version marker color("black") translate([-innerWall + 0.6, 26, 4]) rotate([90, 0,-90]) linear_extrude(0.61) text(text = verStr, font = font, size = 8); } translate([handleDia*0.988, 77.5, -0.1]) cylinder(d=9, oH - innerWall + 0.1); translate([handleDia*0.988, 114.5, -0.1]) cylinder(d=9, oH - innerWall + 0.1); translate([iW/2 - audioTraySide/2, iL - audioTraySide/2 - cableDia/2 - innerWall, 0]) difference() { translate([0, 0, -0.1]) roundedCube([audioTraySide, audioTraySide, 1.1], [0.4, 0.4, 0.4]); translate([innerWall, innerWall, 0]) cube([audioTraySide - 2*innerWall, audioTraySide - 2*innerWall, 2]); } } } module layer2() { oH = layer2H; oL = innerBoxLength - 2*layerClearance; // outer length oW = innerBoxWidth - 2*layerClearance; // outer width iL = oL - 2*innerWall; // inner length iW = oW - 2*innerWall; // inner width iH = oH - innerWall; // inner height union() { difference() { roundedCube([oW, oL, oH], [1, 1, 1]); translate([innerWall, innerWall, innerWall]) union() { // HDD translate([(iW - 131)/2, 0, 0]) cube([131, 83, oH]); // Tekton tool kit translate([2, 103 + innerWall, 0]) cube([105.5, 61, oH]); // Slice knife translate([114, 103 + innerWall, 0]) cube([22.5, 156, oH]); // cables translate([56, 226, 0]) cylinder(d=110, h=oH); // fingerways translate([30, 80, 0]) cube([36, 30, oH]); translate([105, 130, 0]) cube([12, 36, oH]); } // version marker color("black") translate([0.6, 26 + innerWall, 4]) rotate([90, 0,-90]) linear_extrude(0.61) text(text = verStr, font = font, size = 8); } translate([32, 96, 0]) scale([6, 22, 1]) cylinder(d=1, h=oH); translate([68, 96, 0]) scale([6, 22, 1]) cylinder(d=1, h=oH); translate([112.75, 132, 0]) scale([6.5, 6, 1]) cylinder(d=1, h=oH); } } module audioTrayBlank(s, h) { difference() { union() { translate([0, 0, 1]) roundedCube( [s, s, h - 1], [1, 1, 1]); translate([innerWall + layerClearance, innerWall + layerClearance, 0]) roundedCube( [ s - 2*(innerWall + layerClearance), s - 2*(innerWall + layerClearance), h - 1], [1, 1, 1]); } // bottom edge chamfers translate([-1, (innerWall + layerClearance), 1]) rotate([-30, 0, 0]) translate([0, -2*(innerWall + layerClearance), -4]) cube([audioTraySide+2, 2*(innerWall + layerClearance), 4]); translate([-1, audioTraySide - (innerWall + layerClearance), 1]) rotate([30, 0, 0]) translate([0, 0, -4]) cube([audioTraySide+2, 2*(innerWall + layerClearance), 4]); translate([(innerWall + layerClearance), -1, 1]) rotate([0, 30, 0]) translate([-2*(innerWall + layerClearance), 0, -4]) cube([2*(innerWall + layerClearance), audioTraySide+2, 4]); translate([audioTraySide - (innerWall + layerClearance), -1, 1]) rotate([0, -30, 0]) translate([0, 0, -4]) cube([2*(innerWall + layerClearance), audioTraySide+2, 4]); // top lip cutaway translate([innerWall, innerWall, h - 1]) cube([audioTrayIS,audioTrayIS, 4]); // version marker translate([0.6, 30, 4]) rotate([90, 0,-90]) linear_extrude(0.61) text(text = verStr, font = font, size = 8); } } module audioJackTray() { difference() { audioTrayBlank(s = audioTraySide, h = audioTrayHeight); translate([2.5, innerWall, innerWall]) union() { for (i = [0, 1]) { translate([i*(11), i*60, 0]) mirror([0, i, 0]) union() { translate([6.5, 0, 6]) rotate([-90, 0, 0]) cylinder(d=13, h=28); translate([0, 0, 6]) cube([13, 28, audioTrayIH]); translate([6.5, 27.5, 6]) rotate([-90, 0, 0]) cylinder(d=7, h=32.5); translate([3, 27.5, 6]) cube([7, 32.5, audioTrayIH]); translate([6.5, 48, 3.5]) rotate([-90, 0, 0]) cylinder(d=7, h=12); translate([3, 48, 3.5]) cube([7, 12, audioTrayIH]); translate([6.5, 53, 11]) sphere(d=14); } translate([22 + i*(10), i*60, 0]) mirror([0, i, 0]) translate([0, 6, 0]) union() { translate([6, 0, 7]) rotate([-90, 0, 0]) cylinder(d=12, h=16); translate([0, 0, 7]) cube([12, 16, audioTrayIH]); translate([6, 15.5, 7]) rotate([-90, 0, 0]) cylinder(d=7, h=32.5); translate([2.5, 15.5, 7]) cube([7, 32.5, audioTrayIH]); translate([6, 36, 4]) rotate([-90, 0, 0]) cylinder(d=7, h=12); translate([2.5, 36, 4]) cube([7, 12, audioTrayIH]); translate([6, 43, 11]) sphere(d=13); } } translate([audioTrayIS - 14, 8, 0]) union() { translate([6, 0, 6.5]) rotate([-90, 0, 0]) cylinder(d=12, h=40); translate([0, 0, 6.5]) cube([12, 40, audioTrayIH]); translate([6, 26, 5]) rotate([-90, 0, 0]) cylinder(d=12, h=14); translate([0, 26, 5]) cube([12, 14, audioTrayIH]); } } // Show Cross-section // translate([-2, -1, -1]) cube([audioTraySide + 4, 20, audioTrayHeight + 4]); } } module drumKeyTray() { difference() { audioTrayBlank(s = audioTraySide, h = audioTrayHeight); translate([innerWall, innerWall, innerWall]) union() { // drum-key translate([audioTrayIS/2, 2*innerWall, 0]) union() { translate([0, 0, 7.5]) rotate([-90, 0, 0]) cylinder(d=11, h=36); translate([-5.5, 0, 7.5]) cube([11, 36, audioTrayIH]); translate([-51/2, 0, 7.5 - 3]) cube([51, 9, audioTrayIH]); } for (i = [-1, 1]) { translate([audioTrayIS/2 - 6 + i*20, 16, 0]) union() { translate([6, 0, 7]) rotate([-90, 0, 0]) cylinder(d=12, h=40); translate([0, 0, 7]) cube([12, 40, audioTrayIH]); translate([6, 26, 5]) rotate([-90, 0, 0]) cylinder(d=12, h=14); translate([0, 26, 5]) cube([12, 14, audioTrayIH]); } } } // Show Cross-section // translate([-2, -1, -1]) cube([audioTraySide + 4, 10, audioTrayHeight + 4]); } } module headphoneAmpTray() { difference() { audioTrayBlank(s = audioTraySide, h = audioTrayHeight - 1); translate([2*innerWall, (audioTrayIS - 43)/2, innerWall]) cube([43, 43, audioTrayIH]); translate([3*innerWall + 43, (audioTrayIS - 43)/2, innerWall]) cube([12.4, 46, audioTrayIH]); translate([50, 8 + innerWall*2, innerWall]) cylinder(d=16, h=audioTrayIH); } } module usbBitsTray() { difference() { audioTrayBlank(s = audioTraySide, h = audioTrayHeight); translate([innerWall, innerWall, innerWall]) union() { // right-angle connectors (1st variation) translate([innerWall, innerWall, -1]) for (i = [0, 1]) { translate([34*i, 16*i, 0]) rotate([0, 0, 180*i]) union() { // main body cube([22.5, 7, 14]); // usb connector // 1.64 to edge, 4.64 thick translate([1.4, 0, 0]) cube([6, 16, 14]); // release wedge translate([22.5, 0, 0]) rotate([0, 15, 0]) translate([-22, 0, 0]) cube([22, 7, 14]); // fingerway translate([-1, -1, 11]) cube([36, 18, 3]); } } // right-angle connectors (2nd variation) translate([innerWall, innerWall + 18, 5 + 0.1]) for (i = [0, 1]) { translate([30*i, 36*i, 0]) rotate([0, 0, 180*i]) union() { // main body cube([25, 13, 7]); // usb connector // 10.32 wide, 0.73 to edge cube([12, 22, 7]); // release wedge translate([17, 0, 0]) rotate([0, 30, 0]) cube([8, 13, 7]); // finergway translate([25, 6.5, 8]) sphere(d=13); } } // usb A-C converers // 29 x 18 x 9 translate([innerWall + 38, innerWall - 0.5, 3]) for(i = [0,1]) { translate([0, 28.5*2*i, 0]) mirror([0, i, 0]) union() { // main body cube([18, 29, 10]); // release wedge translate([0, 28.5, -4]) rotate([-20, 0, 0]) translate([0, -29, 0]) cube([18, 29, 14]); } } } } } standoffX = outerBoxWidth + 10; standoffY = outerBoxLength + 10; // test-print the lip shellBottom([20, 30, 30]); translate([24, 0, 0]) shellTop([20, 30, 30]); /* shellBottom([outerBoxWidth, outerBoxLength, outerBoxHeight]); translate([0, standoffY, 0]) shellTop([outerBoxWidth, outerBoxLength, outerBoxHeight]); translate([standoffX, 0, 0]) layer1(); translate([standoffX, standoffY, 0]) layer2(); translate([2*standoffX, 0, 0]) audioJackTray(); translate([2*standoffX, 80, 0]) usbBitsTray(); translate([2*standoffX, 160, 0]) headphoneAmpTray(); translate([2*standoffX, 240, 0]) drumKeyTray(); */