# Lisp – AutoLISP-Bibliotheken (SSG_LIB) AutoLISP-Routinen für BricsCAD Pro zur automatisierten Erstellung von Förderanlagen-Layouts. Destilliert aus den historischen ACADSST-Makros (Schönenberger Systeme GmbH) und erweitert für die SSG_LIB-Befehle. --- ## Ladereihenfolge (`ssg_load.lsp`) ```lisp (load "pfad/ssg_load.lsp") ``` Die Laderoutine laedt alle Module automatisch in der richtigen Reihenfolge: 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 --- ## Dateien ### `ssg_core.lsp` – Kernbibliothek Grundfunktionen für Umgebungssicherung, Benutzerinteraktion, Layer, Blöcke, Attribute und JSON-Konfiguration. Muss als erstes geladen werden. **Umgebungssicherung:** | Funktion | Beschreibung | | --- | --- | | `ssg-start titel vars` | Systemvariablen sichern, CMDECHO aus, Undo-Gruppe öffnen | | `ssg-end` | Systemvariablen wiederherstellen, Undo-Gruppe schließen | | `ssg-errhan em` | Fehlerhandler – räumt auf und ruft `ssg-end` auf | **Benutzer-Abfragen:** | Funktion | Beschreibung | | --- | --- | | `ssg-ques text defa` | Ja/Nein-Abfrage; `defa=T` → Default Ja, `nil` → Default Nein | | `ssg-emsg text` | Fehlermeldung mit optionalem Signalton (`ssg-bell`) | **Layer-Hilfsfunktionen:** | Funktion | Beschreibung | | --- | --- | | `ssg-get-layer text` | Layer eines angeklickten Objektes ermitteln | | `ssg-layer-ss name typ` | Auswahlsatz aller Objekte eines Layers (optional nach Typ filtern) | | `ssg-make-layer name farbe aktiv` | Layer anlegen (falls nicht vorhanden) und optional aktivieren | | `ssg-ss-foreach ss func` | Iteration über Auswahlsatz – `func` für jeden Entity-Name | | `ssg-ss-redraw ss modus` | Auswahlsatz hervorheben (3), invertieren (4) oder normal (0) | | `ssg-ss-add src dest` | Auswahlsatz `src` zu `dest` hinzufügen (in-place, mit Highlight) | **Block-Operationen:** | Funktion | Beschreibung | | --- | --- | | `ssg-timestamp` | Zeitstempel als `YYYYMMDDHHMMSS`-String erzeugen | | `ssg-make-blockname pt` | Eindeutigen Blocknamen aus Einfügepunkt + Zeitstempel erzeugen | | `ssg-insert-block layer farbe pfad pt xs ys rot` | Layer anlegen und Block einfügen | | `ssg-make-block pt rotation ss` | Auswahlsatz als Block definieren und gleich einfügen | **Attribut-Operationen:** | Funktion | Beschreibung | | --- | --- | | `ssg-attrib-set tag wert ersetzen` | Ein Attribut der **letzten** Einfügung setzen oder anfügen | | `ssg-attrib-set-many alist` | Mehrere Attribute der letzten Einfügung auf einmal setzen | | `ssg-attrib-set-on ent alist` | Attribute eines **bestimmten** INSERT-Entity setzen (nicht `entlast`) | | `ssg-attrib-read ent` | Alle Attribute eines INSERT-Entity als Assoziationsliste lesen | | `ssg-attrib-read-dwg pfad` | Block temporär einfügen, ATTRIBs lesen, Block wieder löschen | | `ssg-attrib-defaults defs` | Default-Attribute aus Definitionsliste `((TAG DEFAULT) ...)` erzeugen | | `ssg-attrib-merge given defs` | Übergebene Attribute mit Defaults zusammenführen | | `ssg-attrib-make-defs defs hoehe` | Unsichtbare ATTDEF-Entities erzeugen (für Block-Definition) | | `ssg-attrib-alist-to-defs alist` | Assoziationsliste `(TAG . Wert)` in ATTDEF-Definitionsliste umwandeln | | `ssg-attrib-by-handle handle tag wert ersetzen` | Attribut eines Blocks anhand seines Entity-Handles suchen und ändern | **Dialog-Hilfsfunktionen:** | Funktion | Beschreibung | | --- | --- | | `ssg-dialog-run dcl id init-fn accept-fn` | Generischer DCL-Dialog: laden, initialisieren, starten, entladen | **Zoom-Hilfsfunktionen:** | Funktion | Beschreibung | | --- | --- | | `ssg-zoom-save` | Aktuelle View-Größe merken | | `ssg-zoom-restore` | Auf gemerkte View-Größe zurückschalten (nur wenn verändert) | **JSON-Konfigurationssystem:** Liest `data/json/component_defaults.json` beim Laden über `ssg-load-config`. Die Config wird in der globalen Variable `*ssg-config*` gehalten. | Funktion | Beschreibung | | --- | --- | | `ssg-load-config` | Config aus `$DXFM_DATA/json/component_defaults.json` laden | | `ssg-cfg section key` | Wert aus Config lesen, `nil` wenn nicht vorhanden | | `ssg-cfg-or section key default` | Wert aus Config lesen, `default` als Fallback | Interne Parser-Funktionen (nicht direkt aufrufen): `ssg-read-file-lines`, `ssg-cfg-trim`, `ssg-cfg-split-comma`, `ssg-cfg-parse-value`, `ssg-cfg-parse-array`, `ssg-cfg-parse-kv`, `ssg-cfg-parse-nested` --- ### `ssg_dbg.lsp` – Debug-Logging Dateibasiertes Debug-Log mit gepuffertem Schreiben. `dbgf`/`dbg`/`dbgmsg` puffern im Speicher, `dbgreturn` flusht auf die Platte (open/append/close). | Funktion | Beschreibung | | --- | --- | | `dbgopen filename envvar` | Debug-Datei öffnen (Verzeichnis via Umgebungsvariable, z.B. `"DXFM_LOG"`) | | `dbgclose` | Puffer schreiben und Datei schließen | | `dbgon` | Debug-Ausgabe aktivieren | | `dbgoff` | Debug-Ausgabe deaktivieren (verhindert Dateianlage wenn vor `dbgopen`) | | `dbgf funcname` | Funktionseintritt loggen, Einrückung erhöhen | | `dbgreturn retval` | Funktionsaustritt loggen, Puffer flushen, Rückgabewert durchreichen | | `dbg varname` | Variable oder Wert loggen: `(dbg 'x)` oder `(dbg wert)` | | `dbgmsg text` | Freitext-Nachricht loggen | | `dbgp text` | Alias für `dbgmsg` | | `dbgflush` | Puffer sofort schreiben (ohne `dbgreturn`, z.B. in Startup-Code) | Beispiel: ```lisp (dbgopen "test.dbg" "DXFM_LOG") (dbgf "meine-funktion") (dbg 'x) (dbgreturn ergebnis) ; schreibt Puffer auf Platte (dbgclose) ``` --- ### `ssg_dialog.lsp` – Dialog-Pattern für Modul-Einfüge-Makros Kapselt das wiederkehrende DCL-Muster: Dialog mit Vorschaubild, Radio-Auswahl, Block einfügen, Attribute setzen. Setzt `ssg_core.lsp` voraus. | Funktion | Beschreibung | | --- | --- | | `ssg-dia-show-slide tile lib name` | Vorschau-Slide im image-Tile anzeigen (Hintergrundfarbe aus Config: `infrastruktur/dialog_preview_bg_color`) | | `ssg-dia-update-preview tile idx lib liste` | Vorschau anhand Index-String aus Radio-/List-Tile aktualisieren | | `ssg-modul-dialog dcl id sel-tile start-val prev-tile lib slides extra-init extra-read` | Vollständiger Modul-Dialog: lädt DCL, setzt Tiles, verknüpft Vorschau, liefert gewählten Index | | `ssg-insert-modul layer farbe pfad attribs rotation` | Standardsequenz: Layer anlegen → Punkt abfragen → Block einfügen → Attribute setzen | Die Datei enthält außerdem ein auskommentiertes **Template** für neue `c:BEFEHL`-Definitionen nach dem SSG-Muster. --- ### `ssg_layer.lsp` – Interaktive Layer-Verwaltung Benutzerfreundliche BricsCAD-Befehle für Layer-Operationen. Alle Befehle sichern die Umgebung über `ssg-start`/`ssg-end`. Setzt `ssg_core.lsp` voraus. **Hilfsfunktionen:** | Funktion | Beschreibung | | --- | --- | | `ssg-layer-list-all` | Alle Layernamen als Liste | | `ssg-layer-info-all` | Alle Layer als Assoziationslisten (Name, Farbe, Linientyp, Flags) | | `ssg-layer-visible-p name` | Sichtbarkeitsstatus prüfen (`T` = sichtbar) | | `ssg-layer-safe-p name gruppe` | Prüfen ob Layer ausgeschaltet werden darf (nicht aktiver Layer) | | `ssg-layer-group name` | Gruppen-Kennung aus Layernamen extrahieren (Position 2–3) | | `ssg-layer-rename-group name neu` | Neuen Layernamen mit geänderter Gruppen-Kennung berechnen | | `ssg-layer-group-move alt neu` | Alle Objekte einer Layergruppe auf neue Gruppen-Kennung verschieben | **BricsCAD-Befehle:** | Befehl | Beschreibung | | --- | --- | | `c:SSG-LayerSet` | Layer des angeklickten Objektes als aktiven Layer setzen | | `c:SSG-LayerInfo` | Layer des angeklickten Objektes anzeigen | | `c:SSG-LayerMove` | Auswahlsatz auf Layer eines anderen Objektes verschieben | | `c:SSG-LayerCopy` | Auswahlsatz kopieren und Kopie auf Ziel-Layer legen | | `c:SSG-LayerMoveType` | Alle Objekte des gleichen Typs auf dem gleichen Layer verschieben | | `c:SSG-LayerOff` | Layer durch Anklicken ausschalten (Schleife bis Enter) | | `c:SSG-LayerFreeze` | Layer durch Anklicken einfrieren (Schleife bis Enter) | | `c:SSG-FreezeAll` | Alle Layer außer einem einfrieren | | `c:SSG-ThawAll` | Alle Layer auftauen | | `c:SSG-LayerOnAll` | Alle ausgeschalteten Layer einschalten | | `c:SSG-LayerDelete` | Layer mit Sicherheitsabfrage löschen (Objekte + Layer) | --- ### `ssg_load.lsp` – Laderoutine Lädt alle Module in der richtigen Reihenfolge. Ermittelt den Pfad automatisch über `findfile`. Ruft direkt nach `ssg_core.lsp` die Funktion `ssg-load-config` auf, damit die JSON-Konfiguration für alle nachfolgenden Module verfügbar ist. --- ### `VarioFoerderer.lsp` – Vario-Förderer Parametrischer Generator für ILS Vario-Förderanlagen. Liest Block-Geometrie aus einer DWG-Bibliothek (`DXFM_BLOCKS`). Alle Konstanten (Abstände, Winkel, Skalierung) werden via `ssg-cfg-or` aus `component_defaults.json` (Sektion `vario`) gelesen. **Befehl:** `c:FOERDERANLAGE` **Wichtige interne Funktionen** (werden auch von `Gefaellestrecke.lsp` genutzt): | Funktion | Beschreibung | | --- | --- | | `init-bibliothek` | Block-Bibliothek aus DWG laden und Geometriedaten extrahieren | | `ensure-block-loaded name` | Block aus Bibliothek in aktives Dokument laden (einmalig) | | `insert-block-by-ks name ks-nr pt` | Block anhand Koordinatensystem-Punkt einfügen | | `insert-inclined-scaled-block name laenge winkel pt` | Geneigten, skalierten Block einfügen | | `insert-rotated-block-with-ks name rot pt` | Rotierten Block mit KS-Offset einfügen | | `get-line-start-end-points ename` | Start- und Endpunkt einer LINE-Entity ermitteln | | `punkt-differenz p1 p2` | Differenzvektor zweier Punkte | --- ### `Gefaellestrecke.lsp` – Gefällestrecken-Generator Erzeugt eine einfache Förderanlage mit festem Gefällewinkel: `AUS-Element → Staustrecke (skaliert) → Separator → EIN-Element` Setzt `VarioFoerderer.lsp` voraus (nutzt dessen `init-bibliothek`, `insert-block-by-ks` und weitere Hilfsfunktionen). Alle Defaults (`default_delta_l`, `default_winkel`, `separator_breite`) kommen aus Config-Sektion `gefaelle`. **Befehl:** `c:GEFAELLESTRECKE` Zwei Modi: - **Modus 1:** Startpunkt + ΔL (Horizontalabstand) interaktiv abfragen - **Modus 2:** Bestehende 3D-Linie wählen (ΔL und Winkel werden daraus berechnet) --- ### `export.lsp` – Export-Funktionen Sammelt INSERT-Blöcke aus der Zeichnung und exportiert sie als JSON oder ruft Python-Skripte für den Sivas-Export auf. | Befehl / Funktion | Beschreibung | | --- | --- | | `c:EXPORTSIVAS` | Alle Blöcke als JSON sammeln und `export_sivas.py` aufrufen (Sivas-CSV) | | `c:EXPORTCSV` | Alle Blöcke als JSON sammeln und `export_csv.py` aufrufen (einfache Item-Liste) | | `c:OMNI_EXPORT` | LISP-basierter Omniflo-Export: Blöcke direkt in CSV schreiben (ohne Python) | | `csv:collect-export-blocks` | Alle INSERT-Blöcke der Zeichnung als JSON-Array sammeln | | `csv:run-export py-skript json-datei output-csv` | Python-Skript mit gesammelten Daten aufrufen | | `csv:read-attribs ename` | Attribute eines INSERT als JSON-Objekt lesen | | `csv:omni-bogen-merkmale ename rot` | Omniflo-Bogen-Merkmale als JSON-String | | `csv:omni-weiche-merkmale ename rot` | Omniflo-Weichen-Merkmale als JSON-String | | `csv:omni-gerade-merkmale ename rot` | Omniflo-Gerade-Merkmale als JSON-String (Länge via `infrastruktur/mm_pro_meter`) | Default-Werte (HOEHE, DREHUNG, Längen) kommen via `ssg-cfg-or` aus Config-Sektion `omniflo`. --- ### `tests.lsp` – Testbefehle Testbefehle für die Python-Integration. Export-Funktionen wurden in `export.lsp` ausgelagert. | Befehl | Beschreibung | | --- | --- | | `c:CALLPYTHON` | `testpycall.py` via `_.SHELL` aufrufen und Rückgabe einlesen (Integrationstest LISP↔Python) | --- ### `KreiselInsert.lsp` – ILS Kreisel und Eckrad AutoLISP-Implementierung fuer ILS Kreisel und Eckrad. Enthaelt alle Befehle fuer Einfuegen, Verbinden, Neuzeichnen und Bearbeiten. | Befehl | Beschreibung | | --- | --- | | `c:KreiselInsert` | Kreisel-Block an Punkt einfuegen (mit Dialog fuer Parameter) | | `c:KreiselConnect` | Zwei Punkte waehlen, Kreisel dazwischen einfuegen | | `c:KreiselRedraw` | Bestehenden Kreisel mit neuen Parametern neu zeichnen | | `c:KreiselQuick` | Schnelleinfuegung mit Standardwerten | | `c:KreiselEdit` | Kreisel-Attribute ueber DCL-Dialog bearbeiten | | `c:KreiselParams` | Aktuelle Kreisel-Parameter anzeigen | | `c:KreiselLabelSetup` | Schriftart, Hoehe und Farbe fuer Kreisel-Beschriftung konfigurieren | | `c:KreiselLabelPos` | Label-Offset (dx/dy) setzen | | `c:KreiselLabelHoehe` | Label-Hoehe aendern | | `c:ILS_Eckrad` | Eckrad an Tangentenpunkt einfuegen | --- ### `OmniModulInsert.lsp` – Omniflo-Komponenten AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen. Liest JSON-Daten aus `omniflo_boegen.json` und `omniflo_weichen.json`. Alle Konstanten via `ssg-cfg-or` aus Config. | Befehlsgruppe | Befehle | Beschreibung | | --- | --- | --- | | Daten | `OMNI_LOAD`, `OMNI_INFO_BOGEN`, `OMNI_INFO_WEICHE` | JSON-Daten laden und abfragen | | Boegen | `OMNI_APB_630_90`, `OMNI_APB_550_675`, `OMNI_APB_630_45`, `OMNI_APB_550_225`, `OMNI_APB_650_180` | Omniflo-Boegen ueber DCL-Dialog einfuegen | | Weichen | `OMNI_W90_*`, `OMNI_W45_*`, `OMNI_WP_*`, `OMNI_WK_*`, `OMNI_WKomb_*` | Omniflo-Weichen (Einfach/Doppel/Dreiwege, Delta, Stern) | | Geraden | `OMNI_AP60`, `OMNI_AP110`, `OMNI_APG110` | Omniflo-Geradenstuecke | | TEF | `OMNI_TEF_UmlenkR/L`, `OMNI_TEF_AntriebL/R`, `OMNI_TEF_Gerade` | Omniflo-TEF-Elemente | | Transferwagen | `OMNI_TV_*` | Transferwagen-Komponenten und Schaltwerke | | Bogenweichen | `OMNI_APBW_*` | Omniflo-Bogenweichen (diverse Radien/Winkel) | | Bearbeiten | `OMNI_EDIT` | Omniflo-Block selektieren und Attribute bearbeiten | --- ### `SSG_LIB_Commands.lsp` – Dummy-Befehle und SSG_BLOCKEDIT Platzhalter-Definitionen fuer noch nicht implementierte Menueintraege. Gibt beim Aufruf eine Meldung aus. Registrierte Dummy-Befehle: | Gruppe | Befehle | | --- | --- | | ILS Zusatzmodule | `ILS_BTMT_Beladung`, `ILS_BTMT_Entladung`, `ILS_ETF_Etagenfoerderer`, `ILS_TEF_Strecke` | | ILS Kurven angetrieben Aussen | `ILS_K90LA`, `ILS_K90RA`, `ILS_K60LA`, `ILS_K60RA`, `ILS_K30LA`, `ILS_K30RA` | | ILS Kurven angetrieben Innen | `ILS_K90LI`, `ILS_K90RI`, `ILS_K60LI`, `ILS_K60RI`, `ILS_K30LI`, `ILS_K30RI` | | ILS Gefaellestrecken-Kurven | `ILS_Gefaellestrecke`, `ILS_GK90L`, `ILS_GK90R`, `ILS_GK60L`, `ILS_GK60R`, `ILS_GK30L`, `ILS_GK30R` | > `FOERDERANLAGE` ist nicht hier definiert – dieser Befehl ist in `VarioFoerderer.lsp` implementiert. **SSG_BLOCKEDIT** – Doppelklick/Kontextmenue-Dispatcher: Erkennt den Blocktyp des selektierten INSERT-Blocks und ruft den passenden Bearbeitungsbefehl auf: | Blockmuster | Aktion | | --- | --- | | `KREISEL_*` | `KreiselEdit` | | `ECKRAD_*` | `BEDIT` (Block-Editor) | | Omniflo (TEILEART-Attribut, AP110*, numerisch) | `OMNI_EDIT` | | Sonstige | `BEDIT` (Block-Editor) |