Memo vom 11.09.2026 umgesetzt
Deploy App / deploy (push) Successful in 28s

Haus
- Oeffnungen aus den Fassadenplaenen von EHLE abgegriffen. Zum Garten steht
  im Erdgeschoss eine einzige, mittige Fensterfront (x -8.82 bis -4.67),
  daneben das Lamellenband vor dem gedeckten Sitzplatz; im Obergeschoss zwei
  Fenster mit zwei schmalen Lamellen dazwischen.
- Der gedeckte Sitzplatz ist nur noch gegen Westen offen, so wie es die
  Suedwestfassade als "Aussensitzplatz" zeigt. Gegen den Garten steht dort
  eine geschlossene Wand - bisher schaute man durch die Fassade hinein.
- Hauszugang an der Nordostfassade statt an der Nordwestfassade: Tuerfluegel
  und feststehende Verglasung, zusammen 3.15 m, darueber das Vordach. Das
  Vordach kennt jetzt seine Fassadenseite.
- Die Fassadennamen im Datenmodell waren vertauscht; jetzt mit Tabelle im
  README festgehalten.

Garten
- Sichtschutz: die gruenen Punkte im Kiesbett sind Ziergraeser, keine
  Polster. Neue Halmgeometrie - schmales, sich verjuengendes Band, das nach
  oben ueberhaengt, rund 1.10 m. Die Bodenleuchten sind jetzt Strahler und
  leuchten Stelen und Graeser von unten an.
- Baenkli: die Fuesse standen quer zur Sitzplatte, weil der Versatz in
  Welt-Z statt entlang der gedrehten Achse gerechnet wurde.
- Obere Ebene bis an das Kraeuterbeet eben auf -0.02. Zwischen Grillfeld und
  Kraeuterbeet stieg der Rasen um gut 30 cm an.
- Unter dem Spielhaus steht der Betonklotz aus dem Plan (graues Rechteck
  1.01 x 2.70 m); die offene Plattform daneben bleibt auf Stuetzen.
- Aus dem Gartenhaus wird ein Gartenschrank: 1.80 x 0.50 m, 2.00 m hoch, mit
  dem Ruecken in der Ecke und den Doppeltueren zum Garten.
- Neben dem Gelaender der Osttreppe lag Rasen; dort liegt jetzt derselbe
  Belag wie auf dem Weg, bis an den Treppenkopf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-11 08:01:39 +02:00
co-authored by Claude Opus 5
parent fad23a34c3
commit fefa8e8c9a
9 changed files with 329 additions and 69 deletions
+57 -23
View File
@@ -98,7 +98,12 @@ export const LEVELS = [
// steht dort "Steigung 9.9%".
id: 'weg-ost', plane: [0, 0.1178, 0.1224], types: ['tegula'],
note: 'Ostweg als Rampe',
polygon: [[2.80, -4.30], [4.55, -4.30], [4.55, 5.05], [2.80, 5.05]],
polygon: [[2.05, -4.30], [4.55, -4.30], [4.55, 5.05], [2.05, 5.05]],
},
{
id: 'weg-ost-gelaender', level: -0.45, types: ['tegula'],
note: 'Belagstreifen neben dem Gelaender der Osttreppe',
polygon: [[2.05, -6.60], [2.92, -6.60], [2.92, -4.15], [2.05, -4.15]],
},
{
id: 'weg-ost-unten', level: -1.57, types: ['tegula'],
@@ -118,7 +123,7 @@ export const LEVELS = [
// ohne feste Vorgabe zieht die Interpolation den Rasen huegelig hoch.
id: 'oben', level: -0.02, flatten: true,
note: 'Obere Ebene: Rasen und Kiesfeld, eben auf -0.02',
polygon: [[-18.30, 0.90], [-8.60, 0.90], [-8.60, 3.90], [-18.30, 3.90]],
polygon: [[-18.30, 0.90], [-4.70, 0.90], [-4.70, 4.00], [-18.30, 4.00]],
},
{
id: 'unten',
@@ -218,8 +223,11 @@ export const WALLS = [
/** Freistehende Bauteile und Moeblierung. rot = Drehung um Y in Grad. */
export const PROPS = [
{ id: 'gartenhaus', type: 'gartenhaus', x: 1.20, z: -3.60, w: 1.8, d: 1.8, h: 2.15, rot: 0,
note: 'Standort Gartenhaus 1,8 x 1,8 m' },
// Der Plan reserviert 1.8 x 1.8 m fuer das Gartenhaus. Gebaut wird dort ein
// schmaler Gartenschrank: 1.80 m breit, nur 0.50 m tief, rund 2.00 m hoch,
// mit dem Ruecken in der Ecke und den Tueren zum Garten.
{ id: 'gartenschrank', type: 'gartenhaus', x: 1.87, z: -3.58, w: 0.50, d: 1.80, h: 2.00, rot: 0,
note: 'Gartenschrank 1.80 x 0.50 m, 2.00 m hoch' },
// Der Plan zeichnet zwei Rechtecke: das Podest 1.81 x 2.70 m (x -0.95 bis
// 0.86) und darauf die Huette 1.01 x 2.70 m an der Ostseite (x -0.15 bis
// 0.86). Die Kote 1.47 im Podest ist die Hoehe des Bodens - ein Stelzenhaus,
@@ -274,7 +282,12 @@ export const EXTRA_SURFACES = [
// beginnt die Wiese. Zwei Leuchten stehen daran.
type: 'tegula',
note: 'Weg an der Ostseite, Rampe oberhalb der Treppe (Steigung rund 12%)',
polygon: [[2.86, -4.18], [4.45, -4.18], [4.45, 4.96], [2.86, 4.96]],
polygon: [[2.12, -4.18], [4.45, -4.18], [4.45, 4.96], [2.12, 4.96]],
},
{
type: 'tegula',
note: 'Belagstreifen neben dem Gelaender, bis an den Kopf der Osttreppe',
polygon: [[2.12, -6.55], [2.86, -6.55], [2.86, -4.18], [2.12, -4.18]],
},
{
type: 'tegula',
@@ -386,25 +399,46 @@ export const BUILDING = {
* der Suedwestecke, oben vom Obergeschoss ueberdeckt.
*/
loggia: { x0: -13.82, z0: -3.06, x1: -9.06, z1: 0.96, ceiling: 2.75 },
/** Vordach ueber dem Hauseingang an der Nordostfassade (siehe Foto). */
canopy: { a: -3.20, b: 0.28, depth: 1.35, y: 2.60, thickness: 0.16 },
/**
* Vordach ueber dem Hauszugang an der Nordostfassade (x = +0.28). Der
* Situationsplan zeigt ein Eingangspodest von 1.05 + 1.13 m Tiefe, darueber
* das "Vordach (Holzbauer)".
*/
canopy: { face: 'east', a: -2.95, b: 0.75, depth: 2.20, y: 2.28, thickness: 0.16 },
/**
* Oeffnungen, abgegriffen aus den Fassadenplaenen von EHLE Architekten
* (1:100, 27.04.2021). Die Fassaden heissen dort nach Himmelsrichtung:
* Suedostfassade = z +0.96 (lang, zum Garten) -> face 'south'
* Nordostfassade = x +0.28 (kurz, Hauszugang) -> face 'east'
* Suedwestfassade = x -13.82 (kurz, zur Terrasse) -> face 'west'
* Nordwestfassade = z -6.87 (lang, zum Nachbarn) -> face 'north'
* Die Nordwestfassade ist im Plansatz nicht gezeichnet; sie steht am
* Nachbarbau und bleibt geschlossen.
*/
openings: [
// Suedwestfassade (z = 0.96 / 0.51) - grosse Fensterfronten zum Garten
{ face: 'south', a: -4.40, b: -0.20, sill: 0.0, head: 2.45, kind: 'glass' },
{ face: 'south', a: -12.90, b: -9.40, sill: 0.0, head: 2.45, kind: 'glass' },
{ face: 'south', a: -3.90, b: -0.60, sill: 3.35, head: 5.00, kind: 'glass', upper: true },
{ face: 'south', a: -12.60, b: -9.70, sill: 3.35, head: 5.00, kind: 'glass', upper: true },
// Westfassade (x = -13.82) - Fenster
{ face: 'west', a: -5.84, b: -4.24, sill: 0.85, head: 2.35, kind: 'window' },
{ face: 'west', a: -5.60, b: -4.50, sill: 3.75, head: 5.00, kind: 'window', upper: true },
// Nordostfassade (z = -6.87) - Eingang und Lamellenfenster
{ face: 'north', a: -1.90, b: -0.90, sill: 0.0, head: 2.35, kind: 'door' },
{ face: 'north', a: -5.60, b: -3.90, sill: 0.90, head: 2.35, kind: 'window' },
{ face: 'north', a: -11.60, b: -10.20, sill: 0.90, head: 2.35, kind: 'slats' },
{ face: 'north', a: -5.40, b: -4.10, sill: 3.75, head: 5.10, kind: 'window', upper: true },
{ face: 'north', a: -11.40, b: -10.40, sill: 3.75, head: 5.10, kind: 'slats', upper: true },
// Ostfassade (x = 0.28)
{ face: 'east', a: -5.60, b: -4.30, sill: 0.90, head: 2.35, kind: 'window' },
// -- Suedostfassade (z = +0.96), zum Garten ---------------------------
// Erdgeschoss: das Lamellenband vor dem gedeckten Sitzplatz und die
// grosse, mittig sitzende Fensterfront.
{ face: 'south', a: -12.44, b: -9.32, sill: 0.15, head: 2.20, kind: 'slats' },
{ face: 'south', a: -8.82, b: -4.67, sill: 0.0, head: 2.19, kind: 'glass' },
// Obergeschoss: zwei Fenster aussen, dazwischen zwei schmale Lamellen.
{ face: 'south', a: -12.44, b: -9.98, sill: 3.08, head: 4.90, kind: 'window', upper: true },
{ face: 'south', a: -8.90, b: -7.67, sill: 3.30, head: 4.90, kind: 'slats', upper: true },
{ face: 'south', a: -6.55, b: -5.40, sill: 3.30, head: 4.90, kind: 'slats', upper: true },
{ face: 'south', a: -3.60, b: -1.10, sill: 3.08, head: 4.90, kind: 'window', upper: true },
// -- Nordostfassade (x = +0.28), Hauszugang ---------------------------
// Der Zugang ist ein Element aus Tuerfluegel und feststehender
// Verglasung, zusammen rund 3.15 m breit.
{ face: 'east', a: -0.65, b: 0.48, sill: 0.0, head: 2.20, kind: 'door' },
{ face: 'east', a: -2.67, b: -0.71, sill: 0.0, head: 2.20, kind: 'glass' },
{ face: 'east', a: -6.40, b: -5.54, sill: 1.19, head: 2.15, kind: 'slats' },
{ face: 'east', a: -5.93, b: -3.36, sill: 3.18, head: 4.94, kind: 'window', upper: true },
// -- Suedwestfassade (x = -13.82), zur Terrasse -----------------------
// Der grosse Ausschnitt daneben ist der gedeckte Sitzplatz selbst.
{ face: 'west', a: -5.60, b: -3.91, sill: 0.42, head: 2.01, kind: 'slats' },
{ face: 'west', a: -5.71, b: -3.07, sill: 3.17, head: 4.97, kind: 'window', upper: true },
],
};
+12 -1
View File
@@ -173,6 +173,15 @@ for (const st of stelen) {
}
stelen.sort((a, b) => a.z - b.z || a.x - b.x);
/**
* Die gruenen Punkte, die im Plan zwischen den Travertinstelen im Kiesbett
* stehen, sind keine Polster, sondern Ziergraeser - sie wachsen an den
* Stelen hoch und werden von den Bodenleuchten angestrahlt.
*/
function imKiesbett(x, z) {
return stelen.some((s) => Math.hypot(s.x - x, s.z - z) < 1.1);
}
// ---------------------------------------------------------------------------
// 2. Hecken und Pflanzen aus den Plankreisen
// ---------------------------------------------------------------------------
@@ -187,7 +196,9 @@ for (const s of raw.shapes) {
const { cx, cz, r } = s.circle;
if (r < 0.06) continue; // Lampensymbole und Punktraster
if (treeAt(cx, cz)) continue; // Solitaere kommen aus dem Authoring
plants.push({ type, x: round(cx), z: round(cz), r: round(r, 2) });
// Kraeuter im Kiesbett des Sichtschutzes sind Ziergraeser.
const art = (type === 'kraut' || type === 'gras') && imKiesbett(cx, cz) ? 'gras' : type;
plants.push({ type: art, x: round(cx), z: round(cz), r: round(r, 2) });
}
// Der Ligusterhecken-Streifen ist im Plan eine Flaeche, keine Kreise.
for (const s of raw.shapes) {