From f92c80d82ac5cdfa0e5bb8859a073026f6b20377 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Thu, 27 Aug 2026 11:25:47 +0200 Subject: [PATCH] VF-Linienzug: Modus 2 loggen, Debug-Default auf AN, GF-Hoehenvorschlag-Bug behoben Debug-Logging (Schalter vfl-modus1/2/3) ist jetzt standardmaessig AN statt AUS, damit nicht vor jeder Session manuell eingeschaltet werden muss. Modus 2 (vf-linienzug-modus2) war bisher nicht instrumentiert - Session-Open/Close und *error*-Handling analog Modus 1/3 ergaenzt; da Modus 2 durchgehend die vfl-in-*-Wrapper nutzt, wird das Eingabe-Logging automatisch ueber den vorhandenen vfl-journal-record-Hook mitgezogen. Bugfix: Der Hoehen-Vorschlag im GF-Zielhoehe-Dialog (Wizard + Konsole) war schlicht die unveraenderte Ist-Hoehe der Kette. Direkt uebernommen ergab das deltaH=0, was als "Auf" statt "Ab" gewertet und immer mit "kann nicht steigen" abgelehnt wurde - der Default war also nie baubar. Neue Hilfs- funktion vfl-gf-hoehe-vorschlag rundet auf volle mm ab und zieht bei bereits ganzzahligen Werten zusaetzlich 1mm ab, damit der Vorschlag garantiert unterhalb der Ist-Hoehe liegt. Ausserdem: unnoetige Anfuehrungszeichen aus den zugehoerigen Fehlermeldungen (de/en) entfernt. Co-Authored-By: Claude Sonnet 5 --- Lisp/README.md | 41 +++++++++++---------- Lisp/ssg_dbg.lsp | 19 +++++----- Lisp/vf_linienzug.lsp | 83 +++++++++++++++++++++++++++++++++++++------ lang/de_DE.json | 4 +-- lang/en_GB.json | 4 +-- 5 files changed, 109 insertions(+), 42 deletions(-) diff --git a/Lisp/README.md b/Lisp/README.md index 0afcc5e..83eeba6 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -192,12 +192,14 @@ Beispiel: (dbgclose) ``` -#### Zentrale Debug-Schalter (default AUS) +#### Zentrale Debug-Schalter (default je nach Schalter) Damit `dbg*`-Aufrufe dauerhaft im Code stehen bleiben können, ohne im -Normalbetrieb `.dbg`-Dateien zu erzeugen, gibt es eine zentrale Schalter-Sammlung -(`*dbg-schalter*`, Symbol → 0/1, alle standardmäßig 0/aus). Eine Routine öffnet -ihre Debug-Datei nur, wenn ihr Schalter eingeschaltet ist. +Normalbetrieb ungeplant `.dbg`-Dateien zu erzeugen, gibt es eine zentrale +Schalter-Sammlung (`*dbg-schalter*`, Symbol → 0/1). Eine Routine öffnet ihre +Debug-Datei nur, wenn ihr Schalter eingeschaltet ist. Unbekannte/neue Schalter +gelten implizit als 0/aus; die VF-Linienzug-Schalter unten sind bewusst mit +Default 1/an vorregistriert (siehe Tabelle). | Funktion | Beschreibung | | --- | --- | @@ -209,25 +211,26 @@ ihre Debug-Datei nur, wenn ihr Schalter eingeschaltet ist. Bekannte Schalter: -| Schalter | Modul | Loggt nach | -| --- | --- | --- | -| `"vfl-modus1"` | Linienzug Modus 1 (manuelle Eingabe, `vf-linienzug-modus`) | `DXFM_LOG/vfl_modus1.dbg` | -| `"vfl-modus3"` | Linienzug Modus 3 (Vorwärts-Nachbau, `vf-linienzug-modus3`) | `DXFM_LOG/vfl_modus3.dbg` | +| Schalter | Default | Modul | Loggt nach | +| --- | --- | --- | --- | +| `"vfl-modus1"` | **AN (1)** | Linienzug Modus 1 (manuelle Eingabe, `vf-linienzug-modus`) | `DXFM_LOG/vfl_modus1.dbg` | +| `"vfl-modus2"` | **AN (1)** | Linienzug Modus 2 (3D-Objekte + Ziel-Höhe, `vf-linienzug-modus2`) | `DXFM_LOG/vfl_modus2.dbg` | +| `"vfl-modus3"` | **AN (1)** | Linienzug Modus 3 (Vorwärts-Nachbau, `vf-linienzug-modus3`) | `DXFM_LOG/vfl_modus3.dbg` | -Modus 1 (und baugleich Modus 2) loggen automatisch **jede** interaktive Eingabe, -weil beide ausschließlich über die gemeinsamen Wrapper `vfl-in-point`/`-string`/ -`-real`/`-int`/`-value`/`-selection` gehen, die zentral in `vfl-journal-record` +Alle drei Modi loggen automatisch **jede** interaktive Eingabe, weil sie +durchgehend über die gemeinsamen Wrapper `vfl-in-point`/`-string`/`-real`/ +`-int`/`-value`/`-selection` gehen, die zentral in `vfl-journal-record` protokolliert werden – keine einzelne Aufrufstelle im Bau-Ablauf musste dafür -angefasst werden. Modus 3 ist bewusst reine Konsole (`getstring`/`getreal`/ -`getint`, kein Journal) und wird stattdessen direkt in `vf-linienzug-modus3` -mit eigenen `dbgmsg`-Aufrufen an jeder Frage/Antwort geloggt. +angefasst werden. Da der Default AN ist, wird bei jedem Aufruf von +`FOERDERANLAGE` → `linienzug` ohne weiteres Zutun mitgeloggt; bei Bedarf +einzeln abschaltbar mit `(dbg-schalter-off "vfl-modus1")` usw. ```lisp -;; In der BricsCAD-Konsole VOR dem Befehl FOERDERANLAGE: -(dbg-schalter-on "vfl-modus1") -;; ... FOERDERANLAGE -> linienzug -> Modus 1 durchspielen ... -;; -> Datei DXFM_LOG/vfl_modus1.dbg enthält Session + alle Eingaben -(dbg-schalter-off "vfl-modus1") ; wieder abschalten +;; Standardmaessig bereits an - nur zur Kontrolle: +(dbg-schalter-liste) +;; ... FOERDERANLAGE -> linienzug -> Modus 1/2/3 durchspielen ... +;; -> Datei DXFM_LOG/vfl_modus.dbg enthält Session + alle Eingaben +(dbg-schalter-off "vfl-modus1") ; bei Bedarf einzeln abschalten ``` Muster in einer Routine: diff --git a/Lisp/ssg_dbg.lsp b/Lisp/ssg_dbg.lsp index 334ff88..fd4fc19 100644 --- a/Lisp/ssg_dbg.lsp +++ b/Lisp/ssg_dbg.lsp @@ -38,10 +38,11 @@ ;; ZENTRALE DEBUG-SCHALTER-SAMMLUNG ;; ;; Jedes Feature/jede Routine hat ihren eigenen Schalter (Symbol -> 0/1). -;; DEFAULT: alle AUS (0). Dadurch bleiben (dbg-schalter-openp "name" ...)- -;; Aufrufe im Code stehen, ohne dass beim normalen Arbeiten .dbg-Dateien -;; entstehen. Erst wenn der passende Schalter auf 1 gesetzt wird, wird die -;; Datei angelegt und beschrieben. +;; Neue/unbekannte Schalter (die NICHT unten vorregistriert sind) gelten +;; implizit als AUS (0) - so bleiben (dbg-schalter-open "name" ...)-Aufrufe +;; im Code stehen, ohne dass beim normalen Arbeiten ungeplant .dbg-Dateien +;; entstehen. Die VF-Linienzug-Schalter unten sind bewusst mit Default 1 +;; (EIN) vorregistriert, siehe Kommentar dort. ;; ;; (dbg-schalter-on "vfl-modus3") ; Schalter einschalten (1) ;; (dbg-schalter-off "vfl-modus3") ; Schalter ausschalten (0) @@ -53,11 +54,13 @@ ;; ------------------------------------------------------------ (if (not (boundp '*dbg-schalter*)) (setq *dbg-schalter* nil)) -;; Bekannte Schalter mit Default 0 vorregistrieren (rein informativ fuer -;; dbg-schalter-liste; unbekannte Namen gelten ebenfalls als 0/aus). -(foreach nm '("vfl-modus1" "vfl-modus3") +;; VF-Linienzug (Modus 1/2/3) Debug-Schalter, Default 1 (EIN): der Nutzer +;; will die Session + alle Eingaben durchgehend geloggt haben, ohne den +;; Schalter vor jedem Aufruf manuell einzuschalten. Bei Bedarf einzeln +;; abschaltbar: (dbg-schalter-off "vfl-modus1") usw. +(foreach nm '("vfl-modus1" "vfl-modus2" "vfl-modus3") (if (not (assoc nm *dbg-schalter*)) - (setq *dbg-schalter* (cons (cons nm 0) *dbg-schalter*)))) + (setq *dbg-schalter* (cons (cons nm 1) *dbg-schalter*)))) (defun dbg-schalter-set (name wert) (setq *dbg-schalter* diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 708666d..bb65cb5 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -1106,6 +1106,18 @@ pt ) +;; Vorschlagswert fuer die GF-Zielhoehe: die aktuelle Kettenhoehe (ist-hoehe) +;; UNVERAENDERT als Default anzubieten fuehrt in eine Falle - ein GF-Segment +;; MUSS fallen (0 Grad Gefaelle gibt es nicht), ein direkt uebernommener +;; Vorschlag mit deltaH=0 wird also immer als "kann nicht steigen" abgelehnt. +;; Deshalb hier auf volle mm ABGERUNDET (truncate, nicht rtos-Rundung - die +;; koennte sonst aufrunden und ueber die Ist-Hoehe hinausgehen) und bei +;; bereits ganzzahligen Werten zusaetzlich 1mm abgezogen, damit der Vorschlag +;; immer echt unterhalb der Ist-Hoehe liegt und direkt uebernehmbar ist. +(defun vfl-gf-hoehe-vorschlag (ist-hoehe / gekappt) + (setq gekappt (float (fix ist-hoehe))) + (if (>= gekappt ist-hoehe) (- gekappt 1.0) gekappt)) + ;; Rueckgabe: (deltaL hz p2) oder nil bei Abbruch. p2 = der rohe gepickte ;; Punkt (fuer Diagnose/Nachrechnung nach dem AS-Element-Insert, siehe ;; vfl-projiziere-distanz). Foerderer-Maximallaenge 25 m: bei Ueberschreitung @@ -2105,8 +2117,8 @@ (princ "\n=========================================") (princ (ssg-text "vfl-modus1-beschreibung")) - ;; --- Debug-Session (Schalter "vfl-modus1", DEFAULT AUS) ----------------- - ;; (dbg-schalter-on "vfl-modus1") vor FOERDERANLAGE aktiviert das Loggen. + ;; --- Debug-Session (Schalter "vfl-modus1", DEFAULT AN) ------------------ + ;; (dbg-schalter-off "vfl-modus1") deaktiviert bei Bedarf das Loggen. ;; Geloggt wird ueber vfl-journal-record/-mark/-steplabel (siehe dort) - ;; das erfasst automatisch JEDE interaktive Eingabe dieses Modus (Punkte, ;; Hoehen, Winkel, Menue-Auswahlen) samt Glied-Uebergaengen, ohne dass jede @@ -2346,7 +2358,8 @@ ) (setq gf-ok t) (if *vfl-wizard-mode* - (vl-catch-all-apply 'vflw-gruppe-gefaelle-impl (list (caddr p-aktuell)))) + (vl-catch-all-apply 'vflw-gruppe-gefaelle-impl + (list (vfl-gf-hoehe-vorschlag (caddr p-aktuell))))) (princ (ssg-text "vfl-gefaelle-festlegen-header")) (princ (ssg-text "vfl-gefaelle-opt-hoehe")) (princ (ssg-text "vfl-gefaelle-opt-winkel")) @@ -2376,10 +2389,14 @@ ;; Gegebene Hoehe - wie bisher, aber Winkel wird daraus abgeleitet ;; und gegen den GF-Maximalwinkel geprueft (GF kann nicht steigen). ;; p-aktuell ist ab hier immer der reale Referenzpunkt (bei - ;; Kettenanfang das echte KS_AUS des AS-Elements). + ;; Kettenanfang das echte KS_AUS des AS-Elements). Vorschlag/ + ;; Enter-Default = vfl-gf-hoehe-vorschlag (siehe dort), NICHT + ;; die unveraenderte Ist-Hoehe - sonst waere deltaH=0 und die + ;; GF-Pruefung wiese den Wert als "kann nicht steigen" ab. (setq hoehe-neu - (vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt" (list (rtos (caddr p-aktuell) 2 1))))) - (if (null hoehe-neu) (setq hoehe-neu (caddr p-aktuell))) + (vfl-in-real (ssg-textf "vfl-prompt-hoehe-linienendpunkt" + (list (rtos (vfl-gf-hoehe-vorschlag (caddr p-aktuell)) 2 1))))) + (if (null hoehe-neu) (setq hoehe-neu (vfl-gf-hoehe-vorschlag (caddr p-aktuell)))) (setq deltaH (- hoehe-neu (caddr p-aktuell))) (setq richtung (if (>= deltaH 0.0) "Auf" "Ab")) (setq deltaH (abs deltaH)) @@ -2926,9 +2943,8 @@ (princ (ssg-text "vfl-vwnb-titel")) (princ "\n=========================================") - ;; --- Debug-Session (Schalter "vfl-modus3", DEFAULT AUS) ----------------- - ;; Die .dbg-Datei entsteht nur, wenn der Schalter eingeschaltet wurde: - ;; (dbg-schalter-on "vfl-modus3") -> in der Konsole vor FOERDERANLAGE + ;; --- 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- ;; Auswahlen) laufen ueber die vfl-in-*-Wrapper und werden dadurch ;; automatisch ueber vfl-journal-record mitgeloggt (siehe dort) - hier nur @@ -3374,11 +3390,37 @@ hor-koerper-len hor-pairs flat-p fill-len wahl3 rad3v feste-vf dH-adj dir-x dir-y fill-D end-hz gf-total br-gf-mode br-gf2-exp filler-A-len filler-a-done - as-vorhanden es-vorhanden) + as-vorhanden es-vorhanden dbg-an dbg-old-error) (princ "\n\n=========================================") (princ (ssg-text "vfl-m3-titel")) (princ "\n=========================================") + ;; --- Debug-Session (Schalter "vfl-modus2", DEFAULT AN) ------------------ + ;; (dbg-schalter-off "vfl-modus2") deaktiviert bei Bedarf. Alle Eingaben + ;; laufen bereits durchgehend ueber die vfl-in-*-Wrapper (siehe unten) und + ;; werden dadurch automatisch ueber vfl-journal-record mitgeloggt (analog + ;; Modus 1). Ein FRUEHER, duenner *error*-Hook schliesst die Datei bereits + ;; sauber, falls waehrend Phase A (Klassifizierungsfragen, noch keine + ;; Geometrie) abgebrochen wird - die eigentliche Abbruch-Sicherung (Wickeln + ;; der Teil-Geometrie) wird erst spaeter zu Beginn von Phase B installiert + ;; (siehe dortiger Kommentar) und uebernimmt das Schliessen dann von hier. + (setq dbg-an (dbg-schalter-open "vfl-modus2" "vfl_modus2.dbg" "DXFM_LOG")) + (if dbg-an + (progn + (dbgf "vf-linienzug-modus2") + (dbgmsg "=== SESSION Modus 2 (3D-Objekte + Ziel-Hoehe) START ===") + (dbgflush))) + (setq dbg-old-error *error*) + (setq *error* + (function (lambda (msg) + (setq *error* dbg-old-error) + (if dbg-an + (progn + (dbgmsg (strcat "=== ABBRUCH: " (if msg msg "(exit)") " ===")) + (dbgreturn nil) + (dbgclose))) + (if dbg-old-error (dbg-old-error msg) (princ))))) + ;; Abhaengigkeit Gefaellestrecke-Modul (if (null (car (atoms-family 1 '("GF-INSERT-HZ-INCL-SCALED")))) (progn (alert (ssg-text "vfl-m3-alert-gf-modul")) (exit))) @@ -3622,12 +3664,21 @@ ;; Kommentar) - Phase A (oben) baut noch keine Geometrie, ein Abbruch ;; waehrend der Klassifizierungsfragen haette also ohnehin nichts zu ;; wickeln. Ab Phase B kann jederzeit Geometrie entstehen. - (setq old-error *error*) + ;; *error* ist hier bereits der fruehe dbg-Hook vom Funktionsanfang - wir + ;; loesen ihn komplett ab (Ruecksprungziel ist dbg-old-error, NICHT der + ;; dbg-Hook selbst) und uebernehmen das dbgclose gleich mit, sonst wuerde + ;; bei einem Abbruch ab hier doppelt geschlossen. + (setq old-error dbg-old-error) (setq *error* (function (lambda (msg) (setq *error* old-error) (vfl-modus-abbruch-sichern lastEnt vfl-nummer anzahl-gf anzahl-vf startpunkt frame as-seite es-seite "linienzug2") + (if dbg-an + (progn + (dbgmsg (strcat "=== ABBRUCH: " (if msg msg "(exit)") " ===")) + (dbgreturn nil) + (dbgclose))) (if (and (boundp '*ssg-start-stack*) *ssg-start-stack*) (ssg-end)) (princ)))) ;; erste/letzte Gerade fuer AS/ES-Trimmung bestimmen @@ -3916,6 +3967,16 @@ (* (- (cadr ist-ende) (cadr soll-ende)) dir-x)) 2 1)))) (princ (ssg-text "vfl-m3-achse-hinweis")) (princ "\n=========================================") + + (if dbg-an + (progn + (dbgmsg (strcat "ERGEBNIS: VF_" (itoa vfl-nummer) + " (GF=" (itoa anzahl-gf) " VF=" (itoa anzahl-vf) ")")) + (dbg 'soll-ende) + (dbg 'ist-ende) + (dbgmsg "=== SESSION Modus 2 ENDE ===") + (dbgreturn (list "VF" vfl-nummer)) + (dbgclose))) (princ) ) diff --git a/lang/de_DE.json b/lang/de_DE.json index d0afd2a..3a2d5ec 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -28,8 +28,8 @@ "vfl-prompt-neigungswinkel": "\nNeigungswinkel (Grad, 0 < Winkel <= %1) [%1]: ", "vfl-alert-winkel-ungueltig": "Neigungswinkel ungueltig: %1 Grad. Erlaubt: 0 < Winkel <= %2 Grad.", "vfl-prompt-hoehe-linienendpunkt": "\nHoehe (Z) des Linienendpunkts [%1]: ", - "vfl-alert-gf-kann-nicht-steigen": "Gefaellestrecke (GF) kann nicht steigen - bitte tiefere Zielhoehe waehlen oder \"Ab/Auf VF\" benutzen.", - "vfl-alert-gefaelle-zu-steil": "Gefaelle zu steil fuer GF: %1 Grad (erlaubt max %2 Grad).\nBitte kleinere Hoehendifferenz waehlen oder \"Ab/Auf VF\" benutzen.", + "vfl-alert-gf-kann-nicht-steigen": "Gefaellestrecke (GF) kann nicht steigen - bitte tiefere Zielhoehe waehlen oder Ab/Auf VF benutzen.", + "vfl-alert-gefaelle-zu-steil": "Gefaelle zu steil fuer GF: %1 Grad (erlaubt max %2 Grad).\nBitte kleinere Hoehendifferenz waehlen oder Ab/Auf VF benutzen.", "vfl-ist-kettenende-header": "\nIst das das Kettenende?", "vfl-kettenende-opt-ja-es": "\n 1 - Ja (ES-Element setzen)", "vfl-kettenende-opt-ja-ohne-es": "\n 2 - Ja (ohne ES-Element setzen)", diff --git a/lang/en_GB.json b/lang/en_GB.json index db57811..f9dd505 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -28,8 +28,8 @@ "vfl-prompt-neigungswinkel": "\nIncline angle (degrees, 0 < angle <= %1) [%1]: ", "vfl-alert-winkel-ungueltig": "Incline angle invalid: %1 degrees. Allowed: 0 < angle <= %2 degrees.", "vfl-prompt-hoehe-linienendpunkt": "\nHeight (Z) of the line end point [%1]: ", - "vfl-alert-gf-kann-nicht-steigen": "Gravity section (GF) cannot rise - please pick a lower target height or use \"down/up VF\".", - "vfl-alert-gefaelle-zu-steil": "Slope too steep for GF: %1 degrees (max allowed %2 degrees).\nPlease pick a smaller height difference or use \"down/up VF\".", + "vfl-alert-gf-kann-nicht-steigen": "Gravity section (GF) cannot rise - please pick a lower target height or use down/up VF.", + "vfl-alert-gefaelle-zu-steil": "Slope too steep for GF: %1 degrees (max allowed %2 degrees).\nPlease pick a smaller height difference or use down/up VF.", "vfl-ist-kettenende-header": "\nIs this the chain end?", "vfl-kettenende-opt-ja-es": "\n 1 - Yes (place ES element)", "vfl-kettenende-opt-ja-ohne-es": "\n 2 - Yes (without placing ES element)",