Files
dxfmakros/tests/test_export_all.lsp

228 lines
8.5 KiB
Common Lisp

;; ============================================================
;; 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 <basis>.dxf/.dwg:
;; tests/output/<basis>_export.csv
;; tests/output/<basis>_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)
)