[FEAT] VF-Linienzug: 2D/3D-Batch-Umschaltung implementiert
Bisher schaltete SSG_DIM_ALL_2D/3D die Linienzug-Foerderer nicht um
("gar nichts passiert"). Ursache: kein Dim-XDATA am VF_n-Block und
kein Konverter fuer die Marker "linienzug"/"linienzug2".
- Phase A: vfl-block-erstellen schreibt jetzt SSG_DIM-XDATA (deckt
Modus 1/2/3 + Abbruch-Sicherung in einem Zug ab).
- Phase B: neuer nicht-interaktiver Konverter vfl-konvertiere-ent
(stummer Journal-Replay mit *ssg-ils-dim*-Override, vl-catch-all
abgesichert).
- Phase C: ssg-dim-alle-umwandeln dispatcht VF_-Bloecke nach Marker
(Standard/Etage -> vf-konvertiere-ent, Linienzug -> vfl-konvertiere-ent,
Altbestand -> skip); Fehlversuche zaehlen als skip.
- Phase D: Doppelklick-Edit (vfl-edit-ent/-ent2) baut dimensionstreu
in der Bestandsblock-Dimension neu auf.
Phase 0 (VFL_KS_DIAG-Pruefung der 2D-KS) + Verifikation stehen noch aus
(nur in BricsCAD moeglich).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
+66
-5
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user