Mubeat Test hinzu
This commit is contained in:
+151
-47
@@ -153,52 +153,147 @@
|
||||
)
|
||||
|
||||
|
||||
;; --- Gefaellestrecke (GF_*, Modus 1) ---
|
||||
;; Wie test_gefaellestrecke: Element-Winkel 3 Grad, L_stau berechnet.
|
||||
;; deltaL wird NICHT mehr fest auf 10000 gesetzt, sondern aus der realen
|
||||
;; 2D-Distanz zwischen start_mm und ende_mm (aus der DXF abgeleitet) berechnet -
|
||||
;; sonst haetten (wie im ersten TEST_MUBEA-Lauf beobachtet) alle 20 Strecken
|
||||
;; die gleiche Default-Laenge statt ihrer tatsaechlichen Laenge.
|
||||
;; Aus JSON: start_mm, ende_mm, hz_grad, as_seite, es_seite, as_winkel, es_winkel.
|
||||
(defun mubea:build-gf (e / tid start-mm ende-mm hz as-seite es-seite as-winkel es-winkel
|
||||
test-deltaL test-winkel test-rad sep-x test-L_stau ent
|
||||
dx dy)
|
||||
(setq tid (ssg-val e "test_id")
|
||||
start-mm (mapcar 'float (ssg-val e "start_mm"))
|
||||
ende-mm (ssg-val e "ende_mm")
|
||||
hz (float (ssg-val e "hz_grad"))
|
||||
as-seite (ssg-val e "as_seite")
|
||||
es-seite (ssg-val e "es_seite")
|
||||
as-winkel (ssg-val e "as_winkel")
|
||||
es-winkel (ssg-val e "es_winkel"))
|
||||
;; --- Gefaellestrecke: Init-Konflikt umgehen -----------------------------
|
||||
;; gefaellestrecke-einfuegen ruft "(if (not *lib-initialized*) (gf-init-
|
||||
;; bibliothek))" auf (Gefaellestrecke.lsp:1567) - dasselbe Flag, das
|
||||
;; init-bibliothek (Vario, vf_standard.lsp) fuer SEINE EIGENEN aus-dx/ein-dx/
|
||||
;; aus-dz/ein-dz setzt. Da C:TEST_MUBEA zuerst den Vario baut (init-
|
||||
;; bibliothek setzt *lib-initialized*=T), wuerde gf-init-bibliothek NIE mehr
|
||||
;; laufen und die Gefaellestrecke mit den (voellig andersartigen) Vario-
|
||||
;; Bogenmassen statt den echten AS_Element/ES_Element-Massen rechnen - genau
|
||||
;; das fuehrte zur falschen Zielhoehe im ersten TEST_MUBEA-Lauf. Fix: Flag
|
||||
;; kurz zuruecksetzen, gf-init-bibliothek EINMAL erzwingen (danach haben
|
||||
;; aus-dx/ein-dx/aus-dz/ein-dz die korrekten GF-spezifischen Werte).
|
||||
(defun mubea:ensure-gf-init ( / )
|
||||
(if (not *mubea-gf-init-done*)
|
||||
(progn
|
||||
(setq *lib-initialized* nil)
|
||||
(gf-init-bibliothek)
|
||||
(setq *lib-initialized* t)
|
||||
(setq *mubea-gf-init-done* T)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; --- Gefaellestrecke: L_stau <-> Ziel-Hoehendifferenz kalibrieren ---------
|
||||
;; Bei festem Element-Winkel (3 Grad) ist deltaH linear in L_stau (nur die
|
||||
;; Staustrecke ist skalierbar). Statt die Formel aus test_gefaellestrecke.lsp
|
||||
;; zu uebernehmen (die L_stau aus einer ZIEL-LAENGE ableitet, nicht aus einer
|
||||
;; ZIEL-HOEHE - beides ist bei festem Winkel nicht unabhaengig waehlbar),
|
||||
;; wird die reale Steigung/Achsenabschnitt per zwei Probe-Bauten gemessen
|
||||
;; (gefaellestrecke-einfuegen liefert deltaH exakt zurueck) und die Probe-
|
||||
;; Inserts danach wieder geloescht. Rueckgabe: (steigung . achsenabschnitt).
|
||||
(defun mubea:gf-calibrate (as-seite es-seite as-winkel es-winkel hz /
|
||||
probe-pt l1 l2 e1 e2 dz1 dz2 steigung achsenabschnitt)
|
||||
(mubea:ensure-gf-init)
|
||||
(setq probe-pt (list 0.0 -500000.0 0.0)) ;; Schrott-Punkt, wird geloescht
|
||||
(setq l1 3000.0 l2 8000.0)
|
||||
(setq e1 (gefaellestrecke-einfuegen l1 3.0 probe-pt as-seite es-seite hz
|
||||
l1 as-winkel es-winkel "0" "Schoenenberger Geruest"))
|
||||
(setq e2 (gefaellestrecke-einfuegen l2 3.0 probe-pt as-seite es-seite hz
|
||||
l2 as-winkel es-winkel "0" "Schoenenberger Geruest"))
|
||||
(setq dz1 (cadr e1) dz2 (cadr e2))
|
||||
(setq steigung (/ (- dz2 dz1) (- l2 l1)))
|
||||
(setq achsenabschnitt (- dz1 (* steigung l1)))
|
||||
;; Probe-Bloecke wieder entfernen (nur das INSERT - Blockdefinition bleibt
|
||||
;; ungenutzt in der Blocktabelle, erscheint nicht im Modelspace/Zaehlungen)
|
||||
(if (car e1) (entdel (car e1)))
|
||||
(if (car e2) (entdel (car e2)))
|
||||
(princ (strcat "\n [GF-Kalibrierung] L_stau=" (rtos l1 2 0) "->dz=" (rtos dz1 2 1)
|
||||
" L_stau=" (rtos l2 2 0) "->dz=" (rtos dz2 2 1)
|
||||
" Steigung=" (rtos steigung 2 6) " Achsenabschnitt=" (rtos achsenabschnitt 2 2)))
|
||||
(cons steigung achsenabschnitt)
|
||||
)
|
||||
|
||||
|
||||
;; --- Eine einzelne Gefaellestrecke bauen (Modus 1) ---
|
||||
;; L_stau wird aus der ZIEL-HOEHENDIFFERENZ (start_mm.z - ende_mm.z) ueber die
|
||||
;; kalibrierte lineare Beziehung berechnet (siehe mubea:gf-calibrate) - NICHT
|
||||
;; aus der XY-Distanz (bei festem 3-Grad-Winkel legen Laenge und
|
||||
;; Hoehendifferenz sich gegenseitig fest, beides gleichzeitig aus den realen
|
||||
;; Koordinaten zu uebernehmen ist geometrisch inkonsistent).
|
||||
;; Rueckgabe: Ergebnis-JSON-String.
|
||||
(defun mubea:build-gf-one (tid start-mm ende-mm hz as-seite es-seite as-winkel es-winkel /
|
||||
ziel-dz kalib steigung achsenabschnitt test-L_stau
|
||||
real-deltaL dx dy ent)
|
||||
;; Kalibrierung einmalig pro (as-seite/es-seite/as-winkel/es-winkel/hz)-
|
||||
;; Kombination; fuer alle Kopien mit denselben Parametern wiederverwendet.
|
||||
(if (null *mubea-gf-kalib-cache*) (setq *mubea-gf-kalib-cache* '()))
|
||||
(setq kalib (cdr (assoc (list as-seite es-seite as-winkel es-winkel hz) *mubea-gf-kalib-cache*)))
|
||||
(if (null kalib)
|
||||
(progn
|
||||
(setq kalib (mubea:gf-calibrate as-seite es-seite as-winkel es-winkel hz))
|
||||
(setq *mubea-gf-kalib-cache*
|
||||
(cons (cons (list as-seite es-seite as-winkel es-winkel hz) kalib) *mubea-gf-kalib-cache*))
|
||||
)
|
||||
)
|
||||
(setq steigung (car kalib) achsenabschnitt (cdr kalib))
|
||||
|
||||
(setq ziel-dz (- (caddr start-mm) (caddr ende-mm)))
|
||||
(setq test-L_stau (/ (- ziel-dz achsenabschnitt) steigung))
|
||||
|
||||
;; Nur zu Log-/Attributzwecken: reale XY-Distanz start_mm->ende_mm
|
||||
(setq dx (- (car ende-mm) (car start-mm))
|
||||
dy (- (cadr ende-mm) (cadr start-mm)))
|
||||
(setq real-deltaL (sqrt (+ (* dx dx) (* dy dy))))
|
||||
|
||||
(princ (strcat "\n [GF] " tid " -> Start=(" (rtos (car start-mm) 2 0)
|
||||
"," (rtos (cadr start-mm) 2 0) "," (rtos (caddr start-mm) 2 0)
|
||||
") hz=" (rtos hz 2 0) " Ziel-dz=" (rtos ziel-dz 2 1)
|
||||
" L_stau=" (rtos test-L_stau 2 1)))
|
||||
(setq ent (car (gefaellestrecke-einfuegen
|
||||
test-L_stau 3.0 start-mm as-seite es-seite hz
|
||||
real-deltaL as-winkel es-winkel "0" "Schoenenberger Geruest")))
|
||||
(mubea:ent-json tid "gefaellestrecke" ent)
|
||||
)
|
||||
|
||||
;; --- Gefaellestrecke(n) aus einem Template-Eintrag bauen ---
|
||||
;; Ein einziger JSON-Eintrag beschreibt per "anzahl" + "delta_y"/"delta_x" eine
|
||||
;; ganze Reihe identischer Gefaellestrecken (statt 20 Einzeleintraege). Element i
|
||||
;; (1..anzahl) wird um (i-1)*delta in Y bzw. X versetzt (start_mm UND ende_mm
|
||||
;; gemeinsam). Fehlen anzahl/delta -> genau eine Strecke am angegebenen Ort.
|
||||
;; Aus JSON: start_mm, ende_mm, hz_grad, as_seite, es_seite, as_winkel,
|
||||
;; es_winkel, anzahl (Default 1), delta_y (Default 0), delta_x (Default 0).
|
||||
;; Rueckgabe: LISTE von Ergebnis-JSON-Strings (eine je Kopie).
|
||||
(defun mubea:build-gf (e / tid0 start0 ende0 hz as-seite es-seite as-winkel es-winkel
|
||||
anzahl dy dx i off nr tid s-mm e-mm ergebnisse)
|
||||
(setq tid0 (ssg-val e "test_id")
|
||||
start0 (mapcar 'float (ssg-val e "start_mm"))
|
||||
ende0 (mapcar 'float (ssg-val e "ende_mm"))
|
||||
hz (float (ssg-val e "hz_grad"))
|
||||
as-seite (ssg-val e "as_seite")
|
||||
es-seite (ssg-val e "es_seite")
|
||||
as-winkel(ssg-val e "as_winkel")
|
||||
es-winkel(ssg-val e "es_winkel")
|
||||
anzahl (ssg-val e "anzahl")
|
||||
dy (ssg-val e "delta_y")
|
||||
dx (ssg-val e "delta_x"))
|
||||
(if (or (null as-seite) (= as-seite "")) (setq as-seite "links"))
|
||||
(if (or (null es-seite) (= es-seite "")) (setq es-seite "links"))
|
||||
(if (or (null as-winkel) (= as-winkel "")) (setq as-winkel "90"))
|
||||
(if (or (null es-winkel) (= es-winkel "")) (setq es-winkel "90"))
|
||||
(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))
|
||||
|
||||
;; deltaL = reale 2D-Distanz start_mm -> ende_mm; Fallback 10000 falls
|
||||
;; ende_mm in einem Eintrag fehlen sollte.
|
||||
(if ende-mm
|
||||
(progn
|
||||
(setq ende-mm (mapcar 'float ende-mm))
|
||||
(setq dx (- (car ende-mm) (car start-mm)))
|
||||
(setq dy (- (cadr ende-mm) (cadr start-mm)))
|
||||
(setq test-deltaL (sqrt (+ (* dx dx) (* dy dy)))))
|
||||
(setq test-deltaL 10000.0))
|
||||
|
||||
(setq test-winkel 3.0
|
||||
test-rad (* test-winkel (/ pi 180.0))
|
||||
sep-x (* 300.0 (cos test-rad)))
|
||||
(setq test-L_stau
|
||||
(/ (- test-deltaL (float aus-dx) (float ein-dx) sep-x) (cos test-rad)))
|
||||
|
||||
(princ (strcat "\n [GF] " tid " -> Start=(" (rtos (car start-mm) 2 0)
|
||||
"," (rtos (cadr start-mm) 2 0) "," (rtos (caddr start-mm) 2 0)
|
||||
") hz=" (rtos hz 2 0) " deltaL=" (rtos test-deltaL 2 1)))
|
||||
(setq ent (car (gefaellestrecke-einfuegen
|
||||
test-L_stau test-winkel start-mm as-seite es-seite hz
|
||||
test-deltaL as-winkel es-winkel "0" "Schoenenberger Geruest")))
|
||||
(mubea:ent-json tid "gefaellestrecke" ent)
|
||||
(setq ergebnisse '() i 0)
|
||||
(while (< i anzahl)
|
||||
(setq off (float i))
|
||||
(setq nr (1+ i))
|
||||
;; Bei mehreren Kopien fortlaufende ID GF_Mubea_01.. bilden (kompatibel zur
|
||||
;; frueheren Einzelbenennung); bei genau einer Kopie den Template-Namen behalten.
|
||||
(setq tid
|
||||
(if (> anzahl 1)
|
||||
(strcat tid0 "_" (if (< nr 10) (strcat "0" (itoa nr)) (itoa nr)))
|
||||
tid0))
|
||||
(setq s-mm (list (+ (car start0) (* dx off)) (+ (cadr start0) (* dy off)) (caddr start0)))
|
||||
(setq e-mm (list (+ (car ende0) (* dx off)) (+ (cadr ende0) (* dy off)) (caddr ende0)))
|
||||
(setq ergebnisse
|
||||
(cons (mubea:build-gf-one tid s-mm e-mm hz as-seite es-seite as-winkel es-winkel)
|
||||
ergebnisse))
|
||||
(setq i (1+ i))
|
||||
)
|
||||
(reverse ergebnisse)
|
||||
)
|
||||
|
||||
|
||||
@@ -260,7 +355,7 @@
|
||||
;; ============================================================
|
||||
;; C:TEST_MUBEA - Hauptbefehl
|
||||
;; ============================================================
|
||||
(defun c:TEST_MUBEA ( / json-datei daten eintrag tid blk res
|
||||
(defun c:TEST_MUBEA ( / json-datei daten eintrag tid blk res r
|
||||
results-list sep-idx anz-ok anz-fehler kind)
|
||||
|
||||
;; Benoetigte Feature-Module laden
|
||||
@@ -278,6 +373,11 @@
|
||||
(if (or (not *lib-initialized*) (null bogen-auf))
|
||||
(init-bibliothek))
|
||||
|
||||
;; Caches fuer GF-Init-Workaround und Hoehenkalibrierung pro Lauf zuruecksetzen
|
||||
;; (siehe mubea:ensure-gf-init / mubea:gf-calibrate weiter oben)
|
||||
(setq *mubea-gf-init-done* nil)
|
||||
(setq *mubea-gf-kalib-cache* nil)
|
||||
|
||||
;; Testdaten laden
|
||||
(setq json-datei (strcat (getenv "DXFMAKRO") "/tests/testdata/mubea.json"))
|
||||
(if (not (findfile json-datei))
|
||||
@@ -319,13 +419,17 @@
|
||||
(T
|
||||
(princ (strcat "\n WARNUNG: Unbekannter Eintrag uebersprungen"))
|
||||
nil)))
|
||||
;; mubea:build-gf liefert eine LISTE (Template -> mehrere Strecken), die
|
||||
;; uebrigen Builder je einen String. Beides einheitlich einsammeln.
|
||||
(if res
|
||||
(progn
|
||||
(setq results-list (cons res results-list))
|
||||
(if (or (vl-string-search "\"executed\"" res)
|
||||
(vl-string-search "\"placeholder\"" res))
|
||||
(setq anz-ok (1+ anz-ok))
|
||||
(setq anz-fehler (1+ anz-fehler))))))
|
||||
(if (= (type res) 'STR) (setq res (list res)))
|
||||
(foreach r res
|
||||
(setq results-list (cons r results-list))
|
||||
(if (or (vl-string-search "\"executed\"" r)
|
||||
(vl-string-search "\"placeholder\"" r))
|
||||
(setq anz-ok (1+ anz-ok))
|
||||
(setq anz-fehler (1+ anz-fehler)))))))
|
||||
|
||||
(princ "\n================================================================")
|
||||
(princ (strcat "\n Ergebnis: " (itoa anz-ok) " OK, " (itoa anz-fehler) " Fehler"))
|
||||
|
||||
Reference in New Issue
Block a user