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
+689 -387
View File
File diff suppressed because it is too large Load Diff
+21
View File
@@ -1479,6 +1479,27 @@
(princ)
)
;; --- Omniflo / Türlösungen Schwenkschienen ---
;; Feste TEF-Bauteile ohne Sivas-Auswahl: Datei liegt direkt unter DXFM_OMNIFLO,
;; wird per omni:insert-dxf am gewaehlten Einfuegepunkt ohne Drehung eingefuegt.
(defun c:OMNI_SCHW_400_R ()
(omni:insert-dxf "824604002" nil nil)
(princ)
)
(defun c:OMNI_SCHW_400_L ()
(omni:insert-dxf "824604001" nil nil)
(princ)
)
(defun c:OMNI_SCHW_400_R_SENSORIK ()
(omni:insert-dxf "824604012" nil nil)
(princ)
)
(defun c:OMNI_SCHW_400_L_SENSORIK ()
(omni:insert-dxf "824604011" nil nil)
(princ)
)
;; --- Omniflo / TEF Elemente ---
+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
+4
View File
@@ -163,6 +163,10 @@
(cons "ils_kreisel" (ssg-text "sl-erk-kreisel")))
((or (wcmatch b "VF_*") (wcmatch b "GF_*"))
(cons "ils_strecke" (ssg-text "sl-erk-strecke")))
;; Fahrstrecke (OMNI_FAHRSTRECKE) entsteht ueber den Geruest-Baukasten und
;; traegt darum ebenfalls das GR_-Praefix - VOR dem allgemeinen GR_-Zweig.
((wcmatch b "GR_FAHRSTRECKE_*")
(cons "fahrstrecke" (ssg-text "sl-erk-fahrstrecke")))
((wcmatch b "GR_*")
(cons "geruest" (ssg-text "sl-erk-geruest")))
((wcmatch b "AP60*")