diff --git a/Lisp/KreiselInsert.lsp b/Lisp/KreiselInsert.lsp index f5426ad..fc83a39 100644 --- a/Lisp/KreiselInsert.lsp +++ b/Lisp/KreiselInsert.lsp @@ -295,7 +295,22 @@ ;; WICHTIG: Vor dem Zeichnen den aktuellen letzten Entity merken ;; Aber wenn die Zeichnung leer ist, setzen wir lastEnt auf nil (if (setq lastEnt (entlast)) - (princ) ;; Letzte Entity existiert + (progn + ;; Falls lastEnt ein INSERT mit Attributen ist, muessen wir + ;; bis zum SEQEND navigieren, da entnext sonst in die + ;; ATTRIB-Sub-Entities hineinlaeuft + (if (and (= (cdr (assoc 0 (entget lastEnt))) "INSERT") + (= (cdr (assoc 66 (entget lastEnt))) 1)) + (progn + (setq lastEnt (entnext lastEnt)) + (while (and lastEnt + (/= (cdr (assoc 0 (entget lastEnt))) "SEQEND")) + (setq lastEnt (entnext lastEnt)) + ) + ;; lastEnt ist jetzt SEQEND - entnext darauf gibt das naechste Top-Level-Entity + ) + ) + ) (setq lastEnt nil) ;; Zeichnung ist leer ) @@ -955,20 +970,14 @@ ;; -------------------------------------------- -;; ILS_Eckrad: Einzelnen AN8-Block einfuegen -;; -;; Fuegt den Block AN8.dwg an einem gewaehlten Punkt -;; mit waehlbarer Rotation ein (Eckrad / Umlenkrad). +;; ILS_Eckrad: Befehl - fragt Eingaben ab und fuegt Eckrad ein ;; -------------------------------------------- (defun c:ILS_Eckrad ( / pt rotStr rotation) - - (ssg-start "Eckrad einfuegen" '(("ATTREQ") ("ATTDIA"))) - (setvar "ATTREQ" 0) - (setvar "ATTDIA" 0) + (dbgf "c:ILS_Eckrad") ;; 1. Einfuegepunkt (setq pt (getpoint "\nEinfuegepunkt Eckrad: ")) - (if (null pt) (progn (ssg-end) (exit))) + (if (null pt) (progn (dbgreturn nil) (exit))) ;; 2. Rotation (setq rotStr (getstring "\nRotation in Grad <0>: ")) @@ -977,13 +986,34 @@ (setq rotation (atof rotStr)) ) - ;; 3. AN8 einfuegen + ;; 3. Einfuegen + (ils-eckrad-insert pt rotation) + (dbgreturn nil) +) + +;; -------------------------------------------- +;; ils-eckrad-insert: Fuegt AN8-Block an Punkt mit Rotation ein +;; Parameter: +;; pt - Einfuegepunkt (Liste x y [z]) +;; rotation - Drehwinkel in Grad +;; -------------------------------------------- +(defun ils-eckrad-insert (pt rotation) + (dbgf "ils-eckrad-insert") + (dbg 'pt) + (dbg 'rotation) + + (ssg-start "Eckrad einfuegen" '(("ATTREQ") ("ATTDIA"))) + (setvar "ATTREQ" 0) + (setvar "ATTDIA" 0) + + (dbgp (strcat "INSERT Block: " *block-path* "AN8.dwg")) (command "_.INSERT" (strcat *block-path* "AN8.dwg") pt 1 1 rotation) (princ (strcat "\nEckrad eingefuegt bei " (rtos (car pt) 2 1) "," (rtos (cadr pt) 2 1) " Rotation=" (rtos rotation 2 1))) (ssg-end) + (dbgreturn nil) ) ;; NEU: KreiselLabelSetup - Hier einfügen! diff --git a/Lisp/ssg_dbg.lsp b/Lisp/ssg_dbg.lsp index 9388392..5a4e23c 100644 --- a/Lisp/ssg_dbg.lsp +++ b/Lisp/ssg_dbg.lsp @@ -12,31 +12,27 @@ ;; (dbgp "text") - Debug-Print (Alias fuer dbgmsg) ;; (dbgmsg "text") - Freitext-Nachricht loggen ;; +;; Strategie: dbgf/dbg/dbgmsg puffern im Speicher. +;; dbgreturn flusht den Puffer auf die Platte (open/append/close). +;; So hat jede Funktion mindestens einen Schreibvorgang, +;; ohne dass jeder einzelne dbg-Aufruf die Datei oeffnet. +;; ;; dbgon/dbgoff steuert, ob Ausgaben geschrieben werden. -;; Damit kann man gezielt nur bestimmte Abschnitte debuggen. ;; Ein (dbgoff) VOR (dbgopen) verhindert das Anlegen der Datei. ;; ;; Beispiel: -;; (dbgopen "test.dbg") -;; (dbgoff) ; ab hier keine Ausgabe -;; (dbgf "unwichtig") ; wird NICHT geschrieben -;; (dbgreturn 0) -;; (dbgon) ; ab hier wieder Ausgabe +;; (dbgopen "test.dbg" "DXFM_LOG") ;; (dbgf "meine-funktion") ;; (dbg 'x) -;; (dbgreturn ergebnis) +;; (dbgreturn ergebnis) ; <-- hier wird alles geschrieben ;; (dbgclose) -;; -;; Erzeugt z.B.: -;; meine-funktion(){ -;; x=42 -;; } = 99 ;; ============================================================ ;; Globale Variablen -(setq *dbg-file* nil) ; Datei-Handle +(setq *dbg-path* nil) ; Voller Dateipfad (String) (setq *dbg-indent* 0) ; Aktuelle Einruecktiefe (setq *dbg-active* T) ; Debug-Ausgabe aktiv (Standard: ein) +(setq *dbg-buffer* nil) ; Zeilenpuffer (Liste von Strings) ;; ------------------------------------------------------------ ;; DBGON - Debug-Ausgabe aktivieren @@ -54,6 +50,33 @@ (princ) ) +;; ------------------------------------------------------------ +;; DBG-FLUSH - Puffer auf Platte schreiben (open/append/close) +;; ------------------------------------------------------------ +(defun dbg-flush (/ fh) + (if (and *dbg-path* *dbg-buffer*) + (progn + (setq fh (open *dbg-path* "a")) + (if fh + (progn + (foreach line (reverse *dbg-buffer*) + (write-line line fh) + ) + (close fh) + ) + ) + (setq *dbg-buffer* nil) + ) + ) +) + +;; ------------------------------------------------------------ +;; DBG-BUFWRITE - Zeile in den Puffer schreiben +;; ------------------------------------------------------------ +(defun dbg-bufwrite (line) + (setq *dbg-buffer* (cons line *dbg-buffer*)) +) + ;; ------------------------------------------------------------ ;; DBGOPEN - Debug-Datei oeffnen ;; Wenn *dbg-active* nil ist, wird keine Datei angelegt. @@ -62,12 +85,8 @@ ;; envvar - Optional: Name einer Umgebungsvariable fuer das ;; Zielverzeichnis (z.B. "DXFM_LOG"). ;; Wenn nil oder nicht gesetzt, wird "." verwendet. -;; Aufruf: -;; (dbgopen "test.dbg" "DXFM_LOG") -> C:\...\log\test.dbg -;; (dbgopen "test.dbg" nil) -> .\test.dbg -;; (dbgopen "test.dbg") -> .\test.dbg ;; ------------------------------------------------------------ -(defun dbgopen (filename envvar / dir fullpath ts) +(defun dbgopen (filename envvar / dir fullpath fh ts) (if (not *dbg-active*) (progn (prompt "\n[DBG] Debug deaktiviert - keine Datei angelegt.") @@ -85,22 +104,31 @@ (if (or (not dir) (= dir "")) (setq dir ".") ) - ;; Pfad zusammenbauen (Backslash am Ende sicherstellen) + ;; Backslash am Ende sicherstellen (if (and (/= (substr dir (strlen dir) 1) "\\") (/= (substr dir (strlen dir) 1) "/")) (setq dir (strcat dir "\\")) ) + ;; Verzeichnis anlegen falls es nicht existiert + (if (not (vl-file-directory-p (vl-string-right-trim "\\/" dir))) + (progn + (vl-mkdir (vl-string-right-trim "\\/" dir)) + (prompt (strcat "\n[DBG] Verzeichnis angelegt: " dir)) + ) + ) (setq fullpath (strcat dir filename)) (prompt (strcat "\n[DBG] Oeffne: " fullpath)) - (if *dbg-file* (close *dbg-file*)) - (setq *dbg-file* (open fullpath "w")) - (setq *dbg-indent* 0) - (if *dbg-file* + ;; Datei mit "w" erstellen/leeren, Header schreiben, sofort schliessen + (setq fh (open fullpath "w")) + (if fh (progn - ;; Timestamp sicher erzeugen (menucmd kann nil liefern) + (setq *dbg-path* fullpath) + (setq *dbg-indent* 0) + (setq *dbg-buffer* nil) (setq ts (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD HH:MM:SS)")) (if (not ts) (setq ts "(kein Zeitstempel)")) - (write-line (strcat "=== DEBUG START " ts " ===") *dbg-file*) + (write-line (strcat "=== DEBUG START " ts " ===") fh) + (close fh) (prompt (strcat "\n[DBG] Debug-Datei geoeffnet: " fullpath)) ) (prompt (strcat "\n[DBG] FEHLER: Konnte Debug-Datei nicht oeffnen: " fullpath)) @@ -111,16 +139,16 @@ ) ;; ------------------------------------------------------------ -;; DBGCLOSE - Debug-Datei schliessen +;; DBGCLOSE - Debug-Datei schliessen (Puffer + Abschluss schreiben) ;; ------------------------------------------------------------ (defun dbgclose ( / ts) - (if *dbg-file* + (if *dbg-path* (progn (setq ts (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD HH:MM:SS)")) (if (not ts) (setq ts "(kein Zeitstempel)")) - (write-line (strcat "=== DEBUG ENDE " ts " ===") *dbg-file*) - (close *dbg-file*) - (setq *dbg-file* nil) + (dbg-bufwrite (strcat "=== DEBUG ENDE " ts " ===")) + (dbg-flush) + (setq *dbg-path* nil) (setq *dbg-indent* 0) (prompt "\n[DBG] Debug-Datei geschlossen.") ) @@ -132,8 +160,8 @@ ;; ------------------------------------------------------------ ;; DBG-TABS - Hilfsfunktion: Erzeugt Einrueckung ;; ------------------------------------------------------------ -(defun dbg-tabs (/ result i) - (setq result "" i 0) +(defun dbg-tabs (/ result) + (setq result "") (repeat *dbg-indent* (setq result (strcat result "\t")) ) @@ -173,13 +201,13 @@ ) ;; ------------------------------------------------------------ -;; DBGF - Funktionseintritt loggen +;; DBGF - Funktionseintritt loggen (puffert nur) ;; Schreibt "funktionsname(){" und erhoeht Einrueckung ;; ------------------------------------------------------------ (defun dbgf (funcname) - (if (and *dbg-file* *dbg-active*) + (if (and *dbg-path* *dbg-active*) (progn - (write-line (strcat (dbg-tabs) funcname "(){") *dbg-file*) + (dbg-bufwrite (strcat (dbg-tabs) funcname "(){")) (setq *dbg-indent* (1+ *dbg-indent*)) ) ) @@ -187,43 +215,46 @@ ) ;; ------------------------------------------------------------ -;; DBGRETURN - Funktionsaustritt loggen +;; DBGRETURN - Funktionsaustritt loggen + FLUSH auf Platte ;; Verringert Einrueckung und schreibt "} = wert" ;; ------------------------------------------------------------ (defun dbgreturn (retval) - (if (and *dbg-file* *dbg-active*) + (if (and *dbg-path* *dbg-active*) (progn (setq *dbg-indent* (max 0 (1- *dbg-indent*))) - (write-line (strcat (dbg-tabs) "} = " (dbg-tostring retval)) *dbg-file*) + (if retval + (dbg-bufwrite (strcat (dbg-tabs) "} = " (dbg-tostring retval))) + (dbg-bufwrite (strcat (dbg-tabs) "}")) + ) + (dbg-flush) ) ) (princ) ) ;; ------------------------------------------------------------ -;; DBG - Variable/Wert loggen -;; Schreibt " name='wert'" +;; DBG - Variable/Wert loggen (puffert nur) ;; Aufruf: (dbg 'varname) oder (dbg wert) ;; ------------------------------------------------------------ (defun dbg (varname / val) - (if (and *dbg-file* *dbg-active*) + (if (and *dbg-path* *dbg-active*) (if (= (type varname) 'SYM) (progn (setq val (eval varname)) - (write-line (strcat (dbg-tabs) (vl-symbol-name varname) "=" (dbg-tostring val)) *dbg-file*) + (dbg-bufwrite (strcat (dbg-tabs) (vl-symbol-name varname) "=" (dbg-tostring val))) ) - (write-line (strcat (dbg-tabs) "value=" (dbg-tostring varname)) *dbg-file*) + (dbg-bufwrite (strcat (dbg-tabs) "value=" (dbg-tostring varname))) ) ) (princ) ) ;; ------------------------------------------------------------ -;; DBGMSG - Freitext-Nachricht loggen +;; DBGMSG - Freitext-Nachricht loggen (puffert nur) ;; ------------------------------------------------------------ (defun dbgmsg (msg) - (if (and *dbg-file* *dbg-active*) - (write-line (strcat (dbg-tabs) ">> " msg) *dbg-file*) + (if (and *dbg-path* *dbg-active*) + (dbg-bufwrite (strcat (dbg-tabs) ">> " msg)) ) (princ) ) diff --git a/Lisp/ssg_load.lsp b/Lisp/ssg_load.lsp index f5cf347..90bcd15 100644 --- a/Lisp/ssg_load.lsp +++ b/Lisp/ssg_load.lsp @@ -21,6 +21,8 @@ ) ) (load (strcat base-path "ssg_core.lsp") "ssg_core.lsp nicht gefunden") + (load (strcat base-path "ssg_dbg.lsp") "ssg_dbg.lsp nicht gefunden") + (dbgopen "debugfile.dbg" "DXFM_LOG") ; Debug-Datei im Log-Verzeichnis oeffnen (load (strcat base-path "ssg_dialog.lsp") "ssg_dialog.lsp nicht gefunden") (load (strcat base-path "ssg_layer.lsp") "ssg_layer.lsp nicht gefunden") (load (strcat base-path "KreiselInsert.lsp") "KreiselInsert.lsp nicht gefunden") @@ -28,7 +30,7 @@ (load (strcat base-path "tests.lsp") "tests.lsp nicht gefunden") (load (strcat base-path "OmniModulInsert.lsp") "OmniModulInsert.lsp nicht gefunden") (load (strcat base-path "SSG_LIB_Commands.lsp") "SSG_LIB_Commands.lsp nicht gefunden") - (prompt "\nSSG-Bibliotheken geladen: ssg_core, ssg_dialog, ssg_layer") + (prompt "\nSSG-Bibliotheken geladen: ssg_core, ssg_dbg, ssg_dialog, ssg_layer") (princ) ) diff --git a/bin/setenv.bat b/bin/setenv.bat index 24bbe38..bc4700f 100644 --- a/bin/setenv.bat +++ b/bin/setenv.bat @@ -17,7 +17,7 @@ set "DXFM_LIB=%DXFMAKRO%\lib" set "DXFM_DATA=%DXFMAKRO%\data" set "DXFM_TESTS=%DXFMAKRO%\tests" set "DXFM_CFG=%DXFMAKRO%\cfg" -set "DXFM_LOG=%DXFMAKRO%\log" +set "DXFM_LOG=%DXFMAKRO%\logs" set "DXFM_BLOCKS=%DXFMAKRO%\Blocks" set "DXFM_LISP=%DXFMAKRO%\Lisp" set "DXFM_DCL=%DXFMAKRO%\dcl" @@ -40,6 +40,7 @@ if not exist "%DXFM_LIB%" mkdir "%DXFM_LIB%" if not exist "%DXFM_DATA%" mkdir "%DXFM_DATA%" if not exist "%DXFM_BLOCKS%" mkdir "%DXFM_BLOCKS%" if not exist "%DXFM_LISP%" mkdir "%DXFM_LISP%" +if not exist "%DXFM_LOG%" mkdir "%DXFM_LOG%" if not exist "%DXFM_RESULTS%" mkdir "%DXFM_RESULTS%" REM Umgebungsvariablen anzeigen