Files
dxfmakros/doc/plan/KS-Frame-Architektur.md
T
m.stangl 5aed90dd56 [CHANGE] doc/plan und doc/todo angelegt, interne Analyse-/TODO-Dokumente dorthin verschoben
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>
2026-10-09 10:56:54 +02:00

3.5 KiB
Raw Blame History

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:

  1. Block bei (0 0 0) einfuegen (Rohzustand)
  2. KS_EIN und KS_AUS aus Block extrahieren
  3. Rotationsmatrix berechnen: R = mat3-from-frames(xt yt zt, xe ye ze)
  4. Translation: t = P_target − R × P_EIN
  5. 4×4-Transformationsmatrix T4 aufbauen und auf Block anwenden via vla-TransformBy
  6. 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-ks und insert-rotated-block-with-ks → ersetzt durch insert-block-ks-to-ks
  • variofoerderer-einfuegen und vf-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)