Mass-Style Preset (Raum-Rundung + Dim-Format) + Rundung als Dropdown

Frontend:
- RaumProperties Rundung: 5er-Button-Reihe → Dropdown mit "Aus Mass-Style"
  als erstem Eintrag (leer = Default aus aktivem Preset uebernehmen)
- Dach-Typ + Mansarde-Variante: text-only Button-Reihen → Dropdowns
- Mass-Style-Section neu im DimensionenApp ganz oben:
  - Picker fuer aktives Preset
  - + (neu mit aktuellen Werten als Vorlage) / Loeschen
  - Inline-Editor: Name, Raum-Rundung, Mass-Dezimalstellen, Mass-Einheit

Backend (rhino/mass_style.py — neu):
- doc.Strings["dossier_mass_styles"]: JSON-Liste der Presets
- doc.Strings["dossier_mass_style_active"]: aktive Preset-ID
- list_presets/save_preset/delete_preset/get_active_id/set_active_id
- Convenience: raum_rundung_default(doc), dim_dezimalstellen_default(doc)
- Default-Presets bei erster Initialisierung: 1:50 / 1:100 / 1:500

elemente.py:
- _read_meta: raum_rundung leer wenn UserString fehlt (vorher gezwungen "0.1")
- _resolve_raum_rundung(meta, doc): per-Raum-Override > Mass-Style-Default
- _make_raum_stamp_text + state-send nutzen Resolver
- State sendet rundung (raw, kann "" sein) + rundungEffective + areaFmt
  damit React-Panel "Aus Mass-Style" anzeigen kann

dimensionen.py:
- Bridge-Endpoints MASS_STYLE_SET_ACTIVE / SAVE / DELETE
- _broadcast_raum_regen: bei Preset-Wechsel alle Raeume queuen → Stempel-
  Flaechen kommen mit neuer Default-Rundung
- _compute_state liefert massStyles + massStyleActive + signature update

NOCH NICHT verdrahtet: Mass-Linien-Formatierung (dimDezimalstellen,
dimEinheit) — Datenmodell ist da, Anwendung auf Rhino-Dimension-Renderer
folgt in einem naechsten Schritt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 21:18:15 +02:00
parent b69dd8e279
commit 0b4b25cf47
6 changed files with 426 additions and 54 deletions
+25 -6
View File
@@ -21,6 +21,7 @@ if _HERE not in sys.path:
sys.path.insert(0, _HERE)
import panel_base
import mass_style
PANEL_GUID_STR = "5a6b7c8d-9e0f-4a1b-c2d3-e4f5061728e0"
@@ -96,6 +97,21 @@ _KEY_RAUM_SIA = "dossier_raum_sia" # "" | "hnf" | "nnf" | "vf" | "ff"
_KEY_RAUM_FUELL = "dossier_raum_fuellung" # "" (keine) | "Solid" | Pattern-Name | "ByLayer"
_RAUM_RUNDUNGEN = ("exakt", "0.01", "0.1", "0.5", "1")
def _resolve_raum_rundung(meta, doc=None):
"""Loest die Raum-Rundung auf. Wenn am Raum eine explizite UserString-
Rundung gesetzt ist (raum_rundung != ""), gewinnt die. Sonst Default aus
dem aktiven Mass-Style. Doc-Default fallback "0.1" wenn nichts gesetzt."""
explicit = (meta or {}).get("raum_rundung") or ""
if explicit in _RAUM_RUNDUNGEN: return explicit
if doc is None: doc = Rhino.RhinoDoc.ActiveDoc
try:
return mass_style.raum_rundung_default(doc)
except Exception:
return "0.1"
_RAUM_ALIGN = ("links", "mid", "rechts")
_RAUM_SIA_KINDS = ("", "hnf", "nnf", "vf", "ff")
_RAUM_FUNKTIONEN = (
@@ -1958,8 +1974,9 @@ def _read_meta(obj):
r_name = a.GetUserString(_KEY_RAUM_NAME) or ""
r_num = a.GetUserString(_KEY_RAUM_NUMMER) or ""
r_fkt = a.GetUserString(_KEY_RAUM_FUNKTION) or ""
r_rnd = a.GetUserString(_KEY_RAUM_RUNDUNG) or "0.1"
if r_rnd not in _RAUM_RUNDUNGEN: r_rnd = "0.1"
# Leer = "Default aus Mass-Style" — wird in _resolve_rundung() aufgeloest.
r_rnd = a.GetUserString(_KEY_RAUM_RUNDUNG) or ""
if r_rnd and r_rnd not in _RAUM_RUNDUNGEN: r_rnd = ""
try: r_th = float(a.GetUserString(_KEY_RAUM_TXT_H) or "0.20")
except Exception: r_th = 0.20
r_align = a.GetUserString(_KEY_RAUM_ALIGN) or "mid"
@@ -4536,7 +4553,7 @@ def _regenerate_element_body(doc, element_id, src_obj, meta, geom, geschoss_name
meta.get("raum_nummer", ""),
meta.get("raum_funktion", ""),
area,
meta.get("raum_rundung", "0.1"),
_resolve_raum_rundung(meta, doc),
meta.get("raum_txt_h", 0.20),
z=z_uk,
align=meta.get("raum_align", "mid"))
@@ -4813,19 +4830,21 @@ class ElementeBridge(panel_base.BaseBridge):
area, perim, _ctr = _raum_amp(g_obj)
except Exception:
area, perim = 0.0, 0.0
rnd = meta.get("raum_rundung", "0.1")
rnd_raw = meta.get("raum_rundung") or "" # "" = aus Mass-Style
rnd_eff = _resolve_raum_rundung(meta, doc)
base.update({
"kind": "raum",
"name": meta.get("raum_name", "Raum"),
"nummer": meta.get("raum_nummer", ""),
"funktion": meta.get("raum_funktion", ""),
"rundung": rnd,
"rundung": rnd_raw,
"rundungEffective": rnd_eff,
"txtH": meta.get("raum_txt_h", 0.20),
"align": meta.get("raum_align", "mid"),
"sia": meta.get("raum_sia", ""),
"fuellung": bool(meta.get("raum_fuellung", False)),
"area": area,
"areaFmt": _format_area(area, rnd),
"areaFmt": _format_area(area, rnd_eff),
"umfang": perim,
})
elif meta["type"] in ("stuetze_point", "traeger_axis"):