[FIX] Scanner-Insert in TEST_MUBEA: eff wurde durch AND statt IF zu T
mubea:build-separator-one nutzte (and blockname (ssg-ils-block-laden blockname)) fuer eff - AutoLISPs AND liefert bei mehreren wahren Ausdruecken T zurueck statt des letzten Werts (anders als in Common Lisp/Scheme). Sobald ein Blockname (z.B. "Scanner") direkt gefunden wurde, statt ueber den Separator_SP-Fallback zu laufen, wurde eff=T an "_.INSERT" uebergeben. Fix: (if blockname (ssg-ils-block-laden blockname)). Ausserdem: Scanner-Testeintrag in mubea.json ergaenzt und _vario_count/_separator_count in test_mubea.py, damit erwartete Ergebniszahlen auch bei "anzahl">1 (Template->mehrere Kopien) stimmen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+112
-29
@@ -5,7 +5,9 @@
|
||||
;; - Kreisel (Eintraege mit "id", Block KREISEL_*) via kreisel-insert-script
|
||||
;; - Vario (test_id "VF_*") Block VF_* via variofoerderer-einfuegen
|
||||
;; + vf-block-erstellen
|
||||
;; (deltaL/L_VF werden fuer winkel+deltaH geloest, L_GF Split 500/4230)
|
||||
;; (deltaL/L_VF werden fuer winkel+deltaH geloest, L_GF Split 500/4230;
|
||||
;; "anzahl"/"delta_y"/"delta_x" wie bei Gefaelle: Template->mehrere
|
||||
;; Foerderer mit fortlaufend suffixiertem test_id, _01.._anzahl)
|
||||
;; - Gefaelle (test_id "GF_*", Modus 1) Block GF_* via gefaellestrecke-einfuegen
|
||||
;; - Separator (Eintraege mit "block") Block S-LP/Separator_SP via _.INSERT
|
||||
;;
|
||||
@@ -109,18 +111,9 @@
|
||||
;; erzwingen in test_foerderer.lsp), statt den automatisch kleinsten
|
||||
;; gueltigen Winkel zu nehmen. L_GF1 aus JSON ist der Vorlauf-Zielwert;
|
||||
;; L_GF2 (Nachlauf) ist der Rest (L_GF_gesamt - L_GF1).
|
||||
(defun mubea:build-vario (e / tid richtung deltaH deltaL winkel-soll gf1-ziel seite hz
|
||||
startpunkt ergebnis winkel-treffer best-winkel L_GF L_VF
|
||||
gf1 gf2 hoehe-bis lastEnt ent)
|
||||
(setq tid (ssg-val e "test_id")
|
||||
richtung (ssg-val e "richtung")
|
||||
deltaL (float (ssg-val e "deltaL"))
|
||||
deltaH (float (ssg-val e "deltaH"))
|
||||
winkel-soll(ssg-val e "winkel")
|
||||
gf1-ziel (float (ssg-val e "L_GF1"))
|
||||
seite (ssg-val e "seite")
|
||||
hz (ssg-val e "hz")
|
||||
startpunkt (list (float (ssg-val e "x")) (float (ssg-val e "y")) (float (ssg-val e "z"))))
|
||||
(defun mubea:build-vario-one (tid richtung deltaL deltaH winkel-soll gf1-ziel seite hz
|
||||
startpunkt / ergebnis winkel-treffer best-winkel L_GF L_VF
|
||||
gf1 gf2 hoehe-bis lastEnt ent)
|
||||
(if (or (null seite) (= seite "")) (setq seite "links"))
|
||||
(if (null hz) (setq hz 0.0) (setq hz (float hz)))
|
||||
(princ (strcat "\n [VARIO] " tid " -> deltaL=" (rtos deltaL 2 0)
|
||||
@@ -172,6 +165,48 @@
|
||||
(mubea:result-json tid "vario" "failed" nil nil nil nil)))
|
||||
)
|
||||
|
||||
;; --- Vario(s) aus einem Template-Eintrag bauen ---
|
||||
;; Wie mubea:build-gf: "anzahl" identische Kopien, je um "delta_y"/"delta_x" (mm)
|
||||
;; versetzt (nur startpunkt x/y - Default 1/0/0 -> genau ein Foerderer wie bisher).
|
||||
;; Bei mehreren Kopien wird "test_id" fortlaufend suffixiert (_01.._anzahl),
|
||||
;; bei genau einer Kopie bleibt der Template-Name erhalten (kompatibel zur
|
||||
;; frueheren Einzelbenennung).
|
||||
;; Rueckgabe: LISTE von Ergebnis-JSON-Strings (eine je Kopie).
|
||||
(defun mubea:build-vario (e / tid0 richtung deltaL deltaH winkel-soll gf1-ziel seite hz
|
||||
start0 anzahl dy dx i off nr tid startpunkt ergebnisse)
|
||||
(setq tid0 (ssg-val e "test_id")
|
||||
richtung (ssg-val e "richtung")
|
||||
deltaL (float (ssg-val e "deltaL"))
|
||||
deltaH (float (ssg-val e "deltaH"))
|
||||
winkel-soll(ssg-val e "winkel")
|
||||
gf1-ziel (float (ssg-val e "L_GF1"))
|
||||
seite (ssg-val e "seite")
|
||||
hz (ssg-val e "hz")
|
||||
start0 (list (float (ssg-val e "x")) (float (ssg-val e "y")) (float (ssg-val e "z")))
|
||||
anzahl (ssg-val e "anzahl")
|
||||
dy (ssg-val e "delta_y")
|
||||
dx (ssg-val e "delta_x"))
|
||||
(if (or (null anzahl) (< anzahl 1)) (setq anzahl 1))
|
||||
(setq dy (if dy (float dy) 0.0))
|
||||
(setq dx (if dx (float dx) 0.0))
|
||||
|
||||
(setq ergebnisse '() i 0)
|
||||
(while (< i anzahl)
|
||||
(setq off (float i))
|
||||
(setq nr (1+ i))
|
||||
(setq tid
|
||||
(if (> anzahl 1)
|
||||
(strcat tid0 "_" (if (< nr 10) (strcat "0" (itoa nr)) (itoa nr)))
|
||||
tid0))
|
||||
(setq startpunkt (list (+ (car start0) (* dx off)) (+ (cadr start0) (* dy off)) (caddr start0)))
|
||||
(setq ergebnisse
|
||||
(cons (mubea:build-vario-one tid richtung deltaL deltaH winkel-soll gf1-ziel seite hz startpunkt)
|
||||
ergebnisse))
|
||||
(setq i (1+ i))
|
||||
)
|
||||
(reverse ergebnisse)
|
||||
)
|
||||
|
||||
|
||||
;; --- Gefaellestrecke: Init-Konflikt umgehen -----------------------------
|
||||
;; gefaellestrecke-einfuegen ruft "(if (not *lib-initialized*) (gf-init-
|
||||
@@ -281,26 +316,33 @@
|
||||
)
|
||||
|
||||
|
||||
;; --- Separator (Eintraege mit "block"): _.INSERT der Blockdatei ---
|
||||
;; --- Ein einzelner Separator: Blockdefinition laden, dann per Name einfuegen ---
|
||||
;; Verwendet den in JSON genannten Block; faellt auf Separator_SP zurueck
|
||||
;; (Block der "Separator einfuegen"-Routine ILS_SEPARATOR_INSERT).
|
||||
(defun mubea:build-separator (e idx / blockname x y z rot pt pfad tid)
|
||||
(setq blockname (ssg-val e "block")
|
||||
x (float (ssg-val e "x"))
|
||||
y (float (ssg-val e "y"))
|
||||
z (float (ssg-val e "z"))
|
||||
rot (ssg-val e "rotation"))
|
||||
(if (null rot) (setq rot 0))
|
||||
(setq rot (float rot))
|
||||
(setq pt (list x y z))
|
||||
(setq tid (strcat "SEPARATOR_" (itoa idx)))
|
||||
;; Nutzt ssg-ils-block-laden (wie Kreisel/GF/VF), um den Block vorab zu
|
||||
;; definieren, dann klassisches "_.INSERT eff pt "" "" rot" (wie ueberall sonst
|
||||
;; im Projekt, z.B. omni:insert-dxf/KreiselInsert). NEUE Bloecke (z.B. "Scanner")
|
||||
;; koennen dabei eine zusaetzliche Rueckfrage einschieben, die die feste
|
||||
;; Antwortfolge verschiebt und das INSERT nicht sauber beendet (CMDACTIVE bleibt
|
||||
;; > 0) - dieselbe Absicherung wie in ssg-ils-block-laden-dim (Zeilen 418f.) und
|
||||
;; omni:insert-dxf (Zeile 980): nach dem INSERT verbleibende Prompts mit Leer-
|
||||
;; Antworten (Enter) abfangen, bis der Befehl sauber beendet ist.
|
||||
(defun mubea:build-separator-one (tid blockname pt rot / eff)
|
||||
(princ (strcat "\n [SEP] " tid " '" (if blockname blockname "?")
|
||||
"' -> (" (rtos x 2 0) "," (rtos y 2 0) "," (rtos z 2 0) ") R=" (rtos rot 2 0)))
|
||||
(setq pfad (and blockname (ssg-ils-block-datei blockname)))
|
||||
(if (null pfad) (setq pfad (ssg-ils-block-datei "Separator_SP")))
|
||||
(if pfad
|
||||
"' -> (" (rtos (car pt) 2 0) "," (rtos (cadr pt) 2 0) "," (rtos (caddr pt) 2 0)
|
||||
") R=" (rtos rot 2 0)))
|
||||
;; NICHT (and blockname (ssg-ils-block-laden blockname)) verwenden: AutoLISPs
|
||||
;; AND liefert bei mehreren wahren Ausdruecken T zurueck, NICHT den letzten
|
||||
;; Wert (anders als z.B. in Common Lisp/Scheme) - eff waere dann bei einem
|
||||
;; erfolgreich direkt gefundenen Block (z.B. "Scanner", das NICHT ueber den
|
||||
;; Separator_SP-Fallback laeuft) das Symbol T statt des Blocknamen-Strings,
|
||||
;; und das anschliessende "_.INSERT" wuerde einen Block namens T einfuegen.
|
||||
(setq eff (if blockname (ssg-ils-block-laden blockname)))
|
||||
(if (null eff) (setq eff (ssg-ils-block-laden "Separator_SP")))
|
||||
(if eff
|
||||
(progn
|
||||
(command "_.INSERT" pfad pt "" "" rot)
|
||||
(command "_.INSERT" eff pt "" "" rot)
|
||||
(while (> (getvar "CMDACTIVE") 0) (command ""))
|
||||
(mubea:ent-json tid "separator" (entlast)))
|
||||
(progn
|
||||
;; Kein Block gefunden -> sichtbaren Platzhalter zeichnen
|
||||
@@ -312,6 +354,47 @@
|
||||
(if blockname blockname "S-LP") nil pt nil)))
|
||||
)
|
||||
|
||||
;; --- Separator(en) aus einem Eintrag bauen (Eintraege mit "block") ---
|
||||
;; Wie mubea:build-gf: "anzahl" identische Kopien, je um "delta_y"/"delta_x"
|
||||
;; (mm) versetzt (Default 1/0/0 -> genau ein Separator am angegebenen Ort).
|
||||
;; Namensbasis fuer die Kopien: "test_id", falls angegeben (erzeugt
|
||||
;; "<test_id>_01".."<test_id>_anzahl"), sonst Fallback "SEPARATOR_<idx>" wie
|
||||
;; bisher (Einzel-Separatoren ohne "test_id" bleiben dadurch unveraendert).
|
||||
;; "assigned_to" bleibt reine Dokumentation und wird hier NICHT zur Namens-
|
||||
;; bildung verwendet, da mehrere Separatoren denselben assigned_to-Wert teilen
|
||||
;; koennen (z.B. mehrere S-LP-Eintraege mit assigned_to "GF_Mubea_01").
|
||||
;; Rueckgabe: LISTE von Ergebnis-JSON-Strings (eine je Kopie).
|
||||
(defun mubea:build-separator (e idx / blockname x0 y0 z rot tid0 anzahl dy dx
|
||||
i nr tid pt ergebnisse)
|
||||
(setq blockname (ssg-val e "block")
|
||||
x0 (float (ssg-val e "x"))
|
||||
y0 (float (ssg-val e "y"))
|
||||
z (float (ssg-val e "z"))
|
||||
rot (ssg-val e "rotation")
|
||||
tid0 (cond ((ssg-val e "test_id")) ((strcat "SEPARATOR_" (itoa idx))))
|
||||
anzahl (ssg-val e "anzahl")
|
||||
dy (ssg-val e "delta_y")
|
||||
dx (ssg-val e "delta_x"))
|
||||
(if (null rot) (setq rot 0))
|
||||
(setq rot (float rot))
|
||||
(if (or (null anzahl) (< anzahl 1)) (setq anzahl 1))
|
||||
(setq dy (if dy (float dy) 0.0))
|
||||
(setq dx (if dx (float dx) 0.0))
|
||||
|
||||
(setq ergebnisse '() i 0)
|
||||
(while (< i anzahl)
|
||||
(setq nr (1+ i))
|
||||
(setq tid
|
||||
(if (> anzahl 1)
|
||||
(strcat tid0 "_" (if (< nr 10) (strcat "0" (itoa nr)) (itoa nr)))
|
||||
tid0))
|
||||
(setq pt (list (+ x0 (* dx (float i))) (+ y0 (* dy (float i))) z))
|
||||
(setq ergebnisse (cons (mubea:build-separator-one tid blockname pt rot) ergebnisse))
|
||||
(setq i (1+ i))
|
||||
)
|
||||
(reverse ergebnisse)
|
||||
)
|
||||
|
||||
|
||||
;; --- JSON-Export der Mubea-Ergebnisse ---
|
||||
(defun mubea:export-results (tests-out-dir / out-json f first)
|
||||
|
||||
Reference in New Issue
Block a user