diff --git a/rhino/elemente.py b/rhino/elemente.py index ed9fc39..6afda7f 100644 --- a/rhino/elemente.py +++ b/rhino/elemente.py @@ -332,6 +332,9 @@ _RAUM_LAYOUT_DEFAULT = [["nummer", "name"], ["funktion"], ["area"]] # Per-Document Storage-Key fuer Raumstempel-Stile (Presets). _KEY_RAUM_STILE = "dossier_raum_stempel_stile" +# Auf der Raum-Outline: id des zuletzt angewendeten Stils. Damit das UI +# anzeigen kann welcher Stil aktiv ist. +_KEY_RAUM_STIL_ID = "dossier_raum_stil_id" # Felder die ein Stil persistiert (= alles was die Optik bestimmt). Nicht # enthalten: Name/Nummer/Funktion (inhaltlich pro Raum), area/umfang (aus @@ -3075,6 +3078,8 @@ def _read_meta(obj): # Texthoehen-Modus (default "fix" — Backwards-Compat) r_txt_modus = a.GetUserString(_KEY_RAUM_TXT_MODUS) or "fix" if r_txt_modus not in ("fix", "masstab"): r_txt_modus = "fix" + # Aktiver Stempel-Stil (id des zuletzt applizierten Stils) + r_stil_id = a.GetUserString(_KEY_RAUM_STIL_ID) or "" # Field-Layout — parsed JSON list of rows r_layout_raw = a.GetUserString(_KEY_RAUM_LAYOUT) or "" r_layout = [] @@ -3196,6 +3201,7 @@ def _read_meta(obj): "raum_stamp_dy": r_stamp_dy, "raum_layout": r_layout, "raum_txt_modus": r_txt_modus, + "raum_stil_id": r_stil_id, "wand_layered": w_layered, "wand_layers": w_layers, "wand_layer_idx": w_layer_idx, @@ -6661,6 +6667,7 @@ class ElementeBridge(panel_base.BaseBridge): "showSia": bool(meta.get("raum_show_sia", False)), "layout": meta.get("raum_layout") or [], "txtModus": meta.get("raum_txt_modus", "fix"), + "stilId": meta.get("raum_stil_id", ""), "area": area, "areaFmt": _format_area(area, rnd_eff), "umfang": perim, @@ -8537,8 +8544,11 @@ class ElementeBridge(panel_base.BaseBridge): def _cmd_save_raum_stil(self, p): """Speichert einen Raumstempel-Stil. Payload: {id?: string, name: string, settings: {font, bold, italic, txtH, - txtModus, align, rundung, fuellung, showSia, layout}} - Wenn id leer → neuer Stil mit uuid. State-Emit anschliessend. + txtModus, align, rundung, fuellung, showSia, layout}, + applyToIds?: [raum_id, ...]} + Wenn id leer → neuer Stil mit uuid. applyToIds optional: nach dem + Speichern wird stil_id auf die genannten Raeume geschrieben (damit + Frontend "Stil aktiv" anzeigen kann). State-Emit anschliessend. """ doc = Rhino.RhinoDoc.ActiveDoc if doc is None: return @@ -8563,6 +8573,20 @@ class ElementeBridge(panel_base.BaseBridge): if save_raum_stempel_stile(doc, stile): print("[ELEMENTE] Stempel-Stil '{}' ({}) gespeichert".format( name, sid)) + # Apply to listed rooms — schreibt nur stilId, nicht die Settings + # (die sind ja schon am Raum, sonst waeren sie nicht gespeichert + # worden — wir spiegeln nur die Verknuepfung). + apply_to = p.get("applyToIds") or [] + if isinstance(apply_to, list): + for eid in apply_to: + try: + src_obj, _src_meta = _find_source(doc, eid) + if src_obj is None: continue + attrs = src_obj.Attributes.Duplicate() + attrs.SetUserString(_KEY_RAUM_STIL_ID, sid) + doc.Objects.ModifyAttributes(src_obj.Id, attrs, True) + except Exception as ex: + print("[ELEMENTE] save-stil apply-to {}: {}".format(eid, ex)) self._send_state() def _cmd_delete_raum_stil(self, p): @@ -8604,6 +8628,16 @@ class ElementeBridge(panel_base.BaseBridge): patch = dict(patch_base) patch["id"] = eid self._update_wall(patch) + # Stil-Id direkt auf die Outline schreiben damit UI + # markieren kann welcher Stil aktiv ist + try: + src_obj, _src_meta = _find_source(doc, eid) + if src_obj is not None: + attrs = src_obj.Attributes.Duplicate() + attrs.SetUserString(_KEY_RAUM_STIL_ID, sid) + doc.Objects.ModifyAttributes(src_obj.Id, attrs, True) + except Exception as ex: + print("[ELEMENTE] write stil_id on {}: {}".format(eid, ex)) n_applied += 1 except Exception as ex: print("[ELEMENTE] apply stil {} -> {}: {}".format(sid, eid, ex)) diff --git a/src/ElementeApp.jsx b/src/ElementeApp.jsx index 147a8b9..e65fdb2 100644 --- a/src/ElementeApp.jsx +++ b/src/ElementeApp.jsx @@ -908,7 +908,7 @@ function RaumProperties({ raum, geschosse, onUpdate, onDelete, hatchPatterns, fo fuellung: raum.fuellung || '', showSia: !!raum.showSia, layout: Array.isArray(raum.layout) ? raum.layout : [], - }) + }, [raum.id]) // direkt aktuellen Raum mit der neuen Stil-ID verknuepfen return } if (val === '__delete__') { diff --git a/src/lib/rhinoBridge.js b/src/lib/rhinoBridge.js index 433b196..7c55eef 100644 --- a/src/lib/rhinoBridge.js +++ b/src/lib/rhinoBridge.js @@ -244,8 +244,9 @@ export function saveOeffStyle(name, settings) { } export function deleteOeffStyle(id) { send('DELETE_OEFF_STYLE', { id }) } // Raumstempel-Stile (Presets pro Doc) -export function saveRaumStil(id, name, settings) { - send('SAVE_RAUM_STIL', { id, name, settings }) +export function saveRaumStil(id, name, settings, applyToIds) { + send('SAVE_RAUM_STIL', { id, name, settings, + applyToIds: applyToIds || [] }) } export function deleteRaumStil(id) { send('DELETE_RAUM_STIL', { id }) } export function applyRaumStil(stilId, ids) {