;; ============================================================ ;; 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)) ) (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) ) ) ) ) )