From f0441481218bc1d40b62843bc754bcb8a8df4bfa Mon Sep 17 00:00:00 2001 From: Simon Hensch Date: Fri, 6 Nov 2026 13:42:46 +0100 Subject: [PATCH] [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 --- CLAUDE.md | 6 +- Lisp/OmniModulInsert.lsp | 222 +++++------ Lisp/README.md | 2 +- dcl/omniflo_weichen.dcl | 2 + doc/kommandos.md | 8 +- menu/SSG_LIB.cui | 813 +++++++++++++++++---------------------- menu/SSG_LIB.mnu | 19 +- tests/test_unit.lsp | 34 ++ 8 files changed, 494 insertions(+), 612 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 79ed843..3831016 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -78,7 +78,7 @@ Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD. | VarioFoerderer | `VarioFoerderer` | FOERDERANLAGE, VARIOFOERDERER_EDIT, Vario_Kette_Merge | | Gefaellestrecke | `Gefaellestrecke` | GEFAELLESTRECKE, GEFAELLESTRECKE_EDIT | | Kettenfoerderer | `KettenFoerderer` | KETTENFOERDERER (Menue: Omniflo -> KettenFoerderer), KF_EDIT (Doppelklick auf KF_n). KF_KS_PRUEFEN ist ein reiner Diagnosebefehl und bewusst NICHT im Menue | -| Omniflo (komplett) | `OmniModulInsert` + `GeruestInsert` | OMNI_APB_*, OMNI_W*_*, OMNI_WB_* (Untermenue Weichenbatterien), OMNI_TEF_*, OMNI_TV_*, OMNI_LADESCHLEIFE_*, OMNI_EDIT; OMNI_FAHRSTRECKE / OMNI_FAHRSTRECKE_BESCHRIFTEN (GeruestInsert, Linien-Logik wie GERUEST_TRAEGER) | +| Omniflo (komplett) | `OmniModulInsert` + `GeruestInsert` | OMNI_APB_*, OMNI_W90/OMNI_W45/OMNI_WP/OMNI_WK (je Winkel ein Dialog, Einzel/Doppel/Dreiwege ueber "Richtung"), OMNI_WKomb_*, OMNI_WB_* (Untermenue Weichenbatterien), OMNI_TEF_*, OMNI_TV_*, OMNI_LADESCHLEIFE_*, OMNI_EDIT; OMNI_FAHRSTRECKE / OMNI_FAHRSTRECKE_BESCHRIFTEN (GeruestInsert, Linien-Logik wie GERUEST_TRAEGER) | | Geruest | `GeruestInsert` | GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG (je eigener Dialog aus der Vorlage geruest.dcl, keine Umschaltung), GERUEST_TRAEGER (eigener Dialog), GERUEST_TRAEGER_BESCHRIFTEN (Untermenue Geruest -> Funktionen -> Traeger beschriften; alle Traeger der Zeichnung neu beschriften); Gattertraeger noch Platzhalter auf GERUEST (zeigt nur einen Hinweis) | | Connections | `Connection_Edit` + `SSG_LIB_Commands` | CONNECTION_INSERT, CONNECTION_EDIT, ILS_EINGANG_INSERT, ILS_AUSGANG_INSERT | | HW Planung | `HwPlanung` | HW_MATERIALFLUSS (Materialfluss erzeugen), HW_SYMBOLE (Symbole erzeugen, noch Platzhalter) | @@ -116,7 +116,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | `vf_spec.lsp` (von vf_core.lsp NACH vf_linienzug.lsp geladen) | VF_SPEC_BAU | Linienzug-Ketten aus **Eingabedaten** bauen, ohne Dialog und ohne Konsolenfrage (Stufe 1 aus `doc/todo/plan-vf-interactive.md`). Eine **Spec** beschreibt eine Kette in Domaenenwerten (`"links"`, `"winkel"`, `"aussen"`, ja/nein) statt in Menue-Codes; `vsp-journal` uebersetzt sie in ein Eingabe-Journal, `vsp-bau-aus-spec` spielt es per `vfl-journal-replay-start` durch den UNVERAENDERTEN `vf-linienzug-modus` (Replay-Kern `vsp-bau-journal` - nimmt auch ein unveraendert uebernommenes, aufgezeichnetes Journal, z.B. aus `dxf_anlage_export.py`). Damit traegt der fertige Block dasselbe `SSG_VF_EDIT`-Journal wie eine handgebaute Kette und bleibt per Doppelklick editier- und 2D/3D-konvertierbar - kein Journal-Konsument muss etwas von Specs wissen. Wichtige Regeln, die der Uebersetzer kennt: der Menue-Code haengt am Frame (erste Sektion 4 Optionen ohne GF-Bogen, danach 5), `hz` steht nur beim ERSTEN Segment im Journal, und `erst-hor` unterscheidet den horizontalen Erstkoerper einer VF-Einheit (Separator-/Endpunktfragen vorab) vom gewinkelten (keine Frage). Fehlerverhalten: fail fast - `vsp-pruefen` sammelt ALLE Spec-Fehler, gebaut wird dann nichts (nichts wird geraten). Ergebnis-Record je Kette mit `status` (`executed`/`warnung`/`desync`/`abbruch`/`spec-fehler`), Block/Handle/Einfuegepunkt/Attributen, `prompts` (muss 0 sein), `glieder_soll` vs. `glieder_ist` (Desync-Detektor, der auch bei aufgehender Queue greift) und den gesammelten `meldungen`. Headless-Rahmen `vsp-headless-an`/`-aus` (Save/Restore von `*vfl-headless*`, `*vfl-wizard-mode*`, `*ssg-gui-aus*` + zaehlende Eingabe-Stubs). Spec-Datei flach als JSON (`ssg-load-json` liest zeilenweise), erzeugt von `lib/vf_spec_export.py`. Gegenstueck/Referenz in Python: derselbe Emitter, gegen die 5 echten HundM-Ketten rundlaufgeprueft | | `Gefaellestrecke.lsp` | GEFAELLESTRECKE, GEFAELLESTRECKE_EDIT | Gefaelle-Foerderanlage (AUS -> Staustrecke skaliert -> Separator -> EIN); Modus 1 per DCL-Dialog (Einfuegehoehe, Element-Winkel 30/90); Doppelklick auf GF_n-Block ruft GEFAELLESTRECKE_EDIT (Dialog vorbelegt, Neuaufbau; die Einfuegehoehe kommt aus der aktuellen Z des Einfuegepunkts statt aus XDATA/HOEHE_VON_mm, damit ein in Z verschobener Block per OK direkt auf der neuen Hoehe neu entsteht - gleiches gilt fuer die 2D/3D-Umschaltung `gf-konvertiere-ent`; der GF-Linienzug-Rebuild nutzt weiter die absoluten Segmentpunkte aus XDATA) | | `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_UPDATE_ATTRIBS, CSV_EXPORT_KONFIG | JSON-Sammlung und Python-Export (Omniflo-Merkmale/Sum-Zeile via lib/export_csv.py). **Gefrorene Layer**: `csv:collect-export-blocks` laesst Bloecke auf gefrorenen Layern aus (ausgeschaltete Layer zaehlen NICHT), Schalter `*csv-gefrorene-ausschliessen*` (Standard an, Toggle im Dialog CSV_EXPORT_KONFIG). Die Hilfsobjekte eines gefrorenen VF_n/GF_n (Separator-/Element-Kopien, Einheiten-/AS-ES-Marker) liegen auf eigenen Layern und werden darum ueber `*csv-ausschluss-enames*` mit ausgelassen (gesetzt in `csv:export-vorbereiten` per `csv:hilfskopien-ausschluss`); erzeugt und nummeriert werden sie trotzdem, damit IDs stabil bleiben. DrawPlanquadrate nutzt dieselbe Sammlung und folgt dem Filter. **Hoehen-Neuberechnung**: erster Schritt von `csv:export-vorbereiten` ist `csv:hoehen-aktualisieren` - in Z verschobene `KREISEL_*`/`ECKRAD_*`/`VF_*`/`GF_*` bekommen ihre Hoehen-Attribute aus der Einfuege-Z neu (reiner Kern `csv:hoehen-werte`, getestet; Formeln/Rundung wie beim Bau: Kreisel HOEHE + MONTAGEHOEHE_m=z/1000, Eckrad HOEHE, GF/VF HOEHE_VON_mm=(fix z), MONTAGEHOEHE_m GF=z/1000 bzw. VF=(VON+BIS)/2000). HOEHE_BIS_mm = VON - (VON_alt - BIS_alt), bewusst NICHT z - DELTA_H_mm (ohne Vorzeichen -> steigende VF falsch, separat abgeschnitten -> 1 mm Abweichung); DELTA_H_mm nur Rueckfall. Nicht verschobene Bloecke (Attribut passt zu z) bleiben unangetastet, damit Bau-Werte und Hand-Korrekturen (z.B. Buehnen-Abzug aus HOEHEN_CHECK) bit-genau erhalten bleiben | -| `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_WB_*, OMNI_LADESCHLEIFE_AP110, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Weichenbatterien (`OMNI_WB_`: DWG aus `data/omniflo/2D`, Menuetexte/Nummern aus `data/omniflo/weichenbatterien_artinr_quelle.dxf`; im Katalog `omniflo_weichen.json` als `WeichenTyp` "Weichenbatterie" ohne Winkel/Breite/Laenge, damit der Doppelklick den Weichen-Dialog mit Richtung/Schaltung oeffnet), Verbinder (`OMNI_TV_*`: DWGs dimensionsunabhaengig in `data/omniflo/Verbinder`, `omni:insert-verbinder` -> gemeinsamer Einfuegekern `omni:insert-datei`, den auch `omni:insert-dxf` nutzt; im Export ueber `pattern_verbinder` = `VB_*, TV_*` gesammelt (`csv:collect-export-blocks`, `ssg-id-collect-blocks`), Sivas-Zeilen ueber TEILEART/ARTINR wie alle Omniflo-Teile), Transferwagen, Ladeschleifen (`data/json/omniflo_ladeschleifen.json`, per `ssg-json-laden`, da die Beschreibungen Kommas enthalten; Blockdatei darf `.dwg` statt `.dxf` sein), Edit-Dialog (OMNI_EDIT waehlt das bearbeitete Bauteil im Dropdown vor - globale `*omni-dlg-vorwahl*` statt neuer Dialog-Parameter; im Weichen-Dialog stehen Schaltung/Richtung auf seinen Werten, ein Filterwechsel waehlt das Gegenstueck mit dem aehnlichsten ProfilTyp, reine Kerne `omni:profil-aehnlichkeit`/`omni:vorwahl-index` getestet) | +| `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W90, OMNI_W45, OMNI_WP, OMNI_WK, OMNI_WKomb_*, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_WB_*, OMNI_LADESCHLEIFE_AP110, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen (je Winkel EIN Dialog; Einzel/Doppel/Dreiwege ueber die Radiogruppe "Richtung" = KurvenRichtung 1/2/3/7, `*omni-weichen-std-typen*`/`omni:weichen-basis-liste`/`omni:weichen-richtung-key` getestet; Deltaweichen tragen ebenfalls 3/7 und bleiben darum per WeichenTyp draussen; Richtungen ohne Katalogeintrag ausgegraut; OMNI_EDIT erlaubt so den Wechsel Einzel <-> Doppel <-> Dreiwege), Weichenbatterien (`OMNI_WB_`: DWG aus `data/omniflo/2D`, Menuetexte/Nummern aus `data/omniflo/weichenbatterien_artinr_quelle.dxf`; im Katalog `omniflo_weichen.json` als `WeichenTyp` "Weichenbatterie" ohne Winkel/Breite/Laenge, damit der Doppelklick den Weichen-Dialog mit Richtung/Schaltung oeffnet), Verbinder (`OMNI_TV_*`: DWGs dimensionsunabhaengig in `data/omniflo/Verbinder`, `omni:insert-verbinder` -> gemeinsamer Einfuegekern `omni:insert-datei`, den auch `omni:insert-dxf` nutzt; im Export ueber `pattern_verbinder` = `VB_*, TV_*` gesammelt (`csv:collect-export-blocks`, `ssg-id-collect-blocks`), Sivas-Zeilen ueber TEILEART/ARTINR wie alle Omniflo-Teile), Transferwagen, Ladeschleifen (`data/json/omniflo_ladeschleifen.json`, per `ssg-json-laden`, da die Beschreibungen Kommas enthalten; Blockdatei darf `.dwg` statt `.dxf` sein), Edit-Dialog (OMNI_EDIT waehlt das bearbeitete Bauteil im Dropdown vor - globale `*omni-dlg-vorwahl*` statt neuer Dialog-Parameter; im Weichen-Dialog stehen Schaltung/Richtung auf seinen Werten, ein Filterwechsel waehlt das Gegenstueck mit dem aehnlichsten ProfilTyp, reine Kerne `omni:profil-aehnlichkeit`/`omni:vorwahl-index` getestet) | | `SSG_LIB_Commands.lsp` | ILS_BTMT_Beladung, ILS_BTMT_Entladung, ILS_SCANNER_INSERT, ILS_SEPARATOR_INSERT, ILS_EINGANG_INSERT, ILS_AUSGANG_INSERT, SSG_BLOCKEDIT, SSG_DIM_SWITCH, SSG_SPRACHE | BTMT Be-/Entladung (`ils-insert-station`: wiederholtes Einfuegen von `BTMT-Beladung` bzw. `SC_Entladung`, Drehung interaktiv, Layer aus `LAYER`-Attribut, Dimension via `ssg-ils-block-laden`) + Sensoren (`ils-insert-sensor`) + Eingang-/Ausgang-Symbol (frei platzierbar wie BTMT Be-/Entladung, ueber `ils-insert-station` mit den Rohnamen `Eingang`/`Ausgang`, Bloecke `Eingang_.dwg`/`Ausgang_.dwg` in data/ils) + Doppelklick/Kontextmenue-Dispatcher + Konfiguration (2D/3D, Sprache) | | `Tro_Edit.lsp` | TRO_INSERT, TRO_EDIT | TRO-Marker (Block `TRO_SYM_`) fuer sps_skel (lib/tro_annotate.py): TRO_INSERT fuegt eine bestehende Blockdefinition an einem gewaehlten Punkt ein und setzt ID/TYPE (bricht ab, wenn der Typ noch keine Blockdefinition in der Zeichnung hat - die entsteht nur ueber tro_annotate.py); TRO_EDIT aendert ID/TYPE eines bestehenden Markers per Dialog. Typliste aus `tro_types.lsp` (von `tro_annotate.py --emit-lisp` nach DXFM_LISP geschrieben). Der Dispatcher SSG_BLOCKEDIT leitet Blocknamen `TRO_*` zu TRO_EDIT. | | `Connection_Edit.lsp` | CONNECTION_INSERT, CONNECTION_EDIT | Verbindung zwischen zwei TRO-Markern als Block `CONNECTION_ARROW` (Pfeilmitte); Beziehung ueber die INTERNEN IDs der TROs (`FROM_ID`/`TO_ID`, sichtbar `FROM_TRO`/`TO_TRO`, `KIND` flow/colocated), damit Umbenennen/Verschieben die Zuordnung nicht bricht. Dialog `connection_edit.dcl`; SSG_BLOCKEDIT leitet `CONNECTION_*` hierher (vor dem TRO-Zweig) | @@ -140,7 +140,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | `gefaellestrecke.dcl` | GEFAELLESTRECKE Modus 1 (Gefaellestrecke.lsp, `gf-dialog-eingabe`) | | `variofoerderer.dcl` | FOERDERANLAGE Standardfall + Werteingabe (vf_standard.lsp, `vfs-dialog-eingabe-basis`/`vfs-dialog-winkel-verteilung`) | | `omniflo_boegen.dcl` | OMNI_APB_* (OmniModulInsert.lsp) | -| `omniflo_weichen.dcl` | OMNI_W*_* (OmniModulInsert.lsp) | +| `omniflo_weichen.dcl` | OMNI_W90/W45/WP/WK, OMNI_WKomb_*, OMNI_EDIT (OmniModulInsert.lsp, `omni:weichen-dialog`); Radiogruppe Richtung `ri_alle`/`ri_links`/`ri_rechts`/`ri_doppel`/`ri_dreiwege` | | `omniflo_ladeschleifen.dcl` | OMNI_LADESCHLEIFE_* (OmniModulInsert.lsp, `omni:ladeschleifen-dialog`) | | `sprache.dcl` | SSG_SPRACHE (SSG_LIB_Commands.lsp) | | `tro_insert.dcl` | TRO_INSERT (Tro_Edit.lsp) | diff --git a/Lisp/OmniModulInsert.lsp b/Lisp/OmniModulInsert.lsp index fee198c..c5990bd 100644 --- a/Lisp/OmniModulInsert.lsp +++ b/Lisp/OmniModulInsert.lsp @@ -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_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)) ) ) diff --git a/Lisp/README.md b/Lisp/README.md index 8c64767..85ef0c1 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -703,7 +703,7 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind | --- | --- | --- | | Daten | `OMNI_LOAD`, `OMNI_INFO_BOGEN`, `OMNI_INFO_WEICHE` | JSON-Daten laden und abfragen | | Boegen | `OMNI_APB_630_90`, `OMNI_APB_550_675`, `OMNI_APB_630_45`, `OMNI_APB_550_225`, `OMNI_APB_650_180` | Omniflo-Boegen ueber DCL-Dialog einfuegen | -| Weichen | `OMNI_W90_*`, `OMNI_W45_*`, `OMNI_WP_*`, `OMNI_WK_*`, `OMNI_WKomb_*` | Omniflo-Weichen (Einfach/Doppel/Dreiwege, Delta, Stern) | +| Weichen | `OMNI_W90`, `OMNI_W45`, `OMNI_WP`, `OMNI_WK`, `OMNI_WKomb_*` | Omniflo-Weichen: je Winkel EIN Dialog mit Einzel-, Doppel- und Dreiwegeweichen, Typwahl ueber die Radiogruppe "Richtung" (Links/Rechts/Doppel/Dreiwege = KurvenRichtung 1/2/3/7, Basisliste `omni:weichen-basis-liste` mit `*omni-weichen-std-typen*`, nicht belegte Richtungen ausgegraut); Delta/Stern eigene Dialoge | | Weichenbatterien | `OMNI_WB_` (16) | Fertige Weichenbatterien, DWG `data/omniflo/2D/.dwg` (nur 2D, Rueckfall per `omni:omniflo-datei-finden`), Menuetexte/Nummern aus `data/omniflo/weichenbatterien_artinr_quelle.dxf` (BESCHR/ARTINR). Im Katalog `omniflo_weichen.json` als `WeichenTyp` "Weichenbatterie" (ohne Winkel/Breite/Laenge), darum oeffnet der Doppelklick (`OMNI_EDIT`) den Weichen-Dialog mit allen Batterien - Richtung und Schaltung umstellbar | | Ladeschleifen | `OMNI_LADESCHLEIFE_AP110` | Ladeschleife aus `omniflo_ladeschleifen.json` ueber DCL-Dialog (`dcl/omniflo_ladeschleifen.dcl`) einfuegen; Daten per `ssg-json-laden` (Beschreibungen enthalten Kommas). Blockdatei `.dwg` unter `DXFM_OMNIFLO` (`omni:insert-dxf` faellt auf `.dwg` zurueck, wenn keine `.dxf` existiert). Per `OMNI_EDIT` editierbar | | TEF Elemente | `OMNI_TEF_UmlenkR/L`, `OMNI_TEF_AntriebL/R`, `OMNI_TEF_Gerade` | Feste TEF-Bauteile ohne Sivas-Auswahl, direkt per `omni:insert-dxf` an gewaehltem Punkt eingefuegt (Dateien unter `DXFM_OMNIFLO`) | diff --git a/dcl/omniflo_weichen.dcl b/dcl/omniflo_weichen.dcl index f894814..99a1bf6 100644 --- a/dcl/omniflo_weichen.dcl +++ b/dcl/omniflo_weichen.dcl @@ -28,6 +28,8 @@ omniflo_weichen : dialog { : radio_button { key = "ri_alle"; label = "Alle"; value = "1"; } : radio_button { key = "ri_links"; label = "Links"; } : radio_button { key = "ri_rechts"; label = "Rechts"; } + : radio_button { key = "ri_doppel"; label = "Doppel"; } + : radio_button { key = "ri_dreiwege"; label = "Dreiwege"; } } } diff --git a/doc/kommandos.md b/doc/kommandos.md index 0e9654b..d236c2c 100644 --- a/doc/kommandos.md +++ b/doc/kommandos.md @@ -91,10 +91,10 @@ Gross-/Kleinschreibung spielt an der Kommandozeile keine Rolle. | `OMNI_LOAD` | Omniflo-Komponentendaten laden | | `OMNI_INFO_BOGEN` / `OMNI_INFO_WEICHE` | Daten eines Bogens / einer Weiche anzeigen | | `OMNI_APB60_90`, `OMNI_APB_630_90`, `OMNI_APB_630_45`, `OMNI_APB_550_675`, `OMNI_APB_550_225`, `OMNI_APB_650_180` | Boegen einfuegen (Dialog `omniflo_boegen.dcl`) | -| `OMNI_W90_Einfach`/`_Doppel`/`_Dreiwege` | Weichen 90 Grad (Dialog `omniflo_weichen.dcl`) | -| `OMNI_W45_Einfach`/`_Doppel`/`_Dreiwege` | Weichen 45 Grad | -| `OMNI_WP_Einfach`/`_Doppel`/`_Dreiwege` | Parallelweichen | -| `OMNI_WK_Einfach`/`_Doppel`/`_Dreiwege` | Weichenkoerper | +| `OMNI_W90` | Weichen 90 Grad (Dialog `omniflo_weichen.dcl`; Einzel/Doppel/Dreiwege ueber "Richtung": Links/Rechts/Doppel/Dreiwege) | +| `OMNI_W45` | Weichen 45 Grad | +| `OMNI_WP` | Parallelweichen | +| `OMNI_WK` | Weichenkoerper | | `OMNI_WKomb_Delta_1400`, `OMNI_WKomb_Delta_1600`, `OMNI_WKomb_Star` | Weichenkombinationen (Delta, Stern) | | `OMNI_APBW_R400_45_140`, `OMNI_APBW_R400_675_260`, `OMNI_APBW_R550_45_77`, `OMNI_APBW_R550_45_194`, `OMNI_APBW_R550_225_360`, `OMNI_APBW_R550_225_410A`/`B`/`C`, `OMNI_APBW_R550_675_58`/`_125`/`_208`/`_360`, `OMNI_APBW_R650_90_300`, `OMNI_APBW_R750_90_200` | Boegen fuer Weichen (fest, ohne Dialog) | | `OMNI_TEF_UmlenkL`/`R`, `OMNI_TEF_AntriebL`/`R`, `OMNI_TEF_Gerade` | TEF-Elemente (fest, ohne Drehung) | diff --git a/menu/SSG_LIB.cui b/menu/SSG_LIB.cui index 9c47345..0a26bd9 100644 --- a/menu/SSG_LIB.cui +++ b/menu/SSG_LIB.cui @@ -214,887 +214,839 @@ - Einfach 90 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Einfach + Weichen 90 + ^C^C(ssg-ensure "OmniModulInsert") OMNI_W90 - Doppel 90 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Doppel + Weichen 45 + ^C^C(ssg-ensure "OmniModulInsert") OMNI_W45 - Dreiwege 90 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Dreiwege + Weichen Parallel + ^C^C(ssg-ensure "OmniModulInsert") OMNI_WP - + - Einfach 45 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Einfach + Weichen 22.5 + ^C^C(ssg-ensure "OmniModulInsert") OMNI_WK - - Doppel 45 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Doppel - - - - - Dreiwege 45 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Dreiwege - - - - - Einfach Parallel - ^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Einfach - - - - - Doppel Parallel - ^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Doppel - - - - - Dreiwege Parallel - ^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Dreiwege - - - - - Einfach 22.5 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Einfach - - - - - Doppel 22.5 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Doppel - - - - - Dreiwege 22.5 - ^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Dreiwege - - - Delta 1600/800 ^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1600 - + Delta 1400/700 ^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1400 - + Star 1400/1400 ^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Star - + Weiche S C L1S 1C 200/1200/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372536 - + Weiche S C L1S 1C 200/1200/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372537 - + Weiche S C L1S 2C 200/1200/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372512 - + Weiche S C L1S 2C 200/1200/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372513 - + Weiche S C L2S 2C 200/1200/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372524 - + Weiche S C L2S 2C 200/1200/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372525 - + Weiche S C L2S 3C 200/1400/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372500 - + Weiche S C L2S 3C 200/1400/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372501 - + Weiche S C R1S 1C 200/1200/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372539 - + Weiche S C R1S 1C 200/1200/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372540 - + Weiche S C R1S 2C 200/1200/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372515 - + Weiche S C R1S 2C 200/1200/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372516 - + Weiche S C R2S 2C 200/1200/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372527 - + Weiche S C R2S 2C 200/1200/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372528 - + Weiche S C R2S 3C 200/1400/950 mit M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372503 - + Weiche S C R2S 3C 200/1400/950 mit P ^C^C(ssg-ensure "OmniModulInsert") OMNI_WB_834372504 - + TEF Antriebst. rechts ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_AntriebR - + TEF Umlenkspannst. rechts ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_UmlenkR - + TEF Antriebst. links ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_AntriebL - + TEF Umlenkspannst. links ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_UmlenkL - + TEF Gerade auf Linie ^C^C(ssg-ensure "TEFInsert") TEF_FOERDERER_LINIE - + TEF Gerade ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_Gerade - + Stopper AP ^C^C(ssg-ensure "OmniModulInsert") OMNI_STOPPER - + Scanner ^C^C(ssg-ensure "OmniModulInsert") OMNI_SCANNER - + Bürstenbremse ^C^C(ssg-ensure "OmniModulInsert") OMNI_BUERSTENBREMSE - + Schwenkschiene Schiebetür L ^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_L - + Schwenkschiene Schiebetür R ^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_R - + Schwenkschiene Schiebetür L mit Sensorik ^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_L_SENSORIK - + Schwenkschiene Schiebetür R mit Sensorik ^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_R_SENSORIK - + KettenFoerderer ^C^C(ssg-ensure "KettenFoerderer") KETTENFOERDERER - + Ladeschleifen ^C^C(ssg-ensure "OmniModulInsert") OMNI_LADESCHLEIFE_AP110 - + TV W-AP110 kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP110 - + TV W-AP60 oben kpl. ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP60 - + TV W-W kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_W - + TV W-AP110-W kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP110_W - + TV W-AP60 kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP60_KPL - + TV 80 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_80 - + TV 50 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_50 - + Endplatte Al-Profil AP schraubbar ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_ENDPLATTE - + Anschlag AP-Ende für Spulenzug ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_ANSCHLAG - + TV-A für AP110/AP60 kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_A_AP110_AP60 - + TV-A für AP60/ST ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_A_AP60_ST - + TV-A für AP110/ST kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_A_AP110_ST - + TV-SW II für SW-SW ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_II_SW_SW - + TV-SW III für SW-AP110-SW ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_III_AP110_SW - + TV-SW I für SW-AP110 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_I_AP110 - + TV-SW IV für Anschluss SW-AP60 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_IV_AP60 - + TV-SW IV für SW-ST ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_IV_ST - + Muffe ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_MUFFE - + APB 110 R400/45 140 nur fuer Delta ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R400_45_140 - + APB 110 R550/45 194 nur fuer Delta ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_45_194 - + APBW 110 R550/22,5 360x248,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_360 - + APBW 110 R550/22,5 410x298,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_410A - + APBW 110 R550/22,5 410x78,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_410B - + APBW 110 R550/22,5 410x98,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_410C - + APBW 110 R550/67,5 360x598,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_360 - + APBW 110 R400/67,5 260x398,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R400_675_260 - + APBW 110 R550/45 77x160 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_45_77 - + APBW 110 R550/67,5 125x83,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_125 - + APBW 110 R750/90 200x290 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R750_90_200 - + APBW 110 R650/90 300x190 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R650_90_300 - + APBW 110 R550/67,5 208x347 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_208 - + APBW 110 R550/67,5 58x497 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_58 - + Element bearbeiten ^C^C(ssg-ensure "OmniModulInsert") OMNI_EDIT - + Rohr-Gerüst-Traeger ^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER - + Säulen ^C^C(ssg-ensure "GeruestInsert") GERUEST_SAEULEN - + Rohrabhänger ^C^C(ssg-ensure "GeruestInsert") GERUEST_ROHRABHAENGER - + Wandbefestigung ^C^C(ssg-ensure "GeruestInsert") GERUEST_WANDBEFESTIGUNG - + Gatterträger ^C^C(ssg-ensure "GeruestInsert") GERUEST - + Traeger beschriften ^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER_BESCHRIFTEN - + Geschoss anlegen ^C^C(ssg-ensure "LagerInsert") LG_GESCHOSS - + Aktives Geschoss ^C^C(ssg-ensure "LagerInsert") LG_GESCHOSS_AKTIV - + Geschoss kopieren ^C^C(ssg-ensure "LagerInsert") LG_GESCHOSS_KOPIEREN - + Lagerbereich (Auto-Fuellung) ^C^C(ssg-ensure "LagerInsert") LG_BEREICH - + Regalreihen einzeln ^C^C(ssg-ensure "LagerInsert") LG_REIHE - + Gaenge einzeln ^C^C(ssg-ensure "LagerInsert") LG_GANG - + Bearbeiten ^C^C(ssg-ensure "LagerInsert") LG_EDIT - + Darstellung aktualisieren ^C^C(ssg-ensure "LagerInsert") LG_DARSTELLUNG - + Regale zaehlen ^C^C(ssg-ensure "LagerInsert") LG_REGALE - + Regelprofil anzeigen ^C^C(ssg-ensure "LagerPruefung") LG_REGELN - + Export Lager-JSON ^C^C(ssg-ensure "LagerInsert") LAGER_EXPORT - + Materialfluss erzeugen ^C^C(ssg-ensure "HwPlanung") HW_MATERIALFLUSS - + Symbole erzeugen ^C^C(ssg-ensure "HwPlanung") HW_SYMBOLE - + Symbole nummerieren ^C^C(ssg-ensure "HwPlanung") HW_NUMMERIEREN - + Marker einfuegen ^C^C(ssg-ensure "Tro_Edit") TRO_INSERT - + Marker bearbeiten ^C^C(ssg-ensure "Tro_Edit") TRO_EDIT - + Bearbeiten (Auto) ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT - + Verbindung einfuegen ^C^C(ssg-ensure "Connection_Edit") CONNECTION_INSERT - + Verbindung bearbeiten ^C^C(ssg-ensure "Connection_Edit") CONNECTION_EDIT - + Eingang ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_EINGANG_INSERT - + Ausgang ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_AUSGANG_INSERT - + SPS Schliessen ^C^C - + Hoehen-Check (Montagehoehe/Buehne) ^C^C(ssg-ensure "check_hoehen") HOEHEN_CHECK - + Export Sivas ^C^C(ssg-ensure "export") EXPORTSIVAS - + Export CSV ^C^C(ssg-ensure "export") EXPORTCSV - + Umschalten 2D und 3D ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_SWITCH - + Alle Bloecke auf 2D ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_2D - + Alle Bloecke auf 3D ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_3D - + Sprache ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHE - + Planquadrate an/aus ^C^C(ssg-ensure "DrawPlanquadrate") PLANQUADRATE_TOGGLE - + CSV-Export ^C^C(ssg-ensure "export") CSV_EXPORT_KONFIG - + Bloecke zaehlen ^C^C(ssg-ensure "ssg_blocktools") SSG_BLOCK_COUNT - + Bloecke loeschen ^C^C(ssg-ensure "ssg_blocktools") SSG_BLOCK_DELETE - + Attribute ersetzen ^C^C(ssg-ensure "ssg_blocktools") SSG_ATTR_ERSETZEN - + Text ersetzen ^C^C(ssg-ensure "ssg_texttools") SSG_TEXT_ERSETZEN - + Text parallel beschriften ^C^C(ssg-ensure "ssg_texttools") SSG_TEXT_PARALLEL - + Texthoehe aendern ^C^C(ssg-ensure "ssg_texttools") SSG_TEXT_HOEHE - + Textstil aendern ^C^C(ssg-ensure "ssg_texttools") SSG_TEXT_STIL - + Faehnchen + Stueckliste aus Zeichnung ^C^C(ssg-ensure "ssg_stueckliste") SSG_FAEHNCHEN_STUECKLISTE - + Din Formate ^C^C(ssg-ensure "DinFormate") DIN_FORMATE - + alle Tests ausfuehren und exportieren ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) (c:SSG_RUN_ALL_TESTS_EXPORT) - + Tests ausfuehren und stehen lassen ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) (c:SSG_RUN_ALL_TESTS_OFFEN) - + Export CSV/Sivas ALL ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_export_all.lsp")) (c:TEST_EXPORT_ALL) - + Kreisel ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_kreisel.lsp")) (c:TEST_KREISEL) - + Foerderer ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_foerderer.lsp")) (c:TEST_FOERDERER) - + Foerderer-Linienzug ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_linienzug.lsp")) (c:TEST_LINIENZUG) (c:TEST_LINIENZUG_STUFE2) (c:TEST_LINIENZUG_MODUS2) - + Omniflo ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo.lsp")) (c:TEST_OMNIFLO) - + Omniflo Strecke ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo_strecke.lsp")) (c:TEST_OMNIFLO_STRECKE) - + Gefaellestrecke ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_gefaellestrecke.lsp")) (c:TEST_GEFAELLESTRECKE) - + Mubea Gesamtmodell ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_mubea.lsp")) (c:TEST_MUBEA) - + HundM05 Kreisel-Abschnitt ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_hundm05.lsp")) (c:TEST_HUNDM05) - + Dematic/Arvato Flowpuffer (Vorlage) ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_dematic_arvato.lsp")) (c:TEST_DEMATIC_ARVATO) - + ILS 3.0 Showroom (Vorlage) ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_showroom_ils.lsp")) (c:TEST_SHOWROOM_ILS) - + Testanlage test_system ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_test_system.lsp")) (c:TEST_TEST_SYSTEM) - + KS 2D/3D pruefen (CSV) ^C^C(load (strcat (getenv "DXFMAKRO") "/Lisp/ks_pruefung.lsp")) KS_PRUEFEN - + Kreisel bearbeiten (ssg-ensure "KreiselInsert") KreiselEdit - + Eckrad bearbeiten (ssg-ensure "KreiselInsert") EckradEdit - + Omniflo Element bearbeiten (ssg-ensure "OmniModulInsert") OMNI_EDIT - + Gefaellestrecke bearbeiten (ssg-ensure "Gefaellestrecke") GEFAELLESTRECKE_EDIT - + VarioFoerderer bearbeiten (ssg-ensure "VarioFoerderer") VARIOFOERDERER_EDIT - + TRO-Marker bearbeiten (ssg-ensure "Tro_Edit") TRO_EDIT - + Verbindung bearbeiten (ssg-ensure "Connection_Edit") CONNECTION_EDIT - + SSG Bearbeiten (Auto) (ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT @@ -1111,14 +1063,14 @@ SSG_LIB - - - - + + + + + + - - - + ILS @@ -1315,28 +1267,28 @@ - - - - + + + + KettenFoerderer - + Ladeschleifen - + - - + + Element bearbeiten - + @@ -1385,959 +1337,908 @@ Weichen - Einfach 90 + Weichen 90 - Doppel 90 + Weichen 45 - Dreiwege 90 + Weichen Parallel - - Einfach 45 + Weichen 22.5 - - - - - Doppel 45 - - - - - - Dreiwege 45 - - - - - - - Einfach Parallel - - - - - - Doppel Parallel - - - - - - Dreiwege Parallel - - - - - - - Einfach 22.5 - - - - - - Doppel 22.5 - - - - - - Dreiwege 22.5 - - + Delta 1600/800 - + Delta 1400/700 - + Star 1400/1400 - + - + Weichenbatterien Weiche S C L1S 1C 200/1200/950 mit M - + Weiche S C L1S 1C 200/1200/950 mit P - + Weiche S C L1S 2C 200/1200/950 mit M - + Weiche S C L1S 2C 200/1200/950 mit P - + Weiche S C L2S 2C 200/1200/950 mit M - + Weiche S C L2S 2C 200/1200/950 mit P - + Weiche S C L2S 3C 200/1400/950 mit M - + Weiche S C L2S 3C 200/1400/950 mit P - + Weiche S C R1S 1C 200/1200/950 mit M - + Weiche S C R1S 1C 200/1200/950 mit P - + Weiche S C R1S 2C 200/1200/950 mit M - + Weiche S C R1S 2C 200/1200/950 mit P - + Weiche S C R2S 2C 200/1200/950 mit M - + Weiche S C R2S 2C 200/1200/950 mit P - + Weiche S C R2S 3C 200/1400/950 mit M - + Weiche S C R2S 3C 200/1400/950 mit P - + - + TEF Elemente TEF Antriebst. rechts - + TEF Umlenkspannst. rechts - + TEF Antriebst. links - + TEF Umlenkspannst. links - + TEF Gerade auf Linie - + TEF Gerade - + - + Anbaugruppen Stopper AP - + Scanner - + Bürstenbremse - + - + Spez. Streckenelemente - + - + Türlösungen - + - + Schwenkschienen Schwenkschiene Schiebetür L - + Schwenkschiene Schiebetür R - + Schwenkschiene Schiebetür L mit Sensorik - + Schwenkschiene Schiebetür R mit Sensorik - + - + Verbinder TV W-AP110 kpl - + TV W-AP60 oben kpl. - + TV W-W kpl - + TV W-AP110-W kpl - + TV W-AP60 kpl - + TV 80 - + TV 50 - + Endplatte Al-Profil AP schraubbar - + Anschlag AP-Ende für Spulenzug - + TV-A für AP110/AP60 kpl - + TV-A für AP60/ST - + TV-A für AP110/ST kpl - + TV-SW II für SW-SW - + TV-SW III für SW-AP110-SW - + TV-SW I für SW-AP110 - + TV-SW IV für Anschluss SW-AP60 - + TV-SW IV für SW-ST - + Muffe - + - + Boegen fuer Weichen ~APB 110 R400/45 140 nur fuer Delta - + ~APB 110 R550/45 194 nur fuer Delta - + ~APBW 110 R550/22,5 360x248,5 - + ~APBW 110 R550/22,5 410x298,5 - + ~APBW 110 R550/22,5 410x78,5 - + ~APBW 110 R550/22,5 410x98,5 - + ~APBW 110 R550/67,5 360x598,5 - + ~APBW 110 R400/67,5 260x398,5 - + ~APBW 110 R550/45 77x160 - + ~APBW 110 R550/67,5 125x83,5 - + ~APBW 110 R750/90 200x290 - + ~APBW 110 R650/90 300x190 - + ~APBW 110 R550/67,5 208x347 - + ~APBW 110 R550/67,5 58x497 - + - + Gerüst Rohr-Gerüst-Traeger - + Säulen - + Rohrabhänger - + Wandbefestigung - + Gatterträger - + - + - + Funktionen Traeger beschriften - + - + Lager Geschoss anlegen - + Aktives Geschoss - + Geschoss kopieren - + Lagerbereich (Auto-Fuellung) - + Regalreihen einzeln - + Gaenge einzeln - + Bearbeiten - + Darstellung aktualisieren - + Regale zaehlen - + Regelprofil anzeigen - + Export Lager-JSON - + - + HW Planung Materialfluss erzeugen - + Symbole erzeugen - + Symbole nummerieren - + - + SPS - - + + Eingang - + Ausgang - + SPS Schliessen - + - + TRO Marker einfuegen - + Marker bearbeiten - + Bearbeiten (Auto) + + + + + + + Connections + + Verbindung einfuegen + + + + + + Verbindung bearbeiten + + + + + + Bearbeiten (Auto) + + + + + + + Export + + Hoehen-Check (Montagehoehe/Buehne) + + + + + + Export Sivas + + + + + + Export CSV - Connections + Konfiguration - Verbindung einfuegen + Umschalten 2D und 3D - Verbindung bearbeiten + Alle Bloecke auf 2D - - Bearbeiten (Auto) - - - - - - - Export - - Hoehen-Check (Montagehoehe/Buehne) - - - - - - Export Sivas - - - - - - Export CSV - - - - - - - Konfiguration - - Umschalten 2D und 3D - - - - - - Alle Bloecke auf 2D - - - - Alle Bloecke auf 3D - + Sprache - + Planquadrate an/aus - + CSV-Export - + - + Werkzeuge Bloecke zaehlen - + Bloecke loeschen - + Attribute ersetzen - + Text ersetzen - + Text parallel beschriften - + Texthoehe aendern - + Textstil aendern - + Faehnchen + Stueckliste aus Zeichnung - + Din Formate - + - + Tests alle Tests ausfuehren und exportieren - + Tests ausfuehren und stehen lassen - + Export CSV/Sivas ALL - + Kreisel - + Foerderer - + Foerderer-Linienzug - + Omniflo - + Omniflo Strecke - + Gefaellestrecke - + Mubea Gesamtmodell - + HundM05 Kreisel-Abschnitt - + Dematic/Arvato Flowpuffer (Vorlage) - + ILS 3.0 Showroom (Vorlage) - + Testanlage test_system - + KS 2D/3D pruefen (CSV) - + - + POP501 SSG_LIB Edit Context Kreisel bearbeiten - + Eckrad bearbeiten - + Omniflo Element bearbeiten - + Gefaellestrecke bearbeiten - + VarioFoerderer bearbeiten - + TRO-Marker bearbeiten - + Verbindung bearbeiten - + SSG Bearbeiten (Auto) - + diff --git a/menu/SSG_LIB.mnu b/menu/SSG_LIB.mnu index 712768b..644e8cb 100644 --- a/menu/SSG_LIB.mnu +++ b/menu/SSG_LIB.mnu @@ -49,21 +49,10 @@ [->Boegen APB60] [<-90]^C^C(ssg-ensure "OmniModulInsert") OMNI_APB60_90 [->Weichen] -[Einfach 90]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Einfach -[Doppel 90]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Doppel -[Dreiwege 90]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Dreiwege -[--] -[Einfach 45]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Einfach -[Doppel 45]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Doppel -[Dreiwege 45]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Dreiwege -[--] -[Einfach Parallel]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Einfach -[Doppel Parallel]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Doppel -[Dreiwege Parallel]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Dreiwege -[--] -[Einfach 22.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Einfach -[Doppel 22.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Doppel -[Dreiwege 22.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Dreiwege +[Weichen 90]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90 +[Weichen 45]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45 +[Weichen Parallel]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP +[Weichen 22.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK [--] [Delta 1600/800]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1600 [Delta 1400/700]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1400 diff --git a/tests/test_unit.lsp b/tests/test_unit.lsp index 4967432..447dbea 100644 --- a/tests/test_unit.lsp +++ b/tests/test_unit.lsp @@ -1253,6 +1253,40 @@ (("Sivasnr" . 834372515) ("ProfilTyp" . "Weiche S C R1S 2C 200/1200/950 mit M"))))) (tu-nil "omni:vorwahl-index/leer" (omni:vorwahl-index (car _wl) nil)) (tu-nil "omni:vorwahl-index/ohne-ziel" (omni:vorwahl-index nil _wl)) + + ;; Richtungs-Radiobuttons: KurvenRichtung 1/2/3/7 -> Tile-Key + (tu-eq "omni:weichen-richtung-key/links" "ri_links" (omni:weichen-richtung-key "1")) + (tu-eq "omni:weichen-richtung-key/rechts" "ri_rechts" (omni:weichen-richtung-key "2")) + (tu-eq "omni:weichen-richtung-key/doppel" "ri_doppel" (omni:weichen-richtung-key "3")) + (tu-eq "omni:weichen-richtung-key/dreiwege" "ri_dreiwege" (omni:weichen-richtung-key "7")) + (tu-nil "omni:weichen-richtung-key/unbekannt" (omni:weichen-richtung-key "5")) + + ;; Basisliste eines Winkel-Dialogs: Einzel/Doppel/Dreiwege gemeinsam, + ;; Deltaweiche (ebenfalls KurvenRichtung 3) bleibt draussen + (setq _wk + '((("Sivasnr" . 1) ("KurvenWinkel" . 90) ("WeichenTyp" . "Einzelweiche") ("KurvenRichtung" . 1) ("Schaltungstyp" . "M")) + (("Sivasnr" . 2) ("KurvenWinkel" . 90) ("WeichenTyp" . "Einzelweiche") ("KurvenRichtung" . 2) ("Schaltungstyp" . "P")) + (("Sivasnr" . 3) ("KurvenWinkel" . 90) ("WeichenTyp" . "Doppelweiche") ("KurvenRichtung" . 3) ("Schaltungstyp" . "M")) + (("Sivasnr" . 4) ("KurvenWinkel" . 90) ("WeichenTyp" . "Dreiwegeweiche") ("KurvenRichtung" . 7) ("Schaltungstyp" . "P")) + (("Sivasnr" . 5) ("KurvenWinkel" . 90) ("WeichenTyp" . "Deltaweiche") ("KurvenRichtung" . 3) ("Schaltungstyp" . "M") ("Breite" . 1400)) + (("Sivasnr" . 6) ("KurvenWinkel" . 45) ("WeichenTyp" . "Doppelweiche") ("KurvenRichtung" . 3) ("Schaltungstyp" . "M")))) + (setq _bl (omni:weichen-basis-liste _wk 90 *omni-weichen-std-typen* nil)) + (tu-eq "omni:weichen-basis-liste/std-typen" '(1 2 3 4) + (mapcar '(lambda (e) (cdr (assoc "Sivasnr" e))) _bl)) + (tu-eq "omni:weichen-basis-liste/typ-string" 1 + (length (omni:weichen-basis-liste _wk 90 "Doppelweiche" nil))) + (tu-eq "omni:weichen-basis-liste/breite" 1 + (length (omni:weichen-basis-liste _wk nil "Deltaweiche" 1400))) + (tu-eq "omni:weichen-basis-liste/alle" 6 + (length (omni:weichen-basis-liste _wk nil nil nil))) + + ;; Filter ueber die neuen Richtungen + (tu-eq "omni:weichen-filter-liste/doppel" 3 + (cdr (assoc "Sivasnr" (car (omni:weichen-filter-liste _bl "alle" "3"))))) + (tu-eq "omni:weichen-filter-liste/dreiwege" 4 + (cdr (assoc "Sivasnr" (car (omni:weichen-filter-liste _bl "alle" "7"))))) + (tu-nil "omni:weichen-filter-liste/dreiwege-m" + (omni:weichen-filter-liste _bl "M" "7")) )