Der Generator wird über Pytha API-Schnittstelle und Pytha-Lua programmiert. Der Generator ist also nicht alleine lauffähig.
Der Generator sagt Pytha praktisch was es Zeichnen soll.
kurzer Test mit OpenScad und Gemini
lt. Gemini: Für den DXF-Export gibt es in OpenSCAD die Funktion projection(). Damit kann man das 3D-Modell flachlegen. Da ein Schrank aber aus vielen verschachtelten Platten besteht, habe ich eine Option dxf_export_modus eingebaut. Wenn du diese auf true stellst, legt das Skript alle Einzelteile flach nebeneinander auf den Boden, sodass du sie perfekt als 2D-Zeichnung für die CNC-Fräse oder den Lasercutter als DXF exportieren kannst!
den Code bei OpenScad eingeben + F5 Vorschau Stückiste oder F6
der sieht für auf die schnelle zusammengebaut nicht mal schlecht aus
// ================================================
// PARAMETER - SCHRANK MIT STÜCKLISTE & DXF-EXPORT
// ================================================
/* [Hauptmaße] */
schrank_breite = 1000;
schrank_hoehe = 2000;
schrank_tiefe = 600;
holz_dicke = 19;
sockel_hoehe = 80;
/* [Fronten] */
anzahl_tueren = 2;
anzahl_schubladen = 3;
schubladen_hoehe = 180;
fugen_luft = 2;
/* [Innenausstattung] */
anzahl_boeden = 4;
/* [Rückwand-Konfiguration] */
// "nut", "falz" oder "stumpf"
rueckwand_typ = "nut";
rueckwand_dicke = 6;
nut_tiefe = 8;
nut_einsprung = 15;
/* [Export-Modus] */
// Auf "true" stellen, um alle Teile flach für den DXF-Export auszulegen!
dxf_export_modus = false;
// ================================================
// BERECHNUNGEN (INTERN)
// ================================================
rw_abstand_hinten = (rueckwand_typ == "nut") ? nut_einsprung : 0;
rw_einlass = (rueckwand_typ == "stumpf") ? 0 : nut_tiefe;
innentiefe_boden = (rueckwand_typ == "nut") ? schrank_tiefe - rw_abstand_hinten - rueckwand_dicke - 10 : schrank_tiefe - rueckwand_dicke - 10;
front_bereich_hoehe = schrank_hoehe - sockel_hoehe;
gesamthoehe_schubladen = (anzahl_schubladen > 0) ? (anzahl_schubladen * schubladen_hoehe) : 0;
tuer_hoehe = front_bereich_hoehe - gesamthoehe_schubladen - (2 * fugen_luft);
innen_breite = schrank_breite - (2 * holz_dicke);
innen_hoehe = schrank_hoehe - sockel_hoehe - (2 * holz_dicke);
seiten_hoehe = schrank_hoehe - sockel_hoehe;
boden_breite = schrank_breite - (2 * holz_dicke);
tuer_breite = ((schrank_breite - (2 * fugen_luft)) - ((anzahl_tueren - 1) * fugen_luft)) / anzahl_tueren;
schublade_breite = schrank_breite - (2 * fugen_luft);
rw_breite = (rueckwand_typ == "stumpf") ? innen_breite : innen_breite + (2 * rw_einlass);
rw_hoehe = (rueckwand_typ == "stumpf") ? innen_hoehe : innen_hoehe + (2 * rw_einlass);
// ================================================
// STÜCKLISTEN-AUSGABE (Wird in der Konsole angezeigt)
// ================================================
echo("=====================================================================");
echo("STÜCKLISTE / SCHNITTLISTE (alle Maße in mm):");
echo("=====================================================================");
echo(str("2x Seitenwand: ", seiten_hoehe, " x ", schrank_tiefe, " x ", holz_dicke));
echo(str("1x Unterboden: ", boden_breite, " x ", schrank_tiefe, " x ", holz_dicke));
echo(str("1x Oberboden/Deck: ", boden_breite, " x ", schrank_tiefe, " x ", holz_dicke));
echo(str("1x Sockelblende: ", boden_breite, " x ", sockel_hoehe, " x ", holz_dicke));
if (anzahl_boeden > 0) {
echo(str(anzahl_boeden, "x Einlegeboden: ", innen_breite - 2, " x ", innentiefe_boden, " x ", holz_dicke));
}
echo(str("1x Rückwand: ", rw_breite, " x ", rw_hoehe, " x ", rueckwand_dicke, " (Typ: ", rueckwand_typ, ")"));
if (anzahl_tueren > 0) {
echo(str(anzahl_tueren, "x Türfront: ", tuer_breite, " x ", tuer_hoehe, " x 19 (Empfehlung)"));
}
if (anzahl_schubladen > 0) {
echo(str(anzahl_schubladen, "x Schubladenfront: ", schublade_breite, " x ", schubladen_hoehe - fugen_luft, " x 19 (Empfehlung)"));
}
echo("=====================================================================");
// ================================================
// GEOMETRIE-ROUTING (3D Schrank oder 2D DXF)
// ================================================
if (dxf_export_modus) {
// Projiziert alles hauchdünn auf die 2D-Ebene für den DXF-Export
projection(cut = true) {
flach_layout();
}
} else {
// Normaler 3D-Viewer
schrank_3d();
}
// ================================================
// MODULE FÜR GEOMETRIE
// ================================================
module schrank_3d() {
// Seitenwände
color("BurlyWood") {
difference() { translate([0, 0, sockel_hoehe]) cube([holz_dicke, schrank_tiefe, seiten_hoehe]); rueckwand_ausschnitt(0); }
difference() { translate([schrank_breite - holz_dicke, 0, sockel_hoehe]) cube([holz_dicke, schrank_tiefe, seiten_hoehe]); rueckwand_ausschnitt(schrank_breite - holz_dicke); }
difference() { translate([holz_dicke, 0, sockel_hoehe]) cube([boden_breite, schrank_tiefe, holz_dicke]); rueckwand_ausschnitt(holz_dicke); }
difference() { translate([holz_dicke, 0, schrank_hoehe - holz_dicke]) cube([boden_breite, schrank_tiefe, holz_dicke]); rueckwand_ausschnitt(holz_dicke); }
translate([holz_dicke, holz_dicke, 0]) cube([boden_breite, holz_dicke, sockel_hoehe]);
}
// Rückwand
color("LightGrey") {
if (rueckwand_typ == "stumpf") translate([holz_dicke, schrank_tiefe, sockel_hoehe + holz_dicke]) cube([rw_breite, rueckwand_dicke, rw_hoehe]);
else translate([holz_dicke - rw_einlass, schrank_tiefe - ((rueckwand_typ=="nut")?rw_abstand_hinten+rueckwand_dicke:rueckwand_dicke), sockel_hoehe + holz_dicke - rw_einlass]) cube([rw_breite, rueckwand_dicke, rw_hoehe]);
}
// Böden
if (anzahl_boeden > 0) {
color("Tan")
for (i = [1 : anzahl_boeden]) {
abstand = innen_hoehe / (anzahl_boeden + 1);
z_pos = sockel_hoehe + holz_dicke + (i * abstand) - (holz_dicke / 2);
translate([holz_dicke + 1, 0, z_pos]) cube([innen_breite - 2, innentiefe_boden, holz_dicke]);
}
}
// Fronten
color("WhiteSmoke") {
if (anzahl_schubladen > 0) {
for (i = [0 : anzahl_schubladen - 1]) {
z_pos = sockel_hoehe + fugen_luft + (i * schubladen_hoehe);
translate([fugen_luft, -15, z_pos]) cube([schublade_breite, 15, schubladen_hoehe - fugen_luft]);
}
}
if (anzahl_tueren > 0) {
z_pos_tueren = sockel_hoehe + gesamthoehe_schubladen + fugen_luft;
for (i = [0 : anzahl_tueren - 1]) {
x_pos = fugen_luft + (i * (tuer_breite + fugen_luft));
translate([x_pos, -15, z_pos_tueren]) cube([tuer_breite, 15, tuer_hoehe]);
}
}
}
}
// Hilfsmodul für Nuten/Falze
module rueckwand_ausschnitt(x_pos) {
if (rueckwand_typ == "falz") {
translate([-1, schrank_tiefe - rueckwand_dicke, sockel_hoehe - 1]) cube([schrank_breite + 2, rueckwand_dicke + 1, schrank_hoehe + 2]);
} else if (rueckwand_typ == "nut") {
translate([-1, schrank_tiefe - rw_abstand_hinten - rueckwand_dicke, sockel_hoehe - 1]) cube([schrank_breite + 2, rueckwand_dicke, schrank_hoehe + 2]);
}
}
// Layout, das alle Teile flach hinlegt (für die 2D-Projektion)
module flach_layout() {
// Seitenwand 1 & 2
translate([0, 0, 0]) rotate([0, 90, 0]) cube([holz_dicke, schrank_tiefe, seiten_hoehe]);
translate([schrank_tiefe + 50, 0, 0]) rotate([0, 90, 0]) cube([holz_dicke, schrank_tiefe, seiten_hoehe]);
// Boden & Deckel
translate([0, seiten_hoehe + 50, 0]) rotate([90, 0, 0]) cube([boden_breite, schrank_tiefe, holz_dicke]);
translate([0, seiten_hoehe + schrank_tiefe + 100, 0]) rotate([90, 0, 0]) cube([boden_breite, schrank_tiefe, holz_dicke]);
// Einlegeböden nebeneinander
if (anzahl_boeden > 0) {
for (i = [0 : anzahl_boeden - 1]) {
translate([schrank_breite + 50, i * (innentiefe_boden + 50), 0])
cube([innen_breite - 2, innentiefe_boden, 1]); // flach simuliert
}
}
// Rückwand
translate([schrank_breite + 50, (anzahl_boeden + 1) * (innentiefe_boden + 50), 0])
cube([rw_breite, rw_hoehe, 1]);
}