Flag ob man die Hartcodierten Werte der Bogenmaße oder die dynamische Berechnung haben möchte

This commit is contained in:
2026-05-05 17:01:46 +02:00
parent 749b71da33
commit b4724696a2
+100 -13
View File
@@ -9,7 +9,13 @@
;; ============================================================
;; TEIL 1: GLOBALE EINSTELLUNGEN
;; ============================================================
(setq modul-pfad (strcat (getenv "DXFM_BLOCKS") "/"))
(if (getenv "DXFM_BLOCKS")
(setq modul-pfad (strcat (getenv "DXFM_BLOCKS") "/"))
(progn
(alert "Umgebungsvariable DXFM_BLOCKS nicht gesetzt! Verwende Standardpfad.")
(setq modul-pfad "c:/10-Develop/gitrepos/dxfmakros/Blocks/")
)
)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq modelspace (vla-get-ModelSpace doc))
@@ -31,27 +37,104 @@
(setq FESTE_HORIZONTAL 1600)
;; ============================================================
;; TEIL 3: BOGEN-MASSE (für X-Werte aus Tabelle)
;; KONFIGURATION: Flag für dynamische BoundingBox-Berechnung
;; Setze auf t für dynamische Berechnung aus .dwg-Dateien
;; Setze auf nil für feste, hartkodierte Werte
;; ============================================================
(setq bogen-auf-unten
(setq use-dynamic-bbox t) ;; Ändere hier: t = dynamisch, nil = hartkodiert
;; ============================================================
;; Feste, hartkodierte Bogen-Tabellen (Fallback)
;; ============================================================
(setq bogen-auf-unten-hardcoded
'((3 399.73 0 0)(9 297.95 0 15.61)(12 296.52 0 23.34)
(15 593.04 0 62.33)(24 583.13 0 100.09)(36 847.53 0 234.76)
(48 1063.24 0 448.91))
)
(setq bogen-auf-oben
(setq bogen-auf-oben-hardcoded
'((3 391.46 0 0)(9 281.45 0 14.75)(12 275.96 0 21.72)
(15 568.46 0 59.75)(24 546.87 0 93.37)(36 796.96 0 219.78)
(48 1000.4 0 422.88))
)
(setq bogen-ab-oben
(setq bogen-ab-oben-hardcoded
'((9 389.31 0 -40.92)(12 284.23 0 -37.42)(15 389.31 0 -40.92)
(24 552.27 0 -124.51)(36 796.35 0 -265.43)(48 732.51 0 -349.39))
)
(setq bogen-ab-unten
(setq bogen-ab-unten-hardcoded
'((9 397.54 0 -41.78)(12 296.52 0 -39.04)(15 493.38 0 -70.19)
(24 580.27 0 -131.23)(36 838.65 0 -280.41)(48 787.08 0 -375.42))
)
;; ============================================================
;; Funktion zum Berechnen der BoundingBox eines Blocks (temporäres Einfügen)
;; ============================================================
(defun get-block-bbox (blockname / obj minpt maxpt dx dz)
(if (findfile blockname)
(progn
;; Temporär einfügen bei (0,0,0)
(setq obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0))
;; BoundingBox abfragen
(vla-GetBoundingBox obj 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt))
(setq maxpt (vlax-safearray->list maxpt))
;; Differenzen berechnen
(setq dx (- (car maxpt) (car minpt))) ;; X-Ausdehnung
(setq dz (- (caddr maxpt) (caddr minpt))) ;; Z-Ausdehnung
;; Objekt löschen
(vla-Delete obj)
;; Rückgabe: (dx 0 dz)
(list dx 0 dz)
)
(progn
(princ (strcat "\nFEHLER: Blockdatei nicht gefunden: " blockname))
'(0 0 0) ;; Fallback
)
)
)
;; ============================================================
;; Funktion zum Erstellen der Bogen-Tabellen dynamisch
;; ============================================================
(defun create-bogen-table (richtung unten-oben / winkel-list table bbox)
(setq winkel-list '(3 9 12 15 24 36 48))
(setq table '())
(foreach winkel winkel-list
(setq blockname (strcat modul-pfad "Vertikalbogen_" richtung "_" (itoa winkel) "_" unten-oben ".dwg"))
(setq bbox (get-block-bbox blockname))
(if (and (> (car bbox) 0) (> (caddr bbox) 0)) ;; Nur gültige Werte
(setq table (cons (cons winkel bbox) table))
(princ (strcat "\nWARNUNG: Ungültige BoundingBox für " blockname))
)
)
(reverse table)
)
;; ============================================================
;; TEIL 3: BOGEN-MASSE (Verzweigung basierend auf Flag)
;; ============================================================
(if use-dynamic-bbox
(progn
(princ "\nVerwende dynamische BoundingBox-Berechnung für Bogen-Tabellen...")
(if (null bogen-auf-unten)
(progn
(setq bogen-auf-unten (create-bogen-table "Auf" "Unten"))
(setq bogen-auf-oben (create-bogen-table "Auf" "Oben"))
(setq bogen-ab-oben (create-bogen-table "Ab" "Oben"))
(setq bogen-ab-unten (create-bogen-table "Ab" "Unten"))
(princ "\nDynamische Bogen-Tabellen initialisiert.")
)
)
)
(progn
(princ "\nVerwende hartkodierte Werte für Bogen-Tabellen...")
(setq bogen-auf-unten bogen-auf-unten-hardcoded)
(setq bogen-auf-oben bogen-auf-oben-hardcoded)
(setq bogen-ab-oben bogen-ab-oben-hardcoded)
(setq bogen-ab-unten bogen-ab-unten-hardcoded)
(princ "\nHartkodierte Bogen-Tabellen geladen.")
)
)
;; ============================================================
;; TEIL 4: HILFSFUNKTIONEN
;; ============================================================
@@ -104,16 +187,16 @@
;; ============================================================
;; 🔥 METHODE 2: Für nicht-rotierte Blöcke (AUS_Element, EIN_Element)
;; X und Z aus BoundingBox (komplett aus Block-Geometrie)
;; X und Z aus BoundingBox (relativ zum Startpunkt)
;; ============================================================
(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 maxpt) ;; X aus BBox
(cadr startpunkt) ;; Y gleich
(caddr maxpt)) ;; Z aus BBox
(list (+ (car startpunkt) (- (car maxpt) (car minpt))) ;; Relative DX
(cadr startpunkt) ;; Y unverändert
(+ (caddr startpunkt) (- (caddr maxpt) (caddr minpt)))) ;; Relative DZ
)
;; ============================================================
@@ -442,15 +525,19 @@
)
;; ==========================================================
;; 11. EIN_Element_links (METHODE 2: nicht rotiert, X und Z aus BoundingBox)
;; 11. EIN_Element_links (feste Werte wie AUS_Element)
;; ==========================================================
(princ "\n11/11: EIN_Element_links")
(setq blockname (strcat modul-pfad "EIN_Element_links.dwg"))
(if (findfile blockname)
(progn
(setq block (InsertBlock blockname aktueller-punkt 1.0))
(setq aktueller-punkt (get-block-endpoint-nonrotated block aktueller-punkt))
(princ (strcat "\n → EIN_Element Ausgang: X=" (rtos (car aktueller-punkt) 2 2)
;; Verwenden Sie die manuellen Werte statt BoundingBox
(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)
", Y=" (rtos (cadr aktueller-punkt) 2 2)
", Z=" (rtos (caddr aktueller-punkt) 2 2)))
)