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:
2026-10-23 15:43:36 +02:00
parent 833a4b60a6
commit f8b8a4175b
2 changed files with 69 additions and 4 deletions
+48 -4
View File
@@ -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)))))))))))))))