From 00fd48d02e0ec0d599b8c757a23b10729997153a Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Thu, 8 Oct 2026 09:55:38 +0200 Subject: [PATCH] fix: VF-Linienzug Modus 1 GF+ES-Separator-Laenge/Hoehe korrigieren Neue Linie: GF (Zweig A+B) zog bei Kettenende mit ES-Element nur den ES-eigenen Fussabdruck von deltaL/deltaH ab, nicht den zusaetzlichen automatischen 300mm-Separator, den vfl-insert-es-element immer selbst vor dem ES-Block einfuegt - die Kette baute dadurch zu lang/zu tief. Zusaetzlich: "Separator NACH" im Wizard-Dialog (vflw-gruppe-sep-gf-impl) wird jetzt ausgegraut statt gefragt+nachtraeglich verworfen, wenn das GF-Segment ohnehin mit einem ES-Element endet (der automatische Separator deckt das bereits ab). Pending-Queue-Anzahl bleibt dabei unveraendert (Dialog pusht weiterhin 2 Werte), um keinen Versatz mit den nachfolgenden Konsolen-Abfragen zu erzeugen. Co-Authored-By: Claude Sonnet 5 --- Lisp/vf_linienzug.lsp | 83 ++++++++++++++++++++++++++++++++++++------- lang/de_DE.json | 4 +++ lang/en_GB.json | 4 +++ 3 files changed, 79 insertions(+), 12 deletions(-) diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 3dbd70c..d849e94 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -1033,7 +1033,17 @@ ;; "Neue Linie: GF" - Separator VOR/NACH (2 Ja/Nein-Toggles in einem ;; Bildschirm). Siehe dcl/vf_linienzug_wizard.dcl (vflw_sep_gf). -(defun vflw-gruppe-sep-gf-impl ( / dat ergebnis gsepvor gsepnach) +;; es-folgt-sep: T, wenn dieses GF-Stueck das Kettenende MIT ES-Element ist +;; (gf-kettenende-antwort steht beim Aufruf schon fest, siehe Aufrufer) - +;; dann baut vfl-insert-es-element ohnehin IMMER seinen eigenen Separator +;; VOR dem ES-Block, ein zusaetzlicher "Separator NACH" waere ein zweiter, +;; direkt anschliessender Separator. Statt die Frage zu stellen und die +;; Antwort hinterher zu verwerfen (Nutzer-Feedback 2026-10-08: verwirrend), +;; wird die Kachel hier direkt deaktiviert+abgehakt - der bestehende +;; Konsolen-/Sicherheitsnetz-Pfad (siehe Aufrufer, "ueberschrieben"-Meldung) +;; bleibt UNVERAENDERT bestehen (deckt weiterhin den reinen Konsolen-Fall ab, +;; wo diese Dialog-Funktion gar nicht laeuft). +(defun vflw-gruppe-sep-gf-impl (es-folgt-sep / dat ergebnis gsepvor gsepnach) (setq dat (load_dialog (vflw-dcl-pfad))) (if (not (new_dialog "vflw_sep_gf" dat)) (if (and dat (>= dat 0)) (unload_dialog dat)) @@ -1041,6 +1051,7 @@ (set_tile "kopf" (vflw-clean (ssg-text "vfl-sep-gf-header"))) (set_tile "sepvor" "0") (set_tile "sepnach" "0") + (if es-folgt-sep (mode_tile "sepnach" 1)) (action_tile "accept" "(setq gsepvor (get_tile \"sepvor\")) (setq gsepnach (get_tile \"sepnach\")) (done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") @@ -7008,7 +7019,7 @@ (setq hz-neu (car (frame->hz-winkel frame))) ) (setq rad3 (* gf-max-winkel (/ pi 180.0))) - (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl nil)) + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl (list (= gf-kettenende-antwort "1")))) (princ (ssg-text "vfl-sep-vor-gf-frage")) (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) @@ -7050,9 +7061,16 @@ (if (> sep-anzahl 0) (setq deltaH (max 0.0 (- deltaH (* sep-anzahl *vfk-separator-laenge* (sin rad3)))))) ;; ES-Fussabdruck VORAB reservieren, siehe Kommentar bei - ;; gf-kettenende-antwort oben. + ;; gf-kettenende-antwort oben. ES bringt IMMER seinen eigenen + ;; Separator mit (vfl-insert-es-element, siehe Kommentar oben + ;; "bringt seinen eigenen Separator VOR dem ES-Block schon + ;; mit") - dessen Hoehenanteil fehlte hier bisher komplett + ;; (realer Bug, Nutzer-Meldung 2026-10-08: Kette baute zu lang/ + ;; zu tief, weil der automatische Kettenende-Separator anders + ;; als die optionalen vor/nach-Separatoren oben NICHT reserviert + ;; wurde). (if (= gf-kettenende-antwort "1") - (setq deltaH (max 0.0 (- deltaH (abs ein-dz))))) + (setq deltaH (max 0.0 (- deltaH (* *vfk-separator-laenge* (sin rad3)) (abs ein-dz))))) (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-gefaelle-impl (list (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) t nil))) @@ -7116,7 +7134,7 @@ ;; gepickten deltaL abgezogen, damit die Kette exakt am ;; gepickten Punkt endet statt danach ueberzustehen. (setq rad3 (* gf-max-winkel (/ pi 180.0))) - (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl nil)) + (if (vfl-wizard-aktiv) (vl-catch-all-apply 'vflw-gruppe-sep-gf-impl (list (= gf-kettenende-antwort "1")))) (princ (ssg-text "vfl-sep-vor-gf-frage")) (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) @@ -7139,9 +7157,15 @@ (if (> sep-anzahl 0) (setq deltaL (- deltaL (* sep-anzahl *vfk-separator-laenge* (cos rad3))))) ;; ES-Fussabdruck VORAB reservieren, siehe Kommentar bei - ;; gf-kettenende-antwort oben. + ;; gf-kettenende-antwort oben. ES bringt IMMER seinen + ;; eigenen Separator mit (vfl-insert-es-element) - dessen + ;; Laenge fehlte hier bisher komplett (realer Bug, + ;; Nutzer-Meldung 2026-10-08: Kette baute ca. 300mm*cos(w) + ;; zu lang, weil der automatische Kettenende-Separator + ;; anders als die optionalen vor/nach-Separatoren oben + ;; NICHT reserviert wurde). (if (= gf-kettenende-antwort "1") - (setq deltaL (- deltaL (abs ein-dx)))) + (setq deltaL (- deltaL (* *vfk-separator-laenge* (cos rad3)) (abs ein-dx)))) (if (< deltaL 1.0) (progn (princ (ssg-text "vfl-fehler-linie-zu-kurz")) (setq gf-ok nil))) (if gf-ok @@ -8985,6 +9009,12 @@ (princ (ssg-text "vfl-vwnb-titel")) (princ "\n=========================================") + ;; "Zurueck"/"Abbrechen"-Flag ganz am Anfang zuruecksetzen - identischer Fix + ;; wie in vf-linienzug-modus/-modus2 (siehe dortiger Kommentar): sonst + ;; wuerde ein von einem VORHERIGEN Lauf noch gesetztes Flag den allerersten + ;; vfl-in-*-Aufruf dieses NEUEN Laufs sofort wieder abbrechen. + (setq *vfl-wizard-abbruch-grund* nil) + ;; --- Debug-Session (Schalter "vfl-modus3", DEFAULT AN) ------------------- ;; Bei Bedarf abschaltbar: (dbg-schalter-off "vfl-modus3") in der Konsole. ;; Alle interaktiven Eingaben (Punkte, Hoehen, Seiten, Winkel, Menue- @@ -9503,6 +9533,7 @@ nonclimber-cnt nkurve kurve-chords run-span hor-koerper-len hor-pairs flat-p flat-zone-erste fill-len wahl3 rad3v feste-vf dH-adj dir-x dir-y fill-D end-hz + laengs-wert quer-wert soll-korrigiert es-vek-fix es-along-fix gf-total br-gf-mode br-gf2-exp filler-A-len filler-a-done as-vorhanden es-vorhanden dbg-an dbg-old-error @@ -9512,6 +9543,16 @@ (princ (ssg-text "vfl-m3-titel")) (princ "\n=========================================") + ;; "Zurueck"/"Abbrechen"-Flag ganz am Anfang zuruecksetzen (auch schon vor + ;; der ersten Praeambel-Frage) - sonst wuerde ein von einem VORHERIGEN Lauf + ;; (egal ob Modus 1/2/3) noch gesetztes Flag (z.B. nach "Abbrechen") den + ;; allerersten vfl-in-*-Aufruf DIESES NEUEN Laufs sofort wieder abbrechen + ;; (siehe zentraler Check in vfl-in-value/-value-p) - identischer Fix wie in + ;; vf-linienzug-modus (Modus 1). Realer Bug: ein zweiter Modus-2-Aufruf in + ;; derselben Zeichnung/Session brach sofort mit "ABBRUCH-TRIGGER: + ;; *vfl-wizard-abbruch-grund*=abbrechen" ab, ohne ueberhaupt die + ;; Pfad-Auswahl anzuzeigen (Livetest 2026-09-21). + (setq *vfl-wizard-abbruch-grund* nil) ;; *vfl-journal* VOR dem allerersten vfl-in-*-Aufruf zuruecksetzen (nicht ;; *vfl-replay-queue*, siehe Kommentar bei vfl-journal-reset-lauf und die ;; analoge Korrektur in vf-linienzug-modus). Frueher stand dieser Reset erst @@ -10304,12 +10345,30 @@ ;; ~0 sein (Endpunkt liegt auf der KS_AUS-Achse), Laengs = ES-Ausladung. (setq end-hz (car (frame->hz-winkel frame))) ; KS_AUS-Achsrichtung (setq dir-x (cos (* end-hz (/ pi 180.0))) dir-y (sin (* end-hz (/ pi 180.0)))) - (princ (ssg-textf "vfl-m3-laengs-quer" - (list (rtos (+ (* (- (car ist-ende) (car soll-ende)) dir-x) - (* (- (cadr ist-ende) (cadr soll-ende)) dir-y)) 2 1) - (rtos (+ (* (- (car ist-ende) (car soll-ende)) (- dir-y)) - (* (- (cadr ist-ende) (cadr soll-ende)) dir-x)) 2 1)))) + (setq laengs-wert (+ (* (- (car ist-ende) (car soll-ende)) dir-x) + (* (- (cadr ist-ende) (cadr soll-ende)) dir-y))) + (setq quer-wert (+ (* (- (car ist-ende) (car soll-ende)) (- dir-y)) + (* (- (cadr ist-ende) (cadr soll-ende)) dir-x))) + (princ (ssg-textf "vfl-m3-laengs-quer" (list (rtos laengs-wert 2 1) (rtos quer-wert 2 1)))) (princ (ssg-text "vfl-m3-achse-hinweis")) + ;; Soll (ES-korrigiert): der gepickte Zielpunkt, verschoben um den bereits + ;; oben gemessenen Laengs-Wert entlang der KS_AUS-Achse - zeigt, dass die + ;; Abweichung oben keine Unsicherheit ist, sondern GENAU der ES-eigene + ;; Fussabdruck (90/30-Grad-Schwenk, siehe doc/VarioFoerderer_Linienzug_ + ;; Prinzipien.md Abschnitt 6/14.11: "seitliche ES-Ausladung, kein Fehler"). + ;; Bewusst aus dem bereits gemessenen Laengs-Wert abgeleitet statt ueber + ;; eine zweite, eigenstaendige vf-element-ks-info-Neuberechnung - das waere + ;; ein zweiter Rechenweg fuer dieselbe Information mit eigenem Bug-Risiko, + ;; hier reicht die Umkehrung der bereits validierten Laengs/Quer-Zerlegung. + (setq soll-korrigiert (list (+ (car soll-ende) (* laengs-wert dir-x)) + (+ (cadr soll-ende) (* laengs-wert dir-y)) + (caddr soll-ende))) + (princ (ssg-textf "vfl-m3-ziel-soll-es-korrigiert" + (list (rtos (car soll-korrigiert) 2 1) (rtos (cadr soll-korrigiert) 2 1) (rtos (caddr soll-korrigiert) 2 1)))) + (princ (ssg-textf "vfl-m3-abweichung-es-korrigiert" + (list (rtos (- (car ist-ende) (car soll-korrigiert)) 2 1) + (rtos (- (cadr ist-ende) (cadr soll-korrigiert)) 2 1) + (rtos (- (caddr ist-ende) (caddr soll-korrigiert)) 2 1)))) (princ "\n=========================================") (if dbg-an diff --git a/lang/de_DE.json b/lang/de_DE.json index 78d3d67..34df8a6 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -245,6 +245,8 @@ "vfl-m3-abweichung": "\n Abweichung: dX=%1 dY=%2 dZ=%3 mm", "vfl-m3-laengs-quer": "\n Laengs KS_AUS-Achse: %1 mm | Quer zur Achse (soll ~0): %2 mm", "vfl-m3-achse-hinweis": "\n (dZ=Ziel-Hoehe; Quer zur KS_AUS-Achse ~0 => Endpunkt liegt auf der Achse)", + "vfl-m3-ziel-soll-es-korrigiert": "\n Soll (ES-korrigiert): X=%1 Y=%2 Z=%3 (Ziel + bekannter ES-Laengsversatz)", + "vfl-m3-abweichung-es-korrigiert": "\n Abweichung (ES-korrigiert): dX=%1 dY=%2 dZ=%3 mm", "gf-fehler-block-fehlt": "\n FEHLER: Block '%1' fehlt", "gf-fehler-block-fehlt-ausruf": "\n FEHLER: Block '%1' fehlt!", "gf-fehler-blockdatei-fehlt": "\n FEHLER: Block-Datei nicht gefunden: %1", @@ -500,6 +502,7 @@ "vfc-alert-keine-gueltige-linie": "Keine gueltige Linie ausgewaehlt!", "vfc-bitte-3dlinie-foerderstrecke": "\nBitte 3D-Linie fuer die Foerderstrecke auswaehlen:", "vfc-bks-weltkoordinaten": "\n BKS auf Weltkoordinaten gesetzt.", + "vfc-dlg-startpunkt-kopf": "Startpunkt der Anlage waehlen (X/Y):", "vfc-eingabemodus-3dlinie": "\n 1 - 3D-Linie auswaehlen (Start- und Endpunkt mit Hoehe)", "vfc-eingabemodus-header": "\n\nEingabemodus waehlen:", "vfc-eingabemodus-werte": "\n 2 - Werte manuell eingeben", @@ -526,6 +529,7 @@ "vfc-objekt-block-waehlen": "\n >> Objekt (Block) waehlen: ", "vfc-prompt-delta-h": "\n%1H - Hoehenunterschied (mm): ", "vfc-prompt-delta-l": "\n%1L - Horizontale Distanz (mm): ", + "vfc-prompt-einfuegehoehe-3dlinie": "\nEinfuegehoehe (mm) [%1 - Hoehe des Linien-Startpunkts]: ", "vfc-prompt-startpunkt-aus": "\nStartpunkt fuer AUS_Element waehlen: ", "vfc-prompt-wahl-1-2-ohne-default": "\nIhre Wahl (1/2): ", "vfc-status-ok": " OK", diff --git a/lang/en_GB.json b/lang/en_GB.json index 8af50c3..b758b4d 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -245,6 +245,8 @@ "vfl-m3-abweichung": "\n Deviation: dX=%1 dY=%2 dZ=%3 mm", "vfl-m3-laengs-quer": "\n Along KS_AUS axis: %1 mm | across axis (should be ~0): %2 mm", "vfl-m3-achse-hinweis": "\n (dZ=target height; across KS_AUS axis ~0 => end point lies on the axis)", + "vfl-m3-ziel-soll-es-korrigiert": "\n Target (ES-corrected): X=%1 Y=%2 Z=%3 (target + known ES lateral offset)", + "vfl-m3-abweichung-es-korrigiert": "\n Deviation (ES-corrected): dX=%1 dY=%2 dZ=%3 mm", "gf-fehler-block-fehlt": "\n ERROR: block '%1' missing", "gf-fehler-block-fehlt-ausruf": "\n ERROR: block '%1' missing!", "gf-fehler-blockdatei-fehlt": "\n ERROR: block file not found: %1", @@ -500,6 +502,7 @@ "vfc-alert-keine-gueltige-linie": "No valid line selected!", "vfc-bitte-3dlinie-foerderstrecke": "\nPlease select a 3D line for the conveyor section:", "vfc-bks-weltkoordinaten": "\n UCS set to world coordinates.", + "vfc-dlg-startpunkt-kopf": "Select start point of the system (X/Y):", "vfc-eingabemodus-3dlinie": "\n 1 - Select 3D line (start and end point with height)", "vfc-eingabemodus-header": "\n\nSelect input mode:", "vfc-eingabemodus-werte": "\n 2 - Enter values manually", @@ -526,6 +529,7 @@ "vfc-objekt-block-waehlen": "\n >> Select object (block): ", "vfc-prompt-delta-h": "\n%1H - height difference (mm): ", "vfc-prompt-delta-l": "\n%1L - horizontal distance (mm): ", + "vfc-prompt-einfuegehoehe-3dlinie": "\nInsertion height (mm) [%1 - height of the line start point]: ", "vfc-prompt-startpunkt-aus": "\nSelect start point for AUS_Element: ", "vfc-prompt-wahl-1-2-ohne-default": "\nYour choice (1/2): ", "vfc-status-ok": " OK",