;; ============================================================ ;; tests.lsp - Test- und Hilfsfunktionen ;; ============================================================ (defun c:CALLPYTHON ( / log-pfad py-skript return-datei cmd fh zeile) (setq log-pfad (getenv "DXFM_LOG")) (setq py-skript (strcat (getenv "DXFM_LIB") "\\testpycall.py")) (setq return-datei (strcat log-pfad "\\testpycall_return.txt")) (if (findfile py-skript) (progn (setq cmd (strcat "python \"" py-skript "\" \"" log-pfad "\"")) (command "_.SHELL" cmd) (if (findfile return-datei) (progn (setq fh (open return-datei "r")) (setq zeile (read-line fh)) (close fh) (princ (strcat "\n[SSG_LIB] Python Rueckgabe: " zeile)) ) (princ "\n[SSG_LIB] WARNUNG: Keine Rueckgabe von Python erhalten.") ) ) (princ (strcat "\n[SSG_LIB] FEHLER: " py-skript " nicht gefunden!")) ) (princ) ) ;; ============================================================ ;; EXPORTCSV - Alle INSERT-Entities sammeln und als JSON exportieren ;; Anschliessend Python-Skript aufrufen fuer CSV-Erzeugung ;; ============================================================ ;; --- Wert sicher als String zurueckgeben --- (defun csv:to-str (val) (cond ((null val) "") ((= (type val) 'STR) val) ((= (type val) 'INT) (itoa val)) ((= (type val) 'REAL) (rtos val 2 6)) (T (vl-princ-to-string val)) ) ) ;; --- String fuer JSON escapen (Anfuehrungszeichen) --- (defun csv:json-escape (s / pos result ch) (setq result "") (setq pos 1) (repeat (strlen s) (setq ch (substr s pos 1)) (cond ((= ch "\"") (setq result (strcat result "\\\""))) ((= ch "\\") (setq result (strcat result "\\\\"))) (T (setq result (strcat result ch))) ) (setq pos (1+ pos)) ) result ) ;; --- Attribute eines INSERT-Blocks als JSON-Objekt lesen --- ;; ename = Entity-Name des INSERT ;; Rueckgabe: String wie {"TAG1":"Wert1","TAG2":"Wert2"} (defun csv:read-attribs (ename / obj typ tag wert result first-item) (setq obj (entnext ename)) (setq result "{") (setq first-item T) (while (and obj (not (equal (cdr (assoc 0 (entget obj))) "SEQEND"))) (setq typ (cdr (assoc 0 (entget obj)))) (if (equal typ "ATTRIB") (progn (setq tag (cdr (assoc 2 (entget obj)))) (setq wert (cdr (assoc 1 (entget obj)))) (if (not first-item) (setq result (strcat result ",")) ) (setq result (strcat result "\"" (csv:json-escape tag) "\":\"" (csv:json-escape wert) "\"")) (setq first-item nil) ) ) (setq obj (entnext obj)) ) (strcat result "}") ) ;; --- Einen INSERT-Block als JSON-Objekt schreiben --- (defun csv:block-to-json (ename / ed blk-name layer pt rotation handle attribs has-attribs) (setq ed (entget ename)) (setq blk-name (cdr (assoc 2 ed))) (setq layer (cdr (assoc 8 ed))) (setq pt (cdr (assoc 10 ed))) (setq rotation (cdr (assoc 50 ed))) (setq handle (cdr (assoc 5 ed))) (setq has-attribs (cdr (assoc 66 ed))) (if (null rotation) (setq rotation 0.0)) (if has-attribs (setq attribs (csv:read-attribs ename)) (setq attribs "{}") ) (strcat " {\"block_name\":\"" (csv:json-escape blk-name) "\"" ",\"layer\":\"" (csv:json-escape layer) "\"" ",\"handle\":\"" (csv:json-escape handle) "\"" ",\"x\":" (rtos (car pt) 2 4) ",\"y\":" (rtos (cadr pt) 2 4) ",\"z\":" (rtos (caddr pt) 2 4) ",\"rotation\":" (rtos (* (/ rotation pi) 180.0) 2 4) ",\"attribs\":" attribs "}" ) ) ;; --- EXPORTSIVAS: Sivas-spezifischer CSV-Export mit Summierungszeilen --- (defun c:EXPORTSIVAS ( / ss i ename json-str out-pfad py-skript cmd fh ergebnis-pfad first-block count) (princ "\n[EXPORTSIVAS] Sammle alle Bloecke der Zeichnung...") ;; Alle INSERT-Entities in der Zeichnung (setq ss (ssget "X" (list (cons 0 "INSERT")))) (if (null ss) (progn (princ "\n[EXPORTSIVAS] Keine Bloecke in der Zeichnung gefunden.") (princ) ) (progn (setq count (sslength ss)) (princ (strcat "\n[EXPORTSIVAS] " (itoa count) " Bloecke gefunden.")) ;; JSON-Datei zusammenbauen (setq out-pfad (strcat (getenv "DXFM_RESULTS") "/export_raw.json")) (setq fh (open out-pfad "w")) (if (null fh) (progn (princ (strcat "\n[EXPORTSIVAS] FEHLER: Kann Datei nicht oeffnen: " out-pfad)) (princ) ) (progn (write-line "[" fh) (setq i 0) (setq first-block T) (while (setq ename (ssname ss i)) (if (not first-block) (write-line "," fh) ) (setq json-str (csv:block-to-json ename)) (write-line json-str fh) (setq first-block nil) (setq i (1+ i)) ) (write-line "]" fh) (close fh) (princ (strcat "\n[EXPORTSIVAS] JSON geschrieben: " out-pfad)) ;; Python-Skript aufrufen (setq py-skript (strcat (getenv "DXFM_LIB") "/export_sivas.py")) (if (findfile py-skript) (progn (setq ergebnis-pfad (strcat (getenv "DXFM_RESULTS") "/export_sivas.csv")) (setq cmd (strcat "python \"" py-skript "\"" " \"" out-pfad "\"" " \"" (getenv "DXFM_DATA") "\"" " \"" ergebnis-pfad "\"")) (princ (strcat "\n[EXPORTSIVAS] Rufe Python auf...")) (command "_.SHELL" cmd) (if (findfile ergebnis-pfad) (princ (strcat "\n[EXPORTSIVAS] CSV erstellt: " ergebnis-pfad)) (princ "\n[EXPORTSIVAS] WARNUNG: CSV-Datei wurde nicht erzeugt.") ) ) (princ (strcat "\n[EXPORTSIVAS] FEHLER: Python-Skript nicht gefunden: " py-skript)) ) ) ) ) ) (princ) ) ;; --- EXPORTCSV: Einfache Item-Liste aller Bloecke (ohne Summierung) --- ;; Nutzt dieselben csv:* Hilfsfunktionen und export_raw.json, ;; ruft export_csv.py auf fuer die einfache CSV-Erzeugung. (defun c:EXPORTCSV ( / ss i ename json-str out-pfad py-skript cmd fh ergebnis-pfad first-block count) (princ "\n[EXPORTCSV] Sammle alle Bloecke der Zeichnung...") (setq ss (ssget "X" (list (cons 0 "INSERT")))) (if (null ss) (progn (princ "\n[EXPORTCSV] Keine Bloecke in der Zeichnung gefunden.") (princ) ) (progn (setq count (sslength ss)) (princ (strcat "\n[EXPORTCSV] " (itoa count) " Bloecke gefunden.")) (setq out-pfad (strcat (getenv "DXFM_RESULTS") "/export_raw.json")) (setq fh (open out-pfad "w")) (if (null fh) (progn (princ (strcat "\n[EXPORTCSV] FEHLER: Kann Datei nicht oeffnen: " out-pfad)) (princ) ) (progn (write-line "[" fh) (setq i 0) (setq first-block T) (while (setq ename (ssname ss i)) (if (not first-block) (write-line "," fh) ) (setq json-str (csv:block-to-json ename)) (write-line json-str fh) (setq first-block nil) (setq i (1+ i)) ) (write-line "]" fh) (close fh) (princ (strcat "\n[EXPORTCSV] JSON geschrieben: " out-pfad)) ;; Python-Skript aufrufen (setq py-skript (strcat (getenv "DXFM_LIB") "/export_csv.py")) (if (findfile py-skript) (progn (setq ergebnis-pfad (strcat (getenv "DXFM_RESULTS") "/export.csv")) (setq cmd (strcat "python \"" py-skript "\"" " \"" out-pfad "\"" " \"" (getenv "DXFM_DATA") "\"" " \"" ergebnis-pfad "\"")) (princ (strcat "\n[EXPORTCSV] Rufe Python auf...")) (command "_.SHELL" cmd) (if (findfile ergebnis-pfad) (princ (strcat "\n[EXPORTCSV] CSV erstellt: " ergebnis-pfad)) (princ "\n[EXPORTCSV] WARNUNG: CSV-Datei wurde nicht erzeugt.") ) ) (princ (strcat "\n[EXPORTCSV] FEHLER: Python-Skript nicht gefunden: " py-skript)) ) ) ) ) ) (princ) )