[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:
2026-08-30 09:00:34 +02:00
parent 64e8ebf6e1
commit 2147f817fc
2 changed files with 80 additions and 7 deletions
+14 -2
View File
@@ -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
View File
@@ -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.