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

638 lines
18 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="v12";
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]);
}
*/
// ropeway
for (i = [1, 3]) {
for (j = [-1, 1]) {
/* Older, diagonal cut
translate([dims[0]/2 - j*dims[0]/2 + j*1.5, i*dims[1]/4, -1])
rotate([0, 0, 45 + 90*j])
cube([4, 4, bottomShellH + 8]);
*/
translate([dims[0]/2 - j*dims[0]/2 - 1.5, i*dims[1]/4 - 2.5, -1])
chamferedCube([3, 5, bottomShellH + 8], chamfer=1.5);
}
/* Older, diagonal cut
translate([-1, i*dims[1]/4, 1.5])
rotate([-135, 0, 0])
cube([dims[0] + 8, 4, 4]);
*/
translate([-1, i*dims[1]/4 - 2.5, -1.5])
chamferedCube([dims[0] + 8, 5, 3], chamfer=1.5);
}
// 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]);
}
*/
// ropeway
for (i = [1, 3]) {
for (j = [-1, 1]) {
/* Older, diagonal cut
translate([dims[0]/2 - j*dims[0]/2 + j*1.5, i*dims[1]/4, -1])
rotate([0, 0, 45 + 90*j])
cube([4, 4, topShellH + 8]);
*/
translate([dims[0]/2 - j*dims[0]/2 - 1.5, i*dims[1]/4 - 2.5, -1])
chamferedCube([3, 5, topShellH + 8], chamfer=1.5);
}
/* Older, diagonal cut
translate([-1, i*dims[1]/4, 1.5])
rotate([-135, 0, 0])
cube([dims[0] + 8, 4, 4]);
*/
translate([-1, i*dims[1]/4 - 2.5, -1.5])
chamferedCube([dims[0] + 8, 5, 3], chamfer=1.5);
}
// version marker
color("black")
translate([0.6, 26, 8]) rotate([90, 0,-90])
linear_extrude(0.61) text(text = verStr, font = font, size = 8);
}
/* -45 = x + -y
* x = y - 45
*
* 135 = x + y
* y = 135 - x
* y = 135 - (y - 45)
* y = 180 - y
* y = 90
*
*/
// tray indent location
// X: innerWall + iW/2 - audioTraySide/2
// 2 + (innerBoxWidth - 2*layerClearance - 2*innerWall)/2 - 64/2
// 2 + ((outerBoxWidth - 2*outerWall) - 2*0.5 - 2*2)/2 - 32
// 2 + (154 - 8 - 1 - 4)/2 - 32
// 40.5
//
// Y: innerWall + iL - audioTraySide/2 - cableDia/2 - innerWall
// 2 + (innerBoxLength - 2*layerClearance - 2*innerWall) - 64/2 - 130/2 - 2
// 2 + (outerBoxLength - 2*outerWall) - 2*0.5 - 2*2 - 32 - 65 - 2
// 300 - 8 - 1 - 4 - 32 - 65
// 190
//
translate([
40.5 + outerWall + layerClearance,
190 + outerWall + layerClearance,
1])
//(dims[0] - audioTraySide)/2,
//dims[1] - outerWall - innerWall - audioTraySide/2 - 130/2,
//1])
roundedCube(
[ audioTraySide - 2*(innerWall + layerClearance),
audioTraySide - 2*(innerWall + layerClearance),
4],
[1, 1, 1]);
}
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();