[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:
2026-07-24 13:00:33 +02:00
parent 60c20519a0
commit b16c2e0fa1
160 changed files with 211 additions and 153 deletions
+91 -50
View File
@@ -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"