Stempeltext: Zeilenabstand skalenfest statt fix 1:100 (Audit-Fund #3)
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.
This commit is contained in:
@@ -155,14 +155,15 @@ function strokeColorFor(cls: string | undefined, color: string | undefined): RRg
|
|||||||
/** 1 Punkt (pt) in Papier-Millimetern. */
|
/** 1 Punkt (pt) in Papier-Millimetern. */
|
||||||
const PT_TO_MM = 25.4 / 72;
|
const PT_TO_MM = 25.4 / 72;
|
||||||
/**
|
/**
|
||||||
* Referenzmaßstab des Display-Modus (1:100) — identisch zu PlanView (`nRef`):
|
* Default-Referenzmaßstab (1:100) für Aufrufer ohne Massstabskontext (WASM-
|
||||||
* dort belegt 1 pt Schrift (1/72)·0.0254·100 Modell-Meter. Der native Renderer
|
* Viewport, `nativeSync.ts`) — identisch zu PlanView (`nRef`) im Display-
|
||||||
* rechnet mit `paper_scale_n = 100`, damit ist `sizeMm = pt · PT_TO_MM` exakt
|
* Modus: dort belegt 1 pt Schrift (1/72)·0.0254·100 Modell-Meter. Der native
|
||||||
* die Browser-Darstellung.
|
* 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;
|
const STAMP_DEFAULT_N = 100;
|
||||||
/** Papier-mm → Modell-Meter beim Referenzmaßstab. */
|
|
||||||
const MM_TO_M = STAMP_REF_N / 1000;
|
|
||||||
|
|
||||||
/** Wenige benannte Farben, die in Klassen/Defaults vorkommen können. */
|
/** Wenige benannte Farben, die in Klassen/Defaults vorkommen können. */
|
||||||
const NAMED: Record<string, string> = {
|
const NAMED: Record<string, string> = {
|
||||||
@@ -299,8 +300,15 @@ function stitchRuns(runs: RPoint[][]): { pts: RPoint[]; closed: boolean }[] {
|
|||||||
* Wandelt einen Plan in eine native render2d-Szene um. Zusammenhängende Umriss-
|
* Wandelt einen Plan in eine native render2d-Szene um. Zusammenhängende Umriss-
|
||||||
* und Zeichnungskanten werden zu OFFENEN Polylinien verkettet (gehrte Ecken);
|
* und Zeichnungskanten werden zu OFFENEN Polylinien verkettet (gehrte Ecken);
|
||||||
* nur genuin einzelne Segmente (Türblätter, Referenzlinien) bleiben `lines`.
|
* 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 fills: RFill[] = [];
|
||||||
const outlines: ROutline[] = [];
|
const outlines: ROutline[] = [];
|
||||||
const polylines: RPolyline[] = [];
|
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" });
|
flat.push({ content: line, sizeMm: baseMm * 0.8, color: defCol, align: "center" });
|
||||||
}
|
}
|
||||||
if (flat.length > 0) {
|
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 lineGap = baseH * 1.3;
|
||||||
const totalH = baseH + (flat.length - 1) * lineGap;
|
const totalH = baseH + (flat.length - 1) * lineGap;
|
||||||
flat.forEach((line, k) => {
|
flat.forEach((line, k) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user