Vektor-PDF aus der RenderScene: eine Szene, zwei Targets

exportPdf baut jetzt planToRenderScene(plan) — identischer Aufruf wie der
Engine-Viewport — und serialisiert über den neuen sceneToPrintSvg nach
Papier-mm: z-stabile Reihenfolge wie compile_scene, PEN_STEPS-Quantisierung
wie bisher, widthScreen-Schraffurbreiten via (widthPx/PX_PER_M)*(1000/N)
in mm umgerechnet, Texte neu als echte Vektor-Texte (alter Pfad liess sie
weg). planToPrintSvg bleibt als Referenz, im Kopf als abgeloest markiert.
probe-pdf.mjs: Icon-Button-Selektor nachgezogen, neue Assertions (Schraffur-
Polylinien vorhanden, alle stroke-widths auf PEN_STEPS). Messung: 3666
Vektor-Pfadoperatoren, 7 Text-Operatoren, 0 Rasterbilder; Inhalt per
pdftoppm 53.51x43.69 mm vs. erwartet 53.45x43.45 bei 1:100.
This commit is contained in:
2026-07-03 08:46:35 +02:00
parent e8f5e7272d
commit 9371b65b3b
5 changed files with 427 additions and 21 deletions
+16 -1
View File
@@ -91,6 +91,13 @@ export interface RText {
color: RRgba;
align: RTextAlign;
}
/** Achsenparalleler Rahmen der Plan-Geometrie in Modell-Metern (siehe Plan.bounds). */
export interface RBounds {
minX: number;
minY: number;
maxX: number;
maxY: number;
}
export interface RScene {
fills: RFill[];
outlines: ROutline[];
@@ -98,6 +105,14 @@ export interface RScene {
arcs: RArc[];
lines: RLine[];
texts: RText[];
/**
* Plan-Bounds (Modell-Meter) — additiv aus `Plan.bounds` übernommen, damit
* Verbraucher (z. B. der Vektor-PDF-Serializer `sceneToPrintSvg.ts`) den
* Plan-Inhalt zentrieren können, OHNE zusätzlich den `Plan` selbst zu
* benötigen. Unbekannt für den Rust-Renderer (serde ignoriert überzählige
* Felder ohne `deny_unknown_fields`), also rückwirkungsfrei fürs GPU-Backend.
*/
bounds: RBounds;
}
const DEFAULT_LINE = "#1a1a1a";
@@ -496,5 +511,5 @@ export function planToRenderScene(plan: Plan): RScene {
}
}
return { fills, outlines, polylines, arcs, lines, texts };
return { fills, outlines, polylines, arcs, lines, texts, bounds: { ...plan.bounds } };
}