From 68ad56ec6c7b4c3ff0dee349a49de469996c18a9 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Fri, 9 Oct 2026 10:26:10 +0200 Subject: [PATCH] [DOC] Lisp/README.md auf aktuellen Code-Stand gebracht Kern-Ladereihenfolge ergaenzt (ssg_id, ssg_ks_insert, ssg_input), Dummy-Status-Tabelle korrigiert (OMNI_TEF_* ist implementiert, nur OMNI_KettenFoerderer/OMNI_TV_*/OMNI_APBW_* und ein paar ILS-Kurven-Platzhalter sind noch Dummy). Fehlende Module ergaenzt: ssg_id.lsp, ssg_ks_insert.lsp, TEFInsert.lsp, GeruestInsert.lsp, Tro_Edit.lsp, Connection_Edit.lsp, DrawPlanquadrate.lsp. VarioFoerderer-Abschnitt an die Submodul-Aufsplittung (vf_core/vf_standard/vf_etage/vf_linienzug/vf_konstanten/vf_spec) und den Wizard/Journal/Headless-Mechanismus angepasst. SSG_BLOCKEDIT-Dispatchtabelle um GF_*/VF_*/GR_*/TRO_* ergaenzt. Co-Authored-By: Claude Sonnet 5 --- Lisp/README.md | 244 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 199 insertions(+), 45 deletions(-) diff --git a/Lisp/README.md b/Lisp/README.md index 463944b..05d5e12 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -15,14 +15,17 @@ _MENULOAD → menu/SSG_LIB.mnu auswaehlen ``` BricsCAD laedt daraufhin automatisch `SSG_LIB.mnl`, welches alle Module -per `ssg-ensure` initialisiert (Kern: ssg_core/lang/dbg/dialog/layer, dann -alle Feature-Module). Details: siehe `../CLAUDE.md` Abschnitt "Lademechanismus". +per `ssg-ensure` initialisiert. Kern-Reihenfolge (muss vor den Feature-Modulen +stehen): `ssg_core`, `ssg_lang`, `ssg_dbg`, `ssg_dialog`, `ssg_layer`, `ssg_id`, +`ssg_ks_insert` (Letzteres wird von Gefaellestrecke UND VarioFoerderer genutzt). +Details: siehe `../CLAUDE.md` Abschnitt "Lademechanismus". -**Manuell laden (Notfall / Entwicklung):** +**Manuell laden (Notfall / Entwicklung, z.B. fuer .scr-Testskripte):** ```lisp (load (strcat (getenv "DXFMAKRO") "/Lisp/ssg_load.lsp")) ``` -`ssg_load.lsp` laedt alle Module in der richtigen Reihenfolge ohne Menueabhaengigkeit. +`ssg_load.lsp` ist der Headless-Loader (genutzt von `tests/test_unit.scr` u.ae.) +und laedt dieselbe Kern-Reihenfolge wie `SSG_LIB.mnl`, ohne Menueabhaengigkeit. --- @@ -35,16 +38,22 @@ am Label-Anfang, bei Submenue-Schliessern hinter dem `<-` (`[<-~Label]`). | Menuebereich | Eintraege | Definiert in | | --- | --- | --- | -| ILS ▸ Foerderer | Durch TEF angetriebene Strecke; Kurven 90/60/30 links/rechts angetrieben Aussen + Innen (12) | `SSG_LIB_Commands.lsp` | -| ILS ▸ Gefaellestrecke | Kurven 90/60/30 links/rechts Gefaellestrecke (6) | `SSG_LIB_Commands.lsp` | -| Omniflo ▸ TEF Elemente | UmlenkR/L, AntriebL/R, TEF Gerade, KettenFoerderer (6) | `OmniModulInsert.lsp` | +| Omniflo ▸ Anbaugruppen | `OMNI_KettenFoerderer` | `OmniModulInsert.lsp` | | Omniflo ▸ Verbinder | alle `OMNI_TV_*` (18) | `OmniModulInsert.lsp` | | Omniflo ▸ Boegen fuer Weichen | alle `OMNI_APBW_*` (14) | `OmniModulInsert.lsp` | +| ILS ▸ Zusatzmodule/Kurven | `ILS_ETF_Etagenfoerderer`, `ILS_K{90,60,30}{L,R}{A,I}` (12), `ILS_Gefaellestrecke` | `SSG_LIB_Commands.lsp` | +| Geruest | `GERUEST` (Gattertraeger-Platzhalter, derselbe Befehl wie Saeulen/Rohrabhaenger/Wandbefestigung) | `GeruestInsert.lsp` | -Aktiv (implementiert) sind u.a.: Kreisel, Eckrad, VarioFoerderer, EtageVarioFoerderer, -Gefaellestrecke, BTMT Be-/Entladung, Scanner/Separator, Omniflo Boegen (APB), -Aluprofil-Geraden (AP), alle Weichen (W90/W45/WP/WK/WKomb), Export (Sivas/CSV) -und die Tests. +`OMNI_TEF_*` (UmlenkR/L, AntriebL/R, TEF Gerade) sind entgegen frueherem Stand +**implementiert** (echtes `omni:insert-dxf`), nur `OMNI_KettenFoerderer` ist +weiterhin Dummy. + +Aktiv (implementiert) sind u.a.: Kreisel, Eckrad, VarioFoerderer (Standard/Etage/ +Linienzug), Gefaellestrecke, Geruest (Saeulen/Rohrabhaenger/Wandbefestigung/ +Rohr-Geruest-Traeger), TRO-Marker, Connections, BTMT Be-/Entladung, Scanner/ +Separator, Omniflo Boegen (APB)/TEF-Elemente/Aluprofil-Geraden (AP)/alle Weichen +(W90/W45/WP/WK/WKomb)/Ladeschleifen, Export (Sivas/CSV), Werkzeuge (Block-/ +Text-Tools, Planquadrate) und die Tests. --- @@ -342,6 +351,42 @@ Hook (z.B. fuer ein Eingabe-Journal): `(setq *ssg-in-hook* 'meine-funktion)` mit --- +### `ssg_id.lsp` – Eindeutige Block-IDs + +Jedes exportierbare Element bekommt ein Attribut `ID` mit einer eindeutigen, +vierstelligen Nummer. Kern-Modul (nach `ssg_layer`, vor `ssg_ks_insert`). + +| Befehl / Funktion | Beschreibung | +| --- | --- | +| `c:IDGENERATE` | Weist dem zuletzt eingefuegten Block eine neue ID zu | +| `c:IDSCHECK` | Prueft alle Bloecke auf doppelte IDs und korrigiert sie | +| `ssg-id-format n` | Zahl als 4-stelligen String formatieren (`1` → `"0001"`) | +| `ssg-id-max` | Hoechste bereits vergebene ID in der Zeichnung | +| `ssg-id-generate ent` | Neue ID erzeugen und auf den Block setzen | +| `ssg-id-check-all` | Zeichnungsweit auf Doubletten pruefen und korrigieren | +| `ssg-id-collect-blocks` | Alle ID-faehigen INSERT-Entities sammeln (gleiche Muster wie `csv:collect-export-blocks`, inkl. Separator/Scanner/BTMT) | + +--- + +### `ssg_ks_insert.lsp` – KS-Extraktion und Block-Einfuegeprimitiven + +Gemeinsame Basis fuer VarioFoerderer (`vf_core.lsp`) UND Gefaellestrecke – +frueher in beiden Modulen dupliziert, jetzt einzige Quelle. Muss laut MNL **vor** +Gefaellestrecke/`vf_core` geladen sein; Kern-Modul. + +| Funktion | Beschreibung | +| --- | --- | +| `vec-length v` | Laenge eines 3er-Vektors | +| `ks-line-axis laenge` | Achsenkennung (X/Y/Z) aus Linienlaenge der KS-Hilfslinie | +| `ks-normalize-name nm` | Historische KS-Blocknamen (`KSYS_EIN`/`-AUS`) auf `KS_EIN`/`KS_AUS` normalisieren | +| `ks-relativize` / `ks-absolutize` | KS-Punkte zwischen relativem und Welt-Koordinatensystem umrechnen | +| `ensure-block-loaded name` | Block aus der Bibliothek einmalig ins aktive Dokument laden | +| `extract-ks-from-block[-raw] name` | KS_EIN/KS_AUS-Punkte eines Blocks ermitteln (Cache `*ks-cache*`) | +| `insert-block-by-ks name ks-nr pt` | Block anhand KS-Punkt einfuegen (nur Rz-Rotation) | +| `insert-inclined-scaled-block` / `insert-rotated-block-with-ks` | Geneigten/rotierten Block mit KS-Offset einfuegen (Rz*Ry) | + +--- + ### `ssg_blocktools.lsp` – Block-Werkzeuge Ursprung: ACADSST `TOOLS.LSP` (`BLKANZAHL`, `BLKENTF`), `DINGEN2` (`g-bli`), `ssg.lsp` (`suchen-aendern`). Arbeitet im **aktuellen Layout-Reiter**. Blocknamen werden ueber den wirksamen Namen verglichen (dynamische Bloecke); Muster mit `wcmatch` (`*`, `?`, `#`, ohne Gross-/Kleinschreibung). @@ -382,48 +427,60 @@ Nicht uebernommen aus Walz: `Export`/`Import` von Texten (besser per Python/ezdx ### `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. +Headless-Loader fuer .scr-Testskripte (z.B. `tests/test_unit.scr`). Laedt alle +Kern- und Feature-Module in derselben Reihenfolge wie `SSG_LIB.mnl`, ohne +Menueabhaengigkeit. 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 +### `VarioFoerderer.lsp` – Vario-Förderer (Wrapper) -Kompatibilitäts-Wrapper, der `vf_core.lsp` lädt (Plugin-Dispatcher-Architektur; lädt seinerseits `vf_standard.lsp`, `vf_etage.lsp`, `vf_linienzug.lsp`). 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. +Kompatibilitäts-Wrapper, der `vf_core.lsp` lädt (Plugin-Dispatcher-Architektur +über `*vf-typ-registry*`; lädt seinerseits `vf_konstanten.lsp`, `vf_standard.lsp`, +`vf_etage.lsp`, `vf_linienzug.lsp`, danach `vf_spec.lsp`). Parametrischer Generator +für ILS Vario-Förderanlagen (Typen Standard/Etage/Linienzug). Liest Block-Geometrie +aus einer DWG-Bibliothek (`DXFM_BLOCKS`) über die Primitiven aus `ssg_ks_insert.lsp`. +Alle Konstanten (Abstände, Winkel, Skalierung) werden über `ssg-cfg-or` +(`component_defaults.json`, Sektion `vario`) bzw. die zentralen `*vfk-*`-Konstanten +aus `vf_konstanten.lsp` gelesen. **Befehl:** `c:FOERDERANLAGE` / `c:VarioFoerderer` – wählt zuerst den Anlagen-Typ (Standard/Etage/Linienzug): -- **Typ „standard“ + Werteingabe:** läuft über den DCL-Dialog - [`dcl/variofoerderer.dcl`](../dcl/variofoerderer.dcl) (zwei Dialoge, `vfs-standard-dialog-ablauf` - in `vf_standard.lsp`): Dialog 1 (`vfs-dialog-eingabe-basis`) erfasst deltaL, deltaH, - Förderrichtung (Auf/Ab), Einfügehöhe, Fahrtrichtung und Seite; anschließend berechnet - `berechne-standard` die gültigen Winkel-Varianten, und Dialog 2 - (`vfs-dialog-winkel-verteilung`) lässt Winkel und L_GF-Verteilung (vorne/hinten) wählen. - Startpunkt (X/Y) wird wie bei der Gefällestrecke vorher in der Zeichnung gepickt. -- **Typ „standard“ + 3D-Linie**, sowie **Typ „etage“** und **„linienzug“** bleiben - vollständig interaktiv (Kommandozeile), unverändert gegenüber dem bisherigen Ablauf. +- **Typ „standard“ und „etage“ + Werteingabe:** laufen über denselben, + typ-parametrisierten Dialog-Ablauf (`vf-dialog-ablauf` in `vf_core.lsp`; + `vfs-standard-dialog-ablauf`/`vfe-etage-dialog-ablauf` sind nur noch duenne + Wrapper darauf) mit den Dialogen `vfs-dialog-eingabe-basis`/ + `vfs-dialog-winkel-verteilung` ([`dcl/variofoerderer.dcl`](../dcl/variofoerderer.dcl)): + Dialog 1 erfasst deltaL, Förderrichtung, Einfügehöhe/deltaH, Fahrtrichtung und + Seite/Motorseite; Dialog 2 lässt Winkel und L_GF-Verteilung (vorne/hinten) wählen. + Startpunkt (X/Y) wird vorher in der Zeichnung gepickt. +- **Typ „standard“/„etage“ + 3D-Linie** laufen ueber denselben Basis-Dialog statt + rein interaktiv auf der Konsole. +- **Typ „linienzug“** (Streckengruppe, `vf-linienzug-modus` in `vf_linienzug.lsp`) + hat drei Modi (manuell/Wizard, 3D-Objekte+Zielhoehe, Vorwaerts-Nachbau) und + zeichnet jede Eingabe in einem Journal auf (XDATA `SSG_VF_EDIT` am `VF_n`-Block); + Standard laeuft per Default ueber DCL-Dialoge (`VF_WIZARD_AN`/`VF_WIZARD_AUS` + schalten um). Details, Journal-Format, Headless-Modus (`*vfl-headless*`) und + Spec-basierter Bau ohne Dialog (`vf_spec.lsp`, `VF_SPEC_BAU`): siehe + [`../doc/variofoerderer.md`](../doc/variofoerderer.md) und `../CLAUDE.md`. **Bearbeiten (`c:VARIOFOERDERER_EDIT`):** Doppelklick auf einen `VF_n`-Block – bzw. -Rechtsklick-Kontextmenü/`SSG_BLOCKEDIT` – öffnet dieselben Dialoge, vorbelegt mit den -aktuellen Parametern, und baut die Strecke bei OK am selben Startpunkt neu auf (neue -`VF_n`-Nummer). Da `VF_n`-Blöcke auch von Etage- und Linienzug-Anlagen erzeugt werden -(deren komplexere Geometrie ein einfacher Neuaufbau zerstören würde), markiert -`vfs-xdata-schreiben` nur per Standard-Dialog erstellte Blöcke mit XDATA (App -`SSG_VF_EDIT`, Fahrtrichtung `hz`); Blöcke ohne diese Markierung weist -`c:VARIOFOERDERER_EDIT` mit einer Meldung ab, statt sie zu verändern. Winkel und L_GF1 -werden aus den Sivas-Attributen (`VF_WINKEL`, `L_GF_m`) vorbelegt (Verteilung stets als -„Eigene Werte“ mit dem exakten aktuellen L_GF1). +Rechtsklick-Kontextmenü/`SSG_BLOCKEDIT` – dispatcht per XDATA-Marker +(`"standard"`/`"etage"`/`"linienzug"`) in den passenden Neuaufbau-Zweig +(`vfe-edit-ent` fuer Etage, `vfl-edit-ent` fuer Linienzug) und öffnet dieselben +Dialoge, vorbelegt mit den aktuellen Parametern; der Block wird am selben +Startpunkt neu aufgebaut (neue `VF_n`-Nummer). Altbestand-Blöcke ohne +Marker werden mit einer Meldung abgewiesen, statt sie zu verändern. Winkel und +L_GF1 werden aus den Sivas-Attributen (`VF_WINKEL`, `L_GF_m`) vorbelegt. -**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 | +Die Block-Einfuege-Primitiven (`ensure-block-loaded`, `insert-block-by-ks`, +`insert-inclined-scaled-block`, `insert-rotated-block-with-ks` u.a.) sind seit +der Konsolidierung zentral in [`ssg_ks_insert.lsp`](#ssg_ks_insertlsp--ks-extraktion-und-block-einfuegeprimitiven) +definiert (von `vf_core.lsp`, `Gefaellestrecke.lsp` und `TEFInsert.lsp` genutzt). +Weitere interne Helfer: `init-bibliothek` (Block-Bibliothek aus DWG laden), +`get-line-start-end-points ename`, `punkt-differenz p1 p2`. --- @@ -471,6 +528,19 @@ Der Neuaufbau läuft über `gf-rebuild` (nicht-interaktiv, ohne Konsolen-Rückfr --- +### `TEFInsert.lsp` – TEF-Geradenstuecke entlang einer Linie + +**Befehl:** `c:TEF_FOERDERER_LINIE`. Zeichnet eine Linie zwischen zwei gewaehlten +Punkten und reiht darauf 1000-mm-TEF-Geradenelemente (`0_B10030` aus +`DXFM_OMNIFLO`) aneinander; ist die Linienlaenge kein exaktes Vielfaches, +wird ein zusaetzliches, zurueckverschobenes Element eingefuegt, sodass der +Foerderer exakt am Linienende endet (keine Luecke, kein abgeschnittenes +Element). Die Linie darf geneigt sein (3D) – Elemente werden dann analog zu +`vf_core.lsp`/`ssg_ks_insert.lsp` (Rz*Ry-Rotation) gekippt eingefuegt. Nicht +zu verwechseln mit den einzelnen `OMNI_TEF_*`-Befehlen in `OmniModulInsert.lsp`. + +--- + ### `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. @@ -629,11 +699,16 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind | 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 | | Ladeschleifen | `OMNI_LADESCHLEIFE_AP110` | Ladeschleife aus `omniflo_ladeschleifen.json` ueber DCL-Dialog (`dcl/omniflo_ladeschleifen.dcl`) einfuegen; Daten per `ssg-json-laden` (Beschreibungen enthalten Kommas). Blockdatei `.dwg` unter `DXFM_OMNIFLO` (`omni:insert-dxf` faellt auf `.dwg` zurueck, wenn keine `.dxf` existiert). Per `OMNI_EDIT` editierbar | -| TEF ⚠️ | `OMNI_TEF_UmlenkR/L`, `OMNI_TEF_AntriebL/R`, `OMNI_TEF_Gerade`, `OMNI_KettenFoerderer` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) | +| TEF Elemente | `OMNI_TEF_UmlenkR/L`, `OMNI_TEF_AntriebL/R`, `OMNI_TEF_Gerade` | Feste TEF-Bauteile ohne Sivas-Auswahl, direkt per `omni:insert-dxf` an gewaehltem Punkt eingefuegt (Dateien unter `DXFM_OMNIFLO`) | +| Anbaugruppen ⚠️ | `OMNI_KettenFoerderer` | **Dummy** (noch nicht implementiert, im Menue ausgegraut); `OMNI_STOPPER`/`OMNI_SCANNER`/`OMNI_BUERSTENBREMSE` sind implementiert | | Transferwagen ⚠️ | `OMNI_TV_*` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) | | Bogenweichen ⚠️ | `OMNI_APBW_*` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) | | Bearbeiten | `OMNI_EDIT` | Omniflo-Block selektieren und Attribute bearbeiten | +Daneben zeichnet [`TEFInsert.lsp`](#tefinsertlsp--tef-geradenstuecke-entlang-einer-linie) (`TEF_FOERDERER_LINIE`) eine +Kette von TEF-Geradenelementen (1000 mm) entlang einer frei gewaehlten Linie – +nicht zu verwechseln mit den einzelnen `OMNI_TEF_*`-Befehlen oben. + --- ### `SSG_LIB_Commands.lsp` – BTMT, Sensoren, Dummy-Befehle, Konfiguration und SSG_BLOCKEDIT @@ -680,6 +755,10 @@ Entladung" bzw. "BT - Beladung ..."/"Abwurf fuer Klammerbuegel ..."); im Sivas-Export zusaetzlich in den Summenzaehlern "Anzahl aller BTBeladung"/ "Anzahl aller Abwurfstationen" der ILS-Automation-Zeile. +**Eingang-/Ausgang-Symbol:** `ILS_EINGANG_INSERT`/`ILS_AUSGANG_INSERT` nutzen +dieselbe `ils-insert-station`-Routine wie BTMT Be-/Entladung (frei platzierbar, +Blöcke `Eingang_.dwg`/`Ausgang_.dwg` in `data/ils`). + Registrierte Dummy-Befehle: | Gruppe | Befehle | @@ -700,11 +779,86 @@ Registrierte Dummy-Befehle: **SSG_BLOCKEDIT** – Doppelklick/Kontextmenue-Dispatcher: -Erkennt den Blocktyp des selektierten INSERT-Blocks und ruft den passenden Bearbeitungsbefehl auf: +Erkennt den Blocktyp des selektierten INSERT-Blocks und ruft den passenden Bearbeitungsbefehl auf (Reihenfolge wichtig: `GR_*` **vor** dem Omniflo-Zweig, da Geruest-Bloecke ebenfalls ein TEILEART-Attribut tragen): | Blockmuster | Aktion | | --- | --- | | `KREISEL_*` | `KreiselEdit` | | `ECKRAD_*` | `BEDIT` (Block-Editor) | +| `GF_*` | `GEFAELLESTRECKE_EDIT` | +| `VF_*` | `VARIOFOERDERER_EDIT` | +| `GR_*` | Geruest – `BEDIT` (kein eigener Edit-Pfad; siehe `GeruestInsert.lsp`) | +| `TRO_*` | `TRO_EDIT` | | Omniflo (TEILEART-Attribut, AP110*, numerisch) | `OMNI_EDIT` | | Sonstige | `BEDIT` (Block-Editor) | + +--- + +### `GeruestInsert.lsp` – Geruest-Baugruppen + +Rohr-Geruest-Baugruppen (Saeulen, Rohrabhaenger, Wandbefestigung, Rohr-Geruest-Traeger) +aus [`data/json/geruest.json`](../data/json/geruest.json) bzw. +[`data/json/geruest_traeger.json`](../data/json/geruest_traeger.json) konfigurieren +und einfuegen. Die Dialogdefinition wird **zur Laufzeit erzeugt** +(`geruest-dcl-schreiben`, temporaere DCL-Datei) – es gibt keine feste +`dcl/geruest.dcl`, weil je Anbauteil ein eigenes Mengenfeld gebraucht wird. +Ausfuehrliche Beschreibung (Konfigurationen, Attribut-Schema, Querstreben/Muffe, +Traeger-Beschriftung): siehe `../CLAUDE.md` Abschnitt "AutoLISP-Module". + +| Befehl | Beschreibung | +| --- | --- | +| `c:GERUEST` | Dialog ohne Vorgabe-Bereich (Dropdown Rohrabhaenger/Saeulen/Wandbefestigung) | +| `c:GERUEST_SAEULEN` / `c:GERUEST_ROHRABHAENGER` / `c:GERUEST_WANDBEFESTIGUNG` | Dialog mit vorgewaehltem Bereich (derselbe Dialog wie `GERUEST`) | +| `c:GERUEST_TRAEGER` | Eigener fester Dialog (`dcl/geruest_traeger.dcl`): Rohr-Geruest-Traeger mit Linien-Logik (Start-/Endpunkt oder Laenge, Laengenabzuege, Querstreben/Muffe-Verteilung) | +| `c:GERUEST_TRAEGER_BESCHRIFTEN` | Alle Traeger der Zeichnung neu beschriften (eigenes TEXT-Objekt, verknuepft per XDATA `SSG_GR_BESCHR`) | + +Block-Praefix `GR__` – **nicht kosmetisch**: `SSG_BLOCKEDIT` muss +`GR_*` vor dem Omniflo-Zweig abfangen, da Geruest-Bloecke ebenfalls ein +TEILEART-Attribut tragen. Export-Pattern `pattern_geruest = GR_*` (`cfg/export.cfg`). + +--- + +### `Tro_Edit.lsp` – TRO-Marker + +TRO-Marker (Block `TRO_SYM_`) fuer `sps_skel`/`lib/tro_annotate.py`. + +| Befehl | Beschreibung | +| --- | --- | +| `c:TRO_INSERT` | Bestehende Blockdefinition an gewaehltem Punkt einfuegen, setzt ID/TYPE; bricht ab, wenn der Typ noch keine Blockdefinition in der Zeichnung hat (entsteht nur ueber `tro_annotate.py`) | +| `c:TRO_EDIT` | ID/TYPE eines bestehenden Markers per Dialog aendern | + +Typliste kommt aus [`tro_types.lsp`](../Lisp/tro_types.lsp) (von +`tro_annotate.py --emit-lisp` nach `DXFM_LISP` geschrieben). `SSG_BLOCKEDIT` +leitet Blocknamen `TRO_*` zu `TRO_EDIT`. + +--- + +### `Connection_Edit.lsp` – Verbindungen (SPS) + +Verbindungslinien zwischen zwei Punkten/Bausteinen fuer SPS-Dokumentation. + +| Befehl | Beschreibung | +| --- | --- | +| `c:CONNECTION_INSERT` | Verbindung zwischen zwei Punkten einfuegen (Laenge/Winkel/Mitte werden berechnet) | +| `c:CONNECTION_EDIT` | Bestehende Verbindung bearbeiten | + +--- + +### `DrawPlanquadrate.lsp` – Planquadrat-Raster + +Zeichnet auf Z=0 ein Planquadrat-Linienraster (senkrecht/waagerecht) im +Abstand/Zaehlschema der aktiven `[Planquadrate]`-Konfiguration aus +`cfg/export.cfg` – dieselbe Quelle wie `lib/export_planquadrat.py` fuer den +CSV-Export. Bereich und Ursprung kommen aus der **Bounding-Box** derselben +Blockmenge wie `EXPORTCSV` (`csv:collect-export-blocks`), nicht aus dem reinen +Einfuegepunkt oder den Zeichnungs-Extents. Lazy geladen ueber +`(ssg-ensure "DrawPlanquadrate")`, nicht Teil der Core-Ladereihenfolge. + +| Befehl | Beschreibung | +| --- | --- | +| `c:DRAW_PLANQUADRATE` | Raster neu aufbauen (entfernt zuerst einen evtl. vorhandenen Block) | +| `c:DELETE_PLANQUADRATE` | Raster-Block entfernen | +| `c:PLANQUADRATE_TOGGLE` | Dispatcht auf Zeichnen bzw. Loeschen, je nachdem ob der Block existiert | + +Das fertige Raster (Linien + Zaehl-Texte) wird zu einem einzigen Block +`ZZ_PLANQUADRATE` bei (0,0,0) zusammengefasst; Layer aus `cfg/layer.cfg`.