;; ============================================================ ;; test_export_all.lsp - Batch-Export aller Testzeichnungen ;; ;; Oeffnet jede vorhandene DXF/DWG-Datei aus tests/output/ und fuehrt ;; darauf c:EXPORTCSV und c:EXPORTSIVAS aus (Lisp/export.lsp). ;; ;; Muss als LETZTES Modul in tests/alltests.json stehen: Es liest ;; die Ausgabedateien aller anderen Testmodule, die zu diesem ;; Zeitpunkt bereits geschrieben sein muessen. ;; ;; Ausgabe je Quelldatei .dxf/.dwg: ;; tests/output/_export.csv ;; tests/output/_sivas.csv ;; tests/output/export_all_results.json (Zusammenfassung, immer) ;; ;; Voraussetzungen: ;; - SSG_LIB geladen (export.lsp, ssg_core.lsp) ;; - Umgebungsvariable DXFMAKRO gesetzt ;; ;; Aufruf in BricsCAD: ;; (load (strcat (getenv "DXFMAKRO") "/tests/test_export_all.lsp")) ;; TEST_EXPORT_ALL ;; ============================================================ (vl-load-com) ;; --- Auf Fertigstellung einer asynchron geschriebenen Datei warten --- ;; csv:run-export startet Python per startapp (fire-and-forget). Pollt ;; bis die Datei existiert und ihre Groesse ueber ein Intervall stabil ;; bleibt, oder bis timeout-sec erreicht ist. Rueckgabe: T bei Erfolg. (defun export_all:wait-for-file (path timeout-sec / elapsed size1 size2 done) (setq elapsed 0.0 done nil) (while (and (not done) (< elapsed timeout-sec)) (if (findfile path) (progn (setq size1 (vl-file-size path)) (command "_.DELAY" 400) (setq size2 (vl-file-size path)) (if (and size1 size2 (= size1 size2) (> size1 0)) (setq done T) ) ) (command "_.DELAY" 400) ) (setq elapsed (+ elapsed 0.4)) ) done ) ;; --- Zeichnung zusaetzlich oeffnen, ohne die aktuelle zu schliessen --- ;; Nutzt reines ActiveX Documents.Open statt (command "_.OPEN" ...): ;; Damit entfaellt sowohl die interaktive "Speichern?"-Abfrage als auch ;; das vorherige Schliessen des aktiven Dokuments. Letzteres fuehrte dazu, ;; dass BricsCAD (weil kein Dokument mehr offen war) automatisch ein neues ;; Blank-Dokument erzeugt und dabei den kompletten Modul-/Menue-Ladezyklus ;; (inkl. Fremd-Addons) erneut durchlaeuft - pro verarbeiteter Datei. (defun export_all:open-drawing (filepath / app doc) (setq app (vlax-get-acad-object)) (setq doc (vla-open (vla-get-documents app) filepath)) (vla-put-activedocument app doc) doc ) ;; --- Basisname (ohne Dateiendung) aus einem Dateinamen extrahieren --- (defun export_all:basisname (dateiname / i punkt-pos) (setq i 0 punkt-pos nil) (while (setq i (vl-string-search "." dateiname i)) (setq punkt-pos i) (setq i (1+ i)) ) (if punkt-pos (substr dateiname 1 punkt-pos) dateiname) ) ;; --- Ergebnis eines Datei-Exports als JSON-String erzeugen --- (defun export_all:result-json (basis csv-ok sivas-ok / json) (strcat " {\n" " \"quelldatei\": \"" basis "\",\n" " \"csv_ok\": " (if csv-ok "true" "false") ",\n" " \"sivas_ok\": " (if sivas-ok "true" "false") "\n" " }") ) ;; --- JSON-Export der Ergebnisse --- (defun export_all:export-results (tests-out-dir / out-json f first) (if (null *export-all-results*) (princ "\n Keine Export-All-Ergebnisse vorhanden.") (progn (vl-mkdir tests-out-dir) (setq out-json (strcat tests-out-dir "/export_all_results.json")) (setq f (open out-json "w")) (if f (progn (write-line "[" f) (setq first T) (foreach r *export-all-results* (if (not first) (write-line "," f)) (write-line r f) (setq first nil) ) (write-line "]" f) (close f) (princ (strcat "\n Ergebnisse: " out-json)) ) (princ (strcat "\n FEHLER: Kann " out-json " nicht schreiben!")) ) ) ) ) ;; ============================================================ ;; C:TEST_EXPORT_ALL ;; ;; Oeffnet jede DXF/DWG-Datei aus tests/output/ und exportiert sie ;; per EXPORTCSV/EXPORTSIVAS in eigene, nach der Quelldatei benannte ;; CSV-Dateien. ;; ============================================================ (defun c:TEST_EXPORT_ALL (/ tests-out-dir dateien datei basis doc csv-name sivas-name csv-pfad sivas-pfad csv-ok sivas-ok results-list old-filenames ablauf-fehler) (setq tests-out-dir (strcat (getenv "DXFMAKRO") "/tests/output")) (vl-mkdir tests-out-dir) ;; *export-test-override* (Lisp/export.lsp, csv:run-export) fuer die Dauer ;; des Testlaufs setzen, damit c:EXPORTCSV/c:EXPORTSIVAS nach tests/output ;; statt in den normalen Ergebnisordner schreiben. ;; WICHTIG: Absichtlich KEIN (setenv "DXFM_RESULTS" ...)! In BricsCAD ;; schreibt (setenv ...) dauerhaft in die Profil-Registry und ueberlebt ;; damit jeden Neustart - ein einziger Testlauf wuerde DXFM_RESULTS fuer ;; alle zukuenftigen Sitzungen unwiderruflich auf den Testordner umbiegen. ;; *export-test-override* ist eine reine Lisp-Variable (nur Prozess-/ ;; Sitzungsspeicher) und wird per vl-catch-all-apply garantiert wieder ;; auf nil gesetzt, auch bei einem Fehler/Abbruch im Testlauf. (setq *export-test-override* tests-out-dir) (setq ablauf-fehler (vl-catch-all-apply 'ssg-test-export-all-ablauf (list tests-out-dir))) (setq *export-test-override* nil) (if (vl-catch-all-error-p ablauf-fehler) (princ (strcat "\n[TEST_EXPORT_ALL] FEHLER: " (vl-catch-all-error-message ablauf-fehler))) ) (princ) ) ;; --- Eigentlicher Ablauf von TEST_EXPORT_ALL, gekapselt fuer vl-catch-all-apply --- (defun ssg-test-export-all-ablauf (tests-out-dir / dateien datei basis doc csv-name sivas-name csv-pfad sivas-pfad csv-ok sivas-ok results-list old-filenames) (setq dateien (append (vl-directory-files tests-out-dir "*.dxf" 1) (vl-directory-files tests-out-dir "*.dwg" 1) )) (setq old-filenames *export-filenames*) (setq results-list nil) (princ "\n================================================================") (princ "\n TEST_EXPORT_ALL") (princ (strcat "\n " (itoa (length dateien)) " Zeichnung(en) gefunden")) (princ "\n================================================================") (foreach datei dateien (setq basis (export_all:basisname datei)) (princ (strcat "\n\n>>> " datei " <<<")) (setq doc (export_all:open-drawing (strcat tests-out-dir "/" datei))) ;; Datei-/Skriptnamen fuer diesen Durchlauf ueberschreiben, damit ;; jede Quelldatei ihre eigenen CSV-Ergebnisse bekommt (statt der ;; fixen Standardnamen "export.csv"/"export_sivas.csv"). (setq csv-name (strcat basis "_export.csv")) (setq sivas-name (strcat basis "_sivas.csv")) (setq csv-pfad (strcat tests-out-dir "/" csv-name)) (setq sivas-pfad (strcat tests-out-dir "/" sivas-name)) (if (findfile csv-pfad) (vl-file-delete csv-pfad)) (if (findfile sivas-pfad) (vl-file-delete sivas-pfad)) (setq *export-filenames* (list (cons "raw_json_datei" (cdr (assoc "raw_json_datei" old-filenames))) (cons "sivas_script" (cdr (assoc "sivas_script" old-filenames))) (cons "sivas_csv" sivas-name) (cons "csv_script" (cdr (assoc "csv_script" old-filenames))) (cons "csv_csv" csv-name) ) ) (princ (strcat "\n[TEST_EXPORT_ALL] CSV-Export -> " csv-name)) (c:EXPORTCSV) (setq csv-ok (export_all:wait-for-file csv-pfad 30.0)) (princ (if csv-ok "\n[TEST_EXPORT_ALL] CSV OK" "\n[TEST_EXPORT_ALL] CSV TIMEOUT/FEHLER")) (princ (strcat "\n[TEST_EXPORT_ALL] Sivas-Export -> " sivas-name)) (c:EXPORTSIVAS) (setq sivas-ok (export_all:wait-for-file sivas-pfad 30.0)) (princ (if sivas-ok "\n[TEST_EXPORT_ALL] Sivas OK" "\n[TEST_EXPORT_ALL] Sivas TIMEOUT/FEHLER")) (setq results-list (cons (export_all:result-json basis csv-ok sivas-ok) results-list)) ;; Diese Zeichnung wieder schliessen (verwirft ID/Hoehe/Drehung-Updates ;; aus dem Export). Das urspruengliche Dokument (vor dieser Schleife ;; aktiv) bleibt dabei durchgehend offen, BricsCAD erzeugt also kein ;; neues Blank-Dokument und der teure Modul-/Menue-Reload entfaellt. (vla-close doc :vlax-false) ) (setq *export-filenames* old-filenames) (setq *export-all-results* (reverse results-list)) (princ "\n\n================================================================") (princ "\n TEST_EXPORT_ALL abgeschlossen.") (princ "\n================================================================") (princ) )