2D/3D-Umschaltung pro GF/VF-Block (Dialog-Auswahl + Auto-Erkennung via XDATA) und Batch Alle auf 2D/3D

This commit is contained in:
2026-07-23 14:01:52 +02:00
parent 6d81b30628
commit 39a4656f38
11 changed files with 370 additions and 79 deletions
+117
View File
@@ -285,6 +285,123 @@
bname
)
;; ------------------------------------------------------------
;; ILS-BLOCKDATEI AUFLOESEN (2D/3D-Umschaltung)
;; ------------------------------------------------------------
;; Aktuell gueltige Dimension ("2D"/"3D") ermitteln, in dieser Reihenfolge:
;; 1) transienter Override *ssg-ils-dim* (fuer gezielten Neubau in EINER
;; Dimension, z.B. Edit-Umschaltung oder Batch-Umwandlung),
;; 2) globaler Modus DXFM_DIM (Default fuer Neubauten),
;; 3) "3D" als Grund-Default.
(defun ssg-ils-dim-aktuell ( / )
(cond
((and (boundp '*ssg-ils-dim*) (= (type *ssg-ils-dim*) 'STR)) *ssg-ils-dim*)
((= (type (getenv "DXFM_DIM")) 'STR) (getenv "DXFM_DIM"))
(t "3D")))
;; Basisverzeichnis der ILS-Bloecke (…/data/ils/) oder nil.
(defun ssg-ils-basis ( / )
(cond
((and (getenv "DXFMAKRO") (= (type (getenv "DXFMAKRO")) 'STR))
(strcat (vl-string-right-trim "/" (vl-string-translate "\\" "/" (getenv "DXFMAKRO")))
"/data/ils/"))
((and (boundp '*ssg-lisp-pfad*) (= (type *ssg-lisp-pfad*) 'STR)
(vl-string-search "/Lisp" *ssg-lisp-pfad*))
(strcat (substr *ssg-lisp-pfad* 1 (vl-string-search "/Lisp" *ssg-lisp-pfad*))
"/data/ils/"))
(t nil)))
;; Liefert den vollstaendigen .dwg-Pfad zu einem ILS-Block anhand der
;; aktuellen Dimension (siehe ssg-ils-dim-aktuell). Faellt automatisch auf die
;; 3D-Variante zurueck, wenn der Block in der aktuellen Dimension (noch) nicht
;; existiert - so nutzen z.B. Vario_Motorstation/-Umlenkstation im 2D-Modus
;; vorlaeufig die 3D-Datei.
;; Rueckgabe: Pfad-String oder nil (Block weder in Dim noch in 3D gefunden).
(defun ssg-ils-block-datei (blockname / basis dim datei datei3d)
(setq basis (ssg-ils-basis))
(if (null basis)
nil
(progn
(setq dim (ssg-ils-dim-aktuell))
(setq datei (strcat basis dim "/" blockname ".dwg"))
(setq datei3d (strcat basis "3D/" blockname ".dwg"))
(cond
((findfile datei) datei) ; aktuelle Dimension
((findfile datei3d) datei3d) ; Fallback: 3D-Variante
(t nil))
)
)
)
;; Merker: welche Dimension ("2D"/"3D") aktuell je Blockname geladen ist.
;; (blockname . dim). Verhindert unnoetiges Neu-Definieren bei gleicher Dim.
(if (not (boundp '*ssg-ils-dim-geladen*)) (setq *ssg-ils-dim-geladen* '()))
;; Stellt sicher, dass die Block-DEFINITION 'blockname' in der AKTUELLEN
;; Dimension geladen ist. Weil 2D- und 3D-Datei denselben Blocknamen tragen,
;; muss bei einem Dimensionswechsel aus der Zieldatei NEU definiert werden -
;; sonst bliebe die alte Definition (z.B. 3D) erhalten.
;; Rueckgabe: T (geladen/vorhanden) oder nil (Datei nicht gefunden).
(defun ssg-ils-block-laden (blockname / dim exists datei temp-obj osm areq adia)
(setq dim (ssg-ils-dim-aktuell))
(setq exists (tblsearch "BLOCK" blockname))
(cond
;; Schon in der gewuenschten Dimension geladen -> nichts tun.
((and exists (equal (cdr (assoc blockname *ssg-ils-dim-geladen*)) dim)) T)
(t
(setq datei (ssg-ils-block-datei blockname))
(if (null datei)
nil
(progn
(if exists
;; Existiert (evtl. andere Dimension) -> aus Datei NEU definieren.
;; "_Y" beantwortet die Redefine-Abfrage; danach wird die eigentliche
;; Einfuegung abgebrochen (die Neudefinition ist bereits wirksam).
(progn
(setq areq (getvar "ATTREQ") adia (getvar "ATTDIA") osm (getvar "OSMODE"))
(setvar "ATTREQ" 0)(setvar "ATTDIA" 0)(setvar "OSMODE" 0)
(command "_.-INSERT" (strcat blockname "=" datei) "_Y")
;; laufende Einfuegung abbrechen (Neudefinition ist bereits wirksam)
(if (> (getvar "CMDACTIVE") 0) (command))
(if (> (getvar "CMDACTIVE") 0) (command))
(setvar "OSMODE" osm)(setvar "ATTREQ" areq)(setvar "ATTDIA" adia))
;; Neu -> bewaehrter COM-Weg (kein Redefine-Prompt).
(progn
(setq temp-obj (vla-InsertBlock modelspace
(vlax-3D-point '(0 0 0)) datei 1.0 1.0 1.0 0))
(vla-Delete temp-obj)))
;; Merker aktualisieren (alten Dim-Eintrag dieses Blocks ersetzen).
(setq *ssg-ils-dim-geladen*
(cons (cons blockname dim)
(vl-remove-if (function (lambda (p) (equal (car p) blockname)))
*ssg-ils-dim-geladen*)))
T)))))
;; ------------------------------------------------------------
;; DIMENSIONS-XDATA (2D/3D) je Block - App "SSG_DIM"
;; ------------------------------------------------------------
;; Merkt sich, in welcher Dimension ein GF_/VF_-Block gebaut wurde, damit der
;; Doppelklick-Edit die aktuelle Dimension automatisch erkennen kann. Bewusst
;; getrennt vom fachlichen XDATA/Attributsatz (Export bleibt unveraendert).
(if (null *ssg-dim-xdata-app*) (setq *ssg-dim-xdata-app* "SSG_DIM"))
(defun ssg-dim-xdata-schreiben (ent dim / )
(if (and ent dim)
(progn
(regapp *ssg-dim-xdata-app*)
(entmod
(append (entget ent)
(list (list -3 (list *ssg-dim-xdata-app* (cons 1000 dim))))))))
ent)
;; Rueckgabe: "2D"/"3D" oder nil (kein Eintrag -> Aufrufer nimmt Default 3D).
(defun ssg-dim-xdata-lesen (ent / xd app-data)
(setq xd (entget ent (list *ssg-dim-xdata-app*)))
(setq app-data (cdr (assoc -3 xd)))
(if app-data
(car (mapcar 'cdr (cdr (car app-data))))
nil))
;; ------------------------------------------------------------
;; ATTRIBUT-OPERATIONEN