1143 lines
44 KiB
Common Lisp
1143 lines
44 KiB
Common Lisp
;; ============================================================
|
||
;; FÖRDERANLAGE GENERATOR für BricsCAD Pro
|
||
;; Version: 25.0 (Komplett bibliotheksbasiert, keine Fallbacks)
|
||
;; Befehl: FOERDERANLAGE
|
||
;; ============================================================
|
||
|
||
(vl-load-com)
|
||
|
||
;; ============================================================
|
||
;; TEIL 1: GLOBALE EINSTELLUNGEN
|
||
;; ============================================================
|
||
(if (getenv "DXFM_BLOCKS")
|
||
(setq modul-pfad (strcat (getenv "DXFM_BLOCKS") "/"))
|
||
(progn
|
||
(alert "Umgebungsvariable DXFM_BLOCKS nicht gesetzt!\nBitte zuerst bin\\setenv.bat ausfuehren.")
|
||
(exit)
|
||
)
|
||
)
|
||
|
||
;; Pfad zu den Einzelblock-DXF-Dateien (zeigt auf 2D oder 3D Unterverzeichnis)
|
||
(setq block-pfad modul-pfad)
|
||
|
||
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
|
||
(setq modelspace (vla-get-ModelSpace doc))
|
||
|
||
;; ============================================================
|
||
;; TEIL 2: GLOBALE VARIABLEN (werden aus Bibliothek befüllt)
|
||
;; ============================================================
|
||
(setq aus-dx nil aus-dy nil aus-dz nil)
|
||
(setq ein-dx nil ein-dy nil ein-dz nil)
|
||
(setq separator-laenge nil umlenk-laenge nil motorstation-laenge nil)
|
||
(setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000))
|
||
(setq FESTE_HORIZONTAL (ssg-cfg-or "vario" "feste_horizontal" 1600))
|
||
|
||
;; Bogen-Tabellen (werden aus Bibliothek befüllt)
|
||
(setq bogen-auf '()) ;; Format: ((winkel dx dy dz) ...)
|
||
(setq bogen-ab '())
|
||
|
||
;; Cache für geladene Daten
|
||
(setq *lib-initialized* nil)
|
||
(setq *bogen-cache-loaded* nil)
|
||
(setq *modul-cache* nil)
|
||
(setq *ks-cache* nil) ;; KS-Daten Cache: (("blockname" ("KS_EIN" ...) ("KS_AUS" ...)) ...)
|
||
(setq *library-loaded* nil) ;; Flag: ils_library.dxf bereits geladen
|
||
|
||
;; ============================================================
|
||
;; TEIL 3: HILFSFUNKTIONEN
|
||
;; ============================================================
|
||
(defun vec-length (v)
|
||
(sqrt (+ (* (car v) (car v)) (* (cadr v) (cadr v)) (* (caddr v) (caddr v))))
|
||
)
|
||
|
||
(defun ks-line-axis (len)
|
||
(cond
|
||
((and (> len 0.5) (< len 1.5)) "X") ;; 1.0
|
||
((and (> len 99) (< len 101)) "X") ;; 100.0
|
||
((and (> len 1.5) (< len 2.5)) "Y") ;; 2.0
|
||
((and (> len 2.5) (< len 3.5)) "Z") ;; 3.0
|
||
(t nil)
|
||
)
|
||
)
|
||
|
||
(defun fmt (x)
|
||
(if (and (numberp x) (not (equal x nil))) (rtos x 2 2) "---")
|
||
)
|
||
|
||
(defun punkt-differenz (p1 p2)
|
||
(list (- (car p2) (car p1)) (- (cadr p2) (cadr p1)) (- (caddr p2) (caddr p1)))
|
||
)
|
||
|
||
;; KS-Daten relativ zu einem Basispunkt machen (fuer Cache)
|
||
(defun ks-relativize (ks-data base-pt)
|
||
(mapcar '(lambda (item)
|
||
(list (car item)
|
||
(mapcar '(lambda (pt)
|
||
(list (- (car pt) (car base-pt))
|
||
(- (cadr pt) (cadr base-pt))
|
||
(- (caddr pt) (caddr base-pt))))
|
||
(cadr item))))
|
||
ks-data)
|
||
)
|
||
|
||
;; Relative KS-Daten auf einen Basispunkt anwenden
|
||
(defun ks-absolutize (ks-rel base-pt)
|
||
(mapcar '(lambda (item)
|
||
(list (car item)
|
||
(mapcar '(lambda (pt)
|
||
(list (+ (car pt) (car base-pt))
|
||
(+ (cadr pt) (cadr base-pt))
|
||
(+ (caddr pt) (caddr base-pt))))
|
||
(cadr item))))
|
||
ks-rel)
|
||
)
|
||
|
||
;; ============================================================
|
||
;; TEIL 4: KS_EIN/KS_AUS EXTRAKTION (KERN-FUNKTION)
|
||
;; ============================================================
|
||
|
||
;; Grad-Zeichen fuer Blocknamen
|
||
(setq grad-zeichen (chr 176))
|
||
|
||
;; Laedt Bloecke aus ils_library.dxf (einmalig, laedt alle Bloecke auf einmal).
|
||
;; Fallback: Einzeldatei block-pfad/<blockname>.dxf
|
||
(defun ensure-block-loaded (blockname / lib-datei block-datei temp-obj)
|
||
(if (not (tblsearch "BLOCK" blockname))
|
||
(progn
|
||
;; Erste fehlender Block: gesamte Bibliothek laden (enthaelt alle 3D-Bloecke)
|
||
(if (not *library-loaded*)
|
||
(progn
|
||
(setq lib-datei
|
||
(strcat (vl-string-translate "\\" "/" (getenv "DXFM_DATA"))
|
||
"/block_libraries/ils_library.dwg"))
|
||
(if (findfile lib-datei)
|
||
(progn
|
||
(princ "\n Lade ils_library.dxf ...")
|
||
(setq temp-obj (vla-InsertBlock modelspace
|
||
(vlax-3D-point '(0 0 0))
|
||
lib-datei 1.0 1.0 1.0 0))
|
||
(vla-Delete temp-obj)
|
||
(setq *library-loaded* T)
|
||
(princ " OK")
|
||
)
|
||
(princ (strcat "\n WARNUNG: Bibliothek nicht gefunden: " lib-datei))
|
||
)
|
||
)
|
||
)
|
||
;; Fallback: Einzeldatei (fuer Bloecke ausserhalb der Bibliothek)
|
||
(if (not (tblsearch "BLOCK" blockname))
|
||
(progn
|
||
(setq block-datei (strcat block-pfad blockname ".dxf"))
|
||
(if (findfile block-datei)
|
||
(progn
|
||
(setq temp-obj (vla-InsertBlock modelspace
|
||
(vlax-3D-point '(0 0 0))
|
||
block-datei 1.0 1.0 1.0 0))
|
||
(vla-Delete temp-obj)
|
||
)
|
||
(princ (strcat "\n FEHLER: Block nicht gefunden: " blockname))
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
|
||
;; Extrahiert KS_EIN und KS_AUS aus einem Block (intern, ohne Cache)
|
||
;; Rückgabe: (("KS_EIN" (origin x-end y-end z-end))
|
||
;; ("KS_AUS" (origin x-end y-end z-end)))
|
||
(defun extract-ks-from-block-raw (block-obj / sub-entities sub-obj ks-results
|
||
ks-ref inner-entities inner-obj origin x-end y-end z-end
|
||
line-start line-end axis line-len line-vec)
|
||
;; (dbgf "extract-ks-from-block-raw")
|
||
;; (dbg block-obj)
|
||
(setq ks-results '())
|
||
|
||
;; Block explodieren
|
||
(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")))
|
||
(progn
|
||
(setq ks-ref (vla-get-Name sub-obj))
|
||
|
||
;; KS-Block explodieren
|
||
(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
|
||
(if (and (not (vlax-erased-p inner-obj))
|
||
(= (vla-get-ObjectName inner-obj) "AcDbLine"))
|
||
(progn
|
||
(setq line-start (vlax-safearray->list
|
||
(vlax-variant-value (vla-get-StartPoint inner-obj))))
|
||
(setq line-end (vlax-safearray->list
|
||
(vlax-variant-value (vla-get-EndPoint inner-obj))))
|
||
(setq line-vec (list (- (car line-end) (car line-start))
|
||
(- (cadr line-end) (cadr line-start))
|
||
(- (caddr line-end) (caddr line-start))))
|
||
(setq line-len (vec-length line-vec))
|
||
(setq axis (ks-line-axis line-len))
|
||
|
||
(if (null origin) (setq origin line-start))
|
||
(cond
|
||
((= axis "X") (setq x-end line-end))
|
||
((= axis "Y") (setq y-end line-end))
|
||
((= axis "Z") (setq z-end line-end))
|
||
)
|
||
)
|
||
)
|
||
(if (not (vlax-erased-p inner-obj)) (vla-Delete inner-obj))
|
||
)
|
||
|
||
;; Ergebnis speichern
|
||
(if (and origin x-end y-end z-end)
|
||
(setq ks-results (cons (list ks-ref (list origin x-end y-end z-end)) ks-results))
|
||
)
|
||
)
|
||
)
|
||
)
|
||
|
||
;; Aufräumen
|
||
(foreach sub-obj sub-entities
|
||
(if (not (vlax-erased-p sub-obj)) (vla-Delete sub-obj))
|
||
)
|
||
|
||
ks-results
|
||
)
|
||
|
||
;; Gecachte Version: prueft *ks-cache* anhand Blockname
|
||
;; Beim ersten Aufruf wird explodiert und das Ergebnis relativ
|
||
;; zum Einfuegepunkt im Cache gespeichert. Weitere Aufrufe
|
||
;; desselben Blocktyps liefern die Daten ohne Explode.
|
||
(defun extract-ks-from-block (block-obj / blockname insert-pt cached result ks-rel)
|
||
;; (dbgf "extract-ks-from-block")
|
||
(setq blockname (vla-get-Name block-obj))
|
||
(setq insert-pt (vlax-safearray->list
|
||
(vlax-variant-value (vla-get-InsertionPoint block-obj))))
|
||
(setq cached (assoc blockname *ks-cache*))
|
||
(if cached
|
||
(progn
|
||
;; (dbg (strcat " KS-Cache HIT: " blockname))
|
||
(ks-absolutize (cdr cached) insert-pt)
|
||
)
|
||
(progn
|
||
;; (dbg (strcat " KS-Cache MISS: " blockname))
|
||
(setq result (extract-ks-from-block-raw block-obj))
|
||
(if result
|
||
(progn
|
||
(setq ks-rel (ks-relativize result insert-pt))
|
||
(setq *ks-cache* (cons (cons blockname ks-rel) *ks-cache*))
|
||
)
|
||
)
|
||
result
|
||
)
|
||
)
|
||
)
|
||
|
||
;; ============================================================
|
||
;; TEIL 5: PUNKTE-AUSWAHL MIT Z-HÖHE (HIER EINFÜGEN!)
|
||
;; ============================================================
|
||
(defun get-3d-point-from-object (msg / ent obj pt variant)
|
||
;; (dbgf "get-3d-point-from-object")
|
||
(princ msg)
|
||
(princ "\n >> Objekt (Block) wählen: ")
|
||
(setq ent (entsel))
|
||
(if ent
|
||
(progn
|
||
(setq obj (vlax-ename->vla-object (car ent)))
|
||
|
||
;; Versuche Block-Einfügepunkt zu bekommen
|
||
(if (vlax-property-available-p obj 'InsertionPoint)
|
||
(progn
|
||
;; In BricsCAD: InsertionPoint ist ein VARIANT, kein Safearray!
|
||
(setq variant (vla-get-InsertionPoint obj))
|
||
;; Variant in Safearray umwandeln
|
||
(setq pt (vlax-safearray->list (vlax-variant-value variant)))
|
||
(princ (strcat "\n ✓ Block-Einfügepunkt (mit Z):"
|
||
"\n X = " (rtos (car pt) 2 3)
|
||
"\n Y = " (rtos (cadr pt) 2 3)
|
||
"\n Z = " (rtos (caddr pt) 2 3)))
|
||
)
|
||
(progn
|
||
;; Kein Block: Verwende angeklickten Punkt
|
||
(setq pt (cadr ent))
|
||
(princ (strcat "\n ✓ Punkt auf Objekt: Z = " (rtos (caddr pt) 2 2) " mm"))
|
||
)
|
||
)
|
||
)
|
||
(progn
|
||
(princ "\n Kein Objekt gewählt.")
|
||
(setq pt nil)
|
||
)
|
||
)
|
||
pt
|
||
)
|
||
|
||
;; ============================================================
|
||
;; TEIL 5: 3D-LINIE AUSWÄHLEN (für Start- und Endpunkt mit Höhe)
|
||
;; ============================================================
|
||
(defun get-line-start-end-points (msg / ent obj obj-name start-pt end-pt)
|
||
(princ msg)
|
||
(princ "\n >> 3D-Linie oder Polylinie wählen (mit Höhendifferenz): ")
|
||
(setq ent (entsel))
|
||
(if ent
|
||
(progn
|
||
(setq obj (vlax-ename->vla-object (car ent)))
|
||
(setq obj-name (vla-get-ObjectName obj))
|
||
|
||
(cond
|
||
;; Fall 1: Es ist eine einfache Linie (AcDbLine)
|
||
((= obj-name "AcDbLine")
|
||
(setq start-pt (vlax-safearray->list
|
||
(vlax-variant-value (vla-get-StartPoint obj))))
|
||
(setq end-pt (vlax-safearray->list
|
||
(vlax-variant-value (vla-get-EndPoint obj))))
|
||
(princ (strcat "\n ✓ 3D-Linie erkannt:"
|
||
"\n Start: X=" (rtos (car start-pt) 2 2)
|
||
", Y=" (rtos (cadr start-pt) 2 2)
|
||
", Z=" (rtos (caddr start-pt) 2 2)
|
||
"\n Ende: X=" (rtos (car end-pt) 2 2)
|
||
", Y=" (rtos (cadr end-pt) 2 2)
|
||
", Z=" (rtos (caddr end-pt) 2 2)))
|
||
)
|
||
|
||
;; Fall 2: Es ist eine Polylinie (AcDbPolyline) - kann 3D-Punkte haben
|
||
((= obj-name "AcDbPolyline")
|
||
(setq start-pt (vlax-curve-getStartPoint obj))
|
||
(setq end-pt (vlax-curve-getEndPoint obj))
|
||
(princ (strcat "\n ✓ 3D-Polylinie erkannt:"
|
||
"\n Start: X=" (rtos (car start-pt) 2 2)
|
||
", Y=" (rtos (cadr start-pt) 2 2)
|
||
", Z=" (rtos (caddr start-pt) 2 2)
|
||
"\n Ende: X=" (rtos (car end-pt) 2 2)
|
||
", Y=" (rtos (cadr end-pt) 2 2)
|
||
", Z=" (rtos (caddr end-pt) 2 2)))
|
||
)
|
||
|
||
;; Fall 3: Anderer Objekttyp
|
||
(t
|
||
(princ "\n ✗ FEHLER: Keine Linie oder Polylinie ausgewählt!")
|
||
(setq start-pt nil)
|
||
(setq end-pt nil)
|
||
)
|
||
)
|
||
)
|
||
(progn
|
||
(princ "\n Kein Objekt gewählt.")
|
||
(setq start-pt nil)
|
||
(setq end-pt nil)
|
||
)
|
||
)
|
||
|
||
(if (and start-pt end-pt)
|
||
(list start-pt end-pt)
|
||
nil
|
||
)
|
||
)
|
||
;; ============================================================
|
||
;; TEIL 6: BIBLIOTHEK LADEN & MAßE EXTRAHIEREN
|
||
;; ============================================================
|
||
|
||
;; Laedt alle benoetigten Bloecke aus Einzeldateien und extrahiert KS-Masse.
|
||
(defun init-bibliothek ( / temp-obj bogen-winkel ks-data ks-ein-pos ks-aus-pos dx dy dz bogen-name)
|
||
;; (dbgf "init-bibliothek")
|
||
|
||
(if *lib-initialized*
|
||
(progn
|
||
(princ "\n Bibliothek bereits initialisiert.")
|
||
t
|
||
)
|
||
(progn
|
||
(setq *ks-cache* nil)
|
||
(princ "\n Lade Blockdefinitionen aus Einzeldateien...")
|
||
(princ (strcat "\n Block-Pfad: " block-pfad))
|
||
|
||
;; === AUS_ELEMENT / EIN_ELEMENT – beide Seiten vorladen ===
|
||
(ensure-block-loaded "_3D_AS_90_rechts")
|
||
(ensure-block-loaded "_3D_ES_90_rechts")
|
||
|
||
;; === AUS_ELEMENT Masse extrahieren (links als Referenz) ===
|
||
(princ "\n Extrahiere AUS_Element Masse...")
|
||
(ensure-block-loaded "_3D_AS_90_links")
|
||
(if (tblsearch "BLOCK" "_3D_AS_90_links")
|
||
(progn
|
||
(setq temp-obj (vla-InsertBlock modelspace
|
||
(vlax-3D-point '(0 0 0))
|
||
"_3D_AS_90_links" 1.0 1.0 1.0 0))
|
||
(setq ks-data (extract-ks-from-block temp-obj))
|
||
(vla-Delete temp-obj)
|
||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||
(foreach item ks-data
|
||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||
)
|
||
(if (and ks-ein-pos ks-aus-pos)
|
||
(progn
|
||
(setq aus-dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||
(setq aus-dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||
(setq aus-dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||
(princ (strcat "\n AUS_Element: dx=" (rtos aus-dx 2 0) ", dz=" (rtos aus-dz 2 0)))
|
||
)
|
||
(princ "\n FEHLER: KS_EIN/KS_AUS fehlt im AUS_Element!")
|
||
)
|
||
)
|
||
(princ "\n FEHLER: Block _3D_AS_90_links nicht geladen!")
|
||
)
|
||
|
||
;; === EIN_ELEMENT Masse extrahieren ===
|
||
(princ "\n Extrahiere EIN_Element Masse...")
|
||
(ensure-block-loaded "_3D_ES_90_links")
|
||
(if (tblsearch "BLOCK" "_3D_ES_90_links")
|
||
(progn
|
||
(setq temp-obj (vla-InsertBlock modelspace
|
||
(vlax-3D-point '(0 0 0))
|
||
"_3D_ES_90_links" 1.0 1.0 1.0 0))
|
||
(setq ks-data (extract-ks-from-block temp-obj))
|
||
(vla-Delete temp-obj)
|
||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||
(foreach item ks-data
|
||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||
)
|
||
(if (and ks-ein-pos ks-aus-pos)
|
||
(progn
|
||
(setq ein-dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||
(setq ein-dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||
(setq ein-dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||
(princ (strcat "\n EIN_Element: dx=" (rtos ein-dx 2 0) ", dz=" (rtos ein-dz 2 0)))
|
||
)
|
||
(princ "\n FEHLER: KS_EIN/KS_AUS fehlt im EIN_Element!")
|
||
)
|
||
)
|
||
(princ "\n FEHLER: Block _3D_ES_90_links nicht geladen!")
|
||
)
|
||
|
||
;; === Bogen-Masse extrahieren - ALLE Winkel ===
|
||
(princ "\n Extrahiere Bogen-Masse...")
|
||
(setq bogen-auf '())
|
||
(setq bogen-ab '())
|
||
(setq bogen-winkel (ssg-cfg-or "vario" "bogen_winkel" '(3 6 9 12 15 18 21 27 33 39 45 51)))
|
||
|
||
(foreach w bogen-winkel
|
||
;; Aufwaertsbogen
|
||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa w) grad-zeichen))
|
||
(ensure-block-loaded bogen-name)
|
||
(if (tblsearch "BLOCK" bogen-name)
|
||
(progn
|
||
(setq temp-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) bogen-name 1.0 1.0 1.0 0))
|
||
(setq ks-data (extract-ks-from-block temp-obj))
|
||
(vla-Delete temp-obj)
|
||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||
(foreach item ks-data
|
||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||
)
|
||
(if (and ks-ein-pos ks-aus-pos)
|
||
(progn
|
||
(setq dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||
(setq dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||
(setq dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||
(setq bogen-auf (cons (list w dx dy dz) bogen-auf))
|
||
(princ (strcat "\n OK Bogen_auf_" (itoa w) ": dx=" (rtos dx 2 0) " dz=" (rtos dz 2 0)))
|
||
)
|
||
(princ (strcat "\n FEHLER Bogen_auf_" (itoa w) ": KS_EIN/KS_AUS fehlt!"))
|
||
)
|
||
)
|
||
(princ (strcat "\n FEHLER Bogen_auf_" (itoa w) ": Block nicht geladen!"))
|
||
)
|
||
|
||
;; Abwaertsbogen
|
||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa w) grad-zeichen))
|
||
(ensure-block-loaded bogen-name)
|
||
(if (tblsearch "BLOCK" bogen-name)
|
||
(progn
|
||
(setq temp-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) bogen-name 1.0 1.0 1.0 0))
|
||
(setq ks-data (extract-ks-from-block temp-obj))
|
||
(vla-Delete temp-obj)
|
||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||
(foreach item ks-data
|
||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||
)
|
||
(if (and ks-ein-pos ks-aus-pos)
|
||
(progn
|
||
(setq dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||
(setq dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||
(setq dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||
(setq bogen-ab (cons (list w dx dy dz) bogen-ab))
|
||
(princ (strcat "\n OK Bogen_ab_" (itoa w) ": dx=" (rtos dx 2 0) " dz=" (rtos dz 2 0)))
|
||
)
|
||
(princ (strcat "\n FEHLER Bogen_ab_" (itoa w) ": KS_EIN/KS_AUS fehlt!"))
|
||
)
|
||
)
|
||
(princ (strcat "\n FEHLER Bogen_ab_" (itoa w) ": Block nicht geladen!"))
|
||
)
|
||
)
|
||
|
||
(setq bogen-auf (reverse bogen-auf))
|
||
(setq bogen-ab (reverse bogen-ab))
|
||
|
||
(setq *lib-initialized* t)
|
||
(princ "\n Bibliothek erfolgreich initialisiert.")
|
||
t
|
||
)
|
||
)
|
||
)
|
||
|
||
;; Bogen-Maß aus Tabelle holen
|
||
(defun get-bogen-mass (tabelle winkel)
|
||
;; (dbgf "get-bogen-mass")
|
||
(setq result nil)
|
||
(foreach item tabelle
|
||
(if (= (car item) winkel)
|
||
(setq result (cdr item))
|
||
)
|
||
)
|
||
(if (null result)
|
||
(princ (strcat "\n FEHLER: Winkel " (itoa winkel) " nicht in Bogen-Tabelle!"))
|
||
)
|
||
result
|
||
)
|
||
|
||
;; ============================================================
|
||
;; TEIL 7: BLOCK EINFÜGEN MIT KS_EIN AUSRICHTUNG
|
||
;; ============================================================
|
||
|
||
;; Block einfuegen OHNE Rotation/Skalierung (fuer AUS/EIN Elemente)
|
||
(defun insert-block-by-ks (blockname einfuegepunkt / block-obj ks-data ks-ein ks-aus offset ausgang)
|
||
(if (or (null einfuegepunkt) (not (listp einfuegepunkt)))
|
||
(progn
|
||
(princ (strcat "\n FEHLER: Ungueltiger Einfuegepunkt fuer '" blockname "'"))
|
||
(exit)
|
||
)
|
||
)
|
||
|
||
(if (not *lib-initialized*) (init-bibliothek))
|
||
(ensure-block-loaded blockname)
|
||
|
||
(princ (strcat "\n Fuege Block '" blockname "' ein..."))
|
||
|
||
(setq block-obj (vla-InsertBlock modelspace
|
||
(vlax-3D-point einfuegepunkt)
|
||
blockname 1.0 1.0 1.0 0))
|
||
|
||
(setq ks-data (extract-ks-from-block block-obj))
|
||
(setq ks-ein (cadr (assoc "KS_EIN" ks-data)))
|
||
(setq ks-aus (cadr (assoc "KS_AUS" ks-data)))
|
||
|
||
(if (and ks-ein ks-aus)
|
||
(progn
|
||
(setq offset (list (- (car einfuegepunkt) (car (car ks-ein)))
|
||
(- (cadr einfuegepunkt) (cadr (car ks-ein)))
|
||
(- (caddr einfuegepunkt) (caddr (car ks-ein)))))
|
||
|
||
(vla-Move block-obj
|
||
(vlax-3D-point (car ks-ein))
|
||
(vlax-3D-point einfuegepunkt))
|
||
|
||
(setq ausgang (list (+ (car (car ks-aus)) (car offset))
|
||
(+ (cadr (car ks-aus)) (cadr offset))
|
||
(+ (caddr (car ks-aus)) (caddr offset))))
|
||
|
||
(princ (strcat "\n KS_AUS: X=" (rtos (car ausgang) 2 2)
|
||
", Z=" (rtos (caddr ausgang) 2 2)))
|
||
ausgang
|
||
)
|
||
(progn
|
||
(princ "\n WARNUNG: KS_EIN/KS_AUS nicht gefunden!")
|
||
einfuegepunkt
|
||
)
|
||
)
|
||
)
|
||
|
||
;; Skalierte und geneigte Staustrecke einfügen (vereinfacht, ohne KS-Extraktion)
|
||
(defun insert-inclined-scaled-block (blockname startpunkt laenge winkel /
|
||
rad matrix block-obj endpunkt scale)
|
||
|
||
(if (<= laenge 0.1)
|
||
(progn
|
||
(princ (strcat "\n Laenge=" (rtos laenge 2 2) " mm -> uebersprungen"))
|
||
startpunkt
|
||
)
|
||
(progn
|
||
(ensure-block-loaded blockname)
|
||
(princ (strcat "\n Fuege '" blockname "' ein (Laenge=" (rtos laenge 2 2) " mm, Winkel=" (itoa winkel) "°)"))
|
||
|
||
(setq scale (/ laenge (ssg-cfg-or "vario" "skalierung_basis" 1000.0)))
|
||
(setq rad (* winkel (/ pi 180.0)))
|
||
|
||
;; Block am Ursprung einfuegen, damit TransformBy um (0,0,0) rotiert (= Block-Einfuegepunkt)
|
||
(setq block-obj (vla-InsertBlock modelspace
|
||
(vlax-3D-point '(0 0 0))
|
||
blockname scale 1.0 1.0 0))
|
||
|
||
;; Rotation um Y-Achse (rotiert jetzt korrekt um den Ursprung = Block-Einfuegepunkt)
|
||
(setq matrix (list
|
||
(list (cos rad) 0 (sin rad) 0)
|
||
(list 0 1 0 0)
|
||
(list (- (sin rad)) 0 (cos rad) 0)
|
||
(list 0 0 0 1)
|
||
))
|
||
(vla-TransformBy block-obj (vlax-tmatrix matrix))
|
||
|
||
;; Danach erst an den Startpunkt verschieben
|
||
(vla-Move block-obj
|
||
(vlax-3D-point '(0 0 0))
|
||
(vlax-3D-point startpunkt))
|
||
|
||
;; Endpunkt berechnen (für die Verkettung)
|
||
(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)))
|
||
endpunkt
|
||
)
|
||
)
|
||
)
|
||
|
||
;; Fixen Block mit Rotation einfuegen (block-dx/block-dz = Ausdehnung in Block-X/Z)
|
||
(defun insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz /
|
||
rad matrix block-obj endpunkt)
|
||
|
||
(if (or (null startpunkt) (not (listp startpunkt)))
|
||
(progn
|
||
(princ (strcat "\n FEHLER: Ungültiger Einfuegepunkt fuer '" blockname "'"))
|
||
startpunkt
|
||
)
|
||
(progn
|
||
(ensure-block-loaded blockname)
|
||
(princ (strcat "\n Fuege Block '" blockname "' ein (Rotation " (itoa winkel) "°)"))
|
||
|
||
(setq rad (* winkel (/ pi 180.0)))
|
||
|
||
;; Block am Ursprung einfuegen, damit TransformBy korrekt um (0,0,0) rotiert
|
||
(setq block-obj (vla-InsertBlock modelspace
|
||
(vlax-3D-point '(0 0 0))
|
||
blockname 1.0 1.0 1.0 0))
|
||
|
||
;; Rotation um Y-Achse
|
||
(setq matrix (list
|
||
(list (cos rad) 0 (sin rad) 0)
|
||
(list 0 1 0 0)
|
||
(list (- (sin rad)) 0 (cos rad) 0)
|
||
(list 0 0 0 1)
|
||
))
|
||
(vla-TransformBy block-obj (vlax-tmatrix matrix))
|
||
|
||
;; Danach erst an den Startpunkt verschieben
|
||
(vla-Move block-obj
|
||
(vlax-3D-point '(0 0 0))
|
||
(vlax-3D-point startpunkt))
|
||
|
||
;; Endpunkt: Rotation des (block-dx, 0, block-dz) Vektors um Y-Achse
|
||
(setq endpunkt (list
|
||
(+ (car startpunkt) (+ (* block-dx (cos rad)) (* block-dz (sin rad))))
|
||
(cadr startpunkt)
|
||
(+ (caddr startpunkt) (+ (* (- (sin rad)) block-dx) (* (cos rad) block-dz)))))
|
||
|
||
(princ (strcat "\n Endpunkt: X=" (rtos (car endpunkt) 2 2) " Z=" (rtos (caddr endpunkt) 2 2)))
|
||
endpunkt
|
||
)
|
||
)
|
||
)
|
||
;; ============================================================
|
||
;; TEIL 8: WINKELBERECHNUNG (NUR MIT BIBLIOTHEKSDATEN)
|
||
;; ============================================================
|
||
(defun berechne-alle-winkel (deltaL deltaH richtung /
|
||
winkel-list ergebnis-liste A B cos3 sin3
|
||
bogen-x1 bogen-z1 bogen-x2 bogen-z2
|
||
abs-dz-AUS abs-dz-EIN L_GF L_VF cosα sinα
|
||
winkel-eff cosEff sinEff rad5 rad7
|
||
winkel mass1 mass2 gueltig
|
||
best-winkel best-L_GF best-L_VF)
|
||
;; (dbgf "berechne-alle-winkel")
|
||
|
||
;; Bibliothek muss initialisiert sein
|
||
(if (not *lib-initialized*)
|
||
(progn
|
||
(alert "Bibliothek nicht initialisiert!\nBefehl abbrechen und neu starten.")
|
||
(exit)
|
||
)
|
||
)
|
||
|
||
(setq abs-dz-AUS (abs aus-dz) abs-dz-EIN (abs ein-dz))
|
||
|
||
;; ALLE in der Bibliothek verfügbaren Winkel
|
||
(setq winkel-list (ssg-cfg-or "vario" "bogen_winkel" '(3 6 9 12 15 18 21 27 33 39 45 51)))
|
||
|
||
(setq ergebnis-liste '())
|
||
(setq cos3 (cos (* (ssg-cfg-or "vario" "gefaelle_winkel" 3) (/ pi 180.0)))
|
||
sin3 (sin (* (ssg-cfg-or "vario" "gefaelle_winkel" 3) (/ pi 180.0))))
|
||
|
||
(princ "\n\n=========================================\n BERECHNUNG FÜR ALLE WINKEL\n=========================================")
|
||
(princ (strcat "\nΔL = " (rtos deltaL 2 2) " mm\nΔH = " (rtos deltaH 2 2) " mm\nRichtung: " richtung))
|
||
(princ "\n\n Winkel Bogen-Name (Auf) Bogen-Name (Ab)")
|
||
(princ "\n ---------------------------------------------------")
|
||
|
||
(foreach winkel winkel-list
|
||
;; Schritt 5: Bogen bei Rotation=3° ("Auf"→bogen-auf, "Ab"→bogen-ab)
|
||
;; Schritt 7: Bogen bei Rotation=(3-winkel)° ("Auf"→bogen-ab, "Ab"→bogen-auf)
|
||
(if (= richtung "Auf")
|
||
(progn
|
||
(setq mass1 (get-bogen-mass bogen-auf winkel))
|
||
(setq mass2 (get-bogen-mass bogen-ab winkel))
|
||
)
|
||
(progn
|
||
(setq mass1 (get-bogen-mass bogen-ab winkel))
|
||
(setq mass2 (get-bogen-mass bogen-auf winkel))
|
||
)
|
||
)
|
||
|
||
;; Debug-Ausgabe: Welcher Bogen wird verwendet?
|
||
(if (= richtung "Auf")
|
||
(princ (strcat "\n " (itoa winkel) "° Vario_Bogen_auf_" (itoa winkel) "°"))
|
||
(princ (strcat "\n " (itoa winkel) "° Vario_Bogen_ab_" (itoa winkel) "°"))
|
||
)
|
||
|
||
(if (or (null mass1) (null mass2))
|
||
(progn
|
||
(princ (strcat " → ⚠ NICHT VORHANDEN"))
|
||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||
)
|
||
(progn
|
||
(princ (strcat " → ✓ geladen (dx=" (rtos (car mass1) 2 0) ", dz=" (rtos (caddr mass1) 2 0) ")"))
|
||
|
||
;; Rotierte Bogen-Vorschübe (exakte Geometrie gemaess insert-rotated-block-with-ks):
|
||
;; Δx = dx*cos(rad) + dz*sin(rad)
|
||
;; Δz = -dx*sin(rad) + dz*cos(rad)
|
||
;; Schritt 5: Rotation = 3°
|
||
;; Schritt 7: Rotation = (3 - winkel)°
|
||
(setq rad5 (* 3.0 (/ pi 180.0)))
|
||
(setq rad7 (* (float (if (= richtung "Auf") (- 3 winkel) (+ winkel 3))) (/ pi 180.0)))
|
||
|
||
(setq bogen-x1 (+ (* (car mass1) (cos rad5)) (* (caddr mass1) (sin rad5))))
|
||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad5)) (* (caddr mass1) (cos rad5))))
|
||
(setq bogen-x2 (+ (* (car mass2) (cos rad7)) (* (caddr mass2) (sin rad7))))
|
||
(setq bogen-z2 (+ (* (- (car mass2)) (sin rad7)) (* (caddr mass2) (cos rad7))))
|
||
|
||
(setq cosα (cos (* winkel (/ pi 180.0))) sinα (sin (* winkel (/ pi 180.0))))
|
||
(setq A (- deltaL aus-dx ein-dx bogen-x1 bogen-x2 (* FESTE_HORIZONTAL cos3)))
|
||
|
||
;; Effektiver L_VF-Winkel: "Auf" → alpha-3, "Ab" → alpha+3
|
||
(setq winkel-eff (if (= richtung "Auf") (- winkel 3) (+ winkel 3)))
|
||
(setq cosEff (cos (* winkel-eff (/ pi 180.0))))
|
||
(setq sinEff (sin (* winkel-eff (/ pi 180.0))))
|
||
|
||
;; B-Berechnung:
|
||
;; "Auf": L_VF geht RAUF → B = deltaH + |dz_AUS| + |dz_EIN| - b5z - b7z + FESTE*sin3
|
||
;; "Ab": L_VF geht RUNTER → B = deltaH - |dz_AUS| - |dz_EIN| - FESTE*sin3 + b5z + b7z
|
||
(if (= richtung "Auf")
|
||
(setq B (+ deltaH abs-dz-AUS abs-dz-EIN (- bogen-z1) (- bogen-z2) (* FESTE_HORIZONTAL sin3)))
|
||
(setq B (+ (- deltaH abs-dz-AUS abs-dz-EIN (* FESTE_HORIZONTAL sin3)) bogen-z1 bogen-z2))
|
||
)
|
||
|
||
;; Gleichungssystem (L_GF = Gesamtlaenge beider GF-Strecken):
|
||
;; L_GF*cos3 + L_VF*cosEff = A
|
||
;; ±L_GF*sin3 + L_VF*sinEff = B
|
||
;; Loesung:
|
||
;; L_GF = (A*sinEff - B*cosEff) / sinα
|
||
;; L_VF = (A*sin3 +/- B*cos3) / sinα
|
||
(if (> (abs sinα) 0.0001)
|
||
(progn
|
||
(setq L_GF (/ (- (* A sinEff) (* B cosEff)) sinα))
|
||
(if (= richtung "Auf")
|
||
(setq L_VF (/ (+ (* A sin3) (* B cos3)) sinα))
|
||
(setq L_VF (/ (- (* B cos3) (* A sin3)) sinα))
|
||
)
|
||
(if (and (numberp L_GF) (numberp L_VF))
|
||
(progn
|
||
(setq gueltig (and (>= L_GF 0) (>= L_VF 0)))
|
||
(setq ergebnis-liste (cons (list winkel L_GF L_VF gueltig) ergebnis-liste))
|
||
)
|
||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||
)
|
||
)
|
||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||
)
|
||
)
|
||
)
|
||
)
|
||
|
||
(setq ergebnis-liste (reverse ergebnis-liste))
|
||
|
||
;; Ausgabe der Ergebnisse
|
||
(princ "\n\n=================================================================================\n ERGEBNISTABELLE\n=================================================================================")
|
||
(princ "\n Winkel L_GF (mm) L_VF (mm) Status\n=================================================================================")
|
||
|
||
(setq best-winkel nil best-L_GF nil best-L_VF nil)
|
||
(foreach item ergebnis-liste
|
||
(setq winkel (car item) L_GF (cadr item) L_VF (caddr item) gueltig (cadddr item))
|
||
(if (and (numberp L_GF) (numberp L_VF))
|
||
(progn
|
||
(princ (strcat "\n " (itoa winkel) "° " (fmt L_GF) " mm " (fmt L_VF) " mm "))
|
||
(if gueltig
|
||
(progn
|
||
(princ "✓ GÜLTIG")
|
||
;; Wähle den kleinsten gültigen Winkel (wegen Herstellungskosten)
|
||
(if (or (null best-winkel) (< winkel best-winkel))
|
||
(setq best-winkel winkel best-L_GF L_GF best-L_VF L_VF)
|
||
)
|
||
)
|
||
(princ "✗ UNGÜLTIG (negative Länge)")
|
||
)
|
||
)
|
||
(princ (strcat "\n " (itoa winkel) "° --- --- ✗ FEHLER"))
|
||
)
|
||
)
|
||
(princ "\n=================================================================================")
|
||
|
||
;; Ausgabe des empfohelnen Winkels
|
||
(if best-winkel
|
||
(princ (strcat "\n\n>>> Empfohlener Winkel: " (itoa best-winkel)
|
||
"° (kleinster verfuegbarer Winkel)"))
|
||
(princ "\n\n>>> KEIN passender Winkel gefunden!"))
|
||
|
||
(list best-winkel best-L_GF best-L_VF ergebnis-liste)
|
||
)
|
||
|
||
;; ============================================================
|
||
;; TEIL 9: MODULE EINFÜGEN (GESAMTE ANLAGE)
|
||
;; ============================================================
|
||
(defun foerderanlage-einfuegen (deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite
|
||
/ aktueller-punkt bogen-name endpunkt bogen-mass bogen-dx bogen-dz
|
||
as-block es-block)
|
||
(setq aktueller-punkt startpunkt)
|
||
(setq as-block (strcat "_3D_AS_90_" seite))
|
||
(setq es-block (strcat "_3D_ES_90_" seite))
|
||
|
||
(if (not *lib-initialized*) (init-bibliothek))
|
||
|
||
;; 1. AUS_Element
|
||
(princ (strcat "\n\n1/11: " as-block " (0°)"))
|
||
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt))
|
||
|
||
;; 2. 1. Gefällestrecke
|
||
(if (> L_GF1 0.1)
|
||
(progn
|
||
(princ (strcat "\n\n2/11: Gefaellestrecke (3°, Laenge=" (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)))
|
||
)
|
||
(princ "\n\n2/11: (uebersprungen)")
|
||
)
|
||
|
||
;; 3. Separator
|
||
(princ "\n\n3/11: Separator (300mm, 3° geneigt)")
|
||
(setq aktueller-punkt (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)))
|
||
|
||
;; 4. Umlenkstation – Rotation um 3° um Y-Achse
|
||
(princ "\n\n4/11: Umlenkstation (500mm, 3° geneigt)")
|
||
(setq aktueller-punkt (insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 0
|
||
(ssg-cfg-or "vario" "station_block_dx" 499)
|
||
(ssg-cfg-or "vario" "station_block_dz" -26)))
|
||
|
||
;; 5. 1. Vertikalbogen
|
||
(if (= richtung "Auf")
|
||
(progn
|
||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel) grad-zeichen))
|
||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||
)
|
||
(progn
|
||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel) grad-zeichen))
|
||
(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° geneigt)"))
|
||
(setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt (ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz))
|
||
|
||
;; 6. Variable Strecke L_VF
|
||
(if (> L_VF 0.1)
|
||
(progn
|
||
(if (= richtung "Auf")
|
||
(progn
|
||
(princ (strcat "\n\n6/11: Steigungsstrecke (" (itoa (- (- best-winkel 3))) "°, Laenge=" (rtos L_VF 2 2) " mm)"))
|
||
(setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_VF (- (- best-winkel 3))))
|
||
)
|
||
(progn
|
||
(princ (strcat "\n\n6/11: Gefaellestrecke (" (itoa (+ best-winkel 3)) "°, Laenge=" (rtos L_VF 2 2) " mm)"))
|
||
(setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_VF (+ best-winkel 3)))
|
||
)
|
||
)
|
||
)
|
||
(princ "\n\n6/11: (uebersprungen)")
|
||
)
|
||
|
||
;; 7. 2. Vertikalbogen
|
||
(if (= richtung "Auf")
|
||
(progn
|
||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel) grad-zeichen))
|
||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||
)
|
||
(progn
|
||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel) grad-zeichen))
|
||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||
)
|
||
)
|
||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||
(if (= richtung "Auf")
|
||
(progn
|
||
(princ (strcat "\n\n7/11: " bogen-name " (" (itoa (- 3 best-winkel)) "° geneigt)"))
|
||
(setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt (- 3 best-winkel) bogen-dx bogen-dz))
|
||
)
|
||
(progn
|
||
(princ (strcat "\n\n7/11: " bogen-name " (" (itoa (+ best-winkel 3)) "° geneigt)"))
|
||
(setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt (+ best-winkel 3) bogen-dx bogen-dz))
|
||
)
|
||
)
|
||
|
||
;; 8. Motorstation – Rotation um 3° um Y-Achse
|
||
(princ "\n\n8/11: Motorstation (500mm, 3° geneigt)")
|
||
(setq aktueller-punkt (insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 0
|
||
(ssg-cfg-or "vario" "station_block_dx" 499)
|
||
(ssg-cfg-or "vario" "station_block_dz" -26)))
|
||
|
||
;; 9. 2. Gefällestrecke
|
||
(if (> L_GF2 0.1)
|
||
(progn
|
||
(princ (strcat "\n\n9/11: Gefaellestrecke (3°, Laenge=" (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)))
|
||
)
|
||
(princ "\n\n9/11: (uebersprungen)")
|
||
)
|
||
|
||
;; 10. Separator 2
|
||
(princ "\n\n10/11: Separator (300mm, 3° geneigt)")
|
||
(setq aktueller-punkt (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)))
|
||
|
||
;; 11. EIN_Element
|
||
(princ (strcat "\n\n11/11: " es-block " (0°)"))
|
||
(setq endpunkt (insert-block-by-ks es-block aktueller-punkt))
|
||
|
||
(princ "\n\n=========================================")
|
||
(princ "\n>>> Förderanlage erfolgreich eingefügt! <<<")
|
||
(princ "\n=========================================")
|
||
|
||
endpunkt
|
||
)
|
||
;; ============================================================
|
||
;; TEIL 10: HAUPTFUNKTION
|
||
;; ============================================================
|
||
(defun c:FOERDERANLAGE ( / eingabe-modus line-points startpunkt endpunkt differenz
|
||
deltaL deltaH deltaX deltaY richtung ergebnis
|
||
best-winkel L_GF L_GF1 L_GF2 L_VF ergebnis-liste
|
||
antwort verteilung-modus
|
||
gueltige-winkel idx eintrag wahl
|
||
seite)
|
||
;; (dbgf "c:FOERDERANLAGE")
|
||
|
||
(princ "\n=========================================")
|
||
(princ "\n FÖRDERANLAGE GENERATOR v25.0")
|
||
(princ "\n (Komplett bibliotheksbasiert)")
|
||
(princ "\n=========================================")
|
||
|
||
;; Bibliothek initialisieren
|
||
(if (not (init-bibliothek))
|
||
(progn
|
||
(alert "Fehler beim Initialisieren der Bibliothek!\nBitte Pfade prüfen.")
|
||
(exit)
|
||
)
|
||
)
|
||
|
||
(princ "\n\nEingabemodus wählen:")
|
||
(princ "\n 1 - 3D-Linie auswählen (Start- und Endpunkt mit Höhe)")
|
||
(princ "\n 2 - Werte manuell eingeben")
|
||
(setq antwort (getstring "\nIhre Wahl (1/2): "))
|
||
|
||
(cond
|
||
((= antwort "1") (setq eingabe-modus "Linie"))
|
||
((= antwort "2") (setq eingabe-modus "Wert"))
|
||
(t (setq eingabe-modus "Linie") (princ "\nUngültige Eingabe, Modus '3D-Linie auswählen'"))
|
||
)
|
||
|
||
(if (= eingabe-modus "Linie")
|
||
(progn
|
||
(princ "\n\n>>> MODUS: 3D-Linie auswählen <<<")
|
||
;; BKS auf WCS setzen für korrekte Z-Erfassung
|
||
(command "BKS" "W")
|
||
(princ "\n✓ BKS auf Weltkoordinaten gesetzt - Z-Höhe wird korrekt erfasst!")
|
||
|
||
|
||
(setq line-points
|
||
(get-line-start-end-points
|
||
"\nBitte 3D-Linie (oder Polylinie) für die Förderstrecke auswählen:"))
|
||
|
||
(if (null line-points)
|
||
(progn (alert "Keine gültige Linie ausgewählt!") (exit))
|
||
)
|
||
|
||
(setq startpunkt (car line-points))
|
||
(setq endpunkt (cadr line-points))
|
||
|
||
(princ (strcat "\n → Start-Z-Höhe: " (rtos (caddr startpunkt) 2 2) " mm"))
|
||
(princ (strcat "\n → End-Z-Höhe: " (rtos (caddr endpunkt) 2 2) " mm"))
|
||
|
||
(setq differenz (punkt-differenz startpunkt endpunkt))
|
||
(setq deltaX (abs (car differenz)))
|
||
(setq deltaY (abs (cadr differenz)))
|
||
(setq deltaH (caddr differenz))
|
||
|
||
;; Verwende die größere horizontale Distanz als Förderlänge
|
||
(setq deltaL (max deltaX deltaY))
|
||
|
||
(princ (strcat "\n → Horizontale Distanzen: ΔX = " (rtos deltaX 2 2) " mm, ΔY = " (rtos deltaY 2 2) " mm"))
|
||
(princ (strcat "\n → Gewählte Förderlänge ΔL = " (rtos deltaL 2 2) " mm (die größere Distanz)"))
|
||
(princ "\n\n=========================================")
|
||
(princ (strcat "\nGemessene Werte (aus 3D-Linie):\n ΔL = " (rtos deltaL 2 2) " mm\n ΔH = " (rtos deltaH 2 2) " mm"))
|
||
|
||
;; Richtung der Förderanlage (X oder Y) - für spätere Rotation
|
||
(if (> deltaY deltaX)
|
||
(princ "\n → Förderanlage wird in Y-Richtung erstellt")
|
||
(princ "\n → Förderanlage wird in X-Richtung erstellt")
|
||
)
|
||
|
||
(if (>= deltaH 0)
|
||
(progn (setq richtung "Auf") (princ "\n\nFörderrichtung: AUF (nach oben)"))
|
||
(progn (setq richtung "Ab") (setq deltaH (abs deltaH)) (princ "\n\nFörderrichtung: AB (nach unten)"))
|
||
)
|
||
|
||
(setq startpunkt-fuer-einfuegen startpunkt)
|
||
)
|
||
(progn
|
||
(princ "\n\n>>> MODUS: Manuelle Werteingabe <<<")
|
||
(setq deltaL (getreal "\nHorizontale Distanz ΔL (mm): "))
|
||
(if (null deltaL) (setq deltaL 15000))
|
||
(setq deltaH (getreal "\nHöhendifferenz |ΔH| (mm): "))
|
||
(if (null deltaH) (setq deltaH 3000))
|
||
(princ "\nFörderrichtung wählen:\n 1 - AUF (nach oben)\n 2 - AB (nach unten)")
|
||
(setq antwort (getstring "\nIhre Wahl (1/2): "))
|
||
(if (= antwort "2") (setq richtung "Ab") (setq richtung "Auf"))
|
||
(setq startpunkt-fuer-einfuegen (getpoint "\nStartpunkt für AUS_Element wählen: "))
|
||
(if (null startpunkt-fuer-einfuegen) (setq startpunkt-fuer-einfuegen '(0 0 0)))
|
||
)
|
||
)
|
||
|
||
;; Berechnung
|
||
(setq ergebnis (berechne-alle-winkel deltaL deltaH richtung))
|
||
(setq ergebnis-liste (cadddr ergebnis))
|
||
|
||
;; Gueltige Winkel ermitteln
|
||
(setq gueltige-winkel
|
||
(mapcar 'car
|
||
(vl-remove-if-not
|
||
(function (lambda (e) (and (nth 3 e)
|
||
(numberp (nth 1 e)) (numberp (nth 2 e))
|
||
(>= (nth 1 e) 0) (>= (nth 2 e) 0))))
|
||
ergebnis-liste)))
|
||
|
||
(if (null gueltige-winkel)
|
||
(progn
|
||
(alert (strcat "Kein passender Winkel gefunden!\n\n"
|
||
"DeltaL=" (rtos deltaL 2 0) " mm, DeltaH=" (rtos deltaH 2 0)
|
||
" mm, Richtung=" richtung "\nBitte andere Werte versuchen."))
|
||
(exit)
|
||
)
|
||
)
|
||
|
||
;; Winkelauswahl: bei einem Winkel automatisch, bei mehreren Dialog
|
||
(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>>> Nur ein gueltiger Winkel: " (itoa best-winkel) grad-zeichen))
|
||
)
|
||
(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) grad-zeichen
|
||
" (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-"
|
||
(itoa (length gueltige-winkel)) ") [1]: ")))
|
||
(if (or (null wahl) (< wahl 1) (> wahl (length gueltige-winkel)))
|
||
(setq wahl 1))
|
||
(setq best-winkel (nth (1- wahl) gueltige-winkel))
|
||
(setq eintrag (assoc best-winkel ergebnis-liste))
|
||
(setq L_GF (nth 1 eintrag) L_VF (nth 2 eintrag))
|
||
)
|
||
)
|
||
|
||
(princ "\n\n=========================================")
|
||
(princ (strcat "\n>>> Gewaehlter Winkel: " (itoa best-winkel) grad-zeichen))
|
||
(princ (strcat "\n>>> L_GF (gesamt): " (rtos L_GF 2 2) " mm"))
|
||
(princ (strcat "\n>>> L_VF: " (rtos L_VF 2 2) " mm"))
|
||
(princ "\n=========================================")
|
||
|
||
;; Seite: links oder rechts
|
||
(princ "\n\nEin-/Auselement - Seite waehlen:")
|
||
(princ "\n 1 - Links (_3D_AS_90_links / _3D_ES_90_links)")
|
||
(princ "\n 2 - Rechts (_3D_AS_90_rechts / _3D_ES_90_rechts)")
|
||
(setq antwort (getstring "\nIhre Wahl (1/2) [1]: "))
|
||
(if (= antwort "2")
|
||
(setq seite "rechts")
|
||
(setq seite "links")
|
||
)
|
||
(princ (strcat "\n>>> Seite: " seite))
|
||
|
||
;; Verteilung der Gefällestrecken
|
||
(princ "\n\nVerteilung der Gefaellestrecken (vorne/hinten):")
|
||
(princ "\n 1 - Gleichmaessig (L_GF1 = L_GF2 = L_GF/2)")
|
||
(princ "\n 2 - Vorne Minimum, hinten Rest")
|
||
(princ "\n 3 - Hinten Minimum, vorne Rest")
|
||
(princ "\n 4 - Eigene Werte eingeben")
|
||
(setq verteilung-modus (getstring "\nIhre Wahl (1/2/3/4) [1]: "))
|
||
(if (= verteilung-modus "") (setq verteilung-modus "1"))
|
||
|
||
(cond
|
||
((= verteilung-modus "1")
|
||
(setq L_GF1 (/ L_GF 2.0) L_GF2 (/ L_GF 2.0)))
|
||
((= verteilung-modus "2")
|
||
(setq L_GF1 staustrecke-basis)
|
||
(setq L_GF2 (- L_GF staustrecke-basis))
|
||
(if (< L_GF2 0) (setq L_GF2 0)))
|
||
((= verteilung-modus "3")
|
||
(setq L_GF2 staustrecke-basis)
|
||
(setq L_GF1 (- L_GF staustrecke-basis))
|
||
(if (< L_GF1 0) (setq L_GF1 0)))
|
||
((= verteilung-modus "4")
|
||
(setq L_GF1 (getreal (strcat "\nL_GF1 vorne (mm) [" (rtos (/ L_GF 2.0) 2 2) "]: ")))
|
||
(if (null L_GF1) (setq L_GF1 (/ L_GF 2.0)))
|
||
(setq L_GF2 (- L_GF L_GF1))
|
||
(if (< L_GF2 0) (setq L_GF2 0))
|
||
(princ (strcat "\n L_GF2 hinten (berechnet): " (rtos L_GF2 2 2) " mm")))
|
||
(t
|
||
(setq L_GF1 (/ L_GF 2.0) L_GF2 (/ L_GF 2.0)))
|
||
)
|
||
|
||
(princ (strcat "\n\n>>> L_GF1 (vorne): " (rtos L_GF1 2 2) " mm"))
|
||
(princ (strcat "\n>>> L_GF2 (hinten): " (rtos L_GF2 2 2) " mm"))
|
||
|
||
(princ "\n\nMöchten Sie die Förderanlage einfügen?\n 1 - Ja, Module einfügen\n 2 - Nein, abbrechen")
|
||
(setq antwort (getstring "\nIhre Wahl (1/2): "))
|
||
|
||
(if (= antwort "1")
|
||
(foerderanlage-einfuegen deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt-fuer-einfuegen seite)
|
||
(princ "\nVorgang abgebrochen.")
|
||
)
|
||
|
||
nil
|
||
)
|
||
;; ============================================================
|
||
;; START
|
||
;; ============================================================
|
||
(princ "\n=========================================")
|
||
(princ "\n>>> FOERDERANLAGE GENERATOR v25.0 geladen <<<")
|
||
(princ "\n>>> Befehle: FOERDERANLAGE <<<")
|
||
(princ "\n>>> 100% bibliotheksbasiert - KEINE Fallbacks <<<")
|
||
(princ "\n=========================================")
|
||
(princ) |