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

109 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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) |