Files
3d-models/backpack-organization/main-box.scad
T

556 lines
15 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="v9";
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 + 1;
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 - ep])
roundedCube(
[dims[0] - 2*lipClearance, dims[1] - 2*lipClearance, 4 - 1],
[2, 2, 0]);
}
// 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, 20, 8]) rotate([90, 0,-90])
linear_extrude(0.61) text(text = verStr, font = font, size = 8);
}
}
module shellTop(dims) {
lipClearance = innerWall + 1;
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([lipClearance, lipClearance, topShellH])
roundedCube(
[dims[0] - 2*lipClearance, dims[1] - 2*lipClearance, dims[2]],
[2, 2, 0]);
// carve out a 0.6mm sliver for the fabric to sit in
fabricClearance = 0.6;
translate([
lipClearance,
lipClearance,
topShellH - 4])
difference() {
roundedCube(
[ dims[0] - 2*lipClearance,
dims[1] - 2*lipClearance,
7],
[2, 2, 0]);
translate([fabricClearance, fabricClearance, -ep])
roundedCube(
[ dims[0] - 2*lipClearance - 2*fabricClearance,
dims[1] - 2*lipClearance - 2*fabricClearance,
8],
[2, 2, 0]);
}
// version marker
color("black")
translate([0.6, 20, 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, 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 = 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, 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, 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();
*/