[ADD] ILS Zusatzmodule Einfügefunktion und 3D Modelle implementiert

This commit is contained in:
2026-08-04 11:23:40 +02:00
parent fd29b8d9bf
commit 49652b2744
12 changed files with 151 additions and 22 deletions
+31 -7
View File
@@ -35,7 +35,6 @@ am Label-Anfang, bei Submenue-Schliessern hinter dem `<-` (`[<-~Label]`).
| Menuebereich | Eintraege | Definiert in |
| --- | --- | --- |
| ILS ▸ Zusatzmodul | BTMT-Beladung, BTMT-Entladung | `SSG_LIB_Commands.lsp` |
| ILS ▸ Foerderer | Durch TEF angetriebene Strecke; Kurven 90/60/30 links/rechts angetrieben Aussen + Innen (12) | `SSG_LIB_Commands.lsp` |
| ILS ▸ Gefaellestrecke | Kurven 90/60/30 links/rechts Gefaellestrecke (6) | `SSG_LIB_Commands.lsp` |
| Omniflo ▸ TEF Elemente | UmlenkR/L, AntriebL/R, TEF Gerade, KettenFoerderer (6) | `OmniModulInsert.lsp` |
@@ -43,8 +42,9 @@ am Label-Anfang, bei Submenue-Schliessern hinter dem `<-` (`[<-~Label]`).
| Omniflo ▸ Boegen fuer Weichen | alle `OMNI_APBW_*` (14) | `OmniModulInsert.lsp` |
Aktiv (implementiert) sind u.a.: Kreisel, Eckrad, VarioFoerderer, EtageVarioFoerderer,
Gefaellestrecke, Omniflo Boegen (APB), Aluprofil-Geraden (AP), alle Weichen
(W90/W45/WP/WK/WKomb), Export (Sivas/CSV) und die Tests.
Gefaellestrecke, BTMT Be-/Entladung, Scanner/Separator, Omniflo Boegen (APB),
Aluprofil-Geraden (AP), alle Weichen (W90/W45/WP/WK/WKomb), Export (Sivas/CSV)
und die Tests.
---
@@ -494,11 +494,11 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind
---
### `SSG_LIB_Commands.lsp` Dummy-Befehle, Sensoren, Konfiguration und SSG_BLOCKEDIT
### `SSG_LIB_Commands.lsp` BTMT, Sensoren, Dummy-Befehle, Konfiguration und SSG_BLOCKEDIT
Sammeldatei fuer Menue-Befehle: teils Platzhalter fuer noch nicht implementierte
Eintraege, teils bereits **echte** Funktionalitaet (Sensoren, Konfiguration,
Doppelklick-Dispatcher). Alle noch offenen Dummy-Menueintraege sind in
Eintraege, teils bereits **echte** Funktionalitaet (BTMT Be-/Entladung, Sensoren,
Konfiguration, Doppelklick-Dispatcher). Alle noch offenen Dummy-Menueintraege sind in
`menu/SSG_LIB.mnu` mit `~` ausgegraut (siehe Abschnitt
["Status: noch offene Menueintraege"](#status-noch-offene-menueintraege-im-menue-ausgegraut)).
@@ -510,11 +510,35 @@ mit interaktivem Einfuegepunkt/Rotation, Blockdatei via `ssg-ils-block-datei`):
| `ILS_SCANNER_INSERT` | `Scanner` | Scanner wiederholt einfuegen (ENTER/ESC beendet) |
| `ILS_SEPARATOR_INSERT` | `Separator_SP` | Separator wiederholt einfuegen (Menue „Separator einfuegen") |
**BTMT Be-/Entladestation einfuegen** (real, ueber `ils-insert-station`):
| Befehl | ROH-Block | Datei (3D) | Beschreibung |
| --- | --- | --- | --- |
| `ILS_BTMT_Beladung` | `BTMT-Beladung` | `BTMT-Beladung_3D.dwg` | Beladestation wiederholt einfuegen (ENTER/ESC beendet) |
| `ILS_BTMT_Entladung` | `SC_Entladung` | `SC_Entladung_3D.dwg` | Entladestation wiederholt einfuegen (ENTER/ESC beendet) |
Ablauf je Einfuegung: Einfuegepunkt abfragen → `_.INSERT` mit interaktiver
Drehung (`pause`) → Layer aus dem `LAYER`-Attribut bzw. der eigenen Ebene der
Blockdefinition setzen (`ils-block-layer-setzen`, gleiche Konvention wie
`omni:insert-dxf`/`tefl-insert-element`) → `ssg-id-generate`, **falls** der Block
ein `ID`-Attribut fuehrt.
Die Blockdefinition kommt aus `ssg-ils-block-laden` (aktuelle Dimension
`*ssg-ils-dim*``DXFM_DIM``3D`, DWG wird nur einmal pro Zeichnung gelesen);
eingefuegt wird der zurueckgegebene dim-suffigierte Blockname. Fehlt die Datei
der gewuenschten Dimension, greift der 3D-Fallback mit Warnung aktuell fuer
`BTMT-Beladung_2D.dwg`; sobald diese Datei in `data/ils/` liegt, wird sie im
2D-Modus ohne Codeaenderung verwendet (`SC_Entladung_2D.dwg` existiert bereits).
> Hinweis: Beide Stationen werden von `ssg-id-collect-blocks` (`ssg_id.lsp`) und
> den `blockpattern`-Mustern in `cfg/export.cfg` **nicht** erfasst sie
> erscheinen daher noch nicht im Sivas-/CSV-Export.
Registrierte Dummy-Befehle:
| Gruppe | Befehle |
| --- | --- |
| ILS Zusatzmodule | `ILS_BTMT_Beladung`, `ILS_BTMT_Entladung`, `ILS_ETF_Etagenfoerderer`, `ILS_TEF_Strecke` |
| ILS Zusatzmodule | `ILS_ETF_Etagenfoerderer`, `ILS_TEF_Strecke` |
| ILS Kurven angetrieben Aussen | `ILS_K90LA`, `ILS_K90RA`, `ILS_K60LA`, `ILS_K60RA`, `ILS_K30LA`, `ILS_K30RA` |
| ILS Kurven angetrieben Innen | `ILS_K90LI`, `ILS_K90RI`, `ILS_K60LI`, `ILS_K60RI`, `ILS_K30LI`, `ILS_K30RI` |
| ILS Gefaellestrecken-Kurven | `ILS_Gefaellestrecke`, `ILS_GK90L`, `ILS_GK90R`, `ILS_GK60L`, `ILS_GK60R`, `ILS_GK30L`, `ILS_GK30R` |
+107 -8
View File
@@ -1,18 +1,117 @@
;; ============================================================
;; SSG_LIB - Dummy-Befehlsdefinitionen fuer Menue SSG_LIB
;; Jeder Befehl gibt eine Meldung aus und kann spaeter
;; durch echte Funktionalitaet ersetzt werden.
;; SSG_LIB - Befehlsdefinitionen fuer Menue SSG_LIB
;; Enthaelt implementierte Befehle (BTMT Be-/Entladung, Sensoren,
;; Konfiguration, SSG_BLOCKEDIT) und Dummy-Befehle, die nur eine
;; Meldung ausgeben und spaeter durch echte Funktionalitaet
;; ersetzt werden.
;; ============================================================
;; --- ILS / Zusatzmodul ---
(defun c:ILS_BTMT_Beladung ()
(princ "\n[DUMMY] ILS_BTMT_Beladung aufgerufen")
;; ssg-ils-block-ebene (ssg_core.lsp) arbeitet ueber die VLA-Blocktabelle
(vl-load-com)
;; --- ILS / Zusatzmodul: BTMT Be-/Entladestation einfuegen ---
;; ROH-Blocknamen (ohne Dimensionssuffix) der beiden Stationen. Das Suffix
;; _2D/_3D haengt zentral ssg-ils-blockname-dim an; die BTMT-Entladung liegt
;; als SC_Entladung_<DIM>.dwg in data/ils.
(if (null *ils-btmt-beladung-block*) (setq *ils-btmt-beladung-block* "BTMT-Beladung"))
(if (null *ils-btmt-entladung-block*) (setq *ils-btmt-entladung-block* "SC_Entladung"))
;; Layer einer frisch eingefuegten Blockreferenz setzen: bevorzugt aus dem
;; LAYER-Attribut des Blocks (gleiche Konvention wie omni:insert-dxf in
;; OmniModulInsert.lsp und tefl-insert-element in TEFInsert.lsp), sonst aus der
;; "eigenen" Ebene der Blockdefinition (ssg-ils-block-ebene). Liefert der Block
;; beides nicht, bleibt die Referenz auf dem aktuellen Layer.
;; Rueckgabe: gesetzter Layername oder nil.
(defun ils-block-layer-setzen (ent realname attribs / lay)
(setq lay (cdr (assoc "LAYER" attribs)))
(if (or (null lay) (= lay ""))
(setq lay (ssg-ils-block-ebene realname))
)
(if (and lay (/= lay ""))
(progn
(ssg-make-layer lay 7 nil)
(entmod (subst (cons 8 lay) (assoc 8 (entget ent)) (entget ent)))
(entupd ent)
lay
)
)
)
;; Fuegt eine ILS-Station (BTMT-Beladung/SC_Entladung) wiederholt ein, bis der
;; Benutzer mit ENTER oder ESC abbricht. Je Einfuegung wird der Einfuegepunkt
;; abgefragt, die Drehung bestimmt der Benutzer interaktiv am Cursor (pause).
;;
;; Die Blockdefinition kommt ueber den zentralen Loader in der AKTUELLEN
;; Dimension (ssg-ils-block-laden: *ssg-ils-dim* -> DXFM_DIM, Default 3D);
;; eingefuegt wird danach der zurueckgegebene effektive, dim-suffigierte
;; Blockname. Fehlt die Datei der gewuenschten Dimension, greift der
;; 3D-Fallback aus ssg-ils-block-datei-dim (mit Warnung) - sobald also z.B.
;; BTMT-Beladung_2D.dwg in data/ils liegt, wird sie im 2D-Modus automatisch
;; verwendet, ohne Codeaenderung. Anders als ils-insert-sensor wird hier NICHT
;; per Dateipfad eingefuegt: das laedt die DWG bei jeder Einfuegung erneut von
;; der Platte, was bei den grossen 3D-Stationen (BTMT-Beladung_3D ~5 MB) teuer
;; ist - der Loader liest sie dagegen nur einmal pro Zeichnung
;; (Redefine-Sperre, siehe ssg_core.lsp).
(defun ils-insert-station (rohname / eff res pt vorher ent attribs n)
(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)
;; Punkt abfragen; ENTER liefert nil, ESC einen abgefangenen Fehler -
;; beides beendet die Schleife sauber (ssg-end stellt danach die
;; Systemvariablen wieder her).
(while
(progn
(setq res (vl-catch-all-apply
'getpoint
(list (ssg-textf "ils-station-prompt-punkt" (list eff)))))
(and (not (vl-catch-all-error-p res)) res)
)
(setq pt res)
(setq vorher (entlast))
(command "_.INSERT" eff pt "" "" pause)
;; Laufende Einfuegung sicher beenden (z.B. ESC waehrend der Drehung).
(if (> (getvar "CMDACTIVE") 0) (command))
(if (> (getvar "CMDACTIVE") 0) (command))
(setq ent (entlast))
;; Nur weiterarbeiten, wenn wirklich eine neue Blockreferenz entstanden
;; ist (abgebrochene Einfuegung liefert weiterhin 'vorher').
(if (and ent (not (eq ent vorher))
(= (cdr (assoc 0 (entget ent))) "INSERT"))
(progn
(setq attribs (ssg-attrib-read ent))
(ils-block-layer-setzen ent eff attribs)
;; ID nur vergeben, wenn der Block ueberhaupt ein ID-Attribut fuehrt:
;; ohne ID-ATTDEF verwirft ssg-attrib-set-on die Zuweisung still und
;; die Meldung aus ssg-id-generate waere irrefuehrend (siehe
;; ssg-id-set-and-verify in ssg_id.lsp).
(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_BTMT_Beladung ()
(ils-insert-station *ils-btmt-beladung-block*)
)
(defun c:ILS_BTMT_Entladung ()
(princ "\n[DUMMY] ILS_BTMT_Entladung aufgerufen")
(princ)
(ils-insert-station *ils-btmt-entladung-block*)
)
;; --- ILS / Zusatzmodul: Sensoren (Scanner / Separator) einfuegen ---