[ADD] Layerdefinitionen und Farben durch layer.cfg für zusammengesetzte Blöcke wie Gefällestrecke oder Varioförderer werden beim Zusammenbau der Baugruppen in den Skripten verwendet; Ebenfalls als Fallback für Blöcke möglich, die kein Attribut LAYER besitzen.

This commit is contained in:
2026-09-04 09:01:12 +02:00
parent 02303ad7fc
commit 15ec6c0504
14 changed files with 603 additions and 61 deletions
+24 -2
View File
@@ -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,
+31 -8
View File
@@ -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
+9 -18
View File
@@ -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))
)
)
+28
View File
@@ -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_<Dimension>]``[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 |
+22 -20
View File
@@ -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)
+2 -9
View File
@@ -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
+197 -1
View File
@@ -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_<aktuelle Dimension>] -> [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)
+15 -2
View File
@@ -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.
+12
View File
@@ -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
+6
View File
@@ -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