diff --git a/CLAUDE.md b/CLAUDE.md index 7ac222a..9ca574e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -75,6 +75,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 | | Omniflo (komplett) | `OmniModulInsert` | OMNI_APB_*, OMNI_W*_*, OMNI_AP*, OMNI_TEF_*, OMNI_TV_*, OMNI_EDIT | +| Connections | `Connection_Edit` + `SSG_LIB_Commands` | CONNECTION_INSERT, CONNECTION_EDIT, ILS_EINGANG_INSERT, ILS_AUSGANG_INSERT | | Export | `export` | EXPORTSIVAS, EXPORTCSV, CALLPYTHON | | Konfiguration | `SSG_LIB_Commands` | SSG_DIM_SWITCH, SSG_SPRACHE | | Doppelklick/Kontextmenue | `SSG_LIB_Commands` | SSG_BLOCKEDIT (dispatcht Kreisel->KreiselEdit, Omniflo->OMNI_EDIT, GF_*->GEFAELLESTRECKE_EDIT, VF_*->VARIOFOERDERER_EDIT) | @@ -103,7 +104,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | `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) | | `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_UPDATE_ATTRIBS | JSON-Sammlung und Python-Export (Omniflo-Merkmale/Sum-Zeile via lib/export_csv.py) | | `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_AP60/AP110, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen, Edit-Dialog | -| `SSG_LIB_Commands.lsp` | ILS_BTMT_Beladung, ILS_BTMT_Entladung, ILS_SCANNER_INSERT, ILS_SEPARATOR_INSERT, ILS_ETF_*, ILS_GK*_*, 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`) + Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher + Konfiguration (2D/3D, Sprache) | +| `SSG_LIB_Commands.lsp` | ILS_BTMT_Beladung, ILS_BTMT_Entladung, ILS_SCANNER_INSERT, ILS_SEPARATOR_INSERT, ILS_EINGANG_INSERT, ILS_AUSGANG_INSERT, ILS_ETF_*, ILS_GK*_*, 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 (`ils-insert-einausgang`: BTMT-Station picken statt Punkt waehlen, Symbol wird lotrecht `*ils-einausgang-z-offset*` = 800mm darueber gesetzt, Bloecke `Eingang_.dwg`/`Ausgang_.dwg` in data/ils) + Dummy-Befehle fuer Menue + 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. | | `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) | diff --git a/Lisp/SSG_LIB_Commands.lsp b/Lisp/SSG_LIB_Commands.lsp index c7845df..0c983fe 100644 --- a/Lisp/SSG_LIB_Commands.lsp +++ b/Lisp/SSG_LIB_Commands.lsp @@ -103,6 +103,81 @@ (ils-insert-station *ils-btmt-entladung-block*) ) +;; --- ILS / SPS: Eingang-/Ausgang-Symbol ueber einer BTMT-Station --- +;; +;; Markiert den Materialfluss-Ein-/Ausgang der Anlage (Block Eingang/Ausgang, +;; data/ils/Eingang_.dwg bzw. Ausgang_.dwg). Anders als +;; ils-insert-station (freie Punktwahl) wird hier eine bestehende +;; BTMT-Beladung/SC_Entladung-Instanz gewaehlt und das Symbol automatisch +;; lotrecht darueber gesetzt (gleiche X/Y, Z-Versatz *ils-einausgang-z-offset*) +;; - der Anwender pickt die Station, nicht den Einfuegepunkt. +(if (null *ils-einausgang-z-offset*) (setq *ils-einausgang-z-offset* 800.0)) + +;; Waehlt eine BTMT-Beladung/SC_Entladung-Instanz aus; liefert deren +;; Einfuegepunkt oder nil bei Abbruch/falschem Block. +(defun ils-pick-btmt-station ( / sel ent bname) + (setq sel (entsel (ssg-text "ils-einausgang-station-waehlen"))) + (if (null sel) + nil + (progn + (setq ent (car sel) + bname (cdr (assoc 2 (entget ent)))) + (if (not (wcmatch (strcase bname) + (strcat (strcase *ils-btmt-beladung-block*) "*," + (strcase *ils-btmt-entladung-block*) "*"))) + (progn (alert (ssg-textf "ils-einausgang-kein-btmt" (list bname))) nil) + (cdr (assoc 10 (entget ent))) + ) + ) + ) +) + +;; Fuegt rohname (Eingang/Ausgang) lotrecht ueber einer gewaehlten +;; BTMT-Station ein; wiederholbar bis ENTER/ESC. Rotation wie die uebrigen +;; ILS-Stationen interaktiv am Cursor (pause). +(defun ils-insert-einausgang (rohname / eff pt-station pt-sym n ent attribs) + (ssg-start (strcat "ILS " rohname) '(("OSMODE") ("ATTREQ") ("ATTDIA"))) + (setq eff (ssg-ils-block-laden rohname)) + (if (null eff) + (princ (ssg-textf "ils-station-fehler-blockdatei" (list (ssg-ils-blockname rohname)))) + (progn + (setvar "ATTREQ" 0) + (setvar "ATTDIA" 0) + (setq n 0) + (while (setq pt-station (ils-pick-btmt-station)) + (setq pt-sym (list (car pt-station) (cadr pt-station) + (+ (caddr pt-station) *ils-einausgang-z-offset*))) + (command "_.INSERT" eff pt-sym "" "" pause) + (if (> (getvar "CMDACTIVE") 0) (command)) + (if (> (getvar "CMDACTIVE") 0) (command)) + (setq ent (entlast)) + (if (and ent (= (cdr (assoc 0 (entget ent))) "INSERT")) + (progn + (setq attribs (ssg-attrib-read ent)) + (ils-block-layer-setzen ent eff attribs) + (if (and (assoc "ID" attribs) + (car (atoms-family 1 '("SSG-ID-GENERATE")))) + (ssg-id-generate ent) + ) + (setq n (1+ n)) + ) + ) + ) + (princ (ssg-textf "ils-station-fertig" (list (itoa n) eff))) + ) + ) + (ssg-end) + (princ) +) + +(defun c:ILS_EINGANG_INSERT () + (ils-insert-einausgang "Eingang") +) + +(defun c:ILS_AUSGANG_INSERT () + (ils-insert-einausgang "Ausgang") +) + ;; --- ILS / Zusatzmodul: Sensoren (Scanner / Separator) einfuegen --- ;; Ermittelt den Pfad zu einer Sensor-Blockdatei. Folgt der 2D/3D-Umschaltung diff --git a/data/ils/Ausgang_2D.dwg b/data/ils/Ausgang_2D.dwg new file mode 100644 index 0000000..a633161 Binary files /dev/null and b/data/ils/Ausgang_2D.dwg differ diff --git a/data/ils/Ausgang_3D.dwg b/data/ils/Ausgang_3D.dwg new file mode 100644 index 0000000..a633161 Binary files /dev/null and b/data/ils/Ausgang_3D.dwg differ diff --git a/data/ils/Eingang_2D.dwg b/data/ils/Eingang_2D.dwg new file mode 100644 index 0000000..8b356db Binary files /dev/null and b/data/ils/Eingang_2D.dwg differ diff --git a/data/ils/Eingang_3D.dwg b/data/ils/Eingang_3D.dwg new file mode 100644 index 0000000..8b356db Binary files /dev/null and b/data/ils/Eingang_3D.dwg differ diff --git a/lang/de_DE.json b/lang/de_DE.json index bf9079f..5b6d471 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -537,6 +537,8 @@ "ils-station-prompt-punkt": "\nEinfuegepunkt fuer %1 [ENTER=Ende]: ", "ils-station-fehler-blockdatei": "\n>>> FEHLER: Blockdatei '%1.dwg' nicht gefunden (data/ils pruefen).", "ils-station-fertig": "\n>>> %1 x %2 eingefuegt.", + "ils-einausgang-station-waehlen": "\nBTMT-Beladung/-Entladung waehlen [ENTER=Ende]: ", + "ils-einausgang-kein-btmt": "Block %1 ist keine BTMT-Beladung/-Entladung.", "layer-prompt-ziel-layer": "\nObjekt auf dem Ziel-Layer waehlen: ", "layer-prompt-objekt": "\nObjekt waehlen: ", "layer-prompt-referenz-objekt": "\nReferenz-Objekt waehlen (bestimmt Typ und Layer): ", diff --git a/lang/en_GB.json b/lang/en_GB.json index b6c3011..298973b 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -537,6 +537,8 @@ "ils-station-prompt-punkt": "\nInsertion point for %1 [ENTER=End]: ", "ils-station-fehler-blockdatei": "\n>>> ERROR: block file '%1.dwg' not found (check data/ils).", "ils-station-fertig": "\n>>> %1 x %2 inserted.", + "ils-einausgang-station-waehlen": "\nSelect BTMT loading/unloading station [ENTER=end]: ", + "ils-einausgang-kein-btmt": "Block %1 is not a BTMT loading/unloading station.", "layer-prompt-ziel-layer": "\nSelect object on the target layer: ", "layer-prompt-objekt": "\nSelect object: ", "layer-prompt-referenz-objekt": "\nSelect reference object (determines type and layer): ", diff --git a/lib/export_csv.py b/lib/export_csv.py index caef63f..5436223 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -306,12 +306,15 @@ def build_btmt_merkmale(block): Anders als build_sensor_merkmale ohne "Zuordnung": eine BTMT-Station ist keinem Kreisel/GF/VF-Carrier zugeordnet, das ZUORDNUNG-Attribut existiert - hier nicht.""" + hier nicht. + + Drehung wird auf ganze Grad gerundet (0, 90, 180, ...) - anders als bei + Separator/Scanner/Bogen/Weiche, wo Kommastellen Bedeutung haben.""" attribs = block.get("attribs", {}) return { "ARTINR": attribs.get("ARTINR", ""), "Höhe": get_hoehe(block), - "Drehung": get_drehung(block), + "Drehung": round(get_drehung(block)), } diff --git a/menu/SSG_LIB.mnu b/menu/SSG_LIB.mnu index 0b76ce7..d5cc958 100644 --- a/menu/SSG_LIB.mnu +++ b/menu/SSG_LIB.mnu @@ -118,6 +118,8 @@ [->Connections] [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 [<-Bearbeiten (Auto)]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT [<-SPS Schliessen]^C^C [->Export] diff --git a/tests/testdata/mubea.json b/tests/testdata/mubea.json index ca114cd..05a0648 100644 --- a/tests/testdata/mubea.json +++ b/tests/testdata/mubea.json @@ -328,5 +328,32 @@ "y": -2718.44, "z": 0, "rotation": 90.1019 + }, + { + "comment": "Eingang-Symbol lotrecht ueber der BTMT-Beladung (gleiche x/y, z+800)", + "function": "insert", + "block": "Eingang", + "x": 10341.61, + "y": -241.32, + "z": 2741, + "rotation": 270.4716 + }, + { + "comment": "Ausgang-Symbol lotrecht ueber SC_Entladung 1 (gleiche x/y, z+800)", + "function": "insert", + "block": "Ausgang", + "x": -407.79, + "y": -1478.08, + "z": 800, + "rotation": 90.4078 + }, + { + "comment": "Ausgang-Symbol lotrecht ueber SC_Entladung 2 (gleiche x/y, z+800)", + "function": "insert", + "block": "Ausgang", + "x": -404.22, + "y": -2718.44, + "z": 800, + "rotation": 90.1019 } ]