[FIX] Weltposition verpackter Separator_SP-Symbole bei gekippten Ketten
ssg-collect-nested-inserts-rel/csv:sep-proxies-erzeugen nahmen bislang eine reine Z-Drehung ohne OCS-/Extrusionsrichtung an. Fuer die um den Gefaelle-/ Neigungswinkel gekippte Staustrecke/Separator-Kette (Gefaellestrecke.lsp, vf_standard.lsp) ist das falsch: die eingebettete Separator_SP-Weltposition blieb dadurch unabhaengig von der gewaehlten Fahrtrichtung eingefroren. Fix generalisiert die Rotationskomposition auf volle 3x3-Matrizen (Arbitrary Axis Algorithm fuer die Extrusion, neue mat3-*-Helfer in ssg_core.lsp statt vf_core.lsp, da ssg_core immer vor jedem Feature-Modul geladen ist). Fuer flache Elemente (Extrusion (0 0 1)) reduziert sich das exakt auf die alte reine Z-Drehung - kein Verhaltensunterschied dort. Verifiziert per Python/ezdxf-Nachbau des neuen Algorithmus gegen die drei real gebauten Testzeichnungen (data/gf.dxf, data/gf_north.dxf, data/gf_south.dxf): liefert jetzt fuer alle drei Fahrtrichtungen exakt die unabhaengig berechnete Grundwahrheit statt eines eingefrorenen Werts. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+52
-22
@@ -630,9 +630,9 @@
|
||||
;; Kopie gesetzt werden kann (csv:sep-proxies-zuordnung-setzen). Die
|
||||
;; proxy-enames dienen ausserdem csv:sep-proxies-loeschen nach dem Export.
|
||||
(defun csv:sep-proxies-erzeugen ( / ms ss-all i ename ed bname nested pt rotation
|
||||
psx psy psz c si rec nested-ent nested-bname
|
||||
local-pt nested-rot lx ly lz world-pt
|
||||
block-obj proxy-liste)
|
||||
extrusion0 R0 psx psy psz rec nested-ent nested-bname
|
||||
local-pt R-nested R-final scaled-pt rot-pt world-pt
|
||||
T4 block-obj xform-fehler proxy-liste)
|
||||
(setq ss-all (ssget "X" (list (cons 0 "INSERT"))))
|
||||
(if ss-all
|
||||
(progn
|
||||
@@ -649,25 +649,43 @@
|
||||
(if nested
|
||||
(progn
|
||||
(setq pt (cdr (assoc 10 ed)))
|
||||
(if (null (caddr pt)) (setq pt (list (car pt) (cadr pt) 0.0)))
|
||||
(setq rotation (cond ((cdr (assoc 50 ed))) (0.0)))
|
||||
;; Extrusion des Wrapper-INSERTs selbst beruecksichtigen statt
|
||||
;; reine Z-Drehung anzunehmen - GF_n/VF_n stehen zwar bisher immer
|
||||
;; flach (Extrusion (0 0 1)), aber mat3-from-normal-rotation
|
||||
;; reduziert sich dafuer ohnehin exakt auf Rz(rotation), kostet
|
||||
;; also nichts und macht den Code robust falls sich das aendert.
|
||||
(setq extrusion0 (cond ((cdr (assoc 210 ed))) ('(0.0 0.0 1.0))))
|
||||
(setq R0 (mat3-from-normal-rotation extrusion0 rotation))
|
||||
(setq psx (cond ((cdr (assoc 41 ed))) (1.0)))
|
||||
(setq psy (cond ((cdr (assoc 42 ed))) (1.0)))
|
||||
(setq psz (cond ((cdr (assoc 43 ed))) (1.0)))
|
||||
(setq c (cos rotation) si (sin rotation))
|
||||
(foreach rec nested
|
||||
(setq nested-ent (nth 0 rec))
|
||||
(setq local-pt (nth 1 rec))
|
||||
(setq nested-rot (nth 2 rec))
|
||||
(setq R-nested (nth 2 rec))
|
||||
(setq nested-bname (cdr (assoc 2 (entget nested-ent))))
|
||||
(setq lx (* psx (car local-pt))
|
||||
ly (* psy (cadr local-pt))
|
||||
lz (* psz (caddr local-pt)))
|
||||
(setq world-pt
|
||||
(list (+ (car pt) (- (* lx c) (* ly si)))
|
||||
(+ (cadr pt) (+ (* lx si) (* ly c)))
|
||||
(+ (cond ((caddr pt)) (0.0)) lz)))
|
||||
;; Rotation fuer vla-InsertBlock in RADIANT (ActiveX-Konvention,
|
||||
;; anders als der Grad-Winkel von "command _.INSERT").
|
||||
(setq scaled-pt (list (* psx (car local-pt))
|
||||
(* psy (cadr local-pt))
|
||||
(* psz (caddr local-pt))))
|
||||
(setq rot-pt (mat3-mul-vec3 R0 scaled-pt))
|
||||
(setq world-pt (list (+ (car pt) (car rot-pt))
|
||||
(+ (cadr pt) (cadr rot-pt))
|
||||
(+ (caddr pt) (caddr rot-pt))))
|
||||
(setq R-final (mat3-mul-mat3 R0 R-nested))
|
||||
;; Volle 3D-Orientierung statt bisher nur eines Z-Drehwinkels:
|
||||
;; ein einzelner Skalar-Drehwinkel kann eine Kippung ausserhalb
|
||||
;; der XY-Ebene (Gefaellestrecke-/VF-Neigung) gar nicht
|
||||
;; darstellen. Deshalb - wie insert-block-ks-to-ks (vf_core.lsp)
|
||||
;; - am Ursprung mit Rotation=0 einfuegen und die komplette
|
||||
;; Lage (Drehung UND Verschiebung) in EINER vla-TransformBy
|
||||
;; anwenden, statt Rotation als vla-InsertBlock-Parameter.
|
||||
(setq T4 (vlax-tmatrix
|
||||
(list (list (car (car R-final)) (cadr (car R-final)) (caddr (car R-final)) (car world-pt))
|
||||
(list (car (cadr R-final)) (cadr (cadr R-final)) (caddr (cadr R-final)) (cadr world-pt))
|
||||
(list (car (caddr R-final)) (cadr (caddr R-final)) (caddr (caddr R-final)) (caddr world-pt))
|
||||
(list 0.0 0.0 0.0 1.0))))
|
||||
;; Gekapselt, weil hier - anders als beim frueheren festen
|
||||
;; 1.0/1.0/1.0 - die tatsaechlichen Skalierungsfaktoren
|
||||
;; durchgereicht werden: ein einzelner Sonderfall (entartete
|
||||
@@ -676,17 +694,29 @@
|
||||
;; eine Kopie ausfallen lassen - mit Meldung, welcher Block.
|
||||
(setq block-obj
|
||||
(vl-catch-all-apply 'vla-InsertBlock
|
||||
(list ms (vlax-3D-point world-pt) nested-bname
|
||||
(list ms (vlax-3D-point '(0.0 0.0 0.0)) nested-bname
|
||||
(csv:skalierung-oder-eins (* psx (nth 3 rec)))
|
||||
(csv:skalierung-oder-eins (* psy (nth 4 rec)))
|
||||
(csv:skalierung-oder-eins (* psz (nth 5 rec)))
|
||||
(+ rotation nested-rot))))
|
||||
(if (vl-catch-all-error-p block-obj)
|
||||
(princ (ssg-textf "exp-sep-proxy-fehler"
|
||||
(list nested-bname bname
|
||||
(vl-catch-all-error-message block-obj))))
|
||||
(setq proxy-liste
|
||||
(cons (cons (vlax-vla-object->ename block-obj) ename) proxy-liste))
|
||||
0.0)))
|
||||
(cond
|
||||
((vl-catch-all-error-p block-obj)
|
||||
(princ (ssg-textf "exp-sep-proxy-fehler"
|
||||
(list nested-bname bname
|
||||
(vl-catch-all-error-message block-obj)))))
|
||||
(t
|
||||
(setq xform-fehler (vl-catch-all-apply 'vla-TransformBy (list block-obj T4)))
|
||||
(if (vl-catch-all-error-p xform-fehler)
|
||||
(progn
|
||||
(princ (ssg-textf "exp-sep-proxy-fehler"
|
||||
(list nested-bname bname
|
||||
(vl-catch-all-error-message xform-fehler))))
|
||||
(vl-catch-all-apply 'vla-Delete (list block-obj))
|
||||
)
|
||||
(setq proxy-liste
|
||||
(cons (cons (vlax-vla-object->ename block-obj) ename) proxy-liste))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user