2D/3D-Umschaltung pro GF/VF-Block (Dialog-Auswahl + Auto-Erkennung via XDATA) und Batch Alle auf 2D/3D
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user