3D-Linienzug (gemischte Gefaellestrecke/VarioFoerderer-Kette, Modus 1: manuelle Eingabe) wurde bei Variofoerder gabaut. Die Block-Attribute für GF und VF wurde angepasst wie erfoerdert bei EXPORT.
This commit is contained in:
+87
-55
@@ -2,7 +2,7 @@
|
||||
;; VF_CORE - VarioFoerderer Kern-Modul
|
||||
;; Version: 26.0
|
||||
;; Architektur: Plugin/Dispatcher
|
||||
;; Laedt automatisch: vf_standard.lsp, vf_etage.lsp
|
||||
;; Laedt automatisch: vf_standard.lsp, vf_etage.lsp, vf_linienzug.lsp
|
||||
;; Befehle: VarioFoerderer (Alias: FOERDERANLAGE, ETAGEVARIOFOERDERER)
|
||||
;; ============================================================
|
||||
|
||||
@@ -87,35 +87,9 @@
|
||||
(setq *ks-cache* nil)
|
||||
(setq grad-zeichen (chr 176))
|
||||
|
||||
;; 26 Attribut-Definitionen fuer VF_*-Block (alle Typen)
|
||||
(setq *vf-attrib-defs*
|
||||
'(("NUMMER" "0")
|
||||
("MONTAGEHOEHE_m" "0.000")
|
||||
("HOEHE_VON" "0")
|
||||
("HOEHE_BIS" "0")
|
||||
("DELTA_H" "0")
|
||||
("DELTA_L" "0")
|
||||
("L_VF_m" "0.000")
|
||||
("L_GF_m" "0.000")
|
||||
("ANTRIEBFAHRTRICHTUNG" "Auf")
|
||||
("WINKEL" "0")
|
||||
("ANZAHL_SEPARATOR" "2")
|
||||
("ANZAHL_SCANNER" "0")
|
||||
("TYP" "standard")
|
||||
("SEITE" "rechts")
|
||||
("GF_Bogen_L_90" "0")
|
||||
("GF_Bogen_L_60" "0")
|
||||
("GF_Bogen_L_30" "0")
|
||||
("GF_Bogen_R_90" "0")
|
||||
("GF_Bogen_R_60" "0")
|
||||
("GF_Bogen_R_30" "0")
|
||||
("VF_Bogen_A_90" "0")
|
||||
("VF_Bogen_A_60" "0")
|
||||
("VF_Bogen_A_30" "0")
|
||||
("VF_Bogen_I_90" "0")
|
||||
("VF_Bogen_I_60" "0")
|
||||
("VF_Bogen_I_30" "0")
|
||||
("ID" "")))
|
||||
;; Attribut-Definitionen fuer VF_*-Bloecke kommen aus dem gemeinsamen
|
||||
;; Strecken-Schema in ssg_core.lsp (ssg-strecke-attrib-defs). VarioFoerderer
|
||||
;; ist immer TYP "Streckengruppe" -> voller Attributsatz.
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 4: HILFSFUNKTIONEN
|
||||
@@ -131,6 +105,15 @@
|
||||
((and (> len 2.5) (< len 3.5)) "Z")
|
||||
(t nil)))
|
||||
|
||||
;; Normalisiert die verschiedenen KS-Blocknamen auf "KS_EIN"/"KS_AUS".
|
||||
;; Die aelteren Bloecke (AS/ES/Gefaellebogen) verwenden KS_EIN/KS_AUS, die
|
||||
;; Vario_Kurve-Bloecke KSYS_EIN/KSYS_AUS. Rueckgabe nil, wenn kein KS-Block.
|
||||
(defun ks-normalize-name (nm)
|
||||
(cond
|
||||
((or (= nm "KS_EIN") (= nm "KSYS_EIN")) "KS_EIN")
|
||||
((or (= nm "KS_AUS") (= nm "KSYS_AUS")) "KS_AUS")
|
||||
(t nil)))
|
||||
|
||||
(defun fmt (x)
|
||||
(if (and (numberp x) (not (equal x nil))) (rtos x 2 2) "---"))
|
||||
|
||||
@@ -232,6 +215,35 @@
|
||||
(setq zu (vec3-cross xu-unit yu))
|
||||
(list P xu-unit yu zu))
|
||||
|
||||
;; --- Bruecke Frame <-> (hz, winkel) ---
|
||||
;; Fuer vf-linienzug (gemischte GF/VF-Ketten, vf_linienzug.lsp): Gefaellestrecke
|
||||
;; traegt den Kettenzustand als Frame (Position + Richtungsvektor xu) weiter,
|
||||
;; waehrend die aelteren VF-Einfuegefunktionen (insert-block-by-ks,
|
||||
;; insert-rotated-block-with-ks, insert-inclined-scaled-block) Position+hz+winkel
|
||||
;; getrennt erwarten. Beide nutzen dieselbe Rz(hz)*Ry(winkel)-Rotation
|
||||
;; (winkel positiv = abwaerts, xu = (cos(hz)cos(v), sin(hz)cos(v), -sin(v))),
|
||||
;; daher sind Frame und (hz winkel) verlustfrei ineinander umrechenbar.
|
||||
(defun frame->hz-winkel (frame / xu horiz-len)
|
||||
(setq xu (cadr frame))
|
||||
(setq horiz-len (sqrt (+ (* (car xu)(car xu)) (* (cadr xu)(cadr xu)))))
|
||||
(list
|
||||
(* (atan (cadr xu) (car xu)) (/ 180.0 pi))
|
||||
(* (atan (- (caddr xu)) horiz-len) (/ 180.0 pi))
|
||||
)
|
||||
)
|
||||
|
||||
(defun hz-winkel->xu (hz winkel / rad-h rad-v)
|
||||
(setq rad-h (* (float hz) (/ pi 180.0)))
|
||||
(setq rad-v (* (float winkel) (/ pi 180.0)))
|
||||
(list (* (cos rad-h)(cos rad-v))
|
||||
(* (sin rad-h)(cos rad-v))
|
||||
(- (sin rad-v)))
|
||||
)
|
||||
|
||||
(defun punkt-hz-winkel->frame (punkt hz winkel)
|
||||
(make-frame-from-dir punkt (hz-winkel->xu hz winkel))
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 5: KS_EIN/KS_AUS EXTRAKTION
|
||||
;; ============================================================
|
||||
@@ -260,12 +272,13 @@
|
||||
(setq ks-results '())
|
||||
(setq sub-entities (vlax-invoke block-obj 'Explode))
|
||||
(foreach sub-obj sub-entities
|
||||
(if (and (not (vlax-erased-p sub-obj))
|
||||
(= (vla-get-ObjectName sub-obj) "AcDbBlockReference")
|
||||
(or (= (vla-get-Name sub-obj) "KS_EIN")
|
||||
(= (vla-get-Name sub-obj) "KS_AUS")))
|
||||
(setq ks-ref
|
||||
(if (and (not (vlax-erased-p sub-obj))
|
||||
(= (vla-get-ObjectName sub-obj) "AcDbBlockReference"))
|
||||
(ks-normalize-name (vla-get-Name sub-obj))
|
||||
nil))
|
||||
(if ks-ref
|
||||
(progn
|
||||
(setq ks-ref (vla-get-Name sub-obj))
|
||||
(setq inner-entities (vlax-invoke sub-obj 'Explode))
|
||||
(setq origin nil x-end nil y-end nil z-end nil)
|
||||
(foreach inner-obj inner-entities
|
||||
@@ -400,22 +413,18 @@
|
||||
;; ============================================================
|
||||
;; TEIL 7: VF-NUMMERIERUNG
|
||||
;; ============================================================
|
||||
(defun vf-next-number ( / ss i nr maxnr attribs)
|
||||
;; Naechste freie VF-Nummer aus den Blocknamen VF_<n> ableiten (der Blockname
|
||||
;; ist die Bezeichnung/Zaehlung; ein separates NUMMER-Attribut gibt es nicht mehr).
|
||||
(defun vf-next-number ( / ss i nr maxnr bname)
|
||||
(setq maxnr 0)
|
||||
(setq ss (ssget "X" '((0 . "INSERT") (2 . "VF_*"))))
|
||||
(if ss
|
||||
(progn
|
||||
(setq i 0)
|
||||
(while (< i (sslength ss))
|
||||
(setq attribs (ssg-attrib-read (ssname ss i)))
|
||||
(foreach pair attribs
|
||||
(if (= (car pair) "NUMMER")
|
||||
(progn
|
||||
(setq nr (atoi (cdr pair)))
|
||||
(if (> nr maxnr) (setq maxnr nr))
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq bname (cdr (assoc 2 (entget (ssname ss i)))))
|
||||
(setq nr (atoi (substr bname 4))) ; "VF_" = 3 Zeichen -> ab Position 4
|
||||
(if (> nr maxnr) (setq maxnr nr))
|
||||
(setq i (1+ i))
|
||||
)
|
||||
)
|
||||
@@ -993,9 +1002,10 @@
|
||||
(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
|
||||
;; Unsichtbare ATTDEFs am Startpunkt erzeugen (gemeinsames Strecken-Schema;
|
||||
;; VarioFoerderer ist immer TYP "Streckengruppe" -> voller Attributsatz).
|
||||
(setq attdef-ypos (cadr startpunkt))
|
||||
(foreach def *vf-attrib-defs*
|
||||
(foreach def (ssg-strecke-attrib-defs "Streckengruppe")
|
||||
(entmake (list
|
||||
'(0 . "ATTDEF")
|
||||
'(8 . "0")
|
||||
@@ -1037,20 +1047,28 @@
|
||||
(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))
|
||||
(cons "Bezeichnung" vf-bname)
|
||||
;; Artinr. bleibt auf Schema-Vorgabe "6220"
|
||||
(cons "MONTAGEHOEHE_m" (rtos montagehoehe-m 2 3))
|
||||
(cons "HOEHE_VON" (itoa (fix hoehe-von)))
|
||||
(cons "HOEHE_BIS" (itoa (fix hoehe-bis)))
|
||||
(cons "DELTA_H" (itoa (fix deltaH)))
|
||||
(cons "DELTA_L" (itoa (fix deltaL)))
|
||||
(cons "L_VF_m" (rtos (/ L_VF 1000.0) 2 3))
|
||||
(cons "TYP" "Streckengruppe")
|
||||
(cons "SEITE_AS" seite)
|
||||
(cons "SEITE_ES" seite)
|
||||
(cons "ANZAHL_GF" "2") ; GF1 + GF2
|
||||
(cons "L_GF_m" L_GF_m-str)
|
||||
;; GF_WINKEL: Neigung je GF-Segment (GF1,GF2 - beide feste Grundneigung)
|
||||
(cons "GF_WINKEL" (strcat (rtos (float (ssg-cfg-or "vario" "gefaelle_winkel" 3)) 2 1)
|
||||
"," (rtos (float (ssg-cfg-or "vario" "gefaelle_winkel" 3)) 2 1)))
|
||||
(cons "ANZAHL_VF" "1") ; ein VF-Koerper
|
||||
(cons "MOTORSEITE" "rechts")
|
||||
(cons "L_VF_m" (rtos (/ L_VF 1000.0) 2 3))
|
||||
(cons "ANTRIEBFAHRTRICHTUNG" richtung)
|
||||
(cons "WINKEL" (itoa best-winkel))
|
||||
(cons "VF_WINKEL" (itoa best-winkel))
|
||||
(cons "ANZAHL_SEPARATOR" "2")
|
||||
(cons "ANZAHL_SCANNER" (itoa n-scanner))
|
||||
(cons "TYP" anlage-typ)
|
||||
(cons "SEITE" seite)
|
||||
)
|
||||
)
|
||||
;; Typ-spezifische Bogen-Zaehler (Etage: 2x Gefaellebogen je Seite)
|
||||
@@ -1060,6 +1078,9 @@
|
||||
(ssg-attrib-set-on vf-insert (list (cons "GF_Bogen_L_60" "2")))
|
||||
)
|
||||
)
|
||||
;; Aufsteigende, eindeutige ID vergeben (wie beim Kreisel), falls verfuegbar.
|
||||
(if (car (atoms-family 1 '("SSG-ID-GENERATE")))
|
||||
(ssg-id-generate vf-insert))
|
||||
(princ (strcat "\n>>> Block '" vf-bname "' erstellt und eingefuegt."))
|
||||
)
|
||||
(princ "\n>>> FEHLER: Keine Entities fuer Block gefunden!")
|
||||
@@ -1087,6 +1108,7 @@
|
||||
(progn
|
||||
(load (strcat *vf-lisp-pfad* "/vf_standard.lsp"))
|
||||
(load (strcat *vf-lisp-pfad* "/vf_etage.lsp"))
|
||||
(load (strcat *vf-lisp-pfad* "/vf_linienzug.lsp"))
|
||||
(setq *ssg-vf-submodule-loaded* t)
|
||||
)
|
||||
(princ "\n[vf_core] WARNUNG: DXFM_LISP nicht gesetzt - Untermodule konnten nicht geladen werden!")
|
||||
@@ -1144,6 +1166,17 @@
|
||||
(setq einfuege-fn (nth 2 typ-eintr))
|
||||
(princ (strcat "\n>>> Typ: " anlage-typ))
|
||||
|
||||
;; Sonderfall "linienzug": eigener Befehlsablauf (interaktive Mehrsegment-
|
||||
;; Kette mit gemischten GF/VF-Segmenten), passt nicht in das berechne-fn/
|
||||
;; einfuege-fn-Schema fuer ein einzelnes durchgehendes Segment - siehe
|
||||
;; vf_linienzug.lsp. Dispatcht hier direkt und beendet den Standard-Ablauf.
|
||||
(if (= anlage-typ "linienzug")
|
||||
(progn
|
||||
(vf-linienzug-modus)
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
|
||||
;; 2. VF-Nummer automatisch ermitteln
|
||||
(setq vf-nummer (vf-next-number))
|
||||
(princ (strcat "\n>>> Naechste VF-Nummer: VF" (itoa vf-nummer)))
|
||||
@@ -1288,9 +1321,8 @@
|
||||
(princ (strcat "\n>>> L_GF1=" (rtos L_GF1 2 2)
|
||||
" mm L_GF2=" (rtos L_GF2 2 2) " mm"))
|
||||
|
||||
;; 10. Anzahl Scanner
|
||||
(setq n-scanner (getint "\nAnzahl Scanner [0]: "))
|
||||
(if (null n-scanner) (setq n-scanner 0))
|
||||
;; Scanner-Anzahl wird nicht mehr abgefragt (Attribut ANZAHL_SCANNER bleibt 0).
|
||||
(setq n-scanner 0)
|
||||
|
||||
;; 11. Bestaetigung
|
||||
(princ "\n\nMoechten Sie die Foerderanlage einfuegen?")
|
||||
|
||||
Reference in New Issue
Block a user