Merge Geruest-Feature mit 2D/3D-Umschaltung zusammengefuehrt

Konflikte in Gefaellestrecke.lsp und vf_standard.lsp aufgeloest - beide Features behalten. Dialog-Rueckgaben: dim vor den Geruest-Werten. Modus-1 (c:GEFAELLESTRECKE) und die Batch-Konverter (gf-/vf-konvertiere-ent) an die um Geruest-Parameter erweiterten Signaturen (gf-rebuild, gefaellestrecke-einfuegen, vf-block-erstellen) angepasst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 14:28:29 +02:00
28 changed files with 894 additions and 383 deletions
+71 -23
View File
@@ -1311,7 +1311,9 @@
;; delta-l-gf bereits vor der Zusammenfassung berechnet
;; Block mit allen Attributen erstellen
;; Block mit allen Attributen erstellen. Geruest fuer Einzelmodul/
;; Geruestoption sind in diesem Linienzug-Ablauf (Modus 3, keine DCL-
;; Eingabe) nicht abfragbar - bleiben auf Schema-Default.
(gf-block-erstellen
"gruppe" as-seite gf-nummer
(caddr startpunkt)
@@ -1326,7 +1328,7 @@
bR90 bR60 bR30
startpunkt last-ent nach-aus-pt entry-hz
(caddr (nth first-idx segmente))
es-seite)
es-seite "0" "Schoenenberger Geruest")
(princ "\n\n=========================================")
(princ (ssg-text "gf-status-fertig"))
@@ -1425,9 +1427,11 @@
bogen-L90 bogen-L60 bogen-L30
bogen-R90 bogen-R60 bogen-R30
startpunkt last-ent nach-aus-pt entry-hz L-first-seg
es-seite /
es-seite geruest-einzelmodul geruest-typ /
gf-bname gf-ss ent gf-insert typ-str anzahl-gf
gf-winkel-str i gf-g10z gf-korr-dz gf-osmode-alt)
(if (null geruest-einzelmodul) (setq geruest-einzelmodul "0"))
(if (null geruest-typ) (setq geruest-typ (ssg-geruest-idx-to-typ (ssg-geruest-typ-to-idx nil))))
;; Beschriftung: Mitte der ersten Geraden, 400mm senkrecht versetzt
(gf-make-label gf-nummer hoehe-von hoehe-bis deltaH deltaL
L-gf-str winkel n-separator nach-aus-pt entry-hz L-first-seg)
@@ -1511,6 +1515,8 @@
(cons "GF_Bogen_R_30" (itoa bogen-R30))
(cons "ANZAHL_SEPARATOR" (itoa n-separator))
(cons "ANZAHL_SCANNER" (itoa n-scanner))
(cons "GERUEST_EINZELMODUL" geruest-einzelmodul)
(cons "GERUEST_TYP" geruest-typ)
)
)
;; Aufsteigende, eindeutige ID vergeben (wie beim Kreisel), falls verfuegbar.
@@ -1526,8 +1532,10 @@
;; deltaL-total: gesamte Horizontaldistanz (fuer DELTA_L-Attribut)
;; hz: Fahrtrichtung in Grad (0=Ost, 90=Nord, 180=West, 270=Sued)
;; geruest-einzelmodul/geruest-typ: an gf-block-erstellen durchgereicht (Attribute
;; GERUEST_EINZELMODUL/GERUEST_TYP, siehe *ssg-geruest-optionen* in ssg_core.lsp)
(defun gefaellestrecke-einfuegen (L_stau winkel startpunkt as-seite es-seite hz deltaL-total
as-winkel es-winkel /
as-winkel es-winkel geruest-einzelmodul geruest-typ /
as-block es-block endpunkt
gf-nummer last-ent rad-hz rad-v xu-incl
ein-hz rad-ein xu-ein
@@ -1627,7 +1635,7 @@
1 0
0 0 0 0 0 0
startpunkt last-ent nach-aus-pt (float hz) (float L_stau)
es-seite))
es-seite geruest-einzelmodul geruest-typ))
;; Edit-Metadaten (Fahrtrichtung, Gefaellewinkel, Element-Winkel) als XDATA
;; auf das GF_N-INSERT schreiben, damit GEFAELLESTRECKE_EDIT die Strecke
@@ -1657,15 +1665,18 @@
;; um die Angabe der Einfuegehoehe (Z).
;; prefill: Assoziationsliste zur Vorbelegung (fuer GEFAELLESTRECKE_EDIT) mit
;; Schluesseln "deltaL" "winkel" "hz" "as-seite" "es-seite" "einfuegehoehe"
;; "as-winkel" "es-winkel" - oder nil fuer Neuanlage (Modus 1) mit Defaults.
;; "as-winkel" "es-winkel" "geruest-einzelmodul" "geruest-typ" - oder nil
;; fuer Neuanlage (Modus 1) mit Defaults.
;; Rueckgabe: (deltaL winkel hz-winkel as-seite es-seite einfuegehoehe
;; as-winkel es-winkel)
;; as-winkel es-winkel geruest-einzelmodul geruest-typ)
;; oder nil bei Abbruch / fehlendem Dialog.
(defun gf-dialog-eingabe ( prefill hoehe-vorbelegung / dcl-pfad dat ergebnis
dlg-deltal dlg-hoehe dlg-winkel
dlg-richtung dlg-aus dlg-ein
dlg-aus-winkel dlg-ein-winkel dlg-dim
hz-winkel as-seite es-seite as-winkel es-winkel dim)
dlg-geruest-einzelmodul dlg-geruest-typ
hz-winkel as-seite es-seite as-winkel es-winkel dim
geruest-einzelmodul geruest-typ)
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/gefaellestrecke.dcl"))
(setq dat (load_dialog dcl-pfad))
(if (not (new_dialog "gefaellestrecke" dat))
@@ -1741,6 +1752,14 @@
(set_tile "ein_seite"
(if (and prefill (equal (cdr (assoc "es-seite" prefill)) "rechts")) "1" "0"))
(set_tile "geruest_einzelmodul"
(if (and prefill (equal (cdr (assoc "geruest-einzelmodul" prefill)) "1")) "1" "0"))
(start_list "geruest_typ")
(foreach opt *ssg-geruest-optionen* (add_list opt))
(end_list)
(set_tile "geruest_typ"
(itoa (ssg-geruest-typ-to-idx (if prefill (cdr (assoc "geruest-typ" prefill)) nil))))
;; Actions
(action_tile "accept"
(strcat
@@ -1753,6 +1772,8 @@
"(setq dlg-ein-winkel (get_tile \"ein_winkel\"))"
"(setq dlg-ein (get_tile \"ein_seite\"))"
"(setq dlg-dim (get_tile \"dimension\"))"
"(setq dlg-geruest-einzelmodul (get_tile \"geruest_einzelmodul\"))"
"(setq dlg-geruest-typ (get_tile \"geruest_typ\"))"
"(done_dialog 1)"
)
)
@@ -1779,6 +1800,8 @@
(setq as-winkel (if (= dlg-aus-winkel "1") "30" "90"))
(setq es-winkel (if (= dlg-ein-winkel "1") "30" "90"))
(setq dim (if (= dlg-dim "1") "2D" "3D"))
(setq geruest-einzelmodul dlg-geruest-einzelmodul)
(setq geruest-typ (ssg-geruest-idx-to-typ (atoi dlg-geruest-typ)))
(list
(atof dlg-deltal)
(atof dlg-winkel)
@@ -1788,7 +1811,9 @@
(atof dlg-hoehe)
as-winkel
es-winkel
dim)
dim
geruest-einzelmodul
geruest-typ)
)
(t nil)
)
@@ -1804,7 +1829,8 @@
;; wurde (Modus 1) - dann entfaellt die zusaetzliche Konsolen-Rueckfrage.
;; Modus 2 (reine Konsoleneingabe, kein Dialog) uebergibt nil/weglassen.
(defun gf-modus12-abschluss (deltaL winkel hz-winkel as-seite es-seite startpunkt
as-winkel es-winkel dialog-bestaetigt /
as-winkel es-winkel dialog-bestaetigt
geruest-einzelmodul geruest-typ /
rad sep-x L_stau antwort)
(if (null as-winkel) (setq as-winkel "90"))
(if (null es-winkel) (setq es-winkel "90"))
@@ -1842,7 +1868,8 @@
;; Bestaetigung - entfaellt, wenn bereits per Dialog-OK bestaetigt (Modus 1)
(setq antwort (if dialog-bestaetigt "1" (getstring (ssg-text "gf-prompt-einfuegen"))))
(if (not (= antwort "2"))
(gefaellestrecke-einfuegen L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel)
(gefaellestrecke-einfuegen L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel
geruest-einzelmodul geruest-typ)
(princ (ssg-text "gf-status-abgebrochen"))
)
)
@@ -1851,7 +1878,7 @@
;; setzen, L_stau berechnen und einfuegen - ohne Zusammenfassung/Rueckfrage.
;; Rueckgabe: (ename deltaH deltaL) von gefaellestrecke-einfuegen oder nil.
(defun gf-rebuild (deltaL winkel hz-winkel as-seite es-seite startpunkt
as-winkel es-winkel /
as-winkel es-winkel geruest-einzelmodul geruest-typ /
rad sep-x L_stau)
(if (null as-winkel) (setq as-winkel "90"))
(if (null es-winkel) (setq es-winkel "90"))
@@ -1867,7 +1894,8 @@
nil
)
(gefaellestrecke-einfuegen
L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel)
L_stau (fix winkel) startpunkt as-seite es-seite hz-winkel deltaL as-winkel es-winkel
geruest-einzelmodul geruest-typ)
)
)
@@ -1912,7 +1940,7 @@
as-seite es-seite gf-as-winkel gf-es-winkel
line-points startpunkt endpunkt differenz
deltaX deltaY startpunkt-fuer-einfuegen hz-winkel
dlg-werte)
dlg-werte gf-dim gf-geruest-einzelmodul gf-geruest-typ)
(princ "\n=========================================")
(princ (ssg-text "gf-banner-titel"))
@@ -1995,9 +2023,12 @@
(setq antwort (getstring (ssg-text "prompt-wahl-1-2")))
(setq es-seite (if (= antwort "2") "rechts" "links"))
;; Gemeinsamer Abschluss (Masse, Laenge, Zusammenfassung, Einfuegen)
;; Gemeinsamer Abschluss (Masse, Laenge, Zusammenfassung, Einfuegen).
;; Geruest fuer Einzelmodul/Geruestoption sind in Modus 2 (reine
;; Konsoleneingabe, kein Dialog) nicht abfragbar - bleiben auf Default.
(gf-modus12-abschluss deltaL winkel hz-winkel as-seite es-seite
startpunkt-fuer-einfuegen gf-as-winkel gf-es-winkel)
startpunkt-fuer-einfuegen gf-as-winkel gf-es-winkel nil
"0" "Schoenenberger Geruest")
)
;; Modus 1: Manuelle Eingabe via DCL-Dialog
@@ -2020,7 +2051,10 @@
as-seite (nth 3 dlg-werte)
es-seite (nth 4 dlg-werte)
gf-as-winkel (nth 6 dlg-werte)
gf-es-winkel (nth 7 dlg-werte))
gf-es-winkel (nth 7 dlg-werte)
gf-dim (nth 8 dlg-werte)
gf-geruest-einzelmodul (nth 9 dlg-werte)
gf-geruest-typ (nth 10 dlg-werte))
;; Einfuegehoehe = Dialogwert (nth 5), der mit der gepickten Hoehe
;; vorbelegt wurde. So gewinnt die gepickte Hoehe standardmaessig,
;; bleibt aber im Dialog editierbar. Nur diese Z-Hoehe zaehlt (X/Y
@@ -2034,9 +2068,13 @@
(setq deltaL (ssg-cfg-or "gefaelle" "default_delta_l" 5000.0)))
(if (or (null winkel) (<= winkel 0))
(setq winkel (ssg-cfg-or "gefaelle" "default_winkel" 3.0)))
;; Gewaehlte Dimension (2D/3D) fuer den Bau erzwingen (Override), danach zurueck.
(setq *ssg-ils-dim* gf-dim)
;; Dialog-OK wurde bereits bestaetigt - keine zusaetzliche Rueckfrage
(gf-modus12-abschluss deltaL winkel hz-winkel as-seite es-seite
startpunkt-fuer-einfuegen gf-as-winkel gf-es-winkel T)
startpunkt-fuer-einfuegen gf-as-winkel gf-es-winkel T
gf-geruest-einzelmodul gf-geruest-typ)
(setq *ssg-ils-dim* nil)
)
)
)
@@ -2101,8 +2139,11 @@
(caddr gf-start)))
;; VF bauen; Rueckgabe (vf-insert vf-endpunkt), vf-endpunkt = tatsaechl.
;; ES-KS_AUS als Weltpunkt (aus vfs-es-teil/insert-block-by-ks).
;; Geruest fuer Einzelmodul/Geruestoption sind fuer diesen automatisch
;; nebenan gebauten VF nicht abfragbar - bleiben auf Schema-Default.
(setq vf-erg (vfs-standard-dialog-berechnen-einfuegen
(vf-next-number) deltaL deltaH "Auf" vf-start hz-vf vf-seite nil))
(vf-next-number) deltaL deltaH "Auf" vf-start hz-vf vf-seite nil
"0" "Schoenenberger Geruest"))
(setq vf-insert (car vf-erg) vf-endpunkt (cadr vf-erg))
;; Selbstkorrektur: fertigen VF-Block so verschieben, dass sein
;; tatsaechliches ES-KS_AUS exakt auf ziel-es faellt (analog GF_n-Move;
@@ -2128,7 +2169,7 @@
;; Startpunkt neu auf. Rueckgabe: T bei Erfolg, nil wenn nicht nachbaubar.
(defun gf-konvertiere-ent (ent ziel-dim / ed bname attribs xd hz winkel
as-winkel es-winkel z-start deltaL startpunkt
as-seite es-seite)
as-seite es-seite geruest-einzelmodul geruest-typ)
(setq ed (entget ent) bname (cdr (assoc 2 ed)))
(setq attribs (ssg-attrib-read ent))
(setq xd (gf-xdata-lesen ent))
@@ -2145,10 +2186,14 @@
deltaL (atof (nth 5 xd)))
(setq as-seite (cond ((cdr (assoc "SEITE_AS" attribs))) ("links")))
(setq es-seite (cond ((cdr (assoc "SEITE_ES" attribs))) ("links")))
;; bestehende Geruest-Einstellungen erhalten
(setq geruest-einzelmodul (cond ((cdr (assoc "GERUEST_EINZELMODUL" attribs))) ("0")))
(setq geruest-typ (cdr (assoc "GERUEST_TYP" attribs)))
(setq *ssg-ils-dim* ziel-dim)
(entdel ent)
(gf-rebuild deltaL winkel hz as-seite es-seite
(list (car startpunkt) (cadr startpunkt) z-start) as-winkel es-winkel)
(list (car startpunkt) (cadr startpunkt) z-start) as-winkel es-winkel
geruest-einzelmodul geruest-typ)
(setq *ssg-ils-dim* nil)
T)
nil))
@@ -2224,7 +2269,9 @@
(cons "as-winkel" as-winkel)
(cons "es-winkel" es-winkel)
;; Dimension aus XDATA erkennen (Default 3D, falls Alt-Block ohne Eintrag)
(cons "dim" (cond ((ssg-dim-xdata-lesen ent)) ("3D")))))
(cons "dim" (cond ((ssg-dim-xdata-lesen ent)) ("3D")))
(cons "geruest-einzelmodul" (cond ((cdr (assoc "GERUEST_EINZELMODUL" attribs))) ("0")))
(cons "geruest-typ" (cdr (assoc "GERUEST_TYP" attribs)))))
;; AS-Seite + untere Hoehe fuer den optionalen parallelen VF-Bau
(setq as-seite (cond ((cdr (assoc "SEITE_AS" attribs))) ("links")))
@@ -2253,7 +2300,8 @@
(nth 0 dlg-werte) (nth 1 dlg-werte) (nth 2 dlg-werte)
(nth 3 dlg-werte) (nth 4 dlg-werte)
(list (car startpunkt) (cadr startpunkt) (nth 5 dlg-werte))
(nth 6 dlg-werte) (nth 7 dlg-werte))
(nth 6 dlg-werte) (nth 7 dlg-werte)
(nth 9 dlg-werte) (nth 10 dlg-werte))
(setq *ssg-ils-dim* nil)
(princ (ssg-textf "gf-edit-neu-aufgebaut" (list bname)))
)