[ADD] HundM05: fehlende Separator/Scanner nachgetragen + Bau-Support

9 reale Separator/Scanner-Koordinaten aus der Anlage in hundm05.json
ergaenzt. hundm05:bau-zusatzobjekte (test_hundm05.lsp) baute bisher nur
Kreisel-Zusatzobjekte - neue hundm05:bau-sensor-Funktion (analog zu
mubea:build-separator-one in test_mubea.lsp) faengt jetzt auch
"block"-Eintraege (Separator/Scanner) ab und fuegt sie per _.INSERT ein.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 12:01:48 +02:00
parent 8ed12b64e9
commit 754815c61f
3 changed files with 193 additions and 18 deletions
+97 -17
View File
@@ -58,7 +58,10 @@
;; lib/vf_spec_export.py uebernimmt sie beim Neuerzeugen der Spec-Daten
;; unveraendert ans Dateiende (sonst waeren sie beim naechsten Lauf weg).
;;
;; Bisher unterstuetzt: Kreisel (function "insert", wie test_kreisel.lsp).
;; Unterstuetzt: Kreisel (function "insert", wie test_kreisel.lsp) und
;; Separator/Scanner (zusaetzlich "block", wie in mubea.json - Schema
;; tests/testdata/object_data.md Abschnitt 5). Unterscheidung ueber das
;; Feld "block": nur Separator/Scanner-Eintraege haben es.
;; Weitere Arten kommen als eigener cond-Zweig dazu.
(defun hundm05:zusatz-objekt-p (obj)
@@ -116,10 +119,80 @@
(vsp-set (vsp-set rec "status" "abbruch") "fehler_text"
"kreisel-insert-script lieferte nil"))))))
;; Separator/Scanner bauen ("block"-Eintraege, siehe object_data.md
;; Abschnitt 5). ils-insert-sensor (SSG_LIB_Commands.lsp) ist dafuer NICHT
;; scriptbar (fragt Punkt/Rotation per getpoint/pause in einer Schleife) -
;; wir bauen den _.INSERT darum direkt selbst nach, wie
;; mubea:build-separator-one in tests/test_mubea.lsp es fuer die
;; Mubea-Anlage schon vorgemacht hat (dieselbe Vorlage, hier auf das
;; hundm05:bau-*/vsp-rec-neu-Record-Format dieser Datei uebertragen statt
;; mubeas eigenes result-json). "sensor" als Sammelbegriff fuer den "kind"-
;; Wert, weil dieselbe Routine Separator UND Scanner einfuegt - genau wie
;; ils-insert-sensor selbst.
(defun hundm05:bau-sensor (obj / id blockname x y z rotation pt eff n ent ed rec)
(setq id (ssg-val obj "id"))
(setq blockname (ssg-val obj "block"))
(setq x (ssg-val obj "x")
y (ssg-val obj "y")
z (ssg-val obj "z")
rotation (ssg-val obj "rotation"))
(if (numberp x) (setq x (float x)))
(if (numberp y) (setq y (float y)))
(if (numberp z) (setq z (float z)))
(setq rotation (if (numberp rotation) (float rotation) 0.0))
(setq rec (vsp-rec-neu (cond (id) (blockname) ("(ohne id)"))))
(setq rec (vsp-set rec "kind" "sensor"))
(setq rec (vsp-set rec "dimension" (vsp-dim-text)))
(cond
((not (and (numberp x) (numberp y) (numberp z)))
(princ (strcat "\n [SENSOR] " (if id id "?")
" - FEHLER: x, y und z muessen Zahlen sein"))
(vsp-set (vsp-set rec "status" "spec-fehler") "fehler_text"
"x, y oder z fehlt bzw. ist keine Zahl"))
(T
(setq pt (list x y z))
;; NICHT (and blockname (ssg-ils-block-laden blockname)) - and liefert
;; T/nil statt des Blocknamen-Strings (siehe CLAUDE.md, and/or-Falle).
(setq eff (if blockname (ssg-ils-block-laden blockname)))
(if (null eff) (setq eff (ssg-ils-block-laden "Separator_SP")))
(cond
((null eff)
(princ (strcat "\n [SENSOR] " (if id id "?")
" - FEHLER: weder '" blockname
"' noch Fallback 'Separator_SP' als Blockdatei gefunden"))
(vsp-set (vsp-set rec "status" "abbruch") "fehler_text"
"kein Block gefunden"))
(T
(princ (strcat "\n [SENSOR] " id " '" blockname "' -> ("
(rtos x 2 0) ", " (rtos y 2 0) ", " (rtos z 2 0)
") R=" (rtos rotation 2 1)))
(command "_.INSERT" eff pt "" "" rotation)
;; Verbleibende Prompts mit Enter abfangen, aber GEZAEHLT - siehe
;; mubea:build-separator-one (ein Prompt, der Leer-Antworten
;; ablehnt, haelt CMDACTIVE sonst dauerhaft > 0).
(setq n 0)
(while (and (> (getvar "CMDACTIVE") 0) (< n 5))
(command "")
(setq n (1+ n)))
(if (> (getvar "CMDACTIVE") 0)
(progn
(command)
(princ (strcat "\n WARNUNG: INSERT von '" eff
"' nicht sauber beendet - abgebrochen."))))
(setq ent (entlast))
(if (atoms-family 1 '("ssg-id-generate")) (ssg-id-generate ent))
(setq ed (entget ent))
(princ (strcat " -> Block " (cdr (assoc 2 ed))))
(setq rec (vsp-set rec "block_name" (cdr (assoc 2 ed))))
(setq rec (vsp-set rec "block_handle" (cdr (assoc 5 ed))))
(setq rec (vsp-set rec "insert_point" (cdr (assoc 10 ed))))
(setq rec (vsp-set rec "attribs" (ssg-attrib-read ent)))
(vsp-set rec "status" "executed"))))))
;; Alle Zusatzobjekte der Datei bauen. Eigener ssg-start-Rahmen, weil
;; vsp-bau-datei seinen schon geschlossen hat; ATTREQ/ATTDIA 0 ist Pflicht -
;; sonst fragt (command "_.INSERT" ...) nach Attributwerten.
(defun hundm05:bau-zusatzobjekte (datei / daten objekte out rec)
(defun hundm05:bau-zusatzobjekte (datei / daten objekte out rec builder kind)
(setq daten (ssg-load-json datei))
(setq objekte '())
(foreach obj daten
@@ -127,11 +200,6 @@
(setq objekte (reverse objekte))
(cond
((null objekte) nil)
((null (car (atoms-family 1 '("KREISEL-INSERT-SCRIPT"))))
(princ (strcat "\n[TEST_HUNDM05] WARNUNG: " (itoa (length objekte))
" Zusatzobjekt(e) uebersprungen - KreiselInsert nicht"
" geladen."))
nil)
(T
(princ (strcat "\n " (itoa (length objekte))
" weitere(s) Objekt(e) der Anlage"))
@@ -142,16 +210,28 @@
(setvar "ATTDIA" 0)
(setq out '())
(foreach obj objekte
(setq rec (vl-catch-all-apply 'hundm05:bau-kreisel (list obj)))
(if (vl-catch-all-error-p rec)
(progn
(princ (strcat "\n [KREISEL] Ausnahme: "
(vl-catch-all-error-message rec)))
(setq rec (vsp-set (vsp-set (vsp-set
(vsp-rec-neu (ssg-val obj "id"))
"kind" "kreisel") "status" "abbruch")
"fehler_text"
(vl-catch-all-error-message rec)))))
;; Unterscheidung Kreisel/Sensor ueber "block" (nur Separator/
;; Scanner-Eintraege haben es), je eigener Builder + "kind"-Wert.
(setq kind (if (ssg-val obj "block") "sensor" "kreisel"))
(setq builder (if (ssg-val obj "block") 'hundm05:bau-sensor 'hundm05:bau-kreisel))
(cond
((and (= kind "kreisel")
(null (car (atoms-family 1 '("KREISEL-INSERT-SCRIPT")))))
(princ (strcat "\n [KREISEL] " (ssg-val obj "id")
" uebersprungen - KreiselInsert nicht geladen."))
(setq rec (vsp-set (vsp-set (vsp-rec-neu (ssg-val obj "id"))
"kind" kind) "status" "spec-fehler")))
(T
(setq rec (vl-catch-all-apply builder (list obj)))
(if (vl-catch-all-error-p rec)
(progn
(princ (strcat "\n [" (strcase kind) "] Ausnahme: "
(vl-catch-all-error-message rec)))
(setq rec (vsp-set (vsp-set (vsp-set
(vsp-rec-neu (ssg-val obj "id"))
"kind" kind) "status" "abbruch")
"fehler_text"
(vl-catch-all-error-message rec)))))))
(setq out (cons rec out)))
(ssg-end)
(reverse out))))