diff --git a/tests/test_hundm05.lsp b/tests/test_hundm05.lsp index 37fd11f..2c787cb 100644 --- a/tests/test_hundm05.lsp +++ b/tests/test_hundm05.lsp @@ -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)))) diff --git a/tests/testdata/hundm05.json b/tests/testdata/hundm05.json index b52c9ea..9936b0a 100644 --- a/tests/testdata/hundm05.json +++ b/tests/testdata/hundm05.json @@ -429,6 +429,7 @@ "expect_kreiselart": "STANDARD" }, { + "id": "HundM05_SEP_01", "comment": "Separator 1 (Nachtrag HundM05, reale Koordinate laut Anwender)", "function": "insert", "block": "S-LP", @@ -438,6 +439,7 @@ "rotation": 0 }, { + "id": "HundM05_SEP_02", "comment": "Separator 2 (Nachtrag HundM05, reale Koordinate laut Anwender)", "function": "insert", "block": "S-LP", @@ -447,6 +449,7 @@ "rotation": 180 }, { + "id": "HundM05_SCANNER_02", "comment": "Scanner zu Separator 2 (Nachtrag HundM05, reale Koordinate laut Anwender)", "function": "insert", "block": "Scanner", @@ -456,6 +459,7 @@ "rotation": 270 }, { + "id": "HundM05_SEP_03", "comment": "Separator 3 (Nachtrag HundM05, reale Koordinate laut Anwender)", "function": "insert", "block": "S-LP", @@ -465,6 +469,7 @@ "rotation": 180 }, { + "id": "HundM05_SCANNER_03", "comment": "Scanner zu Separator 3 (Nachtrag HundM05, reale Koordinate laut Anwender)", "function": "insert", "block": "Scanner", @@ -472,5 +477,95 @@ "y": 1167.67, "z": 2154, "rotation": 270 + }, + { + "id": "HundM05_SEP_04", + "comment": "Separator 4 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 12191.01, + "y": 1168.25, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_04", + "comment": "Scanner zu Separator 4 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 12233.73, + "y": 1166.39, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_05", + "comment": "Separator 5 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 16488.38, + "y": 1171.7, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_05", + "comment": "Scanner zu Separator 5 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 16531.1, + "y": 1169.84, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_06", + "comment": "Separator 6 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 20764.96, + "y": 1166.18, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_06", + "comment": "Scanner zu Separator 6 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 20807.68, + "y": 1164.32, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_07", + "comment": "Separator 7 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 23738.03, + "y": 1170.63, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_07", + "comment": "Scanner zu Separator 7 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 23780.75, + "y": 1168.77, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_08", + "comment": "Separator 8 (Nachtrag HundM05, reale Koordinate laut Anwender, ohne zugehoerigen Scanner)", + "function": "insert", + "block": "S-LP", + "x": 24630.12, + "y": 1167.22, + "z": 2154, + "rotation": 180 } ] diff --git a/tests/testdata/object_data.md b/tests/testdata/object_data.md index 7135125..4488269 100644 --- a/tests/testdata/object_data.md +++ b/tests/testdata/object_data.md @@ -649,7 +649,7 @@ Zwei Dateien beschreiben dieselben 5 Ketten, in zwei Formaten: | `tests/testdata/hm_recformat.json` | die **Aufzeichnung**: rohes Eingabe-Journal aus der XDATA der Kundenzeichnung, als Frage-Antwort-Protokoll | `TEST_HM_RECFORMAT` (in `alltests.json` abgeschaltet) | | `tests/testdata/hundm05.json` | die daraus abgeleitete **Spec** (Domaenenwerte statt Menue-Codes, 52 statt 281 Objekte) - hier werden weitere Teile der Anlage nachgetragen | `TEST_HUNDM05` | -In `hundm05.json` stehen neben den Ketten auch **andere Objekte der Anlage**, erkennbar am Feld `function` - Format wie in den jeweiligen Einzel-Testdaten (ein Kreisel also wie in `kreisel_tests.json`, Schema in Abschnitt 1). Damit beschreibt EINE Datei die ganze Anlage. Der Ketten-Uebersetzer ueberspringt diese Objekte (`vsp-gruppieren`), `hundm05:bau-zusatzobjekte` in `tests/test_hundm05.lsp` baut sie, und `lib/vf_spec_export.py` uebernimmt sie beim Neuerzeugen der Spec-Daten. Im Ergebnis-JSON unterscheidet das Feld `kind` die Objektarten (`linienzug` / `kreisel`). +In `hundm05.json` stehen neben den Ketten auch **andere Objekte der Anlage**, erkennbar am Feld `function` - Format wie in den jeweiligen Einzel-Testdaten (ein Kreisel also wie in `kreisel_tests.json`, Schema in Abschnitt 1). Damit beschreibt EINE Datei die ganze Anlage. Der Ketten-Uebersetzer ueberspringt diese Objekte (`vsp-gruppieren`), `hundm05:bau-zusatzobjekte` in `tests/test_hundm05.lsp` baut sie, und `lib/vf_spec_export.py` uebernimmt sie beim Neuerzeugen der Spec-Daten. Im Ergebnis-JSON unterscheidet das Feld `kind` die Objektarten (`linienzug` / `kreisel` / `sensor`). `sensor` sind Separator/Scanner-Eintraege (erkennbar an `block`, Schema wie Abschnitt 5/`mubea.json`) - `hundm05:bau-sensor` baut sie per direktem `_.INSERT` nach, analog zu `mubea:build-separator-one` in `tests/test_mubea.lsp` (`ils-insert-sensor` selbst ist nicht scriptbar). Die Spec ist das Eingabeformat, die Aufzeichnung die Vorlage, an der sie gemessen wird (Rundlauf-Beweis in `tests/test_vf_spec.py`). Warum beide bleiben: die Aufzeichnung ist die einzige eingecheckte Kopie der Originaldaten (`data/polylines.dxf` ist zu gross fuer das Repo) UND der einzige Test dafuer, dass ein BESTEHENDER `VF_n`-Block weiter abspielbar ist - also dass Doppelklick-Edit und 2D/3D-Konvertierung an Altbestand funktionieren. Gebaut wird routinemaessig nur noch aus der Spec, damit nicht zweimal dieselbe Geometrie entsteht.