From b6e902a809143fb90a31f4cdac766ea46a34cf84 Mon Sep 17 00:00:00 2001 From: Karim Date: Fri, 3 Jul 2026 18:54:39 +0200 Subject: [PATCH] Stempeltext: Zeilenabstand skalenfest statt fix 1:100 (Audit-Fund #3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit planToRenderScene(plan, paperScaleN=100) leitet den Zeilenabstand mehrzeiliger Stempeltexte jetzt aus dem tatsächlichen Massstab-Nenner ab (mmToM = paperScaleN /1000) statt aus der bisher fest verdrahteten 1:100-Konstante. Deckt sich mit dem nRef der SVG-Text-Formel in PlanView. Viewport/WASM-Aufrufer behalten den Default 100 (deren Referenzmassstab). Der PDF-Export reicht den echten Massstab im Folgeschritt durch. --- src/plan/toRenderScene.ts | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/plan/toRenderScene.ts b/src/plan/toRenderScene.ts index 75141a8..e51a624 100644 --- a/src/plan/toRenderScene.ts +++ b/src/plan/toRenderScene.ts @@ -155,14 +155,15 @@ function strokeColorFor(cls: string | undefined, color: string | undefined): RRg /** 1 Punkt (pt) in Papier-Millimetern. */ const PT_TO_MM = 25.4 / 72; /** - * Referenzmaßstab des Display-Modus (1:100) — identisch zu PlanView (`nRef`): - * dort belegt 1 pt Schrift (1/72)·0.0254·100 Modell-Meter. Der native Renderer - * rechnet mit `paper_scale_n = 100`, damit ist `sizeMm = pt · PT_TO_MM` exakt - * die Browser-Darstellung. + * Default-Referenzmaßstab (1:100) für Aufrufer ohne Massstabskontext (WASM- + * Viewport, `nativeSync.ts`) — identisch zu PlanView (`nRef`) im Display- + * Modus: dort belegt 1 pt Schrift (1/72)·0.0254·100 Modell-Meter. Der native + * Renderer rechnet im Anzeigemodus mit `paper_scale_n = 100`, damit ist + * `sizeMm = pt · PT_TO_MM` exakt die Browser-Darstellung. Für Aufrufer MIT + * Massstabskontext (z. B. PDF-Export) übersteuert `planToRenderScene`s + * `paperScaleN`-Parameter diesen Default — siehe `mmToM` dort. */ -const STAMP_REF_N = 100; -/** Papier-mm → Modell-Meter beim Referenzmaßstab. */ -const MM_TO_M = STAMP_REF_N / 1000; +const STAMP_DEFAULT_N = 100; /** Wenige benannte Farben, die in Klassen/Defaults vorkommen können. */ const NAMED: Record = { @@ -299,8 +300,15 @@ function stitchRuns(runs: RPoint[][]): { pts: RPoint[]; closed: boolean }[] { * Wandelt einen Plan in eine native render2d-Szene um. Zusammenhängende Umriss- * und Zeichnungskanten werden zu OFFENEN Polylinien verkettet (gehrte Ecken); * nur genuin einzelne Segmente (Türblätter, Referenzlinien) bleiben `lines`. + * + * `paperScaleN` ist der Massstab-Nenner N (1:N), mit dem die vertikale + * Zeilenposition mehrzeiliger Stempel-Texte in Modell-Meter umgerechnet wird + * (Papier-mm sind massstabsunabhängig, ihre Weltgrösse aber nicht — analog zu + * PlanViews `nRef`, s. `PlanView.tsx` case "text"). Default 100 für Aufrufer + * ohne Massstabskontext (WASM-Viewport, `nativeSync.ts`). */ -export function planToRenderScene(plan: Plan): RScene { +export function planToRenderScene(plan: Plan, paperScaleN: number = STAMP_DEFAULT_N): RScene { + const mmToM = paperScaleN / 1000; // Papier-mm → Modell-Meter beim gewählten Massstab. const fills: RFill[] = []; const outlines: ROutline[] = []; const polylines: RPolyline[] = []; @@ -478,7 +486,7 @@ export function planToRenderScene(plan: Plan): RScene { flat.push({ content: line, sizeMm: baseMm * 0.8, color: defCol, align: "center" }); } if (flat.length > 0) { - const baseH = baseMm * MM_TO_M; // Basisgröße in Modell-Metern + const baseH = baseMm * mmToM; // Basisgröße in Modell-Metern, beim gewählten Massstab const lineGap = baseH * 1.3; const totalH = baseH + (flat.length - 1) * lineGap; flat.forEach((line, k) => {