die 3 Modus für Gefällestrecke wurden angepasst.Gemeinsamkeit aller Modi: Innere Elemente (Separator, Gefällebogen) werden immer per vollständiger KS_EIN→KS_AUS-3D-Rahmen-Kettung verkettet (insert-block-ks-to-ks) — nur bei AS/ES-Element (wegen des seitlichen Drehteller-Versatzes) wird die Position in X/Y und Z getrennt behandelt.Unterschied Modus 1/2 vs. Modus 3: In Modus 1/2 gibt es keinen vorgegebenen Endpunkt — die Endhöhe ist ein Ergebnis. In Modus 3 sind Start und Endpunkt (mit Höhen) vorgegeben, und die gesamte Geometrie (Winkel, Bogenauswahl, Segmentlängen) wird so berechnet, dass beide Punkte exakt erreicht werden. Test-Gefällestrecke wurde gebaut
This commit is contained in:
+149
-5
@@ -541,6 +541,98 @@
|
||||
" Z=" (rtos (caddr P-out) 2 2)))
|
||||
(list P-out xu-out yu-out zu-out))
|
||||
|
||||
;; Fuegt Block ein: Orientierung wie insert-block-ks-to-ks (KS_EIN-Achsen werden
|
||||
;; am Ziel-Rahmen ausgerichtet). Die POSITION wird jedoch fuer XY und Z aus
|
||||
;; ZWEI VERSCHIEDENEN lokalen Referenzpunkten abgeleitet:
|
||||
;; xy-ref : welcher lokale Punkt in X/Y exakt auf target-frame's P treffen soll
|
||||
;; z-ref : welcher lokale Punkt in Z exakt auf z-ziel treffen soll
|
||||
;; Werte fuer xy-ref/z-ref: "KS_EIN", "KS_AUS" oder nil (=Block-Ursprung 0,0,0).
|
||||
;; Hintergrund: Bei seitlich angebundenen Elementen (z.B. AS_Element/ES_Element)
|
||||
;; liegt KS_EIN bzw. KS_AUS seitlich versetzt vom Block-Ursprung (Drehteller-
|
||||
;; Anschluss). Die Mittelachse der Foerderstrecke soll durch den Block-Ursprung
|
||||
;; laufen (xy-ref), waehrend die Anschlusshoehe weiterhin exakt am jeweiligen
|
||||
;; KS-Punkt (z-ref) gemessen werden muss (konsistent mit Modus 1+2 und der
|
||||
;; Gefaellewinkel-Korrektur in gf-messe-dz-block).
|
||||
;; target-frame : (P xt yt zt) - Ziel-Rahmen (Punkt auf der Mittelachse + Fahrtrichtung)
|
||||
;; z-ziel : gewuenschte Welt-Z-Koordinate des z-ref-Punktes
|
||||
;; Rueckgabe : (P xu yu zu) - KS_AUS-Rahmen des eingefuegten Blocks
|
||||
(defun insert-block-mixed-to-ks (blockname target-frame z-ziel xy-ref z-ref /
|
||||
block-obj ks-data ks-ein-raw ks-aus-raw
|
||||
f-ein f-aus P-t xt yt zt
|
||||
xe ye ze P-ein P-aus xu-aus yu-aus zu-aus
|
||||
R P-xyref P-zref R-xyref R-zref tx ty tz T4
|
||||
R-Paus P-out xu-out yu-out zu-out)
|
||||
(ensure-block-loaded blockname)
|
||||
(if (not (tblsearch "BLOCK" blockname))
|
||||
(progn
|
||||
(princ (strcat "\n FEHLER: Block '" blockname "' nicht in Bibliothek"))
|
||||
(exit)))
|
||||
;; Ziel-Rahmen auspacken
|
||||
(setq P-t (car target-frame)
|
||||
xt (cadr target-frame)
|
||||
yt (caddr target-frame)
|
||||
zt (cadddr target-frame))
|
||||
;; Block am Ursprung einfuegen (Rotation=0, Massstab=1)
|
||||
(setq block-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
;; KS_EIN und KS_AUS extrahieren (nutzt Cache nach erstem Aufruf)
|
||||
(setq ks-data (extract-ks-from-block block-obj))
|
||||
(setq ks-ein-raw (cadr (assoc "KS_EIN" ks-data)))
|
||||
(setq ks-aus-raw (cadr (assoc "KS_AUS" ks-data)))
|
||||
(if (not (and ks-ein-raw ks-aus-raw))
|
||||
(progn
|
||||
(princ (strcat "\n FEHLER: KS_EIN/KS_AUS fehlen in '" blockname "'"))
|
||||
(vla-Delete block-obj)
|
||||
(exit)))
|
||||
;; Normierte Rahmen (P xu yu zu) aus rohen KS-Daten berechnen
|
||||
(setq f-ein (ks-frame-extract ks-ein-raw)
|
||||
f-aus (ks-frame-extract ks-aus-raw))
|
||||
(setq xe (cadr f-ein) ye (caddr f-ein) ze (cadddr f-ein))
|
||||
(setq P-ein (car f-ein))
|
||||
(setq P-aus (car f-aus)
|
||||
xu-aus (cadr f-aus)
|
||||
yu-aus (caddr f-aus)
|
||||
zu-aus (cadddr f-aus))
|
||||
;; Rotation identisch zu insert-block-ks-to-ks: R * xe = xt, R * ye = yt, R * ze = zt
|
||||
(setq R (mat3-from-frames xt yt zt xe ye ze))
|
||||
;; Lokale Referenzpunkte fuer XY- bzw. Z-Zielvorgabe bestimmen
|
||||
(setq P-xyref
|
||||
(cond ((= xy-ref "KS_EIN") P-ein)
|
||||
((= xy-ref "KS_AUS") P-aus)
|
||||
(t '(0.0 0.0 0.0))))
|
||||
(setq P-zref
|
||||
(cond ((= z-ref "KS_EIN") P-ein)
|
||||
((= z-ref "KS_AUS") P-aus)
|
||||
(t '(0.0 0.0 0.0))))
|
||||
(setq R-xyref (mat3-mul-vec3 R P-xyref))
|
||||
(setq R-zref (mat3-mul-vec3 R P-zref))
|
||||
;; Translation: xy-ref -> P-t (X/Y), z-ref -> z-ziel (Z)
|
||||
(setq tx (- (car P-t) (car R-xyref)))
|
||||
(setq ty (- (cadr P-t) (cadr R-xyref)))
|
||||
(setq tz (- (float z-ziel) (caddr R-zref)))
|
||||
;; 4x4-Transformationsmatrix aufbauen und auf Block anwenden
|
||||
(setq T4 (vlax-tmatrix
|
||||
(list (list (car (car R)) (cadr (car R)) (caddr (car R)) tx)
|
||||
(list (car (cadr R)) (cadr (cadr R)) (caddr (cadr R)) ty)
|
||||
(list (car (caddr R)) (cadr (caddr R)) (caddr (caddr R)) tz)
|
||||
(list 0.0 0.0 0.0 1.0))))
|
||||
(vla-TransformBy block-obj T4)
|
||||
;; Ausgabe-Rahmen fuer KS_AUS mathematisch berechnen (kein Re-Extrahieren noetig)
|
||||
(setq R-Paus (mat3-mul-vec3 R P-aus))
|
||||
(setq P-out (list (+ (car R-Paus) tx)
|
||||
(+ (cadr R-Paus) ty)
|
||||
(+ (caddr R-Paus) tz)))
|
||||
(setq xu-out (mat3-mul-vec3 R xu-aus)
|
||||
yu-out (mat3-mul-vec3 R yu-aus)
|
||||
zu-out (mat3-mul-vec3 R zu-aus))
|
||||
(princ (strcat "\n '" blockname "' eingefuegt (XY:" (if xy-ref xy-ref "Ursprung")
|
||||
" Z:" (if z-ref z-ref "Ursprung") ")"
|
||||
"\n KS_AUS: X=" (rtos (car P-out) 2 2)
|
||||
" Y=" (rtos (cadr P-out) 2 2)
|
||||
" Z=" (rtos (caddr P-out) 2 2)))
|
||||
(list P-out xu-out yu-out zu-out))
|
||||
|
||||
(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel /
|
||||
rad matrix block-obj endpunkt scale)
|
||||
(if (<= laenge 0.1)
|
||||
@@ -582,8 +674,24 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; Fuegt Block ein und dreht ihn um die Y-Achse (Neigung, reine XZ-Ebene).
|
||||
;; block-dx/block-dz: lokaler Versatz KS_AUS-KS_EIN (unrotiert), fuer den
|
||||
;; zurueckgegebenen endpunkt.
|
||||
;; WICHTIG: KS_EIN liegt nicht bei jedem Block exakt am Block-Ursprung
|
||||
;; (z.B. bei Vario_Bogen). Damit KS_EIN und nicht der Block-Ursprung auf
|
||||
;; startpunkt zu liegen kommt, wird der Ursprung um das rotierte lokale
|
||||
;; KS_EIN-Versatz korrigiert. Fuer Bloecke mit KS_EIN=Ursprung (Separator,
|
||||
;; Umlenk-/Motorstation) ist diese Korrektur 0 - Verhalten bleibt gleich.
|
||||
;; block-dx/block-dz: Fallback-Laenge (aus Config), nur verwendet falls
|
||||
;; KS_EIN/KS_AUS am Block nicht extrahiert werden koennen. Ist KS_AUS
|
||||
;; vorhanden, wird der ECHTE gemessene Versatz KS_AUS-KS_EIN verwendet -
|
||||
;; das schuetzt vor veralteten Config-Zahlen, die nicht mehr zur
|
||||
;; tatsaechlichen Blockgeometrie passen (z.B. nach einer DWG-Bereinigung).
|
||||
(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz /
|
||||
rad matrix block-obj endpunkt)
|
||||
rad matrix block-obj temp-obj ks-data
|
||||
ks-ein-raw ks-aus-raw
|
||||
ein-x ein-y ein-z aus-x aus-y aus-z
|
||||
dx dz ins-pt endpunkt)
|
||||
(if (or (null startpunkt) (not (listp startpunkt)))
|
||||
(progn
|
||||
(princ (strcat "\n FEHLER: Ungueltiger Einfuegepunkt fuer '" blockname "'"))
|
||||
@@ -600,6 +708,35 @@
|
||||
(princ (strcat "\n Fuege Block '" blockname "' ein"
|
||||
" (Rotation " (itoa winkel) (chr 176) ")"))
|
||||
(setq rad (* winkel (/ pi 180.0)))
|
||||
;; Lokale KS_EIN/KS_AUS-Position ueber EIGENES Temp-Objekt ermitteln
|
||||
;; (nicht am spaeter tatsaechlich platzierten block-obj -
|
||||
;; extract-ks-from-block exploded das uebergebene Objekt intern; das
|
||||
;; darf nicht das Objekt sein, das anschliessend gedreht/verschoben
|
||||
;; in der Zeichnung bleibt).
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(if (not (vlax-erased-p temp-obj)) (vla-Delete temp-obj))
|
||||
(setq ks-ein-raw (cadr (assoc "KS_EIN" ks-data)))
|
||||
(setq ks-aus-raw (cadr (assoc "KS_AUS" ks-data)))
|
||||
(setq ein-x 0.0 ein-y 0.0 ein-z 0.0)
|
||||
(if ks-ein-raw
|
||||
(setq ein-x (car (car ks-ein-raw))
|
||||
ein-y (cadr (car ks-ein-raw))
|
||||
ein-z (caddr (car ks-ein-raw)))
|
||||
)
|
||||
;; Echten Versatz KS_AUS-KS_EIN verwenden, sofern messbar (statt der
|
||||
;; ggf. veralteten Config-Werte block-dx/block-dz).
|
||||
(setq dx block-dx dz block-dz)
|
||||
(if ks-aus-raw
|
||||
(progn
|
||||
(setq aus-x (car (car ks-aus-raw))
|
||||
aus-y (cadr (car ks-aus-raw))
|
||||
aus-z (caddr (car ks-aus-raw)))
|
||||
(setq dx (- aus-x ein-x) dz (- aus-z ein-z))
|
||||
)
|
||||
)
|
||||
(setq block-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
@@ -610,15 +747,22 @@
|
||||
(list 0 0 0 1)
|
||||
))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix matrix))
|
||||
;; Block-Ursprung so verschieben, dass das ROTIERTE KS_EIN exakt auf
|
||||
;; startpunkt liegt: Ursprung = startpunkt - Rot(ks_ein_lokal)
|
||||
(setq ins-pt (list
|
||||
(- (car startpunkt) (+ (* ein-x (cos rad)) (* ein-z (sin rad))))
|
||||
(- (cadr startpunkt) ein-y)
|
||||
(- (caddr startpunkt) (+ (* (- (sin rad)) ein-x) (* (cos rad) ein-z)))))
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point '(0 0 0))
|
||||
(vlax-3D-point startpunkt))
|
||||
(vlax-3D-point ins-pt))
|
||||
(setq endpunkt (list
|
||||
(+ (car startpunkt) (+ (* block-dx (cos rad)) (* block-dz (sin rad))))
|
||||
(+ (car startpunkt) (+ (* dx (cos rad)) (* dz (sin rad))))
|
||||
(cadr startpunkt)
|
||||
(+ (caddr startpunkt) (+ (* (- (sin rad)) block-dx) (* (cos rad) block-dz)))))
|
||||
(+ (caddr startpunkt) (+ (* (- (sin rad)) dx) (* (cos rad) dz)))))
|
||||
(princ (strcat "\n Endpunkt: X=" (rtos (car endpunkt) 2 2)
|
||||
" Z=" (rtos (caddr endpunkt) 2 2)))
|
||||
" Z=" (rtos (caddr endpunkt) 2 2)
|
||||
" (dx=" (rtos dx 2 1) " dz=" (rtos dz 2 1) ")"))
|
||||
endpunkt
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user