doc/todo/: TODO-plan-vf-interactive.md -> plan-vf-interactive.md, TODO-modus2-achsenweise-bilanz.md -> modus2-achsenweise-bilanz.md (offene Fahrplaene/TODOs). doc/plan/: KS-Frame-Architektur.md, vf-parameter-struct-analyse.md, translate.md, Entwicklungsplan.md (Architektur-Analysen und Planungsdokumente, kein Anwender-Material). Alle internen Verweise (CLAUDE.md, Lisp/README.md, README.md, doc/variofoerderer.md, Lisp/vf_spec.lsp, lib/dxf_vf_abbild.py, lib/vf_spec_export.py, tests/test_hm_recformat.lsp, tests/test_vf_geometrie.py, tests/test_vf_headless_statisch.py) auf die neuen Pfade angepasst. Reine Pfad-Updates in Kommentaren/Docstrings, keine funktionale Aenderung - Python-Syntax nach dem Umbau geprueft. Anwender-/Entwickler-Referenzdoku (faq.md, kommandos.md, tools.md, dbg2lsp.md, csv-export.md, json-input-lisp.md, lisp_methods.md, LispTests.md, variofoerderer.md, vf_linienzug_modus1_anleitung.md) bleibt direkt in doc/. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.5 KiB
KS-Frame-Architektur — Aufbaulogik
Kernidee
Jeder 3D-Block enthaelt eingebettete KS_EIN- und KS_AUS-Teilbloecke (Koordinatensystem-Marker). Statt Winkel und Position manuell zu berechnen, wird die Kette der Bloecke rein mathematisch verknuepft:
KS_AUS(n) ──► KS_EIN(n+1) ──► Block(n+1) eingefuegt ──► KS_AUS(n+1) ──► ...
Jeder Frame = (P xu yu zu) — Ursprung + 3 normierte Einheitsvektoren
(Fahrtrichtung, links-senkrecht, hoch).
Schritt 1 — Mathematisches Fundament (vf_core.lsp)
Reine Hilfsfunktionen ohne Seiteneffekte:
| Funktion | Eingabe → Ausgabe |
|---|---|
ks-frame-extract |
Rohdaten (origin x-end y-end z-end) → normierter Frame (P xu yu zu) |
vec3-normalize |
Vektor → Einheitsvektor |
vec3-cross |
(a, b) → Kreuzprodukt |
mat3-mul-vec3 |
3×3-Matrix × Vektor |
mat3-from-frames |
(xt yt zt, xe ye ze) → Rotationsmatrix R mit R*xe=xt |
make-frame-from-dir |
Punkt + Richtungsvektor → vollstaendiger Frame (yu=links-horizontal, zu=hoch) |
Schritt 2 — Kernfunktion insert-block-ks-to-ks (vf_core.lsp)
(insert-block-ks-to-ks blockname target-frame) → KS_AUS-frame
Ablauf intern:
- Block bei
(0 0 0)einfuegen (Rohzustand) - KS_EIN und KS_AUS aus Block extrahieren
- Rotationsmatrix berechnen:
R = mat3-from-frames(xt yt zt, xe ye ze) - Translation:
t = P_target − R × P_EIN - 4×4-Transformationsmatrix
T4aufbauen und auf Block anwenden viavla-TransformBy - KS_AUS-Frame mathematisch mitrotieren (kein zweites Extrahieren noetig)
Das ist die einzige Funktion, die alle spaetere Module brauchen.
Schritt 3 — Gefaellestrecke Modus 3 (Gefaellestrecke.lsp)
Ersetzt die alte positions-basierte Einfuegung durch Frame-Kettung:
Vorher: aktuell-pt (nur 2D-Punkt) + manuelle Winkelrechnung
Nachher: aktuell-frame (vollstaendiger 3D-Frame) propagiert durch die
gesamte Streckenkette
- Linie-Segment:
make-frame-from-dir(endpunkt, xu-incl)→ neuer Frame - Bogen-Segment:
insert-block-ks-to-ks(blockname, aktuell-frame)→ gibt direkt den Folge-Frame zurueck
Schritt 4 — VarioFoerderer (vf_standard.lsp / vf_etage.lsp)
Gleiche Umstellung wie Schritt 3, aber fuer gerade Foerderstrecken:
insert-block-by-ksundinsert-rotated-block-with-ks→ ersetzt durchinsert-block-ks-to-ksvariofoerderer-einfuegenundvf-etage-einfuegen:startpunkt→startframe
Warum diese Reihenfolge?
Schritt 1: Fundament legen (keine Abhaengigkeiten)
↓
Schritt 2: Kernfunktion auf Fundament aufsetzen
↓
Schritt 3: Gefaellestrecke zuerst — komplexer (3D-Neigung + Boegen)
↓
Schritt 4: VarioFoerderer — einfacher (nur ebene Kurven)
Zusammenfassung in einem Satz
Die bisherige positionsbasierte Block-Einfuegung (Punkt + Winkel) wurde durch eine vollstaendige 3D-Frame-Kettung ueber KS_EIN/KS_AUS-Koordinatensysteme ersetzt, sodass beliebige raeumliche Orientierungen korrekt durch die gesamte VarioFoerderer- und Gefaellestrecke-Anlage propagiert werden.
Betroffene Dateien
| Datei | Aenderung |
|---|---|
Lisp/vf_core.lsp |
Schritt 1 + 2: neue Hilfsfunktionen und insert-block-ks-to-ks |
Lisp/Gefaellestrecke.lsp |
Schritt 3: Modus-3-Kette auf Frame-Basis umgestellt |
Lisp/vf_standard.lsp |
Schritt 4: VarioFoerderer auf Frame-Basis umgestellt |
Lisp/vf_etage.lsp |
Schritt 4: Etagen-VarioFoerderer auf Frame-Basis umgestellt |
Lisp/KreiselInsert.lsp |
Bugfix: block-pfad-Kontamination behoben (2D/3D-Konflikt) |