;; ============================================================ ;; on_start.lsp - SSG_LIB Startup fuer BricsCAD ;; Wird beim Start von BricsCAD automatisch ausgefuehrt ;; ============================================================ (defun ssg-lib-safe-load (datei / result) (setq result (vl-catch-all-apply 'load (list datei))) (if (vl-catch-all-error-p result) (progn (princ (strcat "\n[SSG_LIB] FEHLER beim Laden von " datei ":")) (princ (strcat "\n " (vl-catch-all-error-message result))) nil ) t ) ) ;; ------------------------------------------------------------ ;; SSG-DBG-FN - Prueft ob ein AutoLISP-Symbol gebunden ist ;; Gibt "JA" oder "NEIN" zurueck (atoms-family, BRX-Cmds nicht pruefbar) ;; ------------------------------------------------------------ (defun ssg-dbg-fn (fname) (if (car (atoms-family 1 (list fname))) "JA" "NEIN") ) ;; ------------------------------------------------------------ ;; SSG-DBG-PYRX - PyRx-Ladeprozess ins Debug-Log schreiben ;; Wird nach arxload aufgerufen, damit alle Ergebniswerte vorliegen. ;; ------------------------------------------------------------ (defun ssg-dbg-pyrx (pyrx-pfad ver-major brx-datei brx-result / arx-name) (dbgmsg "[PyRx] --- Umgebung ---") (dbgmsg (strcat "PYTHONHOME: " (if (getenv "PYTHONHOME") (getenv "PYTHONHOME") "nicht gesetzt"))) (dbgmsg (strcat "PYTHONPATH: " (if (getenv "PYTHONPATH") (getenv "PYTHONPATH") "nicht gesetzt"))) (dbgmsg (strcat "PATH (Anfang): " (substr (getenv "PATH") 1 120))) (dbgmsg "[PyRx] --- Eingabewerte ---") (dbgmsg (strcat "pyrx-pfad: " pyrx-pfad)) (dbgmsg (strcat "ver-major: " ver-major)) (dbgmsg (strcat "brx-datei: " brx-datei)) (dbgmsg "[PyRx] --- arxload Ergebnis ---") (dbgmsg (strcat "arxload Rueckgabe: " (vl-princ-to-string brx-result))) (dbgmsg (strcat "arxload Fehler? " (if (vl-catch-all-error-p brx-result) (vl-catch-all-error-message brx-result) "nein"))) (setq arx-name (strcat "rxloaderv" ver-major ".0.brx")) (dbgmsg (strcat "(arx) rxloader? " (if (member arx-name (arx)) "JA" "NEIN"))) (dbgmsg (strcat "(arx) Liste: " (vl-princ-to-string (arx)))) (dbgflush) ) ;; ------------------------------------------------------------ ;; SSG-LIB-LOAD-PYRX - PyRx BRX laden und Python-Module via PYLOAD starten ;; Aufruf: (ssg-lib-load-pyrx menu-pfad) ;; Deaktiviert wegen PyRx/BricsCAD V25.3 Inkompatibilitaet (cad-pyrx 2.2.58.5504) ;; Reaktivieren sobald kompatible Version verfuegbar ist. ;; ------------------------------------------------------------ (defun ssg-lib-load-pyrx (menu-pfad / acadver-str ver-punkt ver-major pyrx-pfad brx-datei brx-result) ;; BricsCAD-Version ermitteln (setq acadver-str (getvar "ACADVER")) (setq ver-punkt (vl-string-search "." acadver-str)) (setq ver-major (if ver-punkt (substr acadver-str 1 ver-punkt) "25")) ;; Pyrx-Pfad: .venv (primaer), dann System/User Python (setq pyrx-pfad (cond ((findfile (strcat menu-pfad "/.venv/Lib/site-packages/pyrx/RxLoaderV" ver-major ".0.brx")) (strcat menu-pfad "/.venv/Lib/site-packages/pyrx")) ((and (getenv "PYTHONHOME") (findfile (strcat (getenv "PYTHONHOME") "/Lib/site-packages/pyrx/RxLoaderV" ver-major ".0.brx"))) (strcat (getenv "PYTHONHOME") "/Lib/site-packages/pyrx")) ((and (getenv "APPDATA") (findfile (strcat (getenv "APPDATA") "/Python/Python312/site-packages/pyrx/RxLoaderV" ver-major ".0.brx"))) (strcat (getenv "APPDATA") "/Python/Python312/site-packages/pyrx")) ((and (getenv "LOCALAPPDATA") (findfile (strcat (getenv "LOCALAPPDATA") "/Programs/Python/Python312/Lib/site-packages/pyrx/RxLoaderV" ver-major ".0.brx"))) (strcat (getenv "LOCALAPPDATA") "/Programs/Python/Python312/Lib/site-packages/pyrx")) (t nil) ) ) ;; BRX laden wenn PyRx noch nicht via Startup-Suite aktiv (if (not (member (strcat "rxloaderv" ver-major ".0.brx") (arx))) (if pyrx-pfad (progn (setq brx-datei (strcat pyrx-pfad "/RxLoaderV" ver-major ".0.brx")) (setq brx-result (vl-catch-all-apply 'arxload (list brx-datei))) (ssg-dbg-pyrx pyrx-pfad ver-major brx-datei brx-result) (if (vl-catch-all-error-p brx-result) (progn (princ (strcat "\n[SSG_LIB] FEHLER: RxLoaderV" ver-major ".0.brx nicht geladen: " (vl-catch-all-error-message brx-result))) (princ "\n[SSG_LIB] HINWEIS: PyRx einmalig via APPLOAD -> Startup Suite einrichten.") ) (princ (strcat "\n[SSG_LIB] PyRx RxLoader geladen (V" ver-major "): " brx-datei)) ) ) (princ (strcat "\n[SSG_LIB] WARNUNG: RxLoaderV" ver-major ".0.brx nicht gefunden." "\n PYTHONHOME=" (if (getenv "PYTHONHOME") (getenv "PYTHONHOME") "nicht gesetzt"))) ) (progn (dbgmsg "[PyRx] PyRx bereits via Startup-Suite aktiv") (princ (strcat "\n[SSG_LIB] PyRx (V" ver-major ") via Startup-Suite aktiv.")) ) ) ;; Python-Module laden - nur wenn PYLOAD verfuegbar (dbgmsg "[PYLOAD] --- Python-Module ---") (if (not (member "PYLOAD" (atoms-family 0))) (progn (dbgmsg "[PYLOAD] PYLOAD nicht verfuegbar - ueberspringe alle Module") (princ "\n[SSG_LIB] WARNUNG: PYLOAD nicht verfuegbar (PyRx nicht geladen).") (princ "\n[SSG_LIB] Python-Befehle (KreiselInsert etc.) nicht aktiv.") ) (foreach pymod '("eckrad" "kreisel" "dblclick" "omniflo" "omniflo_boegen" "omniflo_weichen") (if (findfile (strcat menu-pfad "/lib/elemente/" pymod ".py")) (progn (dbgmsg (strcat "PYLOAD start: " pymod ".py")) (command "PYLOAD" (strcat menu-pfad "/lib/elemente/" pymod ".py")) (dbgmsg (strcat "PYLOAD done: " pymod ".py")) (princ (strcat "\n[SSG_LIB] Python-Modul " pymod ".py geladen.")) ) (progn (dbgmsg (strcat "PYLOAD skip: " pymod ".py -- nicht gefunden")) (princ (strcat "\n[SSG_LIB] HINWEIS: " pymod ".py nicht gefunden.")) ) ) ) ) (dbgflush) ) ;; ------------------------------------------------------------ ;; SSG-LIB-REGISTER-CHECK - Verfuegbarkeit aller Befehle ins Debug-Log schreiben ;; ------------------------------------------------------------ (defun ssg-lib-register-check () (dbgmsg "[CHECK] --- AutoLISP Funktionen (atoms-family) ---") (dbgmsg (strcat "ssg-start: " (ssg-dbg-fn "SSG-START"))) (dbgmsg (strcat "ssg-end: " (ssg-dbg-fn "SSG-END"))) (dbgmsg (strcat "ssg-make-layer: " (ssg-dbg-fn "SSG-MAKE-LAYER"))) (dbgmsg (strcat "ssg-errhan: " (ssg-dbg-fn "SSG-ERRHAN"))) (dbgmsg (strcat "ensure-block-loaded: " (ssg-dbg-fn "ENSURE-BLOCK-LOADED"))) (dbgmsg "[CHECK] --- SSG_LIB_Commands (c:...) ---") (dbgmsg (strcat "c:ILS_BTMT_Beladung: " (ssg-dbg-fn "C:ILS_BTMT_BELADUNG"))) (dbgmsg (strcat "c:ILS_K90LA: " (ssg-dbg-fn "C:ILS_K90LA"))) (dbgmsg (strcat "c:ILS_TEF_Strecke: " (ssg-dbg-fn "C:ILS_TEF_STRECKE"))) (dbgmsg "[CHECK] --- PyRx Befehle (BRX-Ebene, nicht via atoms-family pruefbar) ---") (dbgmsg (strcat "KreiselInsert: " (ssg-dbg-fn "C:KREISELINSERT"))) (dbgmsg (strcat "KreiselEdit: " (ssg-dbg-fn "C:KREISELEDIT"))) (dbgmsg (strcat "EckradEdit: " (ssg-dbg-fn "C:ECKRADEDIT"))) (dbgmsg (strcat "SSG_BLOCKEDIT: " (ssg-dbg-fn "C:SSG_BLOCKEDIT"))) (dbgmsg (strcat "OMNI_AP60: " (ssg-dbg-fn "C:OMNI_AP60"))) (dbgmsg (strcat "OMNI_APB_630_90: " (ssg-dbg-fn "C:OMNI_APB_630_90"))) (dbgmsg (strcat "OMNI_W90_Einfach: " (ssg-dbg-fn "C:OMNI_W90_EINFACH"))) (dbgflush) ) (defun ssg-lib-startup ( / lisp-pfad menu-pfad curr-srch menu-datei acadver-str ver-punkt ver-major lsp-fb-pfad) ;; Pfade aus Umgebungsvariablen lesen (setq lisp-pfad (getenv "DXFM_LISP")) (setq menu-pfad (getenv "DXFMAKRO")) ;; Pfadtrenner vereinheitlichen: Backslash -> Forward-Slash (if lisp-pfad (setq lisp-pfad (vl-string-translate "\\" "/" lisp-pfad))) (if menu-pfad (setq menu-pfad (vl-string-translate "\\" "/" menu-pfad))) (if (null lisp-pfad) (progn (princ "\n[SSG_LIB] FEHLER: DXFM_LISP nicht gesetzt!") (princ "\n[SSG_LIB] Bitte zuerst bin\\setenv.bat ausfuehren.") ) (progn ;; Debug-Logging so frueh wie moeglich starten (if (findfile (strcat lisp-pfad "/ssg_dbg.lsp")) (progn (load (strcat lisp-pfad "/ssg_dbg.lsp")) (dbgopen "debugfile.dbg" "DXFM_LOG") (dbgmsg "[on_start] Startup begonnen") (dbgmsg (strcat "[on_start] DXFM_LISP=" lisp-pfad)) (dbgmsg (strcat "[on_start] DXFMAKRO=" (if menu-pfad menu-pfad "nicht gesetzt"))) (dbgflush) ) ) (princ "\n[SSG_LIB] Lade SSG_LIB Umgebung...") ;; LISP-Pfad zum BricsCAD-Suchpfad hinzufuegen (setq curr-srch (getvar "SRCHPATH")) (if (and curr-srch (not (vl-string-search lisp-pfad curr-srch))) (setvar "SRCHPATH" (strcat curr-srch ";" lisp-pfad)) ) ;; Library laden (direkt, damit Fehler sichtbar sind) (if (findfile (strcat lisp-pfad "/ssg_load.lsp")) (progn (load (strcat lisp-pfad "/ssg_load.lsp")) (princ "\n[SSG_LIB] ssg_load.lsp geladen.") ) (princ "\n[SSG_LIB] WARNUNG: ssg_load.lsp nicht gefunden!") ) ;; Menue laden (if menu-pfad (progn (setq menu-datei (strcat menu-pfad "/menu/SSG_LIB.mnu")) (if (findfile menu-datei) (progn (command "_.MENULOAD" menu-datei) (menucmd "P13=+SSG_LIB.POP1") (princ "\n[SSG_LIB] Menue SSG_LIB geladen und eingebunden.") ) (princ (strcat "\n[SSG_LIB] WARNUNG: " menu-datei " nicht gefunden!")) ) ) (princ "\n[SSG_LIB] WARNUNG: DXFMAKRO nicht gesetzt, Menue nicht geladen!") ) ;; DBLCLKEDIT deaktivieren (Block-Editor nicht bei Doppelklick oeffnen) (setvar "DBLCLKEDIT" 0) ;; (ssg-lib-load-pyrx menu-pfad) ;; deaktiviert - PyRx/BricsCAD V25.3 Inkompatibilitaet ;; Fallback: LSP-Routinen laden wenn PyRx nicht aktiv (setq acadver-str (getvar "ACADVER")) (setq ver-punkt (vl-string-search "." acadver-str)) (setq ver-major (if ver-punkt (substr acadver-str 1 ver-punkt) "25")) (if (not (member (strcat "rxloaderv" ver-major ".0.brx") (arx))) (progn (dbgmsg "[FALLBACK] PyRx nicht aktiv - lade LSP-Fallbacks") (foreach lsp-fb (list "KreiselInsert" "OmniModulInsert") (setq lsp-fb-pfad (strcat lisp-pfad "/" lsp-fb ".lsp")) (if (findfile lsp-fb-pfad) (progn (ssg-lib-safe-load lsp-fb-pfad) (dbgmsg (strcat "[FALLBACK] geladen: " lsp-fb ".lsp")) (princ (strcat "\n[SSG_LIB] Fallback geladen: " lsp-fb ".lsp")) ) (dbgmsg (strcat "[FALLBACK] nicht gefunden: " lsp-fb ".lsp")) ) ) ) (dbgmsg "[FALLBACK] PyRx aktiv - kein LSP-Fallback noetig") ) (dbgflush) (ssg-lib-register-check) (princ "\n[SSG_LIB] Startup abgeschlossen.") ) ) (princ) ) ;; Startup ausfuehren (ssg-lib-startup)