Files
dxfmakros/Lisp/VarioFoerderer.lsp
T

1159 lines
45 KiB
Common Lisp
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;; ============================================================
;; 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)
;; Kern-Abhaengigkeiten sicherstellen (fuer direktes Laden ohne Menu-System)
(if (not *ssg-core-loaded*)
(if (getenv "DXFM_LISP")
(progn
(load (strcat (getenv "DXFM_LISP") "/ssg_core.lsp"))
(ssg-load-config)
(setq *ssg-core-loaded* t)
)
(alert "DXFM_LISP nicht gesetzt! Bitte zuerst bin\\setenv.bat ausfuehren.")
)
)
(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 1000) ;; Standardwert; wird in c:FOERDERANLAGE via ssg-cfg-or ueberschrieben
(setq 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 (ssg-cfg-or "vario" "gefaelle_winkel" 3)
(ssg-cfg-or "vario" "station_block_dx" 500)
(ssg-cfg-or "vario" "station_block_dz" 0)))
;; 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 (ssg-cfg-or "vario" "gefaelle_winkel" 3)
(ssg-cfg-or "vario" "station_block_dx" 500)
(ssg-cfg-or "vario" "station_block_dz" 0)))
;; 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)
)
)
;; Konfigurationswerte laden (ssg-core muss bereits geladen sein)
(setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000))
(setq FESTE_HORIZONTAL (ssg-cfg-or "vario" "feste_horizontal" 1600))
(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)