123 lines
5.2 KiB
OpenSCAD
123 lines
5.2 KiB
OpenSCAD
// Trennwände der Wortuhr für IKEA SANNAHED (Lasercut, MDF)
|
|
// Vorlage: cad/ALT/Trennwaende_fuer_Laser.dxf
|
|
//
|
|
// - 9 lange Wände (zwischen den 10 Zeilen), von oben nach unten mit 1 bis 9 graviert.
|
|
// Jede hat drei Füße an einer eigenen Stelle und passt nur in ihre Schlitze in
|
|
// rueckwand.scad. Auch gespiegelt gibt es keine zweite passende Stelle.
|
|
// - kurze Trennstücke zwischen den Wörtern einer Zeile, u. a. zwischen EIN und S.
|
|
// Sie stecken mit Zapfen in Schlitzen der langen Wände.
|
|
// - Kabeldurchlässe: unten in den Trennstücken (Kabel zwischen den Streifen eines
|
|
// Wortes der Zeile) und in den langen Wänden am Zeilenwechsel (Zickzack der LEDs).
|
|
//
|
|
// Export als 2D: F6 rendern, dann Datei -> Export -> als DXF / SVG.
|
|
// Für den Laser: erst teil = "schneiden", dann teil = "gravur" exportieren.
|
|
|
|
include <gemeinsam.scad> // Rahmengröße (rahmen_cm), Wortliste, Fußpositionen
|
|
|
|
// ---------- Einstellungen ----------
|
|
teil = "beide"; // ["beide" (Vorschau), "schneiden", "gravur"]
|
|
|
|
zapfen_h = tiefe_mm * 0.25; // Höhe der Zapfen/Schlitze der Trennstücke
|
|
kabel_b = 8; // Breite der Kabeldurchlässe
|
|
kabel_h = 3.5; // Höhe der Kabeldurchlässe
|
|
abstand_mm = 3; // Abstand der Teile auf dem Laserbogen
|
|
nummer_gr = 8; // Größe der eingravierten Nummer
|
|
|
|
// ---------- Berechnung ----------
|
|
wand_l = platte - 1; // Länge der langen Wände
|
|
fuss_b = schlitz_b - toleranz; // Breite der Füße
|
|
// Zapfen/Schlitze: unterer und oberer Höhenbereich in der Wand, damit sich Zapfen
|
|
// von oben und unten an derselben Stelle nicht treffen
|
|
unten_y0 = tiefe_mm * 0.20;
|
|
oben_y0 = tiefe_mm * 0.60;
|
|
|
|
// Trennstellen einer Zeile: x-Mitte zwischen zwei benachbarten Wörtern
|
|
function trenn_x(z) =
|
|
let (ws = [for (w = woerter) if (w[0] == z) w])
|
|
[for (i = [0 : len(ws) - 2])
|
|
(zx(ws[i][1] + ws[i][2] - 1) + zx(ws[i + 1][1])) / 2];
|
|
|
|
// Wand n liegt zwischen Zeile n-1 (darüber) und Zeile n (darunter)
|
|
// Trennstücke der Zeile darüber stecken im oberen, die darunter im unteren Schlitz.
|
|
|
|
module wand(n) {
|
|
difference() {
|
|
union() {
|
|
translate([-wand_l / 2, 0]) square([wand_l, tiefe_mm]);
|
|
for (c = fuss_spalten[n - 1])
|
|
translate([zx(c) - fuss_b / 2, -mdf_mm]) square([fuss_b, mdf_mm + 0.01]);
|
|
}
|
|
// Schlitze für die Zapfen der Trennstücke
|
|
for (x = trenn_x(n - 1))
|
|
translate([x - (mdf_mm + toleranz) / 2, oben_y0]) square([mdf_mm + toleranz, zapfen_h + toleranz]);
|
|
for (x = trenn_x(n))
|
|
translate([x - (mdf_mm + toleranz) / 2, unten_y0]) square([mdf_mm + toleranz, zapfen_h + toleranz]);
|
|
// Kabeldurchlass am Zeilenwechsel (ungerade Wand: rechts, gerade: links)
|
|
translate([zx(n % 2 == 1 ? spalten - 1 : 0) - kabel_b / 2, -0.01])
|
|
square([kabel_b, kabel_h]);
|
|
}
|
|
}
|
|
|
|
module wand_nummer(n) {
|
|
translate([-wand_l / 2 + nummer_gr * 1.2, tiefe_mm / 2])
|
|
text(str(n), size = nummer_gr, font = "Liberation Sans:style=Bold",
|
|
halign = "center", valign = "center");
|
|
}
|
|
|
|
// Trennstück zwischen zwei Wörtern der Zeile z. Lokal: x läuft von oben nach unten
|
|
// (plattenhöhe), y ist die Tiefe. Das linke Ende stößt an die Wand über der Zeile
|
|
// (unterer Schlitz), das rechte an die Wand darunter (oberer Schlitz).
|
|
// Die erste und die letzte Zeile reichen bis zum Plattenrand.
|
|
function stueck_laenge(z) =
|
|
let (oben = z == 0 ? platte / 2 - 0.5 : zy(z) + raster_a / 2 - mdf_mm / 2,
|
|
unten = z == zeilen - 1 ? -platte / 2 + 0.5 : zy(z) - raster_a / 2 + mdf_mm / 2)
|
|
oben - unten;
|
|
function stueck_mitte(z) = // x-Position der Zeilenmitte im Stück
|
|
(z == 0 ? platte / 2 - 0.5 : zy(z) + raster_a / 2 - mdf_mm / 2) - zy(z);
|
|
|
|
module stueck(z) {
|
|
l = stueck_laenge(z);
|
|
difference() {
|
|
union() {
|
|
square([l, tiefe_mm]);
|
|
if (z > 0)
|
|
translate([-mdf_mm, unten_y0]) square([mdf_mm + 0.01, zapfen_h]);
|
|
if (z < zeilen - 1)
|
|
translate([l - 0.01, oben_y0]) square([mdf_mm + 0.01, zapfen_h]);
|
|
}
|
|
translate([stueck_mitte(z) - kabel_b / 2, -0.01]) square([kabel_b, kabel_h]);
|
|
}
|
|
}
|
|
|
|
// Alle Stücke: [Zeile] je Trennstelle
|
|
stuecke = [for (z = [0 : zeilen - 1]) for (x = trenn_x(z)) z];
|
|
|
|
// ---------- Anordnung auf dem Laserbogen ----------
|
|
wand_hoehe = tiefe_mm + mdf_mm; // mit Füßen
|
|
function stueck_breite(z) = stueck_laenge(z) + 2 * mdf_mm;
|
|
stueck_pro_reihe = floor(wand_l / (stueck_breite(1) + abstand_mm));
|
|
st_y0 = (zeilen - 1) * (wand_hoehe + abstand_mm) + abstand_mm;
|
|
|
|
module bogen(zeigen) {
|
|
for (n = [1 : zeilen - 1])
|
|
translate([0, (zeilen - 1 - n) * (wand_hoehe + abstand_mm) + mdf_mm]) {
|
|
if (zeigen == "schnitt") wand(n);
|
|
else wand_nummer(n);
|
|
}
|
|
if (zeigen == "schnitt")
|
|
for (i = [0 : len(stuecke) - 1])
|
|
translate([-wand_l / 2 + mdf_mm + (i % stueck_pro_reihe) * (stueck_breite(1) + abstand_mm),
|
|
st_y0 + floor(i / stueck_pro_reihe) * (tiefe_mm + abstand_mm)])
|
|
stueck(stuecke[i]);
|
|
}
|
|
|
|
module ausgabe() {
|
|
if (teil == "schneiden") bogen("schnitt");
|
|
else if (teil == "gravur") bogen("gravur");
|
|
else difference() { bogen("schnitt"); bogen("gravur"); }
|
|
}
|
|
ausgabe();
|
|
|
|
echo(str("Lange Wände: ", zeilen - 1, " à ", wand_l, " x ", tiefe_mm, " mm, Trennstücke: ", len(stuecke),
|
|
", Materialstärke ", mdf_mm, " mm"));
|