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
+5
View File
@@ -4,3 +4,8 @@ kallaxDepth = 390; // Full depth of a Kallax shelf
shelfHeight = 160; // Height of a Kallax half-shelf (shelf insert) shelfHeight = 160; // Height of a Kallax half-shelf (shelf insert)
shelfWidth = 320; // Width of a Kallax half-shelf (shelf insert) shelfWidth = 320; // Width of a Kallax half-shelf (shelf insert)
shelfDepth = kallaxDepth - 20; shelfDepth = kallaxDepth - 20;
// boardThickness = 4.7; // 1/8" plywood
boardThickness = 7.35;
feltThickness = 2.5;
feltWidth = 12;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,118 @@
include <../lib/chamfered-cube.scad>
include <../lib/rounded-cube.scad>
include <./constants.scad>
$fn=128;
l=shelfWidth/2;
h=shelfHeight/2;
ep = 0.01;
horizontalBoardWidth = 141.5;
drawerSideHeight = 53;
sideOffset = 2*feltThickness + boardThickness;
module faceBlank() {
size = [shelfWidth/2, shelfHeight/2, 8];
chamfer = 4;
difference() {
roundedCube([l, h, 8], [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([(shelfWidth/2 - 76.4)/2, 30, 7]) cube([76.4, 36, 1 + ep]);
translate([(shelfWidth/2 - 76.4)/2, 30 + 36, 7])
rotate([30, 0, 0]) cube([76.4, 4, 4]);
// screw holes
for (i = [-1, 1]) {
color("red")
translate([shelfWidth/4 + i*20, 16, -ep]) cylinder(d=3.4, h=8 + 2*ep);
translate([shelfWidth/4 + i*20, 16, -ep]) cylinder(d=6.2, h=3 + ep);
translate([shelfWidth/4 + i*20, 16, 3 - ep]) cylinder(d1=6.2, d2=3.4, h=1 + 2*ep);
}
}
}
module handle() {
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=3, h=8 + 2*ep);
}
}
}
module lowerRight() {
difference() {
faceBlank();
// label
color("blue")
translate([shelfWidth/4 + 6, shelfHeight/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "LR");
// horizontal board recess
translate([sideOffset, sideOffset, -ep])
cube([horizontalBoardWidth, boardThickness, 4+ep]);
// vertical board recesses
translate([sideOffset, sideOffset + boardThickness, -ep])
cube([boardThickness, 62, 4+ep]);
translate([sideOffset + horizontalBoardWidth - boardThickness, sideOffset + boardThickness, -ep])
cube([boardThickness, 62, 4+ep]);
}
}
module lowerLeft() {
difference() {
faceBlank();
// label
color("blue")
translate([shelfWidth/4 + 6, shelfHeight/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "LL");
}
}
module upperRight() {
difference() {
faceBlank();
// label
color("blue")
translate([shelfWidth/4 + 6, shelfHeight/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "UR");
}
}
module upperLeft() {
difference() {
faceBlank();
// label
color("blue")
translate([shelfWidth/4 + 6, shelfHeight/4 - 6, -0.2]) mirror([1, 0, 0])
linear_extrude(0.4) text(font="Iosevka", size=6, "UL");
}
}
lowerRight();
translate([0, 200, 0]) handle();
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,91 +0,0 @@
include <./constants.scad>
// all measurements in mm
boardThickness = 4.7; // 1/8" plywood
feltThickness = 2.5;
clipThickness = boardThickness + 2*feltThickness;
// 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
//
module customSupport() {
// 45-degree supports
difference() {
translate([clipThickness/2, -clipThickness/2, 0])
cube([1, clipThickness, clipThickness - 2]);
rotate([45, 0, 0])
translate([0, -0.1, -0.1])
cube([clipThickness, clipThickness, clipThickness]);
}
}
module cornerClip() {
difference() {
cube([clipThickness, clipThickness, clipThickness]);
translate([feltThickness, feltThickness, feltThickness])
cube([boardThickness, clipThickness, clipThickness]);
translate([feltThickness, feltThickness, feltThickness])
cube([clipThickness, boardThickness, clipThickness]);
}
}
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 crossClip() {
difference() {
cube([2 * clipThickness, clipThickness, clipThickness]);
translate([-0.1, feltThickness, feltThickness])
cube([2 * clipThickness + 0.2, boardThickness, clipThickness]);
translate([clipThickness - boardThickness/2, -0.1, feltThickness])
cube([boardThickness, clipThickness + 0.2, clipThickness]);
}
}
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), 5 * clipThickness, 0])
rotate([45, 0, 0])
crossClip();
}
translate([-1, -1, -1.4]) cube([100, 100, 1.4]);
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+254 -9
View File
@@ -1,15 +1,16 @@
include <./constants.scad> include <./constants.scad>
include <../lib/metric-machine-screws.scad> include <../lib/metric-machine-screws.scad>
include <../lib/chamfered-cube.scad>
include <../lib/rounded-cube.scad>
// all measurements in mm // all measurements in mm
// boardThickness = 4.7; // 1/8" plywood $fn=128;
boardThickness = 7.35; ep = 0.01;
feltThickness = 2.5;
feltWidth = 12;
clipThickness = boardThickness + 2*feltThickness; clipThickness = boardThickness + 2*feltThickness;
clipWallThickness = 4; clipWallThickness = 4;
clipFlangeLength = 24; clipFlangeLength = 24;
clipFlangeWidth = 16; clipFlangeWidth = 16;
drawerSideOffset = 2*feltThickness + boardThickness;
// measurements for the wooden panels to cut: // 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 // 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() { module fastenerBlank() {
translate([0, 0.1 + 2 * clipWallThickness + boardThickness, 0]) translate([0, 0.1 + 2 * clipWallThickness + boardThickness, 0])
rotate([90, 0, 0]) rotate([90, 0, 0])
@@ -266,15 +270,198 @@ module bottomPanel(boxDims) {
} }
} }
// TODO module drawerFacePlateBlank(boxDims) {
module drawerFacePlate(outerBoxDims, includeClips = false) { 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) { 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, boardThickness + (innerBoxDims[2] - 3*boardThickness)/2]) bottomPanel(innerBoxDims);
translate([boardThickness, 0, 0]) 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) { if (includeClips) {
@@ -384,4 +616,17 @@ shelfDims = [shelfWidth, shelfDepth, shelfHeight];
//translate([300, shelfDepth + 40, 0]) //translate([300, shelfDepth + 40, 0])
//rotate([0, 0, 90]) //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();