diff --git a/CLAUDE.md b/CLAUDE.md index fc3b69c..72729aa 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -19,7 +19,7 @@ AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von F | Verzeichnis | Inhalt | |---|---| | `Lisp/` | AutoLISP-Makros und Kernbibliotheken | -| `bin/` | Hilfs-Skripte (setenv.bat, start_briscad.bat, on_start.lsp) | +| `bin/` | Hilfs-Skripte (setenv.bat, start_briscad.bat) | | `cfg/` | Konfigurationsdateien | | `data/` | JSON-Daten, DXF-Quellen, Block-Libraries | | `data/ils/` | DWG-Bloecke fuer ILS-Kreisel/Eckrad (AN8, SP8, AP-Typen) | @@ -33,20 +33,33 @@ AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von F ## Lademechanismus (Lazy Loading via MNL) -Das Laden der LISP-Module erfolgt **nicht** ueber Startup-Skripte, sondern ueber das Menuesystem: +Das Laden der LISP-Module erfolgt ueber das Menuesystem. Voraussetzung ist, dass das +Menue einmalig in BricsCAD geladen wurde (siehe unten: "Menue einrichten"). -1. Die Menuedatei `SSG_LIB.mnu` wird beim BricsCAD-Start als CUI geladen (einmalig via `_MENULOAD`) -2. BricsCAD laedt automatisch `SSG_LIB.mnl` (gleichnamige MNL-Datei) mit dem Menue -3. Die MNL definiert `ssg-ensure` (Lazy-Loader) und setzt `DBLCLKEDIT=0` -4. Beim ersten Menueklick laedt `ssg-ensure` automatisch die benoetigten Module: - - Zuerst die **Kern-Module**: `ssg_core` → `ssg_dbg` → `ssg_dialog` → `ssg_layer` - - Dann das angeforderte **Feature-Modul** (z.B. `KreiselInsert`, `OmniModulInsert`) -5. Bereits geladene Module werden uebersprungen (Flag-Variable `*ssg--loaded*`) +1. BricsCAD laedt beim Start automatisch `SSG_LIB.mnl` (gleichnamige MNL-Datei zum Menue) +2. Die MNL laedt alle Kern- und Feature-Module direkt per `ssg-ensure` +3. `ssg-ensure` ueberspringt bereits geladene Module (Flag `*ssg--loaded*`) + +### Menue einrichten (einmalig pro BricsCAD-Installation) + +1. `bin/setenv.bat` ausfuehren (setzt `DXFM_LISP`, `DXFMAKRO` u.a.) +2. BricsCAD starten +3. In der BricsCAD-Kommandozeile: `_MENULOAD` eingeben +4. Im Dialog: `menu/SSG_LIB.mnu` auswaehlen und laden +5. BricsCAD laedt automatisch `SSG_LIB.mnl` mit – alle Module werden initialisiert + +Alternativ per LISP-Kommandozeile in BricsCAD: +```lisp +(command "_.MENULOAD" "C:/10-Develop/gitrepos/dxfmakros/menu/SSG_LIB.mnu") +``` + +Das Menue bleibt dauerhaft registriert. Nach einem Update der `.mnu`-Datei +genuegt es, BricsCAD neu zu starten oder `_MENULOAD` erneut aufzurufen. ### Voraussetzung Umgebungsvariable `DXFM_LISP` muss gesetzt sein (via `bin/setenv.bat`). -Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD ohne `/s` oder `/p`. +Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD. ### Modulzuordnung im Menue @@ -60,12 +73,11 @@ Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD ohne `/s` ode | Export | `export` | EXPORTSIVAS, EXPORTCSV, CALLPYTHON | | Doppelklick/Kontextmenue | `SSG_LIB_Commands` | SSG_BLOCKEDIT | -### Legacy-Dateien (nicht mehr verwendet) +### Entfernte Legacy-Dateien - `bin/startup.scr` - Entfernt (war fuer `/s` Parameter) - `bin/acaddoc.lsp` - Entfernt (war fuer ACAD-Pfad-basiertes Laden) -- `bin/on_start.lsp` - Nicht mehr fuer Lazy-Loading noetig, kann fuer manuelles Laden aller Module verwendet werden -- `Lisp/ssg_load.lsp` - Laedt alle Module auf einmal (Alternative zum Lazy-Loading) +- `bin/on_start.lsp` - Entfernt; Menue wird jetzt manuell per `_MENULOAD` eingerichtet Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. diff --git a/Lisp/README.md b/Lisp/README.md index 2aa7498..b528d1e 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -4,26 +4,25 @@ AutoLISP-Routinen für BricsCAD Pro zur automatisierten Erstellung von Förderan --- -## Ladereihenfolge (`ssg_load.lsp`) +## Menue einrichten und Module laden -```lisp -(load "pfad/ssg_load.lsp") +Module werden automatisch ueber `SSG_LIB.mnl` geladen, sobald das Menue +einmalig in BricsCAD registriert wurde: + +**Einmalige Einrichtung (BricsCAD-Kommandozeile):** +``` +_MENULOAD → menu/SSG_LIB.mnu auswaehlen ``` -Die Laderoutine laedt alle Module automatisch in der richtigen Reihenfolge: +BricsCAD laedt daraufhin automatisch `SSG_LIB.mnl`, welches alle Module +per `ssg-ensure` initialisiert (Kern: ssg_core/dbg/dialog/layer, dann +alle Feature-Module). Details: siehe `../CLAUDE.md` Abschnitt "Lademechanismus". -1. `ssg_core.lsp` – Kernbibliothek -2. `(ssg-load-config)` – JSON-Konfiguration laden (aus `data/json/component_defaults.json`) -3. `ssg_dbg.lsp` – Debug-Logging (fuer alle nachfolgenden Module verfuegbar) -4. `ssg_dialog.lsp` – Dialog-Patterns -5. `ssg_layer.lsp` – Layer-Verwaltung -6. `KreiselInsert.lsp` – ILS Kreisel und Eckrad -7. `VarioFoerderer.lsp` – Vario-Foerderer und Gefaellestrecken-Basis -8. `Gefaellestrecke.lsp` – Gefaellestrecken-Generator (setzt VarioFoerderer voraus) -9. `export.lsp` – Export-Funktionen (JSON-Sammler, Python-Export, Omniflo-Export) -10. `tests.lsp` – Testbefehle (Python-Aufruf via CALLPYTHON) -11. `OmniModulInsert.lsp` – Omniflo-Komponenten (Boegen, Weichen, Verbinder, Edit) -12. `SSG_LIB_Commands.lsp` – Dummy-Befehle fuer Menueintraege + SSG_BLOCKEDIT Dispatcher +**Manuell laden (Notfall / Entwicklung):** +```lisp +(load "C:/10-Develop/gitrepos/dxfmakros/Lisp/ssg_load.lsp") +``` +`ssg_load.lsp` laedt alle Module in der richtigen Reihenfolge ohne Menueabhaengigkeit. --- diff --git a/bin/on_start.lsp b/bin/on_start.lsp deleted file mode 100644 index 9c1263a..0000000 --- a/bin/on_start.lsp +++ /dev/null @@ -1,120 +0,0 @@ -;; ============================================================ -;; 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-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 (strcat "c:KreiselInsert: " (ssg-dbg-fn "C:KREISELINSERT"))) - (dbgmsg (strcat "c:KreiselEdit: " (ssg-dbg-fn "C:KREISELEDIT"))) - (dbgmsg (strcat "c:ILS_Eckrad: " (ssg-dbg-fn "C:ILS_ECKRAD"))) - (dbgmsg (strcat "c:OMNI_AP60: " (ssg-dbg-fn "C:OMNI_AP60"))) - (dbgmsg (strcat "c:OMNI_APB_630_90: " (ssg-dbg-fn "C:OMNI_APB_630_90"))) - (dbgmsg (strcat "c:OMNI_W90_Einfach: " (ssg-dbg-fn "C:OMNI_W90_EINFACH"))) - (dbgflush) -) - -(defun ssg-lib-startup ( / lisp-pfad menu-pfad curr-srch menu-datei 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...") - - ;; Library laden (direkt, damit Fehler sichtbar sind) - ;; Kein SRCHPATH-Aendern noetig - alle Dateien werden ueber - ;; absolute Pfade (Umgebungsvariablen) geladen - (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=1: Doppelklick aktiv, ***DOUBLECLICK-Eintraege steuern Block-Verhalten - (setvar "DBLCLKEDIT" 1) - - (dbgflush) - - (ssg-lib-register-check) - - (princ "\n[SSG_LIB] Startup abgeschlossen.") - ) - ) - (princ) -) - -;; Startup ausfuehren -(ssg-lib-startup) diff --git a/doc/LispTests.md b/doc/LispTests.md index a2e372c..840707c 100644 --- a/doc/LispTests.md +++ b/doc/LispTests.md @@ -239,8 +239,8 @@ pytest>=7.0 ### AutoLISP -- SSG_LIB muss geladen sein (ssg_load.lsp) -- `ssg_testrunner.lsp` wird manuell oder via on_start geladen +- SSG_LIB muss geladen sein (Menue per `_MENULOAD` eingerichtet, siehe CLAUDE.md) +- `ssg_testrunner.lsp` wird manuell per `(load "...")` oder ueber das Menue geladen ## Modulspezifische Testfaelle