# 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`) ```lisp (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) |