on_start.lsp entfernt: Das Menue wird einmalig manuell per BricsCAD-Befehl _MENULOAD eingerichtet. BricsCAD speichert die Menuregistrierung dauerhaft. Ein externes Startup-Skript ist nicht mehr noetig. Dokumentation aktualisiert: CLAUDE.md: Lademechanismus neu beschrieben mit _MENULOAD-Anleitung, Legacy-Liste bereinigt (on_start.lsp als entfernt eingetragen) Lisp/README.md: Ladereihenfolge durch Menueeinrichtungs-Anleitung ersetzt; ssg_load.lsp als Notfall-Alternative dokumentiert doc/LispTests.md: Verweis auf ssg_load.lsp und on_start bereinigt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
15 KiB
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.
Menue einrichten und Module laden
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
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".
Manuell laden (Notfall / Entwicklung):
(load "C:/10-Develop/gitrepos/dxfmakros/Lisp/ssg_load.lsp")
ssg_load.lsp laedt alle Module in der richtigen Reihenfolge ohne Menueabhaengigkeit.
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:
(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 |
FOERDERANLAGEist nicht hier definiert – dieser Befehl ist inVarioFoerderer.lspimplementiert.
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) |