From 9fdc1b8bdd473ef9a7d29073fbe679bd175c9506 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Thu, 27 Aug 2026 12:12:58 +0200 Subject: [PATCH] VF-Linienzug: Wizard-Gruppendialoge waehrend Journal-Replay unterdrueckt Beim Editieren einer bestehenden VF_n-Kette (VARIOFOERDERER_EDIT) feuerten die Wizard-DCL-Gruppendialoge (vflw-gruppe-*-impl) weiterhin, obwohl der Ablauf gerade aus dem gespeicherten Journal repliziert wurde - sie waren nur an *vfl-wizard-mode* gebunden, nicht an den Replay-Status. Ihre Antworten landeten in *vflw-pending*, wurden dort aber nie konsumiert (die vfl-in-*- Wrapper pruefen die Replay-Queue zuerst) und blieben liegen. Sobald die Replay-Queue leer war und auf Live-Eingabe umgeschaltet wurde, laseen die Wrapper diese laengst veralteten, falsch typisierten Werte statt neu zu fragen - z.B. landete eine Menue-Antwort ("1") in vfl-in-point und liess vfl-neue-linie-messen mit "bad argument type <1> ; expected " abstuerzen. Neue Hilfsfunktion vfl-wizard-aktiv prueft zusaetzlich *vfl-replay-queue* und ersetzt an allen 15 Aufrufstellen die reine *vfl-wizard-mode*-Abfrage. Als Absicherung leeren vfl-journal-reset und vfl-journal-replay-start jetzt zusaetzlich *vflw-pending*. Co-Authored-By: Claude Sonnet 5 --- Lisp/vf_linienzug.lsp | 49 ++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index bb65cb5..227b76e 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -132,7 +132,8 @@ ;; *vfl-journal* wird in UMGEKEHRTER Reihenfolge gehalten (neuestes zuerst, cons). (defun vfl-journal-reset () - (setq *vfl-journal* '() *vfl-replay-queue* nil)) + (setq *vfl-journal* '() *vfl-replay-queue* nil) + (if (boundp '*vflw-pending*) (setq *vflw-pending* nil))) ;; Eintrag anhaengen (vorn, da Reverse-Reihenfolge). ;; Zusaetzlich (falls ein Debug-Schalter fuer die aktuelle Sitzung eine .dbg- @@ -210,6 +211,19 @@ (if (not (boundp '*vflw-menu-default*)) (setq *vflw-menu-default* 1)) (if (not (boundp '*vflw-menu-frage*)) (setq *vflw-menu-frage* nil)) +;; Wizard-GRUPPEN-Dialoge (vflw-gruppe-*-impl) duerfen NUR bei echter Live- +;; Eingabe aufgehen - waehrend eines Journal-Replays (Editieren/Fortsetzen +;; einer bestehenden Kette, *vfl-replay-queue* gesetzt) liefern vfl-in-point/ +;; -string/-real/-int/-value ihre Werte bereits stumm aus der Replay-Queue; +;; ein trotzdem geoeffneter Gruppen-Dialog wuerde einerseits unnoetig +;; blockieren und andererseits seine Antworten in *vflw-pending* ablegen, wo +;; sie NICHT konsumiert werden (die Wrapper pruefen die Replay-Queue zuerst) +;; und liegen bleiben - sobald die Replay-Queue erschoepft ist und auf Live- +;; Eingabe umgeschaltet wird, liest der naechste Wrapper diese laengst +;; veralteten, falsch typisierten Werte statt neu zu fragen (siehe +;; vfl-neue-linie-messen: fuehrte zu einem String-statt-Punkt-Absturz). +(defun vfl-wizard-aktiv () (and *vfl-wizard-mode* (null *vfl-replay-queue*))) + (defun c:VF_WIZARD_AN () (setq *vfl-wizard-mode* T) (princ "\nVF-Linienzug-Assistent: EIN (DCL-Dialoge)") @@ -868,7 +882,8 @@ ;; zur Lesequelle, *vfl-journal* startet leer und wird bei der erneuten ;; Ausfuehrung neu aufgebaut. Genutzt von vfl-edit-ent und der Wiederaufnahme. (defun vfl-journal-replay-start (forward-journal) - (setq *vfl-replay-queue* forward-journal *vfl-journal* '())) + (setq *vfl-replay-queue* forward-journal *vfl-journal* '()) + (if (boundp '*vflw-pending*) (setq *vflw-pending* nil))) ;; --- Glied-Zerlegung fuer den Editier-Dialog --- ;; Labels der Glieder (STEP-Marker) in Bau-Reihenfolge. @@ -1252,7 +1267,7 @@ (defun vfl-baue-horizontal-koerper (frame hz dL ziel-modus gf2-laenge / pt m1 sep-vor pt-vor-bogen sep-nach ist-ende-antwort) (setq pt (car frame)) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-horizontal-impl (list ziel-modus))) (princ (ssg-text "vfl-sep-vor-frage")) (princ (ssg-text "vfl-ja")) @@ -1399,7 +1414,7 @@ (progn (princ (ssg-text "vfl-abgebrochen-kein-ziel")) nil) (progn (setq dL (car linie-mess) hzn (cadr linie-mess)) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr (car frame))))) (setq hn (vfl-in-real (ssg-textf "vfl-prompt-hoehe-kettenende" (list (rtos (caddr (car frame)) 2 1))))) @@ -1605,7 +1620,7 @@ (setq dL (car linie-mess) hzn (cadr linie-mess)) (if (> dL 1.0) (progn - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr (car frame))))) (setq hn (vfl-in-real (ssg-textf "vfl-prompt-hoehe-endpunkt" (list (rtos (caddr (car frame)) 2 1))))) @@ -1715,7 +1730,7 @@ ;; Interaktiv (i18n): GF-Bogen-Winkel + Seite abfragen, dann Kern aufrufen. (defun vfl-insert-gf-bogen (frame / bwinkel bseite antwort) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-winkel-seite-impl (list "vfl-gf-bogen-winkel-header" (list (ssg-text "vfl-winkel-30") (ssg-text "vfl-winkel-60") (ssg-text "vfl-winkel-90")) @@ -1784,7 +1799,7 @@ ;; (siehe ks-normalize-name). ;; Interaktiv (i18n): Vario-Kurve-Winkel + Seite + Variante abfragen, dann Kern. (defun vfl-insert-vario-kurve (frame / kwinkel kseite kvariante antwort) - (if *vfl-wizard-mode* (vl-catch-all-apply 'vflw-gruppe-variokurve-impl nil)) + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-variokurve-impl nil)) (princ (ssg-text "vfl-variokurve-winkel-header")) (princ (ssg-text "vfl-opt1-90grad")) (princ (ssg-text "vfl-opt2-60grad")) @@ -1861,7 +1876,7 @@ ;; ES-Winkel (30/90) + Seite erst am Kettenende abfragen. Setzt *vfl-es-winkel* ;; und die ES-Masse (ein-dx/dz) fuer die Variante. Rueckgabe: Seite (links/rechts). (defun vfl-frage-es-seite ( / antwort es-seite) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-winkel-seite-impl (list "vf-winkel-ein-header" (list (ssg-text "vf-winkel-90") (ssg-text "vf-winkel-30")) @@ -2185,7 +2200,7 @@ (if (and (boundp '*ssg-start-stack*) *ssg-start-stack*) (ssg-end)) (princ)))) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-punkt-hoehe-impl (list "vfl-prompt-startpunkt-kette" "Starthoehe (Z, mm):"))) (setq startpunkt (vfl-in-point nil (ssg-text "vfl-prompt-startpunkt-kette"))) @@ -2196,7 +2211,7 @@ (if (null start-hoehe) (setq start-hoehe (caddr startpunkt))) (setq startpunkt (list (car startpunkt) (cadr startpunkt) start-hoehe)) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-as-impl (list "vfl-as-setzen-frage"))) (princ (ssg-text "vfl-as-setzen-frage")) (princ (ssg-text "vfl-ja")) @@ -2357,7 +2372,7 @@ ) ) (setq gf-ok t) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-gefaelle-impl (list (vfl-gf-hoehe-vorschlag (caddr p-aktuell))))) (princ (ssg-text "vfl-gefaelle-festlegen-header")) @@ -2465,7 +2480,7 @@ (if (< deltaL 1000.0) (princ (ssg-text "vfl-fehler-vf-kurz")) (progn - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr p-aktuell)))) (setq hoehe-neu (vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt" (list (rtos (caddr p-aktuell) 2 1))))) @@ -2533,7 +2548,7 @@ (list (rtos deltaL 2 0) (rtos deltaH 2 1)))) ) (progn - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-ziel-hoehe-impl (list (caddr p-aktuell)))) (setq hoehe-neu (vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt" (list (rtos (caddr p-aktuell) 2 1))))) @@ -3433,7 +3448,7 @@ (setq obj-liste (mapcar 'vlax-ename->vla-object ss)) ;; --- 2. Startpunkt + Z + AS-Seite --- - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-punkt-hoehe-impl (list "vfl-m3-prompt-startpunkt" "Starthoehe (Z, mm):"))) (setq startpunkt (vfl-in-point nil (ssg-text "vfl-m3-prompt-startpunkt"))) @@ -3442,7 +3457,7 @@ (list (rtos (caddr startpunkt) 2 1))))) (if (null start-hoehe) (setq start-hoehe (caddr startpunkt))) (setq startpunkt (list (car startpunkt) (cadr startpunkt) start-hoehe)) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-as-impl (list "vfl-as-setzen-frage"))) (princ (ssg-text "vfl-as-setzen-frage")) (princ (ssg-text "vfl-ja")) @@ -3468,7 +3483,7 @@ ) ;; --- 3. Endpunkt + Z + ES-Seite (NEU in Modus 3) --- - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-punkt-hoehe-impl (list "vfl-m3-prompt-endpunkt" "Zielhoehe (Z, mm):"))) (setq endpunkt (vfl-in-point nil (ssg-text "vfl-m3-prompt-endpunkt"))) @@ -3477,7 +3492,7 @@ (list (rtos (caddr endpunkt) 2 1))))) (if (null end-hoehe) (setq end-hoehe (caddr endpunkt))) (setq endpunkt (list (car endpunkt) (cadr endpunkt) end-hoehe)) - (if *vfl-wizard-mode* + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-as-impl (list "vfl-es-setzen-frage"))) (princ (ssg-text "vfl-es-setzen-frage")) (princ (ssg-text "vfl-ja"))