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)
;; {"section": {"key": val, ...}, ...}
;; -> (("section" ("key" . val) ...) ...)
+1 -1
View File
@@ -4,7 +4,7 @@
;; Erzeugt 12 Variofoerderer (6x Auf, 6x Ab) mit deltaL=7000
;; und verschiedenen Hoehenstufen. Speichert:
;; - tests/output/foerderer_results.json (Ergebnisse)
;; - tests/output/foerderer_tests.dxf (Zeichnung)
;; - tests/output/foerderer_tests.dwg (Zeichnung)
;;
;; Voraussetzungen:
;; - 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
pt blockEnt ed attribs block-name
block-handle insert-point)
(setq id (omni:val eintrag "id"))
(setq x (omni:val eintrag "x"))
(setq y (omni:val eintrag "y"))
(setq z (omni:val eintrag "z"))
(setq abstand (omni:val eintrag "abstand"))
(setq rotation (omni:val eintrag "rotation"))
(setq typ (omni:val eintrag "typ"))
(setq id (ssg-val eintrag "id"))
(setq x (ssg-val eintrag "x"))
(setq y (ssg-val eintrag "y"))
(setq z (ssg-val eintrag "z"))
(setq abstand (ssg-val eintrag "abstand"))
(setq rotation (ssg-val eintrag "rotation"))
(setq typ (ssg-val eintrag "typ"))
(if (numberp x) (setq x (float x)))
(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
ptStart ptEnd blockEnt ed attribs
block-name block-handle insert-point)
(setq id (omni:val eintrag "id"))
(setq sx (omni:val eintrag "start_x"))
(setq sy (omni:val eintrag "start_y"))
(setq sz (omni:val eintrag "start_z"))
(setq ex (omni:val eintrag "end_x"))
(setq ey (omni:val eintrag "end_y"))
(setq ez (omni:val eintrag "end_z"))
(setq typ (omni:val eintrag "typ"))
(setq id (ssg-val eintrag "id"))
(setq sx (ssg-val eintrag "start_x"))
(setq sy (ssg-val eintrag "start_y"))
(setq sz (ssg-val eintrag "start_z"))
(setq ex (ssg-val eintrag "end_x"))
(setq ey (ssg-val eintrag "end_y"))
(setq ez (ssg-val eintrag "end_z"))
(setq typ (ssg-val eintrag "typ"))
(if (numberp sx) (setq sx (float sx)))
(if (numberp sy) (setq sy (float sy)))
@@ -194,7 +194,7 @@
(princ)
)
(progn
(setq testfaelle (omni:load-json tests-json-pfad))
(setq testfaelle (ssg-load-json tests-json-pfad))
(if (null testfaelle)
(progn
(princ "\n[TEST_KREISEL] FEHLER: Testdaten konnten nicht geladen werden.")
@@ -213,7 +213,7 @@
;; Testfaelle ausfuehren
(foreach eintrag testfaelle
(setq func (omni:val eintrag "function"))
(setq func (ssg-val eintrag "function"))
(setq result-json
(cond
((= 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
;;
+3
View File
@@ -146,6 +146,9 @@
)
;; 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")
(command "_.ERASE" "_ALL" "")
)