From 1ca3241a8345affeb3c31b4570e962e85368714e Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Mon, 20 Jul 2026 21:40:41 +0200 Subject: [PATCH] =?UTF-8?q?Button=20-VF=20daneben=20bauen-=20im=20GF-Edit-?= =?UTF-8?q?Dialog=20-=20baut=20gegenl=C3=A4ufigen,=20steigenden=20Standard?= =?UTF-8?q?-VF=202000mm=20parallel,Doppel-Bestaetigung=20in=20Modus=201=20?= =?UTF-8?q?(DCL-Dialog)=20entfernt=20-=20OK-Klick=20fuegt=20direkt=20ein?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/Gefaellestrecke.lsp | 92 ++++++++++++++++++++++++++++++++++------ dcl/gefaellestrecke.dcl | 9 ++++ 2 files changed, 89 insertions(+), 12 deletions(-) diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index d64514f..99b641f 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -1491,7 +1491,8 @@ (ssg-attrib-set-on gf-insert (list (cons "Bezeichnung" gf-bname) - (cons "MONTAGEHOEHE_m" "0.000") + ;; Montagehoehe = obere Hoehe / 1000 (mm->m); vom Benutzer editierbar + (cons "MONTAGEHOEHE_m" (rtos (/ (float hoehe-von) 1000.0) 2 3)) (cons "HOEHE_VON_mm" (itoa (fix hoehe-von))) (cons "HOEHE_BIS_mm" (itoa (fix hoehe-bis))) (cons "DELTA_H_mm" (itoa (fix (abs deltaH)))) @@ -1721,12 +1722,18 @@ ) ) (action_tile "cancel" "(done_dialog 0)") + ;; Zusatz-Button: parallelen VarioFoerderer bauen (Signal-Code 2). + ;; Der VF spiegelt die BESTEHENDE GF (Werte aus XDATA), daher werden die + ;; Dialog-Felder hier nicht ausgelesen. + (action_tile "build_vf" "(done_dialog 2)") (setq ergebnis (start_dialog)) (unload_dialog dat) - (if (= ergebnis 1) - (progn + (cond + ;; Signal an GEFAELLESTRECKE_EDIT: parallelen VF bauen + ((= ergebnis 2) "BUILD_VF") + ((= ergebnis 1) (setq hz-winkel (cond ((= dlg-richtung "1") 90.0) ((= dlg-richtung "2") 180.0) @@ -1746,7 +1753,7 @@ as-winkel es-winkel) ) - nil + (t nil) ) ) ) @@ -1756,8 +1763,11 @@ ;; Zusammenfassung, Bestaetigung und Einfuegen. ;; startpunkt: Einfuegepunkt AUS-Element (inkl. Z aus Einfuegehoehe) ;; as-winkel/es-winkel: "30" oder "90" (Element-Variante) +;; dialog-bestaetigt: T, wenn die Einfuegung bereits per Dialog-OK bestaetigt +;; 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 / + as-winkel es-winkel dialog-bestaetigt / rad sep-x L_stau antwort) (if (null as-winkel) (setq as-winkel "90")) (if (null es-winkel) (setq es-winkel "90")) @@ -1792,8 +1802,8 @@ (princ (ssg-textf "gf-status-zus2-lstau" (list (rtos L_stau 2 2)))) (princ "\n=========================================") - ;; Bestaetigung - (setq antwort (getstring (ssg-text "gf-prompt-einfuegen"))) + ;; 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) (princ (ssg-text "gf-status-abgebrochen")) @@ -1981,8 +1991,9 @@ (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))) + ;; 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) + startpunkt-fuer-einfuegen gf-as-winkel gf-es-winkel T) ) ) ) @@ -1999,9 +2010,56 @@ ;; zeigt sie vorbelegt im Dialog und baut die Strecke bei OK am selben ;; Startpunkt neu auf. Wird vom Doppelklick-Dispatcher SSG_BLOCKEDIT ;; fuer Blocknamen "GF_*" aufgerufen. +;; ============================================================ +;; Parallelen Standard-VarioFoerderer neben eine bestehende Gefaellestrecke +;; bauen: gegenlaeufig (hz+180), steigend ("Auf"), 2000 mm seitlich versetzt, +;; gleiche DeltaL/DeltaH. Die GF bleibt unveraendert. Winkel + GF-Aufteilung +;; werden ueber den Standard-VF-Dialog abgefragt. +;; +;; Versatz-Seite haengt von der GF-AS-Seite ab: +;; GF-AS rechts -> VF links (hz+90), GF-AS links -> VF rechts (hz-90). +;; +;; gf-start: GF-Startpunkt (X Y Z), Z = obere Hoehe (HOEHE_VON) +;; hz: GF-Fahrtrichtung in Grad +;; deltaL: planare Gesamtlaenge der GF (= VF-DeltaL) +;; as-seite: GF-AS-Seite ("rechts"/"links") +;; hoehe-bis: untere GF-Hoehe (HOEHE_BIS) = VF-Einfuegehoehe (Kettenanfang) +;; ============================================================ +(defun gf-baue-parallel-vf (gf-start hz deltaL as-seite hoehe-bis / + abstand rad hz-vf deltaH gf-end-x gf-end-y + perp-x perp-y vf-start vf-seite) + (if (null (car (atoms-family 1 '("VFS-STANDARD-DIALOG-BERECHNEN-EINFUEGEN")))) + (alert (ssg-text "gf-vf-modul-fehlt")) + (progn + (setq abstand 2000.0) + (setq rad (* hz (/ pi 180.0))) + (setq deltaH (- (caddr gf-start) hoehe-bis)) ; HOEHE_VON - HOEHE_BIS + ;; GF-Endpunkt (X/Y) = GF-Start + deltaL entlang hz + (setq gf-end-x (+ (car gf-start) (* deltaL (cos rad))) + gf-end-y (+ (cadr gf-start) (* deltaL (sin rad)))) + ;; Versatz senkrecht zur Fahrtrichtung: VF auf DIESELBE benannte Seite wie + ;; das GF-AS-Element (GF-AS links -> VF links der Fahrtrichtung; GF-AS + ;; rechts -> VF rechts). links = (hz+90) = (-sin, cos); rechts = (sin, -cos). + (if (= as-seite "rechts") + (setq perp-x (sin rad) perp-y (- (cos rad))) ; rechts der Fahrtrichtung + (setq perp-x (- (sin rad)) perp-y (cos rad))) ; links der Fahrtrichtung + ;; VF-Startpunkt = GF-Endpunkt + Versatz, Z = unteres GF-Ende (HOEHE_BIS). + ;; Der VF baut "Auf" und erreicht am Ende wieder HOEHE_VON. + (setq vf-start (list (+ gf-end-x (* abstand perp-x)) + (+ gf-end-y (* abstand perp-y)) + hoehe-bis)) + (setq hz-vf (rem (+ hz 180.0) 360.0)) + (setq vf-seite as-seite) ; VF-AS/ES-Seite: Default = GF-AS-Seite + (vfs-standard-dialog-berechnen-einfuegen + (vf-next-number) deltaL deltaH "Auf" vf-start hz-vf vf-seite nil) + (princ (ssg-text "gf-vf-gebaut")) + ) + ) +) + (defun c:GEFAELLESTRECKE_EDIT ( / ss ent ed bname startpunkt attribs xd hz winkel as-winkel es-winkel z-start deltaL - prefill dlg-werte) + as-seite hoehe-bis prefill dlg-werte) ;; Implied Selection VOR ssg-start pruefen (ssg-start hebt Selektion auf) (setq ss (ssget "I")) (if (and ss (= (sslength ss) 1) @@ -2070,10 +2128,20 @@ (cons "as-winkel" as-winkel) (cons "es-winkel" es-winkel))) + ;; AS-Seite + untere Hoehe fuer den optionalen parallelen VF-Bau + (setq as-seite (cond ((cdr (assoc "SEITE_AS" attribs))) ("links"))) + (setq hoehe-bis (atof (cond ((cdr (assoc "HOEHE_BIS_mm" attribs))) ("0")))) + (setq dlg-werte (gf-dialog-eingabe prefill)) - (if (null dlg-werte) - (princ (ssg-text "gf-status-abgebrochen")) - (progn + (cond + ((null dlg-werte) + (princ (ssg-text "gf-status-abgebrochen"))) + ;; Zusatz-Button: parallelen VarioFoerderer bauen, GF bleibt unveraendert. + ((equal dlg-werte "BUILD_VF") + (gf-baue-parallel-vf + (list (car startpunkt) (cadr startpunkt) z-start) + hz deltaL as-seite hoehe-bis)) + (t ;; Alten GF-Verbund loeschen und am selben Startpunkt (X/Y) mit der ;; im Dialog gewaehlten Einfuegehoehe (Z) neu aufbauen. (entdel ent) diff --git a/dcl/gefaellestrecke.dcl b/dcl/gefaellestrecke.dcl index e406e6d..880b169 100644 --- a/dcl/gefaellestrecke.dcl +++ b/dcl/gefaellestrecke.dcl @@ -76,6 +76,15 @@ gefaellestrecke : dialog { } } + : boxed_column { + label = "VarioFoerderer (parallel, gegenlaeufig, steigend)"; + + : button { + key = "build_vf"; + label = "VarioFoerderer daneben bauen (2000 mm)"; + } + } + } ok_cancel;