From 15ec6c0504721faff2ced9f20cc89ec083c17acd Mon Sep 17 00:00:00 2001 From: Simon Hensch Date: Fri, 4 Sep 2026 09:01:12 +0200 Subject: [PATCH] =?UTF-8?q?[ADD]=20Layerdefinitionen=20und=20Farben=20durc?= =?UTF-8?q?h=20layer.cfg=20f=C3=BCr=20zusammengesetzte=20Bl=C3=B6cke=20wie?= =?UTF-8?q?=20Gef=C3=A4llestrecke=20oder=20Variof=C3=B6rderer=20werden=20b?= =?UTF-8?q?eim=20Zusammenbau=20der=20Baugruppen=20in=20den=20Skripten=20ve?= =?UTF-8?q?rwendet;=20Ebenfalls=20als=20Fallback=20f=C3=BCr=20Bl=C3=B6cke?= =?UTF-8?q?=20m=C3=B6glich,=20die=20kein=20Attribut=20LAYER=20besitzen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 7 +- Lisp/Gefaellestrecke.lsp | 26 ++++- Lisp/KreiselInsert.lsp | 39 +++++-- Lisp/OmniModulInsert.lsp | 27 ++--- Lisp/README.md | 28 +++++ Lisp/SSG_LIB_Commands.lsp | 42 ++++---- Lisp/TEFInsert.lsp | 11 +- Lisp/ssg_core.lsp | 198 +++++++++++++++++++++++++++++++++++- Lisp/vf_core.lsp | 17 +++- Lisp/vf_etage.lsp | 12 +++ Lisp/vf_linienzug.lsp | 6 ++ cfg/layer.cfg | 183 +++++++++++++++++++++++++++++++++ doc/layer-definitionen.xlsx | Bin 20324 -> 20188 bytes tests/test_unit.lsp | 68 +++++++++++++ 14 files changed, 603 insertions(+), 61 deletions(-) create mode 100644 cfg/layer.cfg diff --git a/CLAUDE.md b/CLAUDE.md index ddef2fc..fd7a277 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -91,7 +91,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | Datei | Befehle | Beschreibung | |---|---|---| -| `ssg_core.lsp` | - | Kernel: ssg-start/ssg-end, ssg-cfg-or, ssg-attrib-read/write, Layer/Block-Ops. Zentrale Helfer: `ssg-lisp-verzeichnis`/`ssg-lisp-datei-pfad` (Lisp-Pfad-Ermittlung), `ssg-rot-matrix-zy` (4x4 Rz(hz)*Ry(vert)-Rotationsmatrix, clusteruebergreifend), GUI-Aus-Schalter `*ssg-gui-aus*` + `ssg-gui-aus`/`ssg-gui-an`/`ssg-gui-p` (fuer automatische Tests: schaltet DCL-/Wizard-Dialoge ab, Module fallen auf Konsolen-/getXXX-Pfad zurueck; der Linienzug hat zusaetzlich `*vfl-headless*`, das die Konsolen-Rueckfrage selbst verbietet - siehe VarioFoerderer-Zeile) | +| `ssg_core.lsp` | - | Kernel: ssg-start/ssg-end, ssg-cfg-or, ssg-attrib-read/write, Layer/Block-Ops. Zentrale Helfer: `ssg-lisp-verzeichnis`/`ssg-lisp-datei-pfad` (Lisp-Pfad-Ermittlung), `ssg-rot-matrix-zy` (4x4 Rz(hz)*Ry(vert)-Rotationsmatrix, clusteruebergreifend), GUI-Aus-Schalter `*ssg-gui-aus*` + `ssg-gui-aus`/`ssg-gui-an`/`ssg-gui-p` (fuer automatische Tests: schaltet DCL-/Wizard-Dialoge ab, Module fallen auf Konsolen-/getXXX-Pfad zurueck; der Linienzug hat zusaetzlich `*vfl-headless*`, das die Konsolen-Rueckfrage selbst verbietet - siehe VarioFoerderer-Zeile). **Layer-Zuordnung**: `ssg-layer-cfg-load`/`-reset` (liest `cfg/layer.cfg` lazy), `ssg-layer-cfg-eintrag` (reine Aufloesung "Layername, Farbe" -> `(layer . farbe)`, in `tests/test_unit.lsp` getestet), `ssg-layer-eintrag` (Suchreihenfolge `[ils_]` -> `[allgemein]`), `ssg-layer-anlegen` (Layer mit cfg-Farbe anlegen, optional aktivieren) und `ssg-layer-setzen` (Blockreferenz auf den Baugruppen-Layer legen) - fuer ZUSAMMENGEBAUTE Baugruppen; `ssg-block-layer-vorgabe` (LAYER-Attribut -> `ssg-ils-block-ebene`) fuer nur EINGEFUEGTE Bloecke. Alle liefern nil, wenn nichts konfiguriert ist, und lassen den Layer dann unangetastet | | `ssg_ks_insert.lsp` | - | Gemeinsame KS-Extraktion + Block-Einfuegeprimitiven (von VarioFoerderer UND Gefaellestrecke genutzt, frueher in beiden dupliziert): `vec-length`, `ks-line-axis`, `ks-normalize-name`, `ks-relativize`/`-absolutize`, `ensure-block-loaded`, `extract-ks-from-block[-raw]` (Cache `*ks-cache*`), `insert-block-by-ks` (nur Rz), `insert-inclined-scaled-block`/`insert-rotated-block-with-ks` (Rz*Ry). MNL laedt es als Core-Modul VOR Gefaellestrecke/VarioFoerderer; vf_core/Gefaellestrecke haben einen guarded Nachlade-Load fuers isolierte Test-Laden | | `ssg_lang.lsp` | - | Sprachumschaltung Deutsch/Englisch (ssg-text, ssg-textf, *ssg-lang*) | | `ssg_dbg.lsp` | - | Debug-Logging (dbgopen, dbgmsg, dbgflush, dbgclose) | @@ -149,6 +149,11 @@ Werden via `bin/setenv.bat` gesetzt. Wichtigste: - 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 **flach** in `data/ils/` abgelegt (Block-Libraries als DXF in `data/block_libraries/`). Die Dimension steckt seit dem Flach-Refactor im **Dateinamen bzw. Blocknamen** als Suffix `_2D`/`_3D` (z.B. `AN8_2D.dwg`, `Vario_Bogen_auf_3_TEF_rechts_3D.dwg`), damit 2D- und 3D-Variante gleichzeitig in einer Zeichnung stehen koennen. Zentrale Aufloesung: `ssg-ils-blockname[-dim]` / `ssg-ils-block-datei[-dim]` / `ssg-ils-block-laden[-dim]` in `ssg_core.lsp`. Ausnahmen ohne Suffix: `KS_EIN`/`KS_AUS`/`K1`-`K4` und die Wrapper-Bloecke `VF_*`/`GF_*`/`KREISEL_*`/`ECKRAD_*`. Alle Feature-Module (Kreisel, VarioFoerderer, Gefaellestrecke) folgen der aktuellen Dimension (`ssg-ils-dim-aktuell`: transienter Override `*ssg-ils-dim*` -> `DXFM_DIM`) mit automatischem 3D-Fallback, sodass 2D- und 3D-Aufbau funktionieren. (Die alten Unterordner `data/ils/2D` und `data/ils/3D` bleiben uebergangsweise als Quelle der Batch-/Attribut-Tools bestehen.) +- **Layer-Zuordnung** - zwei Quellen, klar getrennt: + - Baugruppen, die ein Makro aus Einzelteilen **zusammenbaut** (`KREISEL_n`, `ECKRAD_n`, `VF_n`, `GF_n`) und die selbst gezeichnete Hilfsgeometrie (Kreisel-Tangenten, PIN-Linien, VF-/GF-/Kreisel-Beschriftung) haben keine Blockdatei in `data/` und damit kein Attribut - ihr Ziel-Layer **und die Layerfarbe** stehen in `cfg/layer.cfg` (Abschnitte `[ils_2d]`/`[ils_3d]`/`[allgemein]`, Key = Baugruppe, Wert = `Layername, Farbnummer`). Gelesen ueber `ssg-layer-setzen`/`ssg-layer-anlegen` (`ssg_core.lsp`). + - Bloecke, die nur aus `data/` **eingefuegt** werden, tragen ihren Ziel-Layer als Block-Attribut `LAYER` (gepflegt in `data/ils/allocations_collected.json` bzw. direkt in den DWGs); dieses Attribut gilt als Vorgabe, angewendet ueber `ssg-block-layer-vorgabe` (Fallback: "eigene" Ebene der Blockdefinition per `ssg-ils-block-ebene`). + - Fehlt `cfg/layer.cfg` oder ein Eintrag, bleibt der Layer unangetastet - kein Fehler, Verhalten wie vorher. + - Die **Farbe** wirkt nur bei der Neuanlage des Layers (`ssg-make-layer` laesst bestehende Layer unveraendert, damit Kundenzeichnungen nicht umgefaerbt werden). Layer, die eine Blockdatei aus `data/ils` selbst mitbringt (z.B. `ILS_SP`/`_3D_ILS_SP`), legt BricsCAD schon beim Einfuegen des Blocks mit der Farbe **aus der DWG** an - dort greift die cfg-Farbe nicht, wohl aber der Layername des Wrappers. Fuer Layer ohne Baugruppen-Key gibt es zusaetzlich den Abschnitt `[farben]` (Layername = Farbe), gelesen von `ssg-layer-farbe-fuer-name`. - Komponentendaten (Masse, Sivas-IDs) liegen als JSON in `data/json/` - Sprache im Code und Kommentaren: Deutsch diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index f8626f5..3232d19 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -249,6 +249,9 @@ (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname scale 1.0 1.0 0)) + ;; Einzelteil auf die eigene Ebene der Blockdefinition legen - wie in den + ;; Zwillingen in ssg_ks_insert.lsp; hier fehlte der Aufruf bisher. + (ssg-ils-block-auf-ebene block-obj blockname) (vla-TransformBy block-obj (vlax-tmatrix (ssg-rot-matrix-zy chz shz cv sv))) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point pt)) (setq endpunkt @@ -276,6 +279,9 @@ (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) + ;; Einzelteil auf die eigene Ebene der Blockdefinition legen - wie in den + ;; Zwillingen in ssg_ks_insert.lsp; hier fehlte der Aufruf bisher. + (ssg-ils-block-auf-ebene block-obj blockname) (vla-TransformBy block-obj (vlax-tmatrix (ssg-rot-matrix-zy chz shz cv sv))) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point pt)) (setq endpunkt @@ -317,6 +323,9 @@ (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) + ;; Einzelteil auf die eigene Ebene der Blockdefinition legen - wie in den + ;; Zwillingen in ssg_ks_insert.lsp; hier fehlte der Aufruf bisher. + (ssg-ils-block-auf-ebene block-obj blockname) (vla-TransformBy block-obj (vlax-tmatrix (list (list chz (- shz) 0 0) (list shz chz 0 0) @@ -1098,7 +1107,7 @@ ;; Beschriftung: Mitte der ersten Geraden, 400mm senkrecht rechts versetzt. (defun gf-make-label (gf-nummer hoehe-von hoehe-bis deltaH deltaL L-gf-str winkel nach-aus-pt entry-hz L-first-seg / - label-txt label-pt chz-l shz-l halb basis-winkel) + label-txt label-pt chz-l shz-l halb basis-winkel lay) (setq chz-l (cos (* entry-hz (/ pi 180.0)))) (setq shz-l (sin (* entry-hz (/ pi 180.0)))) (setq halb (/ (float L-first-seg) 2.0)) @@ -1121,6 +1130,16 @@ (while (>= basis-winkel 360.0) (setq basis-winkel (- basis-winkel 360.0))) (if (>= basis-winkel 180.0) (setq basis-winkel (- basis-winkel 180.0))) (setq basis-winkel (if (or (< basis-winkel 45.0) (>= basis-winkel 135.0)) 0.0 90.0)) + ;; Beschriftungs-Layer aus cfg/layer.cfg (Baugruppe "gf_beschriftung"), sonst + ;; der bisherige Hartwert. Der Layer wird hier ANGELEGT - bisher schrieb das + ;; entmake unten auf einen Layer, den niemand erzeugt hat. + (setq lay (ssg-layer-anlegen "gf_beschriftung" nil)) + (if (null lay) + (progn + (setq lay "GF_Beschriftung") + (ssg-make-layer lay "7" nil) + ) + ) (entmake (list '(0 . "TEXT") (cons 10 label-pt) @@ -1128,7 +1147,7 @@ '(40 . 100.0) (cons 1 label-txt) '(7 . "Standard") - '(8 . "GF_Beschriftung") + (cons 8 lay) (cons 50 (* basis-winkel (/ pi 180.0))) '(72 . 1) '(73 . 2))) @@ -1196,6 +1215,9 @@ ;; Attribute auf das eingefuegte INSERT-Objekt setzen (volle Werteliste; ;; nicht vorhandene Tags ignoriert ssg-attrib-set-on -> reduzierter Satz ok). (setq gf-insert (entlast)) + ;; Ziel-Layer der Baugruppe aus cfg/layer.cfg (ohne Eintrag bleibt die + ;; Referenz auf dem aktuellen Layer, wie vor der Umstellung). + (ssg-layer-setzen gf-insert "gefaellestrecke") ;; Kette wurde bei Z=0 gebaut; der OSMODE=0-Wrap loest den OCS-Skew der ;; gekippten Elemente sauber zur logischen Position (Z=0) auf. Den fertigen ;; GF_n-Block daher nur noch senkrecht auf die Zielhoehe heben (OSMODE=0, diff --git a/Lisp/KreiselInsert.lsp b/Lisp/KreiselInsert.lsp index 98011f5..b967ca5 100644 --- a/Lisp/KreiselInsert.lsp +++ b/Lisp/KreiselInsert.lsp @@ -194,7 +194,7 @@ ) ;; Beschriftungstext erzeugen -(defun kreisel-make-label (nummer abstand kreiselart / textStr insertPoint radius mitteX mitteY textHoehe) +(defun kreisel-make-label (nummer abstand kreiselart / textStr insertPoint radius mitteX mitteY textHoehe lay) ;; Text: "KREISEL 1: PIN_4000" (setq textStr (strcat "KREISEL " (itoa nummer) ": " kreiselart "_" (rtos abstand 2 0))) @@ -216,13 +216,20 @@ ;; Schriftart Arial einstellen (kreisel-setup-textstyle) - ;; Layer erstellen - (ssg-make-layer *kreisel-beschriftung-layer* (itoa *kreisel-beschriftung-farbe*) T) - + ;; Layer erstellen: bevorzugt aus cfg/layer.cfg (Baugruppe + ;; "kreisel_beschriftung"), sonst der bisherige Hartwert. + (setq lay (ssg-layer-anlegen "kreisel_beschriftung" T)) + (if (null lay) + (progn + (setq lay *kreisel-beschriftung-layer*) + (ssg-make-layer lay (itoa *kreisel-beschriftung-farbe*) T) + ) + ) + ;; Text mit entmake erstellen (zentriert) (entmake (list '(0 . "TEXT") - (cons 8 *kreisel-beschriftung-layer*) + (cons 8 lay) (cons 10 insertPoint) (cons 40 textHoehe) (cons 1 textStr) @@ -423,8 +430,11 @@ ;; SP8 Kreis (Spannstation) bei (radius+abstand, 0) - Dim-Suffix im Dateinamen (command "_.INSERT" (strcat *block-path* "SP8_" *ki-dxfm-dim* ".dwg") (list (+ radius abstand) 0.0 0.0) 1 1 0) - ;; Tangenten auf Layer S_LP - (ssg-make-layer "S_LP" "7" T) + ;; Tangenten-Layer: bevorzugt aus cfg/layer.cfg (Baugruppe + ;; "kreisel_tangente"), sonst der bisherige Hartwert S_LP. + (if (null (ssg-layer-anlegen "kreisel_tangente" T)) + (ssg-make-layer "S_LP" "7" T) + ) (if is-pin (setvar "CECOLOR" (itoa (ssg-cfg-or "kreisel" "color_linie_1" 5))) (setvar "CECOLOR" (itoa (ssg-cfg-or "kreisel" "color_linie_2" 1))) @@ -438,7 +448,11 @@ ;; PIN-Linien (if is-pin (progn - (ssg-make-layer "pinbereich" (itoa (ssg-cfg-or "kreisel" "color_pin" 3)) T) + ;; PIN-Layer: bevorzugt aus cfg/layer.cfg (Baugruppe + ;; "kreisel_pinbereich"), sonst der bisherige Hartwert pinbereich. + (if (null (ssg-layer-anlegen "kreisel_pinbereich" T)) + (ssg-make-layer "pinbereich" (itoa (ssg-cfg-or "kreisel" "color_pin" 3)) T) + ) (setvar "CECOLOR" (itoa (ssg-cfg-or "kreisel" "color_pin" 3))) ;; Obere PIN-Linie @@ -489,6 +503,12 @@ ;; --- Attribut-Werte durch direkte Datenbankänderung setzen --- (setq block-ent (entlast)) + ;; Ziel-Layer der Baugruppe aus cfg/layer.cfg. Wichtig: der Wrapper hing + ;; bisher am CLAYER-Seiteneffekt von ssg-make-layer (S_LP bzw. pinbereich) + ;; und landete bei bereits vorhandener Blockdefinition auf dem aktiven Layer - + ;; jetzt ist er in beiden Faellen gleich. Ohne cfg-Eintrag bleibt es beim + ;; bisherigen Verhalten. + (ssg-layer-setzen block-ent (if is-pin "kreisel_pin" "kreisel")) (setq att-entity (entnext block-ent)) (while att-entity @@ -1269,6 +1289,9 @@ ;; Attribut-Werte durch direkte Datenbankaenderung setzen (setq block-ent (entlast)) + ;; Ziel-Layer der Baugruppe aus cfg/layer.cfg (der Eckrad-Zweig setzte bisher + ;; gar keinen Layer, das ECKRAD_n landete also immer auf Layer "0"). + (ssg-layer-setzen block-ent "eckrad") (setq att-entity (entnext block-ent)) (dbgp "Setze Attribut-Werte:") (while att-entity diff --git a/Lisp/OmniModulInsert.lsp b/Lisp/OmniModulInsert.lsp index b1fc57b..be18217 100644 --- a/Lisp/OmniModulInsert.lsp +++ b/Lisp/OmniModulInsert.lsp @@ -618,6 +618,11 @@ ) (ssg-attrib-set-on blockEnt attribs) + ;; Layer aus dem LAYER-Attribut setzen - dieselbe Vorgabe-Konvention wie in + ;; omni:insert-dxf und c:OMNI_EDIT. Die Quell-Attribute (srcAttribs) tragen + ;; den Layer bereits, er wurde hier bisher nur nicht angewendet. + (ssg-block-layer-vorgabe blockEnt bname attribs) + ;; 4. Text oberhalb der Linie positionieren, um Linienwinkel drehen, ;; Inhalt mit Laenge ergaenzen (setq perpX (* (- (sin angle)) textGap) @@ -1020,16 +1025,9 @@ (list (cons "HOEHE" (if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))) (cons "DREHUNG" drehung-anzeige))) - ;; Layer aus LAYER-Attribut lesen und Block verschieben + ;; Layer aus der Block-Vorgabe (LAYER-Attribut) setzen (setq attribs (ssg-attrib-read blockEnt)) - (setq layer-name (cdr (assoc "LAYER" attribs))) - (if (and layer-name (> (strlen layer-name) 0)) - (progn - (ssg-make-layer layer-name 7 nil) - (entmod (subst (cons 8 layer-name) (assoc 8 (entget blockEnt)) (entget blockEnt))) - (entupd blockEnt) - ) - ) + (setq layer-name (ssg-block-layer-vorgabe blockEnt sivasnr-str attribs)) ) ) @@ -1378,16 +1376,9 @@ (list (cons "HOEHE" (if new-hoehe new-hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))) (cons "DREHUNG" (if new-drehung new-drehung (ssg-cfg-or "omniflo" "default_drehung" "0"))))) - ;; Layer aus LAYER-Attribut lesen und Block verschieben (wie omni:insert-dxf) + ;; Layer aus der Block-Vorgabe (LAYER-Attribut) setzen (wie omni:insert-dxf) (setq attribs (ssg-attrib-read blockEnt)) - (setq layer-name (cdr (assoc "LAYER" attribs))) - (if (and layer-name (> (strlen layer-name) 0)) - (progn - (ssg-make-layer layer-name 7 nil) - (entmod (subst (cons 8 layer-name) (assoc 8 (entget blockEnt)) (entget blockEnt))) - (entupd blockEnt) - ) - ) + (setq layer-name (ssg-block-layer-vorgabe blockEnt sivasnr-str attribs)) ) ) diff --git a/Lisp/README.md b/Lisp/README.md index c8f05b3..e379cd0 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -80,6 +80,34 @@ Grundfunktionen für Umgebungssicherung, Benutzerinteraktion, Layer, Blöcke, At | `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) | +**Ziel-Layer je Baugruppe (`cfg/layer.cfg`):** + +Für Baugruppen, die ein Makro aus Einzelteilen **zusammenbaut** (`KREISEL_n`, +`ECKRAD_n`, `VF_n`, `GF_n`) und für die selbst gezeichnete Hilfsgeometrie +(Kreisel-Tangenten, PIN-Linien, Beschriftungstexte) gibt es keine Blockdatei in +`data/` und damit kein `LAYER`-Attribut – ihr Ziel-Layer und die Layerfarbe +kommen aus `cfg/layer.cfg`. Nur **eingefügte** Blöcke nehmen dagegen ihr +`LAYER`-Attribut als Vorgabe. Alle Funktionen liefern `nil`, wenn nichts +konfiguriert ist; der Layer bleibt dann unangetastet (kein Fehler bei fehlender +`cfg/layer.cfg`). + +| Funktion | Beschreibung | +| --- | --- | +| `ssg-layer-cfg-load` | `cfg/layer.cfg` einmalig (lazy) einlesen, Rückgabe ini-Alist oder `nil` | +| `ssg-layer-cfg-reset` | Ladezustand verwerfen (cfg in laufender Sitzung neu einlesen, Tests) | +| `ssg-layer-cfg-eintrag ini sektion key` | Reine Aufl./Zerlegung `"Layername, Farbe"` → `(layer . farbe)`; Farbe fehlt → `"7"` | +| `ssg-layer-eintrag key` | Ziel-Layer einer Baugruppe: `[ils_]` → `[allgemein]` → `nil` | +| `ssg-layer-anlegen key aktiv` | Layer der Baugruppe mit cfg-Farbe anlegen, optional aktivieren; Rückgabe Layername | +| `ssg-layer-setzen ent key` | Blockreferenz auf den Ziel-Layer ihrer Baugruppe legen (Layer wird angelegt) | +| `ssg-layer-farbe-fuer-name name` | Farbe zu einem **Layernamen** (Abschnitt `[farben]`, sonst passender Baugruppen-Wert, sonst `"7"`) | +| `ssg-block-layer-vorgabe ent blockname attribs` | Layer einer nur eingefügten Referenz aus der Block-Vorgabe: `LAYER`-Attribut → `ssg-ils-block-ebene` → nichts | + +Die **Farbe** greift nur bei der Neuanlage eines Layers – `ssg-make-layer` lässt +bestehende Layer unverändert. Layer, die eine Blockdatei aus `data/ils` selbst +mitbringt (z. B. `ILS_SP`), legt BricsCAD bereits beim Einfügen des Blocks mit +der Farbe *aus der DWG* an; dort wirkt die cfg-Farbe nicht, der Layername des +Wrappers aber schon. + **Block-Operationen:** | Funktion | Beschreibung | diff --git a/Lisp/SSG_LIB_Commands.lsp b/Lisp/SSG_LIB_Commands.lsp index a68c6ed..16e50e6 100644 --- a/Lisp/SSG_LIB_Commands.lsp +++ b/Lisp/SSG_LIB_Commands.lsp @@ -17,25 +17,14 @@ (if (null *ils-btmt-beladung-block*) (setq *ils-btmt-beladung-block* "BTMT-Beladung")) (if (null *ils-btmt-entladung-block*) (setq *ils-btmt-entladung-block* "SC_Entladung")) -;; Layer einer frisch eingefuegten Blockreferenz setzen: bevorzugt aus dem -;; LAYER-Attribut des Blocks (gleiche Konvention wie omni:insert-dxf in -;; OmniModulInsert.lsp und tefl-insert-element in TEFInsert.lsp), sonst aus der -;; "eigenen" Ebene der Blockdefinition (ssg-ils-block-ebene). Liefert der Block -;; beides nicht, bleibt die Referenz auf dem aktuellen Layer. +;; Layer einer frisch eingefuegten Blockreferenz aus der Block-Vorgabe setzen. +;; Die Logik liegt zentral als ssg-block-layer-vorgabe in ssg_core.lsp (dieselbe +;; Konvention nutzen omni:insert-dxf in OmniModulInsert.lsp und +;; tefl-insert-element in TEFInsert.lsp); hier bleibt nur der bisherige Name als +;; duenner Wrapper stehen. ;; Rueckgabe: gesetzter Layername oder nil. -(defun ils-block-layer-setzen (ent realname attribs / lay) - (setq lay (cdr (assoc "LAYER" attribs))) - (if (or (null lay) (= lay "")) - (setq lay (ssg-ils-block-ebene realname)) - ) - (if (and lay (/= lay "")) - (progn - (ssg-make-layer lay 7 nil) - (entmod (subst (cons 8 lay) (assoc 8 (entget ent)) (entget ent))) - (entupd ent) - lay - ) - ) +(defun ils-block-layer-setzen (ent realname attribs) + (ssg-block-layer-vorgabe ent realname attribs) ) ;; Fuegt eine ILS-Station (BTMT-Beladung/SC_Entladung) wiederholt ein, bis der @@ -125,7 +114,7 @@ ;; Fuegt einen Sensor-Block wiederholt ein, bis der Benutzer mit ;; ENTER oder ESC abbricht. Rotation je Einfuegung interaktiv. -(defun ils-insert-sensor (fname / pfad pt oldattreq n res) +(defun ils-insert-sensor (fname / pfad pt oldattreq n res ent realname) (setq pfad (ils-sensor-pfad fname)) (if (null pfad) (princ (strcat "\n>>> FEHLER: Blockdatei '" fname ".dwg' nicht gefunden." @@ -145,6 +134,19 @@ ) (setq pt res) (command "_.INSERT" pfad pt "" "" pause) + (setq ent (entlast)) + ;; Layer aus der Block-Vorgabe setzen (LAYER-Attribut, sonst eigene + ;; Ebene der Blockdefinition) - wie bei ils-insert-station. Scanner und + ;; Separator_SP fuehren das LAYER-Attribut (ZZ_Scanner bzw. ILS_SEP-SP), + ;; es wurde hier bisher nur nicht ausgewertet. + ;; Blockname aus der Referenz selbst lesen: eingefuegt wird ueber den + ;; Dateipfad, der effektive Blockname haengt am 2D/3D-Fallback. + (if (and ent (= (cdr (assoc 0 (entget ent))) "INSERT")) + (progn + (setq realname (cdr (assoc 2 (entget ent)))) + (ssg-block-layer-vorgabe ent realname nil) + ) + ) ;; Sofort beim Einfuegen eine eindeutige ID vergeben - wie bei allen ;; anderen Bau-Routinen (Kreisel/GF/VF/Omniflo, siehe ssg-id-generate- ;; Aufrufe dort). Separator/Scanner waren bisher die einzige Ausnahme @@ -153,7 +155,7 @@ ;; das ist der Fall, den ssg-id-check-all als Sicherheitsnetz ;; eigentlich nur fuer Kopier-/Array-/Spiegel-Faelle abfangen soll. (if (atoms-family 1 '("ssg-id-generate")) - (ssg-id-generate (entlast))) + (ssg-id-generate ent)) (setq n (1+ n)) ) (setvar "ATTREQ" oldattreq) diff --git a/Lisp/TEFInsert.lsp b/Lisp/TEFInsert.lsp index 62b590a..c5cf2e3 100644 --- a/Lisp/TEFInsert.lsp +++ b/Lisp/TEFInsert.lsp @@ -98,17 +98,10 @@ (vla-TransformBy block-obj (vlax-tmatrix matrix)) (vla-Move block-obj (vlax-3D-point '(0.0 0.0 0.0)) (vlax-3D-point pt)) - ;; LAYER-Attribut auslesen und Block auf diesen Layer verschieben + ;; Layer aus der Block-Vorgabe (LAYER-Attribut) setzen (setq blockEnt (vlax-vla-object->ename block-obj)) (setq attribs (ssg-attrib-read blockEnt)) - (setq layer-name (cdr (assoc "LAYER" attribs))) - (if (and layer-name (> (strlen layer-name) 0)) - (progn - (ssg-make-layer layer-name 7 nil) - (entmod (subst (cons 8 layer-name) (assoc 8 (entget blockEnt)) (entget blockEnt))) - (entupd blockEnt) - ) - ) + (setq layer-name (ssg-block-layer-vorgabe blockEnt *tefl-blockname* attribs)) ;; Eindeutige ID zuweisen, falls das Block-Schema ein ID-Attribut fuehrt ;; (bei 0_B10030 aktuell nicht der Fall - dann folgenlos, wie in diff --git a/Lisp/ssg_core.lsp b/Lisp/ssg_core.lsp index 3efe2a8..702738f 100644 --- a/Lisp/ssg_core.lsp +++ b/Lisp/ssg_core.lsp @@ -268,6 +268,200 @@ ) ) +;; ------------------------------------------------------------ +;; ZIEL-LAYER JE BAUGRUPPE (cfg/layer.cfg) +;; ------------------------------------------------------------ +;; Fuer die Baugruppen, die die Makros aus Einzelteilen ZUSAMMENBAUEN +;; (KREISEL_n, ECKRAD_n, VF_n, GF_n) und fuer die selbst gezeichnete +;; Hilfsgeometrie (Tangenten, PIN-Linien, Beschriftungstexte) gibt es keine +;; Blockdatei in data/ und damit auch kein LAYER-Attribut - ihr Ziel-Layer +;; kommt aus cfg/layer.cfg. Bloecke, die nur EINGEFUEGT werden, nehmen +;; weiterhin ihr LAYER-Attribut (siehe ssg-block-layer-vorgabe unten). +;; +;; Bewusst hier in ssg_core.lsp und nicht in ssg_layer.lsp: jedes +;; Feature-Modul bootstrappt ssg_core selbst (KreiselInsert, Gefaellestrecke, +;; vf_core), ssg_layer aber nicht - dort waeren die Funktionen beim isolierten +;; Laden eines einzelnen Moduls nicht verfuegbar. ssg-make-layer und +;; ssg-insert-block liegen aus demselben Grund schon in dieser Datei. +;; +;; Alle Funktionen sind gutmuetig: fehlt die Datei, der Abschnitt, der Key oder +;; ist der Wert leer, liefern sie nil und der Aufrufer laesst den Layer +;; unangetastet - genau das Verhalten von vor der Umstellung. + +(if (not (boundp '*ssg-layer-cfg*)) (setq *ssg-layer-cfg* nil)) +(if (not (boundp '*ssg-layer-cfg-versucht*)) (setq *ssg-layer-cfg-versucht* nil)) + +;; cfg/layer.cfg einmalig laden (lazy, beim ersten Zugriff). +;; Ein fehlgeschlagener Ladeversuch wird gemerkt, damit nicht bei jeder +;; Einfuegung erneut auf die Platte zugegriffen wird. +;; Rueckgabe: ini-Alist oder nil. +(defun ssg-layer-cfg-load ( / cfg-dir pfad) + (if (not *ssg-layer-cfg-versucht*) + (progn + (setq *ssg-layer-cfg-versucht* T) + (setq cfg-dir (getenv "DXFM_CFG")) + (if cfg-dir + (progn + (setq pfad (strcat (vl-string-right-trim "/\\" + (vl-string-translate "\\" "/" cfg-dir)) + "/layer.cfg")) + (setq *ssg-layer-cfg* (ssg-load-ini pfad)) + ) + ) + ) + ) + *ssg-layer-cfg* +) + +;; Ladezustand zuruecksetzen (erzwingt Neu-Einlesen beim naechsten Zugriff). +;; Fuer Tests und fuer das Bearbeiten der cfg in laufender BricsCAD-Sitzung. +(defun ssg-layer-cfg-reset ( / ) + (setq *ssg-layer-cfg* nil + *ssg-layer-cfg-versucht* nil) + (princ) +) + +;; Einen Eintrag "Layername, Farbe" aus den ini-Daten aufloesen. +;; Reine Funktion (ini-Daten als Parameter) - damit ohne Datei-IO testbar. +;; Rueckgabe: (layername . farbe-als-string) oder nil, wenn Key/Wert fehlt. +;; Der Layername endet am ERSTEN Komma (Layernamen enthalten kein Komma); +;; fehlt die Farbangabe, wird "7" verwendet. +(defun ssg-layer-cfg-eintrag (ini-data sektion schluessel / roh pos lay farbe) + (setq roh (ssg-ini-get ini-data sektion schluessel nil)) + (if (and roh (= (type roh) 'STR)) + (progn + (setq pos (vl-string-search "," roh)) + (if pos + (setq lay (vl-string-trim " \t" (substr roh 1 pos)) + farbe (vl-string-trim " \t" (substr roh (+ pos 2))) + ) + (setq lay (vl-string-trim " \t" roh) + farbe "" + ) + ) + (if (> (strlen lay) 0) + (cons lay (if (> (strlen farbe) 0) farbe "7")) + ) + ) + ) +) + +;; Ziel-Layer einer Baugruppe ermitteln. +;; schluessel = Baugruppen-Key aus cfg/layer.cfg, z.B. "variofoerderer" +;; Suchreihenfolge: [ils_] -> [allgemein] +;; Rueckgabe: (layername . farbe) oder nil. +(defun ssg-layer-eintrag (schluessel / ini dim) + (setq ini (ssg-layer-cfg-load)) + (if ini + (progn + (setq dim (strcase (ssg-ils-dim-aktuell) T)) ; "2d"/"3d" + (cond + ((ssg-layer-cfg-eintrag ini (strcat "ils_" dim) schluessel)) + ((ssg-layer-cfg-eintrag ini "allgemein" schluessel)) + ) + ) + ) +) + +;; Konfigurierte Farbe zu einem LAYERNAMEN (nicht zu einer Baugruppe) suchen. +;; Gebraucht fuer Layer, die aus dem LAYER-Attribut eines Blocks bzw. aus der +;; Blockdefinition kommen und daher keinen Baugruppen-Key haben: sie werden oft +;; VOR dem Wrapper angelegt, und ssg-make-layer setzt die Farbe nur bei der +;; Neuanlage - ohne diese Suche wuerde die Farbe aus cfg/layer.cfg nie greifen. +;; Suchreihenfolge: +;; 1. Abschnitt [farben]: Key = Layername, Wert = Farbe +;; 2. alle uebrigen Abschnitte: Eintrag, dessen LAYERNAME passt +;; (Layernamen sind in AutoCAD/BricsCAD case-insensitiv) +;; 3. "7" als Grund-Default (bisheriges Verhalten) +;; Rueckgabe: Farbnummer als String, nie nil. +(defun ssg-layer-farbe-fuer-name (layname / ini treffer gesucht sek eintrag) + (setq ini (ssg-layer-cfg-load)) + (if (or (null ini) (null layname) (= layname "")) + "7" + (progn + (setq treffer (ssg-ini-get ini "farben" layname nil)) + (if (and treffer (> (strlen treffer) 0)) + (vl-string-trim " \t" treffer) + (progn + (setq gesucht (strcase layname)) + (foreach sek ini + (if (and (null treffer) (/= (car sek) "farben")) + (foreach eintrag (cdr sek) + (if (null treffer) + (progn + ;; Wert des Eintrags wieder in (layer . farbe) zerlegen + (setq eintrag (ssg-layer-cfg-eintrag + ini (car sek) (car eintrag))) + (if (and eintrag (= (strcase (car eintrag)) gesucht)) + (setq treffer (cdr eintrag)) + ) + ) + ) + ) + ) + ) + (if treffer treffer "7") + ) + ) + ) + ) +) + +;; Ziel-Layer einer Baugruppe anlegen (Farbe aus der cfg) und optional +;; aktivieren. aktiv = T setzt CLAYER auf den Layer. +;; Rueckgabe: Layername oder nil, wenn die Baugruppe nicht konfiguriert ist. +(defun ssg-layer-anlegen (schluessel aktiv / eintrag) + (if (setq eintrag (ssg-layer-eintrag schluessel)) + (progn + (ssg-make-layer (car eintrag) (cdr eintrag) aktiv) + (car eintrag) + ) + ) +) + +;; Objekt (in der Regel eine frisch eingefuegte Blockreferenz) auf den +;; Ziel-Layer seiner Baugruppe legen; der Layer wird bei Bedarf angelegt. +;; Rueckgabe: Layername oder nil, wenn die Baugruppe nicht konfiguriert ist +;; (dann bleibt das Objekt unveraendert auf seinem bisherigen Layer). +(defun ssg-layer-setzen (ent schluessel / lay ed) + (if (and ent (setq lay (ssg-layer-anlegen schluessel nil))) + (progn + (setq ed (entget ent)) + (entmod (subst (cons 8 lay) (assoc 8 ed) ed)) + (entupd ent) + lay + ) + ) +) + +;; Layer einer nur EINGEFUEGTEN Blockreferenz aus der Block-Vorgabe setzen: +;; bevorzugt aus dem LAYER-Attribut des Blocks, sonst aus der "eigenen" Ebene +;; der Blockdefinition (ssg-ils-block-ebene). Traegt der Block beides nicht, +;; bleibt die Referenz auf ihrem bisherigen Layer. +;; ent = Blockreferenz +;; realname = effektiver Blockname (fuer die Ebenen-Ermittlung) +;; attribs = Attribut-Alist (ssg-attrib-read), nil = wird selbst gelesen +;; Rueckgabe: gesetzter Layername oder nil. +(defun ssg-block-layer-vorgabe (ent realname attribs / lay ed) + (if (and ent (null attribs)) + (setq attribs (ssg-attrib-read ent)) + ) + (setq lay (cdr (assoc "LAYER" attribs))) + (if (or (null lay) (= lay "")) + (setq lay (ssg-ils-block-ebene realname)) + ) + (if (and ent lay (/= lay "")) + (progn + ;; Farbe aus cfg/layer.cfg, falls der Layername dort vorkommt (sonst "7"). + (ssg-make-layer lay (ssg-layer-farbe-fuer-name lay) nil) + (setq ed (entget ent)) + (entmod (subst (cons 8 lay) (assoc 8 ed) ed)) + (entupd ent) + lay + ) + ) +) + ;; Auswahlsatz-Iteration: Funktion fuer jedes Element aufrufen ;; ss = Auswahlsatz; func = Funktion mit einem Parameter (entity-name) (defun ssg-ss-foreach (ss func / i ename) @@ -567,7 +761,9 @@ (setq eb (ssg-ils-block-ebene realname)) (if (and eb obj) (progn - (if (not (tblsearch "LAYER" eb)) (ssg-make-layer eb 7 nil)) + ;; Farbe aus cfg/layer.cfg, falls der Layername dort vorkommt (sonst "7"). + (if (not (tblsearch "LAYER" eb)) + (ssg-make-layer eb (ssg-layer-farbe-fuer-name eb) nil)) (vl-catch-all-apply (function (lambda () (vla-put-Layer obj eb)))))) obj) diff --git a/Lisp/vf_core.lsp b/Lisp/vf_core.lsp index 777c62c..e478ef6 100644 --- a/Lisp/vf_core.lsp +++ b/Lisp/vf_core.lsp @@ -770,7 +770,7 @@ (defun vf-make-label (vf-nummer hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 richtung best-winkel n-separator n-scanner startpunkt hz / label-txt label-pt L_VF_str L_GF_str delta-sym - chz-l shz-l halb basis-winkel) + chz-l shz-l halb basis-winkel lay) (setq delta-sym (chr 916)) (setq L_VF_str (vl-string-subst "," "." (rtos (/ L_VF 1000.0) 2 3))) (setq L_GF_str (strcat (rtos (/ L_GF1 1000.0) 2 3) "," (rtos (/ L_GF2 1000.0) 2 3))) @@ -795,9 +795,19 @@ (while (>= basis-winkel 360.0) (setq basis-winkel (- basis-winkel 360.0))) (if (>= basis-winkel 180.0) (setq basis-winkel (- basis-winkel 180.0))) (setq basis-winkel (if (or (< basis-winkel 45.0) (>= basis-winkel 135.0)) 0.0 90.0)) + ;; Beschriftungs-Layer aus cfg/layer.cfg (Baugruppe "vf_beschriftung"), sonst + ;; der bisherige Hartwert. Der Layer wird hier ANGELEGT - bisher schrieb das + ;; entmake unten auf einen Layer, den niemand erzeugt hat. + (setq lay (ssg-layer-anlegen "vf_beschriftung" nil)) + (if (null lay) + (progn + (setq lay "VF_Beschriftung") + (ssg-make-layer lay "7" nil) + ) + ) (entmake (list '(0 . "TEXT") - (cons 8 "VF_Beschriftung") + (cons 8 lay) '(67 . 0) (cons 10 label-pt) (cons 40 *vfk-label-texthoehe*) @@ -881,6 +891,9 @@ ;; temporaer auf Welt (verhindert den 31.95mm-Z-Versatz bei ;; abweichendem BKS) und stellt es danach wieder her. (setq vf-insert (ssg-block-wrap-welt vf-bname startpunkt vf-ss)) + ;; Ziel-Layer der Baugruppe aus cfg/layer.cfg (ohne Eintrag bleibt die + ;; Referenz auf dem aktuellen Layer, wie vor der Umstellung). + (ssg-layer-setzen vf-insert "variofoerderer") (setq montagehoehe-m (/ (+ hoehe-von hoehe-bis) 2000.0)) ;; L_GF_m: kommagetrennte Segmentlaengen in Metern (vorne,hinten), ;; analog L_GF_m in Gefaellestrecke.lsp. diff --git a/Lisp/vf_etage.lsp b/Lisp/vf_etage.lsp index c986de2..0ab98c8 100644 --- a/Lisp/vf_etage.lsp +++ b/Lisp/vf_etage.lsp @@ -155,6 +155,9 @@ ) (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname scale 1.0 1.0 0)) + ;; Einzelteil auf die eigene Ebene der Blockdefinition legen - wie in den + ;; Zwillingen in ssg_ks_insert.lsp; hier fehlte der Aufruf bisher. + (ssg-ils-block-auf-ebene block-obj blockname) (setq matrix (vf-rot-matrix chz shz cv sv)) (vla-TransformBy block-obj (vlax-tmatrix matrix)) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point startpunkt)) @@ -186,6 +189,9 @@ ) (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) + ;; Einzelteil auf die eigene Ebene der Blockdefinition legen - wie in den + ;; Zwillingen in ssg_ks_insert.lsp; hier fehlte der Aufruf bisher. + (ssg-ils-block-auf-ebene block-obj blockname) (setq matrix (vf-rot-matrix chz shz cv sv)) (vla-TransformBy block-obj (vlax-tmatrix matrix)) (vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point startpunkt)) @@ -225,6 +231,9 @@ (setq ks-aus (cadr (assoc "KS_AUS" ks-data))) ;; Block einfuegen und rotieren (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0)) + ;; Einzelteil auf die eigene Ebene der Blockdefinition legen - wie in den + ;; Zwillingen in ssg_ks_insert.lsp; hier fehlte der Aufruf bisher. + (ssg-ils-block-auf-ebene block-obj blockname) (vla-TransformBy block-obj (vlax-tmatrix (vf-rot-matrix chz shz cv sv))) (if (and ks-ein ks-aus) (progn @@ -287,6 +296,9 @@ (setq ks-aus (cadr (assoc "KS_AUS" ks-data))) ;; Block mit XScale einfuegen und rotieren (setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname scale 1.0 1.0 0)) + ;; Einzelteil auf die eigene Ebene der Blockdefinition legen - wie in den + ;; Zwillingen in ssg_ks_insert.lsp; hier fehlte der Aufruf bisher. + (ssg-ils-block-auf-ebene block-obj blockname) (vla-TransformBy block-obj (vlax-tmatrix (vf-rot-matrix chz shz cv sv))) (if (and ks-ein ks-aus) (progn diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 618d9a9..f7a5ab1 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -3269,6 +3269,9 @@ ;; temporaer auf Welt (verhindert den 31.95mm-Z-Versatz bei abweichendem ;; BKS, siehe Kommentar dort) und stellt es danach wieder her. (setq vfl-insert (ssg-block-wrap-welt vfl-bname startpunkt vfl-ss)) + ;; Ziel-Layer der Baugruppe aus cfg/layer.cfg (ohne Eintrag bleibt die + ;; Referenz auf dem aktuellen Layer, wie vor der Umstellung). + (ssg-layer-setzen vfl-insert "variofoerderer") ;; Werte (volle Liste; nicht vorhandene Tags ignoriert ssg-attrib-set-on) (ssg-attrib-set-on vfl-insert (list @@ -6705,6 +6708,9 @@ (ssadd (entlast) merge-ss) ) (setq neuer-insert (ssg-block-wrap-welt neuer-bname chain-start merge-ss)) + ;; Ziel-Layer der Baugruppe aus cfg/layer.cfg (ohne Eintrag bleibt die + ;; Referenz auf dem aktuellen Layer, wie vor der Umstellung). + (ssg-layer-setzen neuer-insert "variofoerderer") (ssg-attrib-set-on neuer-insert aggregiert) ;; SEITE_AS/SEITE_ES explizit leeren, wenn die Kette (Ausnahmefall) ohne ;; eigenes AS-/ES-Element beginnt/endet - ssg-attrib-set-on wuerde einen diff --git a/cfg/layer.cfg b/cfg/layer.cfg new file mode 100644 index 0000000..aabaa9b --- /dev/null +++ b/cfg/layer.cfg @@ -0,0 +1,183 @@ +# ============================================================ +# layer.cfg - Ziel-Layer (und Layerfarbe) je Baugruppe +# +# Gilt fuer die Baugruppen, die von den Makros aus Einzelteilen ZUSAMMENGEBAUT +# und als neuer Block eingefuegt werden (KREISEL_n, ECKRAD_n, VF_n, GF_n) sowie +# fuer die Hilfsgeometrie, die die Makros selbst zeichnen (Tangenten, PIN-Linien, +# Beschriftungstexte). Fuer diese Baugruppen gibt es keine Blockdatei in data/ +# und damit auch kein LAYER-Attribut - der Layer muss hier festgelegt werden. +# +# NICHT hier eingetragen werden Bloecke, die nur aus data/ EINGEFUEGT werden +# (Vario_*, Staustrecke_*, AS/ES-Element, Gefaellebogen_*, Modulweiche_*, +# BTMT-Beladung, SC_Entladung, Scanner, Separator_SP, Omniflo-Module ...): +# die tragen ihren Ziel-Layer als Block-Attribut LAYER, und dieses Attribut +# gilt als Vorgabe (siehe ssg-block-layer-vorgabe in Lisp/ssg_core.lsp). +# Gepflegt werden diese Attribute in data/ils/allocations_collected.json bzw. +# direkt in den DWG-Dateien. +# +# ------------------------------------------------------------ +# Format: INI-Style, gelesen von ssg-load-ini/ssg-ini-get (Lisp/ssg_core.lsp) +# +# [Abschnitt] +# baugruppe = Layername, Farbnummer +# +# - Abschnitt = "ils_2d"/"ils_3d" fuer dimensionsabhaengige Layer, +# "allgemein" fuer Layer, die in beiden Dimensionen gleich heissen. +# Aufgeloest wird in dieser Reihenfolge: [ils_], +# dann [allgemein]. Die aktuelle Dimension liefert ssg-ils-dim-aktuell +# (transienter Override *ssg-ils-dim* -> DXFM_DIM -> "3D"). +# Sonderfall [farben] siehe unten. +# - Key = Baugruppen-Schluessel, mit dem der Lisp-Code nachfragt +# (ssg-layer-eintrag/-anlegen/-setzen). Klein geschrieben, KEINE Umlaute. +# - Wert = Layername, dann Komma, dann Farbnummer (BricsCAD-Farbindex 1-255). +# Der Layername steht VOR dem ersten Komma - Layernamen duerfen ohnehin +# kein Komma enthalten. Fehlt die Farbe, wird 7 (weiss/schwarz) verwendet. +# - LEERER Wert (oder fehlender Key) = keine Zuordnung. Der Code laesst den +# Layer dann unangetastet, das Verhalten ist genau wie ohne diese Datei. +# Eine fehlende layer.cfg ist also kein Fehler. +# +# WICHTIG - Kommentare: +# Nur ZEILEN, die mit # beginnen, sind Kommentare. Es gibt KEINE +# Inline-Kommentare: alles hinter dem ersten "=" ist Wert. Erklaerungen +# also immer in eine eigene Zeile ueber den Key schreiben. +# +# WICHTIG - Farbe (wann sie greift und wann nicht): +# ssg-make-layer setzt die Farbe nur bei der NEUANLAGE des Layers. Existiert +# der Layer in der Zeichnung schon, bleibt seine Farbe unveraendert - so +# werden Layer-Einstellungen in bestehenden Zeichnungen nie ueberschrieben. +# Daraus folgen zwei Faelle: +# a) Layer, den unsere Makros anlegen (z.B. _3D_ILS_Kreisel, +# _3D_ILS_Fingerfoerderer, S_KRS_BESCHR): die Farbe von hier greift. +# b) Layer, den eine Blockdatei aus data/ils mitbringt (z.B. ILS_SP / +# _3D_ILS_SP, ILS_SEP-SP): BricsCAD legt ihn schon beim Einfuegen des +# Blocks mit der Farbe AUS DER DWG an - lange bevor der Wrapper gebaut +# wird. Die Farbe von hier greift dann NICHT; die Blockbibliothek +# bestimmt sie. Wer sie aendern will, aendert sie in der DWG (oder +# nachtraeglich per Layer-Dialog in der Zeichnung). +# Der Layername selbst greift in beiden Faellen - nur um die Farbe geht es. +# +# WICHTIG - Kodierung: +# Diese Datei ist reines ASCII, damit sie in jedem Editor unveraendert bleibt. +# Alle hier vergebenen Layernamen sind ASCII. Falls einmal ein Layername mit +# Umlaut oder Gradzeichen eingetragen werden muss (der Firmenstandard in +# doc/layer-definitionen.xlsx enthaelt solche, z.B. "Bemassung" mit ss-Zeichen +# oder "_3D_ILS_30Bogen"), dann MUSS die Datei in ANSI/CP1252 gespeichert +# werden - BricsCAD liest sie per (read-line) in der ANSI-Codepage und der +# Layername muss byteweise zum Layer in der Zeichnung passen. Ein UTF-8- +# gespeicherter Umlaut ergibt einen falschen Layernamen. +# +# Loest den frueheren Entwurf "cfg/layer - Kopie.cfg" ab (dort war die Richtung +# umgekehrt: Layer -> Blockmuster, ohne Farbe, und alle Werte waren leer). +# ============================================================ + + +# ============================================================ +# ILS 2D +# ============================================================ +[ils_2d] + +# ILS Kreisel, Standard (Wrapper-Block KREISEL__STANDARD_) +# Die enthaltenen Teile tragen gemischte Attribute (AN8_2D -> ILS_ANTR, +# SP8_2D -> ILS_UMLENK); fuer die Baugruppe selbst gibt es kein Attribut. +# Vorbelegung aus dem Firmenstandard: ILS_LP = "Laufprofil (Kreisel)". +# Alternativen, falls die Baugruppe nach ihrer Antriebsstation sortiert +# werden soll: ILS_ANTR bzw. ILS_Strukturprofil. +kreisel = ILS_LP, 7 + +# ILS Kreisel, PIN-Variante (Wrapper-Block KREISEL__PIN_) +# Eigener Key, damit PIN-Kreisel bei Bedarf getrennt geschaltet werden koennen +# (z.B. ILS_PIN-Bereich oder "ILS_LP Halter PIN"). Vorbelegt wie kreisel. +kreisel_pin = ILS_LP, 7 + +# ILS Eckrad (Wrapper-Block ECKRAD_) +# Aus AN8 + Umfahrungsgeometrie zusammengebaut. Alternative aus dem +# Firmenstandard: ILS_Umfahrung ("Umfahrungsboegen an Kreisel"). +eckrad = ILS_LP, 7 + +# Vario-Foerderanlage (Wrapper-Block VF_; Standard, Etage, Linienzug, Merge) +# LAYER-Attribut der enthaltenen Vario_*-Bloecke. +variofoerderer = ILS_Fingerfoerderer, 4 + +# Gefaelle-Foerderanlage (Wrapper-Block GF_) +# LAYER-Attribut der enthaltenen Staustrecke_*- und Gefaellebogen_*-Bloecke. +# HINWEIS: ILS_SP bringen diese Bloecke selbst mit (Fall b oben) - die Farbe +# hier bleibt daher wirkungslos, solange die DWG den Layer definiert. +gefaellestrecke = ILS_SP, 3 + + +# ============================================================ +# ILS 3D +# ============================================================ +[ils_3d] + +# Wie ils_2d, aber mit den 3D-Layernamen. +# Fuer den zusammengebauten Kreisel nennt der Firmenstandard _3D_ILS_Kreisel +# (die Einzelteile tragen _3D_ILS_ANTR bzw. _3D_ILS_UMLENK). +kreisel = _3D_ILS_Kreisel, 7 + +kreisel_pin = _3D_ILS_Kreisel, 7 + +eckrad = _3D_ILS_Kreisel, 7 + +# LAYER-Attribut der enthaltenen Vario_*_3D-Bloecke. +variofoerderer = _3D_ILS_Fingerfoerderer, 4 + +# LAYER-Attribut der enthaltenen Staustrecke_*_3D-/Gefaellebogen_*_3D-Bloecke. +# HINWEIS zur Farbe: siehe ils_2d (Layer kommt aus der DWG, Fall b im Header). +gefaellestrecke = _3D_ILS_SP, 3 + + +# ============================================================ +# Dimensionsunabhaengig: vom Code gezeichnete Hilfsgeometrie +# ============================================================ +[allgemein] + +# Kreisel-Tangenten (die beiden Linien zwischen AN8 und SP8). +# HINWEIS: "S_LP" ist der bisher hart im Code stehende Name. Der +# Firmenstandard kennt nur "ILS_LP" - S_LP ist sehr wahrscheinlich ein +# Tippfehler aus der Anfangszeit. Bewusst NICHT automatisch umbenannt, weil +# bestehende Zeichnungen den Layer S_LP enthalten. Bei Umstellung hier auf +# ILS_LP aendern (und die Altbestaende per Layer-Umbenennung nachziehen). +kreisel_tangente = S_LP, 7 + +# PIN-Linien im Kreisel (nur bei PIN-Variante gezeichnet). +kreisel_pinbereich = pinbereich, 3 + +# Beschriftungstext des Kreisels (Laenge/Bezeichnung). +kreisel_beschriftung = S_KRS_BESCHR, 7 + +# Beschriftungstext der Vario-Foerderanlage (Hoehen-/Sektionslabel). +vf_beschriftung = VF_Beschriftung, 7 + +# Beschriftungstext der Gefaellestrecke. +gf_beschriftung = GF_Beschriftung, 7 + + +# ============================================================ +# Farben fuer Layer OHNE Baugruppen-Key +# ============================================================ +# Hier stehen Farben fuer Layer, die aus dem LAYER-Attribut eines eingefuegten +# Blocks bzw. aus der Blockdefinition kommen und daher oben keinen +# Baugruppen-Key haben. Format: Layername = Farbnummer. +# +# Gelesen von ssg-layer-farbe-fuer-name (ssg_core.lsp) beim ANLEGEN des Layers. +# Ein Layername, der oben schon als Wert einer Baugruppe vorkommt, braucht hier +# keinen Eintrag - die Farbe wird dort mitgelesen. Nicht aufgefuehrte Layer +# werden wie bisher mit Farbe 7 angelegt. +# +# Beispiele (auskommentiert - eintragen, was gewuenscht ist): +[farben] +#ILS_ANTR = 1 +#ILS_UMLENK = 2 +#ILS_AS = 5 +#ILS_ES = 5 +#ILS_SEP-SP = 82 +#ILS_Modulweiche = 6 +#ZZ_Scanner = 6 +#_3D_ILS_ANTR = 1 +#_3D_ILS_UMLENK = 2 +#_3D_ILS_AS = 5 +#_3D_ILS_ES = 5 +#_3D_ILS_SEP-SP = 82 +#_3D_ILS_Anbaugruppen = 6 +#_3D_ZZ_Scanner = 6 diff --git a/doc/layer-definitionen.xlsx b/doc/layer-definitionen.xlsx index 3be1864557780775814f7df763c01059ac289c5d..62ffa30e7b8cf3c4ce78617275b645874579bb6d 100644 GIT binary patch delta 10269 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 diff --git a/tests/test_unit.lsp b/tests/test_unit.lsp index 4ff9ded..bc3264e 100644 --- a/tests/test_unit.lsp +++ b/tests/test_unit.lsp @@ -135,6 +135,74 @@ (tu-eq "ssg-parse-json-array" '((("a" . 1) ("b" . 2))) (ssg-parse-json-array '("[" "{" "\"a\": 1," "\"b\": 2" "}" "]"))) + + ;; ssg-layer-cfg-eintrag: "Layername, Farbe" -> (layer . farbe) + ;; Reine Funktion, ini-Daten als Parameter - kein Datei-IO, keine Zeichnung. + (setq _lay (ssg-ini-parse-lines + '("# Kommentar" + "[ils_2d]" + "variofoerderer = ILS_Fingerfoerderer, 4" + "ohne_farbe = ILS_SP" + "leer =" + "[ils_3d]" + "variofoerderer = _3D_ILS_Fingerfoerderer, 4" + "[allgemein]" + "vf_beschriftung = VF_Beschriftung, 7"))) + (tu-eq "ssg-layer-cfg-eintrag/layer-und-farbe" + '("ILS_Fingerfoerderer" . "4") + (ssg-layer-cfg-eintrag _lay "ils_2d" "variofoerderer")) + (tu-eq "ssg-layer-cfg-eintrag/ohne-farbe-default-7" + '("ILS_SP" . "7") + (ssg-layer-cfg-eintrag _lay "ils_2d" "ohne_farbe")) + (tu-nil "ssg-layer-cfg-eintrag/leerer-wert" + (ssg-layer-cfg-eintrag _lay "ils_2d" "leer")) + (tu-nil "ssg-layer-cfg-eintrag/key-fehlt" + (ssg-layer-cfg-eintrag _lay "ils_2d" "gibtsnicht")) + (tu-nil "ssg-layer-cfg-eintrag/sektion-fehlt" + (ssg-layer-cfg-eintrag _lay "gibtsnicht" "variofoerderer")) + + ;; ssg-layer-eintrag: Aufloesung [ils_] -> [allgemein]. + ;; Dimension und cfg werden hier injiziert (kein Datei-IO); der gemerkte + ;; Ladeversuch verhindert, dass ssg-layer-cfg-load die echte Datei liest. + (setq _lay-cfg-alt *ssg-layer-cfg* + _lay-vers-alt *ssg-layer-cfg-versucht* + _lay-dim-alt (if (boundp '*ssg-ils-dim*) *ssg-ils-dim*)) + (setq *ssg-layer-cfg* _lay *ssg-layer-cfg-versucht* T) + (setq *ssg-ils-dim* "2D") + (tu-eq "ssg-layer-eintrag/dim-2d" + '("ILS_Fingerfoerderer" . "4") (ssg-layer-eintrag "variofoerderer")) + (tu-eq "ssg-layer-eintrag/fallback-allgemein" + '("VF_Beschriftung" . "7") (ssg-layer-eintrag "vf_beschriftung")) + (setq *ssg-ils-dim* "3D") + (tu-eq "ssg-layer-eintrag/dim-3d" + '("_3D_ILS_Fingerfoerderer" . "4") (ssg-layer-eintrag "variofoerderer")) + (tu-nil "ssg-layer-eintrag/unbekannte-baugruppe" + (ssg-layer-eintrag "gibtsnicht")) + + ;; ssg-layer-farbe-fuer-name: Farbe zu einem LAYERNAMEN (nicht Baugruppe). + ;; Wird gebraucht, weil Layer aus dem LAYER-Attribut oft VOR dem Wrapper + ;; angelegt werden und ssg-make-layer die Farbe nur bei Neuanlage setzt. + (setq *ssg-layer-cfg* (ssg-ini-parse-lines + '("[ils_3d]" + "gefaellestrecke = _3D_ILS_SP, 3" + "[allgemein]" + "vf_beschriftung = VF_Beschriftung, 7" + "[farben]" + "ILS_SEP-SP = 82"))) + (tu-eq "ssg-layer-farbe-fuer-name/abschnitt-farben" + "82" (ssg-layer-farbe-fuer-name "ILS_SEP-SP")) + (tu-eq "ssg-layer-farbe-fuer-name/aus-baugruppen-wert" + "3" (ssg-layer-farbe-fuer-name "_3D_ILS_SP")) + (tu-eq "ssg-layer-farbe-fuer-name/case-insensitiv" + "3" (ssg-layer-farbe-fuer-name "_3d_ils_sp")) + (tu-eq "ssg-layer-farbe-fuer-name/unbekannt-default-7" + "7" (ssg-layer-farbe-fuer-name "GibtsNicht")) + (tu-eq "ssg-layer-farbe-fuer-name/leerer-name" + "7" (ssg-layer-farbe-fuer-name "")) + ;; Globale Zustaende wieder herstellen + (setq *ssg-ils-dim* _lay-dim-alt + *ssg-layer-cfg* _lay-cfg-alt + *ssg-layer-cfg-versucht* _lay-vers-alt) )