Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 17d5bfc539 | |||
| 027b377b84 | |||
| cc3cb9f160 |
+50
-35
@@ -238,8 +238,10 @@
|
||||
|
||||
;; --- Block per KS_EIN/KS_AUS einfuegen ---
|
||||
(if (null (car (atoms-family 1 '("INSERT-BLOCK-BY-KS"))))
|
||||
(defun insert-block-by-ks (blockname einfuegepunkt /
|
||||
block-obj temp-obj ks-data ks-ein ks-aus offset ausgang)
|
||||
(defun insert-block-by-ks (blockname einfuegepunkt hz /
|
||||
block-obj temp-obj ks-data ks-ein ks-aus
|
||||
rad-h chv shv ein-x ein-y ein-z dx-loc dy-loc dz-loc
|
||||
offset ausgang)
|
||||
(ensure-block-loaded blockname)
|
||||
(if (not (tblsearch "BLOCK" blockname))
|
||||
(progn
|
||||
@@ -247,6 +249,8 @@
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
(setq rad-h (* (float hz) (/ pi 180.0)))
|
||||
(setq chv (cos rad-h) shv (sin rad-h))
|
||||
;; KS_EIN/KS_AUS ueber eigenes Temp-Objekt am Ursprung ermitteln (nicht
|
||||
;; am spaeter tatsaechlich platzierten block-obj), siehe vf_core.lsp.
|
||||
(setq temp-obj
|
||||
@@ -259,21 +263,30 @@
|
||||
(setq ks-aus (cadr (assoc "KS_AUS" ks-data)))
|
||||
(setq block-obj
|
||||
(vla-InsertBlock modelspace
|
||||
(vlax-3D-point einfuegepunkt)
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix
|
||||
(list (list chv (- shv) 0 0)
|
||||
(list shv chv 0 0)
|
||||
(list 0 0 1 0)
|
||||
(list 0 0 0 1))))
|
||||
(if (and ks-ein ks-aus)
|
||||
(progn
|
||||
(setq offset
|
||||
(list (- (car (car ks-ein)))
|
||||
(- (cadr (car ks-ein)))
|
||||
(- (caddr (car ks-ein)))))
|
||||
(setq ein-x (car (car ks-ein)) ein-y (cadr (car ks-ein)) ein-z (caddr (car ks-ein)))
|
||||
(setq offset (list
|
||||
(- (car einfuegepunkt) (- (* chv ein-x) (* shv ein-y)))
|
||||
(- (cadr einfuegepunkt) (+ (* shv ein-x) (* chv ein-y)))
|
||||
(- (caddr einfuegepunkt) ein-z)))
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point '(0 0 0))
|
||||
(vlax-3D-point offset))
|
||||
(setq ausgang
|
||||
(list (+ (car einfuegepunkt) (car (car ks-aus)) (car offset))
|
||||
(+ (cadr einfuegepunkt) (cadr (car ks-aus)) (cadr offset))
|
||||
(+ (caddr einfuegepunkt) (caddr (car ks-aus)) (caddr offset))))
|
||||
(setq dx-loc (- (car (car ks-aus)) ein-x))
|
||||
(setq dy-loc (- (cadr (car ks-aus)) ein-y))
|
||||
(setq dz-loc (- (caddr (car ks-aus)) ein-z))
|
||||
(setq ausgang (list
|
||||
(+ (car einfuegepunkt) (- (* chv dx-loc) (* shv dy-loc)))
|
||||
(+ (cadr einfuegepunkt) (+ (* shv dx-loc) (* chv dy-loc)))
|
||||
(+ (caddr einfuegepunkt) dz-loc)))
|
||||
(princ (strcat "\n KS_AUS Z=" (rtos (caddr ausgang) 2 2)))
|
||||
ausgang
|
||||
)
|
||||
@@ -287,30 +300,32 @@
|
||||
|
||||
;; --- Skalierter geneigter Block (Staustrecke, Richtung X) ---
|
||||
(if (null (car (atoms-family 1 '("INSERT-INCLINED-SCALED-BLOCK"))))
|
||||
(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel /
|
||||
rad scale block-obj endpunkt)
|
||||
(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel hz /
|
||||
rad-v rad-h chv shv cvv svv scale block-obj endpunkt)
|
||||
(if (<= laenge 0.1)
|
||||
(progn (princ "\n (Laenge 0 - uebersprungen)") startpunkt)
|
||||
(progn
|
||||
(ensure-block-loaded blockname)
|
||||
(setq scale (/ (float laenge) 1000.0))
|
||||
(setq rad (* (float winkel) (/ pi 180.0)))
|
||||
(setq rad-v (* (float winkel) (/ pi 180.0)))
|
||||
(setq rad-h (* (float hz) (/ pi 180.0)))
|
||||
(setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v))
|
||||
(setq block-obj
|
||||
(vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname scale 1.0 1.0 0))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix
|
||||
(list (list (cos rad) 0 (sin rad) 0)
|
||||
(list 0 1 0 0)
|
||||
(list (- (sin rad)) 0 (cos rad) 0)
|
||||
(list (list (* chv cvv) (- shv) (* chv svv) 0)
|
||||
(list (* shv cvv) chv (* shv svv) 0)
|
||||
(list (- svv) 0 cvv 0)
|
||||
(list 0 0 0 1))))
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point '(0 0 0))
|
||||
(vlax-3D-point startpunkt))
|
||||
(setq endpunkt
|
||||
(list (+ (car startpunkt) (* laenge (cos rad)))
|
||||
(cadr startpunkt)
|
||||
(+ (caddr startpunkt) (* (- (sin rad)) laenge))))
|
||||
(list (+ (car startpunkt) (* laenge chv cvv))
|
||||
(+ (cadr startpunkt) (* laenge shv cvv))
|
||||
(+ (caddr startpunkt) (* laenge (- svv)))))
|
||||
(princ (strcat "\n " blockname " L=" (rtos laenge 2 1)
|
||||
" -> Z=" (rtos (caddr endpunkt) 2 1)))
|
||||
endpunkt
|
||||
@@ -319,20 +334,22 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; --- Rotierter Block mit manuellem dx/dz (Richtung X) ---
|
||||
;; --- Rotierter Block mit manuellem dx/dz ---
|
||||
;; KS_EIN (nicht der Block-Ursprung) wird auf startpunkt ausgerichtet, siehe
|
||||
;; Kommentar an der kanonischen Definition in vf_core.lsp.
|
||||
(if (null (car (atoms-family 1 '("INSERT-ROTATED-BLOCK-WITH-KS"))))
|
||||
;; block-dx/block-dz: Fallback, nur falls KS_AUS nicht extrahierbar.
|
||||
;; Ist KS_AUS vorhanden, wird der echte Versatz KS_AUS-KS_EIN verwendet
|
||||
;; (schuetzt vor veralteten Config-Zahlen), siehe vf_core.lsp.
|
||||
(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz /
|
||||
rad block-obj temp-obj ks-data
|
||||
(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz hz /
|
||||
rad-v rad-h chv shv cvv svv 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)
|
||||
(ensure-block-loaded blockname)
|
||||
(setq rad (* (float winkel) (/ pi 180.0)))
|
||||
(setq rad-v (* (float winkel) (/ pi 180.0)))
|
||||
(setq rad-h (* (float hz) (/ pi 180.0)))
|
||||
(setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v))
|
||||
;; Lokale KS_EIN/KS_AUS-Position ueber EIGENES Temp-Objekt ermitteln
|
||||
;; (nicht am spaeter tatsaechlich platzierten block-obj), siehe vf_core.lsp.
|
||||
(setq temp-obj
|
||||
@@ -363,23 +380,21 @@
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix
|
||||
(list (list (cos rad) 0 (sin rad) 0)
|
||||
(list 0 1 0 0)
|
||||
(list (- (sin rad)) 0 (cos rad) 0)
|
||||
(list (list (* chv cvv) (- shv) (* chv svv) 0)
|
||||
(list (* shv cvv) chv (* shv svv) 0)
|
||||
(list (- svv) 0 cvv 0)
|
||||
(list 0 0 0 1))))
|
||||
(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)))))
|
||||
(- (car startpunkt) (+ (* ein-x chv cvv) (* ein-y (- shv)) (* ein-z chv svv)))
|
||||
(- (cadr startpunkt) (+ (* ein-x shv cvv) (* ein-y chv) (* ein-z shv svv)))
|
||||
(- (caddr startpunkt) (+ (* ein-x (- svv)) (* ein-z cvv)))))
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point '(0 0 0))
|
||||
(vlax-3D-point ins-pt))
|
||||
(list
|
||||
(+ (car startpunkt)
|
||||
(+ (* dx (cos rad)) (* dz (sin rad))))
|
||||
(cadr startpunkt)
|
||||
(+ (caddr startpunkt)
|
||||
(+ (* (- (sin rad)) dx) (* (cos rad) dz))))
|
||||
(+ (car startpunkt) (+ (* dx chv cvv) (* dz chv svv)))
|
||||
(+ (cadr startpunkt) (+ (* dx shv cvv) (* dz shv svv)))
|
||||
(+ (caddr startpunkt) (+ (* dx (- svv)) (* dz cvv))))
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
+196
-72
@@ -428,7 +428,10 @@
|
||||
;; ============================================================
|
||||
;; TEIL 8: BLOCK-EINFUEGEFUNKTIONEN (gemeinsam fuer alle Typen)
|
||||
;; ============================================================
|
||||
(defun insert-block-by-ks (blockname einfuegepunkt / block-obj temp-obj ks-data ks-ein ks-aus offset ausgang)
|
||||
;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...). Block
|
||||
;; hat sonst keine Neigung, daher nur Rz-Rotation (keine Ry-Komponente).
|
||||
(defun insert-block-by-ks (blockname einfuegepunkt hz / block-obj temp-obj ks-data ks-ein ks-aus
|
||||
rad-h chv shv ein-x ein-y ein-z dx-loc dy-loc dz-loc offset ausgang)
|
||||
(if (or (null einfuegepunkt) (not (listp einfuegepunkt)))
|
||||
(progn
|
||||
(princ (strcat "\n FEHLER: Ungueltiger Einfuegepunkt fuer '" blockname "'"))
|
||||
@@ -442,7 +445,9 @@
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
(princ (strcat "\n Fuege Block '" blockname "' ein..."))
|
||||
(princ (strcat "\n Fuege Block '" blockname "' ein... (hz=" (rtos (float hz) 2 1) (chr 176) ")"))
|
||||
(setq rad-h (* (float hz) (/ pi 180.0)))
|
||||
(setq chv (cos rad-h) shv (sin rad-h))
|
||||
;; KS_EIN/KS_AUS ueber eigenes Temp-Objekt am Ursprung ermitteln (nicht am
|
||||
;; spaeter tatsaechlich platzierten block-obj - extract-ks-from-block
|
||||
;; exploded das uebergebene Objekt intern), siehe insert-block-ks-to-ks.
|
||||
@@ -453,23 +458,40 @@
|
||||
(if (not (vlax-erased-p temp-obj)) (vla-Delete temp-obj))
|
||||
(setq ks-ein (cadr (assoc "KS_EIN" ks-data)))
|
||||
(setq ks-aus (cadr (assoc "KS_AUS" ks-data)))
|
||||
;; Block am Ursprung einfuegen (nicht direkt am einfuegepunkt), damit die
|
||||
;; Rz-Rotation um den Block-Ursprung dreht, nicht um die Weltachse.
|
||||
(setq block-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point einfuegepunkt)
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
(if (> (abs hz) 0.0001)
|
||||
(vla-TransformBy block-obj (vlax-tmatrix
|
||||
(list (list chv (- shv) 0 0)
|
||||
(list shv chv 0 0)
|
||||
(list 0 0 1 0)
|
||||
(list 0 0 0 1))))
|
||||
)
|
||||
(if (and ks-ein ks-aus)
|
||||
(progn
|
||||
;; offset verschiebt block-obj so, dass KS_EIN (aktuell bei
|
||||
;; einfuegepunkt+lokalerVersatz) exakt auf einfuegepunkt zu liegen kommt.
|
||||
(setq offset (list (- (car (car ks-ein)))
|
||||
(- (cadr (car ks-ein)))
|
||||
(- (caddr (car ks-ein)))))
|
||||
(setq ein-x (car (car ks-ein)) ein-y (cadr (car ks-ein)) ein-z (caddr (car ks-ein)))
|
||||
;; Block-Ursprung so verschieben, dass das ROTIERTE KS_EIN exakt auf
|
||||
;; einfuegepunkt zu liegen kommt: Ursprung = einfuegepunkt - Rz(hz)*ks_ein_lokal
|
||||
(setq offset (list
|
||||
(- (car einfuegepunkt) (- (* chv ein-x) (* shv ein-y)))
|
||||
(- (cadr einfuegepunkt) (+ (* shv ein-x) (* chv ein-y)))
|
||||
(- (caddr einfuegepunkt) ein-z)))
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point '(0 0 0))
|
||||
(vlax-3D-point offset))
|
||||
(setq ausgang (list (+ (car einfuegepunkt) (car (car ks-aus)) (car offset))
|
||||
(+ (cadr einfuegepunkt) (cadr (car ks-aus)) (cadr offset))
|
||||
(+ (caddr einfuegepunkt) (caddr (car ks-aus)) (caddr offset))))
|
||||
;; KS_AUS = einfuegepunkt + Rz(hz)*(ks_aus_lokal - ks_ein_lokal)
|
||||
(setq dx-loc (- (car (car ks-aus)) ein-x))
|
||||
(setq dy-loc (- (cadr (car ks-aus)) ein-y))
|
||||
(setq dz-loc (- (caddr (car ks-aus)) ein-z))
|
||||
(setq ausgang (list
|
||||
(+ (car einfuegepunkt) (- (* chv dx-loc) (* shv dy-loc)))
|
||||
(+ (cadr einfuegepunkt) (+ (* shv dx-loc) (* chv dy-loc)))
|
||||
(+ (caddr einfuegepunkt) dz-loc)))
|
||||
(princ (strcat "\n KS_AUS: X=" (rtos (car ausgang) 2 2)
|
||||
" Y=" (rtos (cadr ausgang) 2 2)
|
||||
" Z=" (rtos (caddr ausgang) 2 2)))
|
||||
ausgang
|
||||
)
|
||||
@@ -657,8 +679,10 @@
|
||||
" 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)
|
||||
;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...),
|
||||
;; winkel: vertikale Neigung in Grad. Rotation = Rz(hz)*Ry(winkel).
|
||||
(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel hz /
|
||||
rad-v rad-h chv shv cvv svv matrix block-obj endpunkt scale)
|
||||
(if (<= laenge 0.1)
|
||||
(progn
|
||||
(princ (strcat "\n Laenge=" (rtos laenge 2 2) " mm -> uebersprungen"))
|
||||
@@ -673,26 +697,32 @@
|
||||
)
|
||||
)
|
||||
(princ (strcat "\n Fuege '" blockname "' ein"
|
||||
" (L=" (rtos laenge 2 2) " mm, W=" (itoa winkel) (chr 176) ")"))
|
||||
" (L=" (rtos laenge 2 2) " mm, W=" (itoa winkel) (chr 176)
|
||||
" hz=" (rtos (float hz) 2 1) (chr 176) ")"))
|
||||
(setq scale (/ laenge (ssg-cfg-or "vario" "skalierung_basis" 1000.0)))
|
||||
(setq rad (* winkel (/ pi 180.0)))
|
||||
(setq rad-v (* (float winkel) (/ pi 180.0)))
|
||||
(setq rad-h (* (float hz) (/ pi 180.0)))
|
||||
(setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v))
|
||||
(setq block-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname scale 1.0 1.0 0))
|
||||
(setq matrix (list
|
||||
(list (cos rad) 0 (sin rad) 0)
|
||||
(list 0 1 0 0)
|
||||
(list (- (sin rad)) 0 (cos rad) 0)
|
||||
(list (* chv cvv) (- shv) (* chv svv) 0)
|
||||
(list (* shv cvv) chv (* shv svv) 0)
|
||||
(list (- svv) 0 cvv 0)
|
||||
(list 0 0 0 1)
|
||||
))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix matrix))
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point '(0 0 0))
|
||||
(vlax-3D-point startpunkt))
|
||||
(setq endpunkt (list (+ (car startpunkt) (* laenge (cos rad)))
|
||||
(cadr startpunkt)
|
||||
(+ (caddr startpunkt) (* (- (sin rad)) laenge))))
|
||||
(princ (strcat "\n Endpunkt: Z=" (rtos (caddr endpunkt) 2 2)))
|
||||
(setq endpunkt (list
|
||||
(+ (car startpunkt) (* laenge chv cvv))
|
||||
(+ (cadr startpunkt) (* laenge shv cvv))
|
||||
(+ (caddr startpunkt) (* laenge (- svv)))))
|
||||
(princ (strcat "\n Endpunkt: X=" (rtos (car endpunkt) 2 2)
|
||||
" Y=" (rtos (cadr endpunkt) 2 2)
|
||||
" Z=" (rtos (caddr endpunkt) 2 2)))
|
||||
endpunkt
|
||||
)
|
||||
)
|
||||
@@ -711,8 +741,10 @@
|
||||
;; 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 temp-obj ks-data
|
||||
;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...),
|
||||
;; winkel: vertikale Neigung in Grad. Rotation = Rz(hz)*Ry(winkel).
|
||||
(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz hz /
|
||||
rad-v rad-h chv shv cvv svv 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)
|
||||
@@ -730,8 +762,11 @@
|
||||
)
|
||||
)
|
||||
(princ (strcat "\n Fuege Block '" blockname "' ein"
|
||||
" (Rotation " (itoa winkel) (chr 176) ")"))
|
||||
(setq rad (* winkel (/ pi 180.0)))
|
||||
" (Rotation " (itoa winkel) (chr 176)
|
||||
" hz=" (rtos (float hz) 2 1) (chr 176) ")"))
|
||||
(setq rad-v (* winkel (/ pi 180.0)))
|
||||
(setq rad-h (* (float hz) (/ pi 180.0)))
|
||||
(setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v))
|
||||
;; 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
|
||||
@@ -765,26 +800,27 @@
|
||||
(vlax-3D-point '(0 0 0))
|
||||
blockname 1.0 1.0 1.0 0))
|
||||
(setq matrix (list
|
||||
(list (cos rad) 0 (sin rad) 0)
|
||||
(list 0 1 0 0)
|
||||
(list (- (sin rad)) 0 (cos rad) 0)
|
||||
(list (* chv cvv) (- shv) (* chv svv) 0)
|
||||
(list (* shv cvv) chv (* shv svv) 0)
|
||||
(list (- svv) 0 cvv 0)
|
||||
(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)
|
||||
;; startpunkt liegt: Ursprung = startpunkt - Rz(hz)*Ry(winkel)*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)))))
|
||||
(- (car startpunkt) (+ (* ein-x chv cvv) (* ein-y (- shv)) (* ein-z chv svv)))
|
||||
(- (cadr startpunkt) (+ (* ein-x shv cvv) (* ein-y chv) (* ein-z shv svv)))
|
||||
(- (caddr startpunkt) (+ (* ein-x (- svv)) (* ein-z cvv)))))
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point '(0 0 0))
|
||||
(vlax-3D-point ins-pt))
|
||||
(setq endpunkt (list
|
||||
(+ (car startpunkt) (+ (* dx (cos rad)) (* dz (sin rad))))
|
||||
(cadr startpunkt)
|
||||
(+ (caddr startpunkt) (+ (* (- (sin rad)) dx) (* (cos rad) dz)))))
|
||||
(+ (car startpunkt) (+ (* dx chv cvv) (* dz chv svv)))
|
||||
(+ (cadr startpunkt) (+ (* dx shv cvv) (* dz shv svv)))
|
||||
(+ (caddr startpunkt) (+ (* dx (- svv)) (* dz cvv)))))
|
||||
(princ (strcat "\n Endpunkt: X=" (rtos (car endpunkt) 2 2)
|
||||
" Y=" (rtos (cadr endpunkt) 2 2)
|
||||
" Z=" (rtos (caddr endpunkt) 2 2)
|
||||
" (dx=" (rtos dx 2 1) " dz=" (rtos dz 2 1) ")"))
|
||||
endpunkt
|
||||
@@ -796,7 +832,7 @@
|
||||
;; TEIL 9: GEMEINSAME EINGABE-ABFRAGE
|
||||
;; ============================================================
|
||||
(defun vf-eingabe-abfragen ( / eingabe-modus line-points startpunkt endpunkt differenz
|
||||
deltaL deltaH deltaX deltaY richtung antwort)
|
||||
deltaL deltaH deltaX deltaY richtung antwort hz-winkel)
|
||||
(princ "\n\nEingabemodus waehlen:")
|
||||
(princ "\n 1 - 3D-Linie auswaehlen (Start- und Endpunkt mit Hoehe)")
|
||||
(princ "\n 2 - Werte manuell eingeben")
|
||||
@@ -823,8 +859,12 @@
|
||||
deltaY (abs (cadr differenz))
|
||||
deltaH (caddr differenz))
|
||||
(setq deltaL (max deltaX deltaY))
|
||||
;; Fahrtrichtung aus der Linie ableiten (0=Ost, 90=Nord, ...)
|
||||
(setq hz-winkel
|
||||
(* (angle '(0.0 0.0) (list (car differenz) (cadr differenz))) (/ 180.0 pi)))
|
||||
(princ (strcat "\n △L=" (rtos deltaL 2 2) " mm"
|
||||
" △H=" (rtos deltaH 2 2) " mm"))
|
||||
" △H=" (rtos deltaH 2 2) " mm"
|
||||
" Fahrtrichtung=" (rtos hz-winkel 2 1) grad-zeichen))
|
||||
(if (>= deltaH 0)
|
||||
(progn (setq richtung "Auf") (princ "\n Foerderrichtung: AUF"))
|
||||
(progn (setq richtung "Ab") (setq deltaH (abs deltaH))
|
||||
@@ -837,25 +877,56 @@
|
||||
(if (null deltaL) (setq deltaL 15000))
|
||||
(setq deltaH (getreal "\n△H - Hoehenunterschied (mm): "))
|
||||
(if (null deltaH) (setq deltaH 3000))
|
||||
;; Foerderrichtung bleibt eine einfache Auf/Ab-Frage - die horizontale
|
||||
;; Zwischenstrecke ist geometrisch NUR bei "Ab" ueberhaupt erreichbar
|
||||
;; (die festen 3-Grad-Elemente wirken immer absenkend) und wird daher
|
||||
;; erst SPAETER, nach Bibliotheks-Init, als Zusatzoption in der
|
||||
;; Winkel-Auswahl angeboten (siehe c:VarioFoerderer) - einheitlich fuer
|
||||
;; Werteingabe UND 3D-Linie.
|
||||
(princ "\nFoerderrichtung:\n 1 - AUF\n 2 - AB")
|
||||
(setq antwort (getstring "\nIhre Wahl (1/2): "))
|
||||
(if (= antwort "2") (setq richtung "Ab") (setq richtung "Auf"))
|
||||
(setq startpunkt (getpoint "\nStartpunkt fuer AUS_Element waehlen: "))
|
||||
(if (null startpunkt) (setq startpunkt '(0 0 0)))
|
||||
;; Horizontale Fahrtrichtung waehlen (analog Gefaellestrecke Modus 1)
|
||||
(princ "\n\nFahrtrichtung waehlen:")
|
||||
(princ "\n 1 - 0° (X-Achse +, Ost)")
|
||||
(princ "\n 2 - 90° (Y-Achse +, Nord)")
|
||||
(princ "\n 3 - 180° (X-Achse -, West)")
|
||||
(princ "\n 4 - 270° (Y-Achse -, Sued)")
|
||||
(setq antwort (getstring "\nIhre Wahl (1/2/3/4) [1]: "))
|
||||
(cond
|
||||
((= antwort "2") (setq hz-winkel 90.0))
|
||||
((= antwort "3") (setq hz-winkel 180.0))
|
||||
((= antwort "4") (setq hz-winkel 270.0))
|
||||
(t (setq hz-winkel 0.0))
|
||||
)
|
||||
(princ (strcat "\n>>> Fahrtrichtung: " (rtos hz-winkel 2 1) grad-zeichen))
|
||||
)
|
||||
)
|
||||
(list deltaL deltaH richtung startpunkt)
|
||||
(list deltaL deltaH richtung startpunkt hz-winkel eingabe-modus)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 10: VF_*-BLOCK-SYSTEM (gemeinsam fuer alle Typen)
|
||||
;; ============================================================
|
||||
(defun vf-make-label (vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF
|
||||
richtung best-winkel n-separator n-scanner startpunkt /
|
||||
label-txt label-pt L_VF_str L_GF_str delta-sym)
|
||||
;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, ...) - siehe
|
||||
;; variofoerderer-einfuegen. Beschriftungsposition wird ENTLANG dieser
|
||||
;; Richtung (halbe deltaL) und SENKRECHT dazu (200mm) versetzt, statt fest
|
||||
;; von +X auszugehen. Der Textwinkel rastet wie bei Gefaellestrecke immer
|
||||
;; auf 0 Grad (X-Achse) oder 90 Grad (Y-Achse) ein, damit er nie auf dem
|
||||
;; Kopf steht - unabhaengig von der tatsaechlichen Fahrtrichtung.
|
||||
;; L_GF1/L_GF2: die beiden Gefaellestrecken-Segmente (vorne/hinten) - werden
|
||||
;; als kommagetrennte Meter-Werte dargestellt (Punkt=Dezimaltrennzeichen,
|
||||
;; Komma=Segment-Trenner, analog L-gf-str in Gefaellestrecke.lsp), damit
|
||||
;; beide Werte eindeutig unterscheidbar bleiben.
|
||||
(defun vf-make-label (vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2
|
||||
richtung best-winkel n-separator n-scanner startpunkt hz /
|
||||
label-txt label-pt L_VF_str L_GF_str delta-sym
|
||||
chz-l shz-l halb basis-winkel)
|
||||
(setq delta-sym (chr 916))
|
||||
(setq L_VF_str (vl-string-subst "," "." (rtos (/ L_VF 1000.0) 2 3)))
|
||||
(setq L_GF_str (vl-string-subst "," "." (rtos (/ L_GF 1000.0) 2 3)))
|
||||
(setq L_GF_str (strcat (rtos (/ L_GF1 1000.0) 2 3) "," (rtos (/ L_GF2 1000.0) 2 3)))
|
||||
(setq label-txt
|
||||
(strcat "VF" (itoa vf-nummer)
|
||||
": von " (itoa (fix hoehe-von)) "mm bis " (itoa (fix hoehe-bis)) "mm, "
|
||||
@@ -864,10 +935,19 @@
|
||||
"VF:" L_VF_str "m; GF:" L_GF_str "m; "
|
||||
richtung ": " (itoa best-winkel) grad-zeichen "; "
|
||||
"Sep: " (itoa n-separator) "; Scan: " (itoa n-scanner)))
|
||||
(setq chz-l (cos (* (float hz) (/ pi 180.0))))
|
||||
(setq shz-l (sin (* (float hz) (/ pi 180.0))))
|
||||
(setq halb (/ (float deltaL) 2.0))
|
||||
(setq label-pt (list
|
||||
(+ (car startpunkt) (/ deltaL 2.0))
|
||||
(- (cadr startpunkt) 200.0)
|
||||
(+ (car startpunkt) (* halb chz-l) (* 200.0 shz-l))
|
||||
(+ (cadr startpunkt) (* halb shz-l) (* -200.0 chz-l))
|
||||
(caddr startpunkt)))
|
||||
;; Textwinkel auf 0/90 Grad einrasten (nie kopfueber, unabhaengig von hz)
|
||||
(setq basis-winkel (float hz))
|
||||
(while (< basis-winkel 0.0) (setq basis-winkel (+ basis-winkel 360.0)))
|
||||
(while (>= basis-winkel 360.0) (setq basis-winkel (- basis-winkel 360.0)))
|
||||
(if (>= basis-winkel 180.0) (setq basis-winkel (- basis-winkel 180.0)))
|
||||
(setq basis-winkel (if (or (< basis-winkel 45.0) (>= basis-winkel 135.0)) 0.0 90.0))
|
||||
(entmake (list
|
||||
'(0 . "TEXT")
|
||||
(cons 8 "VF_Beschriftung")
|
||||
@@ -875,7 +955,7 @@
|
||||
(cons 10 label-pt)
|
||||
(cons 40 100.0)
|
||||
(cons 1 label-txt)
|
||||
(cons 50 0.0)
|
||||
(cons 50 (* basis-winkel (/ pi 180.0)))
|
||||
'(72 . 1)
|
||||
'(73 . 2)
|
||||
(cons 11 label-pt)
|
||||
@@ -905,12 +985,13 @@
|
||||
;; Erstellt VF_N-Block aus allen seit lastEnt erzeugten Entities.
|
||||
;; Setzt Attributwerte entsprechend Typ, Seite und Geometrieparametern.
|
||||
(defun vf-block-erstellen (anlage-typ seite vf-nummer n-scanner
|
||||
hoehe-von hoehe-bis deltaH deltaL L_VF L_GF
|
||||
richtung best-winkel startpunkt lastEnt
|
||||
/ vf-bname vf-ss vf-e vf-insert montagehoehe-m attdef-ypos)
|
||||
hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2
|
||||
richtung best-winkel startpunkt lastEnt hz
|
||||
/ vf-bname vf-ss vf-e vf-insert montagehoehe-m attdef-ypos L_GF_m-str)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
;; Beschriftungstext erzeugen
|
||||
(vf-make-label vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF
|
||||
richtung best-winkel 2 n-scanner startpunkt)
|
||||
(vf-make-label vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2
|
||||
richtung best-winkel 2 n-scanner startpunkt hz)
|
||||
|
||||
;; Unsichtbare ATTDEFs am Startpunkt erzeugen
|
||||
(setq attdef-ypos (cadr startpunkt))
|
||||
@@ -951,6 +1032,9 @@
|
||||
(setvar "ATTREQ" 1)
|
||||
(setq vf-insert (entlast))
|
||||
(setq montagehoehe-m (/ (+ hoehe-von hoehe-bis) 2000.0))
|
||||
;; L_GF_m: kommagetrennte Segmentlaengen in Metern (vorne,hinten),
|
||||
;; analog L_GF_m in Gefaellestrecke.lsp.
|
||||
(setq L_GF_m-str (strcat (rtos (/ L_GF1 1000.0) 2 3) "," (rtos (/ L_GF2 1000.0) 2 3)))
|
||||
(ssg-attrib-set-on vf-insert
|
||||
(list
|
||||
(cons "NUMMER" (itoa vf-nummer))
|
||||
@@ -960,7 +1044,7 @@
|
||||
(cons "DELTA_H" (itoa (fix deltaH)))
|
||||
(cons "DELTA_L" (itoa (fix deltaL)))
|
||||
(cons "L_VF_m" (rtos (/ L_VF 1000.0) 2 3))
|
||||
(cons "L_GF_m" (rtos (/ L_GF 1000.0) 2 3))
|
||||
(cons "L_GF_m" L_GF_m-str)
|
||||
(cons "ANTRIEBFAHRTRICHTUNG" richtung)
|
||||
(cons "WINKEL" (itoa best-winkel))
|
||||
(cons "ANZAHL_SEPARATOR" "2")
|
||||
@@ -1014,8 +1098,9 @@
|
||||
;; TEIL 12: DISPATCHER c:VarioFoerderer
|
||||
;; ============================================================
|
||||
(defun c:VarioFoerderer ( / typ-eintr anlage-typ berechne-fn einfuege-fn
|
||||
eingabe deltaL deltaH richtung startpunkt seite
|
||||
ergebnis ergebnis-liste gueltige-winkel
|
||||
eingabe deltaL deltaH richtung startpunkt seite hz
|
||||
eingabe-modus ergebnis ergebnis-liste gueltige-winkel
|
||||
horizontal-info
|
||||
best-winkel L_GF L_GF1 L_GF2 L_VF
|
||||
idx eintrag wahl antwort verteilung-modus
|
||||
n-scanner vf-nummer hoehe-von hoehe-bis lastEnt
|
||||
@@ -1063,12 +1148,15 @@
|
||||
(setq vf-nummer (vf-next-number))
|
||||
(princ (strcat "\n>>> Naechste VF-Nummer: VF" (itoa vf-nummer)))
|
||||
|
||||
;; 3. Gemeinsame Eingabe (deltaL, deltaH, richtung, startpunkt)
|
||||
;; 3. Gemeinsame Eingabe (deltaL, deltaH, richtung, startpunkt) - richtung
|
||||
;; steht bei beiden Eingabemodi (Werteingabe UND 3D-Linie) bereits fest.
|
||||
(setq eingabe (vf-eingabe-abfragen))
|
||||
(setq deltaL (nth 0 eingabe)
|
||||
deltaH (nth 1 eingabe)
|
||||
richtung (nth 2 eingabe)
|
||||
startpunkt (nth 3 eingabe))
|
||||
(setq deltaL (nth 0 eingabe)
|
||||
deltaH (nth 1 eingabe)
|
||||
richtung (nth 2 eingabe)
|
||||
startpunkt (nth 3 eingabe)
|
||||
hz (nth 4 eingabe)
|
||||
eingabe-modus (nth 5 eingabe))
|
||||
|
||||
;; 4. Seite-Auswahl (vor Berechnung, weil Etage-Typ sie fuer Geometrie braucht)
|
||||
(princ "\n\nSeite waehlen:")
|
||||
@@ -1078,11 +1166,31 @@
|
||||
(if (= antwort "2") (setq seite "links") (setq seite "rechts"))
|
||||
(princ (strcat "\n>>> Seite: " seite))
|
||||
|
||||
;; 5. Typ-spezifische Berechnung (init + berechne)
|
||||
;; 5. Typ-spezifische Berechnung (init + Winkelsuche)
|
||||
(setq ergebnis (apply berechne-fn (list deltaL deltaH richtung seite)))
|
||||
(setq ergebnis-liste (cadddr ergebnis))
|
||||
|
||||
;; 6. Konfiguration (nach ssg_core-Init verfuegbar)
|
||||
;; 5b. Horizontale Zwischenstrecke als Zusatzoption: geometrisch NUR bei
|
||||
;; "Ab" ueberhaupt erreichbar (die festen 3-Grad-Elemente wirken immer
|
||||
;; absenkend) - "Auf" wird deshalb gar nicht erst geprueft. Gilt einheitlich
|
||||
;; fuer Werteingabe UND 3D-Linie, da richtung hier in jedem Fall feststeht.
|
||||
;; Bibliothek ist durch den berechne-fn-Aufruf oben bereits initialisiert.
|
||||
(if (and (= anlage-typ "standard") (= richtung "Ab"))
|
||||
(progn
|
||||
(setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab"))
|
||||
(if (and horizontal-info (caddr horizontal-info))
|
||||
(progn
|
||||
(setq ergebnis-liste
|
||||
(append ergebnis-liste
|
||||
(list (list 0 (car horizontal-info) (cadr horizontal-info) T))))
|
||||
(princ "\n\n>>> Hinweis: Ein horizontale Variofoerderer ( 0°) ist bei diesem △L/△H zusaetzlich moeglich!")
|
||||
)
|
||||
(setq horizontal-info nil)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; Konfiguration (nach ssg_core-Init verfuegbar).
|
||||
(setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000))
|
||||
|
||||
;; 7. Gueltige Winkel ermitteln
|
||||
@@ -1103,22 +1211,33 @@
|
||||
)
|
||||
|
||||
;; 8. Winkelauswahl (automatisch oder interaktiv)
|
||||
;; Sentinel-Winkel 0 = horizontale Zwischenstrecke (Schritt 6/11 bei 0
|
||||
;; Grad, Boegen fest auf_3/ab_3) - siehe berechne-horizontale-mitte.
|
||||
(if (= (length gueltige-winkel) 1)
|
||||
(progn
|
||||
(setq best-winkel (car gueltige-winkel))
|
||||
(setq eintrag (assoc best-winkel ergebnis-liste))
|
||||
(setq L_GF (nth 1 eintrag) L_VF (nth 2 eintrag))
|
||||
(princ (strcat "\n\n>>> Einziger gueltiger Winkel: "
|
||||
(itoa best-winkel) (chr 176)))
|
||||
(if (= best-winkel 0)
|
||||
(princ "\n\n>>> Einzige gueltige Variante: Horizontale Variofoerderer")
|
||||
(princ (strcat "\n\n>>> Einziger gueltiger Winkel: "
|
||||
(itoa best-winkel) (chr 176)))
|
||||
)
|
||||
)
|
||||
(progn
|
||||
(princ "\n\nMehrere gueltige Winkel verfuegbar. Bitte waehlen:")
|
||||
(setq idx 1)
|
||||
(foreach w gueltige-winkel
|
||||
(setq eintrag (assoc w ergebnis-liste))
|
||||
(princ (strcat "\n " (itoa idx) " - " (itoa w) (chr 176)
|
||||
" (L_GF=" (rtos (nth 1 eintrag) 2 1)
|
||||
" mm, L_VF=" (rtos (nth 2 eintrag) 2 1) " mm)"))
|
||||
(if (= w 0)
|
||||
(princ (strcat "\n " (itoa idx) " - Horizontale Variofoerderer (0"
|
||||
(chr 176) ")"
|
||||
" (L_GF=" (rtos (nth 1 eintrag) 2 1)
|
||||
" mm, L_VF=" (rtos (nth 2 eintrag) 2 1) " mm)"))
|
||||
(princ (strcat "\n " (itoa idx) " - " (itoa w) (chr 176)
|
||||
" (L_GF=" (rtos (nth 1 eintrag) 2 1)
|
||||
" mm, L_VF=" (rtos (nth 2 eintrag) 2 1) " mm)"))
|
||||
)
|
||||
(setq idx (1+ idx))
|
||||
)
|
||||
(setq wahl (getint (strcat "Winkel waehlen (1-"
|
||||
@@ -1131,9 +1250,14 @@
|
||||
)
|
||||
)
|
||||
(princ "\n\n=========================================")
|
||||
(princ (strcat "\n>>> Winkel: " (itoa best-winkel) (chr 176)
|
||||
" L_GF: " (rtos L_GF 2 2) " mm"
|
||||
" L_VF: " (rtos L_VF 2 2) " mm"))
|
||||
(if (= best-winkel 0)
|
||||
(princ (strcat "\n>>> Horizontale Variofoerderer"
|
||||
" L_GF: " (rtos L_GF 2 2) " mm"
|
||||
" L_VF: " (rtos L_VF 2 2) " mm"))
|
||||
(princ (strcat "\n>>> Winkel: " (itoa best-winkel) (chr 176)
|
||||
" L_GF: " (rtos L_GF 2 2) " mm"
|
||||
" L_VF: " (rtos L_VF 2 2) " mm"))
|
||||
)
|
||||
(princ "\n=========================================")
|
||||
|
||||
;; 9. L_GF Verteilung
|
||||
@@ -1187,12 +1311,12 @@
|
||||
|
||||
;; Typ-spezifische Einfuegung
|
||||
(apply einfuege-fn
|
||||
(list deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite))
|
||||
(list deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz))
|
||||
|
||||
;; Gemeinsame VF_*-Block-Erstellung
|
||||
(vf-block-erstellen anlage-typ seite vf-nummer n-scanner
|
||||
hoehe-von hoehe-bis deltaH deltaL L_VF L_GF
|
||||
richtung best-winkel startpunkt lastEnt)
|
||||
hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2
|
||||
richtung best-winkel startpunkt lastEnt hz)
|
||||
|
||||
(princ "\n=========================================")
|
||||
)
|
||||
|
||||
+17
-12
@@ -602,9 +602,14 @@
|
||||
;; ============================================================
|
||||
;; Gibt endpunkt zurueck.
|
||||
;; VF_*-Block-Erstellung erfolgt zentral im Dispatcher (vf_core.lsp).
|
||||
;; hz: Parameter fuer Registry-Kompatibilitaet mit variofoerderer-einfuegen
|
||||
;; (siehe c:VarioFoerderer) - wird hier NICHT verwendet: die Etage-Anlage hat
|
||||
;; bereits eine eigene, fest verdrahtete horizontale Geometrie (hz-anfang/
|
||||
;; hz-ende fuer den 60-Grad-Uebereinander-Versatz) und unterstuetzt aktuell
|
||||
;; keine zusaetzliche globale Fahrtrichtung.
|
||||
(defun etage-foerderanlage-einfuegen (deltaL deltaH richtung
|
||||
best-winkel L_GF1 L_GF2 L_VF
|
||||
startpunkt seite
|
||||
startpunkt seite hz
|
||||
/ aktueller-punkt bogen-name endpunkt
|
||||
bogen-mass bogen-dx bogen-dz
|
||||
as-block es-block gefaelle-blockname
|
||||
@@ -630,7 +635,7 @@
|
||||
|
||||
;; 1. AS_30
|
||||
(princ (strcat "\n\n1/15: " as-block " (0 Grad)"))
|
||||
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt))
|
||||
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt 0.0))
|
||||
|
||||
;; 2. Staustrecke 400mm (hz-anfang, 3 Grad vert, KS_EIN)
|
||||
(princ (strcat "\n\n2/15: Staustrecke 400mm ("
|
||||
@@ -657,7 +662,7 @@
|
||||
(progn
|
||||
(princ (strcat "\n\n5/15: Gefaellestrecke (3 Grad, L=" (rtos L_GF1 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3))
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3 0.0))
|
||||
)
|
||||
(princ "\n\n5/15: L_GF1 (uebersprungen)")
|
||||
)
|
||||
@@ -665,7 +670,7 @@
|
||||
;; 6. Umlenkstation (3 Grad geneigt)
|
||||
(princ "\n\n6/15: Umlenkstation (500mm, 3 Grad geneigt)")
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0))
|
||||
(insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0 0.0))
|
||||
|
||||
;; 7. 1. Vertikalbogen (3 Grad geneigt)
|
||||
(if (= richtung "Auf")
|
||||
@@ -681,7 +686,7 @@
|
||||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||||
(princ (strcat "\n\n7/15: " bogen-name " (3 Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz))
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz 0.0))
|
||||
|
||||
;; 8. Variable Strecke L_VF
|
||||
(if (> L_VF 0.1)
|
||||
@@ -692,14 +697,14 @@
|
||||
(itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (- (- best-winkel 3))))
|
||||
L_VF (- (- best-winkel 3)) 0.0))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n8/15: Gefaellestrecke ("
|
||||
(itoa (+ best-winkel 3)) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (+ best-winkel 3)))
|
||||
L_VF (+ best-winkel 3) 0.0))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -724,35 +729,35 @@
|
||||
" (" (itoa (- 3 best-winkel)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(- 3 best-winkel) bogen-dx bogen-dz))
|
||||
(- 3 best-winkel) bogen-dx bogen-dz 0.0))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n9/15: " bogen-name
|
||||
" (" (itoa (+ best-winkel 3)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(+ best-winkel 3) bogen-dx bogen-dz))
|
||||
(+ best-winkel 3) bogen-dx bogen-dz 0.0))
|
||||
)
|
||||
)
|
||||
|
||||
;; 10. Motorstation (3 Grad geneigt)
|
||||
(princ "\n\n10/15: Motorstation (500mm, 3 Grad geneigt)")
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 3 500 0))
|
||||
(insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 3 500 0 0.0))
|
||||
|
||||
;; 11. L_GF2 (3 Grad geneigt)
|
||||
(if (> L_GF2 0.1)
|
||||
(progn
|
||||
(princ (strcat "\n\n11/15: Gefaellestrecke (3 Grad, L=" (rtos L_GF2 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF2 3))
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF2 3 0.0))
|
||||
)
|
||||
(princ "\n\n11/15: L_GF2 (uebersprungen)")
|
||||
)
|
||||
|
||||
;; 12. Gefaellebogen Ende (via KS_EIN, 0 Grad vert)
|
||||
(princ (strcat "\n\n12/15: " gefaelle-blockname " (Ende, KS_EIN)"))
|
||||
(setq aktueller-punkt (insert-block-by-ks gefaelle-blockname aktueller-punkt))
|
||||
(setq aktueller-punkt (insert-block-by-ks gefaelle-blockname aktueller-punkt 0.0))
|
||||
|
||||
;; 13. Separator Ende (hz-ende, 3 Grad vert)
|
||||
(princ (strcat "\n\n13/15: Separator (300mm, "
|
||||
|
||||
+132
-44
@@ -383,11 +383,61 @@
|
||||
(list best-winkel best-L_GF best-L_VF ergebnis-liste)
|
||||
)
|
||||
|
||||
;; Prueft/berechnet die Variante mit HORIZONTALER Zwischenstrecke (Schritt
|
||||
;; 6/11 bei 0 Grad statt geneigt). Die beiden Vertikalboegen sind dabei
|
||||
;; IMMER auf 3 Grad fixiert (Vario_Bogen_auf_3 / Vario_Bogen_ab_3), weil sie
|
||||
;; nur zwischen der festen 3-Grad-Neigung von Umlenk-/Motorstation und der
|
||||
;; horizontalen Mitte vermitteln muessen - unabhaengig von Auf/Ab.
|
||||
;; WICHTIG (geometrische Konsequenz): GF1+GF2 (an AS/ES-Seite, ebenfalls
|
||||
;; fest bei 3 Grad geneigt) sind die einzige nennenswerte Quelle fuer
|
||||
;; Hoehenaenderung, da sich die beiden Boegen gegenseitig fast vollstaendig
|
||||
;; kompensieren. Die feste 3-Grad-Neigung wirkt IMMER absenkend:
|
||||
;; - "Ab": passt zur gewuenschten Absenkung -> deltaH praktisch beliebig
|
||||
;; erreichbar (im Rahmen von deltaL), GF1+GF2 werden einfach laenger.
|
||||
;; - "Auf": wirkt der gewuenschten Steigung entgegen -> nur fuer SEHR
|
||||
;; KLEINE deltaH ueberhaupt gueltig (wenige cm).
|
||||
;; Rueckgabe: (GF_total L_VF gueltig) oder nil falls Boegen nicht messbar.
|
||||
(defun berechne-horizontale-mitte (deltaL deltaH richtung /
|
||||
mass1 mass2 rad3 bogen-x1 bogen-z1
|
||||
bogen-x2 bogen-z2 deltaH-signiert
|
||||
A-hz B-hz GF_total L_VF-hz gueltig)
|
||||
(setq mass1 (get-bogen-mass bogen-auf 3))
|
||||
(setq mass2 (get-bogen-mass bogen-ab 3))
|
||||
(if (or (null mass1) (null mass2))
|
||||
nil
|
||||
(progn
|
||||
(setq rad3 (* 3.0 (/ pi 180.0)))
|
||||
;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt auf 0 Grad
|
||||
(setq bogen-x1 (+ (* (car mass1) (cos rad3)) (* (caddr mass1) (sin rad3))))
|
||||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad3)) (* (caddr mass1) (cos rad3))))
|
||||
;; Bogen2 (immer ab_3): Eintritt bei 0 Grad (von der horizontalen Mitte), biegt auf 3 Grad
|
||||
(setq bogen-x2 (car mass2))
|
||||
(setq bogen-z2 (caddr mass2))
|
||||
;; Signierte Ziel-Hoehenaenderung: Auf=+deltaH, Ab=-deltaH
|
||||
(setq deltaH-signiert (if (= richtung "Auf") deltaH (- deltaH)))
|
||||
;; Horizontal-Budget: deltaL minus AS/ES minus beide Boegen minus feste Stationen (bei 3 Grad)
|
||||
(setq A-hz (- deltaL aus-dx ein-dx bogen-x1 bogen-x2
|
||||
(* FESTE_HORIZONTAL (cos rad3))))
|
||||
;; Hoehen-Budget: was GF1+GF2 (bei 3 Grad) noch beitragen muessen
|
||||
(setq B-hz (- (+ aus-dz ein-dz (- (* FESTE_HORIZONTAL (sin rad3)))
|
||||
bogen-z1 bogen-z2)
|
||||
deltaH-signiert))
|
||||
(setq GF_total (/ B-hz (sin rad3)))
|
||||
(setq L_VF-hz (- A-hz (* GF_total (cos rad3))))
|
||||
(setq gueltig (and (>= GF_total 0) (>= L_VF-hz 0)))
|
||||
(list GF_total L_VF-hz gueltig)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 5: BERECHNE-WRAPPER (Schnittstelle fuer Registry)
|
||||
;; ============================================================
|
||||
;; Initialisiert Standard-Bibliothek und berechnet Winkel.
|
||||
;; seite-Parameter wird fuer Standard-Typ nicht benoetigt (keine Vorab-Geometrie).
|
||||
;; Die Machbarkeitspruefung fuer die horizontale Zwischenstrecke passiert
|
||||
;; separat und VORAB in c:VarioFoerderer (vor der Foerderrichtung-Abfrage),
|
||||
;; deshalb liefert diese Funktion nur noch die normale Winkelsuche zurueck.
|
||||
(defun berechne-standard (deltaL deltaH richtung seite)
|
||||
(setq FESTE_HORIZONTAL (ssg-cfg-or "vario" "feste_horizontal" 1600))
|
||||
(setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000))
|
||||
@@ -400,19 +450,24 @@
|
||||
;; ============================================================
|
||||
;; Gibt endpunkt zurueck (letzter KS_AUS nach ES_90).
|
||||
;; VF_*-Block-Erstellung erfolgt zentral im Dispatcher (vf_core.lsp).
|
||||
;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, 180=West/-X,
|
||||
;; 270=Sued/-Y). Default 0, falls vom Aufrufer nicht mitgegeben (Etage-
|
||||
;; Registry-Kompatibilitaet - siehe c:VarioFoerderer).
|
||||
(defun variofoerderer-einfuegen (deltaL deltaH richtung best-winkel
|
||||
L_GF1 L_GF2 L_VF startpunkt seite
|
||||
L_GF1 L_GF2 L_VF startpunkt seite hz
|
||||
/ aktueller-punkt bogen-name endpunkt
|
||||
bogen-mass bogen-dx bogen-dz
|
||||
as-block es-block)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
(setq aktueller-punkt startpunkt)
|
||||
(setq as-block (strcat "AS_Element_90_" seite))
|
||||
(setq es-block (strcat "ES_Element_90_" seite))
|
||||
(if (not *lib-initialized*) (init-bibliothek))
|
||||
|
||||
;; 1. AUS_Element
|
||||
(princ (strcat "\n\n1/11: " as-block " (0 Grad)"))
|
||||
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt))
|
||||
(princ (strcat "\n\n1/11: " as-block " (hz=" (rtos hz 2 1) grad-zeichen ")"))
|
||||
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt hz))
|
||||
|
||||
;; 2. 1. Gefaellestrecke
|
||||
(if (> L_GF1 0.1)
|
||||
@@ -420,7 +475,7 @@
|
||||
(princ (strcat "\n\n2/11: Gefaellestrecke (3 Grad, L=" (rtos L_GF1 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_GF1 (ssg-cfg-or "vario" "gefaelle_winkel" 3)))
|
||||
L_GF1 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz))
|
||||
)
|
||||
(princ "\n\n2/11: (uebersprungen)")
|
||||
)
|
||||
@@ -431,7 +486,7 @@
|
||||
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "separator_block_dx" 300)
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0)))
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
|
||||
|
||||
;; 4. Umlenkstation
|
||||
(princ "\n\n4/11: Umlenkstation (500 mm, 3 Grad geneigt)")
|
||||
@@ -439,42 +494,61 @@
|
||||
(insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "station_block_dx" 500)
|
||||
(ssg-cfg-or "vario" "station_block_dz" 0)))
|
||||
(ssg-cfg-or "vario" "station_block_dz" 0) hz))
|
||||
|
||||
;; 5. 1. Vertikalbogen
|
||||
(if (= richtung "Auf")
|
||||
;; Sonderfall best-winkel=0 (horizontale Zwischenstrecke, siehe
|
||||
;; berechne-horizontale-mitte): Boegen IMMER auf_3/ab_3, unabhaengig von
|
||||
;; Auf/Ab, da sie nur zwischen der festen 3-Grad-Neigung und der
|
||||
;; horizontalen Mitte vermitteln muessen.
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
(setq bogen-name "Vario_Bogen_auf_3")
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf 3))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||||
(princ (strcat "\n\n5/11: " bogen-name " (3 Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz))
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz hz))
|
||||
|
||||
;; 6. Variable Strecke L_VF
|
||||
(if (> L_VF 0.1)
|
||||
(progn
|
||||
(if (= richtung "Auf")
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(princ (strcat "\n\n6/11: Steigungsstrecke ("
|
||||
(itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(princ (strcat "\n\n6/11: Horizontale Zwischenstrecke (0 Grad, L="
|
||||
(rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (- (- best-winkel 3))))
|
||||
L_VF 0 hz))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n6/11: Gefaellestrecke ("
|
||||
(itoa (+ best-winkel 3)) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (+ best-winkel 3)))
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(princ (strcat "\n\n6/11: Steigungsstrecke ("
|
||||
(itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (- (- best-winkel 3)) hz))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n6/11: Gefaellestrecke ("
|
||||
(itoa (+ best-winkel 3)) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (+ best-winkel 3) hz))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -482,31 +556,45 @@
|
||||
)
|
||||
|
||||
;; 7. 2. Vertikalbogen
|
||||
(if (= richtung "Auf")
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
(setq bogen-name "Vario_Bogen_ab_3")
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab 3))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||||
(if (= richtung "Auf")
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(princ (strcat "\n\n7/11: " bogen-name
|
||||
" (" (itoa (- 3 best-winkel)) " Grad geneigt)"))
|
||||
(princ (strcat "\n\n7/11: " bogen-name " (3 Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(- 3 best-winkel) bogen-dx bogen-dz))
|
||||
0 bogen-dx bogen-dz hz))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n7/11: " bogen-name
|
||||
" (" (itoa (+ best-winkel 3)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(+ best-winkel 3) bogen-dx bogen-dz))
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(princ (strcat "\n\n7/11: " bogen-name
|
||||
" (" (itoa (- 3 best-winkel)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(- 3 best-winkel) bogen-dx bogen-dz hz))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n7/11: " bogen-name
|
||||
" (" (itoa (+ best-winkel 3)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(+ best-winkel 3) bogen-dx bogen-dz hz))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -516,7 +604,7 @@
|
||||
(insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "station_block_dx" 500)
|
||||
(ssg-cfg-or "vario" "station_block_dz" 0)))
|
||||
(ssg-cfg-or "vario" "station_block_dz" 0) hz))
|
||||
|
||||
;; 9. 2. Gefaellestrecke
|
||||
(if (> L_GF2 0.1)
|
||||
@@ -524,7 +612,7 @@
|
||||
(princ (strcat "\n\n9/11: Gefaellestrecke (3 Grad, L=" (rtos L_GF2 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_GF2 (ssg-cfg-or "vario" "gefaelle_winkel" 3)))
|
||||
L_GF2 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz))
|
||||
)
|
||||
(princ "\n\n9/11: (uebersprungen)")
|
||||
)
|
||||
@@ -535,11 +623,11 @@
|
||||
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "separator_block_dx" 300)
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0)))
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
|
||||
|
||||
;; 11. EIN_Element
|
||||
(princ (strcat "\n\n11/11: " es-block " (0 Grad)"))
|
||||
(setq endpunkt (insert-block-by-ks es-block aktueller-punkt))
|
||||
(princ (strcat "\n\n11/11: " es-block " (hz=" (rtos hz 2 1) grad-zeichen ")"))
|
||||
(setq endpunkt (insert-block-by-ks es-block aktueller-punkt hz))
|
||||
|
||||
(princ "\n\n=========================================")
|
||||
(princ "\n>>> Standard VarioFoerderer eingefuegt!")
|
||||
|
||||
@@ -169,10 +169,11 @@
|
||||
(setq lastEnt (vf-lastent-ohne-attribute))
|
||||
(variofoerderer-einfuegen deltaL deltaH richtung best-winkel
|
||||
(/ L_GF 2.0) (/ L_GF 2.0) L_VF
|
||||
startpunkt "links")
|
||||
startpunkt "links" 0.0)
|
||||
(vf-block-erstellen "standard" "links" vf-nummer 0
|
||||
hoehe-von hoehe-bis deltaH deltaL L_VF L_GF
|
||||
richtung best-winkel startpunkt lastEnt)
|
||||
hoehe-von hoehe-bis deltaH deltaL L_VF
|
||||
(/ L_GF 2.0) (/ L_GF 2.0)
|
||||
richtung best-winkel startpunkt lastEnt 0.0)
|
||||
|
||||
;; lastEnt hinter den SEQEND des VF-Blocks schieben.
|
||||
;; Ohne diesen Schritt wuerde entnext vom INSERT-Entity
|
||||
|
||||
Reference in New Issue
Block a user