fix: Etage-Solver bilanziert Ein-/Auslauf auf der Hauptachse statt im Blocksystem

Die gebaute Etage-Kette endete 987.63 mm zu weit (X) und 3.46 mm zu hoch (Z).
Der Fehlbetrag lag vollstaendig im Ein-/Auslauf: der Solver reservierte dort
1177.87 mm, real verbraucht die Kette 2165.09 mm.

Zwei Ursachen:

(a) vf-element-masse liefert KS_EIN->KS_AUS im BLOCK-Koordinatensystem. AS
    und ES werden aber um (hz - ein-ang) gedreht eingebaut - beim
    AS_Element_30 ist ein-ang = 90 Grad, dadurch landet die Block-Y-
    Komponente auf der Hauptachse. Bilanziert wurde die Block-X-Komponente:
    AS 209.7 statt real 486.10, ES -242.6 statt real 525.29.

(b) Die Auslauf-Staustrecke wurde fix mit 400 mm budgetiert, ist seit dem
    Umbau "Auslauf RUECKWAERTS vom ES gerechnet" aber variabel (im Testfall
    334 mm). Daraus die 3.46 mm Resthoehe.

Fix: neue Funktion etage-rand-budget (seite) rechnet Einlauf (Schritte 1-4)
und Auslauf (12-15) exakt so, wie etage-foerderanlage-einfuegen sie baut,
inklusive analytisch vorab bestimmtem L-exit. Kern sind die reinen,
hz-unabhaengigen Projektionen etage-laengs/etage-quer. Die alte Naeherung
bleibt als Fallback, falls ein Block fehlt.

Damit faellt auch die bisherige Annahme, Laengentreue und seitliche
Fluchtung des ES-KS_AUS seien nicht gleichzeitig loesbar: die Bauschritte
5-11 laufen auf der Hauptachse und tragen nichts zur Quer-Bilanz bei,
L-exit ist deshalb von L_GF/L_VF unabhaengig und vor dem Solve bestimmbar.

Weiter: Konstante *vfk-etage-stau-ein* (400 mm) ersetzt die nackte Zahl an
beiden Stellen; zwei neue lang-Keys (de+en, Paritaet 1095/1095); neuer
Regressionsblock tu-tests-etage in tests/test_unit.lsp mit dem AS/ES-Fall
(Suite 520/520 gruen).

In BricsCAD verifiziert: Soll-Endpunkt (11804.31, 3039.64, 4256.5) exakt
getroffen, Abweichung 0.00 mm in allen drei Achsen.

Offen: bei korrekter Bilanz bleiben im Testfall bei 33 Grad nur 16.13 mm
fuer beide GF-Strecken. Eine Mindest-GF-Laenge als Gueltigkeitskriterium
der Winkelwahl ist noch nicht eingebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-09 18:01:22 +02:00
parent b7b1df25b9
commit 3116e639eb
5 changed files with 270 additions and 33 deletions
+38
View File
@@ -308,6 +308,43 @@
)
;; ------------------------------------------------------------
;; TESTS: vf_etage.lsp - Projektion der Randstuecke auf die Hauptachse
;; ------------------------------------------------------------
;; etage-laengs/-quer zerlegen einen um d gedreht eingebauten Blockvektor
;; (vx vy) in Laengs- und Queranteil bezogen auf die Hauptachse. Sie sind der
;; Kern von etage-rand-budget und damit der korrigierten Laengenbilanz.
(defun tu-tests-etage ( / _hp _vx _vy _l _q)
(princ "\n[vf_etage]")
(setq _hp (/ pi 2.0))
;; d=0: Block liegt schon auf der Hauptachse -> unveraendert
(tu-eqf "etage-laengs/d0" 250.0 (etage-laengs 250.0 67.0 0.0))
(tu-eqf "etage-quer/d0" 67.0 (etage-quer 250.0 67.0 0.0))
;; d=+90 Grad: Block-X zeigt quer, Block-Y entgegen der Hauptachse
(tu-eqf "etage-laengs/d+90" -67.0 (etage-laengs 250.0 67.0 _hp))
(tu-eqf "etage-quer/d+90" 250.0 (etage-quer 250.0 67.0 _hp))
;; REGRESSION (Nutzer-Befund 2026-10-09): das AS_Element_30 hat ein-ang=90
;; Grad, wird also mit d=-90 Grad eingebaut. Auf der Hauptachse landet dann
;; die Block-Y-Komponente (486.1), NICHT die Block-X-Komponente (209.7).
;; Der alte Solver nahm vx und verfehlte die Kettenlaenge um ~990 mm.
(tu-eqf "etage-laengs/AS-d-90-nimmt-vy" 486.1 (etage-laengs 209.7 486.1 (- _hp)))
(tu-eqf "etage-quer/AS-d-90" -209.7 (etage-quer 209.7 486.1 (- _hp)))
;; dito ES_Element_30 (ein-ang=120, Auslauf-Schwenk 30 -> d=-90)
(tu-eqf "etage-laengs/ES-d-90-nimmt-vy" 525.29 (etage-laengs -242.6 525.29 (- _hp)))
(tu-eqf "etage-quer/ES-d-90" 242.6 (etage-quer -242.6 525.29 (- _hp)))
;; Drehung ist laengentreu: laengs^2 + quer^2 = vx^2 + vy^2 (fuer jedes d)
(setq _vx 209.7 _vy 486.1)
(setq _l (etage-laengs _vx _vy 0.9) _q (etage-quer _vx _vy 0.9))
(tu-eqf "etage-laengs/quer-laengentreu"
(+ (* _vx _vx) (* _vy _vy))
(+ (* _l _l) (* _q _q)))
)
;; ------------------------------------------------------------
;; TESTS: export.lsp - CSV/KOS-Kodierung
;; ------------------------------------------------------------
@@ -1707,6 +1744,7 @@
(princ "\n================================================================")
(foreach fn '("tu-tests-core" "tu-tests-lang" "tu-tests-id" "tu-tests-vfcore"
"tu-tests-etage"
"tu-tests-export" "tu-tests-gf" "tu-tests-omni" "tu-tests-kreisel"
"tu-tests-sepliste" "tu-tests-json" "tu-tests-geruest"
"tu-tests-sepscan" "tu-tests-vfl-segs" "tu-tests-vfl-abbruch"