From d9f81fdd71ef269bf93b2fd056d135a6070241c0 Mon Sep 17 00:00:00 2001 From: hans Date: Sun, 17 May 2026 15:27:40 +0200 Subject: [PATCH] Dateien nach "/" hochladen --- vordach.scad | 338 ++++++++++++++++++++++++++++++++++++++++ vordach1.scad | 338 ++++++++++++++++++++++++++++++++++++++++ vordach_holzauszug.xlsx | Bin 0 -> 13156 bytes 3 files changed, 676 insertions(+) create mode 100644 vordach.scad create mode 100644 vordach1.scad create mode 100644 vordach_holzauszug.xlsx diff --git a/vordach.scad b/vordach.scad new file mode 100644 index 0000000..0f9240b --- /dev/null +++ b/vordach.scad @@ -0,0 +1,338 @@ +// ============================================================ +// PARAMETRISCHES VORDACH - OpenSCAD +// Autor: John M. Wayne +// Datum: 2026-05-16 +// Lizenz: CC BY 4.0 +// +// EINHEITENSYSTEM: alle Maße in Millimeter (mm) +// +// KOORDINATENURSPRUNG: +// X = Breite (entlang der Hauswand) +// Y = Tiefe (Auskragung vom Haus weg) +// Z = Höhe +// +// MONTAGEHINWEIS: +// Die Wandseite liegt bei Y = 0. +// Die Pfosten stehen auf Z = 0 (Bodenebene). +// ============================================================ + + +// ============================================================ +// 1. GLOBALE PARAMETER – hier zentral anpassen +// ============================================================ + +// --- Gesamtgeometrie --- +vordach_breite = 3000; // [mm] Breite des Vordachs entlang der Hauswand +vordach_tiefe = 1500; // [mm] Auskragung (Tiefe) vom Haus nach außen +dach_neigung_grad = 7; // [°] Gefälle nach vorne (min. 5° für Stegplatten) + +// --- Pfosten --- +pfosten_breite = 100; // [mm] Querschnitt Pfosten (quadratisch) +pfosten_hoehe = 2400; // [mm] Pfostenhöhe ab Boden (Unterkante Dach vorne) +pfosten_anzahl = 2; // Anzahl Frontstützen (bei Breite > 3 m: 3 empfohlen) + +// --- Wandhalterung / Pfette --- +pfette_breite = 120; // [mm] Breite der Wandpfette (Holz oder Stahl) +pfette_hoehe = 180; // [mm] Höhe der Wandpfette + +// TOLERANZ HAUSWAND: +// Mauerwerk ist selten exakt lotrecht. Empfohlene Montagetoleranz: +// - Dübelbohrlöcher ±5 mm übermessen (Langloch in Z-Richtung) +// - Pfette mit Beilagscheiben (0–10 mm) unterlegen +// - 'wandtoleranz_z': Z-Versatz der Pfette gegenüber Sollhöhe +// (+ = Pfette höher, - = Pfette tiefer; typisch ±20 mm) +// - 'wandtoleranz_y': Luftspalt Pfette <-> Wand (Putz, Dämmung) +wandtoleranz_z = 0; // [mm] Höhenkorrektur Wandmontage +wandtoleranz_y = 5; // [mm] Abstand Pfette zur Wandoberfläche + +// --- Dachfläche / Sparren --- +sparren_breite = 80; // [mm] Sparrenquerschnitt Breite +sparren_hoehe = 120; // [mm] Sparrenquerschnitt Höhe +sparren_abstand = 500; // [mm] Achsabstand der Sparren +// Richtwerte je Dachmaterial: +// Stegplatten (PC): max. 600 mm Glas (VSG): max. 500 mm +// Trapezblech: max. 1250 mm Bitumenwellpl.: max. 450 mm +dach_ueberstand_vorne = 100; // [mm] Überstand Eindeckung an der Traufe +dach_ueberstand_seite = 50; // [mm] Seitlicher Überstand + +// --- Dacheindeckung --- +// MATERIAL-UMSCHALTER (Wert als String eintragen): +// "stegplatten" → Polycarbonat-Stegplatten (16 mm) +// "glas" → Verbundsicherheitsglas VSG ( 8 mm) +// "blech" → Trapezblech / Aluminium (35 mm inkl. Profil) +// "bitumen" → Bitumenwellplatten (43 mm inkl. Welle) +dach_material = "stegplatten"; + +// Materialstärken (werden per dach_staerke() automatisch gewählt) +stegplatten_staerke = 16; +glas_staerke = 8; +blech_staerke = 35; +bitumen_staerke = 43; + +// --- Verbindungselemente (Visualisierung) --- +schraube_dm = 12; // [mm] Schraubendurchmesser (M12) +ankerplatte_groesse = 150; // [mm] Fußplatte Pfosten (quadratisch) +ankerplatte_staerke = 10; // [mm] Plattendicke + +// --- Renderqualität --- +$fn = 32; // Auflösung Zylinder (32 = schnell, 128 = Druckqualität) + + +// ============================================================ +// 2. ABGELEITETE GRÖSSEN – nicht manuell ändern +// ============================================================ + +// Dachhöhe hinten (Wandseite) aus Neigung + Tiefe +dach_hoehe_vorne = pfosten_hoehe; +dach_hoehe_hinten = pfosten_hoehe + tan(dach_neigung_grad) * vordach_tiefe; + +// Materialstärke per ternärer Kette +// HINWEIS: OpenSCAD-Funktionen dürfen nicht auf globale String-Variablen +// zugreifen, daher direkte Referenz auf die globalen Stärken-Variablen. +function dach_staerke() = + dach_material == "stegplatten" ? stegplatten_staerke : + dach_material == "glas" ? glas_staerke : + dach_material == "blech" ? blech_staerke : + dach_material == "bitumen" ? bitumen_staerke : + stegplatten_staerke; // Fallback + +// Sparrenlänge (Schräglänge auf der Dachneigung) +sparren_laenge = vordach_tiefe / cos(dach_neigung_grad) + dach_ueberstand_vorne; + +// Anzahl Sparren +sparren_count = floor((vordach_breite + 2 * dach_ueberstand_seite) / sparren_abstand) + 1; + +// Dübelabstand Wandpfette (alle 500 mm ein Befestigungspunkt) +duebel_abstand = 500; +duebel_anzahl = round(vordach_breite / duebel_abstand); + + +// ============================================================ +// 3. MODULE +// ============================================================ + +// ------------------------------------------------------------ +// 3.1 PFOSTEN (Frontstütze) +// Ursprung: Unterkante, Mitte des Pfostenquerschnitts +// +// Montagehinweis: +// Ankerplatten mit chemischem Dübel (z. B. Hilti HIT-RE 500) +// befestigen. Bohrdurchmesser = schraube_dm + 1 mm Spielpassung. +// ankerplatte_groesse an vorhandenes Fundament anpassen. +// ------------------------------------------------------------ +module pfosten(hoehe = pfosten_hoehe) { + + // Schaft + color("SaddleBrown", 0.9) + translate([-pfosten_breite/2, -pfosten_breite/2, 0]) + cube([pfosten_breite, pfosten_breite, hoehe]); + + // Fußplatte + color("Silver") + translate([-ankerplatte_groesse/2, -ankerplatte_groesse/2, -ankerplatte_staerke]) + cube([ankerplatte_groesse, ankerplatte_groesse, ankerplatte_staerke]); + + // Ankerschrauben (Visualisierung, 4 Stück) + for (dx = [-1, 1]) + for (dy = [-1, 1]) + color("DarkGray") + translate([dx * (ankerplatte_groesse/2 - 20), + dy * (ankerplatte_groesse/2 - 20), + -ankerplatte_staerke]) + cylinder(d = schraube_dm, + h = ankerplatte_staerke + 30, + center = false); + + // Kopfplatte (Auflager für Sparren) + color("Silver") + translate([-ankerplatte_groesse/2, -ankerplatte_groesse/2, hoehe]) + cube([ankerplatte_groesse, ankerplatte_groesse, ankerplatte_staerke]); +} + + +// ------------------------------------------------------------ +// 3.2 WANDHALTERUNG / WANDPFETTE +// Verläuft entlang der gesamten Breite an der Hauswand. +// +// Montagehinweis: +// - wandtoleranz_y erzeugt Luftspalt (Putz, Dämmung, Belüftung) +// - wandtoleranz_z korrigiert Höhenabweichungen im Mauerwerk +// - Dübelmuster: alle duebel_abstand mm ein Befestigungspunkt +// - Holzpfette: druckimprägniert C24, Hirnholz mit Anstrich +// - Stahlpfette: feuerverzinkt, Wandanschluss mit EPDM abdichten +// ------------------------------------------------------------ +module wandpfette() { + + // Z-Position: Sparrenauflager bündig mit Oberkante Pfette + let (pfette_z = dach_hoehe_hinten - pfette_hoehe + wandtoleranz_z) { + + // Pfettenkörper + color("Peru", 0.9) + translate([0, wandtoleranz_y, pfette_z]) + cube([vordach_breite, pfette_breite, pfette_hoehe]); + + // Dübel / Wandschrauben (Visualisierung) + for (i = [0 : duebel_anzahl]) + let (x = i * (vordach_breite / max(duebel_anzahl, 1))) + color("DarkGray") + translate([x, -80, pfette_z + pfette_hoehe / 2]) + rotate([90, 0, 0]) + cylinder(d = 16, h = 80); + } +} + + +// ------------------------------------------------------------ +// 3.3 SPARREN +// Ein einzelner Dachsparren, geneigt per dach_neigung_grad. +// Ursprung: Wandpfettenauflager (Y=0, Z=dach_hoehe_hinten) +// +// Hinweis Materialwahl: +// Stegplatten → Sparren in Falllinie (Hohlkammern = Entwässerung) +// Glas → alle 500 mm (Statik nachweisen!) +// Trapezblech → bis 1250 mm selbsttragend +// Bitumen → Vollschalung oder max. 450 mm Abstand +// ------------------------------------------------------------ +module sparren(laenge = sparren_laenge) { + + color("BurlyWood") + rotate([-dach_neigung_grad, 0, 0]) + cube([sparren_breite, laenge, sparren_hoehe]); +} + + +// ------------------------------------------------------------ +// 3.4 DACHFLÄCHE / EINDECKUNG +// Vereinfachte geneigte Plattengeometrie. +// +// Stegplatten (PC): +// - Überlappung min. 100 mm in Falllinie, Aluabschlussband +// - Ausdehnung ca. 2.5 mm/m/10 K → Klemmprofil nicht festklemmen +// - UV-Schutzseite (blaue Folie) IMMER nach oben +// - Randversiegelung: Aluband oben + gelochtes Lüftungsband unten +// +// Glas (VSG): +// - Randeinstand min. 20 mm im Klemmprofil +// - Eigengewicht 10 mm VSG ≈ 25 kg/m² → Statik erforderlich! +// - Thermisch getrennte Profile (Wärmebrücke vermeiden) +// - Norm: VSG nach DIN 18008 +// +// Trapezblech: +// - Dachneigung min. 3° (Stehfalz) / 5° (Trapez) +// - First/Traufe mit vorkomprimiertem Dichtband +// - Schrauben IMMER durch Hochrippe mit Scheibendichtung +// +// Bitumenwellplatte: +// - Längsüberlappung: 1 Welle; Querüberlappung: min. 200 mm +// - First: Firsthaube + Schaumstoff-Dichtstreifen +// ------------------------------------------------------------ +module dachflaeche() { + + let (staerke = dach_staerke(), + breite_gesamt = vordach_breite + 2 * dach_ueberstand_seite) { + + color("LightBlue", 0.5) + translate([-dach_ueberstand_seite, 0, dach_hoehe_hinten]) + rotate([-dach_neigung_grad, 0, 0]) + cube([breite_gesamt, sparren_laenge, staerke]); + } +} + + +// ------------------------------------------------------------ +// 3.5 LÄNGSTRÄGER (First- und Traufpfette) +// Horizontale Träger parallel zur Hauswand. +// y_pos: Achsposition in Y, z_pos: Unterkante in Z +// ------------------------------------------------------------ +module laengstraeger(y_pos, z_pos) { + color("Sienna", 0.85) + translate([0, y_pos - sparren_breite / 2, z_pos]) + cube([vordach_breite, sparren_breite, sparren_hoehe]); +} + + +// ============================================================ +// 4. HAUPTASSEMBLIERUNG +// ============================================================ + +module vordach_komplett() { + + // --- Pfosten --- + // Gleichmäßig über die Breite verteilt an der Vorderkante + let (abstand = (pfosten_anzahl > 1) + ? (vordach_breite - pfosten_breite) / (pfosten_anzahl - 1) + : 0) { + + for (i = [0 : pfosten_anzahl - 1]) + let (px = pfosten_breite / 2 + i * abstand) + translate([px, + vordach_tiefe - pfosten_breite / 2, + 0]) + pfosten(); + } + + // --- Wandpfette --- + wandpfette(); + + // --- Sparren --- + for (i = [0 : sparren_count - 1]) + let (sx = -dach_ueberstand_seite + i * sparren_abstand) + translate([sx, 0, dach_hoehe_hinten]) + sparren(); + + // --- Firstpfette (wandseitig) und Traufpfette (vorne) --- + laengstraeger(0, dach_hoehe_hinten - sparren_hoehe); + laengstraeger(vordach_tiefe, dach_hoehe_vorne - sparren_hoehe); + + // --- Dachfläche --- + dachflaeche(); +} + + +// ============================================================ +// 5. RENDER-AUFRUF +// ============================================================ + +vordach_komplett(); + + +// ============================================================ +// 6. DEBUG / SCHNITTANSICHT (Kommentar entfernen zum Aktivieren) +// ============================================================ + +// Querschnitt in der Mitte (Y-Schnitt): +// intersection() { +// vordach_komplett(); +// translate([vordach_breite/2 - 5, -100, -100]) +// cube([10, vordach_tiefe + 200, dach_hoehe_hinten + 500]); +// } + +// Einzelmodule isoliert testen: +// pfosten(); +// wandpfette(); +// sparren(); +// dachflaeche(); + + +// ============================================================ +// 7. ANPASSUNGSGUIDE (Kurzreferenz) +// ============================================================ +// +// AUFGABE VARIABLE(N) +// ───────────────────────────────────────────────────────── +// Größe ändern vordach_breite, vordach_tiefe +// Gefälle einstellen dach_neigung_grad +// Dachmaterial wechseln dach_material (+ sparren_abstand prüfen!) +// Putzausgleich Wand wandtoleranz_y +// Höhenausgleich Wand wandtoleranz_z +// Pfosten-Querschnitt pfosten_breite +// Pfostenanzahl erhöhen pfosten_anzahl +// Überstand Traufe/Seite dach_ueberstand_vorne / dach_ueberstand_seite +// Renderauflösung $fn (oben, global) +// ───────────────────────────────────────────────────────── +// +// EXPORTHINWEIS: +// F5 = Vorschau (OpenCSG, schnell) +// F6 = vollständiges Render (CGAL) → dann STL / DXF exportieren +// File → Export → DXF → 2D-Projektion für Werkstattzeichnung +// ============================================================ diff --git a/vordach1.scad b/vordach1.scad new file mode 100644 index 0000000..0f9240b --- /dev/null +++ b/vordach1.scad @@ -0,0 +1,338 @@ +// ============================================================ +// PARAMETRISCHES VORDACH - OpenSCAD +// Autor: John M. Wayne +// Datum: 2026-05-16 +// Lizenz: CC BY 4.0 +// +// EINHEITENSYSTEM: alle Maße in Millimeter (mm) +// +// KOORDINATENURSPRUNG: +// X = Breite (entlang der Hauswand) +// Y = Tiefe (Auskragung vom Haus weg) +// Z = Höhe +// +// MONTAGEHINWEIS: +// Die Wandseite liegt bei Y = 0. +// Die Pfosten stehen auf Z = 0 (Bodenebene). +// ============================================================ + + +// ============================================================ +// 1. GLOBALE PARAMETER – hier zentral anpassen +// ============================================================ + +// --- Gesamtgeometrie --- +vordach_breite = 3000; // [mm] Breite des Vordachs entlang der Hauswand +vordach_tiefe = 1500; // [mm] Auskragung (Tiefe) vom Haus nach außen +dach_neigung_grad = 7; // [°] Gefälle nach vorne (min. 5° für Stegplatten) + +// --- Pfosten --- +pfosten_breite = 100; // [mm] Querschnitt Pfosten (quadratisch) +pfosten_hoehe = 2400; // [mm] Pfostenhöhe ab Boden (Unterkante Dach vorne) +pfosten_anzahl = 2; // Anzahl Frontstützen (bei Breite > 3 m: 3 empfohlen) + +// --- Wandhalterung / Pfette --- +pfette_breite = 120; // [mm] Breite der Wandpfette (Holz oder Stahl) +pfette_hoehe = 180; // [mm] Höhe der Wandpfette + +// TOLERANZ HAUSWAND: +// Mauerwerk ist selten exakt lotrecht. Empfohlene Montagetoleranz: +// - Dübelbohrlöcher ±5 mm übermessen (Langloch in Z-Richtung) +// - Pfette mit Beilagscheiben (0–10 mm) unterlegen +// - 'wandtoleranz_z': Z-Versatz der Pfette gegenüber Sollhöhe +// (+ = Pfette höher, - = Pfette tiefer; typisch ±20 mm) +// - 'wandtoleranz_y': Luftspalt Pfette <-> Wand (Putz, Dämmung) +wandtoleranz_z = 0; // [mm] Höhenkorrektur Wandmontage +wandtoleranz_y = 5; // [mm] Abstand Pfette zur Wandoberfläche + +// --- Dachfläche / Sparren --- +sparren_breite = 80; // [mm] Sparrenquerschnitt Breite +sparren_hoehe = 120; // [mm] Sparrenquerschnitt Höhe +sparren_abstand = 500; // [mm] Achsabstand der Sparren +// Richtwerte je Dachmaterial: +// Stegplatten (PC): max. 600 mm Glas (VSG): max. 500 mm +// Trapezblech: max. 1250 mm Bitumenwellpl.: max. 450 mm +dach_ueberstand_vorne = 100; // [mm] Überstand Eindeckung an der Traufe +dach_ueberstand_seite = 50; // [mm] Seitlicher Überstand + +// --- Dacheindeckung --- +// MATERIAL-UMSCHALTER (Wert als String eintragen): +// "stegplatten" → Polycarbonat-Stegplatten (16 mm) +// "glas" → Verbundsicherheitsglas VSG ( 8 mm) +// "blech" → Trapezblech / Aluminium (35 mm inkl. Profil) +// "bitumen" → Bitumenwellplatten (43 mm inkl. Welle) +dach_material = "stegplatten"; + +// Materialstärken (werden per dach_staerke() automatisch gewählt) +stegplatten_staerke = 16; +glas_staerke = 8; +blech_staerke = 35; +bitumen_staerke = 43; + +// --- Verbindungselemente (Visualisierung) --- +schraube_dm = 12; // [mm] Schraubendurchmesser (M12) +ankerplatte_groesse = 150; // [mm] Fußplatte Pfosten (quadratisch) +ankerplatte_staerke = 10; // [mm] Plattendicke + +// --- Renderqualität --- +$fn = 32; // Auflösung Zylinder (32 = schnell, 128 = Druckqualität) + + +// ============================================================ +// 2. ABGELEITETE GRÖSSEN – nicht manuell ändern +// ============================================================ + +// Dachhöhe hinten (Wandseite) aus Neigung + Tiefe +dach_hoehe_vorne = pfosten_hoehe; +dach_hoehe_hinten = pfosten_hoehe + tan(dach_neigung_grad) * vordach_tiefe; + +// Materialstärke per ternärer Kette +// HINWEIS: OpenSCAD-Funktionen dürfen nicht auf globale String-Variablen +// zugreifen, daher direkte Referenz auf die globalen Stärken-Variablen. +function dach_staerke() = + dach_material == "stegplatten" ? stegplatten_staerke : + dach_material == "glas" ? glas_staerke : + dach_material == "blech" ? blech_staerke : + dach_material == "bitumen" ? bitumen_staerke : + stegplatten_staerke; // Fallback + +// Sparrenlänge (Schräglänge auf der Dachneigung) +sparren_laenge = vordach_tiefe / cos(dach_neigung_grad) + dach_ueberstand_vorne; + +// Anzahl Sparren +sparren_count = floor((vordach_breite + 2 * dach_ueberstand_seite) / sparren_abstand) + 1; + +// Dübelabstand Wandpfette (alle 500 mm ein Befestigungspunkt) +duebel_abstand = 500; +duebel_anzahl = round(vordach_breite / duebel_abstand); + + +// ============================================================ +// 3. MODULE +// ============================================================ + +// ------------------------------------------------------------ +// 3.1 PFOSTEN (Frontstütze) +// Ursprung: Unterkante, Mitte des Pfostenquerschnitts +// +// Montagehinweis: +// Ankerplatten mit chemischem Dübel (z. B. Hilti HIT-RE 500) +// befestigen. Bohrdurchmesser = schraube_dm + 1 mm Spielpassung. +// ankerplatte_groesse an vorhandenes Fundament anpassen. +// ------------------------------------------------------------ +module pfosten(hoehe = pfosten_hoehe) { + + // Schaft + color("SaddleBrown", 0.9) + translate([-pfosten_breite/2, -pfosten_breite/2, 0]) + cube([pfosten_breite, pfosten_breite, hoehe]); + + // Fußplatte + color("Silver") + translate([-ankerplatte_groesse/2, -ankerplatte_groesse/2, -ankerplatte_staerke]) + cube([ankerplatte_groesse, ankerplatte_groesse, ankerplatte_staerke]); + + // Ankerschrauben (Visualisierung, 4 Stück) + for (dx = [-1, 1]) + for (dy = [-1, 1]) + color("DarkGray") + translate([dx * (ankerplatte_groesse/2 - 20), + dy * (ankerplatte_groesse/2 - 20), + -ankerplatte_staerke]) + cylinder(d = schraube_dm, + h = ankerplatte_staerke + 30, + center = false); + + // Kopfplatte (Auflager für Sparren) + color("Silver") + translate([-ankerplatte_groesse/2, -ankerplatte_groesse/2, hoehe]) + cube([ankerplatte_groesse, ankerplatte_groesse, ankerplatte_staerke]); +} + + +// ------------------------------------------------------------ +// 3.2 WANDHALTERUNG / WANDPFETTE +// Verläuft entlang der gesamten Breite an der Hauswand. +// +// Montagehinweis: +// - wandtoleranz_y erzeugt Luftspalt (Putz, Dämmung, Belüftung) +// - wandtoleranz_z korrigiert Höhenabweichungen im Mauerwerk +// - Dübelmuster: alle duebel_abstand mm ein Befestigungspunkt +// - Holzpfette: druckimprägniert C24, Hirnholz mit Anstrich +// - Stahlpfette: feuerverzinkt, Wandanschluss mit EPDM abdichten +// ------------------------------------------------------------ +module wandpfette() { + + // Z-Position: Sparrenauflager bündig mit Oberkante Pfette + let (pfette_z = dach_hoehe_hinten - pfette_hoehe + wandtoleranz_z) { + + // Pfettenkörper + color("Peru", 0.9) + translate([0, wandtoleranz_y, pfette_z]) + cube([vordach_breite, pfette_breite, pfette_hoehe]); + + // Dübel / Wandschrauben (Visualisierung) + for (i = [0 : duebel_anzahl]) + let (x = i * (vordach_breite / max(duebel_anzahl, 1))) + color("DarkGray") + translate([x, -80, pfette_z + pfette_hoehe / 2]) + rotate([90, 0, 0]) + cylinder(d = 16, h = 80); + } +} + + +// ------------------------------------------------------------ +// 3.3 SPARREN +// Ein einzelner Dachsparren, geneigt per dach_neigung_grad. +// Ursprung: Wandpfettenauflager (Y=0, Z=dach_hoehe_hinten) +// +// Hinweis Materialwahl: +// Stegplatten → Sparren in Falllinie (Hohlkammern = Entwässerung) +// Glas → alle 500 mm (Statik nachweisen!) +// Trapezblech → bis 1250 mm selbsttragend +// Bitumen → Vollschalung oder max. 450 mm Abstand +// ------------------------------------------------------------ +module sparren(laenge = sparren_laenge) { + + color("BurlyWood") + rotate([-dach_neigung_grad, 0, 0]) + cube([sparren_breite, laenge, sparren_hoehe]); +} + + +// ------------------------------------------------------------ +// 3.4 DACHFLÄCHE / EINDECKUNG +// Vereinfachte geneigte Plattengeometrie. +// +// Stegplatten (PC): +// - Überlappung min. 100 mm in Falllinie, Aluabschlussband +// - Ausdehnung ca. 2.5 mm/m/10 K → Klemmprofil nicht festklemmen +// - UV-Schutzseite (blaue Folie) IMMER nach oben +// - Randversiegelung: Aluband oben + gelochtes Lüftungsband unten +// +// Glas (VSG): +// - Randeinstand min. 20 mm im Klemmprofil +// - Eigengewicht 10 mm VSG ≈ 25 kg/m² → Statik erforderlich! +// - Thermisch getrennte Profile (Wärmebrücke vermeiden) +// - Norm: VSG nach DIN 18008 +// +// Trapezblech: +// - Dachneigung min. 3° (Stehfalz) / 5° (Trapez) +// - First/Traufe mit vorkomprimiertem Dichtband +// - Schrauben IMMER durch Hochrippe mit Scheibendichtung +// +// Bitumenwellplatte: +// - Längsüberlappung: 1 Welle; Querüberlappung: min. 200 mm +// - First: Firsthaube + Schaumstoff-Dichtstreifen +// ------------------------------------------------------------ +module dachflaeche() { + + let (staerke = dach_staerke(), + breite_gesamt = vordach_breite + 2 * dach_ueberstand_seite) { + + color("LightBlue", 0.5) + translate([-dach_ueberstand_seite, 0, dach_hoehe_hinten]) + rotate([-dach_neigung_grad, 0, 0]) + cube([breite_gesamt, sparren_laenge, staerke]); + } +} + + +// ------------------------------------------------------------ +// 3.5 LÄNGSTRÄGER (First- und Traufpfette) +// Horizontale Träger parallel zur Hauswand. +// y_pos: Achsposition in Y, z_pos: Unterkante in Z +// ------------------------------------------------------------ +module laengstraeger(y_pos, z_pos) { + color("Sienna", 0.85) + translate([0, y_pos - sparren_breite / 2, z_pos]) + cube([vordach_breite, sparren_breite, sparren_hoehe]); +} + + +// ============================================================ +// 4. HAUPTASSEMBLIERUNG +// ============================================================ + +module vordach_komplett() { + + // --- Pfosten --- + // Gleichmäßig über die Breite verteilt an der Vorderkante + let (abstand = (pfosten_anzahl > 1) + ? (vordach_breite - pfosten_breite) / (pfosten_anzahl - 1) + : 0) { + + for (i = [0 : pfosten_anzahl - 1]) + let (px = pfosten_breite / 2 + i * abstand) + translate([px, + vordach_tiefe - pfosten_breite / 2, + 0]) + pfosten(); + } + + // --- Wandpfette --- + wandpfette(); + + // --- Sparren --- + for (i = [0 : sparren_count - 1]) + let (sx = -dach_ueberstand_seite + i * sparren_abstand) + translate([sx, 0, dach_hoehe_hinten]) + sparren(); + + // --- Firstpfette (wandseitig) und Traufpfette (vorne) --- + laengstraeger(0, dach_hoehe_hinten - sparren_hoehe); + laengstraeger(vordach_tiefe, dach_hoehe_vorne - sparren_hoehe); + + // --- Dachfläche --- + dachflaeche(); +} + + +// ============================================================ +// 5. RENDER-AUFRUF +// ============================================================ + +vordach_komplett(); + + +// ============================================================ +// 6. DEBUG / SCHNITTANSICHT (Kommentar entfernen zum Aktivieren) +// ============================================================ + +// Querschnitt in der Mitte (Y-Schnitt): +// intersection() { +// vordach_komplett(); +// translate([vordach_breite/2 - 5, -100, -100]) +// cube([10, vordach_tiefe + 200, dach_hoehe_hinten + 500]); +// } + +// Einzelmodule isoliert testen: +// pfosten(); +// wandpfette(); +// sparren(); +// dachflaeche(); + + +// ============================================================ +// 7. ANPASSUNGSGUIDE (Kurzreferenz) +// ============================================================ +// +// AUFGABE VARIABLE(N) +// ───────────────────────────────────────────────────────── +// Größe ändern vordach_breite, vordach_tiefe +// Gefälle einstellen dach_neigung_grad +// Dachmaterial wechseln dach_material (+ sparren_abstand prüfen!) +// Putzausgleich Wand wandtoleranz_y +// Höhenausgleich Wand wandtoleranz_z +// Pfosten-Querschnitt pfosten_breite +// Pfostenanzahl erhöhen pfosten_anzahl +// Überstand Traufe/Seite dach_ueberstand_vorne / dach_ueberstand_seite +// Renderauflösung $fn (oben, global) +// ───────────────────────────────────────────────────────── +// +// EXPORTHINWEIS: +// F5 = Vorschau (OpenCSG, schnell) +// F6 = vollständiges Render (CGAL) → dann STL / DXF exportieren +// File → Export → DXF → 2D-Projektion für Werkstattzeichnung +// ============================================================ diff --git a/vordach_holzauszug.xlsx b/vordach_holzauszug.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a062353251fec653158e762a70c2af97e8dddd67 GIT binary patch literal 13156 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 literal 0 HcmV?d00001