[CHANGE] Omniflo-Weichen: je Winkel ein Dialog (OMNI_W90/OMNI_W45/OMNI_WP/OMNI_WK statt 12 Einzelbefehlen), Doppel/Dreiwege ueber neue Radiobuttons unter Richtung, nicht belegte Richtungen ausgegraut, OMNI_EDIT kann Einzel/Doppel/Dreiwege wechseln

This commit is contained in:
Simon Hensch committed 2026-11-06 13:42:46 +01:00
1 parent 04f5035386
commit f044148121
8 files changed
+494 -612

No files matched your search

+89 -133
View File
@@ -552,14 +552,58 @@
;; ============================================================
;; --- Standard-Weichentypen eines Winkel-Dialogs ---
;; Einzel-, Doppel- und Dreiwegeweiche eines Winkels stehen in EINEM Dialog,
;; unterschieden ueber die Radiogruppe "Richtung" (KurvenRichtung 1/2/3/7).
;; Delta-/Stern-/Weichenbatterie bleiben eigene Dialoge - Deltaweichen tragen
;; ebenfalls KurvenRichtung 3/7 und duerfen darum nicht in diese Liste.
(setq *omni-weichen-std-typen* '("Einzelweiche" "Doppelweiche" "Dreiwegeweiche"))
;; --- KurvenRichtung -> Radiobutton der Richtungsgruppe ---
;; Katalog: 1 = links, 2 = rechts, 3 = Doppel, 7 = Dreiwege.
(setq *omni-weichen-richtungen*
'(("1" . "ri_links") ("2" . "ri_rechts") ("3" . "ri_doppel") ("7" . "ri_dreiwege")))
;; kr = KurvenRichtung als String; Rueckgabe Tile-Key oder nil (unbekannt)
(defun omni:weichen-richtung-key (kr)
(cdr (assoc kr *omni-weichen-richtungen*))
)
;; --- Basisliste eines Weichen-Dialogs (reiner Kern) ---
;; lst = Weichenkatalog
;; winkel = KurvenWinkel oder nil (alle Winkel)
;; weichentyp = WeichenTyp-String, Liste von WeichenTypen oder nil (alle)
;; breite = Breite oder nil (z.B. Delta 1400/700 vs. 1600/800)
(defun omni:weichen-basis-liste (lst winkel weichentyp breite / typen)
(if winkel (setq lst (omni:filter lst "KurvenWinkel" winkel)))
(if weichentyp
(progn
(setq typen (if (listp weichentyp) weichentyp (list weichentyp)))
(setq lst (vl-remove-if-not
'(lambda (e) (member (cdr (assoc "WeichenTyp" e)) typen))
lst))
)
)
(if breite
(setq lst (vl-remove-if-not
'(lambda (e) (= (cdr (assoc "Breite" e)) breite))
lst))
)
lst
)
;; --- Aktuelle Filterwerte aus Radio-Buttons lesen ---
(defun omni:weichen-get-filter ( / sch ri)
(defun omni:weichen-get-filter ( / sch ri paar)
(setq sch "alle")
(if (= (get_tile "sch_m") "1") (setq sch "M"))
(if (= (get_tile "sch_p") "1") (setq sch "P"))
(setq ri "alle")
(if (= (get_tile "ri_links") "1") (setq ri "1"))
(if (= (get_tile "ri_rechts") "1") (setq ri "2"))
(foreach paar *omni-weichen-richtungen*
(if (= (get_tile (cdr paar)) "1") (setq ri (car paar)))
)
(list sch ri)
)
@@ -567,7 +611,7 @@
;; --- Gefilterte Weichen-Liste aufbauen ---
;; basis-liste = alle Weichen fuer den gewaehlten Winkel/Typ
;; sch-filter = "M", "P" oder "alle"
;; ri-filter = "1", "2" oder "alle"
;; ri-filter = KurvenRichtung "1", "2", "3", "7" oder "alle"
(defun omni:weichen-filter-liste (basis-liste sch-filter ri-filter / eintrag sch kr ergebnis)
(setq ergebnis nil)
(foreach eintrag basis-liste
@@ -653,13 +697,15 @@
;; --- Weichen-Auswahl-Dialog oeffnen ---
;; winkel = KurvenWinkel (90, 45, 0, 22.5)
;; weichentyp = "Einzelweiche", "Doppelweiche", "Dreiwegeweiche" oder nil fuer alle
;; weichentyp = WeichenTyp-String, Liste von WeichenTypen (z.B.
;; *omni-weichen-std-typen*) oder nil fuer alle
;; init-hoehe / init-drehung = Vorbelegung (optional, fuer Edit-Modus)
;; Rueckgabe: (eintrag hoehe drehung) oder nil bei Abbruch
;; Vorwahl: *omni-dlg-vorwahl* (von OMNI_EDIT gesetzt) wird vorgewaehlt, die
;; Filter Schaltung/Richtung stehen dann auf dessen Werten.
;; Richtungs-Buttons ohne passenden Katalogeintrag werden ausgegraut.
(defun omni:weichen-dialog (winkel weichentyp init-hoehe init-drehung breite / dcl-pfad dat basis-liste
ergebnis dlg-hoehe sch kr)
ergebnis dlg-hoehe sch kr key paar vorhanden)
(if (null *OMNI-WEICHEN*) (omni:load-data))
;; Defaults
@@ -667,27 +713,8 @@
;; dem Einfuegen interaktiv abgefragt (omni:insert-dxf mit drehung=nil).
(if (null init-hoehe) (setq init-hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000")))
;; Weichen nach Winkel filtern (nil = alle Winkel)
(if winkel
(setq basis-liste (omni:filter *OMNI-WEICHEN* "KurvenWinkel" winkel))
(setq basis-liste *OMNI-WEICHEN*)
)
;; Optional nach WeichenTyp filtern
(if weichentyp
(setq basis-liste
(vl-remove-if-not
'(lambda (e) (= (cdr (assoc "WeichenTyp" e)) weichentyp))
basis-liste))
)
;; Optional nach Breite filtern (z.B. Weichenkombinationen Delta 1400/700 vs. 1600/800)
(if breite
(setq basis-liste
(vl-remove-if-not
'(lambda (e) (= (cdr (assoc "Breite" e)) breite))
basis-liste))
)
;; Weichen nach Winkel, WeichenTyp(en) und Breite eingrenzen
(setq basis-liste (omni:weichen-basis-liste *OMNI-WEICHEN* winkel weichentyp breite))
(if (null basis-liste)
(progn
@@ -698,7 +725,11 @@
((= (type winkel) 'INT) (strcat (itoa winkel) (ssg-text "omni-grad")))
(T (strcat (rtos winkel 2 1) (ssg-text "omni-grad")))
)
(if weichentyp (strcat " / " weichentyp) "")
(cond
((null weichentyp) "")
((listp weichentyp) (strcat " / " (ssg-join weichentyp ", ")))
(T (strcat " / " weichentyp))
)
)
))
nil
@@ -714,6 +745,16 @@
(if (not (new_dialog "omniflo_weichen" dat))
(progn (alert (ssg-text "omni-weiche-dialog-ladefehler")) nil)
(progn
;; Richtungen ohne Katalogeintrag ausgrauen (z.B. Weichenbatterie:
;; kein Doppel/Dreiwege, Stern: kein Links/Rechts); "Alle" bleibt.
(setq vorhanden
(mapcar '(lambda (e) (omni:sivasid-to-str (cdr (assoc "KurvenRichtung" e))))
basis-liste))
(foreach paar *omni-weichen-richtungen*
(if (not (member (car paar) vorhanden))
(mode_tile (cdr paar) 1))
)
;; Beim Edit (OMNI_EDIT, *omni-dlg-vorwahl*) die Filter auf Schaltung/
;; Richtung des Bauteils stellen; ohne Vorwahl bleibt "Alle".
(setq *omni-dlg-weiche-akt* *omni-dlg-vorwahl*)
@@ -723,8 +764,8 @@
(setq kr (omni:sivasid-to-str (cdr (assoc "KurvenRichtung" *omni-dlg-vorwahl*))))
(cond ((= sch "M") (set_tile "sch_m" "1"))
((= sch "P") (set_tile "sch_p" "1")))
(cond ((= kr "1") (set_tile "ri_links" "1"))
((= kr "2") (set_tile "ri_rechts" "1")))
(if (setq key (omni:weichen-richtung-key kr))
(set_tile key "1"))
)
)
@@ -743,8 +784,8 @@
(action_tile "sch_m" "(omni:weichen-dlg-refresh)")
(action_tile "sch_p" "(omni:weichen-dlg-refresh)")
(action_tile "ri_alle" "(omni:weichen-dlg-refresh)")
(action_tile "ri_links" "(omni:weichen-dlg-refresh)")
(action_tile "ri_rechts" "(omni:weichen-dlg-refresh)")
(foreach paar *omni-weichen-richtungen*
(action_tile (cdr paar) "(omni:weichen-dlg-refresh)"))
;; OK/Abbrechen
(action_tile "accept"
@@ -962,9 +1003,11 @@
;; OMNIFLO WEICHEN-BEFEHLE
;; ============================================================
;; --- Omniflo / Weiche 90 Grad ---
(defun c:OMNI_W90_Einfach ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 90 "Einzelweiche" nil nil nil))
;; Je Winkel EIN Dialog mit Einzel-, Doppel- und Dreiwegeweichen; der Typ wird
;; ueber die Radiogruppe "Richtung" gewaehlt (Links/Rechts/Doppel/Dreiwege).
;; Ersetzt die frueheren OMNI_W<winkel>_Einfach/_Doppel/_Dreiwege.
(defun omni:weichen-befehl (winkel / dlg-result)
(setq dlg-result (omni:weichen-dialog winkel *omni-weichen-std-typen* nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
@@ -972,107 +1015,17 @@
(princ)
)
(defun c:OMNI_W90_Doppel ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 90 "Doppelweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
;; --- Omniflo / Weichen 90 Grad ---
(defun c:OMNI_W90 () (omni:weichen-befehl 90))
(defun c:OMNI_W90_Dreiwege ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 90 "Dreiwegeweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
;; --- Omniflo / Weichen 45 Grad ---
(defun c:OMNI_W45 () (omni:weichen-befehl 45))
;; --- Omniflo / Weiche 45 Grad ---
(defun c:OMNI_W45_Einfach ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 45 "Einzelweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
;; --- Omniflo / Weichen Parallel (KurvenWinkel 0) ---
(defun c:OMNI_WP () (omni:weichen-befehl 0))
(defun c:OMNI_W45_Doppel ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 45 "Doppelweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
(defun c:OMNI_W45_Dreiwege ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 45 "Dreiwegeweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
;; --- Omniflo / Weichen Parallel ---
(defun c:OMNI_WP_Einfach ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 0 "Einzelweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
(defun c:OMNI_WP_Doppel ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 0 "Doppelweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
(defun c:OMNI_WP_Dreiwege ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 0 "Dreiwegeweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
;; --- Omniflo / Weichenkoerper ---
(defun c:OMNI_WK_Einfach ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 22.5 "Einzelweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
(defun c:OMNI_WK_Doppel ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 22.5 "Doppelweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
(defun c:OMNI_WK_Dreiwege ( / dlg-result)
(setq dlg-result (omni:weichen-dialog 22.5 "Dreiwegeweiche" nil nil nil))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ (ssg-text "omni-abbruch-weiche"))
)
(princ)
)
;; --- Omniflo / Weichenkoerper (KurvenWinkel 22.5) ---
(defun c:OMNI_WK () (omni:weichen-befehl 22.5))
;; --- Omniflo / Weichenkombinationen ---
(defun c:OMNI_WKomb_Delta_1400 ( / dlg-result)
@@ -1228,6 +1181,9 @@
(T
(setq winkel (cdr (assoc "KurvenWinkel" eintrag)))
(setq weichentyp (cdr (assoc "WeichenTyp" eintrag)))
;; Einzel/Doppel/Dreiwege teilen sich einen Dialog - Wechsel ueber "Richtung"
(if (member weichentyp *omni-weichen-std-typen*)
(setq weichentyp *omni-weichen-std-typen*))
(setq dlg-result (omni:weichen-dialog winkel weichentyp hoehe drehung nil))
)
)