refactor: Kettenfoerderer als Seitenansicht mit Beschriftung und Hoehenmass, Draufsicht als eigener Hilfsblock KF2D_n
- Hauptblock KF_n: flache, ungedrehte Seitenansicht mit Beschriftung und Hoehenmass; nur er wird exportiert - Draufsicht KF_2D als getrennter Hilfsblock KF2D_n (projizierte Laenge, frei verschiebbar, per KF_EDIT regenerierbar), Verknuepfung ueber XDATA-Schluessel - L_KF_mm = waagerechte Laenge, Sivas-Zeile ohne Laenge, Export nur KF_<Ziffern> - ensure-block-loaded: Block ohne ILS-Datei (KF_2D) nicht mehr als fehlend melden - Layer kettenfoerderer_beschriftung, Dispatcher-Zweig KF2D_*, Sprachdateien und Unit-Tests angepasst Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
+65
-60
@@ -2892,66 +2892,71 @@
|
||||
(tu-eq "kf-frei/Start-mitten" 5
|
||||
(kf-freie-nummer 3 '(lambda (n) (member n '(3 4)))))
|
||||
|
||||
;; --- kf-drehung-gesamt: Drehwinkel fuer KF_EDIT ---
|
||||
;; Regression: der Drehwinkel wird beim Bau in die Geometrie eingerechnet,
|
||||
;; die Blockreferenz selbst hat IMMER Drehung 0 (ssg-block-wrap-welt).
|
||||
;; KF_EDIT las nur Gruppencode 50 und baute eine mit 90 Grad gebaute
|
||||
;; Kette ungedreht neu. Der gebaute Winkel steht jetzt als XDATA.
|
||||
(tu-eqf "kf-drehung/nur-xdata" 90.0 (kf-drehung-gesamt 90.0 0.0))
|
||||
;; Referenz nachtraeglich von Hand um 90 Grad gedreht (Gruppencode 50 in
|
||||
;; Bogenmass) -> beides addiert sich
|
||||
(tu-eqf "kf-drehung/xdata-plus-referenz" 180.0
|
||||
(kf-drehung-gesamt 90.0 (/ pi 2.0)))
|
||||
;; Altbestand ohne XDATA: nur die Referenzdrehung (bisheriges Verhalten)
|
||||
(tu-eqf "kf-drehung/ohne-xdata" 45.0 (kf-drehung-gesamt nil (/ pi 4.0)))
|
||||
;; nichts bekannt -> 0, kein Absturz und kein nil
|
||||
(tu-eqf "kf-drehung/nichts" 0.0 (kf-drehung-gesamt nil nil))
|
||||
(tu-true "kf-drehung/ist-zahl" (numberp (kf-drehung-gesamt nil nil)))
|
||||
;; Summe ueber 180 Grad wird auf -180..180 gefaltet (270 = -90)
|
||||
(tu-eqf "kf-drehung/normalisiert" -90.0
|
||||
(kf-drehung-gesamt 180.0 (/ pi 2.0)))
|
||||
;; ganze Zahl aus der XDATA (nicht real) darf nicht abstuerzen
|
||||
(tu-eqf "kf-drehung/ganzzahl" 30.0 (kf-drehung-gesamt 30 0.0))
|
||||
;; --- kf-label-text: Beschriftung von Haupt- UND Hilfsblock ---
|
||||
;; Eine Zeile wie bei VF_/GF_: Nummer, Winkel mit Gradzeichen, Hoehe,
|
||||
;; projizierte Laenge (ganze mm)
|
||||
(tu-eq "kf-label/normal"
|
||||
(strcat "KF_1 26" (chr 176) " H=1500mm L_horizontal=4951mm")
|
||||
(kf-label-text 1 "26" 1500.0 4951.4))
|
||||
;; rundet kaufmaennisch auf ganze mm, nimmt auch Ganzzahlen
|
||||
(tu-eq "kf-label/rundet-auf"
|
||||
(strcat "KF_12 30" (chr 176) " H=2000mm L_horizontal=3001mm")
|
||||
(kf-label-text 12 "30" 2000 3000.5))
|
||||
|
||||
;; --- kf-neigung-aus-punkten: Kern der 3D-Aufrichtung ---
|
||||
;; Liefert (Schraeglaenge Neigungswinkel) aus Ketten-Start und -Ende.
|
||||
;; Die Kette wird AUFGERICHTET eingebaut, die Hoehe laeuft also in Z.
|
||||
;; 3-4-5-Dreieck: 3000 waagerecht, 4000 hoch -> 5000 schraeg
|
||||
(tu-eqf "kf-neigung/3-4-5-laenge" 5000.0
|
||||
(car (kf-neigung-aus-punkten '(0.0 0.0 0.0) '(3000.0 0.0 4000.0) 0.0)))
|
||||
;; 45 Grad: gleiche Betraege waagerecht und hoch
|
||||
(tu-eqf "kf-neigung/45-grad" 45.0
|
||||
(cadr (kf-neigung-aus-punkten '(0.0 0.0 0.0) '(1000.0 0.0 1000.0) 0.0)))
|
||||
;; waagerecht -> Winkel 0, Laenge = Horizontalabstand
|
||||
(tu-eqf "kf-neigung/waagerecht" '(2000.0 0.0)
|
||||
(kf-neigung-aus-punkten '(0.0 0.0 0.0) '(2000.0 0.0 0.0) 0.0))
|
||||
;; Der Horizontalanteil wird auf die KETTENRICHTUNG projiziert, nicht
|
||||
;; auf die Welt-X-Achse: bei 90 Grad Basisdrehung laeuft die Kette in Y.
|
||||
;; Ohne Projektion kaeme hier 0 heraus und der Winkel waere 90 statt 45.
|
||||
(tu-eqf "kf-neigung/gedreht-90" '(1414.213562 45.0)
|
||||
(kf-neigung-aus-punkten '(0.0 0.0 0.0) '(0.0 1000.0 1000.0) 90.0))
|
||||
;; fallende Kette -> negativer Winkel
|
||||
(tu-eqf "kf-neigung/fallend" -45.0
|
||||
(cadr (kf-neigung-aus-punkten '(0.0 0.0 1000.0) '(1000.0 0.0 0.0) 0.0)))
|
||||
;; Start = Ende -> nil statt Division durch 0
|
||||
(tu-nil "kf-neigung/nulllaenge"
|
||||
(kf-neigung-aus-punkten '(5.0 5.0 5.0) '(5.0 5.0 5.0) 0.0))
|
||||
;; --- kf-winkel-text: Neigung als nackte Ganzzahl (Attribut WINKEL) ---
|
||||
(tu-eq "kf-winkel-text/real" "26" (kf-winkel-text '(("winkel" . 26.0))))
|
||||
(tu-eq "kf-winkel-text/string" "30" (kf-winkel-text '(("winkel" . "30"))))
|
||||
(tu-eq "kf-winkel-text/fehlt" "0" (kf-winkel-text '(("name" . "x"))))
|
||||
|
||||
;; --- kf-matrix-aufrecht: Y_lokal wird zu Z_welt ---
|
||||
;; Das ist die Kernaussage der Aufrichtung. Geprueft wird sie an den
|
||||
;; Bildern der Einheitsvektoren, nicht an den Matrixeintraegen - so
|
||||
;; bleibt der Test lesbar und unabhaengig von der Schreibweise.
|
||||
(tu-eqf "kf-matrix/Y-lokal-wird-Z-welt" '(0.0 0.0 1.0)
|
||||
(mat3-mul-vec3 (kf-matrix-aufrecht 0.0 0.0) '(0.0 1.0 0.0)))
|
||||
;; Die Fahrtrichtung (X) bleibt bei Basisdrehung 0 die Welt-X-Achse
|
||||
(tu-eqf "kf-matrix/X-bleibt-X" '(1.0 0.0 0.0)
|
||||
(mat3-mul-vec3 (kf-matrix-aufrecht 0.0 0.0) '(1.0 0.0 0.0)))
|
||||
;; Basisdrehung 90 Grad dreht die Fahrtrichtung in die Welt-Y-Achse,
|
||||
;; die Hoehe bleibt dabei in Z
|
||||
(tu-eqf "kf-matrix/basis-90-dreht-X-nach-Y" '(0.0 1.0 0.0)
|
||||
(mat3-mul-vec3 (kf-matrix-aufrecht 90.0 0.0) '(1.0 0.0 0.0)))
|
||||
(tu-eqf "kf-matrix/basis-90-haelt-Z" '(0.0 0.0 1.0)
|
||||
(mat3-mul-vec3 (kf-matrix-aufrecht 90.0 0.0) '(0.0 1.0 0.0)))
|
||||
;; --- kf-versatzpunkt: Hilfsblock beim ersten Einfuegen unter dem Hauptblock ---
|
||||
(tu-eqf "kf-versatzpunkt/minus-1000" '(100.0 -980.0 5.0)
|
||||
(kf-versatzpunkt '(100.0 20.0 5.0) -1000))
|
||||
;; 2D-Punkt ohne Z -> Z = 0, kein Absturz
|
||||
(tu-eqf "kf-versatzpunkt/ohne-z" '(0.0 -1000.0 0.0)
|
||||
(kf-versatzpunkt '(0.0 0.0) -1000.0))
|
||||
|
||||
;; --- kf-hilfsblock-versatz: Wert steht in der JSON, Vorgabe -1000 ---
|
||||
(tu-eqf "kf-versatz/aus-daten" -500.0
|
||||
(kf-hilfsblock-versatz '(("ansicht_2d" ("block" . "KF_2D") ("versatz_y" . -500)))))
|
||||
(tu-eqf "kf-versatz/ohne-feld" -1000.0
|
||||
(kf-hilfsblock-versatz '(("ansicht_2d" ("block" . "KF_2D")))))
|
||||
(tu-eqf "kf-versatz/ohne-ansicht" -1000.0
|
||||
(kf-hilfsblock-versatz '(("id" . "x"))))
|
||||
;; Zahl, nicht T (and/or-Typfalle)
|
||||
(tu-true "kf-versatz/ist-zahl"
|
||||
(numberp (kf-hilfsblock-versatz '(("id" . "x")))))
|
||||
|
||||
;; --- kf-key-aus-xdata: Schluessel Haupt- <-> Hilfsblock ---
|
||||
(tu-eq "kf-key/aus-xdata" "20261030120000"
|
||||
(kf-key-aus-xdata
|
||||
'((-3 ("SSG_KF_EDIT" (1000 . "kf-edit") (1000 . "20261030120000"))))))
|
||||
;; Altbestand: nur der Marker, kein Schluessel -> nil (-> neuer Schluessel)
|
||||
(tu-nil "kf-key/nur-marker"
|
||||
(kf-key-aus-xdata '((-3 ("SSG_KF_EDIT" (1000 . "kf-edit"))))))
|
||||
(tu-nil "kf-key/keine-xdata" (kf-key-aus-xdata '((0 . "INSERT"))))
|
||||
(tu-nil "kf-key/nil" (kf-key-aus-xdata nil))
|
||||
|
||||
;; --- kf-waagerecht-laenge: Wert des Attributs L_KF_mm ---
|
||||
;; Waagerechte Laenge des GANZEN Foerderers (der Draufsicht KF_2D), also
|
||||
;; ohne die Steigung - nicht die Laenge des schraegen Mittelstuecks.
|
||||
;; 3-4-5: 3000 waagerecht, 4000 hoch -> waagerecht bleibt 3000 (nicht 5000)
|
||||
(tu-eqf "kf-waagerecht/ohne-steigung" 3000.0
|
||||
(kf-waagerecht-laenge '(0.0 0.0 0.0) '(3000.0 0.0 4000.0) 0.0))
|
||||
;; nur Hoehe, keine waagerechte Strecke -> 0
|
||||
(tu-eqf "kf-waagerecht/nur-hoehe" 0.0
|
||||
(kf-waagerecht-laenge '(0.0 0.0 0.0) '(0.0 0.0 1500.0) 0.0))
|
||||
;; auf die KETTENRICHTUNG projiziert: bei 90 Grad Basisdrehung laeuft die
|
||||
;; Kette in Y, die Welt-X-Differenz waere 0
|
||||
(tu-eqf "kf-waagerecht/gedreht-90" 1000.0
|
||||
(kf-waagerecht-laenge '(0.0 0.0 0.0) '(0.0 1000.0 1000.0) 90.0))
|
||||
(tu-eqf "kf-waagerecht/gedreht-45" 1000.0
|
||||
(kf-waagerecht-laenge '(0.0 0.0 0.0) '(707.10678 707.10678 500.0) 45.0))
|
||||
;; fallende Kette / Ende "hinter" dem Start: Betrag, nie negativ
|
||||
(tu-eqf "kf-waagerecht/immer-positiv" 2000.0
|
||||
(kf-waagerecht-laenge '(2000.0 0.0 0.0) '(0.0 0.0 800.0) 0.0))
|
||||
;; muss eine Zahl sein (Typfalle: nie T/nil)
|
||||
(tu-true "kf-waagerecht/ist-zahl"
|
||||
(numberp (kf-waagerecht-laenge '(0.0 0.0 0.0) '(10.0 0.0 0.0) 0.0)))
|
||||
|
||||
;; --- Standard-Variante: steht in den DATEN, nicht im Code ---
|
||||
(tu-true "kf-variante-standard-p/markiert"
|
||||
@@ -2970,8 +2975,8 @@
|
||||
(kf-standard-index '((("winkel" . 26)) (("winkel" . 30)))))
|
||||
|
||||
;; --- kf-punkt-differenzen: zweite Hoehen-Eingabeart (2 Punkte) ---
|
||||
;; Gemessen wird die Differenz in Z - die Baugruppe steht aufgerichtet im
|
||||
;; Modell. Zurueckgegeben wird (dz dy): die HOEHE zuerst, dY nur zur
|
||||
;; Gemessen wird die Differenz in Z (Hoehe der gepickten Punkte).
|
||||
;; Zurueckgegeben wird (dz dy): die HOEHE zuerst, dY nur zur
|
||||
;; Kontrolle (wer in einer Draufsicht pickt, sieht dz = 0).
|
||||
(tu-eqf "kf-punkt-diff/dz" '(1500.0 0.0)
|
||||
(kf-punkt-differenzen '(0.0 0.0 0.0) '(2000.0 0.0 1500.0)))
|
||||
|
||||
Reference in New Issue
Block a user