Files
dxfmakros/doc/KS-Frame-Architektur.md
T

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: startpunktstartframe

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)