diff --git a/src/plan/generatePlan.ts b/src/plan/generatePlan.ts index 403a855..3bdd618 100644 --- a/src/plan/generatePlan.ts +++ b/src/plan/generatePlan.ts @@ -82,6 +82,8 @@ const MONO_INK = "#111111"; /** Haarlinie zwischen den Schichten (Schichtfugen) in mm — gleiche Stärke wie die Schraffur-Tinte. */ const LAYER_LINE_MM = 0.02; +/** Haarlinie für Tür-/Fenstersymbole (Flügel, Bogen, Rahmen, Glas) in mm. */ +const SYMBOL_HAIRLINE_MM = 0.02; /** Stärke der Wand-Umrisslinie je Detailgrad, als Faktor auf die Ebenen-lw. */ const OUTLINE_DETAIL_FACTOR: Record = { grob: 1.6, // dickere Sammellinie @@ -974,7 +976,7 @@ function addDoorSymbol( door: Project["doors"][number], greyed: boolean, detail: DetailLevel, - doorLwMm: number, + _doorLwMm: number, ): void { const u = normalize(sub(wall.end, wall.start)); const n = leftNormal(u); // linke Seite der Wandachse @@ -994,7 +996,7 @@ function addDoorSymbol( a: hinge, b: openEnd, cls: "door-leaf", - weightMm: doorLwMm, + weightMm: SYMBOL_HAIRLINE_MM, greyed, }); @@ -1007,8 +1009,7 @@ function addDoorSymbol( to: openEnd, r: door.width, cls: "door-swing", - weightMm: doorLwMm * 0.6, - dash: [0.06, 0.04], // gestrichelt in mm Papier + weightMm: SYMBOL_HAIRLINE_MM, greyed, }); } @@ -1023,7 +1024,7 @@ function addDoorSymbol( a: add(jamb, scale(n, reveal)), b: add(jamb, scale(n, -reveal)), cls: "door-frame", - weightMm: doorLwMm, + weightMm: SYMBOL_HAIRLINE_MM, greyed, }); } @@ -1062,7 +1063,7 @@ function addOpeningSymbol( a: sym.hinge, b: sym.openEnd, cls: "door-leaf", - weightMm: lwMm, + weightMm: SYMBOL_HAIRLINE_MM, greyed, openingId: o.id, }); @@ -1075,8 +1076,7 @@ function addOpeningSymbol( to: sym.openEnd, r: sym.radius, cls: "door-swing", - weightMm: lwMm * 0.6, - dash: [0.06, 0.04], + weightMm: SYMBOL_HAIRLINE_MM, greyed, openingId: o.id, }); @@ -1090,7 +1090,7 @@ function addOpeningSymbol( a: add(jamb, scale(sym.normal, reveal)), b: add(jamb, scale(sym.normal, -reveal)), cls: "door-frame", - weightMm: lwMm, + weightMm: SYMBOL_HAIRLINE_MM, greyed, openingId: o.id, }); @@ -1122,7 +1122,7 @@ function addOpeningSymbol( a, b, cls: "window-glass", - weightMm: lwMm * 0.7, + weightMm: SYMBOL_HAIRLINE_MM, greyed, openingId: o.id, }); @@ -1183,14 +1183,18 @@ function addCeilingPoche( const ceilingId = ceiling.id; // Gefüllte + schraffierte Fläche (Component-Poché). Im Detailgrad „grob" ohne - // Schraffur (reine Füllung), sonst die Bauteil-Schraffur. + // Schraffur (reine Füllung), sonst die Bauteil-Schraffur. SIA-Poché wie bei + // der mehrschichtigen Wand: neutraler Hintergrund (weiß) statt Bauteil-Albedo, + // Vollmuster ("solid") = schwarze Poché. + const hatch = comp && detail !== "grob" ? resolveHatch(project, comp.hatchId) : NO_HATCH; + const solid = hatch.pattern === "solid"; out.push({ kind: "polygon", pts, - fill: comp ? comp.color : "none", + fill: comp ? pocheFill(hatch.pattern) : "none", stroke, strokeWidthMm: LAYER_LINE_MM * LAYER_DETAIL_FACTOR[detail], - hatch: comp && detail !== "grob" ? resolveHatch(project, comp.hatchId) : NO_HATCH, + hatch: solid ? { ...hatch, color: POCHE_FILL_BLACK } : hatch, greyed, ceilingId, }); diff --git a/src/plan/toRenderScene.ts b/src/plan/toRenderScene.ts index d77e986..6f4e202 100644 --- a/src/plan/toRenderScene.ts +++ b/src/plan/toRenderScene.ts @@ -128,10 +128,10 @@ const DEFAULT_LINE = "#1a1a1a"; * `opacity: 0.7`, wall-axis `opacity: 0.85`. */ const CLS_STROKE: Record = { - "door-leaf": "#2b3039", - "door-swing": "#6b7280", - "door-frame": "#2b3039", - "window-glass": "#4a86c7", + "door-leaf": "#1a1a1a", + "door-swing": "#1a1a1a", + "door-frame": "#1a1a1a", + "window-glass": "#1a1a1a", "wall-axis": "#2f5d54", // var(--accent) des hellen Standard-Themes }; const CLS_OPACITY: Record = { @@ -433,7 +433,7 @@ export function planToRenderScene(plan: Plan, paperScaleN: number = STAMP_DEFAUL } } else if (p.kind === "arc") { flushRun(); - // Farbe wie im SVG: CSS-Klassen-Regel (z. B. .door-swing → #6b7280). + // Farbe wie im SVG: CSS-Klassen-Regel (z. B. .door-swing → #1a1a1a). const col = withOpacity(strokeColorFor(p.cls, undefined), p.cls, p.greyed); // Bogen unvortessellliert an Rust übergeben (`RArc`) — die exakte runde // Darstellung (analytischer SDF-Shader, `ARC_WGSL`) und ein evtl. Strich- diff --git a/src/styles.css b/src/styles.css index 85dd895..11eae35 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1527,24 +1527,24 @@ body { Das Zeichenblatt ist IMMER hell (--sheet) → Plan-Tinte bleibt fix dunkel, unabhängig vom UI-Theme (sonst unsichtbar auf Weiß im Dark-Mode). */ .plan-svg .door-leaf { - stroke: #2b3039; + stroke: #1a1a1a; fill: none; } .plan-svg .door-swing { - stroke: #6b7280; + stroke: #1a1a1a; fill: none; } /* Anschlag-/Rahmenstriche der Tür (nur im Detailgrad „fein"). */ .plan-svg .door-frame { - stroke: #2b3039; + stroke: #1a1a1a; fill: none; } /* Glaslinien des Fensters (dünn, gedämpft — die Verglasung im Grundriss). */ .plan-svg .window-glass { - stroke: #4a86c7; + stroke: #1a1a1a; fill: none; }