feat: ILS-Bloecke ueber eindeutige 2D/3D-Namen laden + Auto-Layer
Zentrale Namensaufloesung (ssg-ils-datei-und-name, dual-schema: neu data/ils/<name>_<dim>.dwg mit eindeutigem In-Zeichnungs-Namen, alt Unterordner als Fallback). ensure-block-loaded liefert den aufgeloesten Namen; die insert-Helfer weisen blockname neu zu und setzen die INSERT-Referenz automatisch auf die eigene Ebene des Blocks (ssg-ils-block-auf-ebene, legt sie bei Bedarf an). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+92
-56
@@ -329,71 +329,107 @@
|
||||
"/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)
|
||||
;; Liefert (datei . realname): vollstaendiger .dwg-Pfad UND der Name, unter dem
|
||||
;; der Block in der Zeichnung erscheint. Zwei Schemata (uebergangsweise beide):
|
||||
;; NEU (flach, eindeutig): data/ils/<base>_<dim>.dwg -> realname <base>_<dim>
|
||||
;; (Fallback <base>_3D, falls die aktuelle Dim-Datei fehlt)
|
||||
;; ALT (Unterordner): data/ils/<dim>/<base>.dwg -> realname <base>
|
||||
;; (Fallback data/ils/3D/<base>.dwg)
|
||||
;; Rueckgabe nil, wenn nichts gefunden.
|
||||
(defun ssg-ils-datei-und-name (base / basis dim f)
|
||||
(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))
|
||||
)
|
||||
)
|
||||
)
|
||||
((findfile (setq f (strcat basis base "_" dim ".dwg"))) (cons f (strcat base "_" dim)))
|
||||
((findfile (setq f (strcat basis base "_3D.dwg"))) (cons f (strcat base "_3D")))
|
||||
((findfile (setq f (strcat basis dim "/" base ".dwg"))) (cons f base))
|
||||
((findfile (setq f (strcat basis "3D/" base ".dwg"))) (cons f base))
|
||||
(t nil)))))
|
||||
|
||||
;; Merker: welche Dimension ("2D"/"3D") aktuell je Blockname geladen ist.
|
||||
;; (blockname . dim). Verhindert unnoetiges Neu-Definieren bei gleicher Dim.
|
||||
;; Nur der Dateipfad (fuer Aufrufer, die per Pfad einfuegen, z.B. Sensoren).
|
||||
(defun ssg-ils-block-datei (base / dn)
|
||||
(setq dn (ssg-ils-datei-und-name base))
|
||||
(if dn (car dn) nil))
|
||||
|
||||
;; Merker: welche Dimension je (ALT-Schema) Blockname geladen ist.
|
||||
(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)))))
|
||||
;; Stellt sicher, dass der Block geladen ist, und liefert den IN-ZEICHNUNGS-
|
||||
;; NAMEN zurueck, unter dem einzufuegen ist (bzw. nil bei Fehler).
|
||||
;; NEU-Schema: eindeutiger Name (<base>_<dim>) -> einmal laden, kein Redefine.
|
||||
;; ALT-Schema: Name = <base> (2D/3D teilen den Namen) -> bei Dimwechsel aus
|
||||
;; der Datei neu definieren (Redefine).
|
||||
(defun ssg-ils-block-laden (base / dn datei realname dim temp-obj osm areq adia)
|
||||
(setq dn (ssg-ils-datei-und-name base))
|
||||
(if (null dn)
|
||||
nil
|
||||
(progn
|
||||
(setq datei (car dn) realname (cdr dn))
|
||||
(if (/= realname base)
|
||||
;; ---- NEU-Schema (eindeutiger Name) ----
|
||||
(progn
|
||||
(if (not (tblsearch "BLOCK" realname))
|
||||
(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)))
|
||||
realname)
|
||||
;; ---- ALT-Schema (gemeinsamer Name, Uebergang) ----
|
||||
(progn
|
||||
(setq dim (ssg-ils-dim-aktuell))
|
||||
(if (not (and (tblsearch "BLOCK" base)
|
||||
(equal (cdr (assoc base *ssg-ils-dim-geladen*)) dim)))
|
||||
(if (tblsearch "BLOCK" base)
|
||||
(progn
|
||||
(setq areq (getvar "ATTREQ") adia (getvar "ATTDIA") osm (getvar "OSMODE"))
|
||||
(setvar "ATTREQ" 0)(setvar "ATTDIA" 0)(setvar "OSMODE" 0)
|
||||
(command "_.-INSERT" (strcat base "=" datei) "_Y")
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(setvar "OSMODE" osm)(setvar "ATTREQ" areq)(setvar "ATTDIA" adia))
|
||||
(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))))
|
||||
(setq *ssg-ils-dim-geladen*
|
||||
(cons (cons base dim)
|
||||
(vl-remove-if (function (lambda (p) (equal (car p) base)))
|
||||
*ssg-ils-dim-geladen*)))
|
||||
base)))))
|
||||
|
||||
;; Ermittelt die "eigene" Ebene eines geladenen Blocks: haeufigste Ebene (ausser
|
||||
;; "0") seiner Definition-Entities; nil, wenn nur "0".
|
||||
(defun ssg-ils-block-ebene (realname / blocks blk e lay pair counts best best-n c)
|
||||
(if (and realname (tblsearch "BLOCK" realname))
|
||||
(progn
|
||||
(setq blocks (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
|
||||
(setq blk (vla-item blocks realname))
|
||||
(setq counts '())
|
||||
(vlax-for e blk
|
||||
(setq lay (vla-get-Layer e))
|
||||
(if (and lay (/= lay "0"))
|
||||
(progn
|
||||
(setq pair (assoc lay counts))
|
||||
(if pair
|
||||
(setq counts (subst (cons lay (1+ (cdr pair))) pair counts))
|
||||
(setq counts (cons (cons lay 1) counts))))))
|
||||
(setq best nil best-n 0)
|
||||
(foreach c counts (if (> (cdr c) best-n) (setq best (car c) best-n (cdr c))))
|
||||
best)
|
||||
nil))
|
||||
|
||||
;; Setzt die INSERT-Referenz (VLA-Objekt) auf die eigene Ebene ihres Blocks
|
||||
;; (legt die Ebene an, falls noetig). No-op, wenn keine eigene Ebene ermittelbar.
|
||||
(defun ssg-ils-block-auf-ebene (obj realname / eb)
|
||||
(setq eb (ssg-ils-block-ebene realname))
|
||||
(if (and eb obj)
|
||||
(progn
|
||||
(if (not (tblsearch "LAYER" eb)) (ssg-make-layer eb 7 nil))
|
||||
(vl-catch-all-apply (function (lambda () (vla-put-Layer obj eb))))))
|
||||
obj)
|
||||
|
||||
;; ------------------------------------------------------------
|
||||
;; DIMENSIONS-XDATA (2D/3D) je Block - App "SSG_DIM"
|
||||
|
||||
Reference in New Issue
Block a user