fix: KF_EDIT baute gedrehte Foerderer ungedreht neu
Der Drehwinkel wird beim Bau in die Geometrie eingerechnet, die Blockreferenz selbst hat immer Drehung 0 (ssg-block-wrap-welt). KF_EDIT las die Drehung nur aus Gruppencode 50 und baute einen mit z.B. 90 Grad gebauten Foerderer beim Bearbeiten daher ungedreht neu. Der gebaute Winkel steht jetzt als XDATA (SSG_KF_EDIT) am Block. KF_EDIT addiert eine spaeter von Hand vorgenommene Drehung der Referenz (Gruppencode 50); Altbestand ohne XDATA verhaelt sich wie bisher. - kf-block-erstellen: neuer Parameter drehung, beide Aufrufer angepasst - reiner Kern kf-drehung-gesamt (auf -180..180 normalisiert) mit Unit-Tests Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -526,6 +526,45 @@
|
||||
(list bname (rtos laenge 2 0) (rtos winkel 2 1))))
|
||||
laenge)))))))))
|
||||
|
||||
;; ============================================================
|
||||
;; DREHWINKEL DES BLOCKS (XDATA)
|
||||
;; ============================================================
|
||||
;; Der Drehwinkel der Baugruppe wird beim Bau in die GEOMETRIE eingerechnet
|
||||
;; (kf-matrix-aufrecht), nicht ueber die Drehung der Blockreferenz:
|
||||
;; ssg-block-wrap-welt fuegt den fertigen Block immer mit Drehung 0 ein. Die
|
||||
;; Referenz traegt damit nirgends mehr, wie die Kette gedreht wurde - KF_EDIT
|
||||
;; wuerde sie beim Neuaufbau ungedreht neu bauen. Darum steht der Winkel als
|
||||
;; XDATA am Block (Projektregel: Editierdaten gehoeren in XDATA, nicht in
|
||||
;; .dbg). Eine spaetere Drehung der Referenz von Hand kommt ueber
|
||||
;; Gruppencode 50 hinzu und wird addiert.
|
||||
(setq *kf-xdata-app* "SSG_KF_EDIT")
|
||||
|
||||
;; Gesamtdrehung = gebauter Winkel (XDATA, Grad) + Drehung der Referenz
|
||||
;; (Gruppencode 50, Bogenmass), auf -180..180 Grad normalisiert. Reiner
|
||||
;; Rechenkern; fehlende Werte zaehlen als 0 (Altbestand ohne XDATA).
|
||||
(defun kf-drehung-gesamt (xdata-grad dxf50-rad / g r)
|
||||
(setq g (cond (xdata-grad (float xdata-grad)) (0.0)))
|
||||
(setq r (cond (dxf50-rad (float dxf50-rad)) (0.0)))
|
||||
(ks-winkel-normalisieren (+ g (/ (* 180.0 r) pi))))
|
||||
|
||||
(defun kf-xdata-schreiben (ent drehung-grad / eintrag)
|
||||
(regapp *kf-xdata-app*)
|
||||
(setq eintrag (list *kf-xdata-app*
|
||||
(cons 1000 "kf-edit")
|
||||
(cons 1040 (float drehung-grad))))
|
||||
(entmod (append (entget ent) (list (list -3 eintrag))))
|
||||
ent)
|
||||
|
||||
;; Gebauter Drehwinkel (Grad) aus der XDATA, nil wenn keine vorhanden ist.
|
||||
(defun kf-xdata-lesen (ent / xd daten paar)
|
||||
(setq xd (entget ent (list *kf-xdata-app*)))
|
||||
(setq daten (cdr (assoc -3 xd)))
|
||||
(if daten
|
||||
(progn
|
||||
(setq paar (assoc 1040 (cdr (car daten))))
|
||||
(if paar (cdr paar) nil))
|
||||
nil))
|
||||
|
||||
;; ============================================================
|
||||
;; BLOCK ABSCHLIESSEN
|
||||
;; ============================================================
|
||||
@@ -534,7 +573,7 @@
|
||||
;; Vorbild: gf-block-erstellen (Gefaellestrecke.lsp).
|
||||
(defun kf-block-erstellen (variante geo hoehe laenge verbindung
|
||||
startpunkt last-ent kf-nummer
|
||||
farbe antriebsmotor movimot steuerung /
|
||||
farbe antriebsmotor movimot steuerung drehung /
|
||||
kf-bname kf-ss ent kf-insert winkel-str)
|
||||
(setq kf-bname (strcat "KF_" (itoa kf-nummer)))
|
||||
;; Winkel als nackte Ganzzahl ("26"/"30") - bewusst ueber itoa/fix statt
|
||||
@@ -567,6 +606,8 @@
|
||||
;; abgeschaltet, siehe ssg-block-wrap-welt)
|
||||
(ssg-block-wrap-welt kf-bname startpunkt kf-ss)
|
||||
(setq kf-insert (entlast))
|
||||
;; Gebauten Drehwinkel festhalten, damit KF_EDIT ihn wiederfindet
|
||||
(kf-xdata-schreiben kf-insert drehung)
|
||||
(ssg-layer-setzen kf-insert (cond ((ssg-json-get variante "layer"))
|
||||
((ssg-json-get (kf-daten) "layer"))
|
||||
("kettenfoerderer")))
|
||||
@@ -965,7 +1006,7 @@
|
||||
(kf-ansicht-2d-bauen daten startpunkt endpunkt drehung)
|
||||
(setq ent (kf-block-erstellen variante geo hoehe laenge verbindung
|
||||
startpunkt last-ent kf-nummer farbe antriebsmotor movimot
|
||||
steuerung))
|
||||
steuerung drehung))
|
||||
(ssg-end)
|
||||
(princ (ssg-textf "kf-fertig"
|
||||
(list (strcat "KF_" (itoa kf-nummer))
|
||||
@@ -1058,7 +1099,10 @@
|
||||
(progn
|
||||
(setq attribs (ssg-attrib-read ent))
|
||||
(setq startpunkt (cdr (assoc 10 ed)))
|
||||
(setq drehung (/ (* 180.0 (cond ((cdr (assoc 50 ed))) (0.0))) pi))
|
||||
;; Der gebaute Winkel steckt in der XDATA, eine nachtraegliche
|
||||
;; Drehung der Referenz in Gruppencode 50 - beides zaehlt.
|
||||
(setq drehung (kf-drehung-gesamt (kf-xdata-lesen ent)
|
||||
(cdr (assoc 50 ed))))
|
||||
(kf-dlg-aus-attributen daten attribs)
|
||||
(setq lmin (kf-zahl (ssg-json-get (ssg-json-get daten "laenge") "min"))
|
||||
lmax (kf-zahl (ssg-json-get (ssg-json-get daten "laenge") "max")))
|
||||
@@ -1096,7 +1140,7 @@
|
||||
(kf-ansicht-2d-bauen daten startpunkt endpunkt drehung)
|
||||
(kf-block-erstellen variante geo hoehe laenge verbindung
|
||||
startpunkt last-ent kf-nummer farbe antriebsmotor
|
||||
movimot steuerung)
|
||||
movimot steuerung drehung)
|
||||
(ssg-end)
|
||||
(princ (ssg-textf "kf-edit-fertig"
|
||||
(list bname (strcat "KF_" (itoa kf-nummer)))))))))))))))
|
||||
|
||||
@@ -2667,6 +2667,27 @@
|
||||
(tu-nil "kf-antriebsart/kein-komma"
|
||||
(vl-string-search "," (kf-antriebsart '(("titel" . "x")))))
|
||||
|
||||
;; --- 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-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.
|
||||
|
||||
Reference in New Issue
Block a user