From 046d34c4aae44dffa484561811e50335629f6361 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Mon, 3 Aug 2026 16:34:48 +0200 Subject: [PATCH] Etage: Batch-2D/3D-Umschaltung + Nachruest-Befehl fuer Bestandsbloecke vf-konvertiere-ent waehlt die Einfuege-Funktion jetzt per XDATA-Typ aus der Registry (standard/etage) statt fest variofoerderer-einfuegen -> SSG_DIM_SWITCH schaltet auch Etage-Bloecke um. Neuer Befehl VARIOFOERDERER_NACHRUESTEN (Alias VF_NACHRUESTEN, + Menueeintrag): markiert bestehende, vor der Marker-Einfuehrung gebaute VF_n-Bloecke nachtraeglich mit SSG_VF_EDIT (Typ aus Attributen erkannt, Baurichtung hz abgefragt) - danach editier- und dim-umschaltbar. Schreibt nur XDATA, keine Geometrieaenderung. Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 2 +- Lisp/vf_standard.lsp | 83 +++++++++++++++++++++++++++++++++++++++----- menu/SSG_LIB.mnu | 1 + 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 57380ca..2cf7bcf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -93,7 +93,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | `ssg_dialog.lsp` | - | DCL-Dialog-Vorlagen und Hilfsfunktionen | | `ssg_layer.lsp` | - | Layer-Verwaltung | | `KreiselInsert.lsp` | KreiselInsert, KreiselConnect, KreiselRedraw, KreiselQuick, KreiselEdit, KreiselParams, KreiselLabelSetup, KreiselLabelPos, KreiselLabelHoehe, ILS_Eckrad | ILS Kreisel und Eckrad komplett in AutoLISP | -| `VarioFoerderer.lsp` (Wrapper fuer `vf_core.lsp`/`vf_standard.lsp`/`vf_etage.lsp`/`vf_linienzug.lsp`) | FOERDERANLAGE, VARIOFOERDERER_EDIT, Vario_Kette_Merge | Vario-Foerderanlagen Generator (Typen Standard/Etage/Linienzug); Standard- UND Etage-Typ: Werteingabe per DCL-Dialog (`vfs-standard-dialog-ablauf` in vf_standard.lsp bzw. `vfe-etage-dialog-ablauf` in vf_etage.lsp, beide nutzen dieselben Dialoge `vfs-dialog-eingabe-basis`/`vfs-dialog-winkel-verteilung`); Doppelklick auf VF_n-Block ruft VARIOFOERDERER_EDIT, das per SSG_VF_EDIT-XDATA-Marker ("standard"/"etage") in den passenden Neuaufbau-Zweig dispatcht (`vfe-edit-ent` fuer Etage); Linienzug-/Altbestand-Bloecke ohne Marker werden abgewiesen; `Vario_Kette_Merge` (in vf_linienzug.lsp) fuehrt mehrere einzeln gebaute VF_n-Bloecke ab einem gewaehlten Start-Baustein ueber die reale KS_AUS->KS_EIN-Nachbarschaft zu einem Gesamt-Block zusammen (aggregierte Attribute, Luecken-Erkennung) | +| `VarioFoerderer.lsp` (Wrapper fuer `vf_core.lsp`/`vf_standard.lsp`/`vf_etage.lsp`/`vf_linienzug.lsp`) | FOERDERANLAGE, VARIOFOERDERER_EDIT, VARIOFOERDERER_NACHRUESTEN, Vario_Kette_Merge | Vario-Foerderanlagen Generator (Typen Standard/Etage/Linienzug); Standard- UND Etage-Typ: Werteingabe per DCL-Dialog (`vfs-standard-dialog-ablauf` in vf_standard.lsp bzw. `vfe-etage-dialog-ablauf` in vf_etage.lsp, beide nutzen dieselben Dialoge `vfs-dialog-eingabe-basis`/`vfs-dialog-winkel-verteilung`); Doppelklick auf VF_n-Block ruft VARIOFOERDERER_EDIT, das per SSG_VF_EDIT-XDATA-Marker ("standard"/"etage") in den passenden Neuaufbau-Zweig dispatcht (`vfe-edit-ent` fuer Etage); Linienzug-/Altbestand-Bloecke ohne Marker werden abgewiesen; `Vario_Kette_Merge` (in vf_linienzug.lsp) fuehrt mehrere einzeln gebaute VF_n-Bloecke ab einem gewaehlten Start-Baustein ueber die reale KS_AUS->KS_EIN-Nachbarschaft zu einem Gesamt-Block zusammen (aggregierte Attribute, Luecken-Erkennung) | | `Gefaellestrecke.lsp` | GEFAELLESTRECKE, GEFAELLESTRECKE_EDIT | Gefaelle-Foerderanlage (AUS -> Staustrecke skaliert -> Separator -> EIN); Modus 1 per DCL-Dialog (Einfuegehoehe, Element-Winkel 30/90); Doppelklick auf GF_n-Block ruft GEFAELLESTRECKE_EDIT (Dialog vorbelegt, Neuaufbau) | | `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_UPDATE_ATTRIBS | JSON-Sammlung und Python-Export (Omniflo-Merkmale/Sum-Zeile via lib/export_csv.py) | | `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_AP60/AP110, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen, Edit-Dialog | diff --git a/Lisp/vf_standard.lsp b/Lisp/vf_standard.lsp index 6744b5c..4b0d0e5 100644 --- a/Lisp/vf_standard.lsp +++ b/Lisp/vf_standard.lsp @@ -1096,17 +1096,21 @@ ) ) -;; Nicht-interaktive Umwandlung EINES bestehenden Standard-VF-Blocks in die -;; Zieldimension (fuer die Batch-Umschaltung "Alle auf 2D/3D"). Liest alle -;; Parameter aus XDATA/Attributen (ohne Winkel-Dialog), erzwingt die Zieldim -;; per Override und baut am selben Startpunkt neu auf. Rueckgabe: T/nil. -(defun vf-konvertiere-ent (ent ziel-dim / ed bname xd attribs startpunkt hz +;; Nicht-interaktive Umwandlung EINES bestehenden VF-Blocks (Standard ODER +;; Etage) in die Zieldimension (fuer die Batch-Umschaltung "Alle auf 2D/3D"). +;; Liest alle Parameter aus XDATA/Attributen (ohne Winkel-Dialog), erzwingt die +;; Zieldim per Override und baut am selben Startpunkt neu auf. Der Typ-Marker +;; der XDATA ("standard"/"etage") waehlt die passende Einfuege-Funktion aus der +;; Typ-Registry (beide haben dieselbe Signatur). Rueckgabe: T/nil. +(defun vf-konvertiere-ent (ent ziel-dim / ed bname xd typ einfuege-fn attribs startpunkt hz deltaL deltaH richtung seite best-winkel L_GF_m-teile L_GF1 L_GF2 L_VF hoehe-von hoehe-bis lastEnt vf-insert vf-nummer geruest-einzelmodul geruest-typ motorseite) (setq ed (entget ent) bname (cdr (assoc 2 ed))) (setq xd (vfs-xdata-lesen ent)) - (if (and (wcmatch bname "VF_*") xd (= (car xd) "standard")) + (setq typ (if xd (car xd))) + (setq einfuege-fn (if typ (nth 2 (assoc typ *vf-typ-registry*)))) + (if (and (wcmatch bname "VF_*") (member typ '("standard" "etage")) einfuege-fn) (progn (setq attribs (ssg-attrib-read ent)) (setq startpunkt (cdr (assoc 10 ed))) @@ -1132,14 +1136,15 @@ (setq *vf-motorseite* motorseite) (entdel ent) (setq lastEnt (vf-lastent-ohne-attribute)) - (variofoerderer-einfuegen deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz) + (apply einfuege-fn + (list deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz)) (setq vf-nummer (vf-next-number)) (setq vf-insert - (vf-block-erstellen "standard" seite vf-nummer 0 + (vf-block-erstellen typ seite vf-nummer 0 hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 richtung best-winkel startpunkt lastEnt hz geruest-einzelmodul geruest-typ)) - (if vf-insert (vfs-xdata-schreiben vf-insert hz)) + (if vf-insert (vf-edit-xdata-schreiben vf-insert typ hz)) (setq *ssg-ils-dim* nil) (setq *vf-motorseite* nil) (if vf-insert T nil)) @@ -1259,6 +1264,66 @@ (princ) ) +;; ============================================================ +;; VARIOFOERDERER_NACHRUESTEN - Bestandsbloecke markieren +;; ============================================================ +;; Versieht bestehende VF_n-Bloecke, die noch KEINEN SSG_VF_EDIT-Marker tragen +;; (vor Einfuehrung der Dialog-/Edit-Unterstuetzung erzeugt), nachtraeglich mit +;; dem Marker (Typ + Baurichtung hz). Danach sind sie per Doppelklick editierbar +;; (c:VARIOFOERDERER_EDIT) und per SSG_DIM_SWITCH 2D/3D-umschaltbar +;; (vf-konvertiere-ent). +;; +;; Es wird NUR die XDATA geschrieben - keine Geometrie veraendert. Der Typ wird +;; aus den Attributen erkannt (Etage traegt GF_Bogen_R_60/L_60, sonst Standard). +;; Die Baurichtung hz laesst sich NICHT aus den Attributen rekonstruieren und +;; wird deshalb pro Block abgefragt (Default = zuletzt eingegebener Wert; bei +;; Neuanlage 0). Wer hz nicht kennt: der Wert steht in der urspruenglichen +;; Bau-Eingabe (z.B. mubea.json "hz") bzw. ergibt sich aus der Ausrichtung. +;; Bereits markierte Bloecke und Nicht-VF-Bloecke werden uebersprungen. +(defun c:VARIOFOERDERER_NACHRUESTEN ( / ss i ent ed bname attribs xd typ hz + n-neu n-skip default-hz) + (ssg-start "VARIOFOERDERER_NACHRUESTEN" nil) + (princ "\n=== VF-Bestandsbloecke nachruesten (SSG_VF_EDIT-Marker) ===") + (setq ss (ssget '((0 . "INSERT") (2 . "VF_*")))) + (if (null ss) + (progn + (princ "\nKeine VF_n-Bloecke ausgewaehlt - abgebrochen.") + (ssg-end) + (exit))) + (setq i 0 n-neu 0 n-skip 0 default-hz 0.0) + (while (< i (sslength ss)) + (setq ent (ssname ss i)) + (setq ed (entget ent) bname (cdr (assoc 2 ed))) + (setq xd (vfs-xdata-lesen ent)) + (cond + ;; Schon markiert (standard/etage) -> ueberspringen + ((and xd (member (car xd) '("standard" "etage"))) + (princ (strcat "\n " bname ": bereits markiert (" (car xd) ") - uebersprungen")) + (setq n-skip (1+ n-skip))) + (t + (setq attribs (ssg-attrib-read ent)) + ;; Typ-Erkennung: Etage traegt die Gefaellebogen-Zaehler GF_Bogen_R/L_60. + (setq typ + (if (or (assoc "GF_Bogen_R_60" attribs) (assoc "GF_Bogen_L_60" attribs)) + "etage" "standard")) + (princ (strcat "\n " bname ": erkannt als Typ '" typ "'")) + (setq hz (getreal (strcat "\n Baurichtung hz in Grad [" (rtos default-hz 2 1) "]: "))) + (if (null hz) (setq hz default-hz)) + (setq default-hz hz) + (vf-edit-xdata-schreiben ent typ hz) + (princ (strcat " -> markiert (hz=" (rtos hz 2 1) ")")) + (setq n-neu (1+ n-neu))) + ) + (setq i (1+ i)) + ) + (princ (strcat "\n=== Fertig: " (itoa n-neu) " markiert, " (itoa n-skip) " uebersprungen ===")) + (ssg-end) + (princ) +) + +;; Kurz-Alias +(defun c:VF_NACHRUESTEN () (c:VARIOFOERDERER_NACHRUESTEN)) + ;; ============================================================ ;; REGISTRIERUNG ;; ============================================================ diff --git a/menu/SSG_LIB.mnu b/menu/SSG_LIB.mnu index a8c03af..2013df0 100644 --- a/menu/SSG_LIB.mnu +++ b/menu/SSG_LIB.mnu @@ -19,6 +19,7 @@ [VarioFoerderer]^C^CVarioFoerderer [EtageVarioFoerderer]^C^CETAGEVARIOFOERDERER [Vario_Kette_Merge]^C^C(ssg-ensure "VarioFoerderer") Vario_Kette_Merge +[VarioFoerderer nachruesten (Marker)]^C^C(ssg-ensure "VarioFoerderer") VARIOFOERDERER_NACHRUESTEN [--] [~90 Kurve links angetrieben Aussen]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_K90LA [~90 Kurve rechts angetrieben Aussen]^C^C(ssg-ensure "SSG_LIB_Commands") ILS_K90RA