[ADD] Eingang-/Ausgang-Symbole ueber BTMT-Stationen + Drehung im CSV-Export gerundet

ILS_EINGANG_INSERT/ILS_AUSGANG_INSERT (Menue SPS > Connections) setzen
das Eingang-/Ausgang-Symbol automatisch lotrecht ueber eine gewaehlte
BTMT-Beladung/-Entladung-Instanz statt per freiem Einfuegepunkt.
Blockdateien Eingang_2D/3D.dwg und Ausgang_2D/3D.dwg ins Flach-Schema
von data/ils kopiert (Quellen in data/ils/2D|3D bleiben unangetastet).
Mubea-Testdaten um ein Eingang-Symbol ueber der Beladung und je ein
Ausgang-Symbol ueber beiden Entladungen erweitert.

Zusaetzlich: BTMT-Drehung im CSV-Export (export_csv.py) auf ganze
Grad gerundet (90/180/... statt z.B. 90.4078), da Kommastellen dort
keine Bedeutung haben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 16:17:41 +02:00
parent 5f3c99be10
commit 294fd6a8d7
11 changed files with 115 additions and 3 deletions
+2 -1
View File
@@ -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_<DIM>.dwg`/`Ausgang_<DIM>.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_<Typ>`) 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) |
+75
View File
@@ -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_<DIM>.dwg bzw. Ausgang_<DIM>.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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2
View File
@@ -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): ",
+2
View File
@@ -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): ",
+5 -2
View File
@@ -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)),
}
+2
View File
@@ -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]
+27
View File
@@ -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
}
]