[CHANGE] Verzeichnisse ILS 2d und 3d zusammengeführt und Funktionen entsprechend angepasst; TODO: Vario auf/ab Bögen schalten noch nicht korrekt zwischen 2d und 3d hin und her; TODO: Omniflo Verzeichnisse 2d/3d entsprechend genau so zusammenführen
This commit is contained in:
+91
-50
@@ -329,71 +329,112 @@
|
||||
"/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
|
||||
;; Effektiver Blockname zu einem ROH-Namen fuer eine EXPLIZITE Dimension.
|
||||
;; Seit dem Flach-Refactor tragen Blocknamen das Dimensionssuffix _2D/_3D, damit
|
||||
;; 2D- und 3D-Variante gleichzeitig in einer Zeichnung existieren koennen
|
||||
;; (Datei = Blockname + ".dwg", flach unter data/ils/). Ausnahmen ohne Suffix:
|
||||
;; - Koordinaten-/Subbloecke KS_EIN/KS_AUS/KSYS_*/K1..K4 (exakte Export-Matches),
|
||||
;; - bereits mit _2D/_3D versehene Namen (kein doppeltes Anhaengen).
|
||||
(defun ssg-ils-blockname-dim (roh dim / )
|
||||
(cond
|
||||
((wcmatch (strcase roh) "KS_EIN,KS_AUS,KSYS_EIN,KSYS_AUS,K1,K2,K3,K4") roh)
|
||||
((wcmatch (strcase roh) "*_2D,*_3D") roh)
|
||||
(t (strcat roh "_" dim))))
|
||||
|
||||
;; Effektiver Blockname fuer die AKTUELLE Dimension (siehe ssg-ils-dim-aktuell).
|
||||
(defun ssg-ils-blockname (roh / )
|
||||
(ssg-ils-blockname-dim roh (ssg-ils-dim-aktuell)))
|
||||
|
||||
;; Liefert den vollstaendigen .dwg-Pfad (flache Ablage data/ils/<blockname>.dwg)
|
||||
;; zu einem ROH-Blocknamen fuer eine EXPLIZITE Dimension. Faellt automatisch auf
|
||||
;; die 3D-Variante zurueck, wenn die Datei der gewuenschten 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)
|
||||
(defun ssg-ils-block-datei-dim (blockname dim / basis 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"))
|
||||
(setq datei (strcat basis (ssg-ils-blockname-dim blockname dim) ".dwg"))
|
||||
(setq datei3d (strcat basis (ssg-ils-blockname-dim blockname "3D") ".dwg"))
|
||||
(cond
|
||||
((findfile datei) datei) ; aktuelle Dimension
|
||||
((findfile datei) datei) ; gewuenschte 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* '()))
|
||||
;; Wie ssg-ils-block-datei-dim, aber fuer die AKTUELLE Dimension.
|
||||
(defun ssg-ils-block-datei (blockname / )
|
||||
(ssg-ils-block-datei-dim blockname (ssg-ils-dim-aktuell)))
|
||||
|
||||
;; 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 die Block-DEFINITION zum ROH-Namen 'blockname' in einer
|
||||
;; EXPLIZITEN Dimension geladen ist. Blocknamen tragen das Suffix _2D/_3D
|
||||
;; (siehe ssg-ils-blockname-dim), daher koennen 2D und 3D gleichzeitig existieren.
|
||||
;; WICHTIG: Ein bereits vorhandener gleichnamiger Block wird IMMER neu aus der
|
||||
;; Datei definiert (Redefine), damit sein Inhalt zur aktuellen Datei passt. Sonst
|
||||
;; bliebe eine veraltete Definition (z.B. mit falschem 2D/3D-Inhalt aus einer
|
||||
;; frueheren Sitzung) bestehen und wuerde wiederverwendet.
|
||||
;; Rueckgabe: effektiver (suffigierter) Blockname oder nil (Datei nicht gefunden).
|
||||
(defun ssg-ils-block-laden-dim (blockname dim / eff datei base temp-obj osm areq adia)
|
||||
(setq eff (ssg-ils-blockname-dim blockname dim))
|
||||
(setq datei (ssg-ils-block-datei-dim blockname dim))
|
||||
(if (null datei)
|
||||
nil
|
||||
(progn
|
||||
(setq base (vl-filename-base datei))
|
||||
;; --- TEMP-DIAGNOSE (nach Klaerung wieder entfernen) ---
|
||||
(princ (strcat "\n[SSG-DBG] roh=" blockname " dim=" dim
|
||||
" eff=" eff
|
||||
" existiert-vorher=" (if (tblsearch "BLOCK" eff) "JA" "NEIN")
|
||||
" datei=" datei))
|
||||
;; --- ENDE TEMP-DIAGNOSE ---
|
||||
;; Sichtbar machen, wenn die Datei der gewuenschten Dimension fehlt und der
|
||||
;; 3D-Fallback greift (dann traegt der Block den gewuenschten Namen, aber
|
||||
;; den Inhalt der anderen Dimension = potenziell falsche Referenz). Jeder
|
||||
;; aktiv eingefuegte Block sollte in BEIDEN Dimensionen vorliegen.
|
||||
(if (not (= (strcase base) (strcase eff)))
|
||||
(princ (strcat "\n[SSG] WARNUNG: Blockdatei '" eff
|
||||
".dwg' fehlt - Fallback auf '" base
|
||||
".dwg' (Inhalt evtl. andere Dimension).")))
|
||||
(if (and (not (tblsearch "BLOCK" eff)) (= (strcase base) (strcase eff)))
|
||||
;; Neu UND Dateiname == Blockname -> COM-Weg (kein 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))
|
||||
;; Sonst (Block existiert bereits ODER Dateiname != Blockname wg.
|
||||
;; 3D-Fallback) -> aus Datei (neu) definieren. "_Y" beantwortet die
|
||||
;; Redefine-Abfrage, falls der Block bereits vorhanden ist; danach die
|
||||
;; laufende Einfuegung sofort abbrechen (Definition ist bereits wirksam).
|
||||
(progn
|
||||
(setq areq (getvar "ATTREQ") adia (getvar "ATTDIA") osm (getvar "OSMODE"))
|
||||
(setvar "ATTREQ" 0)(setvar "ATTDIA" 0)(setvar "OSMODE" 0)
|
||||
(if (tblsearch "BLOCK" eff)
|
||||
(command "_.-INSERT" (strcat eff "=" datei) "_Y") ; Redefine bestehender Block
|
||||
(command "_.-INSERT" (strcat eff "=" datei))) ; neu (kein Redefine-Prompt)
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(if (> (getvar "CMDACTIVE") 0) (command))
|
||||
(setvar "OSMODE" osm)(setvar "ATTREQ" areq)(setvar "ATTDIA" adia)))
|
||||
;; --- TEMP-DIAGNOSE: verschachtelte Blocknamen in eff auflisten ---
|
||||
(if (tblsearch "BLOCK" eff)
|
||||
(progn
|
||||
(princ (strcat "\n[SSG-DBG] nested in " eff ":"))
|
||||
(vl-catch-all-apply
|
||||
(function (lambda ()
|
||||
(vlax-for e (vla-Item
|
||||
(vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
|
||||
eff)
|
||||
(if (= (vla-get-ObjectName e) "AcDbBlockReference")
|
||||
(princ (strcat " [" (vla-get-Name e) "]")))))))))
|
||||
;; --- ENDE TEMP-DIAGNOSE ---
|
||||
eff)))
|
||||
|
||||
;; Wie ssg-ils-block-laden-dim, aber fuer die AKTUELLE Dimension.
|
||||
(defun ssg-ils-block-laden (blockname / )
|
||||
(ssg-ils-block-laden-dim blockname (ssg-ils-dim-aktuell)))
|
||||
|
||||
;; ------------------------------------------------------------
|
||||
;; DIMENSIONS-XDATA (2D/3D) je Block - App "SSG_DIM"
|
||||
|
||||
Reference in New Issue
Block a user