285 lines
9.9 KiB
Common Lisp
285 lines
9.9 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)
|
|
|
|
(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 (ssg-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 (ssg-val eintrag "sivasnr"))
|
|
(setq hoehe-str (ssg-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 (ssg-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 (ssg-val eintrag "description"))
|
|
|
|
;; x,y-Koordinaten aus JSON lesen (wie in omniflo_uebersicht.dxf)
|
|
(setq x-val (ssg-val eintrag "x"))
|
|
(setq y-val (ssg-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))
|
|
;; Beschriftung ueber dem Block einfuegen
|
|
(entmake
|
|
(list
|
|
'(0 . "TEXT")
|
|
'(8 . "ANNOTATION")
|
|
(cons 10 (list x-val (+ y-val 50) 0))
|
|
'(40 . 30)
|
|
(cons 1 sivasnr)
|
|
)
|
|
)
|
|
)
|
|
(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)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|