feat: Omniflo-Fahrstrecke (OMNI_FAHRSTRECKE) + Geruest-Dialoge ueberarbeitet

Fahrstrecke:
- Neuer Befehl OMNI_FAHRSTRECKE (+ _BESCHRIFTEN) im Omniflo-Menue,
  Daten aus data/json/omniflo_fahrstrecke.json, Vorlage dcl/fahrstrecke.dcl
- Nutzt die Linien-Logik des Geruest-Traegers (geruest-linien-starten,
  Dialog/Einfuegen/Beschriftung je Baugruppe parametriert)
- Muffen-Dummy wie beim Traeger, farbig nur wo in der JSON gesetzt
- Stueckliste: eigene Klasse "Omniflo Fahrstrecke" (GR_Fahrstrecke_*)

Geruest-Dialoge:
- DCL als statische Vorlagen mit //@NAME@-Platzhaltern
  (ssg-dcl-vorlage-fuellen in ssg_core), dcl/geruest.dcl neu
- Ein Dialog je Bereich (keine Bereichsumschaltung mehr)
- Varianten als Radiobuttons mit Artikelnummern im Label,
  "disabled": true graut Varianten aus
- Eine Befestigungsspalte (Gesamtanzahl) + Zeile "Sonstiges",
  Art.-Nr. unter jedem Anbauteil
- Winkel Platte (0/90): Anbauteile gedreht eingefuegt
- Kennzeichnung geaenderter Konfiguration, Ueberspeichern per Enter
- Traeger: Querstreben nur bei "mit_querstrebe": true

Konfigurationen im alten Format (oben/unten) werden beim Laden
uebernommen. Unit-Tests ergaenzt (599 gruen).
This commit is contained in:
2026-10-13 11:02:23 +02:00
parent 3116e639eb
commit ea0e46a441
25 changed files with 2597 additions and 1469 deletions
+43 -4
View File
@@ -1643,10 +1643,9 @@
;; Schreibt eine Liste von Textzeilen als temporaere DCL-Datei und liefert
;; deren Pfad zurueck (oder nil bei Fehler, z.B. wenn open scheitert). Der
;; Aufrufer ist fuer load_dialog/unload_dialog UND das Loeschen der Datei
;; (vl-file-delete) danach selbst verantwortlich - analog zum bestehenden
;; Muster in GeruestInsert.lsp (geruest-dcl-schreiben), hier nur als
;; generischer Baustein fuer WEITERE Aufrufer (GeruestInsert.lsp selbst
;; bleibt unveraendert, um dessen Code nicht anzufassen).
;; (vl-file-delete) danach selbst verantwortlich. Fuer Dialoge mit fester
;; Grundstruktur und nur einzelnen datenabhaengigen Bloecken siehe
;; ssg-dcl-vorlage-fuellen.
(defun ssg-dcl-temp-schreiben (praefix zeilen / pfad f)
(setq pfad (vl-filename-mktemp praefix nil ".dcl"))
(if (setq f (open pfad "w"))
@@ -1659,6 +1658,46 @@
)
)
;; DCL-Vorlagen mit Platzhaltern: DCL kann Tiles weder zur Laufzeit erzeugen
;; noch ausblenden, und Labels von radio_button/toggle lassen sich per
;; set_tile nicht aendern. Datenabhaengige Teile (z.B. ein Radiobutton je
;; Variante) werden darum in eine statische .dcl-Vorlage eingesetzt: jede
;; Zeile, die getrimmt genau "//@NAME@" lautet, wird durch die Zeilen aus
;; ersetzungen (("NAME" . (zeile ...)) ...) ersetzt. Eine leere Liste
;; entfernt die Markerzeile; ein unbekannter Marker bleibt als DCL-Kommentar
;; stehen (harmlos). Das Layout bleibt so eine normale, lesbare .dcl-Datei.
(defun ssg-dcl-zeilen-ersetzen (zeilen ersetzungen / erg t1 name e)
(setq erg nil)
(foreach z zeilen
(setq t1 (vl-string-trim " \t" z))
(setq name (if (and (> (strlen t1) 4)
(= (substr t1 1 3) "//@")
(= (substr t1 (strlen t1) 1) "@"))
(substr t1 4 (- (strlen t1) 4))))
(if (and name (setq e (assoc name ersetzungen)))
(setq erg (append erg (cdr e)))
(setq erg (append erg (list z)))
)
)
erg
)
;; Vorlage lesen, Platzhalter ersetzen (ssg-dcl-zeilen-ersetzen) und als
;; temporaere DCL-Datei schreiben. Rueckgabe: Pfad oder nil (Vorlage fehlt /
;; nicht lesbar / nicht schreibbar). Laden und Loeschen wie bei
;; ssg-dcl-temp-schreiben durch den Aufrufer.
(defun ssg-dcl-vorlage-fuellen (vorlage-pfad praefix ersetzungen / f z zeilen)
(if (and vorlage-pfad (findfile vorlage-pfad) (setq f (open vorlage-pfad "r")))
(progn
(setq zeilen nil)
(while (setq z (read-line f)) (setq zeilen (cons z zeilen)))
(close f)
(ssg-dcl-temp-schreiben praefix
(ssg-dcl-zeilen-ersetzen (reverse zeilen) ersetzungen))
)
)
)
;; ------------------------------------------------------------
;; REKURSIVER JSON-PARSER