# dxfmakros - Projektanweisungen ## Projektbeschreibung AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von Foerderanlagen-Layouts (ILS Kreisel, Omniflo, Variofoerderer, Geruest). Ziel ist der Ersatz proprietaerer Tools (Bihler Omniflo, Bihler Geruest, Ruledesigner) durch eigene parametrische Makros. ## Technologie-Stack - **CAD-System**: BricsCAD Pro (AutoCAD-kompatibel) - **Hauptsprache**: AutoLISP (.lsp) - **Hilfssprache**: Python (Export-Skripte in `lib/`) - **Datenformate**: DXF/DWG (Bloecke), JSON (Komponentendaten), CSV (Export) - **Dialoge**: DCL (Dialog Control Language, in `dcl/`) - **Menu**: BricsCAD .mnu/.mnl Format (in `menu/`) ## Projektstruktur | Verzeichnis | Inhalt | |---|---| | `Lisp/` | AutoLISP-Makros und Kernbibliotheken | | `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) | | `data/json/` | Komponentendaten (Masse, Sivas-IDs) | | `data/block_libraries/` | DXF Block-Libraries (ils_library.dxf) | | `dcl/` | DCL-Dialogdefinitionen | | `doc/` | Dokumentation, Entwicklungsplan | | `lib/` | Python-Skripte (DXF-Bearbeitung, Export) | | `menu/` | BricsCAD-Menudefinition (SSG_LIB.mnu, SSG_LIB.mnl) | | `tests/` | Testskripte und Referenzdaten | ## Lademechanismus (Lazy Loading via MNL) Das Laden der LISP-Module erfolgt ueber das Menuesystem. Voraussetzung ist, dass das Menue einmalig in BricsCAD geladen wurde (siehe unten: "Menue einrichten"). 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. ### Modulzuordnung im Menue | Menue-Bereich | Modul | Befehle | |---|---|---| | Kreisel-Module | `KreiselInsert` | KreiselInsert, KreiselConnect, KreiselEdit, ILS_Eckrad | | Zusatzmodul/Foerderer/Kurven | `SSG_LIB_Commands` | ILS_BTMT_*, ILS_ETF_*, ILS_K*_*, ILS_GK*_* | | VarioFoerderer | `VarioFoerderer` | FOERDERANLAGE | | Gefaellestrecke | `Gefaellestrecke` | GEFAELLESTRECKE | | Omniflo (komplett) | `OmniModulInsert` | OMNI_APB_*, OMNI_W*_*, OMNI_AP*, OMNI_TEF_*, OMNI_TV_*, OMNI_EDIT | | Export | `export` | EXPORTSIVAS, EXPORTCSV, CALLPYTHON | | Doppelklick/Kontextmenue | `SSG_LIB_Commands` | SSG_BLOCKEDIT | ### 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` - Entfernt; Menue wird jetzt manuell per `_MENULOAD` eingerichtet Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. ## AutoLISP-Module | Datei | Befehle | Beschreibung | |---|---|---| | `ssg_core.lsp` | - | Kernel: ssg-start/ssg-end, ssg-cfg-or, ssg-attrib-read/write, Layer/Block-Ops | | `ssg_dbg.lsp` | - | Debug-Logging (dbgopen, dbgmsg, dbgflush, dbgclose) | | `ssg_dialog.lsp` | - | DCL-Dialog-Vorlagen und Hilfsfunktionen | | `ssg_layer.lsp` | - | Layer-Verwaltung | | `KreiselInsert.lsp` | KreiselInsert, KreiselConnect, KreiselRedraw, KreiselQuick, KreiselEdit, KreiselParams, KreiselLabelSetup, KreiselLabelPos, KreiselLabelHoehe, ILS_Eckrad | ILS Kreisel und Eckrad komplett in AutoLISP | | `VarioFoerderer.lsp` | FOERDERANLAGE | Vario-Foerderanlagen Generator | | `Gefaellestrecke.lsp` | GEFAELLESTRECKE | Gefaelle-Foerderanlage (AUS -> Staustrecke skaliert -> Separator -> EIN) | | `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_UPDATE_ATTRIBS | JSON-Sammlung und Python-Export (Omniflo-Merkmale/Sum-Zeile via lib/export_csv.py) | | `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_AP60/AP110, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen, Edit-Dialog | | `SSG_LIB_Commands.lsp` | ILS_BTMT_*, ILS_ETF_*, ILS_K*_*, ILS_GK*_*, SSG_BLOCKEDIT | Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher | | `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) | ## DCL-Dialoge | Datei | Verwendet von | |---|---| | `kreisel_edit.dcl` | KreiselEdit (KreiselInsert.lsp) | | `omniflo_boegen.dcl` | OMNI_APB_* (OmniModulInsert.lsp) | | `omniflo_weichen.dcl` | OMNI_W*_* (OmniModulInsert.lsp) | ## Menue (SSG_LIB.mnu + SSG_LIB.mnl) - `SSG_LIB.mnu` - Menuedefinition mit Lazy-Loading (`(ssg-ensure "Modul") Befehl`) - `SSG_LIB.mnl` - Automatisch geladen mit dem Menue, definiert `ssg-ensure` Loader - `***MENUGROUP=SSG_LIB` - Menuegruppenname - `***POP1` - Hauptmenue (ILS, Omniflo, Export) - `***DOUBLECLICK` - Doppelklick auf INSERT-Bloecke ruft SSG_BLOCKEDIT auf - `***POP501` - Rechtsklick-Kontextmenue (KreiselEdit, OMNI_EDIT, SSG_BLOCKEDIT) ## Umgebungsvariablen Werden via `bin/setenv.bat` gesetzt. Wichtigste: - `DXFMAKRO` - Projektwurzel - `DXFM_LISP` - Pfad zu Lisp-Dateien (benoetigt fuer ssg-ensure Lazy-Loader) - `DXFM_BLOCKS` - Pfad zu DWG-Bloecken - `DXFM_DATA` - Datenverzeichnis (JSON, DXF) - `DXFM_LOG` - Log-Verzeichnis - `DXFM_DCL` - Pfad zu DCL-Dialogdateien - `DXFM_CFG` - Konfigurationsverzeichnis ## Konventionen - AutoLISP-Funktionsnamen: `ssg-*` fuer Kernfunktionen, `C:BEFEHLSNAME` fuer User-Commands - Alle Texte in Dateien ohne Umlaute (ae, oe, ue statt ae, oe, ue) - Bloecke werden als DWG in `data/ils/` abgelegt, Block-Libraries als DXF in `data/block_libraries/` - Komponentendaten (Masse, Sivas-IDs) liegen als JSON in `data/json/` - Sprache im Code und Kommentaren: Deutsch ## Python-Bibliotheken ### Standalone-Skripte (`lib/`) - laufen extern mit ezdxf Abhaengigkeiten: `ezdxf`, Standard-Library. Benoetigen Umgebungsvariablen (`DXFM_DATA`, `DXFM_RESULTS`, `DXFM_CFG`). | Skript | Beschreibung | |---|---| | `omniflo_utils.py` | Gemeinsame Hilfsfunktionen fuer Omniflo-Skripte: `ROW_GROUPS` (Reihen-Gruppierung), `SWITCH_FILTERS` (Schalter-Filter), `build_row_layout`, `import_element_as_block`, `draw_cross`, `load_omniflo_data` | | `set_einfuegepkt.py` | Setzt `$INSBASE` (Einfuegepunkt) in Omniflo-DXF-Dateien. Schalter je Typ: `--boegen`, `--weichen45`, `--weichen90`, `--weichenkoerper`, `--weichen-parallel`, `--delta`, `--dreifachweiche`, `--sternweiche`, `--show-omniflo` | | `set_koords.py` | Setzt Koordinatensystem-Bloecke (K1-K4) in Omniflo-DXF-Dateien. Schalter: `--k1set` bis `--k4set`, `--set-all`, `--force`, `--show-omniflo`, `--test`, `--number` | | `set_attributs.py` | Fuegt ATTDEF-Attribute zu Omniflo-DXF-Dateien hinzu. Liest Konfiguration aus `cfg/attradd.cfg`. Schalter: `--number`, `--dry-run` | | `export_sivas.py` | Erzeugt Sivas-Export-CSV mit Summierungszeilen (ILS Automation, Omniflo Sum). Aufruf: `python export_sivas.py ` | | `export_csv.py` | Erzeugt einfache Item-Liste als CSV (ohne Summierung). Aufruf: `python export_csv.py ` | | `split_block_library.py` | Teilt `ils_library.dxf` in einzelne DXF-Dateien pro Block auf (mit Abhaengigkeiten). Export-Prefixe: Vario_, Staustrecke_, _3D_AS_, _3D_ES_ | ### Typische Verarbeitungskette (Omniflo-DXF) 1. `set_attributs.py` - Attribute zu Quell-DXFs hinzufuegen 2. `set_einfuegepkt.py` - Einfuegepunkte berechnen und setzen 3. `set_koords.py` - Koordinatensysteme (K1-K4) setzen 4. `export_sivas.py` / `export_csv.py` - Export aus Zeichnung ## Entwicklungsstand Siehe `doc/Entwicklungsplan.md` fuer Meilensteinplanung und Aufwandsschaetzung. Fertig (DONE): ILS Kreisel, ILS Eckrad, ILS Variofoerderer, Omniflo Boegen, Omniflo Weichen.