435 lines
12 KiB
OpenSCAD
435 lines
12 KiB
OpenSCAD
include <../lib/chamfered-cube.scad>
|
|
include <../lib/rounded-cube.scad>
|
|
|
|
// All units in mm
|
|
$fn=128;
|
|
outerWall=4;
|
|
innerWall=2;
|
|
layerClearance = 0.5;
|
|
verStr="v8";
|
|
font="Montserrat";
|
|
|
|
// 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.
|
|
outerBoxLength = 300;
|
|
outerBoxWidth = 154;
|
|
|
|
innerBoxLength = outerBoxLength - 2*outerWall;
|
|
innerBoxWidth = outerBoxWidth - 2*outerWall;
|
|
|
|
audioTraySide = 64;
|
|
audioTrayHeight = 15;
|
|
audioTrayIS = audioTraySide - 2*innerWall;
|
|
audioTrayIH = audioTrayHeight - innerWall;
|
|
|
|
|
|
module layer1() {
|
|
oH = 44;
|
|
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, -0.01])
|
|
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, 20, 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 = 40;
|
|
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, 57, oH]);
|
|
|
|
// Slice knife
|
|
translate([114, 103 + innerWall, 0])
|
|
cube([22.5, 153, oH]);
|
|
|
|
// cables
|
|
translate([56, 224, 0])
|
|
cylinder(d=110, h=oH);
|
|
|
|
// fingerways
|
|
translate([30, 80, 0])
|
|
cube([36, 30, oH]);
|
|
|
|
translate([105, 126, 0])
|
|
cube([12, 36, oH]);
|
|
}
|
|
|
|
// version marker
|
|
color("black")
|
|
translate([0.6, 20 + 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, 128, 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]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
layer1();
|
|
//layer2();
|
|
//translate([outerBoxWidth + 10, 0, 0]) audioJackTray();
|
|
//translate([outerBoxWidth + 10, 80, 0]) usbBitsTray();
|
|
//translate([outerBoxWidth + 10, 160, 0]) headphoneAmpTray();
|
|
//translate([outerBoxWidth + 10, 240, 0]) drumKeyTray();
|