From 98824c168039cd813559eb3db7ca18b0effb03ab Mon Sep 17 00:00:00 2001 From: karim Date: Sat, 30 May 2026 16:48:54 +0200 Subject: [PATCH] Wand-Stil im Elemente-Panel editierbar Backend - wand-State enthaelt jetzt styleId (aus _KEY_WAND_STYLE_ID) - STATE-Payload sendet wandStyles (analog oeffStyles) - _update_wall_body handhabt styleId-Patch: bei Stil-Wechsel uebernimmt die dicke aus dem Stil (wenn nicht explizit im selben Patch ueberschrieben); wand_style_id wird per _attach_meta auf die Achse persistiert Frontend - WallProperties bekommt wandStyles-Prop + zeigt Stil-Picker zwischen Geschoss und Aufbau (nur wenn Stile vorhanden) - Dropdown: "kein Stil" + alle definierten Stile mit (dicke, prio) - PropertiesView + ElementeApp + ElementePropertiesApp propagieren wandStyles --- rhino/elemente.py | 20 +++++++++++++++++++- src/ElementeApp.jsx | 24 ++++++++++++++++++++++-- src/ElementePropertiesApp.jsx | 1 + 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/rhino/elemente.py b/rhino/elemente.py index 78c0231..ef59bdf 100644 --- a/rhino/elemente.py +++ b/rhino/elemente.py @@ -9315,6 +9315,7 @@ class ElementeBridge(panel_base.BaseBridge): "ok": ok, "layered": bool(meta.get("wand_layered", False)), "layers": meta.get("wand_layers", []), + "styleId": meta.get("wand_style_id", "") or "", }) elif meta["type"] == "decke_outline": uk, ok = _resolve_decke_z(doc, meta["geschoss"], meta["dicke"], @@ -9641,6 +9642,7 @@ class ElementeBridge(panel_base.BaseBridge): {"name": n, "color": m["color"]} for n, m in _get_all_materials(doc).items()], "oeffStyles": list_oeff_styles(doc), + "wandStyles": _get_all_wand_styles(doc), "raumStempelStile": load_raum_stempel_stile(doc), "stempelStile": load_stempel_stile(doc), "treppe2DShow": _treppe_2d_enabled(doc), @@ -14296,6 +14298,21 @@ class ElementeBridge(panel_base.BaseBridge): attrs.LayerIndex = _ensure_layer(doc, _layer_path_decke(doc, geschoss_name)) elif old_meta["type"] == "dach_outline": attrs.LayerIndex = _ensure_layer(doc, _layer_path_dach(doc, geschoss_name)) + # Wand-Stil: bei Stil-Wechsel uebernehmen wir dicke aus dem Style + # (defaults), die Referenz bleibt erhalten. User kann dicke danach + # individuell wieder ueberschreiben. + if old_meta["type"] == "wand_axis" and "styleId" in p: + new_style_id = p.get("styleId") or "" + if new_style_id != old_meta.get("wand_style_id", ""): + stl = _find_wand_style(doc, new_style_id) + if stl is not None: + # dicke nur uebernehmen wenn User nicht explizit dicke + # ueberschrieben hat im selben Patch + if "dicke" not in p: + try: dicke = float(stl.get("dicke", dicke)) + except Exception: pass + else: + new_style_id = old_meta.get("wand_style_id", "") # Wenn layered + Layers gegeben: dicke aus Summe nachfuehren if wand_layered and wand_layers: try: @@ -14315,7 +14332,8 @@ class ElementeBridge(panel_base.BaseBridge): neigung_unten=neigung_unten, knick_h=knick_h, dach_variante=dach_variante, wand_layered=wand_layered, - wand_layers=wand_layers if wand_layered else []) + wand_layers=wand_layers if wand_layered else [], + wand_style_id=new_style_id if old_meta["type"] == "wand_axis" else None) axis_obj.Attributes = attrs axis_obj.CommitChanges() # Volumen regenerieren (Layer ggf. anpassen) diff --git a/src/ElementeApp.jsx b/src/ElementeApp.jsx index 7a93124..87d9c49 100644 --- a/src/ElementeApp.jsx +++ b/src/ElementeApp.jsx @@ -527,12 +527,13 @@ function NeuesElementSection({ noGeschoss, activeName, elementsCount, treppe2DSh // PropertiesView: gemeinsame Komponente, rendert die passende Property- // Form je nach Element-Typ. Wiederverwendbar in Inline + Satellite-Window. -export function PropertiesView({ selected, geschosse, materials, hatchPatterns, oeffStyles, fonts, raumStempelStile, stempelStile }) { +export function PropertiesView({ selected, geschosse, materials, hatchPatterns, oeffStyles, wandStyles, fonts, raumStempelStile, stempelStile }) { if (!selected) return null const upd = (p) => updateElement(selected.id, p) const del = (label) => () => { if (window.confirm(`${label} löschen?`)) deleteElement(selected.id) } if (selected.kind === 'wand') return if (selected.kind === 'decke') return @@ -1469,7 +1471,7 @@ function AussparungProperties({ aussp, onDelete }) { ) } -function WallProperties({ wall, geschosse, materials, onUpdate, onDelete }) { +function WallProperties({ wall, geschosse, materials, wandStyles, onUpdate, onDelete }) { const [dicke, setDicke] = useState(String(wall.dicke)) const [ukOver, setUkOver] = useState(wall.ukOverride) const [okOver, setOkOver] = useState(wall.okOverride) @@ -1481,6 +1483,7 @@ function WallProperties({ wall, geschosse, materials, onUpdate, onDelete }) { const ukAuto = ukOver === '' || ukOver == null const okAuto = okOver === '' || okOver == null + const styles = wandStyles || [] return (
+ {styles.length > 0 && ( +
+ Stil + +
+ )} +
Aufbau
diff --git a/src/ElementePropertiesApp.jsx b/src/ElementePropertiesApp.jsx index edb0295..ea2f13f 100644 --- a/src/ElementePropertiesApp.jsx +++ b/src/ElementePropertiesApp.jsx @@ -37,6 +37,7 @@ export default function ElementePropertiesApp() { hatchPatterns={state.hatchPatterns} fonts={state.fonts || []} oeffStyles={state.oeffStyles || []} + wandStyles={state.wandStyles || []} raumStempelStile={state.raumStempelStile || []} stempelStile={state.stempelStile || []} />