Lisp/README.md als Doku der LispFunktionen erneuert. set_attr.py baut jetzt einen einzigen Block der alle Geometrie und die Attribute enthält.

This commit is contained in:
2026-06-12 17:25:22 +02:00
parent 7a13171714
commit 2f583a96cb
3 changed files with 230 additions and 57 deletions
+205 -50
View File
@@ -1,22 +1,29 @@
# Lisp AutoLISP-Standardbibliotheken
# Lisp AutoLISP-Bibliotheken (SSG_LIB)
Allgemeingültige AutoLISP-Routinen für AutoCAD, destilliert aus den historischen ACADSST-Makros (Schönenberger Systeme GmbH). Die drei `ssg_`-Bibliotheken sind projektunabhängig einsetzbar.
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
## Ladereihenfolge (`ssg_load.lsp`)
```lisp
(load "pfad/ssg_load.lsp") ; lädt core → dialog → layer
(load "pfad/ssg_load.lsp")
```
Oder einzeln (Abhängigkeit beachten: `ssg_dialog` und `ssg_layer` setzen `ssg_core` voraus):
Die Laderoutine lädt alle Module automatisch in der richtigen Reihenfolge:
```lisp
(load "pfad/ssg_core.lsp")
(load "pfad/ssg_dialog.lsp")
(load "pfad/ssg_layer.lsp")
```
1. `ssg_core.lsp` Kernbibliothek
2. `(ssg-load-config)` JSON-Konfiguration laden (aus `data/json/component_defaults.json`)
3. `ssg_dialog.lsp` Dialog-Patterns
4. `ssg_layer.lsp` Layer-Verwaltung
5. `VarioFoerderer.lsp` Vario-Förderer und Gefällestrecken-Basis
6. `Gefaellestrecke.lsp` Gefällestrecken-Generator (setzt VarioFoerderer voraus)
7. `export.lsp` Export-Funktionen (JSON-Sammler, Python-Export, Omniflo-Export)
8. `tests.lsp` Testbefehle (Python-Aufruf via CALLPYTHON)
9. `SSG_LIB_Commands.lsp` Dummy-Befehle für Menüeinträge
> **KreiselInsert.lsp** und **OmniModulInsert.lsp** sind nicht mehr im Ladevorgang
> sie wurden durch Python/PyRx-Module ersetzt (`lib/elemente/kreisel.py`, `eckrad.py`, `dblclick.py`).
---
@@ -24,42 +31,125 @@ Oder einzeln (Abhängigkeit beachten: `ssg_dialog` und `ssg_layer` setzen `ssg_c
### `ssg_core.lsp` Kernbibliothek
Grundfunktionen für Umgebungssicherung, Benutzerinteraktion, Layer, Blöcke und Attribute.
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` wird für jeden Entity-Name aufgerufen |
| `ssg-ss-redraw ss modus` | Alle Elemente eines Auswahlsatzes hervorheben (3), invertieren (4) oder normal (0) |
| `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; Name aus `ssg-make-blockname` |
| `ssg-attrib-set tag wert ersetzen` | Ein Attribut der letzten Einfügung setzen oder anfügen |
| `ssg-attrib-set-many alist` | Mehrere Attribute auf einmal setzen (`'(("TAG" . "Wert") ...)`) |
| `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.
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 aktualisieren (Bibliothek + Slide-Name) |
| --- | --- |
| `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 zurück |
| `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.
@@ -68,24 +158,24 @@ Die Datei enthält außerdem ein auskommentiertes **Template** für neue `c:BEFE
### `ssg_layer.lsp` Interaktive Layer-Verwaltung
Benutzerfreundliche AutoCAD-Befehle für Layer-Operationen. Alle Befehle sichern die Umgebung über `ssg-start`/`ssg-end`.
Benutzerfreundliche BricsCAD-Befehle für Layer-Operationen. Alle Befehle sichern die Umgebung über `ssg-start`/`ssg-end`. Setzt `ssg_core.lsp` voraus.
**Hilfsfunktionen (intern):**
**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-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 Layernahme extrahieren (Position 23) |
| `ssg-layer-group name` | Gruppen-Kennung aus Layernamen extrahieren (Position 23) |
| `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 |
**AutoCAD-Befehle:**
**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 |
@@ -102,34 +192,99 @@ Benutzerfreundliche AutoCAD-Befehle für Layer-Operationen. Alle Befehle sichern
### `ssg_load.lsp` Laderoutine
Lädt alle drei Bibliotheken in der richtigen Reihenfolge. Ermittelt den Pfad automatisch über `findfile`.
---
### `SSG_LIB_Commands.lsp` Dummy-Befehle für das SSG-Menü
Platzhalter-Definitionen für alle Menüeinträge des SSG-Menüsystems (ILS-Module, Kurven, Gefällestrecken). Gibt beim Aufruf eine Meldung aus. Wird durch echte Implementierungen ersetzt sobald die jeweiligen Blöcke und DCL-Dialoge vorliegen.
---
### `ILSModulInsert.lsp` ILS Kreisel-Modul-Einfügung
Einfügen von ILS-Kreisel-Modulen mit Abstand- und Typ-Konfiguration (mit/ohne PIN). Enthält Smart-Connect-Logik für automatische Positionierung. Befehl: `c:KreiselInsert`.
---
### `OmniModulInsert.lsp` Omni-Modul-Einfügung
Einfügen von Omni-Modulen. Befehl analog zu `ILSModulInsert`.
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
Umfangreiche Routinen für den Vario-Förderer (Strecken, Kurven, Sonderelemente). Größte Einzeldatei im Projekt.
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 |
---
### `tests.lsp` Testskript
### `Gefaellestrecke.lsp` Gefällestrecken-Generator
Manuelle Tests für die Bibliotheksfunktionen. Nicht für den Produktiveinsatz laden.
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 (veraltet, nicht geladen)
Ursprüngliche AutoLISP-Implementierung für ILS Kreisel und Eckrad. **Nicht mehr in `ssg_load.lsp` eingebunden** ersetzt durch `lib/elemente/kreisel.py` und `lib/elemente/eckrad.py` (PyRx). Die Datei bleibt als Referenz im Repository.
---
### `OmniModulInsert.lsp` Omniflo-Einfügung (veraltet, nicht geladen)
AutoLISP-Implementierung für Omniflo Bögen und Weichen. **Nicht mehr in `ssg_load.lsp` eingebunden** wurde durch Python/PyRx abgelöst. Alle Konstanten waren bereits auf `ssg-cfg-or` umgestellt. Die Datei bleibt als Referenz im Repository.
---
### `SSG_LIB_Commands.lsp` Dummy-Befehle für das SSG-Menü
Platzhalter-Definitionen für noch nicht implementierte Menüeinträge. 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 Außen | `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 Gefällestrecken-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.
+6 -5
View File
@@ -222,11 +222,12 @@ def import_element_as_block(source_doc, target_doc, block_name):
importer = Importer(source_doc, target_doc)
importer.import_tables()
blk = target_doc.blocks.new(name=block_name)
if block_name in source_doc.blocks:
source_layout = source_doc.blocks[block_name]
else:
source_layout = source_doc.modelspace()
for entity in source_layout:
# if block_name in source_doc.blocks:
# source_layout = source_doc.blocks[block_name]
# else:
# source_layout = source_doc.modelspace()
# for entity in source_layout:
for entity in source_doc.modelspace():
importer.import_entity(entity, blk)
importer.finalize()
return block_name
+19 -2
View File
@@ -160,7 +160,11 @@ ATTDEF_LAYER = "ATTRIB"
def wrap_entities_in_block(doc, block_name):
"""
Verschiebt alle Entities aus dem Modelspace in eine Blockdefinition
mit dem Namen block_name und fuegt eine Blockreferenz bei (0, 0) ein.
mit dem Namen block_name.
Im Modelspace wird ein INSERT erzeugt, dem ATTRIB-Entities hinzugefuegt
werden - mit den Standardwerten aus den ATTDEFs der Blockdefinition.
Dadurch zeigt BricsCAD beim Klick auf den Block die Attributwerte an.
Vorhandene Blockdefinition mit gleichem Namen wird ersetzt (fuer Re-Runs).
"""
msp = doc.modelspace()
@@ -174,7 +178,20 @@ def wrap_entities_in_block(doc, block_name):
for entity in list(msp):
msp.move_to_layout(entity, blk)
msp.add_blockref(block_name, (0, 0))
# INSERT im Modelspace
blkref = msp.add_blockref(block_name, (0, 0))
# ATTRIB-Entities aus ATTDEFs befuellen (Werte aus ATTDEF-Standardtext)
for attdef in (e for e in blk if e.dxftype() == "ATTDEF"):
blkref.add_attrib(
tag=attdef.dxf.tag,
text=attdef.dxf.text,
insert=attdef.dxf.insert,
dxfattribs={
"layer": attdef.dxf.layer,
"height": attdef.dxf.height,
},
)
def add_attdefs_to_dxf(dxf_path, output_path, attr_defs, json_entry, sivasnr,