Fix K1/K2-Weltposition fuer gekippte Sub-INSERTs im CSV-Export

csv:get-k-kos-strings rechnete die Gruppe-10-Position eines K1-K4/
KS_EIN/KS_AUS-Sub-INSERTs ueber eine reine Z-Drehung des Elternblocks
um, ohne die EIGENE Extrusion (Gruppe 210) des Sub-INSERTs zu
beruecksichtigen. Bei schraeg sitzenden Anschlusspunkten wie KS_AUS
von SC_Entladung (BTMT-Entladung) landete K2 dadurch weit ausserhalb
der Bounding Box statt am tatsaechlichen Punkt - sichtbar als K2
unterhalb statt oberhalb des Elements in der Materialfluss-Draufsicht
(sps_skel HundM05_bbs.svg). Behoben ueber mat3-ocs-matrix/mat3-mul-
vec3 (Arbitrary Axis Algorithm, bereits in ssg_core.lsp vorhanden),
analog zum frueheren Fix in ssg-collect-nested-inserts-rel. Zusaetzlich
einen fuehrenden entnext entfernt, der aus demselben Grund ein K1/
KS_EIN als erstes Entity der Blockdefinition uebersprungen haette.
This commit is contained in:
Samer Ayadi
2026-09-17 15:01:11 +02:00
parent 0e4ea7e148
commit 923af4335a
+25 -3
View File
@@ -325,15 +325,33 @@
;; Vorrang: sie werden vorne angehaengt, csv:k-kos liest per assoc den ersten).
;; Rueckgabe: Assoc-Liste (("K1" . "<pos-string>") ("K2" . ...) ...), nur
;; fuer tatsaechlich vorhandene K-Bloecke (nicht jedes Element hat alle 4).
;;
;; Gruppe-10 eines Sub-INSERTs ist OCS-lokal zu SEINER EIGENEN Extrusion
;; (Gruppe 210), nicht zwingend zur flachen XY-Ebene der Elterndefinition -
;; z.B. KS_AUS von SC_Entladung (BTMT-Entladung), das schraeg in 3D sitzt.
;; mat3-ocs-matrix/mat3-mul-vec3 (ssg_core.lsp, Arbitrary Axis Algorithm)
;; wandeln das erst in echte lokale Koordinaten um, bevor csv:local-to-world
;; mit der Eltern-Rotation weiterrechnet - derselbe Fix wie bereits in
;; ssg-collect-nested-inserts-rel (dort ausfuehrlich begruendet). Ohne diese
;; Umrechnung landete K2 tief unterhalb statt oberhalb des Elements (realer
;; Bug, sichtbar in der Materialfluss-Draufsicht sps_skel/HundM05_bbs.svg).
;; Fuer Extrusion=(0 0 1) (Normalfall, z.B. KS_EIN) reduziert sich das exakt
;; auf die alte reine Uebernahme - unveraendertes Verhalten dort.
(defun csv:get-k-kos-strings (ename pt rot-rad / ed bname blk-tbl sub-ent sub-ed
sub-bname sub-pt world-pt target is-real result)
sub-bname sub-pt sub-extrusion sub-pt-real world-pt
target is-real result)
(setq ed (entget ename))
(setq bname (cdr (assoc 2 ed)))
(setq blk-tbl (tblsearch "BLOCK" bname))
(setq result nil)
(if blk-tbl
(progn
(setq sub-ent (entnext (cdr (assoc -2 blk-tbl))))
;; (assoc -2) ist bereits das ERSTE Entity der Blockdefinition, NICHT
;; der BLOCK-Header - direkt hier starten, kein entnext davor (das
;; uebersprang sonst ein K1/KS_EIN, das zufaellig als erstes Entity in
;; der Blockdefinition steht - derselbe Bug wie frueher in
;; ssg-collect-nested-inserts-rel, siehe dortiger Kommentar).
(setq sub-ent (cdr (assoc -2 blk-tbl)))
(while sub-ent
(setq sub-ed (entget sub-ent))
(if (= (cdr (assoc 0 sub-ed)) "INSERT")
@@ -352,7 +370,11 @@
(if (and target (or is-real (not (assoc target result))))
(progn
(setq sub-pt (cdr (assoc 10 sub-ed)))
(setq world-pt (csv:local-to-world pt rot-rad sub-pt))
(if (null (caddr sub-pt))
(setq sub-pt (list (car sub-pt) (cadr sub-pt) 0.0)))
(setq sub-extrusion (cond ((cdr (assoc 210 sub-ed))) ('(0.0 0.0 1.0))))
(setq sub-pt-real (mat3-mul-vec3 (mat3-ocs-matrix sub-extrusion) sub-pt))
(setq world-pt (csv:local-to-world pt rot-rad sub-pt-real))
(setq result (cons
(cons target
(csv:trans-encode