[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:
+197
-1
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user