From 923af4335ab9524de558bee36fc300588c75960d Mon Sep 17 00:00:00 2001 From: Samer Ayadi Date: Thu, 17 Sep 2026 15:01:11 +0200 Subject: [PATCH] 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. --- Lisp/export.lsp | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/Lisp/export.lsp b/Lisp/export.lsp index fa2e7d6..0cae115 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -325,15 +325,33 @@ ;; Vorrang: sie werden vorne angehaengt, csv:k-kos liest per assoc den ersten). ;; Rueckgabe: Assoc-Liste (("K1" . "") ("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