Eigene Routine um flache json kv Files zu parsen.

This commit is contained in:
2026-06-23 15:06:21 +02:00
parent 676117fe22
commit 86d932fa23
5 changed files with 97 additions and 18 deletions
+35
View File
@@ -620,6 +620,41 @@
) )
) )
;; --- JSON-Array von flachen Objekten parsen ---
;; Verwendet ssg-cfg-trim und ssg-cfg-parse-kv aus ssg_core.
;; Rueckgabe: Liste von Alists (("key" . wert) ...)
(defun ssg-parse-json-array (zeilen / in-obj obj ergebnis zeile kv trimmed)
(setq in-obj nil obj nil ergebnis nil)
(foreach zeile zeilen
(setq trimmed (ssg-cfg-trim zeile))
(cond
((= trimmed "{")
(setq in-obj T obj nil))
((or (= trimmed "}") (= trimmed "},"))
(if (and in-obj obj)
(setq ergebnis (cons (reverse obj) ergebnis)))
(setq in-obj nil))
(in-obj
(setq kv (ssg-cfg-parse-kv trimmed))
(if kv (setq obj (cons kv obj))))
)
)
(reverse ergebnis)
)
;; JSON-Datei als flaches Array laden
;; Rueckgabe: Liste von Alists oder nil bei Fehler
(defun ssg-load-json (datei / zeilen)
(setq zeilen (ssg-read-file-lines datei))
(if zeilen (ssg-parse-json-array zeilen))
)
;; Wert aus Alist lesen: (ssg-val alist "key")
(defun ssg-val (alist key)
(cdr (assoc key alist))
)
;; Verschachteltes JSON-Objekt parsen (1 Ebene tief) ;; Verschachteltes JSON-Objekt parsen (1 Ebene tief)
;; {"section": {"key": val, ...}, ...} ;; {"section": {"key": val, ...}, ...}
;; -> (("section" ("key" . val) ...) ...) ;; -> (("section" ("key" . val) ...) ...)
+1 -1
View File
@@ -4,7 +4,7 @@
;; Erzeugt 12 Variofoerderer (6x Auf, 6x Ab) mit deltaL=7000 ;; Erzeugt 12 Variofoerderer (6x Auf, 6x Ab) mit deltaL=7000
;; und verschiedenen Hoehenstufen. Speichert: ;; und verschiedenen Hoehenstufen. Speichert:
;; - tests/output/foerderer_results.json (Ergebnisse) ;; - tests/output/foerderer_results.json (Ergebnisse)
;; - tests/output/foerderer_tests.dxf (Zeichnung) ;; - tests/output/foerderer_tests.dwg (Zeichnung)
;; ;;
;; Voraussetzungen: ;; Voraussetzungen:
;; - SSG_LIB geladen (VarioFoerderer.lsp, ssg_core.lsp) ;; - SSG_LIB geladen (VarioFoerderer.lsp, ssg_core.lsp)
+17 -17
View File
@@ -54,13 +54,13 @@
(defun kreisel:run-insert-test (eintrag / id x y z abstand rotation typ (defun kreisel:run-insert-test (eintrag / id x y z abstand rotation typ
pt blockEnt ed attribs block-name pt blockEnt ed attribs block-name
block-handle insert-point) block-handle insert-point)
(setq id (omni:val eintrag "id")) (setq id (ssg-val eintrag "id"))
(setq x (omni:val eintrag "x")) (setq x (ssg-val eintrag "x"))
(setq y (omni:val eintrag "y")) (setq y (ssg-val eintrag "y"))
(setq z (omni:val eintrag "z")) (setq z (ssg-val eintrag "z"))
(setq abstand (omni:val eintrag "abstand")) (setq abstand (ssg-val eintrag "abstand"))
(setq rotation (omni:val eintrag "rotation")) (setq rotation (ssg-val eintrag "rotation"))
(setq typ (omni:val eintrag "typ")) (setq typ (ssg-val eintrag "typ"))
(if (numberp x) (setq x (float x))) (if (numberp x) (setq x (float x)))
(if (numberp y) (setq y (float y))) (if (numberp y) (setq y (float y)))
@@ -98,14 +98,14 @@
(defun kreisel:run-connect-test (eintrag / id sx sy sz ex ey ez typ (defun kreisel:run-connect-test (eintrag / id sx sy sz ex ey ez typ
ptStart ptEnd blockEnt ed attribs ptStart ptEnd blockEnt ed attribs
block-name block-handle insert-point) block-name block-handle insert-point)
(setq id (omni:val eintrag "id")) (setq id (ssg-val eintrag "id"))
(setq sx (omni:val eintrag "start_x")) (setq sx (ssg-val eintrag "start_x"))
(setq sy (omni:val eintrag "start_y")) (setq sy (ssg-val eintrag "start_y"))
(setq sz (omni:val eintrag "start_z")) (setq sz (ssg-val eintrag "start_z"))
(setq ex (omni:val eintrag "end_x")) (setq ex (ssg-val eintrag "end_x"))
(setq ey (omni:val eintrag "end_y")) (setq ey (ssg-val eintrag "end_y"))
(setq ez (omni:val eintrag "end_z")) (setq ez (ssg-val eintrag "end_z"))
(setq typ (omni:val eintrag "typ")) (setq typ (ssg-val eintrag "typ"))
(if (numberp sx) (setq sx (float sx))) (if (numberp sx) (setq sx (float sx)))
(if (numberp sy) (setq sy (float sy))) (if (numberp sy) (setq sy (float sy)))
@@ -194,7 +194,7 @@
(princ) (princ)
) )
(progn (progn
(setq testfaelle (omni:load-json tests-json-pfad)) (setq testfaelle (ssg-load-json tests-json-pfad))
(if (null testfaelle) (if (null testfaelle)
(progn (progn
(princ "\n[TEST_KREISEL] FEHLER: Testdaten konnten nicht geladen werden.") (princ "\n[TEST_KREISEL] FEHLER: Testdaten konnten nicht geladen werden.")
@@ -213,7 +213,7 @@
;; Testfaelle ausfuehren ;; Testfaelle ausfuehren
(foreach eintrag testfaelle (foreach eintrag testfaelle
(setq func (omni:val eintrag "function")) (setq func (ssg-val eintrag "function"))
(setq result-json (setq result-json
(cond (cond
((= func "insert") ((= func "insert")
+41
View File
@@ -100,6 +100,47 @@
) )
;; --- 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 ;; C:TEST_OMNIFLO
;; ;;
+3
View File
@@ -146,6 +146,9 @@
) )
;; Zeichnung leeren fuer sauberen Testlauf ;; Zeichnung leeren fuer sauberen Testlauf
;; Frozen Layer werden von _.ERASE _ALL ignoriert - deshalb
;; erst alle Layer auftauen, entsperren und einschalten.
(command "_.LAYER" "_Thaw" "*" "_Unlock" "*" "_On" "*" "")
(if (ssget "_X") (if (ssget "_X")
(command "_.ERASE" "_ALL" "") (command "_.ERASE" "_ALL" "")
) )