Bunch of updates.
This commit is contained in:
@@ -1,525 +1,387 @@
|
||||
// System to divide a Kallax half-shelf into four equal drawers
|
||||
// All units measured in millimeters
|
||||
include <../lib/mortice-and-tenon.scad>
|
||||
include <./constants.scad>
|
||||
include <../lib/metric-machine-screws.scad>
|
||||
|
||||
$fn = 32;
|
||||
// all measurements in mm
|
||||
// boardThickness = 4.7; // 1/8" plywood
|
||||
boardThickness = 7.35;
|
||||
feltThickness = 2.5;
|
||||
feltWidth = 12;
|
||||
clipThickness = boardThickness + 2*feltThickness;
|
||||
clipWallThickness = 4;
|
||||
clipFlangeLength = 24;
|
||||
clipFlangeWidth = 16;
|
||||
|
||||
module sampleBox(dims, wallThickness) {
|
||||
// base
|
||||
cube([dims[0], dims[1], wallThickness]);
|
||||
// measurements for the wooden panels to cut:
|
||||
//
|
||||
// ───────────── - top board (A)
|
||||
// │ │ │
|
||||
// │───────────│
|
||||
// │ │ │
|
||||
// │───────────│
|
||||
//
|
||||
//
|
||||
// top board: 320.0 x 370.0
|
||||
// bottom board: 305.6 x 370.0 (320 - 2*4.7 - 2*2.5) x 370
|
||||
// side boards: 152.8 x 370.0 (160 - 4.7 - 2.5) x 370
|
||||
// inner boards: 70.45 x 370.0 ((160 - 3*4.7 - 2*2.5)/2) x 370
|
||||
//
|
||||
|
||||
// top
|
||||
translate([0, 0, dims[2] - wallThickness])
|
||||
cube([dims[0], dims[1], wallThickness]);
|
||||
module fastenerBlank() {
|
||||
translate([0, 0.1 + 2 * clipWallThickness + boardThickness, 0])
|
||||
rotate([90, 0, 0])
|
||||
m3Nut(h=2.41);
|
||||
|
||||
// middle shelf
|
||||
translate([0, 0, (dims[2] - wallThickness) / 2])
|
||||
cube([dims[0], dims[1], wallThickness]);
|
||||
translate([0, 2.4, 0])
|
||||
rotate([90, 0, 0])
|
||||
m3Nut(h=2.41);
|
||||
|
||||
// left wall
|
||||
cube([wallThickness, dims[1], dims[2]]);
|
||||
translate([0, 0.1 + 2 * clipWallThickness + boardThickness, 0])
|
||||
rotate([90, 0, 0])
|
||||
cylinder(d = 3.2, center = false, $fn=128,
|
||||
h = 0.2 + 2 * clipWallThickness + boardThickness);
|
||||
}
|
||||
|
||||
// middle divider
|
||||
translate([(dims[0] - wallThickness) / 2, 0, 0])
|
||||
cube([wallThickness, dims[1], dims[2]]);
|
||||
module dowelBlank() {
|
||||
translate([0, 0.1 + 2 * clipWallThickness + boardThickness, 0])
|
||||
rotate([90, 0, 0])
|
||||
cylinder(d = 3.175, center = false, $fn=128,
|
||||
h = 0.2 + 2 * clipWallThickness + boardThickness);
|
||||
}
|
||||
|
||||
// right wall
|
||||
translate([dims[0] - wallThickness, 0, 0])
|
||||
cube([wallThickness, dims[1], dims[2]]);
|
||||
module cornerClipA() {
|
||||
difference() {
|
||||
cube([clipFlangeLength, clipFlangeLength, clipFlangeLength]);
|
||||
|
||||
translate([clipWallThickness, clipWallThickness, clipWallThickness])
|
||||
union() {
|
||||
cube([clipFlangeLength, boardThickness, clipFlangeLength]);
|
||||
cube([boardThickness, clipFlangeLength, clipFlangeLength]);
|
||||
}
|
||||
|
||||
translate([
|
||||
boardThickness + 2*clipWallThickness,
|
||||
boardThickness + 2*clipWallThickness,
|
||||
-1 ])
|
||||
cube([clipFlangeLength, clipFlangeLength, clipFlangeLength + 2]);
|
||||
|
||||
for (i = [-1, 0]) {
|
||||
rotate([0, 0, i * 180])
|
||||
mirror([i * 1, i * 1, 0])
|
||||
translate([
|
||||
clipFlangeLength - clipWallThickness,
|
||||
0,
|
||||
clipFlangeLength - clipWallThickness])
|
||||
dowelBlank();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module cornerClip() {
|
||||
difference() {
|
||||
cube([clipThickness, clipThickness, clipThickness]);
|
||||
|
||||
translate([feltThickness, feltThickness, feltThickness])
|
||||
cube([boardThickness, clipThickness, clipThickness]);
|
||||
|
||||
translate([feltThickness, feltThickness, feltThickness])
|
||||
cube([clipThickness, boardThickness, clipThickness]);
|
||||
}
|
||||
}
|
||||
|
||||
module sideClipA() {
|
||||
translate([clipFlangeLength, 0, 0])
|
||||
difference() {
|
||||
translate([-clipFlangeLength, 0, 0])
|
||||
cube([2 * clipFlangeLength, clipFlangeLength, clipFlangeLength + boardThickness]);
|
||||
|
||||
translate([0, clipWallThickness, clipWallThickness])
|
||||
union() {
|
||||
translate([-0.1 - clipFlangeLength, 0, 0])
|
||||
cube([2*clipFlangeLength + 0.2, clipFlangeLength, boardThickness]);
|
||||
|
||||
translate([-boardThickness/2, 0, 0])
|
||||
cube([boardThickness, clipFlangeLength, clipFlangeLength + boardThickness]);
|
||||
}
|
||||
|
||||
for (i = [0, 1]) {
|
||||
mirror([i, 0, 0])
|
||||
translate([
|
||||
clipWallThickness + boardThickness/2,
|
||||
-0.1,
|
||||
2*clipWallThickness + boardThickness])
|
||||
cube(clipFlangeLength+0.2);
|
||||
}
|
||||
|
||||
for (i = [0:2]) {
|
||||
translate([0, 0, boardThickness/2 + clipWallThickness])
|
||||
rotate([0, i*-90, 0])
|
||||
translate([
|
||||
clipFlangeLength - 2*clipWallThickness,
|
||||
clipFlangeLength - 2*clipWallThickness,
|
||||
-boardThickness/2 - clipWallThickness])
|
||||
rotate([90, 0, 0])
|
||||
dowelBlank();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module sideClip() {
|
||||
difference() {
|
||||
cube([clipThickness, 2 * clipThickness, clipThickness]);
|
||||
|
||||
translate([-0.1, feltThickness, feltThickness])
|
||||
cube([clipThickness + 0.2, boardThickness, clipThickness]);
|
||||
|
||||
translate([feltThickness, feltThickness, feltThickness])
|
||||
cube([boardThickness, 2 * clipThickness, clipThickness]);
|
||||
}
|
||||
}
|
||||
|
||||
module crossClipA() {
|
||||
cutoutLength = 2*clipFlangeLength + boardThickness;
|
||||
//translate([cutoutLength/2, 0, cutoutLength/2])
|
||||
difference() {
|
||||
translate([-cutoutLength/2, 0, -cutoutLength/2])
|
||||
cube([cutoutLength, clipFlangeLength, cutoutLength]);
|
||||
|
||||
translate([-cutoutLength/2-0.1, clipWallThickness, -boardThickness/2])
|
||||
cube([2*clipFlangeLength + boardThickness + 0.2, clipFlangeLength, boardThickness]);
|
||||
|
||||
translate([-boardThickness/2, clipWallThickness, -cutoutLength/2-0.1])
|
||||
cube([boardThickness, clipFlangeLength, 2*clipFlangeLength + boardThickness + 0.2]);
|
||||
|
||||
for (i = [0:3]) {
|
||||
rotate([0, i*90, 0])
|
||||
translate([
|
||||
clipWallThickness + boardThickness/2,
|
||||
-0.1,
|
||||
clipWallThickness + boardThickness/2])
|
||||
cube(clipFlangeLength+0.2);
|
||||
}
|
||||
|
||||
for (i = [0:3]) {
|
||||
rotate([0, i*-90, 0])
|
||||
translate([clipFlangeLength - clipWallThickness, clipFlangeLength - 1.5*clipWallThickness, -clipWallThickness - boardThickness/2])
|
||||
rotate([90, 0, 0])
|
||||
dowelBlank();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module printableSet() {
|
||||
difference() {
|
||||
translate([0, 0, -1.4])
|
||||
union() {
|
||||
for (i = [0:7])
|
||||
translate([i * (clipThickness + 2), clipThickness, 0])
|
||||
rotate([45, 0, 0])
|
||||
cornerClip();
|
||||
|
||||
for (i = [0:7])
|
||||
translate([i * (clipThickness + 2), 3 * clipThickness, 0])
|
||||
rotate([0, 0, 0])
|
||||
sideClip();
|
||||
|
||||
for (i = [0:1])
|
||||
translate([i * (2 * clipThickness + 2), 7 * clipThickness, 0])
|
||||
rotate([45, 0, 0])
|
||||
crossClip();
|
||||
}
|
||||
|
||||
translate([-1, -1, -1.4]) cube([100, 100, 1.4]);
|
||||
}
|
||||
}
|
||||
|
||||
module printableSetA() {
|
||||
difference() {
|
||||
union() {
|
||||
translate([20, 0, -4.82])
|
||||
for (i = [0:7])
|
||||
translate([i%4 * (clipFlangeLength + 16), 2*floor(i/4) * clipFlangeLength, 0])
|
||||
rotate([45, -45, 0])
|
||||
cornerClipA();
|
||||
|
||||
translate([0, 0, -2])
|
||||
for (i = [0:7])
|
||||
translate([i%4 * (2*clipFlangeLength + 16), (4 + 2*floor(i/4)) * clipFlangeLength, 0])
|
||||
rotate([45, 0, 0])
|
||||
sideClipA();
|
||||
|
||||
for (i = [0:1])
|
||||
translate([30 + i * (2 * clipFlangeLength + 16), 8.5 * clipFlangeLength, 0])
|
||||
rotate([90, 0, 0])
|
||||
crossClipA();
|
||||
}
|
||||
|
||||
translate([-20, -20, -10]) cube([500, 300, 10]);
|
||||
}
|
||||
}
|
||||
|
||||
module containingBox(boxDims) {
|
||||
difference() {
|
||||
cube([boxDims[0] + 12, boxDims[1], boxDims[2] + 12]);
|
||||
translate([6, -0.1, 6])
|
||||
cube([boxDims[0], boxDims[1] + 0.2, boxDims[2]]);
|
||||
}
|
||||
}
|
||||
|
||||
module feltClearanceBox(boxDims) {
|
||||
difference() {
|
||||
cube([boxDims[0], boxDims[1], boxDims[2]]);
|
||||
|
||||
translate([feltThickness, -0.1, feltThickness])
|
||||
cube([boxDims[0] - 2*feltThickness, boxDims[1] + 0.2, boxDims[2] - 2*feltThickness]);
|
||||
}
|
||||
}
|
||||
|
||||
module topPanel(boxDims) {
|
||||
difference() {
|
||||
color("BurlyWood") cube([boxDims[0], boxDims[1], boardThickness]);
|
||||
color("black") translate([10, 10, boardThickness - 1]) linear_extrude(1.1)
|
||||
text(font="Iosevka", size=16, "top - plywood");
|
||||
}
|
||||
}
|
||||
|
||||
module sidePanel(boxDims) {
|
||||
difference() {
|
||||
color("Wheat") cube([boxDims[2] - boardThickness, boxDims[1], boardThickness]);
|
||||
color("black") rotate([0, 0, -90]) translate([-10, 10, boardThickness - 1]) linear_extrude(1.1)
|
||||
text(font="Iosevka", halign = "right", size=16, "side - plywood");
|
||||
}
|
||||
}
|
||||
|
||||
module innerPanel(boxDims) {
|
||||
difference() {
|
||||
color("BlanchedAlmond") cube([(boxDims[2] - 3*boardThickness) / 2, boxDims[1], boardThickness]);
|
||||
color("black") rotate([0, 0, -90]) translate([-10, 10, boardThickness - 1]) linear_extrude(1.1)
|
||||
text(font="Iosevka", halign = "right", size=16, "inner panel - plywood");
|
||||
}
|
||||
}
|
||||
|
||||
module bottomPanel(boxDims) {
|
||||
difference() {
|
||||
color ("Tan") cube([boxDims[0] - 2*boardThickness, boxDims[1], boardThickness]);
|
||||
color("black") translate([10, 10, boardThickness - 1]) linear_extrude(1.1)
|
||||
text(font="Iosevka", size=16, "bottom - plywood");
|
||||
}
|
||||
}
|
||||
|
||||
// TODO
|
||||
module drawerFacePlate(outerBoxDims, includeClips = false) {
|
||||
|
||||
}
|
||||
|
||||
module tally(count, rightAlign = false) {
|
||||
groups = floor(count / 5);
|
||||
rem = count % 5;
|
||||
xAlign = rightAlign ? -(6 * groups) - (rem * 1.2) : 0;
|
||||
translate([xAlign, 0, 0])
|
||||
module drawerBottom(outerBoxDims, includeClips = false) {
|
||||
}
|
||||
|
||||
module drawerSide(outerBoxDims, includeClips = false) {
|
||||
}
|
||||
|
||||
module assembled(outerBoxDims, includeClips = false) {
|
||||
translate([-6, 0, -6])
|
||||
color("darkgrey")
|
||||
containingBox(outerBoxDims);
|
||||
|
||||
color("brown")
|
||||
feltClearanceBox(outerBoxDims);
|
||||
|
||||
clipOffset = includeClips ? clipWallThickness : 0;
|
||||
|
||||
innerBoxDims = includeClips ?
|
||||
[ outerBoxDims[0] - 2*feltThickness - 2*clipWallThickness,
|
||||
outerBoxDims[1] - 2*clipWallThickness,
|
||||
outerBoxDims[2] - 2*feltThickness - 2*clipWallThickness ] :
|
||||
[ outerBoxDims[0] - 2*feltThickness,
|
||||
outerBoxDims[1],
|
||||
outerBoxDims[2] - 2*feltThickness ];
|
||||
|
||||
translate([feltThickness, 0, feltThickness])
|
||||
union() {
|
||||
if (count > 4) {
|
||||
for (i = [0: max(0, groups - 1)]) {
|
||||
translate([6*i, 0, 0]) for (j = [0:3])
|
||||
translate([j*1.2, 0, 0])
|
||||
cube([0.6, 4, 0.41]);
|
||||
translate([6*i - 0.8, 0.6, 0]) rotate([0, 0, -60]) cube([0.6, 6.2, 0.41]);
|
||||
}
|
||||
translate([ clipOffset, clipOffset, clipOffset])
|
||||
union() {
|
||||
translate([0, 0, innerBoxDims[2] - boardThickness]) topPanel(innerBoxDims);
|
||||
|
||||
translate([boardThickness, 0, 0]) rotate([0, -90, 0]) sidePanel(innerBoxDims);
|
||||
translate([innerBoxDims[0], 0, 0]) rotate([0, -90, 0]) sidePanel(innerBoxDims);
|
||||
|
||||
translate([(innerBoxDims[0] + boardThickness)/2, 0, boardThickness]) rotate([0, -90, 0]) innerPanel(innerBoxDims);
|
||||
translate([(innerBoxDims[0] + boardThickness)/2, 0, 2*boardThickness + (innerBoxDims[2] - 3*boardThickness)/2]) rotate([0, -90, 0]) innerPanel(innerBoxDims);
|
||||
|
||||
translate([boardThickness, 0, boardThickness + (innerBoxDims[2] - 3*boardThickness)/2]) bottomPanel(innerBoxDims);
|
||||
translate([boardThickness, 0, 0]) bottomPanel(innerBoxDims);
|
||||
}
|
||||
|
||||
if (rem != 0) {
|
||||
translate([6*groups, 0, 0])
|
||||
for (j = [0: rem - 1])
|
||||
translate([j*1.2, 0, 0])
|
||||
cube([0.6, 4, 0.41]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (includeClips) {
|
||||
for(i = [0:1]) {
|
||||
translate([0, i * (2 * clipWallThickness + innerBoxDims[1]), 0])
|
||||
mirror([0, i * 1, 0])
|
||||
union() {
|
||||
rotate([-90, -90, 0])
|
||||
cornerClipA();
|
||||
|
||||
wallThickness = 4; // Thickness of walls
|
||||
feltClearance = 2.5; // Clearance for felt pads
|
||||
translate([0, 0, 2 * clipWallThickness + innerBoxDims[2]])
|
||||
rotate([-90, 0, 0])
|
||||
cornerClipA();
|
||||
|
||||
// Dimensions for the box that fits inside a Kallax half-shelf
|
||||
boxWidth = kallaxSide - 2 * feltClearance;
|
||||
boxDepth = kallaxDepth;
|
||||
boxHeight = shelfHeight - 2 * feltClearance;
|
||||
translate([2 * clipWallThickness + innerBoxDims[0], 0, 0])
|
||||
rotate([-90, -180, 0])
|
||||
cornerClipA();
|
||||
|
||||
drawerWidth = (boxWidth - 3 * wallThickness) / 2;
|
||||
drawerHeight = (boxHeight - 3 * wallThickness) / 2;
|
||||
translate([2 * clipWallThickness + innerBoxDims[0], 0, 2 * clipWallThickness + innerBoxDims[2]])
|
||||
rotate([-90, -270, 0])
|
||||
cornerClipA();
|
||||
|
||||
tenonThickness = wallThickness * 0.6;
|
||||
//tenon([6, 8, 2.6]);
|
||||
//morticeBlank([6, 8, 2.6], 0.1);
|
||||
translate([clipWallThickness + innerBoxDims[0]/2 - clipFlangeLength, 0, 0])
|
||||
sideClipA();
|
||||
|
||||
translate([clipWallThickness + innerBoxDims[0]/2 + clipFlangeLength, 0, 2 * clipWallThickness + innerBoxDims[2]])
|
||||
rotate([0, 180, 0])
|
||||
sideClipA();
|
||||
|
||||
// Frame for the box will be made in sections to fit on the print bed
|
||||
// There are three identical horizontal layers (base, middle shelf, top) that
|
||||
// will each be made of four pieces. Looking down overhead from the Z axis they
|
||||
// are:
|
||||
//
|
||||
// x1 x2
|
||||
// ├──┴──┼─┴─┤
|
||||
// ┌─────┬───┐ ┬
|
||||
// │ C │ D │ │
|
||||
// ├─────┼───┤ ├y
|
||||
// │ A │ B │ │
|
||||
// └─────┴───┘ ┴
|
||||
//
|
||||
// There are three identical drawer sides for the lower drawers that are split
|
||||
// into two pieces. Looking from the side, along the X axis they are:
|
||||
//
|
||||
// ├───y───┤
|
||||
// ┌───┬───┐ ┬
|
||||
// │ F │ E │ ├drawerHeight
|
||||
// └───┴───┘ ┴
|
||||
//
|
||||
// There are three identical drawer sides for the upper drawers that are split
|
||||
// into two pieces. Looking from the side, along the X axis they are:
|
||||
//
|
||||
// ├───y───┤
|
||||
// ┌───┬───┐ ┬
|
||||
// │ H │ G │ ├drawerHeight
|
||||
// └───┴───┘ ┴
|
||||
translate([0, 0, innerBoxDims[2]/2 + clipFlangeLength + clipWallThickness])
|
||||
rotate([0, 90, 0])
|
||||
sideClipA();
|
||||
|
||||
x1 = boxWidth * 0.6;
|
||||
x2 = boxWidth - x1;
|
||||
y = boxDepth / 2;
|
||||
tenonDims = [6, 8, tenonThickness];
|
||||
tenonZOffset = (wallThickness - tenonThickness) / 2;
|
||||
verticalTenonDims = [6, wallThickness, tenonThickness];
|
||||
throughTenonDims = [6, 8 + wallThickness, tenonThickness];
|
||||
morticeClearance = 0.1;
|
||||
translate([innerBoxDims[0] + 2*clipWallThickness, 0, innerBoxDims[2]/2 - clipFlangeLength + clipWallThickness])
|
||||
rotate([0, 270, 0])
|
||||
sideClipA();
|
||||
|
||||
module leftSideHorizontalPiece(cutWeight = true) {
|
||||
difference() {
|
||||
cube([x1, y, wallThickness]);
|
||||
|
||||
if (cutWeight) {
|
||||
union() {
|
||||
// cutouts to save materials
|
||||
translate([2*wallThickness, 2*wallThickness, -0.1])
|
||||
cube([drawerWidth - 2*wallThickness, y/2 - 3*wallThickness, wallThickness + 0.2]);
|
||||
|
||||
translate([2*wallThickness, y/2 + wallThickness, -0.1])
|
||||
cube([drawerWidth - 2*wallThickness, y/2 - 3*wallThickness, wallThickness + 0.2]);
|
||||
|
||||
translate([drawerWidth + 3*wallThickness, 2*wallThickness, -0.1])
|
||||
cube([x1 - drawerWidth - 5*wallThickness, y/2 - 3*wallThickness, wallThickness + 0.2]);
|
||||
|
||||
translate([drawerWidth + 3*wallThickness, y/2 + 2*wallThickness, -0.1])
|
||||
cube([x1 - drawerWidth - 5*wallThickness, y/2 - 3*wallThickness, wallThickness + 0.2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module rightSideHorizontalPiece(cutWeight = true) {
|
||||
difference() {
|
||||
cube([x2, y, wallThickness]);
|
||||
|
||||
if (cutWeight) {
|
||||
union() {
|
||||
// cutouts to save materials
|
||||
translate([2*wallThickness, 2*wallThickness, -0.1])
|
||||
cube([x2 - 4*wallThickness, y/2 - 3*wallThickness, wallThickness + 0.2]);
|
||||
translate([2*wallThickness, y/2 + wallThickness, -0.1])
|
||||
cube([x2 - 4*wallThickness, y/2 - 3*wallThickness, wallThickness + 0.2]);
|
||||
translate([innerBoxDims[0]/2 + clipWallThickness, 0, innerBoxDims[2]/2 + clipWallThickness])
|
||||
crossClipA();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module sidePiece(cutWeight = true) {
|
||||
union() {
|
||||
difference() {
|
||||
cube([wallThickness, y, drawerHeight]);
|
||||
module allCutParts(outerBoxDims, includeClips = false) {
|
||||
innerBoxDims = includeClips ?
|
||||
[ outerBoxDims[0] - 2*feltThickness - 2*clipWallThickness,
|
||||
outerBoxDims[1] - 2*clipWallThickness,
|
||||
outerBoxDims[2] - 2*feltThickness - 2*clipWallThickness ] :
|
||||
[ outerBoxDims[0] - 2*feltThickness,
|
||||
outerBoxDims[1],
|
||||
outerBoxDims[2] - 2*feltThickness ];
|
||||
|
||||
if (cutWeight) {
|
||||
// cutouts to save materials
|
||||
translate([-0.1, 2*wallThickness, 2*wallThickness])
|
||||
cube([wallThickness + 0.2, y - 4*wallThickness, drawerHeight - 3*wallThickness]);
|
||||
}
|
||||
}
|
||||
topPanel(innerBoxDims);
|
||||
|
||||
if (cutWeight) {
|
||||
translate([0, wallThickness, 1.414*wallThickness])
|
||||
rotate([-41, 0, 0])
|
||||
cube([wallThickness, wallThickness, drawerHeight * 1.19]);
|
||||
translate([innerBoxDims[0] + 8, 0, 0])
|
||||
bottomPanel(innerBoxDims);
|
||||
|
||||
translate([0, y - 2*wallThickness, 1.414*wallThickness])
|
||||
rotate([65, 0, 0])
|
||||
cube([wallThickness, wallThickness, drawerHeight * 1.97]);
|
||||
}
|
||||
}
|
||||
}
|
||||
translate([0, innerBoxDims[1] + 8, 0])
|
||||
sidePanel(innerBoxDims);
|
||||
|
||||
module pieceA(cutWeight = true) {
|
||||
difference() {
|
||||
union() {
|
||||
leftSideHorizontalPiece(cutWeight);
|
||||
|
||||
// tenons for joining to piece C
|
||||
translate([x1*0.2, y, tenonZOffset]) tenon(tenonDims);
|
||||
translate([x1*0.7, y, tenonZOffset]) tenon(tenonDims);
|
||||
|
||||
// tenons for joining to piece B
|
||||
translate([x1, y*0.2, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90]) tenon(tenonDims);
|
||||
translate([x1, y*0.7, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90]) tenon(tenonDims);
|
||||
}
|
||||
|
||||
union() {
|
||||
// mortices for joining to piece vertical pieces
|
||||
translate([tenonZOffset, y* 0.3, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
translate([tenonZOffset, y* 0.8, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
|
||||
translate([drawerWidth + wallThickness + tenonZOffset, y* 0.3, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(verticalTenonDims, morticeClearance);
|
||||
translate([drawerWidth + wallThickness + tenonZOffset, y* 0.8, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(verticalTenonDims, morticeClearance);
|
||||
|
||||
// piece label
|
||||
translate([2, 2, wallThickness - 0.4]) tally(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pieceB(cutWeight = true) {
|
||||
difference() {
|
||||
union() {
|
||||
rightSideHorizontalPiece(cutWeight);
|
||||
|
||||
// tenons for joining to piece D
|
||||
translate([x2*0.2, y, tenonZOffset]) tenon(tenonDims);
|
||||
translate([x2*0.7, y, tenonZOffset]) tenon(tenonDims);
|
||||
}
|
||||
|
||||
union() {
|
||||
// mortices for joining to piece A
|
||||
translate([0, y*0.2, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
translate([0, y*0.7, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
|
||||
// mortices for joining to piece vertical pieces
|
||||
translate([x2 - wallThickness + tenonZOffset, y* 0.3, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(tenonDims, morticeClearance);
|
||||
|
||||
translate([x2 - wallThickness + tenonZOffset, y* 0.8, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(tenonDims, morticeClearance);
|
||||
|
||||
// piece label
|
||||
translate([2, 2, wallThickness - 0.4]) tally(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pieceC(cutWeight = true) {
|
||||
difference() {
|
||||
union() {
|
||||
leftSideHorizontalPiece(cutWeight);
|
||||
|
||||
// tenons for joining to piece D
|
||||
translate([x1, y*0.2, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90]) tenon(tenonDims);
|
||||
translate([x1, y*0.7, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90]) tenon(tenonDims);
|
||||
}
|
||||
|
||||
union() {
|
||||
|
||||
// mortices for joining to piece A
|
||||
translate([x1*0.2, 0, tenonZOffset])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
translate([x1*0.7, 0, tenonZOffset])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
|
||||
// mortices for joining to piece F/H
|
||||
translate([tenonZOffset, y* 0.3, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
translate([tenonZOffset, y* 0.8, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
|
||||
translate([drawerWidth + wallThickness + tenonZOffset, y* 0.3, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(verticalTenonDims, morticeClearance);
|
||||
translate([drawerWidth + wallThickness + tenonZOffset, y* 0.8, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(verticalTenonDims, morticeClearance);
|
||||
|
||||
// piece label
|
||||
translate([2, 2, wallThickness - 0.4]) tally(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pieceD(cutWeight = true) {
|
||||
difference() {
|
||||
rightSideHorizontalPiece(cutWeight);
|
||||
|
||||
union() {
|
||||
// mortices for joining to piece C
|
||||
translate([0, y*0.2, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
translate([0, y*0.7, tenonZOffset])
|
||||
mirror([0, 1, 0]) rotate([0, 0, -90])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
|
||||
// mortices for joining to piece B
|
||||
translate([x2*0.2, 0, tenonZOffset])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
translate([x2*0.7, 0, tenonZOffset])
|
||||
morticeBlank(tenonDims, morticeClearance);
|
||||
// mortices for joining to piece F/H
|
||||
translate([x2 - wallThickness + tenonZOffset, y* 0.3, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(tenonDims, morticeClearance);
|
||||
|
||||
translate([x2 - wallThickness + tenonZOffset, y* 0.8, 0])
|
||||
rotate([90, 0, 90]) morticeBlank(tenonDims, morticeClearance);
|
||||
|
||||
// piece label
|
||||
translate([2, 2, wallThickness - 0.4]) tally(4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pieceE(cutWeight = true) {
|
||||
difference() {
|
||||
union() {
|
||||
sidePiece(cutWeight);
|
||||
|
||||
// tenons for joining to horizontal pieces
|
||||
translate([tenonZOffset, y*0.3, 0]) mirror([1, 0, 0])
|
||||
rotate([-90, 0, 90]) tenon(verticalTenonDims);
|
||||
translate([tenonZOffset, y*0.8, 0]) mirror([1, 0, 0])
|
||||
rotate([-90, 0, 90]) tenon(verticalTenonDims);
|
||||
|
||||
// tenon for joining to piece F
|
||||
translate([tenonZOffset, y, drawerHeight/2]) mirror([0, 0, 1])
|
||||
rotate([0, 90, 00]) tenon(tenonDims);
|
||||
|
||||
// tenons for joining to piece G
|
||||
translate([tenonZOffset, y*0.3, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(throughTenonDims);
|
||||
translate([tenonZOffset, y*0.8, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(throughTenonDims);
|
||||
//translate([tenonZOffset, y*0.8, 0]) mirror([1, 0, 0])
|
||||
// rotate([-90, 0, 90]) tenon(verticalTenonDims);
|
||||
}
|
||||
|
||||
// piece label
|
||||
translate([0.4, 2, 2]) rotate([90, 0, -90]) tally(5, true);
|
||||
}
|
||||
}
|
||||
|
||||
module pieceF(cutWeight = true) {
|
||||
difference() {
|
||||
union() {
|
||||
sidePiece(cutWeight);
|
||||
|
||||
// tenons for joining to horizontal pieces
|
||||
translate([tenonZOffset, y*0.3, 0]) mirror([1, 0, 0])
|
||||
rotate([-90, 0, 90]) tenon(verticalTenonDims);
|
||||
translate([tenonZOffset, y*0.8, 0]) mirror([1, 0, 0])
|
||||
rotate([-90, 0, 90]) tenon(verticalTenonDims);
|
||||
|
||||
// tenons for joining to piece H
|
||||
translate([tenonZOffset, y*0.3, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(throughTenonDims);
|
||||
translate([tenonZOffset, y*0.8, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(throughTenonDims);
|
||||
|
||||
}
|
||||
|
||||
union() {
|
||||
// mortice for joining to piece E
|
||||
translate([tenonZOffset, 0, drawerHeight/2]) mirror([0, 0, 1])
|
||||
rotate([0, 90, 00]) tenon(tenonDims);
|
||||
|
||||
// piece label
|
||||
translate([0.4, 2, 2]) rotate([90, 0, -90]) tally(6, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pieceG(cutWeight = true) {
|
||||
difference() {
|
||||
union() {
|
||||
sidePiece(cutWeight);
|
||||
|
||||
// tenons for joining to vertical pieces above
|
||||
translate([tenonZOffset, y*0.3, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(verticalTenonDims);
|
||||
translate([tenonZOffset, y*0.8, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(verticalTenonDims);
|
||||
|
||||
// tenon for joining to piece H
|
||||
translate([tenonZOffset, y, drawerHeight/2]) mirror([0, 0, 1])
|
||||
rotate([0, 90, 00]) tenon(tenonDims);
|
||||
|
||||
|
||||
}
|
||||
|
||||
union() {
|
||||
// mortices for joining to piece E
|
||||
translate([tenonZOffset, y*0.3, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
translate([tenonZOffset, y*0.8, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
|
||||
// piece label
|
||||
translate([0.4, 2, 2]) rotate([90, 0, -90]) tally(7, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pieceH(cutWeight = true) {
|
||||
difference() {
|
||||
union() {
|
||||
sidePiece(cutWeight);
|
||||
|
||||
// tenons for joining to vertical pieces above
|
||||
translate([tenonZOffset, y*0.3, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(verticalTenonDims);
|
||||
translate([tenonZOffset, y*0.8, drawerHeight]) rotate([90, 0, 90])
|
||||
tenon(verticalTenonDims);
|
||||
}
|
||||
|
||||
union() {
|
||||
// mortices for joining to piece F
|
||||
translate([tenonZOffset, y*0.3, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
translate([tenonZOffset, y*0.8, 0]) rotate([90, 0, 90])
|
||||
morticeBlank(verticalTenonDims, morticeClearance);
|
||||
|
||||
// mortice for joining to piece G
|
||||
translate([tenonZOffset, 0, drawerHeight/2]) mirror([0, 0, 1])
|
||||
rotate([0, 90, 00]) tenon(tenonDims);
|
||||
|
||||
// piece label
|
||||
translate([0.4, 2, 2]) rotate([90, 0, -90]) tally(8, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Mortice and tenon test pieces
|
||||
// rotate([0, 90, 0]) union() {
|
||||
// cube([10, 16, wallThickness]);
|
||||
// translate([2, 16, tenonZOffset]) tenon(tenonDims);
|
||||
// }
|
||||
//
|
||||
// translate([10, 0, 0]) rotate([0, 90, 0]) difference() {
|
||||
// cube([10, 16, wallThickness]);
|
||||
// translate([2 - 0.1, 16 - 0.1, tenonZOffset - 0.1])
|
||||
// mirror([0, 1, 0]) morticeBlank(tenonDims, morticeClearance);
|
||||
// }
|
||||
|
||||
module completeBox(gap = 10, cutWeight = true) {
|
||||
|
||||
// vertical layers
|
||||
for (i = [0:2]) {
|
||||
z = i * (wallThickness + 1.5*gap + drawerHeight);
|
||||
translate([0, 0, z]) pieceA(cutWeight);
|
||||
translate([x1 + gap, 0, z]) pieceB(cutWeight);
|
||||
translate([0, y + gap, z]) pieceC(cutWeight);
|
||||
translate([x1 + gap, y + gap, z]) pieceD(cutWeight);
|
||||
}
|
||||
|
||||
// lower box walls
|
||||
for (i = [0:2]) {
|
||||
x = i * (wallThickness + drawerWidth) +
|
||||
(i == 2 ? gap : 0);
|
||||
|
||||
translate([x, 0, wallThickness + gap]) pieceE(cutWeight);
|
||||
translate([x, y + gap, wallThickness + gap]) pieceF(cutWeight);
|
||||
}
|
||||
|
||||
// upper box walls
|
||||
for (i = [0:2]) {
|
||||
x = i * (wallThickness + drawerWidth) +
|
||||
(i == 2 ? gap : 0);
|
||||
|
||||
translate([x, 0, drawerHeight + 2*wallThickness + 2*gap]) pieceG(cutWeight);
|
||||
translate([x, y + gap, drawerHeight + 2*wallThickness + 2*gap]) pieceH(cutWeight);
|
||||
}
|
||||
translate([innerBoxDims[2], innerBoxDims[1] + 8, 0])
|
||||
innerPanel(innerBoxDims);
|
||||
|
||||
}
|
||||
|
||||
module printStack() {
|
||||
for (i = [0:2]) {
|
||||
translate([0, 0, i * (wallThickness + 0.4)]) pieceA();
|
||||
translate([0, 0, (i+3) * (wallThickness + 0.4)]) pieceC();
|
||||
translate([0, 0, (i+6) * (wallThickness + 0.4)]) pieceB();
|
||||
translate([0, 0, (i+9) * (wallThickness + 0.4)]) pieceD();
|
||||
shelfDims = [shelfWidth, shelfDepth, shelfHeight];
|
||||
//assembled(shelfDims);
|
||||
|
||||
translate([
|
||||
0,
|
||||
y + drawerHeight +throughTenonDims[1] + 4,
|
||||
i * (wallThickness + 0.4) + wallThickness])
|
||||
rotate([90, 90, 0]) pieceE();
|
||||
//translate([shelfWidth + 20, 0, 0])
|
||||
//allCutParts(shelfDims);
|
||||
|
||||
translate([0,
|
||||
y + drawerHeight +throughTenonDims[1] + 4,
|
||||
(i+3) * (wallThickness + 0.4) + wallThickness])
|
||||
rotate([90, 90, 0]) pieceF();
|
||||
|
||||
translate([
|
||||
0,
|
||||
y + drawerHeight +throughTenonDims[1] + 4,
|
||||
(i+6) * (wallThickness + 0.4) + wallThickness])
|
||||
rotate([90, 90, 0]) pieceG();
|
||||
|
||||
translate([
|
||||
0,
|
||||
y + drawerHeight +throughTenonDims[1] + 4,
|
||||
(i+9) * (wallThickness + 0.4) + wallThickness])
|
||||
rotate([90, 90, 0]) pieceH();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
module testStack() {
|
||||
for (i = [0:2]) {
|
||||
translate([0, 0, i * (wallThickness + 0.4)]) pieceA();
|
||||
translate([0, 0, (i+3) * (wallThickness + 0.4)]) pieceB();
|
||||
|
||||
translate([
|
||||
0,
|
||||
y + drawerHeight +throughTenonDims[1] + 4,
|
||||
i * (wallThickness + 0.4) + wallThickness])
|
||||
rotate([90, 90, 0]) pieceE();
|
||||
|
||||
translate([0,
|
||||
y + drawerHeight +throughTenonDims[1] + 4,
|
||||
(i+3) * (wallThickness + 0.4) + wallThickness])
|
||||
rotate([90, 90, 0]) pieceF();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
completeBox(gap = 10, cutWeight = false);
|
||||
// testStack();
|
||||
//translate([300, shelfDepth + 40, 0])
|
||||
//rotate([0, 0, 90])
|
||||
printableSetA();
|
||||
|
||||
Reference in New Issue
Block a user