Kallax Organization.

This commit is contained in:
2026-04-26 18:52:53 -05:00
parent 4e3dba66ec
commit 950cf6a2fd
11 changed files with 722007 additions and 100 deletions
+254 -9
View File
@@ -1,15 +1,16 @@
include <./constants.scad>
include <../lib/metric-machine-screws.scad>
include <../lib/chamfered-cube.scad>
include <../lib/rounded-cube.scad>
// all measurements in mm
// boardThickness = 4.7; // 1/8" plywood
boardThickness = 7.35;
feltThickness = 2.5;
feltWidth = 12;
$fn=128;
ep = 0.01;
clipThickness = boardThickness + 2*feltThickness;
clipWallThickness = 4;
clipFlangeLength = 24;
clipFlangeWidth = 16;
drawerSideOffset = 2*feltThickness + boardThickness;
// measurements for the wooden panels to cut:
//
@@ -26,6 +27,9 @@ clipFlangeWidth = 16;
// inner boards: 70.45 x 370.0 ((160 - 3*4.7 - 2*2.5)/2) x 370
//
function drawerWidth(boxDims) = (boxDims[0] - 3*boardThickness - 4*feltThickness)/2 + 2;
function drawerHeight(boxDims) = (boxDims[2] - 3*boardThickness - 4*feltThickness)/2;
module fastenerBlank() {
translate([0, 0.1 + 2 * clipWallThickness + boardThickness, 0])
rotate([90, 0, 0])
@@ -266,15 +270,198 @@ module bottomPanel(boxDims) {
}
}
// TODO
module drawerFacePlate(outerBoxDims, includeClips = false) {
module drawerFacePlateBlank(boxDims) {
size = [boxDims[0]/2 - 1, boxDims[2]/2 - 1, 8];
chamfer = 4;
difference() {
roundedCube(size, [1, 1, 1]);
// front face chamfers
for (i = [1,3]) {
// X-axis
translate([-ep, size[1] * floor(i/2), size[2] * (i%2) - chamfer])
rotate([45, 0, 0]) cube([size[0] + 2*ep, 1.414*chamfer, 1.414*chamfer]);
// Y-axis
translate([size[0] * floor(i/2) - chamfer, -ep, size[2] * (i%2)])
rotate([0, 45, 0]) cube([1.414*chamfer, size[1] + 2*ep, 1.414*chamfer]);
}
// nameplate cutouts
translate([(boxDims[0]/2 - 76)/2, 30, 7]) cube([76, 36, 1 + ep]);
translate([(boxDims[0]/2 - 76)/2, 30 + 36, 7])
rotate([30, 0, 0]) cube([76, 4, 4]);
// screw holes
for (i = [-1, 1]) {
color("red")
translate([boxDims[0]/4 + i*20, 16, -ep]) cylinder(d=3.4, h=8+2*ep);
translate([boxDims[0]/4 + i*20, 16, -ep]) cylinder(d=6.2, h=3+ep);
//translate([boxDims[0]/4 + i*20, 16, 3 - ep]) cylinder(d1=6.2, d2=3.4, h=1+2*ep);
}
}
}
module drawerBottom(outerBoxDims, includeClips = false) {
module lowerLeftDrawerFace(outerDims, boxDims) {
rotate([90, 0, 0])
difference() {
drawerFacePlateBlank(outerDims);
// label
color("blue")
translate([outerDims[0]/4 + 6, outerDims[2]/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "LL");
// horizontal board recess
translate([drawerSideOffset, drawerSideOffset, -ep])
cube([drawerWidth(boxDims), boardThickness, 4+ep]);
// vertical board recesses
translate([drawerSideOffset, drawerSideOffset + boardThickness - ep, -ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
translate([
drawerSideOffset + drawerWidth(boxDims) - boardThickness,
drawerSideOffset + boardThickness - ep,
-ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
}
}
module drawerSide(outerBoxDims, includeClips = false) {
module lowerRightDrawerFace(outerDims, boxDims) {
rotate([90, 0, 0])
difference() {
translate([1, 0, 0])
drawerFacePlateBlank(outerDims);
// label
color("blue")
translate([outerDims[0]/4 + 6, outerDims[2]/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "LR");
union() {
// horizontal board recess
translate([feltThickness + boardThickness/2, drawerSideOffset, -ep])
cube([drawerWidth(boxDims), boardThickness, 4+ep]);
// vertical board recesses
translate([feltThickness + boardThickness/2, drawerSideOffset + boardThickness - ep, -ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
translate([
feltThickness + boardThickness/2 + drawerWidth(boxDims) - boardThickness,
feltThickness + boardThickness/2 + boardThickness - ep,
-ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
}
// translate([-1, -1, 4-ep]) cube([outerDims[0], outerDims[2], 5]);
}
}
module upperRightDrawerFace(outerDims, boxDims) {
rotate([90, 0, 0])
difference() {
translate([1, 0, 0])
drawerFacePlateBlank(outerDims);
// label
color("blue")
translate([outerDims[0]/4 + 6, outerDims[2]/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "UR");
union() {
// horizontal board recess
translate([feltThickness + boardThickness/2, feltThickness + boardThickness/2, -ep])
cube([drawerWidth(boxDims), boardThickness, 4+ep]);
// vertical board recesses
translate([
feltThickness + boardThickness/2,
feltThickness + boardThickness/2 + boardThickness - ep,
-ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
translate([
feltThickness + boardThickness/2 + drawerWidth(boxDims) - boardThickness,
feltThickness + boardThickness/2 + boardThickness - ep,
-ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
}
// translate([-1, -1, 4-ep]) cube([outerDims[0], outerDims[2], 5]);
}
}
module upperLeftDrawerFace(outerDims, boxDims) {
rotate([90, 0, 0])
difference() {
drawerFacePlateBlank(outerDims);
// label
color("blue")
translate([boxDims[0]/4 + 6, boxDims[2]/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "UL");
union() {
// horizontal board recess
translate([drawerSideOffset, feltThickness + boardThickness/2, -ep])
cube([drawerWidth(boxDims), boardThickness, 4+ep]);
// vertical board recesses
translate([
drawerSideOffset,
feltThickness + boardThickness/2 + boardThickness - ep,
-ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
translate([
drawerSideOffset + drawerWidth(boxDims) - boardThickness,
feltThickness + boardThickness/2 + boardThickness - ep,
-ep])
cube([boardThickness, drawerHeight(boxDims) - boardThickness + ep, 4+ep]);
}
// translate([-1, -1, 4-ep]) cube([outerDims[0], outerDims[2], 5]);
}
}
module drawerHandle() {
handleLen = 64;
//difference() {
chamferedCube([handleLen, 12, 12], chamfer=3);
// screw holes
for (i = [-1, 1]) {
difference() {
translate([handleLen/2 + i*20, 6, 12-ep]) cylinder(d=6, h=8 + ep);
translate([handleLen/2 + i*20, 6, 12-ep]) cylinder(d=2.8, h=8 + 2*ep);
}
}
}
module drawerBottom(boxDims, includeClips = false) {
difference() {
color ("Tan")
cube([
drawerWidth(boxDims),
boxDims[1], boardThickness]);
color("black") translate([10, 10, boardThickness - 1]) linear_extrude(1.1)
text(font="Iosevka", size=16, "drawer bottom - plywood");
}
}
module drawerSide(boxDims, includeClips = false) {
difference() {
color("Wheat")
cube([
drawerHeight(boxDims) - 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, "drawer side - plywood");
}
}
module assembled(outerBoxDims, includeClips = false) {
@@ -309,6 +496,51 @@ module assembled(outerBoxDims, includeClips = false) {
translate([boardThickness, 0, boardThickness + (innerBoxDims[2] - 3*boardThickness)/2]) bottomPanel(innerBoxDims);
translate([boardThickness, 0, 0]) bottomPanel(innerBoxDims);
// drawers
translate([boardThickness + feltThickness, 0, boardThickness + feltThickness])
for (i = [0:3]) {
// felt box
color("brown")
translate([
(i%2)*(innerBoxDims[0]-boardThickness)/2 - feltThickness,
0.01,
floor(i/2)*(innerBoxDims[2]-boardThickness)/2 - feltThickness])
feltClearanceBox([
innerBoxDims[0]/2 - 1.5*boardThickness,
innerBoxDims[1],
innerBoxDims[2]/2 - 1.5*boardThickness]);
//bottom
translate([
(i%2)*(innerBoxDims[0]-boardThickness)/2,
0,
floor(i/2)*(innerBoxDims[2]-boardThickness)/2])
drawerBottom(innerBoxDims);
// side
for (j = [0,1]) {
translate([
boardThickness + (i%2)*(innerBoxDims[0]-boardThickness)/2 +
j*(drawerWidth(innerBoxDims) - boardThickness),
0,
boardThickness + floor(i/2)*(innerBoxDims[2]-boardThickness)/2])
rotate([0, -90, 0]) drawerSide(innerBoxDims);
}
}
translate([-feltThickness, 0, -feltThickness])
lowerLeftDrawerFace(outerBoxDims, innerBoxDims);
translate([outerBoxDims[0]/2 - feltThickness, 0, -feltThickness])
lowerRightDrawerFace(outerBoxDims, innerBoxDims);
translate([-feltThickness, 0, outerBoxDims[2] / 2 - feltThickness])
upperLeftDrawerFace(outerBoxDims, innerBoxDims);
translate([outerBoxDims[0]/2 - feltThickness, 0, outerBoxDims[2] / 2 - feltThickness])
upperRightDrawerFace(outerBoxDims, innerBoxDims);
}
if (includeClips) {
@@ -384,4 +616,17 @@ shelfDims = [shelfWidth, shelfDepth, shelfHeight];
//translate([300, shelfDepth + 40, 0])
//rotate([0, 0, 90])
printableSetA();
//printableSetA();
innerBoxDims =
[ shelfDims[0] - 2*feltThickness,
shelfDims[1],
shelfDims[2] - 2*feltThickness ];
//drawerBottom(innerBoxDims);
//lowerLeftDrawerFace(shelfDims, innerBoxDims);
//lowerRightDrawerFace(shelfDims, innerBoxDims);
//upperLeftDrawerFace(shelfDims, innerBoxDims);
upperRightDrawerFace(shelfDims, innerBoxDims);
//drawerHandle();