[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>
This commit is contained in:
2026-10-09 10:56:54 +02:00
parent fe4637d7df
commit 5aed90dd56
16 changed files with 14 additions and 14 deletions
+125
View File
@@ -0,0 +1,125 @@
# Kapitel 1: Meilensteinplanung
## Meilenstein 1: ILS für die Projektierung
- ILS Kreisel DONE
- ILS Eckrad DONE
- ILS Varioförder DONE
- ILS Gefällestrecke
- ILS Weichen
- ILS Horizontalvariobögen (30,60,90 r und l, innen und aussen angetrieben)
- ILS Gefällebögen (30,60,90 r und l)
- BTMT Beladung und Entladung DONE (Einfuegen + Sivas-/CSV-Export)
- CSV Export aller ILS Elemente
## Meilenstein 2: Ersatz von Bihler Gerüst
- Gerüst
+ Abhänger (3 Quetschung, 6 Abhängung oben, 4 Abhängung unten, 4 Befestiung oben, 3 Farben, Variable Länge)
+ T-Abhänger mit Flansch-Rohr (3 Spannpratze, 3 Farben, Variable Länge)
+ Säulen (2 Arten, 3 Farben, 2 Einbauwinkel Platte, 5 Haltearm, 4 Einbauwinkel Arm, 8 Klemmring, Länge Bodensäule)
+ Wandbefestigung (4 Varianten, 3 Befestigungen)
+ Träger (RT/DRT) - (4 Varianten, 3 Farben, Muffe, Längenabzug Anfang/Ende)
- CSV Export aller Gerüst Komponenten
- TOS von Gerüst-Import ins Sivas
## Meilenstein 3: Ersatz von Bihler Omniflo
- Omniflo Bögen (27) DONE
- Omniflo Weichen (80) DONE
- Omniflo Verbinder (18 Varianten)
- Kettenförderer (3 Teile: Ein/Auslauf und Verbindung)
- TEF Geraden aus Omniflo Geraden (Umwandlungsmakro)
- CSV Export aller Omniflo Elemente
## Meilenstein 4: Flex
- Erstellung der .dwg Dateien von Bögen, Geraden, Förderer
- Definition des Produktprogrammes
- CSV Export aller Flex Elemente
- TOS von Flex Elementen
## Meilenstein 5: 3D Modelle einer Anlage (Erzeugung von .dwg Files)
- Omniflo Bogen, Weiche
- Gerüst Modelle Abhänger, Säulen, usw.
## Meilenstein 6: Metafunktionen
- Erzeugung eines Gerüsts über einem Bereich/ einer Strecke
- Erzeugung einer Strecke aus einer Polylinie
- Verbindung zweier Kreisel auf unterschiedlicher Höhe in Kreiselachsenrichtung oder gedreht
- Erzeugung eines Puffers aus einer Flächenangabe/Recheck
- Positionierung von Separatoren und Scannern aus dem Streckenverlauf/Fördereranbindung
- Makro zur Erzeugung eines Arbeitsplatzes (Varioförderer ab, 180 Grad Bogen, Varoförderer auf)
- Varioförder als Etagenförderer (anderer ES und AS Elemente)
---
# Kapitel 2: Aufwandsschätzung und Resourcenplanung
## Resourcen
| Kürzel | Person |
| ------ | ------ |
| YW | Y.Wang |
| SH | S.Hensch |
| MS | M.Stangl |
## Meilenstein 1: ILS für die Projektierung
| Tätigkeit | Aufwand [h] | Person |
|-----------|-------------|--------|
| ILS Kreisel | - | - |
| ILS Eckrad | - | - |
| ILS Varioförder | - | - |
| ILS Gefällestrecke | | |
| ILS Weichen | | |
| ILS Horizontalvariobögen (30,60,90 r und l, innen und aussen angetrieben) | | |
| ILS Gefällebögen (30,60,90 r und l) | | |
| BTMT Beladung und Entladung | | |
| CSV Export aller ILS Elemente | | |
## Meilenstein 2: Ersatz von Bihler Gerüst
| Tätigkeit | Aufwand [h] | Person |
|-----------|-------------|--------|
| Gerüst Abhänger (3 Quetschung, 6 Abhängung oben, 4 Abhängung unten, 4 Befestiung oben, 3 Farben, Variable Länge) | | |
| Gerüst T-Abhänger mit Flansch-Rohr (3 Spannpratze, 3 Farben, Variable Länge) | | |
| Gerüst Säulen (2 Arten, 3 Farben, 2 Einbauwinkel Platte, 5 Haltearm, 4 Einbauwinkel Arm, 8 Klemmring, Länge Bodensäule) | | |
| Gerüst Wandbefestigung (4 Varianten, 3 Befestigungen) | | |
| Gerüst Träger (RT/DRT) - (4 Varianten, 3 Farben, Muffe, Längenabzug Anfang/Ende) | | |
| CSV Export aller Gerüst Komponenten | | |
| TOS von Gerüst-Import ins Sivas | | |
## Meilenstein 3: Ersatz von Bihler Omniflo
| Tätigkeit | Aufwand [h] | Person |
|-----------|-------------|--------|
| Omniflo Bögen (27) | - | - |
| Omniflo Weichen (80) | - | - |
| Omniflo Verbinder (18 Varianten) | | |
| Kettenförderer (3 Teile: Ein/Auslauf und Verbindung) | | |
| TEF Geraden aus Omniflo Geraden (Umwandlungsmakro) | | |
| CSV Export aller Omniflo Elemente | | |
## Meilenstein 4: Flex
| Tätigkeit | Aufwand [h] | Person |
|-----------|-------------|--------|
| Erstellung der .dwg Dateien von Bögen, Geraden, Förderer | | |
| Definition des Produktprogrammes | | |
| CSV Export aller Flex Elemente | | |
| TOS von Flex Elementen | | |
## Meilenstein 5: 3D Modelle einer Anlage (Erzeugung von .dwg Files)
| Tätigkeit | Aufwand [h] | Person |
|-----------|-------------|--------|
| Omniflo Bogen, Weiche | | |
| Gerüst Modelle Abhänger, Säulen, usw. | | |
## Meilenstein 6: Metafunktionen
| Tätigkeit | Aufwand [h] | Person |
|-----------|-------------|--------|
| Erzeugung eines Gerüsts über einem Bereich/einer Strecke | | |
| Erzeugung einer Strecke aus einer Polylinie | | |
| Erzeugung eines Puffers aus einer Flächenangabe/Recheck | | |
| Positionierung von Separatoren und Scannern aus dem Streckenverlauf/Fördereranbindung | | |
| Makro zur Erzeugung eines Arbeitsplatzes (Varioförderer ab, 180 Grad Bogen, Varoförderer auf) | | |
| Varioförder als Etagenförderer (anderer ES und AS Elemente) | | |
+108
View File
@@ -0,0 +1,108 @@
# 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) |
+111
View File
@@ -0,0 +1,111 @@
# Internationalisierung (i18n) SSG_LIB — Analyse & Zielkonzept
> Status: **Analyse/Vorbereitung**. Diese Datei fasst zusammen, wo eine Sprachumschaltung
> (Deutsch/Englisch) nötig ist und wie sie umgesetzt werden soll. Es wurde **noch kein Code
> geändert**.
## Kontext / Ziel
- Alle interaktiven Meldungen, Abfragen und Anzeigen sollen zusätzlich auf Englisch
ausgegeben werden können.
- Umschaltung zur Laufzeit über eine globale Sprachvariable `*ssg-lang*`.
- Konfig-Menü `SSG_LIB → Konfiguration → Sprache`: Combobox mit "Deutsch"/"Englisch",
intern die Werte `de_DE` / `en_GB`.
- Ist-Stand: **Keine** Sprach-Infrastruktur vorhanden (bestätigt: alle `lang`-Treffer im
Code sind false positives wie "Laenge"/"entlang").
## Wo es nötig ist — Inventar (~828 benutzersichtbare Fundstellen in `Lisp/`)
| Datei | Benutzertexte | Schwerpunkt |
|---|---:|---|
| Gefaellestrecke.lsp | ~156 | Modus-Menues, Ergebnistabellen, Fehler, Prompts |
| vf_linienzug.lsp | ~120 | "Ihre Wahl (1/2)"-Menues, Diagnose |
| vf_core.lsp | ~108 | Generator-Menues, Winkel/Seite-Abfragen |
| OmniModulInsert.lsp | ~106 | Abbruch-Meldungen, Attribut-Ausgaben, 39x `[DUMMY]` |
| KreiselInsert.lsp | ~80 (+46 Debug) | Parameter-Abfragen, Ausgaben; einzige Datei mit `dbg*` |
| vf_etage.lsp | ~72 | Ergebnistabellen, Einfuege-Schritte |
| vf_standard.lsp | ~61 | Berechnungstabellen, Einfuege-Schritte |
| SSG_LIB_Commands.lsp | ~33 | v.a. `[DUMMY]`-Platzhalter, DIM-Switch-Meldungen |
| menu-inventory.lsp | ~27 | Diagnose-Tool |
| ssg_layer.lsp | ~19 | `ssg-emsg`/`ssg-ques`-Aufrufe |
| export.lsp / ssg_core.lsp / ssg_id.lsp | ~37 | Prozess-Status, `[CFG]`-Warnungen |
| ssg_dialog, external_call, ssg_load, VarioFoerderer, EtageVarioFoerderer | ~9 | Warnungen, Ladebestaetigungen |
**Nach Kategorie:** ~408 `princ "Literal"`, ~288 `princ (strcat …)` (dynamisch), ~80 Abfragen
(`getstring/getpoint/getreal/getint/getkword/getdist`), 19 `alert`, 23 `ssg-emsg`/`ssg-ques`,
3 DCL-Dialoge (`kreisel_edit.dcl`, `omniflo_boegen.dcl`, `omniflo_weichen.dcl`).
**Zentrale Angelpunkte:**
- `ssg-emsg` (`Lisp/ssg_core.lsp:99-104`) und `ssg-ques` (`Lisp/ssg_core.lsp:84-95`) — hier
laufen fast alle Fehler und Ja/Nein-Abfragen zusammen; die Keywords `"Yes No"` (Z.87/91)
sind sprachrelevant.
- Sehr häufig wiederholte, identische Prompts ("\nIhre Wahl (1/2) [1]: ") — ideale
Kandidaten für zentrale Konstanten.
- Große geschlossene Textblöcke: Ergebnistabellen/Header (`vf_standard.lsp:292-389`,
`vf_etage.lsp:454-575`, `Gefaellestrecke.lsp:1639-1642`) und Einfüge-Schritt-Ausgaben
("1/11 … 11/11").
**Empfohlener Umfang (offene Entscheidung):** "Interaktion + Meldungen" — alle Prompts,
Menüauswahlen, Dialoge, Fehler, alerts UND Status-/Ergebnisausgaben; **ausgeschlossen**:
Debug (`dbg*`), Ladebestätigungen ("… geladen."), `[DUMMY]`-Platzhalter, Diagnosemarker
`[CFG]`/`[OMNI]`, sowie das Diagnose-Tool `menu-inventory.lsp` (~700 statt ~900 Strings).
## Vorhandene Infrastruktur (Anknüpfungspunkte)
- **Config-System** (`Lisp/ssg_core.lsp:565-810`): `*ssg-config*`, `ssg-cfg`, `ssg-cfg-or`;
der flache 1-Ebenen-JSON-Parser (`ssg-cfg-parse-nested`) kann nur `section→key→skalar`,
ist daher für verschachtelte Sprachtexte ungeeignet → **LISP-Tabelle bevorzugt**.
- **Umschaltmuster** `c:SSG_DIM_SWITCH` (`Lisp/SSG_LIB_Commands.lsp:129-139`): Zustand via
`setenv`/`getenv` (`DXFM_DIM`). Als Persistenz-Vorbild geeignet; Nachteil: DIM wird nur
beim Modulladen gelesen → für Sprache zusätzlich eine Live-Global nötig.
- **Ladereihenfolge**: `ssg_core` zuerst, danach `ssg-load-config` — in der MNL
(`menu/SSG_LIB.mnl:66-72,131-155`) und Standalone (`Lisp/ssg_load.lsp:14-41`). Bester
Init-Ort für die Sprachtabelle: direkt nach `ssg_core`.
- **DCL-Muster**: `popup_list` (Combobox) existiert mehrfach, z.B.
`dcl/kreisel_edit.dcl:31-35`; Laufzeit-Befüllung via `start_list`/`add_list`/`end_list`,
Auslesen via `get_tile` (Index-String). Wrapper `ssg-dialog-run`
(`Lisp/ssg_core.lsp:534-544`). DCL-Pfad via `(getenv "DXFM_DCL")` (gesetzt in
`bin/setenv.bat:25`).
- **Menü** (`menu/SSG_LIB.mnu:119-121`): Konfig-Untermenü; neuer Eintrag
`[Sprache]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHE` zwischen Z.120/121.
## Zielarchitektur (LISP-Tabelle)
Neue Datei `Lisp/ssg_lang.lsp`:
- Global `*ssg-lang*` (Default `"de_DE"`, initial aus `(getenv "DXFM_LANG")`).
- Globales Feld `*ssg-texts*` = Assoc-Liste `(key ("de_DE" . "…") ("en_GB" . "…"))`.
- `ssg-text` (key): liefert Text in `*ssg-lang*`, Fallback `de_DE`, dann Key-Name.
- `ssg-textf` (key arg1 …): Template mit Platzhaltern für die ~288 dynamischen
`strcat`-Fälle.
- Flag `*ssg-lang-loaded*`; Registrierung in `ssg-ensure` + Laden direkt nach `ssg_core`
in MNL und `ssg_load.lsp`.
Umschaltung:
- `dcl/sprache.dcl`: Dialog-ID `sprache`, `popup_list` key `"sprache"`, `ok_cancel;`.
- `c:SSG_SPRACHE` in `Lisp/SSG_LIB_Commands.lsp` (neben `SSG_DIM_SWITCH`): Combobox mit
"Deutsch"/"Englisch" füllen, Vorauswahl aus `*ssg-lang*`, bei OK `*ssg-lang*` setzen +
`(setenv "DXFM_LANG" …)` persistieren.
- Menüeintrag "Sprache" unter Konfiguration.
## Bekannte Schwierigkeiten
1. **Dynamische Strings** (`princ (strcat …)`, ~288): brauchen parametrisierte Templates
(`ssg-textf`), keine 1:1-Ersetzung.
2. **DCL-Label statisch**: Dialog-/Tile-Beschriftungen in `.dcl` sind zur Laufzeit kaum
umschaltbar. Optionen: Beschriftungen wo möglich per `set_tile` aus LISP setzen; sonst
zweisprachige Labels oder getrennte DCL-Dateien. Höchster Aufwand.
3. **`ssg-ques`-Keywords**: `getkword "Yes No"` bleibt technisch (BricsCAD-Keywords), nur
die Prompt-Anzeige wird übersetzt; ggf. deutsche Keywords "Ja Nein" ergänzen.
4. **Encoding**: aktuell Umlaute gemischt mit ae/oe/ue ("Höhe" vs. "Hoehe"). Empfehlung
laut Projektkonvention: durchgängig ASCII (ae/oe/ue).
## Verifikation (für die spätere Umsetzung)
- Standalone via `(load ".../Lisp/ssg_load.lsp")`, dann `*ssg-lang*` toggeln und je einen
Befehl pro Modul (KreiselInsert, FOERDERANLAGE, GEFAELLESTRECKE, OMNI_*) in beiden
Sprachen prüfen.
- Sprache-Dialog testen (Vorauswahl, Persistenz über `DXFM_LANG`).
- Bestehende Python/LISP-Tests bleiben unberührt (betreffen keine UI-Texte).
+119
View File
@@ -0,0 +1,119 @@
# VarioFoerderer-Cluster — Analyse Parameter-Buendelung (Struct-Potential)
Bestandsaufnahme der globalen Variablen und Funktionssignaturen in
`Lisp/vf_core.lsp`, `vf_konstanten.lsp`, `vf_standard.lsp`, `vf_etage.lsp`
und `vf_linienzug.lsp` — als Grundlage fuer die Frage, ob sich haeufig
gemeinsam durchgereichte Parameter zu einem Struct (in AutoLISP: eine
benannte Alist) buendeln lassen, um Funktionssignaturen mit 5+ Parametern
zu verkuerzen. Stand: 2026-09-01, rein analytisch, keine Codeaenderung.
## Ausgangsbefund: globale Variablen
Die globalen Variablen der drei Module sind **kein** Parameter-Problem:
- `vf_konstanten.lsp` enthaelt ausschliesslich feste `*vfk-*`-Konstanten
(Winkel, Laengen, Toleranzen), die einmalig per `ssg-cfg-or`/Guard gesetzt
und direkt gelesen werden, nicht als Parameter durchgereicht.
- `vf_core.lsp`/`vf_standard.lsp`/`vf_etage.lsp` haben Init-Flags/Caches
(`*lib-initialized*`, `*ks-cache*`, `bogen-auf`/`bogen-ab`), die Typ-Registry
`*vf-typ-registry*` und wenige AS/ES-Massen-Offsets (`aus-dx` usw.).
- `vf_linienzug.lsp` haelt zusaetzlich Journal-/Replay-State
(`*vfl-journal*`, `*vfl-replay-queue*`), Wizard-Dialog-State
(`*vflw-pending*`, `*vflw-menu-*`) und neun parallele
`*vfl-acc-*`-Globals als "Ketten-Akkumulator" (siehe Abschnitt 4).
Das eigentliche Problem liegt woanders: dieselben 4-8 thematisch
zusammengehoerigen **Werte werden wortwoertlich durch dutzende
Funktionssignaturen durchgereicht**, weil es dafuer noch keinen
gebuendelten Wert gibt.
## Bereits vorhandene Struct-Vorbilder im Code
Diese Muster existieren schon und sind das natuerliche Vorbild fuer eine
Erweiterung (AutoLISP-Konvention: Alist statt echtem Struct):
- **KS-Frame** `(P xu yu zu)` — Punkt + 3 Achsvektoren als ein Wert
(`vf_core.lsp`, `frame` in `vf_linienzug.lsp`)
- **`prefill`-Alists** (string-keyed, `(cdr (assoc "key" prefill))`) zur
Dialogvorbelegung in `vfs-dialog-eingabe-basis`/`vfs-dialog-winkel-verteilung`
- **`*vf-basis-eingabe-felder*` + `vf-basis-eingabe-entpacken`** — eine
benannte, geordnete Feldliste, generisch per `foreach`/`nth` entpackt
- **`ergebnis-liste`**-Eintraege `(winkel L_GF L_VF gueltig)` aus
`vf-winkel-solve`/`berechne-alle-winkel`
- **`kette-rec`** in `vf_linienzug.lsp` — Positions-Accessor-Funktionen
(`vfl-kette-rec-ename` usw.) ueber eine flache Liste
- **`*vfl-glied-schema*`** — Schema-Tabelle (Label -> Felddefinitionen) als
struct-aehnliche Serialisierung pro Ketten-Glied
## Funktionen mit den meisten Parametern
| Funktion | Datei | Anzahl Parameter |
|---|---|---|
| `vf-block-erstellen` | vf_core.lsp | 18 |
| `vf-make-label` | vf_core.lsp | 13 |
| `vf-dialog-berechnen-einfuegen` | vf_core.lsp | 12 |
| `variofoerderer-einfuegen` | vf_standard.lsp | 10 |
| `etage-foerderanlage-einfuegen` | vf_etage.lsp | 10 |
| `vfs-standard-dialog-berechnen-einfuegen` | vf_standard.lsp | 10 |
| `vfe-etage-dialog-berechnen-einfuegen` | vf_etage.lsp | 10 |
| `vfl-block-erstellen` | vf_linienzug.lsp | 10 |
| `vfl-modus-abbruch-sichern` | vf_linienzug.lsp | 9 |
| `vf-winkel-solve` | vf_core.lsp | 8 |
| `vfs-mitte-teil`, `vfl-vf-einheit`, `vfl-vf-einheit-abschluss` | standard/linienzug | je 7 |
| `vfs-vf-koerper`, `vfl-insert-es-element`, `vfl3-es-fueller` | standard/linienzug | je 5-6 |
| die vier `insert-hz-*`-Funktionen | vf_etage.lsp | je 4-6 |
## Struct-Kandidaten
1. **`geometrie-basis`** `(deltaL deltaH richtung startpunkt hz seite
[dim geruest-einzelmodul geruest-typ motorseite])` — identisch in
vf_core, vf_standard, vf_etage UND vf_linienzug. Erweitert direkt das
bestehende `*vf-basis-eingabe-felder*`-Muster. Groesster Hebel, da er in
fast jeder Top-Funktion mit vorkommt.
2. **`ergebnis-geometrie`** `(best-winkel L_GF1 L_GF2 L_VF richtung)` —
entspricht der Form der `ergebnis-liste`-Eintraege aus `vf-winkel-solve`;
steckt in `vf-make-label`, `vf-block-erstellen`, `vfs-mitte-teil`,
`vfs-vf-koerper`, `variofoerderer-einfuegen`, `etage-foerderanlage-einfuegen`.
3. **`hoehen`** `(hoehe-von hoehe-bis deltaH)` — klein, wiederholt sich in
`vf-make-label`/`vf-block-erstellen`; evtl. eher in Kandidat 2
integrieren als eigenstaendig fuehren.
4. **`geruest-optionen`** `(geruest-einzelmodul geruest-typ motorseite)` —
reist durch Dialog-/Edit-/Erstellen-Funktionen; Alternative: direkt in
`geometrie-basis` aufnehmen statt separat zu fuehren.
5. **`ketten-meta`** `(vfl-nummer anzahl-gf anzahl-vf hoehe-von hoehe-bis
delta-l-total as-seite es-seite)` — nur vf_linienzug, betrifft
`vfl-block-erstellen` (10) und `vfl-modus-abbruch-sichern` (9).
6. **Rotation-Paar** `(hz-winkel vert-winkel)` (optional mit vorgerechneten
sin/cos) — die vier `insert-hz-*`-Funktionen in vf_etage.lsp teilen
dieses Paar plus dupliziertes Grad->Bogenmass/sin/cos; ein
gemeinsamer Wert wuerde auch die Code-Duplikation beseitigen, nicht nur
die Parameterzahl.
7. **`*vfl-acc-*`-Akkumulator** — kein Parameter-, sondern ein
State-Problem: neun parallele globale Listen
(`*vfl-acc-lvf*`, `*vfl-acc-lgf*`, `*vfl-acc-gfwinkel*`,
`*vfl-acc-richtung*`, `*vfl-acc-winkel*`, `*vfl-acc-motorseite*`,
`*vfl-acc-gfbogen*`, `*vfl-acc-variokurve*`, `*vfl-acc-separator*`), die
konsequent zusammen gesetzt/gelesen werden. Ein Record statt neun losen
Globals waere robuster gegen Vertipper/vergessenes Zuruecksetzen.
Mit Kandidat 1+2 allein liesse sich `vf-block-erstellen` von 18 auf
~6-7 Parameter bringen, `vf-make-label` von 13 auf ~5-6, und die gesamte
10-Parameter-Familie auf ~4-5.
## Einschaetzung
Es besteht spuerbares Potential, aber mit Vorsicht: `vf-dialog-berechnen-einfuegen`
haengt an der Typ-Registry (`*vf-typ-registry*`, `berechne-fn`/`einfuege-fn`)
und wird von Standard-, Etage- und indirekt Linienzug-Pfaden aufgerufen. Eine
Signaturaenderung dort zieht Aenderungen an allen drei registrierten
Funktionen sowie den Edit-/Rebuild-Pfaden (`vfe-edit-ent`, `vfl-edit-ent`,
Journal-Replay) nach sich. Empfohlene Reihenfolge bei einer Umsetzung:
1. Risikoarme Blattfunktionen zuerst (Rotation-Paar in vf_etage,
`vf-make-label`).
2. `geometrie-basis`/`ergebnis-geometrie` als groessere, aber isolierbare
Cluster.
3. Die Registry-Signatur (`vf-dialog-berechnen-einfuegen`) und die
Edit-/Replay-Pfade erst zuletzt anfassen.
Stand jetzt: reine Analyse, keine Umsetzung angestossen.