3d-models/functional/under_monitor_organizer.scad

609 lines
16 KiB
OpenSCAD

// Enable/Disable parts of the composite model
showBoundBox = false;
showBluRay = false;
showBluRayLid = false;
showHddDrawer = false;
showCubby = false;
showRightDrawer = true;
showLetterShelf = false;
showShell1 = false;
showShell2Top = false;
showShell2Bot = false;
epsilon = 0.01;
maxAvailWidth = 303.43; // width will be on X
maxAvailDepth = 225.63; // depth will be on Y
maxAvailHeigth = 104; // height will be on Z
wall = 2;
outerWall = 3;
slideGap = 1;
lapDepth = 20;
fullWidth = 300;
fullDepth = 225;
fullHeight = 96;
// full-size base and walls
if (showBoundBox) {
translate([0, 0, -(wall + outerWall)])
color("DimGray")
cube([fullWidth, fullDepth, outerWall]);
translate([0, fullDepth + (wall + outerWall), 0])
color("DimGray")
cube([fullWidth, outerWall, fullHeight]);
translate([-(wall + outerWall), 0, 0])
color("DimGray")
cube([outerWall, fullDepth, fullHeight]);
}
// ===========================================================================
// Blu-Ray Drive holder
// ===========================================================================
bluRayWidth = 140;
bluRayDepth = 151;
bluRayHeight = 20;
bluRaySidedoor = 5;
bluRayBackWindow = bluRayWidth - 100;
// test fit pieces
/*
// Lap joint
translate([0, 30, 0])
difference() {
color("SeaGreen") union() {
cube([20, 20, wall]);
cube([wall, 20, 20]);
}
translate([wall-epsilon, -epsilon, -epsilon])
cube([20 + 2*epsilon - wall, lapDepth/2 + 2*epsilon, wall/2 + 2*epsilon]);
translate([wall/2 + epsilon, -epsilon, -epsilon])
cube([wall/2 + 2*epsilon, lapDepth/2 + 2*epsilon, 20 + 2*epsilon]);
}
difference() {
color("SandyBrown") union() {
cube([20, 20, wall]);
cube([wall, 20, 20]);
}
translate([0, 10, 0]) union() {
translate([-epsilon, -epsilon, wall/2])
cube([20 + 2*epsilon, lapDepth/2 + 2*epsilon, wall/2 + 2*epsilon]);
translate([-epsilon, -epsilon, -epsilon])
cube([wall/2 + 2*epsilon, lapDepth/2 + 2*epsilon, 20 + 2*epsilon]);
}
}
// Bluray width
color("Pink") union() {
cube([ bluRayWidth + 2*wall, 4*wall, wall]);
cube([wall, 4*wall, 4*wall]);
translate([bluRayWidth + wall, 0, 0, ]) cube([wall, 4*wall, 4*wall]);
}
// Bluray depth
color("Salmon") translate([0, 5*wall, 0]) union() {
cube([ bluRayDepth + 2*wall, 4*wall, wall]);
cube([wall, 4*wall, 4*wall]);
translate([bluRayDepth + wall, 0, 0, ]) cube([wall, 4*wall, 4*wall]);
}
// Bluray height
color("MistyRose") translate([0, 10*wall, 0]) union() {
cube([ bluRayHeight + 2*wall, 4*wall, wall]);
cube([wall, 4*wall, 4*wall]);
translate([bluRayHeight + wall, 0, 0, ]) cube([wall, 4*wall, 4*wall]);
}
*/
translate([fullWidth - (outerWall + 4*wall + bluRayWidth + slideGap), wall, 0])
union() {
// Blu-Ray box
if (showBluRay) {
color("DodgerBlue")
difference() {
union() {
cube([ // floor
bluRayWidth + 2*wall,
bluRayDepth + 2*wall,
outerWall]);
translate([0, bluRayDepth + wall, 0])
cube([ // +y wall
bluRayWidth + 2*wall,
wall,
bluRayHeight + outerWall]);
cube([ // -x wall
wall,
bluRayDepth + 2*wall,
bluRayHeight + outerWall]);
translate([bluRayWidth + wall, 0, 0])
cube([ // +x wall
wall,
bluRayDepth + 2*wall,
bluRayHeight + outerWall]);
cube([ // -y front sidedoor 1
bluRaySidedoor + wall,
wall,
bluRayHeight + outerWall]);
translate([bluRayWidth + wall - bluRaySidedoor, 0, 0])
cube([ // -y sidedoor 2
bluRaySidedoor + wall,
wall,
bluRayHeight + outerWall]);
translate([bluRayWidth - 3, wall - 0.5, 0])
rotate([0, 0, -15])
cube([0.4, 20, bluRayHeight + outerWall]);
translate([6.6, wall - 0.5, 0])
rotate([0, 0, 15])
cube([0.4, 20, bluRayHeight + outerWall]);
}
translate([80, bluRayDepth + wall - epsilon, outerWall])
cube([ // +y window cutout
bluRayBackWindow,
wall + 2*epsilon,
bluRayHeight + epsilon]);
}
}
// Blu-Ray lid
if (showBluRayLid) {
color("CornflowerBlue")
translate([-wall, -wall, bluRayHeight + outerWall])
// translate([0, -20, 0]) // for printing
// rotate([180, 0, 0])
union() {
cube([ // ceiling
bluRayWidth + 4*wall,
bluRayDepth + 4*wall,
wall]);
translate([0, 0, -wall])
cube([ // -x lip
wall - 0.2,
bluRayDepth + 4*wall,
2*wall]);
translate([bluRayWidth + 3*wall + 0.2, 0, -wall])
cube([ // +x lip
wall - 0.2,
bluRayDepth + 4*wall,
2*wall]);
translate([0, 0, -wall])
cube([ // -y lip
bluRayWidth + 4*wall,
wall - 0.2,
2*wall]);
translate([0, bluRayDepth + 3*wall + 0.2, -wall])
cube([ // +y lip
bluRayWidth + 4*wall,
wall - 0.2,
2*wall]);
}
}
}
// ===========================================================================
// HDD Drawer + Cubby
// ===========================================================================
hddMinDepth = 110;
hddMinHeight = 80;
hddDepth = 134;
hddHeight = 84;
hddLargeWidth = 22;
hddSmallWidth = 12;
ccDepth = 88;
ccWidth = 56;
fingerWidth = 24;
module hddSlot(width) {
cube([ // floor
width + 2*wall,
hddDepth + wall,
wall]);
translate([width + wall, hddDepth*0.25, 0])
cube([ // +x wall
wall,
hddDepth*0.75 + wall,
hddHeight/2 + wall]);
translate([0, hddDepth*0.25, 0])
cube([ // -x wall
wall,
hddDepth*0.75 + wall,
hddHeight/2 + wall]);
translate([0, hddDepth, 0])
cube([ // +y wall
width + 2*wall,
wall,
hddHeight/2 + wall]);
}
cubbyFullWidth = 2*(hddLargeWidth + wall) + 6*(hddSmallWidth + wall) + wall;
translate([outerWall + slideGap, 0, outerWall + slideGap])
union() {
// HDD Slots
if (showHddDrawer) {
translate([0, fullDepth - (hddDepth + wall + outerWall + slideGap),0])
difference() {
color("IndianRed")
union() {
for (i = [0:5]) {
translate([(hddSmallWidth + wall)*i, 0, 0])
hddSlot(hddSmallWidth);
}
for (i = [0:1]) {
translate([(hddLargeWidth + wall)*i + 6*(hddSmallWidth + wall), 0, 0])
hddSlot(hddLargeWidth);
}
// +y wall
translate([0, hddDepth, 0])
cube([cubbyFullWidth, wall, hddHeight]);
// -x wall
cube([wall, hddDepth, hddHeight]);
// +x wall
translate([cubbyFullWidth - wall, 0, ])
cube([wall, hddDepth, hddHeight]);
// floor toungue for assembly
translate([0, (wall-lapDepth)/2, 0])
cube([ cubbyFullWidth, lapDepth, wall/2 ]);
// -x wall toungue
translate([wall/2, -lapDepth/2 + wall/2, 0])
cube([wall/2, lapDepth, hddHeight]);
// +x wall toungue
translate([cubbyFullWidth - wall, -lapDepth/2 + wall/2, 0])
cube([wall/2, lapDepth, hddHeight]);
}
// floor toungue cut-out
translate([-epsilon, (wall-lapDepth)/2 - epsilon, wall/2 - epsilon])
cube([cubbyFullWidth + 2*epsilon, lapDepth + 2*epsilon, wall/2 + 2*epsilon]);
// -x wall toungue cutout
translate([-epsilon, -lapDepth/2 - epsilon + wall/2, -epsilon])
cube([wall/2 + 2*epsilon, lapDepth + 2*epsilon, hddHeight + 2*epsilon]);
// +x wall toungue cutout
translate([cubbyFullWidth - (wall/2 + epsilon), -lapDepth/2 - epsilon + wall/2, -epsilon])
cube([wall/2 + 2*epsilon, lapDepth + 2*epsilon, hddHeight + 2*epsilon]);
}
}
// Cubby drawer
if (showCubby) {
color("FireBrick")
difference() {
union() {
cube([ // base
cubbyFullWidth,
fullDepth - (hddDepth + outerWall + wall + slideGap),
wall]);
cube([ // -x wall
wall,
fullDepth - (hddDepth + outerWall + wall + slideGap),
hddHeight]);
translate([cubbyFullWidth - wall, 0, 0])
cube([ // +x wall
wall,
fullDepth - (hddDepth + outerWall + wall + slideGap),
hddHeight]);
cube([ // -y wall
cubbyFullWidth,
wall,
hddHeight]);
translate([
(cubbyFullWidth - ccDepth - 2*wall)/2,
(fullDepth - (hddDepth + outerWall + 3*wall + slideGap + ccWidth)),
0])
difference() {
// cc well walls
union() {
cube([ // -y wall
ccDepth + 2*wall,
wall,
hddHeight/2]);
translate([0, ccWidth + wall, 0])
cube([ // +y wall
ccDepth + 2*wall,
wall,
hddHeight/2]);
cube([ // -x wall
wall,
ccWidth + 2*wall,
hddHeight/2]);
translate([ccDepth + wall, 0, 0])
cube([ // +x wall
wall,
ccWidth + 2*wall,
hddHeight/2]);
}
// finger cut-out for picking up credit cards
union() {
translate([ccDepth/2 + wall, ccWidth + 2*wall + epsilon, fingerWidth/2 + wall])
rotate([90, 0, 0])
cylinder(h=ccWidth + 2*wall + 2*epsilon, r=fingerWidth/2);
translate([ccDepth/2 - fingerWidth/2 + wall, -epsilon, fingerWidth/2 + epsilon])
cube([
fingerWidth,
ccWidth + 2*wall + 2*epsilon,
hddHeight/2 - fingerWidth/2]);
}
}
// floor toungue for assembly
translate([0, fullDepth - (hddDepth + outerWall + wall + lapDepth/2), wall/2])
cube([cubbyFullWidth, lapDepth, wall/2 ]);
// -w wall toungue
translate([0, fullDepth - (hddDepth + outerWall + wall + lapDepth/2), 0])
cube([wall/2, lapDepth, hddHeight]);
// +w wall toungue
translate([cubbyFullWidth - wall/2, fullDepth - (hddDepth + outerWall + wall + lapDepth/2), 0])
cube([wall/2, lapDepth, hddHeight]);
}
// floor toungue cutaway for assembly
translate([wall-epsilon, fullDepth - (hddDepth + outerWall + wall + lapDepth/2 - epsilon), -epsilon])
cube([cubbyFullWidth + 2*epsilon - 2*wall, lapDepth + 2*epsilon, wall/2 + 2*epsilon ]);
translate([wall/2 - epsilon, fullDepth - (hddDepth + outerWall + wall + lapDepth/2), -epsilon])
cube([wall/2 + 2*epsilon, lapDepth + 2*epsilon, hddHeight + 2*epsilon]);
translate([cubbyFullWidth - wall - epsilon, fullDepth - (hddDepth + outerWall + wall + lapDepth/2), -epsilon])
cube([wall/2 + 2*epsilon, lapDepth + 2*epsilon, hddHeight + 2*epsilon]);
}
}
}
// ===========================================================================
// Right Drawer
// ===========================================================================
rightDrawerHeight = 35;
rightDrawerDepth = fullDepth - outerWall - slideGap;
rightDrawerWidth = fullWidth - cubbyFullWidth - 3*outerWall - 4*slideGap;
if (showRightDrawer) {
color("MediumSeaGreen")
translate([cubbyFullWidth + 2*outerWall + 3*slideGap, 0, bluRayHeight + 2*outerWall])
union() {
cube([ // floor
rightDrawerWidth,
rightDrawerDepth,
wall]);
cube([ // -x wall
wall,
rightDrawerDepth,
rightDrawerHeight]);
translate([rightDrawerWidth - wall, 0, 0])
cube([ // +x wall
wall,
rightDrawerDepth,
rightDrawerHeight]);
cube([ // -y wall
rightDrawerWidth,
wall,
rightDrawerHeight]);
translate([0, rightDrawerDepth - wall, 0])
cube([ // -y wall
rightDrawerWidth,
wall,
rightDrawerHeight]);
}
}
// ===========================================================================
// Letter Shelf
// ===========================================================================
letterBoxDepth = 20;
letterBoxRecline = 2;
if (showLetterShelf) {
color("PeachPuff")
translate([cubbyFullWidth + outerWall + 2*slideGap, 0, fullHeight - letterBoxDepth])
rotate([-letterBoxRecline, 0, 0])
union() {
cube([
fullWidth - cubbyFullWidth - outerWall - 2*slideGap,
fullDepth,
wall ]);
}
}
// ===========================================================================
// Outer Shell
// ===========================================================================
shell1Width = cubbyFullWidth + outerWall + 2*slideGap;
if (showShell1) {
color("MidnightBlue")
difference() {
union() {
cube([ // floor
shell1Width,
fullDepth,
outerWall]);
cube([ // -x wall
outerWall,
fullDepth,
fullHeight/3]);
translate([0, fullDepth - outerWall, 0])
cube([ // +y wall (short)
shell1Width,
outerWall,
fullHeight/3]);
translate([shell1Width/2, 0, -20])
cube([ // printing support
wall,
fullDepth,
20 + epsilon]);
}
union() {
translate([shell1Width - lapDepth, fullDepth - outerWall/2 + epsilon, -epsilon])
cube([ // +y wall lip cutout
lapDepth + epsilon,
outerWall/2 + epsilon,
fullHeight/3 + 2*epsilon]);
translate([shell1Width - lapDepth, -epsilon, outerWall/2 + epsilon])
cube([ // floor lip cutout
lapDepth + 2*epsilon,
fullDepth + 2*epsilon,
outerWall/2 + epsilon]);
}
}
}
shell2Width = fullWidth - cubbyFullWidth - outerWall - 2*slideGap;
if (showShell2Top) {
color("SlateBlue")
translate([cubbyFullWidth + outerWall + 2*slideGap, 0, fullHeight/2])
difference() {
union() {
cube([ // middle x wall
outerWall,
fullDepth,
fullHeight/2]);
translate([shell2Width - outerWall, 0, 0])
cube([ // +x wall
outerWall,
fullDepth,
fullHeight/2]);
translate([0, fullDepth - outerWall, 0])
cube([ // +y wall (tall)
shell2Width,
outerWall,
fullHeight/2]);
translate([0, 0, fullHeight/2 - outerWall])
cube([ // ceiling
shell2Width,
fullDepth,
outerWall ]);
}
union() {
translate([-epsilon, fullDepth - outerWall/2 + epsilon, -epsilon])
cube([ // +y wall lip cutout
shell2Width + 2*epsilon,
outerWall/2 + epsilon,
lapDepth + 2*epsilon]);
translate([outerWall/2, -epsilon, -epsilon])
cube([ // -x wall lip cutout
outerWall/2 + 2*epsilon,
fullDepth,
lapDepth + 2*epsilon ]);
translate([shell2Width - outerWall -epsilon, -epsilon, -epsilon])
cube([ // +x wall lip cutout
outerWall/2 + 2*epsilon,
fullDepth,
lapDepth + 2*epsilon ]);
}
}
}
if (showShell2Bot) {
color("DarkSlateBlue")
translate([cubbyFullWidth + outerWall + 2*slideGap, 0, 0])
union() {
cube([ // floor
shell2Width,
fullDepth,
outerWall]);
cube([ // middle x wall
outerWall,
fullDepth,
fullHeight/2]);
translate([shell2Width - outerWall, 0, 0])
cube([ // +x wall
outerWall,
fullDepth,
fullHeight/2]);
translate([0, fullDepth - outerWall, 0])
cube([ // +y wall (tall)
shell2Width,
outerWall,
fullHeight/2]);
translate([-lapDepth, fullDepth - outerWall/2, 0])
cube([ // +y wall lip 1 (to shell 1)
lapDepth + epsilon,
outerWall/2,
fullHeight/3]);
translate([0, fullDepth - outerWall/2, fullHeight/2 - epsilon])
cube([ // +y wall lip 2 (to shell 2 top)
shell2Width,
outerWall/2,
lapDepth + epsilon]);
translate([outerWall/2, 0, fullHeight/2 - epsilon])
cube([ // -x wall lip
outerWall/2,
fullDepth,
lapDepth + epsilon ]);
translate([shell2Width - outerWall, 0, fullHeight/2 - epsilon])
cube([ // +x wall lip
outerWall/2,
fullDepth,
lapDepth + epsilon ]);
translate([-lapDepth, 0, outerWall/2])
cube([ // floor lip
lapDepth + epsilon,
fullDepth,
outerWall/2 ]);
}
}