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)
shelfWidth = 320; // Width of a Kallax half-shelf (shelf insert)
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 <../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 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 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]);
}
module drawerBottom(outerBoxDims, includeClips = false) {
// translate([-1, -1, 4-ep]) cube([outerDims[0], outerDims[2], 5]);
}
}
module drawerSide(outerBoxDims, includeClips = false) {
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();