From 4238509e7d2bd3871f623cd5b1e21902fab3b90f Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Thu, 27 Aug 2026 10:59:10 +0200 Subject: [PATCH] Debug-Logging fuer VF-Linienzug Modus 1 und Modus 3 Zentrale Debug-Schalter-Sammlung (*dbg-schalter*, Default AUS) in ssg_dbg.lsp: dbg-schalter-on/-off/-p/-open/-liste. dbg*-Aufrufe bleiben dauerhaft im Code, ohne im Normalbetrieb .dbg-Dateien zu erzeugen. Modus 1 (vf-linienzug-modus): Session-Logging ueber Schalter "vfl-modus1" nach DXFM_LOG/vfl_modus1.dbg. Da alle interaktiven Eingaben bereits ueber die gemeinsamen vfl-in-point/-string/-real/ -int/-value/-selection-Wrapper laufen, reicht eine einzige Instrumentierung in vfl-journal-record/-mark/-steplabel, um jede Frage/Antwort automatisch mitzuloggen. Modus 3 (vf-linienzug-modus3): auf dieselben vfl-in-*-Wrapper umgestellt (vorher rohe getstring/getreal/getint/ssget) - profitiert dadurch vom selben automatischen Logging (Schalter "vfl-modus3", DXFM_LOG/vfl_modus3.dbg). Kein Journal-Replay/XDATA wie bei Modus 1/2, nur das Logging wurde uebernommen. Fix nebenbei: Dialog-Kopfzeile "Hoehe (Z) des Endpunkts [%1]" zeigte den Platzhalter woertlich statt des Vorschlagswerts (ssg-text statt ssg-textf). Co-Authored-By: Claude Sonnet 5 --- Lisp/README.md | 49 ++++++++ Lisp/ssg_dbg.lsp | 52 +++++++++ Lisp/vf_linienzug.lsp | 256 ++++++++++++++++++++++++++++++++---------- 3 files changed, 299 insertions(+), 58 deletions(-) diff --git a/Lisp/README.md b/Lisp/README.md index 49ab91b..0afcc5e 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -192,6 +192,55 @@ Beispiel: (dbgclose) ``` +#### Zentrale Debug-Schalter (default AUS) + +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. + +| Funktion | Beschreibung | +| --- | --- | +| `dbg-schalter-on name` | Schalter `name` einschalten (1) | +| `dbg-schalter-off name` | Schalter `name` ausschalten (0) | +| `dbg-schalter-p name` | `T` wenn eingeschaltet, sonst `nil` | +| `dbg-schalter-open name filename envvar` | Öffnet die Datei **nur** wenn Schalter=1; gibt `T`/`nil` zurück | +| `dbg-schalter-liste` | Alle bekannten Schalter + Zustand ausgeben | + +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` | + +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` +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. + +```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 +``` + +Muster in einer Routine: + +```lisp +(setq dbg-an (dbg-schalter-open "vfl-modus3" "vfl_modus3.dbg" "DXFM_LOG")) +(if dbg-an (dbgmsg "FRAGE: ...")) +;; ... get* ... +(if dbg-an (progn (dbgmsg "ANTWORT:") (dbg 'wert) (dbgflush))) +;; am Ende: +(if dbg-an (progn (dbgreturn ergebnis) (dbgclose))) +``` + --- ### `ssg_dialog.lsp` – Dialog-Pattern für Modul-Einfüge-Makros diff --git a/Lisp/ssg_dbg.lsp b/Lisp/ssg_dbg.lsp index 917ff84..334ff88 100644 --- a/Lisp/ssg_dbg.lsp +++ b/Lisp/ssg_dbg.lsp @@ -34,6 +34,58 @@ (setq *dbg-active* T) ; Debug-Ausgabe aktiv (Standard: ein) (setq *dbg-buffer* nil) ; Zeilenpuffer (Liste von Strings) +;; ------------------------------------------------------------ +;; 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. +;; +;; (dbg-schalter-on "vfl-modus3") ; Schalter einschalten (1) +;; (dbg-schalter-off "vfl-modus3") ; Schalter ausschalten (0) +;; (dbg-schalter-p "vfl-modus3") ; T wenn eingeschaltet, sonst nil +;; (dbg-schalter-open "vfl-modus3" "vfl_modus3.dbg" "DXFM_LOG") +;; ; oeffnet die Datei NUR wenn Schalter=1; +;; ; gibt T zurueck wenn geoeffnet, sonst nil +;; (dbg-schalter-liste) ; alle bekannten Schalter + Zustand zeigen +;; ------------------------------------------------------------ +(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") + (if (not (assoc nm *dbg-schalter*)) + (setq *dbg-schalter* (cons (cons nm 0) *dbg-schalter*)))) + +(defun dbg-schalter-set (name wert) + (setq *dbg-schalter* + (cons (cons name wert) + (vl-remove-if '(lambda (p) (= (car p) name)) *dbg-schalter*))) + wert) + +(defun dbg-schalter-on (name) (dbg-schalter-set name 1) (princ)) +(defun dbg-schalter-off (name) (dbg-schalter-set name 0) (princ)) + +(defun dbg-schalter-p (name / p) + (setq p (assoc name *dbg-schalter*)) + (and p (= (cdr p) 1))) + +;; Oeffnet die Debug-Datei NUR, wenn der Schalter eingeschaltet ist. +;; Rueckgabe: T wenn eine Datei geoeffnet wurde, sonst nil. +(defun dbg-schalter-open (name filename envvar) + (if (dbg-schalter-p name) + (progn (dbgon) (dbgopen filename envvar) T) + nil)) + +(defun dbg-schalter-liste ( / ) + (prompt "\n[DBG] Bekannte Debug-Schalter:") + (foreach p (reverse *dbg-schalter*) + (prompt (strcat "\n " (car p) " = " (itoa (cdr p)) + (if (= (cdr p) 1) " (EIN)" " (aus)")))) + (princ)) + ;; ------------------------------------------------------------ ;; DBGON - Debug-Ausgabe aktivieren ;; ------------------------------------------------------------ diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 1f151bc..708666d 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -135,8 +135,25 @@ (setq *vfl-journal* '() *vfl-replay-queue* nil)) ;; Eintrag anhaengen (vorn, da Reverse-Reihenfolge). +;; Zusaetzlich (falls ein Debug-Schalter fuer die aktuelle Sitzung eine .dbg- +;; Datei geoeffnet hat, siehe ssg_dbg.lsp/dbg-schalter-open) wird jeder +;; Eintrag als FRAGE/ANTWORT-Paar mitgeloggt - da ALLE interaktiven Eingaben +;; von Modus 1 UND Modus 2 durch diesen einen Punkt laufen (vfl-in-point/ +;; -string/-real/-int/-value/-selection), deckt das beide Modi komplett ab, +;; ohne jede einzelne Aufrufstelle im Bau-Ablauf separat instrumentieren zu +;; muessen. Modus 3 nutzt bewusst rohe getstring/getreal/getint (reine +;; Konsole, kein Journal) und wird stattdessen direkt in vf-linienzug-modus3 +;; mit eigenen dbgmsg-Aufrufen geloggt. dbgmsg/dbg sind von sich aus No-Ops, +;; solange keine .dbg-Datei offen ist (*dbg-path* nil) - daher hier bewusst +;; UNBEDINGT aufgerufen, kein eigener An/Aus-Check noetig. (defun vfl-journal-record (kind val) - (setq *vfl-journal* (cons (cons kind val) *vfl-journal*))) + (setq *vfl-journal* (cons (cons kind val) *vfl-journal*)) + (if (= kind "STEP") + (dbgmsg (strcat "--- GLIED: " (if val (vl-princ-to-string val) "?") " ---")) + (progn + (dbgmsg (strcat "EINGABE [" kind "]:")) + (dbg val) + (dbgflush)))) ;; Glied-Checkpoint setzen (Label spaeter via vfl-journal-steplabel setzbar). (defun vfl-journal-mark (label) @@ -153,6 +170,8 @@ (progn (setq found t) (cons "STEP" label)) e))) *vfl-journal*)) + (dbgmsg (strcat "--- GLIED-LABEL: " (if label label "?") " ---")) + (dbgflush) label) ;; Naechsten Eingabe-Eintrag aus der Replay-Queue poppen (STEP-Marker dabei @@ -189,6 +208,7 @@ (if (not (boundp '*vfl-wizard-mode*)) (setq *vfl-wizard-mode* T)) (if (not (boundp '*vflw-menu-optionen*)) (setq *vflw-menu-optionen* nil)) (if (not (boundp '*vflw-menu-default*)) (setq *vflw-menu-default* 1)) +(if (not (boundp '*vflw-menu-frage*)) (setq *vflw-menu-frage* nil)) (defun c:VF_WIZARD_AN () (setq *vfl-wizard-mode* T) @@ -508,7 +528,8 @@ (if (not (new_dialog "vflw_zahl" dat)) (if (and dat (>= dat 0)) (unload_dialog dat)) (progn - (set_tile "kopf" (vflw-clean (ssg-text "vfl-prompt-hoehe-endpunkt"))) + (set_tile "kopf" (vflw-clean (ssg-textf "vfl-prompt-hoehe-endpunkt" + (list (rtos hoehe-default 2 1))))) (set_tile "wert" (rtos hoehe-default 2 1)) (action_tile "accept" "(setq dlg-wert (get_tile \"wert\")) (done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") @@ -640,7 +661,8 @@ (setq v (car popped)) (setq v (if (and *vfl-wizard-mode* *vflw-menu-optionen*) - (vflw-wahl prompt *vflw-menu-optionen* *vflw-menu-default*) + (vflw-wahl (if *vflw-menu-frage* (ssg-text *vflw-menu-frage*) prompt) + *vflw-menu-optionen* *vflw-menu-default*) (getstring prompt)))))) ;; "" (Enter/Abbruch) ist ein gueltiger String, kein Abbruch -> "STR". (vfl-journal-record (if (eq (type v) 'STR) "STR" "NIL") v) @@ -669,7 +691,8 @@ (setq v (if (and *vfl-wizard-mode* *vflw-menu-optionen*) (progn - (setq vs (vflw-wahl prompt *vflw-menu-optionen* *vflw-menu-default*)) + (setq vs (vflw-wahl (if *vflw-menu-frage* (ssg-text *vflw-menu-frage*) prompt) + *vflw-menu-optionen* *vflw-menu-default*)) (if (and vs (> (strlen vs) 0)) (atoi vs) nil)) (getint prompt)))))) (vfl-journal-record (if v "INT" "NIL") v) @@ -677,17 +700,25 @@ ;; Menue-Wrapper: princ-Ausgabe der Optionen bleibt beim Aufrufer unveraendert ;; stehen (Konsolen-Fallback, de/en via ssg-text) - hier wird nur die -;; ABSCHLIESSENDE Eingabe-Zeile ersetzt. *vflw-menu-optionen*/-default sind -;; ueber die '/'-Lokalvariablen dynamisch nur waehrend dieses Aufrufs sichtbar -;; (AutoLISP dynamic scoping) und wirken daher ausschliesslich auf den EINEN -;; vfl-in-string/-int-Aufruf im Rumpf. -(defun vfl-menu (prompt option-labels default-idx / *vflw-menu-optionen* *vflw-menu-default*) +;; ABSCHLIESSENDE Eingabe-Zeile ersetzt. frage-key: ssg-text-Schluessel der +;; eigentlichen Frage (die Kopfzeile, die vorher separat per princ ausgegeben +;; wurde, z.B. "vfl-ist-endpunkt-frage") - OHNE das wuerde der Wizard-Dialog +;; nur die generische "Ihre Wahl (1/2/3)..."-Zeile zeigen und die eigentliche +;; Frage bliebe unsichtbar (nur auf der Konsole hinter dem Dialog). Die +;; Lokalvariablen sind ueber die '/'-Deklaration dynamisch nur waehrend +;; dieses Aufrufs sichtbar (AutoLISP dynamic scoping) und wirken daher +;; ausschliesslich auf den EINEN vfl-in-string/-int-Aufruf im Rumpf. +(defun vfl-menu (prompt option-labels default-idx frage-key / + *vflw-menu-optionen* *vflw-menu-default* *vflw-menu-frage*) (setq *vflw-menu-optionen* option-labels) (setq *vflw-menu-default* default-idx) + (setq *vflw-menu-frage* frage-key) (vfl-in-string prompt)) -(defun vfl-menu-int (prompt option-labels default-idx / *vflw-menu-optionen* *vflw-menu-default*) +(defun vfl-menu-int (prompt option-labels default-idx frage-key / + *vflw-menu-optionen* *vflw-menu-default* *vflw-menu-frage*) (setq *vflw-menu-optionen* option-labels) (setq *vflw-menu-default* default-idx) + (setq *vflw-menu-frage* frage-key) (vfl-in-int prompt)) ;; Generischer Wrapper fuer eine Eingabe, die nicht direkt ein getXXX ist, @@ -900,7 +931,7 @@ (list (ssg-textf "vfl-winkel-option" (list idx (car e) (rtos (cadr e) 2 1) (rtos (caddr e) 2 1)))))) (setq idx (1+ idx))) (setq antwort (vfl-menu-int (ssg-textf "vfl-prompt-wahl-bis-n" (list (length gueltige))) - labels 1)) + labels 1 "vfl-mehrere-winkel-header")) (if (or (null antwort) (< antwort 1) (> antwort (length gueltige))) (setq antwort 1)) (setq e (nth (1- antwort) gueltige)) (list (nth 0 e) (nth 1 e) (nth 2 e))))) @@ -1215,7 +1246,7 @@ (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) (setq sep-vor (= (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") - (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2) "1")) + (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2 "vfl-sep-vor-frage") "1")) (if (and ziel-modus sep-vor) (setq dL (max 100.0 (- dL 300.0)))) ;; auf_3-Eintritt nur, wenn noch NICHT flach (sonst flache Zone fortsetzen). ;; dL ist die gewuenschte Reststrecke AB HIER (pt) - der reale Bogen- @@ -1236,7 +1267,7 @@ (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) (setq sep-nach (= (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") - (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2) "1")) + (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2 "vfl-sep-nach-frage") "1")) (if (and ziel-modus sep-nach) (setq dL (max 100.0 (- dL 300.0)))) ;; Im Ziel-Modus: "Ist der Endpunkt der Foerderer?" JETZT abfragen (statt ;; erst danach in der Aufruferschleife) - der Ausgangs-Fussabdruck @@ -1251,7 +1282,8 @@ (setq ist-ende-antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def2") (list (ssg-text "vfl-ja-nur-motorstation") (ssg-text "vfl-nein-weiterbauen") - (ssg-text "vfl-ja-motorstation-kettenende")) 2)) + (ssg-text "vfl-ja-motorstation-kettenende")) 2 + "vfl-ist-endpunkt-frage")) (cond ((= ist-ende-antwort "1") (setq dL (max 100.0 (- dL (car (get-bogen-mass bogen-ab 3)) 500.0 @@ -1479,7 +1511,8 @@ (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def2") (list (ssg-text "vfl-ja-nur-motorstation") (ssg-text "vfl-nein-weiterbauen") - (ssg-text "vfl-ja-motorstation-kettenende")) 2)) + (ssg-text "vfl-ja-motorstation-kettenende")) 2 + "vfl-ist-endpunkt-frage")) ) ) (if (= antwort "1") @@ -1495,7 +1528,8 @@ (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-es-nein-zielpunkt")) (setq es-antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "vfl-ja") (ssg-text "vfl-es-nein-zielpunkt")) 1)) + (list (ssg-text "vfl-ja") (ssg-text "vfl-es-nein-zielpunkt")) 1 + "vfl-es-setzen-frage")) (setq es-gewuenscht (/= es-antwort "2")) (if (not es-gewuenscht) (progn (setq save-eindx ein-dx save-eindz ein-dz) @@ -1518,7 +1552,8 @@ (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3") (list (ssg-text "vfl-opt-horizontaler-foerderer") (ssg-text "vfl-opt-vario-kurve") - (ssg-text "vfl-opt-auf-ab-foerderer")) 3)) + (ssg-text "vfl-opt-auf-ab-foerderer")) 3 + "vfl-naechstes-element-vf")) (cond ;; --- Vario-Kurve (aendert hz) --- ((= antwort "2") @@ -1679,14 +1714,15 @@ (princ (ssg-text "vfl-winkel-90")) (setq antwort (vfl-menu-int (ssg-text "vfl-prompt-wahl-1-3-def3") (list (ssg-text "vfl-winkel-30") (ssg-text "vfl-winkel-60") - (ssg-text "vfl-winkel-90")) 3)) + (ssg-text "vfl-winkel-90")) 3 "vfl-gf-bogen-winkel-header")) (if (null antwort) (setq antwort 3)) (setq bwinkel (cond ((= antwort 1) 30) ((= antwort 2) 60) (t 90))) (princ (ssg-text "vfl-gf-bogen-seite-header")) (princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-rechts")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1)) + (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1 + "vfl-gf-bogen-seite-header")) (setq bseite (if (= antwort "2") "rechts" "links")) (vfl-insert-gf-bogen-block frame bwinkel bseite) ) @@ -1743,20 +1779,22 @@ (princ (ssg-text "vfl-opt3-30grad")) (setq antwort (vfl-menu-int (ssg-text "vfl-prompt-wahl-1-3-def1") (list (ssg-text "vfl-opt1-90grad") (ssg-text "vfl-opt2-60grad") - (ssg-text "vfl-opt3-30grad")) 1)) + (ssg-text "vfl-opt3-30grad")) 1 "vfl-variokurve-winkel-header")) (if (null antwort) (setq antwort 1)) (setq kwinkel (cond ((= antwort 1) 90) ((= antwort 2) 60) (t 30))) (princ (ssg-text "vfl-variokurve-seite-header")) (princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-rechts")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1)) + (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1 + "vfl-variokurve-seite-header")) (setq kseite (if (= antwort "2") "rechts" "links")) (princ (ssg-text "vfl-variokurve-variante-header")) (princ (ssg-text "vfl-variante-aussen")) (princ (ssg-text "vfl-variante-innen")) (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") - (list (ssg-text "vfl-variante-aussen") (ssg-text "vfl-variante-innen")) 2)) + (list (ssg-text "vfl-variante-aussen") (ssg-text "vfl-variante-innen")) 2 + "vfl-variokurve-variante-header")) (setq kvariante (if (= antwort "1") "aussen" "innen")) (vfl-insert-vario-kurve-block frame kwinkel kseite kvariante) ) @@ -1823,7 +1861,8 @@ (princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-rechts")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1)) + (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1 + "gf-seite-ein-header")) (setq es-seite (if (= antwort "2") "rechts" "links")) (vf-set-es-masse *vfl-es-winkel* es-seite) es-seite @@ -1963,7 +2002,8 @@ (princ (ssg-text "vfl-gf-verteilung-ganz-einlauf")) (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") (list (ssg-text "vfl-gf-verteilung-haelfte") - (ssg-text "vfl-gf-verteilung-ganz-einlauf")) 2)) + (ssg-text "vfl-gf-verteilung-ganz-einlauf")) 2 + "vfl-gf-verteilung-header")) (setq res (vfl-vf-einheit frame hz richtung winkel L_GF L_VF (= antwort "1"))) (setq frame (nth 0 res) es-gewuenscht (nth 3 res)) ;; Kettenende? Bei auto-ende (Kettenende-Modus) ohne Frage direkt ES setzen. @@ -1982,7 +2022,8 @@ (princ (ssg-text "vfl-nein-weiterbauen")) (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") (list (ssg-text "vfl-ja-separator-es") - (ssg-text "vfl-nein-weiterbauen")) 2)) + (ssg-text "vfl-nein-weiterbauen")) 2 + "vfl-ist-kettenende-frage")) ) ) ) @@ -2041,7 +2082,8 @@ (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-nein")) (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") - (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2)) + (list (ssg-text "vfl-ja") (ssg-text "vfl-nein")) 2 + "vfl-sep-an-stelle-frage")) (if (= antwort "1") (setq frame (vfl-insert-separator frame))) ) ) @@ -2057,12 +2099,25 @@ frame letzter-typ fertig linie-ende-modus rad3 anzahl-gf anzahl-vf vfl-nummer lastEnt gf-max-winkel gf-ok kettenanfang pick-punkt - as-vorhanden erg old-error vfl-ins) + as-vorhanden erg old-error vfl-ins dbg-an) (princ "\n\n=========================================") (princ (ssg-text "vfl-modus1-header")) (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. + ;; 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 + ;; einzelne Aufrufstelle im Bau-Ablauf separat instrumentiert werden muss. + (setq dbg-an (dbg-schalter-open "vfl-modus1" "vfl_modus1.dbg" "DXFM_LOG")) + (if dbg-an + (progn + (dbgf "vf-linienzug-modus") + (dbgmsg "=== SESSION Modus 1 (Manuelle Eingabe) START ===") + (dbgflush))) + ;; Abhaengigkeit: die GF-Segmente/-Boegen nutzen Funktionen aus ;; Gefaellestrecke.lsp (gf-insert-hz-incl-scaled, gf-bogen-blockname, ...). ;; Bei reiner VarioFoerderer-Ladung ohne Gefaellestrecke wuerde der GF-Zweig @@ -2110,6 +2165,11 @@ (setq *error* old-error) (vfl-modus-abbruch-sichern lastEnt vfl-nummer anzahl-gf anzahl-vf startpunkt frame as-seite es-seite "linienzug") + (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)))) @@ -2130,7 +2190,8 @@ (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-as-nein")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "vfl-ja") (ssg-text "vfl-as-nein")) 1)) + (list (ssg-text "vfl-ja") (ssg-text "vfl-as-nein")) 1 + "vfl-as-setzen-frage")) (setq as-vorhanden (/= antwort "2")) (if as-vorhanden (progn @@ -2141,7 +2202,8 @@ (princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-rechts")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1)) + (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1 + "vfl-aus-seite-header")) (setq as-seite (if (= antwort "2") "rechts" "links")) (vf-set-as-masse *vfl-as-winkel* as-seite) ; Masse fuer Variante ) @@ -2187,7 +2249,8 @@ (ssg-text "vfl-menu-linie-gf-2") (ssg-text "vfl-menu-linie-vf-3") (ssg-text "vfl-menu-horizontal-vf-4") - (ssg-text "vfl-menu-linie-ende-5")) 2)) + (ssg-text "vfl-menu-linie-ende-5")) 2 + "vfl-naechstes-element-header")) (setq wahl (cond ((= antwort "1") "GF-Bogen") ((= antwort "3") "Linie-VF") ((= antwort "4") "Horizontal-VF") @@ -2203,7 +2266,8 @@ (list (ssg-text "vfl-menu-linie-gf-1") (ssg-text "vfl-menu-linie-vf-2") (ssg-text "vfl-menu-horizontal-vf-3") - (ssg-text "vfl-menu-linie-ende-4")) 1)) + (ssg-text "vfl-menu-linie-ende-4")) 1 + "vfl-naechstes-element-header")) (setq wahl (cond ((= antwort "2") "Linie-VF") ((= antwort "3") "Horizontal-VF") ((= antwort "4") (setq linie-ende-modus t) "Linie") @@ -2288,7 +2352,8 @@ (princ (ssg-text "vfl-gefaelle-opt-winkel")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") (list (ssg-text "vfl-gefaelle-opt-hoehe") - (ssg-text "vfl-gefaelle-opt-winkel")) 1)) + (ssg-text "vfl-gefaelle-opt-winkel")) 1 + "vfl-gefaelle-festlegen-header")) (if (= antwort "2") (progn ;; Winkel direkt vorgeben - deltaH ergibt sich aus deltaL*tan(winkel). @@ -2348,7 +2413,8 @@ (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3") (list (ssg-text "vfl-kettenende-opt-ja-es") (ssg-text "vfl-kettenende-opt-ja-ohne-es") - (ssg-text "vfl-kettenende-opt-nein")) 3)) + (ssg-text "vfl-kettenende-opt-nein")) 3 + "vfl-ist-kettenende-header")) (cond ((= antwort "1") (setq es-seite (vfl-frage-es-seite)) @@ -2507,7 +2573,8 @@ (setq antwort (vfl-menu (ssg-text "vfl-prompt-wahl-1-3-def3") (list (ssg-text "vfl-kettenende-opt-ja-es") (ssg-text "vfl-kettenende-opt-ja-ohne-es") - (ssg-text "vfl-kettenende-opt-nein")) 3)) + (ssg-text "vfl-kettenende-opt-nein")) 3 + "vfl-ist-kettenende-header")) ) ) (cond @@ -2556,6 +2623,14 @@ (princ "\n\n=========================================") (princ (ssg-text "vfl-kette-eingefuegt")) (princ "\n=========================================") + + (if dbg-an + (progn + (dbgmsg (strcat "ERGEBNIS: VF_" (itoa vfl-nummer) + " (GF=" (itoa anzahl-gf) " VF=" (itoa anzahl-vf) ")")) + (dbgmsg "=== SESSION Modus 1 ENDE ===") + (dbgreturn (list "VF" vfl-nummer)) + (dbgclose))) (princ) ) @@ -2839,17 +2914,47 @@ (foreach x liste (setq d (abs (- x w))) (if (< d bd) (setq bd d best x))) best) -(defun vf-linienzug-modus3 ( / ss k obj-liste startpunkt start-hoehe as-seite +(defun vf-linienzug-modus3 ( / ss obj-liste startpunkt start-hoehe as-seite es-seite kette segmente n i seg typ hz laenge bwinkel bseite frame antwort winkel deltaL anzahl-gf anzahl-vf vfl-nummer lastEnt hoehe-bis ecke-bad first-line last-line letzt-winkel aus ein soll-ende ist-ende run-typ richtn best-w - kvariante L_VF ent-fp rad3 just-open) + kvariante L_VF ent-fp rad3 just-open + dbg-an old-error) (princ "\n\n=========================================") (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 + ;; 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 + ;; noch Session-Start/-Ende + Zwischenergebnisse, die NICHT direkt aus einer + ;; Nutzereingabe stammen (Analyse-Ergebnis, Segment-Header, Bau-Ergebnis). + ;; *vfl-journal*/*vflw-pending* werden dabei nebenbei mitbefuellt, aber von + ;; Modus 3 nirgends gelesen/persistiert (kein Replay/XDATA wie bei Modus 1/2 + ;; - das ist hier bewusst NICHT mit umgebaut, nur das Logging). + ;; Der *error*-Handler schliesst die Datei bei Abbruch sauber. + (setq dbg-an (dbg-schalter-open "vfl-modus3" "vfl_modus3.dbg" "DXFM_LOG")) + (if dbg-an + (progn + (dbgf "vf-linienzug-modus3") + (dbgmsg "=== SESSION Modus 3 (Vorwaerts-Nachbau) START ===") + (dbgflush))) + (setq old-error *error*) + (setq *error* + (function (lambda (msg) + (setq *error* old-error) + (if dbg-an + (progn + (dbgmsg (strcat "=== ABBRUCH: " (if msg msg "(exit)") " ===")) + (dbgreturn nil) + (dbgclose))) + (if old-error (old-error msg) (princ))))) + ;; Abhaengigkeit Gefaellestrecke-Modul (GF-Bausteine) (if (null (car (atoms-family 1 '("GF-INSERT-HZ-INCL-SCALED")))) (progn (alert (ssg-text "vfl-m3-alert-gf-modul")) (exit))) @@ -2857,23 +2962,24 @@ ;; --- 1. Pfad-Objekte waehlen (LINE/ARC) --- (princ (ssg-text "vfl-m3-pfad-waehlen")) - (setq ss (ssget '((0 . "LINE,ARC")))) + (setq ss (vfl-in-selection '((0 . "LINE,ARC")))) (if (null ss) (progn (princ (ssg-text "vfl-m3-keine-objekte")) (exit))) - (setq obj-liste '() k 0) - (repeat (sslength ss) - (setq obj-liste (cons (vlax-ename->vla-object (ssname ss k)) obj-liste)) - (setq k (1+ k))) + (setq obj-liste (mapcar 'vlax-ename->vla-object ss)) ;; --- 2. Startpunkt (hoehere Seite) + Hoehe + AS-Seite --- - (setq startpunkt (vfl-getpoint nil (ssg-text "vfl-m3-prompt-startpunkt"))) + (setq startpunkt (vfl-in-point nil (ssg-text "vfl-m3-prompt-startpunkt"))) (if (null startpunkt) (progn (princ (ssg-text "vfl-abgebrochen")) (exit))) - (setq start-hoehe (getreal (ssg-textf "vfl-prompt-hoehe-startpunkt" + (setq start-hoehe (vfl-in-real (ssg-textf "vfl-prompt-hoehe-startpunkt" (list (rtos (caddr startpunkt) 2 1))))) (if (null start-hoehe) (setq start-hoehe (caddr startpunkt))) (setq startpunkt (list (car startpunkt) (cadr startpunkt) start-hoehe)) + ;; vf-frage-element-winkel ruft direkt getstring/vflw-wahl auf (kein + ;; vfl-in-*-Wrapper darin) - manuell mitloggen, sonst wuerde diese eine + ;; Eingabe durchrutschen. (setq *vfl-as-winkel* (vf-frage-element-winkel "vf-winkel-aus-header")) ; 30/90 vor Seite + (if dbg-an (progn (dbgmsg "AS-Winkel:") (dbg '*vfl-as-winkel*) (dbgflush))) (princ (ssg-text "vfl-vwnb-aus-seite-menu")) - (setq as-seite (if (= (getstring (ssg-text "prompt-wahl-1-2")) "2") "rechts" "links")) + (setq as-seite (if (= (vfl-in-string (ssg-text "prompt-wahl-1-2")) "2") "rechts" "links")) (vf-set-as-masse *vfl-as-winkel* as-seite) ; Masse fuer Variante ;; --- 3. Sortieren + Analysieren --- @@ -2881,6 +2987,11 @@ (if (null kette) (progn (princ (ssg-text "vfl-m3-fehler-nicht-sortierbar")) (exit))) (setq segmente (gf-analysiere-kette kette)) + (if dbg-an + (progn + (dbgmsg (strcat "ANALYSE: " (itoa (length segmente)) " Segment(e) erkannt")) + (dbg 'segmente) + (dbgflush))) ;; --- 4. Eck-Winkel-Vorpruefung (vor dem Bau) --- (setq ecke-bad (vfl2-pruefe-eckwinkel kette 5.0)) @@ -2923,15 +3034,18 @@ (setq laenge (caddr seg)) (princ (ssg-textf "vfl-m3-seg-gerade" (list (itoa (1+ i)) (itoa n) (rtos laenge 2 0) (rtos hz 2 1)))) + (if dbg-an + (dbgmsg (strcat "SEGMENT " (itoa (1+ i)) "/" (itoa n) + " GERADE (laenge=" (rtos laenge 2 0) " hz=" (rtos hz 2 1) ")"))) (princ (ssg-text "vfl-vwnb-typ-gerade")) - (setq antwort (getstring (ssg-text "prompt-wahl-1-2-3-4"))) + (setq antwort (vfl-in-string (ssg-text "prompt-wahl-1-2-3-4"))) (cond ;; --- GF-Gerade --- ((or (= antwort "") (= antwort "1")) (if (= run-typ "VF") ; offenen VF-Lauf schliessen (progn (setq frame (vfl2-vf-close frame (car (frame->hz-winkel frame)))) (setq run-typ nil))) - (setq winkel (getreal (ssg-text "vfl-m3-prompt-gf-neigung"))) + (setq winkel (vfl-in-real (ssg-text "vfl-m3-prompt-gf-neigung"))) (if (null winkel) (setq winkel 3.0)) (if (> winkel 3.0) (progn (princ (ssg-text "vfl-m3-hinweis-gf-max")) (setq winkel 3.0))) @@ -2960,9 +3074,10 @@ (if (= richtn "horizontal") (setq best-w 0) (progn - (setq best-w (getint (ssg-text "vfl-vwnb-prompt-vario-winkel"))) + (setq best-w (vfl-in-int (ssg-text "vfl-vwnb-prompt-vario-winkel"))) (if (null best-w) (setq best-w 3)) - (setq best-w (vfl2-snap-vfwinkel best-w)))) + (setq best-w (vfl2-snap-vfwinkel best-w)) + (if dbg-an (progn (dbgmsg "Vario-Winkel (gesnapt):") (dbg 'best-w) (dbgflush))))) (setq L_VF laenge) (if just-open (setq L_VF (- L_VF ent-fp))) ; Entry-Fussabdruck reservieren (setq L_VF (max 100.0 L_VF)) @@ -2974,15 +3089,18 @@ (setq bwinkel (nth 3 seg) bseite (nth 4 seg)) (princ (ssg-textf "vfl-m3-seg-bogen" (list (itoa (1+ i)) (itoa n) (itoa bwinkel) bseite))) + (if dbg-an + (dbgmsg (strcat "SEGMENT " (itoa (1+ i)) "/" (itoa n) + " BOGEN (bwinkel=" (itoa bwinkel) " bseite=" bseite ")"))) (princ (ssg-text "vfl-m3-typ-bogen")) - (setq antwort (getstring (ssg-text "prompt-wahl-1-2"))) + (setq antwort (vfl-in-string (ssg-text "prompt-wahl-1-2"))) (if (= antwort "2") ;; --- Vario-Kurve (nur im VF-Lauf) --- (if (not (= run-typ "VF")) (princ (ssg-text "vfl-vwnb-kurve-nur-vf")) (progn (princ (ssg-text "vfl-m3-variante-frage")) - (setq kvariante (if (= (getstring (ssg-text "vfl-prompt-wahl-1-2-def2")) "1") "aussen" "innen")) + (setq kvariante (if (= (vfl-in-string (ssg-text "vfl-prompt-wahl-1-2-def2")) "1") "aussen" "innen")) (setq frame (vfl-insert-vario-kurve-block frame bwinkel bseite kvariante)))) ;; --- GF-Bogen --- (progn @@ -2998,6 +3116,8 @@ ;; --- 7. Kettenende: offenen VF-Lauf schliessen, dann Separator + ES --- (if (null frame) (progn (princ (ssg-text "vfl-m3-nichts-gebaut")) (exit))) + ;; vfl-frage-es-seite nutzt intern bereits vfl-in-value/vfl-menu - wird also + ;; automatisch mitgeloggt, kein manueller dbgmsg noetig. (setq es-seite (vfl-frage-es-seite)) (if (= run-typ "VF") (progn @@ -3024,6 +3144,18 @@ (list (rtos (- (car ist-ende) (car soll-ende)) 2 1) (rtos (- (cadr ist-ende) (cadr soll-ende)) 2 1)))) (princ "\n=========================================") + + ;; --- Debug-Session sauber abschliessen --- + (setq *error* old-error) + (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 3 ENDE ===") + (dbgreturn (list "VF" vfl-nummer)) + (dbgclose))) (princ) ) @@ -3274,7 +3406,8 @@ (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-m3-as-nein")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "vfl-ja") (ssg-text "vfl-m3-as-nein")) 1)) + (list (ssg-text "vfl-ja") (ssg-text "vfl-m3-as-nein")) 1 + "vfl-as-setzen-frage")) (setq as-vorhanden (/= antwort "2")) (if as-vorhanden (progn @@ -3285,7 +3418,8 @@ (princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-rechts")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1)) + (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1 + "gf-seite-aus-header")) (setq as-seite (if (= antwort "2") "rechts" "links")) (vf-set-as-masse *vfl-as-winkel* as-seite) ; Masse fuer Variante ) @@ -3307,7 +3441,8 @@ (princ (ssg-text "vfl-ja")) (princ (ssg-text "vfl-es-nein-zielpunkt")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "vfl-ja") (ssg-text "vfl-es-nein-zielpunkt")) 1)) + (list (ssg-text "vfl-ja") (ssg-text "vfl-es-nein-zielpunkt")) 1 + "vfl-es-setzen-frage")) (setq es-vorhanden (/= antwort "2")) (if es-vorhanden (progn @@ -3318,7 +3453,8 @@ (princ (ssg-text "gf-seite-links")) (princ (ssg-text "gf-seite-rechts")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1)) + (list (ssg-text "gf-seite-links") (ssg-text "gf-seite-rechts")) 1 + "gf-seite-ein-header")) (setq es-seite (if (= antwort "2") "rechts" "links")) (vf-set-es-masse *vfl-es-winkel* es-seite) ; Masse fuer Variante ) @@ -3355,7 +3491,8 @@ (t (princ (ssg-text "vfl-m3-typ-gerade")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list "GF (Neigungswinkel)" "VF (Bruecke)") 1)) + (list "GF (Neigungswinkel)" "VF (Bruecke)") 1 + "vfl-m3-typ-gerade")) (if (= antwort "2") (setq plan (cons (list "Linie" hz laenge "VF" nil) plan)) (progn @@ -3370,12 +3507,14 @@ (list (itoa (1+ i)) (itoa n) (itoa bwinkel) bseite))) (princ (ssg-text "vfl-m3-typ-bogen")) (setq antwort (vfl-menu (ssg-text "prompt-wahl-1-2") - (list "GF-Bogen" "Vario-Kurve") 1)) + (list "GF-Bogen" "Vario-Kurve") 1 + "vfl-m3-typ-bogen")) (if (= antwort "2") (progn (princ (ssg-text "vfl-m3-variante-frage")) (setq kv-variante (if (= (vfl-menu (ssg-text "vfl-prompt-wahl-1-2-def2") - (list (ssg-text "vfl-variante-aussen") (ssg-text "vfl-variante-innen")) 2) + (list (ssg-text "vfl-variante-aussen") (ssg-text "vfl-variante-innen")) 2 + "vfl-m3-variante-frage") "1") "aussen" "innen")) (setq plan (cons (list "Bogen" hz laenge bwinkel bseite "Vario-Kurve" kv-variante) plan)) (setq nach-kurve t)) ; naechste Gerade automatisch VF @@ -3610,7 +3749,8 @@ (princ (ssg-text "vfl-m3-gf-verteilung")) (setq br-gf-mode (if (= (vfl-menu (ssg-text "prompt-wahl-1-2") - (list "Alles am Einlauf (GF1)" "1/2 GF1 + 1/2 GF2") 1) "2") 2 1)) + (list "Alles am Einlauf (GF1)" "1/2 GF1 + 1/2 GF2") 1 + "vfl-m3-gf-verteilung") "2") 2 1)) (if (= br-gf-mode 2) (setq br-gf1 (/ gf-total 2.0) br-gf2-exp (/ gf-total 2.0) filler-A-len (* (/ gf-total 2.0) (cos rad3v)))