Files
dxfmakros/tests/test_omniflo.lsp
T

279 lines
9.7 KiB
Common Lisp

;; ============================================================
;; test_omniflo.lsp - Automatischer Integrationstest fuer Omniflo
;;
;; Laedt Testfaelle aus tests/testdata/omniflo_tests.json,
;; fuegt je einen Bogen und Weiche jeden Typs in verschiedenen
;; Hoehen ein (Versatz in x-Richtung je 200mm) und exportiert
;; die CSV-Datei nach tests/output/omniflo_export.csv.
;;
;; Voraussetzungen:
;; - SSG_LIB geladen (OmniModulInsert.lsp, export.lsp)
;; - Umgebungsvariablen DXFMAKRO, DXFM_DATA gesetzt
;;
;; Aufruf in BricsCAD:
;; (load "tests/test_omniflo.lsp")
;; TEST_OMNIFLO
;; ============================================================
;; --- Omniflo Block non-interaktiv an gegebenem Punkt einfuegen ---
;; sivasnr-str : String der SivasNr (= Dateiname ohne .dxf)
;; insert-pt : Einfuegepunkt als Liste (x y z)
;; hoehe-str : Hoehe als String (fuer HOEHE-Attribut)
;; drehung-str : Drehung als String (fuer DREHUNG-Attribut)
(defun omni:test-insert (sivasnr-str insert-pt hoehe-str drehung-str /
dxf-pfad omniflo-pfad blockEnt angleDeg)
(setq omniflo-pfad (getenv "DXFM_OMNIFLO"))
(if (null omniflo-pfad)
(progn
(princ "\n[TEST_OMNIFLO] FEHLER: DXFM_OMNIFLO nicht gesetzt!")
nil
)
(progn
(setq dxf-pfad (strcat omniflo-pfad "/" sivasnr-str ".dxf"))
(if (not (findfile dxf-pfad))
(progn
(princ (strcat "\n[TEST_OMNIFLO] WARNUNG: DXF nicht gefunden: " dxf-pfad))
nil
)
(progn
(setq angleDeg (if drehung-str (atof drehung-str) 0.0))
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
(command "_.INSERT" dxf-pfad insert-pt "" "" angleDeg)
(setq blockEnt (entlast))
(if (and blockEnt
(= (cdr (assoc 0 (entget blockEnt))) "INSERT"))
(ssg-attrib-set-on blockEnt
(list (cons "HOEHE" (if hoehe-str hoehe-str "2000"))
(cons "DREHUNG" (if drehung-str drehung-str "0"))))
)
(princ (strcat "\n[TEST_OMNIFLO] OK: " sivasnr-str
" H=" (if hoehe-str hoehe-str "2000")))
blockEnt
)
)
)
)
)
;; --- Ergebnis eines Omniflo-Testfalls als JSON-String erzeugen ---
(defun omniflo:test-result-json (test-id sivasnr description hoehe status /
json)
(setq json (strcat " {\n"
" \"test_id\": \"" test-id "\",\n"
" \"sivasnr\": \"" (if sivasnr sivasnr "") "\",\n"
" \"description\": \"" (if description description "") "\",\n"
" \"hoehe\": \"" (if hoehe hoehe "") "\",\n"
" \"status\": \"" status "\"\n"
" }"))
json
)
;; --- JSON-Export der Omniflo-Testergebnisse ---
(defun omniflo:export-results (tests-out-dir / out-json f first)
(if (null *omniflo-test-results*)
(princ "\n Keine Omniflo-Ergebnisse vorhanden.")
(progn
(vl-mkdir tests-out-dir)
(setq out-json (strcat tests-out-dir "/omniflo_results.json"))
(setq f (open out-json "w"))
(if f
(progn
(write-line "[" f)
(setq first T)
(foreach r *omniflo-test-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!"))
)
)
)
)
;; --- Post-Clean: Omniflo-Testbloecke aus der Zeichnung loeschen ---
;; Entfernt alle INSERT-Entities mit rein numerischen Blocknamen (Omniflo SivasNr)
;; sowie AP110-Geraden. Wird vom Test-Runner nach dem Export aufgerufen.
;; Rueckgabe: Anzahl geloeschter Bloecke
(defun omniflo:post-clean ( / ss-all i ename ed bname count)
(setq count 0)
(setq ss-all (ssget "X" (list (cons 0 "INSERT"))))
(if ss-all
(progn
(setq i 0)
(while (setq ename (ssname ss-all i))
(setq ed (entget ename))
(setq bname (cdr (assoc 2 ed)))
(if (or
;; Omniflo SivasNr: rein numerisch (beginnt mit Ziffer, kein Unterstrich)
(and (wcmatch bname "#*") (null (vl-string-search "_" bname)))
;; Omniflo Geraden
(wcmatch (strcase bname) "AP110*,AP_110*")
)
(progn
(entdel ename)
(setq count (1+ count))
)
)
(setq i (1+ i))
)
)
)
(princ (strcat "\n[OMNIFLO] Post-Clean: " (itoa count) " Bloecke entfernt."))
count
)
;; --- BricsCAD-Befehl: Omniflo-Ergebnisse exportieren ---
(defun c:TEST_OMNIFLO_EXPORT ( / tests-out-dir)
(setq tests-out-dir (strcat (getenv "DXFMAKRO") "/tests/output"))
(omniflo:export-results tests-out-dir)
(princ)
)
;; ============================================================
;; C:TEST_OMNIFLO
;;
;; Liest omniflo_tests.json, fuegt alle Testbloecke ein,
;; exportiert CSV nach tests/output/.
;; ============================================================
(defun c:TEST_OMNIFLO (/ tests-json-pfad testfaelle
x-val y-val
idx eintrag sivasnr hoehe-str drehung-str
description insert-pt anzahl-ok anzahl-fehler
results-list tests-out-dir old-results)
(if (not *lib-initialized*)
(init-bibliothek)
)
(ssg-start "TEST_OMNIFLO"
'(("OSMODE") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0)
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
;; Testdaten laden
(setq tests-json-pfad
(strcat (getenv "DXFMAKRO") "/tests/testdata/omniflo_tests.json"))
(if (not (findfile tests-json-pfad))
(progn
(princ (strcat "\n[TEST_OMNIFLO] FEHLER: Testdaten nicht gefunden: "
tests-json-pfad))
(ssg-end)
(princ)
)
(progn
(setq testfaelle (omni:load-json tests-json-pfad))
(if (null testfaelle)
(progn
(princ "\n[TEST_OMNIFLO] FEHLER: Testdaten konnten nicht geladen werden.")
(ssg-end)
(princ)
)
(progn
(princ "\n================================================================")
(princ "\n TEST_OMNIFLO")
(princ (strcat "\n " (itoa (length testfaelle)) " Testfaelle geladen"))
(princ "\n================================================================")
;; Alle Bloecke einfuegen
(setq anzahl-ok 0)
(setq anzahl-fehler 0)
(setq results-list nil)
(setq idx 0)
(foreach eintrag testfaelle
(setq idx (1+ idx))
(setq sivasnr (omni:val eintrag "sivasnr"))
(setq hoehe-str (omni:val eintrag "hoehe"))
(if (null hoehe-str) (setq hoehe-str "2000"))
(if (numberp hoehe-str)
(setq hoehe-str (rtos hoehe-str 2 0))
)
(setq drehung-str (omni:val eintrag "drehung"))
(if (null drehung-str) (setq drehung-str "0"))
(if (numberp drehung-str)
(setq drehung-str (rtos drehung-str 2 1))
)
(setq description (omni:val eintrag "description"))
;; x,y-Koordinaten aus JSON lesen (wie in omniflo_uebersicht.dxf)
(setq x-val (omni:val eintrag "x"))
(setq y-val (omni:val eintrag "y"))
(if (null x-val) (setq x-val 0.0))
(if (null y-val) (setq y-val 0.0))
(if (not (numberp x-val)) (setq x-val (atof x-val)))
(if (not (numberp y-val)) (setq y-val (atof y-val)))
(setq insert-pt (list x-val y-val (atof hoehe-str)))
(princ (strcat "\n " (itoa idx) ". "
(if description description (if sivasnr sivasnr "?"))
" -> (" (rtos x-val 2 0) ", " (rtos y-val 2 0) ", " hoehe-str ")"))
(if (omni:test-insert sivasnr insert-pt hoehe-str drehung-str)
(progn
(setq anzahl-ok (1+ anzahl-ok))
(setq results-list (cons
(omniflo:test-result-json (strcat "OMNI_" (itoa idx))
sivasnr description hoehe-str "OK")
results-list))
)
(progn
(setq anzahl-fehler (1+ anzahl-fehler))
(setq results-list (cons
(omniflo:test-result-json (strcat "OMNI_" (itoa idx))
sivasnr description hoehe-str "FEHLER")
results-list))
)
)
)
;; Zusammenfassung
(princ "\n================================================================")
(princ (strcat "\n Eingefuegt: " (itoa anzahl-ok)
" OK, " (itoa anzahl-fehler) " Fehler"))
(princ "\n================================================================")
;; Ergebnisse in globaler Variable speichern
(setq *omniflo-test-results* (reverse results-list))
;; CSV-Export nach tests/output/
(setq tests-out-dir
(strcat (getenv "DXFMAKRO") "/tests/output"))
(vl-mkdir tests-out-dir)
(setq old-results (getenv "DXFM_RESULTS"))
(setenv "DXFM_RESULTS" tests-out-dir)
(princ "\n[TEST_OMNIFLO] Starte OMNI_EXPORT -> tests/output/omniflo_export.csv")
(c:OMNI_EXPORT)
(setenv "DXFM_RESULTS" (if old-results old-results ""))
(ssg-end)
(princ "\n================================================================")
(princ "\n TEST_OMNIFLO abgeschlossen.")
(princ (strcat "\n CSV: " tests-out-dir "/omniflo_export.csv"))
(princ "\n================================================================")
(princ)
)
)
)
)
)