Backpack Organizer v9: add shells.

This commit is contained in:
2025-12-31 19:46:41 -06:00
parent 330998483a
commit 22a2b276f5
+136 -15
View File
@@ -6,15 +6,20 @@ $fn=128;
outerWall=4;
innerWall=2;
layerClearance = 0.5;
verStr="v8";
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;
@@ -25,8 +30,114 @@ 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 = 44;
oH = layer1H;
oL = innerBoxLength - 2*layerClearance; // outer length
oW = innerBoxWidth - 2*layerClearance; // outer width
iL = oL - 2*innerWall; // inner length
@@ -66,7 +177,7 @@ module layer1() {
// 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])
translate([(handleDia - bitW) / 2 - 5, handleDia / 2 - 5, -ep])
chamferedCube([bitW + 10, bitL + handleDia/2 + 10, 16], chamfer=5);
// power block cutout
@@ -139,7 +250,7 @@ module layer1() {
}
module layer2() {
oH = 40;
oH = layer2H;
oL = innerBoxLength - 2*layerClearance; // outer length
oW = innerBoxWidth - 2*layerClearance; // outer width
iL = oL - 2*innerWall; // inner length
@@ -159,21 +270,21 @@ module layer2() {
// Tekton tool kit
translate([2, 103 + innerWall, 0])
cube([105.5, 57, oH]);
cube([105.5, 61, oH]);
// Slice knife
translate([114, 103 + innerWall, 0])
cube([22.5, 153, oH]);
cube([22.5, 156, oH]);
// cables
translate([56, 224, 0])
translate([56, 226, 0])
cylinder(d=110, h=oH);
// fingerways
translate([30, 80, 0])
cube([36, 30, oH]);
translate([105, 126, 0])
translate([105, 130, 0])
cube([12, 36, oH]);
}
@@ -185,7 +296,7 @@ module layer2() {
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);
translate([112.75, 132, 0]) scale([6.5, 6, 1]) cylinder(d=1, h=oH);
}
}
@@ -426,9 +537,19 @@ module usbBitsTray() {
}
}
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();
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();
*/