weiter am Mubea Test gebaut. Korrektur der GF und VF koordinaten

This commit is contained in:
2026-07-27 22:09:20 +02:00
parent a8fac86754
commit e974e63c40
3 changed files with 70 additions and 90 deletions
+31 -72
View File
@@ -175,91 +175,52 @@
)
)
;; --- 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).
;; Aufbau AUSSCHLIESSLICH aus Anfangspunkt (start-mm) und horizontaler
;; Gesamtlaenge deltaL - KEIN Endpunkt (wie Produktion/gefaellestrecke.dcl
;; Modus 1, siehe object_data.md 2.1). L_stau wird aus deltaL abgeleitet
;; (identische Formel wie test_gefaellestrecke.lsp):
;; L_stau = (deltaL - aus-dx - ein-dx - sep_x) / cos(v)
;; sep_x = 300 * cos(v), v = fester Element-Winkel 3 Grad
;; Die Zielhoehe ergibt sich aus L_stau/Winkel (kein Ziel-Hoehen-Parameter).
;; 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))))
(defun mubea:build-gf-one (tid start-mm deltaL hz as-seite es-seite as-winkel es-winkel /
rad sep-x test-L_stau ent)
(mubea:ensure-gf-init)
;; Element-Masse fuer die gewaehlte AS/ES-Variante setzen, damit aus-dx/ein-dx
;; zur Variante (90/30 Grad) passen. Danach wieder auf 90 zuruecksetzen.
(vf-set-as-masse as-winkel as-seite)
(vf-set-es-masse es-winkel es-seite)
(setq rad (* 3.0 (/ pi 180.0)))
(setq sep-x (* 300.0 (cos rad)))
(setq test-L_stau
(/ (- deltaL (float aus-dx) (float ein-dx) sep-x) (cos 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) " Ziel-dz=" (rtos ziel-dz 2 1)
") hz=" (rtos hz 2 0) " deltaL=" (rtos deltaL 2 0)
" 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")))
deltaL as-winkel es-winkel "0" "Schoenenberger Geruest")))
(vf-set-as-masse "90" as-seite)
(vf-set-es-masse "90" es-seite)
(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,
;; (1..anzahl) wird um (i-1)*delta in Y bzw. X versetzt (nur start_mm - es gibt
;; keinen Endpunkt). Fehlen anzahl/delta -> genau eine Strecke am angegebenen Ort.
;; Aus JSON: start_mm, deltaL_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)
(defun mubea:build-gf (e / tid0 start0 deltaL hz as-seite es-seite as-winkel es-winkel
anzahl dy dx i off nr tid s-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"))
deltaL (float (ssg-val e "deltaL_mm"))
hz (float (ssg-val e "hz_grad"))
as-seite (ssg-val e "as_seite")
es-seite (ssg-val e "es_seite")
@@ -287,9 +248,8 @@
(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)
(cons (mubea:build-gf-one tid s-mm deltaL hz as-seite es-seite as-winkel es-winkel)
ergebnisse))
(setq i (1+ i))
)
@@ -373,10 +333,9 @@
(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)
;; Cache fuer GF-Init-Workaround pro Lauf zuruecksetzen
;; (siehe mubea:ensure-gf-init 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"))