[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:
@@ -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) | | |
|
||||
@@ -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) |
|
||||
@@ -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).
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user