From 1c80ec588e17efb21d2639f2e003487628e41321 Mon Sep 17 00:00:00 2001 From: Moirtz Wagner Date: Fri, 4 Sep 2026 20:57:55 +0200 Subject: [PATCH] PV aufs Haus, Dachdicke fuer die Carports, Sonnensegel auf zwei Meter Auf dem OG-Carport liegt keine Anlage - die Module gehoeren aufs Hausdach. Dafuer kann der Zeichner jetzt auch Module auf einer Dachschraege und nicht nur auf einer waagrechten Deckflaeche: "pv" nimmt eine Himmelsrichtung. Auf dem Haus ist es die Suedschraege, und weil die Wiederkehr danach gezeichnet wird, deckt sie die Mitte ab - genau wie auf dem Luftbild, wo die Module links und rechts von ihr liegen. Eingezogen wird dort im Bild und nicht in Metern: die Schraege ist schon projiziert, und auf ihrer Ebene bleibt ein Einzug auch nach der Projektion ein Einzug. Die Carportdaecher haben eine Dicke, mit 30 cm etwas mehr als die 20 cm der Waende. Das brauchte zwingend einen Ueberstand: buendig aufliegend sind Stirnflaeche und Wandflaeche deckungsgleich, die Dicke waere gerechnet und trotzdem unsichtbar. Genau daher kam auch der Eindruck, dem OG-Carport fehle die Westwand - sie war die ganze Zeit da und wurde auch gezeichnet, sie hatte nur keine Kante, an der sie aufgehoert haette. Mit 25 cm Ueberstand steht sie jetzt sichtbar unter dem Dach. Die Pergola ist ein Sonnensegel: eine Bahn Tuch auf zwei Metern, heller und ohne Bauwerk darunter. Dass sie zu schweben scheint, ist richtig so - die Masten waeren bei diesem Massstab duenner als ein Strich. Der Hof laeuft vor dem EG-Carport gerade bis an den Garten weiter; der Carport steht damit auf ihm. Seine suedliche Kante sind dieselben beiden Punkte, die auch im Gartenumriss stehen. Co-Authored-By: Claude Opus 5 --- restricted/aussenplan.php | 73 ++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/restricted/aussenplan.php b/restricted/aussenplan.php index 86e99a0..d392b70 100644 --- a/restricted/aussenplan.php +++ b/restricted/aussenplan.php @@ -107,14 +107,21 @@ function aussenFlaechen() [24.3, 19.5], [36.8, 17.2], [39.2, 31.2], [24.2, 33.8], [22.7, 24.2], [19.9, 25.6], [20.2, 28.7], [19.0, 29.8], [19.3, 39.1]]], + // Der Hof laeuft vor dem EG-Carport gerade bis an den Garten weiter; + // der Carport steht also auf ihm. Die suedliche Kante ist die + // Gartengrenze - dieselben beiden Punkte stehen dort im Umriss. ["raum" => null, "z" => 0, "hoehe" => 0, "farbe" => "#6e7278", // Hof - "ecken" => [[9.3, 26.1], [8.9, 36.4], [11.0, 36.0], [18.9, 34.7], [19.0, 29.8], - [20.4, 28.7], [19.8, 25.6], [19.6, 24.3]]], + "ecken" => [[9.3, 26.1], [8.9, 36.4], [8.6, 40.6], [19.3, 39.1], [18.9, 34.7], + [19.0, 29.8], [20.4, 28.7], [19.8, 25.6], [19.6, 24.3]]], // Das Haus. First ueber die laengere Achse, also Ost-West - so liegt // er auch auf dem Luftbild. + // Die Anlage liegt auf der Suedschraege. Die Wiederkehr wird danach + // gezeichnet und deckt die Mitte ab - genau wie auf dem Luftbild, wo + // die Module links und rechts von ihr liegen. ["raum" => null, "z" => 0, "hoehe" => 6, "farbe" => "#d5d9df", "dachfarbe" => "#9aa3ad", "dach" => ["art" => "sattel", "hoehe" => 3], + "pv" => "S", "ecken" => [[36.8, 17.2], [39.2, 31.2], [24.2, 33.8], [21.8, 19.8]]], // Wiederkehr auf der Suedseite: ein Kreuzgiebel quer zum Hauptfirst. @@ -138,14 +145,14 @@ function aussenFlaechen() // Garagendachs an - deshalb 2,23 + 0,27 und nicht glatt 2,5: die // Oberkante der hohen Seite soll die 2,5 treffen, nicht die Wand. ["raum" => "Carport OG", "z" => 0, "hoehe" => 2.23, "farbe" => "#b8b3aa", - "dachfarbe" => "#a8a29a", "pv" => true, + "dachfarbe" => "#a8a29a", "dachdicke" => 0.3, "dach" => ["art" => "pult", "hoehe" => 0.27, "tief" => "W"], "offen" => ["S"], "ecken" => [[12.2, 19.2], [13.3, 25.4], [9.3, 26.1], [8.2, 19.9]]], // Der EG-Carport faellt nach Sueden ab und ist nach Westen offen. ["raum" => "Carport EG", "z" => 0, "hoehe" => 2.2, "farbe" => "#b8b3aa", - "dachfarbe" => "#a8a29a", "pv" => true, + "dachfarbe" => "#a8a29a", "pv" => true, "dachdicke" => 0.3, "dach" => ["art" => "pult", "hoehe" => 0.23, "tief" => "S"], "offen" => ["W"], "ecken" => [[19.0, 34.6], [19.3, 39.1], [10.7, 40.3], [10.4, 35.8]]], @@ -170,7 +177,10 @@ function aussenFlaechen() ["raum" => "Terrasse OG", "z" => 3, "hoehe" => 0, "farbe" => "#c3cbd5", "ecken" => [[23.8, 31.1], [28.3, 30.4], [29.0, 33.0], [24.2, 33.8]]], - ["raum" => "Pergola", "z" => 0, "hoehe" => 0, "farbe" => "#9aa3ad", + // Ein Sonnensegel, kein Bauwerk: eine Bahn Tuch auf zwei Metern. Dass + // sie ohne Sichtbares darunter schwebt, ist richtig so - die Masten + // sind duenner als ein Strich bei diesem Massstab. + ["raum" => "Pergola", "z" => 2, "hoehe" => 0, "farbe" => "#c6cbd2", "ecken" => [[48.0, 36.5], [43.8, 36.4], [46.0, 31.5], [49.4, 32.4]]], ]; } @@ -632,22 +642,59 @@ function aussenZeichnung() $polygone[] = ["punkte" => $schraege, "farbe" => aussenSchatten($f["dachfarbe"] ?? "#9aa3ad", $r === "S" || $r === "W" ? 1.0 : 0.82)]; + // Module auf genau dieser Schraege. Eingezogen wird hier + // im Bild und nicht in Metern: die Flaeche ist schon + // projiziert, und auf ihrer Ebene bleibt der Einzug auch + // nach der Projektion ein Einzug. + if (($f["pv"] ?? null) === $r) { + $polygone[] = ["punkte" => aussenEinzug($schraege, 4.0), + "farbe" => "#2f3a49"]; + } } } $deck = null; } else { // Flach, Pult oder gar kein Dach: die Oberseite ist die Deckflaeche. - $polygone[] = ["punkte" => $oben, "farbe" => $f["dachfarbe"] ?? $farbe]; - $deck = $oben; + // + // Eine Dachdicke braucht zwingend einen Ueberstand. Liegt das Dach + // buendig auf der Wand, sind Stirnflaeche und Wandflaeche + // deckungsgleich - die Dicke waere gerechnet und trotzdem nicht zu + // sehen, und der Koerper saehe aus, als fehle ihm eine Wand. + $dachdicke = $f["dachdicke"] ?? 0; + $dachEcken = $dachdicke > 0 + ? aussenEinzug($ecken, -($f["ueberstand"] ?? 0.25)) + : $ecken; + $deckPunkte = []; + foreach ($dachEcken as $i => $pkt) { + $deckPunkte[] = aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i]); + } + if ($dachdicke > 0) { + foreach ($dachEcken as $i => $pkt) { + $j = ($i + 1) % count($dachEcken); + $stirn = [ + aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i] - $dachdicke), + aussenPunkt($einpassung, $dachEcken[$j][0], $dachEcken[$j][1], + $zOben[$j] - $dachdicke), + aussenPunkt($einpassung, $dachEcken[$j][0], $dachEcken[$j][1], $zOben[$j]), + aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i]), + ]; + if (aussenSichtbar($stirn)) { + $polygone[] = ["punkte" => $stirn, + "farbe" => aussenSchatten($f["dachfarbe"] ?? $farbe, 0.78)]; + } + } + } + $polygone[] = ["punkte" => $deckPunkte, "farbe" => $f["dachfarbe"] ?? $farbe]; + $deck = $dachEcken; } - // Die Module liegen plan auf der Dachflaeche - ein Stueck eingezogen, - // damit der Rand des Daches sichtbar bleibt. - if (!empty($f["pv"]) && $deck) { - $modulEcken = aussenEinzug($ecken, 0.4); + // Module auf einer flachen oder geneigten Deckflaeche - ein Stueck + // eingezogen, damit der Rand des Daches sichtbar bleibt. + if (!empty($f["pv"]) && $f["pv"] === true && $deck) { + $modulEcken = aussenEinzug($deck, 0.4); $modul = []; - foreach ($modulEcken as $i => $p) { - $modul[] = aussenPunkt($einpassung, $p[0], $p[1], $zOben[$i] + 0.05); + foreach ($modulEcken as $i => $pkt) { + $modul[] = aussenPunkt($einpassung, $pkt[0], $pkt[1], $zOben[$i] + 0.05); } $polygone[] = ["punkte" => $modul, "farbe" => "#2f3a49"]; }