;; ============================================================ ;; 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/.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)