RadialLayout — Smoke-Test & Abnahme
Was das Feature tut
Bei type:mindmap liefert der Agent künftig nur die Struktur —
Knoten, Kanten und genau einen Knoten mit nodeType=focal als Zentrum.
Koordinaten entfallen. Der Server rechnet über
application/support/diagram/layout/RadialLayout.java:
- Ring-Radius = Tiefe ×
RING_SPACING(200 px) — Zentrum bei r=0. - Startwinkel fix bei -90° (Norden), im Uhrzeigersinn.
- Winkel-Sektor je Ast proportional zur Blattzahl seines Teilbaums; Kinder erben den Elternsektor und teilen ihn weiter.
- Fokus-Optik: der
focal-Knoten bekommt die bestehende Akzent-Behandlung (rgba(236,91,36,0.08)Füllung,#EC5B24Rand) — kein neuer Renderer. - Kanten laufen unverändert durch den orthogonalen
EdgeRouter.
Zusätzlich gehärtet: DiagramService.prepare bricht jetzt bei jeder
ERROR-Notice aus dem Layout ab (vorher nur bei Parser-/Validator-Fehlern).
Testergebnisse (validateDiagram, kein Publish)
| Fall | Eingabe | Erwartet | Ergebnis |
|---|---|---|---|
| Happy path | 1× focal, keine Koordinaten |
Server positioniert alle Knoten radial | ok:true — LAYOUT_APPLIED, 0 gepinnt |
| Kein Zentrum | 0× focal |
harter Fehler, keine Ausgabe | ok:false — MINDMAP_ROOT_REQUIRED (ERROR) |
| Mehrdeutig | 2× focal |
harter Fehler, keine Ausgabe | ok:false — MINDMAP_ROOT_AMBIGUOUS:
„Mindmap hat 2 Knoten mit nodeType=focal — genau einer ist erlaubt.“ |
Diagramm 1 — Happy path (3 Äste, symmetrisch)
Äste A (2 Blätter) / B (1) / C (1). Sektoren: A = 180°, B = 90°, C = 90°. A sitzt bei 0° (Ost), B bei 135° (Südwest), C bei 225° (Nordwest). Enkel bei r ≈ 400.
Diagramm 2 — Sektor proportional zur Ast-Größe
Ast A hat jetzt 3 Blätter, B und C je 1. Blattzahl gesamt = 5 → A bekommt 3/5 · 360° = 216°, B und C je 72°. Man sieht A deutlich breiter aufgefächert als in Diagramm 1.
Koordinaten nachgerechnet
Aus dem gerenderten SVG von Diagramm 1 (Zentrum root bei 540,540):
| Knoten | Zentrum | Δ zu root | Winkel | Radius |
|---|---|---|---|---|
a (Tiefe 1) | 740, 540 | +200, 0 | 0° (Ost) | 200 ✓ |
b (Tiefe 1) | 400, 680 | −140, +140 | 135° | ≈198 ✓ |
c (Tiefe 1) | 400, 400 | −140, −140 | 225° | ≈198 ✓ |
a1 (Tiefe 2) | 824, 256 | +284, −284 | −45° | ≈401 ✓ |
a2 (Tiefe 2) | 824, 824 | +284, +284 | +45° | ≈401 ✓ |
b1 (Tiefe 2) | 256, 824 | −284, +284 | 135° | ≈401 ✓ |
Radius exakt Tiefe × 200, Winkel exakt in der Sektormitte, alle Koordinaten auf 4-px-Raster.
direction: LR bzw. „(LR)“ im Text, obwohl bei einem Radiallayout keine
Laufrichtung existiert. Die LayoutEngine reicht dort die generische
LAYOUT_APPLIED-Meldung durch. Kein Funktionsfehler — nur irreführende Telemetrie.
Abnahme-Checkliste
- Radiales Layout ohne gelieferte Koordinaten (Diagramm 1 + 2)
- Sektorbreite proportional zur Teilbaumgröße (Diagramm 2: A = 216°)
- Ring-Radius = Tiefe × 200 px (Koordinatentabelle)
- Fokus-Knoten visuell akzentuiert
MINDMAP_ROOT_REQUIREDbei 0 ZentrenMINDMAP_ROOT_AMBIGUOUSbei >1 Zentrum- Optional: „LR“-Wortlaut in der Notice für Mindmap unterdrücken