diff --git a/Lisp/SSG_LIB_Commands.lsp b/Lisp/SSG_LIB_Commands.lsp index ce89910..a68c6ed 100644 --- a/Lisp/SSG_LIB_Commands.lsp +++ b/Lisp/SSG_LIB_Commands.lsp @@ -307,7 +307,7 @@ ;; SSG_DIM_ALL_2D / SSG_DIM_ALL_3D - alle GF/VF-Bloecke der Zeichnung ;; auf einmal in 2D bzw. 3D umwandeln (loeschen + neu aufbauen). ;; ============================================================ -(defun ssg-dim-alle-umwandeln (ziel-dim / ss i enames ent bname akt n-gf n-vf n-skip) +(defun ssg-dim-alle-umwandeln (ziel-dim / ss i enames ent bname akt marker n-gf n-vf n-skip) ;; Feature-Module sicherstellen (Konverter-Funktionen + Bau-Logik) (if (car (atoms-family 1 '("SSG-ENSURE"))) (progn (ssg-ensure "Gefaellestrecke") (ssg-ensure "VarioFoerderer"))) @@ -332,7 +332,19 @@ ((wcmatch bname "GF_*") (if (gf-konvertiere-ent ent ziel-dim) (setq n-gf (1+ n-gf)))) ((wcmatch bname "VF_*") - (if (vf-konvertiere-ent ent ziel-dim) (setq n-vf (1+ n-vf)))))))) + ;; VF_-Bloecke nach Edit-Marker unterscheiden: Standard/Etage + ;; ueber vf-konvertiere-ent, Linienzug (Modus 1/2) ueber den + ;; Journal-Replay-Konverter vfl-konvertiere-ent. Altbestand ohne + ;; bekannten Marker wird uebersprungen. + (setq marker (car (vfs-xdata-lesen ent))) + (cond + ((member marker '("linienzug" "linienzug2")) + (if (vfl-konvertiere-ent ent ziel-dim) (setq n-vf (1+ n-vf)) + (setq n-skip (1+ n-skip)))) + ((member marker '("standard" "etage")) + (if (vf-konvertiere-ent ent ziel-dim) (setq n-vf (1+ n-vf)) + (setq n-skip (1+ n-skip)))) + (t (setq n-skip (1+ n-skip))))))))) ) ) (ssg-end) diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index df6aadd..c99fcb4 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -2829,6 +2829,13 @@ ;; Aufsteigende, eindeutige ID vergeben (wie beim Kreisel), falls verfuegbar. (if (car (atoms-family 1 '("SSG-ID-GENERATE"))) (ssg-id-generate vfl-insert)) + ;; Dimension (2D/3D), in der gebaut wurde, als eigenes SSG_DIM-XDATA merken + ;; (analog vf-block-erstellen). Deckt alle Bau-Pfade ab, da Modus 1/2/3 UND + ;; die Abbruch-Sicherung ueber vfl-block-erstellen laufen. Erst dadurch kann + ;; die Batch-Umschaltung (ssg-dim-alle-umwandeln) Linienzug-Bloecke korrekt + ;; als 2D bzw. 3D erkennen statt sie pauschal als "3D" zu behandeln. + (if (and vfl-insert (car (atoms-family 1 '("SSG-DIM-XDATA-SCHREIBEN")))) + (ssg-dim-xdata-schreiben vfl-insert (ssg-ils-dim-aktuell))) (princ (ssg-textf "vfl-block-erstellt" (list vfl-bname typ-str))) vfl-insert ) @@ -3987,11 +3994,56 @@ (princ (ssg-text "vfl-edit-abgebrochen")))) (princ)) -(defun vfl-edit-ent (ent / xd marker journal glieder glieder-alle has-as n i pos trunc edit-modus) +;; ============================================================ +;; Nicht-interaktiver Dimensions-Konverter (fuer die Batch-Umschaltung +;; SSG_DIM_ALL_2D / SSG_DIM_ALL_3D, aufgerufen aus ssg-dim-alle-umwandeln). +;; ============================================================ +;; Baut einen Linienzug-VF_n-Block (Modus 1 "linienzug" ODER Modus 2 +;; "linienzug2") in der gewuenschten Zieldimension neu auf, indem das komplette +;; Eingabe-Journal STUMM (Replay-Queue, keine DCL-/Konsolen-Fragen) mit +;; erzwungenem *ssg-ils-dim*-Override abgespielt wird. Muster: vf-konvertiere-ent +;; (vf_standard.lsp), aber ohne Attribut-Reimport - der Startpunkt und alle +;; Eingaben stecken vollstaendig im Journal (erster PT-Eintrag = Startpunkt). +;; +;; Das Dim-XDATA wird NICHT hier geschrieben, sondern automatisch von +;; vfl-block-erstellen (Phase A) auf den NEUEN Block - explizites Nachschreiben +;; wuerde auf den bereits geloeschten alten Ename zielen. +;; +;; vl-catch-all-apply schuetzt vor (exit)/Fehlern im Bau (z.B. KS-Problem bei +;; einem 2D-Koerperblock ohne gueltiges KS), damit die Batch-Schleife weiterlaeuft +;; und der Override sicher zurueckgesetzt wird. Rueckgabe: T bei Erfolg, sonst nil. +;; Bekannte Grenze (nur Modus 2): das Replay von vfl-in-selection braucht die +;; Original-Pfadobjekte; wurden sie geloescht, schlaegt der Konverter fuer diesen +;; Block sauber fehl (sichtbar am nicht erhoehten Batch-Zaehler). +(defun vfl-konvertiere-ent (ent ziel-dim / bname xd marker journal ok) + (setq bname (cdr (assoc 2 (entget ent)))) + (setq xd (vfl-journal-xdata-lesen ent)) ; (marker . journal) oder nil + (setq marker (car xd) journal (cdr xd)) + (if (and (wcmatch bname "VF_*") + (member marker '("linienzug" "linienzug2")) + journal) + (progn + (setq *ssg-ils-dim* ziel-dim) ; Zieldim erzwingen + (entdel ent) ; alten Block weg + (vfl-journal-replay-start journal) ; volle Queue, KEIN Truncate + (setq ok (vl-catch-all-apply + (if (= marker "linienzug2") + 'vf-linienzug-modus2 + 'vf-linienzug-modus))) + (setq *ssg-ils-dim* nil) ; Override zuruecksetzen + (if (vl-catch-all-error-p ok) nil T)) + nil)) + +(defun vfl-edit-ent (ent / xd marker journal glieder glieder-alle has-as n i pos trunc edit-modus dim) (setq xd (vfl-journal-xdata-lesen ent)) (if (null xd) (progn (alert (ssg-text "vfl-edit-kein-journal")) (exit))) (setq marker (car xd) journal (cdr xd)) + ;; Dimension des Bestandsblocks merken, damit der Doppelklick-Neubau + ;; dimensionstreu bleibt (sonst baut er in der globalen DXFM_DIM, weil beim + ;; Doppelklick kein *ssg-ils-dim*-Override aktiv ist). Wird VOR dem entdel + ;; gelesen; der Override greift beim anschliessenden Replay/Weiterbau. + (setq dim (ssg-dim-xdata-lesen ent)) (if (= marker "linienzug2") (vfl-edit-ent2 ent journal) (progn @@ -4031,9 +4083,12 @@ ;; Zwischenstand automatisch zu einem neuen Block - kein Sonderfall noetig. (entdel ent) (princ (ssg-textf "vfl-edit-abgespielt" (list (itoa pos) (itoa (- n pos))))) - ;; Behaltene Glieder abspielen, dann live weiterbauen. + ;; Behaltene Glieder abspielen, dann live weiterbauen. Dimensionstreu: + ;; Override auf die Dimension des Bestandsblocks, danach zuruecksetzen. + (if dim (setq *ssg-ils-dim* dim)) (vfl-journal-replay-start trunc) - (vf-linienzug-modus))))) + (vl-catch-all-apply 'vf-linienzug-modus) + (setq *ssg-ils-dim* nil))))) (princ)) ;; Modus-2-Block per Doppelklick zuruecksetzen: voller Reset - die komplette @@ -4041,11 +4096,17 @@ ;; vfl-in-selection) wird 1:1 stumm abgespielt, identischer Neuaufbau. Kein ;; Sektions-Dialog; der Nutzer kann den neu entstandenen Block danach ganz ;; normal weiterbearbeiten oder loeschen. -(defun vfl-edit-ent2 (ent journal) +(defun vfl-edit-ent2 (ent journal / dim) + ;; Dimension des Bestandsblocks VOR dem entdel merken und beim Neubau als + ;; Override erzwingen (dimensionstreuer Doppelklick-Neubau, sonst globale + ;; DXFM_DIM). Danach Override zuruecksetzen. + (setq dim (ssg-dim-xdata-lesen ent)) (entdel ent) (princ (ssg-text "vfl-edit2-reset-info")) + (if dim (setq *ssg-ils-dim* dim)) (vfl-journal-replay-start journal) - (vf-linienzug-modus2) + (vl-catch-all-apply 'vf-linienzug-modus2) + (setq *ssg-ils-dim* nil) (princ)) ;; DCL-Dialog nach Doppelklick: Editier-Modus waehlen.