Compare commits

...

3 Commits

3 changed files with 216 additions and 176 deletions
+169 -102
View File
@@ -41,7 +41,7 @@
;; Setze auf t für dynamische Berechnung aus .dwg-Dateien
;; Setze auf nil für feste, hartkodierte Werte
;; ============================================================
(setq use-dynamic-bbox t) ;; Ändere hier: t = dynamisch, nil = hartkodiert
(setq use-dynamic-bbox nil) ;; Ändere hier: t = dynamisch, nil = hartkodiert
;; ============================================================
;; Feste, hartkodierte Bogen-Tabellen (Fallback)
@@ -167,52 +167,30 @@
)
;; ============================================================
;; 🔥 METHODE 1: Für rotierte Blöcke (Staustrecken, Separator, Spannstation, Motorstation)
;; X = berechnet aus Länge * cos(Winkel)
;; Z = aus BoundingBox
;; METHODE 1: Für rotierte Blöcke (Staustrecken, Separator, Spannstation, Motorstation)
;; X = L * cos(Winkel)
;; Z = -L * sin(Winkel) (negative sin wegen Rotation um Y-Achse)
;; ============================================================
(defun get-block-endpoint-rotated (obj startpunkt winkel laenge)
(defun get-block-endpoint-rotated (startpunkt winkel laenge)
(setq rad (* winkel (/ pi 180.0)))
(setq berechnete_dx (* laenge (cos rad)))
(vla-GetBoundingBox obj 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt))
(setq maxpt (vlax-safearray->list maxpt))
(setq reale_dz (- (caddr maxpt) (caddr minpt)))
(list (+ (car startpunkt) berechnete_dx)
(list (+ (car startpunkt) (* laenge (cos rad)))
(cadr startpunkt)
(+ (caddr startpunkt) reale_dz))
(+ (caddr startpunkt) (* (- (sin rad)) laenge)))
)
;; ============================================================
;; 🔥 METHODE 2: Für nicht-rotierte Blöcke (AUS_Element, EIN_Element)
;; X und Z aus BoundingBox (relativ zum Startpunkt)
;; METHODE 2: Für nicht-rotierte Blöcke (AUS_Element, EIN_Element)
;; Verwendet feste dx/dy/dz Werte
;; ============================================================
(defun get-block-endpoint-nonrotated (obj startpunkt)
(vla-GetBoundingBox obj 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt))
(setq maxpt (vlax-safearray->list maxpt))
(list (+ (car startpunkt) (- (car maxpt) (car minpt))) ;; Relative DX
(cadr startpunkt) ;; Y unverändert
(+ (caddr startpunkt) (- (caddr maxpt) (caddr minpt)))) ;; Relative DZ
)
;; ============================================================
;; 🔥 METHODE 3: Für Vertikalbögen
;; X aus Tabelle (vordefinierte Werte)
;; Z aus BoundingBox
;; METHODE 3: Für Vertikalbögen
;; X aus Tabelle, Z aus Tabelle (nicht BoundingBox!)
;; ============================================================
(defun get-block-endpoint-bogen (obj startpunkt bogen-x)
(vla-GetBoundingBox obj 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt))
(setq maxpt (vlax-safearray->list maxpt))
(setq reale_dz (- (caddr maxpt) (caddr minpt)))
(list (+ (car startpunkt) bogen-x) ;; X aus Tabelle
(defun get-block-endpoint-bogen (startpunkt bogen-x bogen-dz)
(list (+ (car startpunkt) bogen-x)
(cadr startpunkt)
(+ (caddr startpunkt) reale_dz)) ;; Z aus BBox
(+ (caddr startpunkt) bogen-dz))
)
;; ============================================================
@@ -300,244 +278,286 @@
;; ============================================================
;; TEIL 6: MODULE EINFÜGEN (mit korrigierter Methodenzuordnung)
;; ============================================================
(defun foerderanlage-einfuegen (deltaL deltaH richtung
(defun foerderanlage-einfuegen (deltaL deltaH richtung
best-winkel L_GF L_VF startpunkt)
(setq aktueller-punkt startpunkt)
(setq L_GF1 (/ L_GF 2))
(setq L_GF2 (/ L_GF 2))
(princ "\n\n=========================================")
(princ "\nBeginne mit dem Einfügen der Module...")
(princ "\n=========================================")
(princ (strcat "\nStartpunkt (AUS_Element Eingang): X=" (rtos (car aktueller-punkt) 2 2)
(princ (strcat "\n[START] X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
;; ==========================================================
;; 1. AUS_Element_links - Verwenden Sie die manuellen Werte
;; 1. AUS_Element_links
;; ==========================================================
(princ "\n\n1/11: AUS_Element_links")
(setq blockname (strcat modul-pfad "AUS_Element_links.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
;; Verwenden Sie die manuellen Werte statt BoundingBox
(setq aktueller-punkt (list
(setq aktueller-punkt (list
(+ (car aktueller-punkt) aus-dx)
(+ (cadr aktueller-punkt) aus-dy)
(+ (caddr aktueller-punkt) aus-dz)))
(princ (strcat "\n → AUS_Element Ausgang (manuell): X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ "\n FEHLER: AUS_Element_links.dwg nicht gefunden.")
)
;; ==========================================================
;; 2. 1. GEFÄLLESTRECKE (L_GF1) (METHODE 1: rotiert, X per cos, Z per BBox)
;; 2. 1. GEFÄLLESTRECKE (L_GF1)
;; ==========================================================
(if (> L_GF1 0.1)
(progn
(princ (strcat "\n2/11: Staustrecke (3° nach unten, Länge=" (rtos L_GF1 2 2) " mm)"))
(princ (strcat "\n\n2/11: Staustrecke (3 Grad, Laenge=" (rtos L_GF1 2 2) " mm)"))
(setq blockname (strcat modul-pfad "Staustrecke_SP_1000_mm.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt (/ L_GF1 1000.0)))
(Rotate3D-Y block aktueller-punkt 3)
(setq aktueller-punkt (get-block-endpoint-rotated block aktueller-punkt 3 L_GF1))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq aktueller-punkt (get-block-endpoint-rotated aktueller-punkt 3 L_GF1))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ (strcat "\n FEHLER: Blockdatei nicht gefunden: " blockname))
)
)
(princ "\n2/11: (übersprungen, L_GF1 = 0)")
(princ "\n2/11: (uebersprungen, L_GF1 = 0)")
)
;; ==========================================================
;; 3. SEPARATOR 1 (METHODE 1: rotiert, X per cos, Z per BBox)
;; 3. SEPARATOR 1
;; ==========================================================
(princ "\n3/11: Separator 300mm (3° nach unten)")
(princ "\n\n3/11: Separator 300mm (3 Grad)")
(setq blockname (strcat modul-pfad "Staustrecke_Separator_SP_300_mm.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
(Rotate3D-Y block aktueller-punkt 3)
(setq aktueller-punkt (get-block-endpoint-rotated block aktueller-punkt 3 separator-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq aktueller-punkt (get-block-endpoint-rotated aktueller-punkt 3 separator-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ "\n FEHLER: Separator 1 Datei nicht gefunden.")
)
;; ==========================================================
;; 4. SPANNSTATION (METHODE 1: rotiert, X per cos, Z per BBox)
;; 4. SPANNSTATION
;; ==========================================================
(princ "\n4/11: Spannstation 500mm (3° nach unten)")
(princ "\n\n4/11: Spannstation 500mm (3 Grad)")
(setq blockname (strcat modul-pfad "Vario_Spannstation_SP_500mm.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
(Rotate3D-Y block aktueller-punkt 3)
(setq aktueller-punkt (get-block-endpoint-rotated block aktueller-punkt 3 spannstation-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq aktueller-punkt (get-block-endpoint-rotated aktueller-punkt 3 spannstation-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ "\n FEHLER: Spannstation Datei nicht gefunden.")
)
;; ==========================================================
;; 5. 1. VERTIKALBOGEN (METHODE 3: X aus Tabelle, Z aus BoundingBox)
;; 5. 1. VERTIKALBOGEN (X und Z aus Tabelle)
;; ==========================================================
(if (= richtung "Auf")
(progn
(princ (strcat "\n5/11: Vertikalbogen_Auf_" (itoa best-winkel) "_Unten"))
(princ (strcat "\n\n5/11: Vertikalbogen_Auf_" (itoa best-winkel) "_Unten"))
(setq blockname (strcat modul-pfad "Vertikalbogen_Auf_" (itoa best-winkel) "_Unten.dwg"))
(setq bogen-mass (get-bogen-mass bogen-auf-unten best-winkel))
)
(progn
(princ (strcat "\n5/11: Vertikalbogen_Ab_" (itoa best-winkel) "_Oben"))
(princ (strcat "\n\n5/11: Vertikalbogen_Ab_" (itoa best-winkel) "_Oben"))
(setq blockname (strcat modul-pfad "Vertikalbogen_Ab_" (itoa best-winkel) "_Oben.dwg"))
(setq bogen-mass (get-bogen-mass-mit-abs bogen-ab-oben best-winkel))
(setq bogen-mass (get-bogen-mass bogen-ab-oben best-winkel))
)
)
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
;; KEINE Rotation! Der Bogen ist bereits richtig ausgerichtet
(setq bogen-x (car bogen-mass))
(setq aktueller-punkt (get-block-endpoint-bogen block aktueller-punkt bogen-x))
(princ (strcat "\n → Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq bogen-dz (caddr bogen-mass))
(princ (strcat "\n Tabelle: dx=" (rtos bogen-x 2 2) ", dz=" (rtos bogen-dz 2 2)))
(setq aktueller-punkt (get-block-endpoint-bogen aktueller-punkt bogen-x bogen-dz))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ (strcat "\n FEHLER: Bogen-Datei nicht gefunden: " blockname))
)
;; ==========================================================
;; 6. VARIABLE STRECKE L_VF (METHODE 1: rotiert, X per cos, Z per BBox)
;; 6. VARIABLE STRECKE L_VF
;; ==========================================================
(if (> L_VF 0.1)
(progn
(if (= richtung "Auf")
(progn
(princ (strcat "\n6/11: Steigungsstrecke (" (itoa best-winkel) "° nach oben, Länge=" (rtos L_VF 2 2) " mm)"))
(princ (strcat "\n\n6/11: Steigungsstrecke (" (itoa best-winkel) " Grad, Laenge=" (rtos L_VF 2 2) " mm)"))
(setq rot-winkel (- best-winkel))
)
(progn
(princ (strcat "\n6/11: Gefällestrecke (" (itoa best-winkel) "° nach unten, Länge=" (rtos L_VF 2 2) " mm)"))
(princ (strcat "\n\n6/11: Gefaellestrecke (" (itoa best-winkel) " Grad, Laenge=" (rtos L_VF 2 2) " mm)"))
(setq rot-winkel best-winkel)
)
)
(setq blockname (strcat modul-pfad "Staustrecke_SP_1000_mm.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt (/ L_VF 1000.0)))
(Rotate3D-Y block aktueller-punkt rot-winkel)
(setq aktueller-punkt (get-block-endpoint-rotated block aktueller-punkt rot-winkel L_VF))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq aktueller-punkt (get-block-endpoint-rotated aktueller-punkt rot-winkel L_VF))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ (strcat "\n FEHLER: Blockdatei nicht gefunden: " blockname))
)
)
(princ "\n6/11: (L_VF = 0, übersprungen)")
(princ "\n6/11: (L_VF = 0, uebersprungen)")
)
;; ==========================================================
;; 7. 2. VERTIKALBOGEN (METHODE 3: X aus Tabelle, Z aus BoundingBox)
;; 7. 2. VERTIKALBOGEN (X und Z aus Tabelle)
;; ==========================================================
(if (= richtung "Auf")
(progn
(princ (strcat "\n7/11: Vertikalbogen_Auf_" (itoa best-winkel) "_Oben"))
(princ (strcat "\n\n7/11: Vertikalbogen_Auf_" (itoa best-winkel) "_Oben"))
(setq blockname (strcat modul-pfad "Vertikalbogen_Auf_" (itoa best-winkel) "_Oben.dwg"))
(setq bogen-mass (get-bogen-mass bogen-auf-oben best-winkel))
)
(progn
(princ (strcat "\n7/11: Vertikalbogen_Ab_" (itoa best-winkel) "_Unten"))
(princ (strcat "\n\n7/11: Vertikalbogen_Ab_" (itoa best-winkel) "_Unten"))
(setq blockname (strcat modul-pfad "Vertikalbogen_Ab_" (itoa best-winkel) "_Unten.dwg"))
(setq bogen-mass (get-bogen-mass-mit-abs bogen-ab-unten best-winkel))
(setq bogen-mass (get-bogen-mass bogen-ab-unten best-winkel))
)
)
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
;; KEINE Rotation!
(setq bogen-x (car bogen-mass))
(setq aktueller-punkt (get-block-endpoint-bogen block aktueller-punkt bogen-x))
(princ (strcat "\n → Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq bogen-dz (caddr bogen-mass))
(princ (strcat "\n Tabelle: dx=" (rtos bogen-x 2 2) ", dz=" (rtos bogen-dz 2 2)))
(setq aktueller-punkt (get-block-endpoint-bogen aktueller-punkt bogen-x bogen-dz))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ (strcat "\n FEHLER: Bogen-Datei nicht gefunden: " blockname))
)
;; ==========================================================
;; 8. MOTORSTATION (METHODE 1: rotiert, X per cos, Z per BBox)
;; 8. MOTORSTATION
;; ==========================================================
(princ "\n8/11: Motorstation 500mm (3° nach unten)")
(princ "\n\n8/11: Motorstation 500mm (3 Grad)")
(setq blockname (strcat modul-pfad "Vario_Motorstation_SP_500mm.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
(Rotate3D-Y block aktueller-punkt 3)
(setq aktueller-punkt (get-block-endpoint-rotated block aktueller-punkt 3 motorstation-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq aktueller-punkt (get-block-endpoint-rotated aktueller-punkt 3 motorstation-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ "\n FEHLER: Motorstation Datei nicht gefunden.")
)
;; ==========================================================
;; 9. 2. GEFÄLLESTRECKE (L_GF2) (METHODE 1: rotiert, X per cos, Z per BBox)
;; 9. 2. GEFÄLLESTRECKE (L_GF2)
;; ==========================================================
(if (> L_GF2 0.1)
(progn
(princ (strcat "\n9/11: Staustrecke (3° nach unten, Länge=" (rtos L_GF2 2 2) " mm)"))
(princ (strcat "\n\n9/11: Staustrecke (3 Grad, Laenge=" (rtos L_GF2 2 2) " mm)"))
(setq blockname (strcat modul-pfad "Staustrecke_SP_1000_mm.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt (/ L_GF2 1000.0)))
(Rotate3D-Y block aktueller-punkt 3)
(setq aktueller-punkt (get-block-endpoint-rotated block aktueller-punkt 3 L_GF2))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq aktueller-punkt (get-block-endpoint-rotated aktueller-punkt 3 L_GF2))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ (strcat "\n FEHLER: Blockdatei nicht gefunden: " blockname))
)
)
(princ "\n9/11: (übersprungen, L_GF2 = 0)")
(princ "\n9/11: (uebersprungen, L_GF2 = 0)")
)
;; ==========================================================
;; 10. SEPARATOR 2 (METHODE 1: rotiert, X per cos, Z per BBox)
;; 10. SEPARATOR 2
;; ==========================================================
(princ "\n10/11: Separator 300mm (3° nach unten)")
(princ "\n\n10/11: Separator 300mm (3 Grad)")
(setq blockname (strcat modul-pfad "Staustrecke_Separator_SP_300_mm.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
(Rotate3D-Y block aktueller-punkt 3)
(setq aktueller-punkt (get-block-endpoint-rotated block aktueller-punkt 3 separator-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
(setq aktueller-punkt (get-block-endpoint-rotated aktueller-punkt 3 separator-laenge))
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
(princ "\n FEHLER: Separator 2 Datei nicht gefunden.")
)
;; ==========================================================
;; 11. EIN_Element_links (feste Werte wie AUS_Element)
;; 11. EIN_Element_links
;; ==========================================================
(princ "\n11/11: EIN_Element_links")
(princ "\n\n11/11: EIN_Element_links")
(setq blockname (strcat modul-pfad "EIN_Element_links.dwg"))
(if (findfile blockname)
(progn
(princ (strcat "\n Einfuegen bei: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
(setq block (InsertBlock blockname aktueller-punkt 1.0))
;; Verwenden Sie die manuellen Werte statt BoundingBox
(setq aktueller-punkt (list
(setq aktueller-punkt (list
(+ (car aktueller-punkt) ein-dx)
(+ (cadr aktueller-punkt) ein-dy)
(+ (caddr aktueller-punkt) ein-dz)))
(princ (strcat "\n → EIN_Element Ausgang (manuell): X=" (rtos (car aktueller-punkt) 2 2)
(princ (strcat "\n Endpunkt: X=" (rtos (car aktueller-punkt) 2 2)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)
@@ -619,15 +639,62 @@
(princ)
)
;; ============================================================
;; TEIL 8: FOERDERTEST - Automatischer Test ohne Benutzereingabe
;; Distanz=6000, Hoehe=2000, Richtung=Auf, Start=0/0/0
;; Speichert als datum-HHMM.dxf
;; ============================================================
(defun c:FOERDERTEST ( / deltaL deltaH richtung ergebnis
best-winkel L_GF L_VF dateiname)
(setq deltaL 6000)
(setq deltaH 2000)
(setq richtung "Auf")
(princ "\n=========================================")
(princ "\n FOERDERTEST (automatisch)")
(princ "\n=========================================")
(princ (strcat "\nDistanz: " (rtos deltaL 2 2) " mm"))
(princ (strcat "\nHoehe: " (rtos deltaH 2 2) " mm"))
(princ (strcat "\nRichtung: " richtung))
(princ "\nStartpunkt: 0, 0, 0")
(setq ergebnis (berechne-alle-winkel deltaL deltaH richtung))
(setq best-winkel (car ergebnis) L_GF (cadr ergebnis) L_VF (caddr ergebnis))
(if (or (null best-winkel) (null L_GF) (null L_VF) (<= L_GF 0) (<= L_VF 0))
(progn (princ "\nFEHLER: Kein passender Winkel gefunden!") (princ))
(progn
(princ (strcat "\n\nGewaehlter Winkel: " (itoa best-winkel) " Grad"))
(princ (strcat "\nL_GF (gesamt): " (rtos L_GF 2 2) " mm"))
(princ (strcat "\nL_GF1 = L_GF2 = " (rtos (/ L_GF 2) 2 2) " mm"))
(princ (strcat "\nL_VF: " (rtos L_VF 2 2) " mm"))
;; Foerderanlage einfuegen bei 0,0,0
(foerderanlage-einfuegen deltaL deltaH richtung best-winkel L_GF L_VF '(0 0 0))
;; Dateiname: datum-HHMM.dxf
(if (getenv "DXFM_RESULTS")
(setq result-pfad (getenv "DXFM_RESULTS"))
(setq result-pfad (strcat modul-pfad "../results"))
)
(setq dateiname (strcat result-pfad
"/"
(menucmd "M=$(edtime,$(getvar,date),YYYYMODD-HHmm)")
".dxf"))
(princ (strcat "\n\nSpeichere als: " dateiname))
(command "_.DXFOUT" dateiname "V" "2018" "16")
(princ "\n\n>>> FOERDERTEST abgeschlossen! <<<")
)
)
(princ)
)
;; ============================================================
;; START
;; ============================================================
(princ "\n=========================================")
(princ "\n>>> FÖRDERANLAGE GENERATOR v24.3 geladen <<<")
(princ "\n>>> Befehl: FOERDERANLAGE <<<")
(princ "\n>>> Methodenzuordnung: <<<")
(princ "\n>>> - Rotierte Blöcke: X per Berechnung, Z per BoundingBox <<<")
(princ "\n>>> - Nicht-rotierte Blöcke: X und Z per BoundingBox <<<")
(princ "\n>>> - Vertikalbögen: X aus Tabelle, Z per BoundingBox <<<")
(princ "\n>>> FOERDERANLAGE GENERATOR v24.4 geladen <<<")
(princ "\n>>> Befehle: FOERDERANLAGE, FOERDERTEST <<<")
(princ "\n>>> Z-Berechnung: Trigonometrisch + Tabellenwerte <<<")
(princ "\n=========================================")
(princ)
+44 -74
View File
@@ -1,25 +1,39 @@
# test
# dxfmakros
> Kurze Projektbeschreibung hier eintragen.
AutoLISP-Makros fuer BricsCAD Pro zur automatisierten Erstellung von Foerderanlagen- und Kreisel-Layouts.
## Makros / Befehle
### VarioFoerderer.lsp - Foerderanlage Generator (v24.4)
Generiert komplette Vario-Foerderanlagen mit Vertikalboegen, Motor-/Spannstationen, Staustrecken und Ein-/Ausschleus-Elementen.
| Befehl | Beschreibung |
| --- | --- |
| `FOERDERANLAGE` | Interaktiver Generator: Zwei Punkte messen oder manuelle Eingabe von Distanz/Hoehe, berechnet optimalen Bogenwinkel und fuegt Module ein |
| `FOERDERTEST` | Automatischer Testlauf (Distanz=6000, Hoehe=2000, Richtung=Auf), speichert Ergebnis als DXF |
Unterstuetzte Bogenwinkel: 3, 9, 12, 15, 24, 36, 48 Grad
### ILSModulInsert.lsp - Kreisel Modul-Einfuegesystem (v4.0)
Zeichnet ILS-Kreiselmodule mit konfigurierbarem Abstand und PIN-Typ.
| Befehl | Beschreibung |
| --- | --- |
| `KreiselInsert` | Modul an manuell gewaehltem Punkt einfuegen |
| `KreiselConnect` | Smart Connect: Neues Modul an bestehendes anschliessen |
## Projektstruktur
```
test/
├── bin/ # Skripte zur Umgebungsverwaltung
│ ├── setenv.bat/.sh # Umgebungsvariablen setzen
│ ├── install_py.bat/.sh # venv erstellen + pip install
── activate_venv.bat/.sh # venv aktivieren
│ └── get_cmd.bat/.sh # Shell mit Umgebung oeffnen
├── cfg/ # Konfigurationsdateien (INI/JSON)
├── data/ # Eingabedaten (nicht im Git)
├── doc/ # Dokumentation
├── examples/ # Beispieldateien
├── lib/ # Python-Quellcode / Bibliothek
├── log/ # Log-Dateien (nicht im Git)
├── results/ # Ergebnisse / Ausgaben (nicht im Git)
├── tests/ # Unit Tests
├── .gitignore
```text
dxfmakros/
├── Blocks/ # DWG-Bloecke (Motorstation, Spannstation, Vertikalboegen, etc.)
├── Lisp/ # AutoLISP-Makros
│ ├── VarioFoerderer.lsp
── ILSModulInsert.lsp
├── bin/ # Hilfs-Skripte
├── result/ # Ergebnisse / DXF-Exporte (nicht im Git)
├── LICENSE
├── README.md
└── requirements.txt
@@ -27,64 +41,20 @@ test/
## Umgebungsvariablen
| Variable | Beschreibung |
|----------------|---------------------------|
| `DXFMAKRO` | Wurzelverzeichnis |
| `DXFM_BIN` | Skriptverzeichnis |
| `DXFM_LIB` | Python-Quellcode |
| `DXFM_CFG` | Konfigurationsdateien |
| `DXFM_DATA` | Eingabedaten |
| `DXFM_LOG` | Log-Dateien |
| `DXFM_RESULTS` | Ergebnisse |
| `DXFM_EXAMPLES` | Beispieldateien |
| `PYTHONPATH` | Erweitert um `DXFM_LIB` |
| Variable | Beschreibung |
| --- | --- |
| `DXFMAKRO` | Wurzelverzeichnis des Projekts |
| `DXFM_BLOCKS` | Pfad zum Blocks-Verzeichnis (fuer DWG-Einfuegungen) |
| `DXFM_RESULTS` | Pfad fuer DXF-Exporte |
| `DXFM_BIN` | Skriptverzeichnis |
| `DXFM_LIB` | Python-Quellcode |
| `DXFM_CFG` | Konfigurationsdateien |
## Installation
## Einrichtung
### Voraussetzungen
- Python 3.10 oder hoeher
### Setup (Windows)
```bat
bin\install_py.bat
```
### Setup (Linux / macOS)
```bash
bash bin/install_py.sh
```
## Nutzung
### Umgebung setzen
```bat
bin\setenv.bat # Windows
```
```bash
source bin/setenv.sh # Linux / macOS
```
### Shell mit gesetzten Variablen oeffnen
```bat
bin\get_cmd.bat # Windows
```
```bash
source bin/get_cmd.sh # Linux / macOS
```
### venv aktivieren
```bat
bin\activate_venv.bat # Windows
```
```bash
source bin/activate_venv.sh # Linux / macOS
```
1. Umgebungsvariable `DXFM_BLOCKS` auf das `Blocks/`-Verzeichnis setzen
2. `.lsp`-Dateien in BricsCAD laden (manuell oder via Startup)
3. Befehle in der BricsCAD-Kommandozeile ausfuehren
## Lizenz
+3
View File
@@ -18,6 +18,7 @@ set "DXFM_DATA=%DXFMAKRO%\data"
set "DXFM_CFG=%DXFMAKRO%\cfg"
set "DXFM_BLOCKS=%DXFMAKRO%\Blocks"
set "DXFM_LISP=%DXFMAKRO%\Lisp"
set "DXFM_RESULTS=%DXFMAKRO%\results"
set BRICSCAD="C:\Program Files\Bricsys\BricsCAD V25 de_DE\bricscad.exe"
@@ -36,6 +37,7 @@ if not exist "%DXFM_LIB%" mkdir "%DXFM_LIB%"
if not exist "%DXFM_DATA%" mkdir "%DXFM_DATA%"
if not exist "%DXFM_BLOCKS%" mkdir "%DXFM_BLOCKS%"
if not exist "%DXFM_LISP%" mkdir "%DXFM_LISP%"
if not exist "%DXFM_RESULTS%" mkdir "%DXFM_RESULTS%"
REM Umgebungsvariablen anzeigen
echo.
@@ -49,6 +51,7 @@ echo DXFM_LIB = %DXFM_LIB%
echo DXFM_DATA = %DXFM_DATA%
echo DXFM_BLOCKS = %DXFM_BLOCKS%
echo DXFM_LISP = %DXFM_LISP%
echo DXFM_RESULTS = %DXFM_RESULTS%
echo PYTHONPATH = %PYTHONPATH%
echo ================================================================
echo.