[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
+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 ---