Mess-Werkzeug: Polygonzug mit Fläche + Live-Werte im Objekt-Info-Panel

Das Mess-Werkzeug wird von der reinen Strecke zum Polygonzug:
- Jeder Klick setzt einen weiteren Stützpunkt; angezeigt werden letztes
  Segment (Länge · Winkel), aufsummierte Pfadlänge und — ab 3 Ecken —
  die umschlossene Fläche (Gauss).
- Die Messwerte erscheinen dauerhaft im Objekt-Info-Panel (neuer
  Abschnitt „Messung"), nicht nur flüchtig am Cursor-HUD. Kanal:
  ToolDraft.measure → PanelHost.measurement → ObjectInfoPanel.
- Rechtsklick/Enter beendet den aktuellen Pfad und armiert sofort einen
  neuen (mehrere Messungen nacheinander); Rechtsklick auf leerem Pfad
  bzw. Esc beendet das Werkzeug.

+4 Tests (Segment/Winkel, Summe/Fläche, Ketten-Verhalten). tsc sauber.
This commit is contained in:
2026-07-09 01:13:15 +02:00
parent 3d741868c3
commit 6b9c243431
9 changed files with 239 additions and 29 deletions
+23
View File
@@ -119,6 +119,27 @@ export type DraftShape =
| { kind: "line"; a: Vec2; b: Vec2 }
| { kind: "poly"; pts: Vec2[]; closed?: boolean };
/**
* Live-Messwerte eines laufenden Mess-Vorgangs (Werkzeug „Messen"). Wird über
* den {@link ToolDraft} bis ins Objekt-Info-Panel durchgereicht, damit der
* Messwert nicht nur am Cursor (HUD), sondern dauerhaft ablesbar ist.
*/
export interface MeasurementReadout {
/** Länge des letzten Segments (Meter). */
segment: number;
/** Aufsummierte Länge des ganzen Mess-Pfades (Meter). */
total: number;
/**
* Umschlossene Fläche des Pfades (m²), sobald ≥ 3 Punkte den Polygonzug
* schliessen; sonst null (reine Streckenmessung).
*/
area: number | null;
/** Richtung des letzten Segments (Grad, 0…360, 0 = +X). */
angle: number;
/** Anzahl bereits gesetzter Stützpunkte. */
points: number;
}
/** Darstellbare Vorschau (Rubber-Band). */
export interface ToolDraft {
/** Vorschau-Formen (gestrichelt/halbtransparent gezeichnet). */
@@ -129,6 +150,8 @@ export interface ToolDraft {
snap?: SnapResult | null;
/** Optionaler Maß-/Winkel-Text am Cursor (z. B. „3.20 m · 90°"). */
hud?: { at: Vec2; text: string };
/** Live-Messwerte (nur beim Mess-Werkzeug gesetzt) fürs Objekt-Info-Panel. */
measure?: MeasurementReadout;
}
/** Was ein Werkzeug-Schritt nach außen meldet. */