[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
+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)