This commit is contained in:
2026-06-16 17:12:31 +02:00
38 changed files with 12142 additions and 13184 deletions
+123 -56
View File
@@ -19,7 +19,13 @@
;; Pfad zum Verzeichnis mit den Einzelblock-DXF-Dateien
(if (getenv "DXFM_DATA")
(setq block-pfad (strcat (getenv "DXFM_DATA") "/ils/"))
(progn
(setq block-pfad (getenv "DXFM_DATA"))
(setq block-pfad (vl-string-translate "\\" "/" block-pfad))
(if (= (substr block-pfad (strlen block-pfad)) "/")
(setq block-pfad (substr block-pfad 1 (1- (strlen block-pfad)))))
(setq block-pfad (strcat block-pfad "/ils/"))
)
(progn
(alert "Umgebungsvariable DXFM_DATA nicht gesetzt!\nBitte zuerst bin\\setenv.bat ausfuehren.")
(exit)
@@ -47,6 +53,7 @@
(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
@@ -104,20 +111,46 @@
;; Grad-Zeichen fuer Blocknamen
(setq grad-zeichen (chr 176))
;; Laedt einen Block aus seiner Einzeldatei, falls noch nicht in der Zeichnung definiert.
;; Blockdatei: block-pfad/<blockname>.dxf
(defun ensure-block-loaded (blockname / block-datei temp-obj)
;; 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
(setq block-datei (strcat block-pfad blockname ".dxf"))
(if (findfile block-datei)
;; Erste fehlender Block: gesamte Bibliothek laden (enthaelt alle 3D-Bloecke)
(if (not *library-loaded*)
(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)
;; Pfad: block-pfad = ".../data/ils/" → ".../data/block_libraries/ils_library.dxf"
(setq lib-datei
(strcat (substr block-pfad 1 (- (strlen block-pfad) 4))
"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))
)
)
(princ (strcat "\n FEHLER: Blockdatei nicht gefunden: " block-datei))
)
)
)
@@ -357,9 +390,9 @@
)
(if (and ks-ein-pos ks-aus-pos)
(progn
(setq aus-dx (- (caaddr ks-aus-pos) (caadr ks-ein-pos)))
(setq aus-dy (- (cadr (caddr ks-aus-pos)) (cadr (cadr ks-ein-pos))))
(setq aus-dz (- (caddr (caddr ks-aus-pos)) (caddr (cadr ks-ein-pos))))
(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!")
@@ -385,9 +418,9 @@
)
(if (and ks-ein-pos ks-aus-pos)
(progn
(setq ein-dx (- (caaddr ks-aus-pos) (caadr ks-ein-pos)))
(setq ein-dy (- (cadr (caddr ks-aus-pos)) (cadr (cadr ks-ein-pos))))
(setq ein-dz (- (caddr (caddr ks-aus-pos)) (caddr (cadr ks-ein-pos))))
(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!")
@@ -418,9 +451,9 @@
)
(if (and ks-ein-pos ks-aus-pos)
(progn
(setq dx (- (caaddr ks-aus-pos) (caadr ks-ein-pos)))
(setq dy (- (cadr (caddr ks-aus-pos)) (cadr (cadr ks-ein-pos))))
(setq dz (- (caddr (caddr ks-aus-pos)) (caddr (cadr ks-ein-pos))))
(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)))
)
@@ -445,9 +478,9 @@
)
(if (and ks-ein-pos ks-aus-pos)
(progn
(setq dx (- (caaddr ks-aus-pos) (caadr ks-ein-pos)))
(setq dy (- (cadr (caddr ks-aus-pos)) (cadr (cadr ks-ein-pos))))
(setq dz (- (caddr (caddr ks-aus-pos)) (caddr (cadr ks-ein-pos))))
(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)))
)
@@ -631,7 +664,8 @@
(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α nenner
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")
@@ -659,49 +693,74 @@
(princ "\n ---------------------------------------------------")
(foreach winkel winkel-list
;; Bogen-Maße aus Bibliothek holen (KEIN Fallback!)
;; 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")
(setq mass1 (get-bogen-mass bogen-auf winkel))
(setq mass1 (get-bogen-mass bogen-ab winkel))
(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 (null mass1)
(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) ")"))
(setq mass2 mass1) ;; Zweiter Bogen gleiche Maße
(setq bogen-x1 (car mass1) bogen-z1 (caddr mass1))
(setq bogen-x2 (car mass2) bogen-z2 (caddr mass2))
;; 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")
(progn
(setq B (+ deltaH abs-dz-AUS abs-dz-EIN (- bogen-z1) (- bogen-z2) (* FESTE_HORIZONTAL sin3)))
(setq nenner (+ (* cos3 sinα) (* sin3 cosα)))
)
(progn
(setq B (- deltaH abs-dz-AUS abs-dz-EIN bogen-z1 bogen-z2 (* FESTE_HORIZONTAL sin3)))
(setq nenner (- (* cos3 sinα) (* sin3 cosα)))
)
(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))
)
(if (> (abs nenner) 0.0001)
;; 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 sinα) (* B cosα)) nenner))
(setq L_GF (/ (- (* A sinEff) (* B cosEff)) sinα))
(if (= richtung "Auf")
(setq L_VF (/ (+ (* B cos3) (* A sin3)) nenner))
(setq L_VF (/ (- (* B cos3) (* A sin3)) nenner))
(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
@@ -786,7 +845,7 @@
(ssg-cfg-or "vario" "separator_block_dx" 300)
(ssg-cfg-or "vario" "separator_block_dz" 0)))
;; 4. Umlenkstation Block bereits 3° vorgeneigt, keine zusaetzliche Rotation
;; 4. Umlenkstation Rotation um 3° um Y-Achse
(princ "\n\n4/11: Umlenkstation (500mm, 3° geneigt)")
(setq aktueller-punkt (insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 0
(ssg-cfg-or "vario" "station_block_dx" 499)
@@ -812,12 +871,12 @@
(progn
(if (= richtung "Auf")
(progn
(princ (strcat "\n\n6/11: Steigungsstrecke (" (itoa best-winkel) "°, Laenge=" (rtos L_VF 2 2) " mm)"))
(setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_VF (- best-winkel)))
(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) "°, Laenge=" (rtos L_VF 2 2) " mm)"))
(setq aktueller-punkt (insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_VF best-winkel))
(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)))
)
)
)
@@ -836,10 +895,18 @@
)
)
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
(princ (strcat "\n\n7/11: " bogen-name " (" (itoa (- best-winkel)) "° geneigt)"))
(setq aktueller-punkt (insert-rotated-block-with-ks bogen-name aktueller-punkt (- best-winkel) bogen-dx bogen-dz))
(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 gleiche Behandlung wie Umlenkstation
;; 8. Motorstation Rotation um 3° um Y-Achse
(princ "\n\n8/11: Motorstation (500mm, 3° geneigt)")
(setq aktueller-punkt (insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 0
(ssg-cfg-or "vario" "station_block_dx" 499)