228 lines
8.5 KiB
Common Lisp
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)
|
|
)
|