Material/Ebene-Separation: Hatch raus aus Material (Refactor a)
Material ist jetzt rein 3D — Section-Hatch (2D-Schnitt) wird nicht mehr
am Material definiert, sondern am Layer (via Rhino-Layer-Dialog oder
spaeter via Ebenen-Settings + neuer Hatch-Tab im Project-Settings).
Schema-Aenderungen:
- _normalize_material: hatch + scale entfernt
- _MATERIAL_LIBRARY (elemente.py): hatch + scale aus allen Builtin-Mats
- _get_all_materials: ohne hatch
- _send_state materials payload: nur {name, color}
- Library import_material: PBR + Texturen werden weitergegeben
Backend:
- _ensure_material_sublayer: erstellt Sublayer mit Color, RESETTET aber
alten SectionHatchIndex auf -1 (= "kein eigener Hatch") damit
Inheritance/User-Override greift. Vorher wurden alte Material-Hatch-
Werte da haengen geblieben.
Frontend:
- MaterialDetail: Schraffur-Section entfernt
- hatchPatterns-Prop entfernt
Konsequenz: existierende Waende verlieren ihren Section-Hatch beim
naechsten Regen. User definiert Section-Hatches jetzt auf Layer-Ebene.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+26
-20
@@ -2195,26 +2195,25 @@ def _make_volume_geometry(axis_curve, dicke, uk, ok, referenz="mid",
|
||||
# konfiguriert — sobald der User eine Clipping Plane setzt, zeigt Rhino
|
||||
# automatisch die korrekte Schnitt-Symbolik pro Schicht.
|
||||
_MATERIAL_LIBRARY = {
|
||||
"Beton": {"color": "#9a9a9a", "hatch": "Hatch3", "scale": 1.0},
|
||||
"Stahlbeton": {"color": "#888888", "hatch": "Hatch3", "scale": 0.5},
|
||||
"Mauerwerk": {"color": "#b67860", "hatch": "Hatch1", "scale": 1.0},
|
||||
"Dämmung": {"color": "#f4e4a0", "hatch": "Hatch2", "scale": 0.5},
|
||||
"Holz": {"color": "#c89a5a", "hatch": "HatchDash", "scale": 1.0},
|
||||
"Stahl": {"color": "#7a7a7a", "hatch": "Solid", "scale": 1.0},
|
||||
"Putz": {"color": "#ede4d6", "hatch": "Solid", "scale": 1.0},
|
||||
"Glas": {"color": "#bcd4e0", "hatch": "Solid", "scale": 1.0},
|
||||
"Beton": {"color": "#9a9a9a"},
|
||||
"Stahlbeton": {"color": "#888888"},
|
||||
"Mauerwerk": {"color": "#b67860"},
|
||||
"Dämmung": {"color": "#f4e4a0"},
|
||||
"Holz": {"color": "#c89a5a"},
|
||||
"Stahl": {"color": "#7a7a7a"},
|
||||
"Putz": {"color": "#ede4d6"},
|
||||
"Glas": {"color": "#bcd4e0", "transparency": 0.7, "iorN": 1.5},
|
||||
}
|
||||
|
||||
|
||||
def _get_all_materials(doc):
|
||||
"""Builtin _MATERIAL_LIBRARY + Projekt-Settings-Materialien gemerged.
|
||||
Returns dict[name] -> full material dict (color/hatch/scale + PBR +
|
||||
textures + uvScaleM). Projekt-Settings ueberschreibt builtin bei
|
||||
Namensgleichheit. Builtin-Materialien bekommen leere PBR-Defaults."""
|
||||
Returns dict[name] -> full material dict (color + PBR + textures +
|
||||
uvScaleM). Section-Hatch (2D-Schnitt) ist NICHT mehr im Material —
|
||||
der wird per Ebenen-Settings am Layer konfiguriert."""
|
||||
merged = {}
|
||||
for n, m in _MATERIAL_LIBRARY.items():
|
||||
merged[n] = dict(m)
|
||||
# Builtin: PBR-Defaults wenn nicht gesetzt
|
||||
merged[n].setdefault("roughness", 0.7)
|
||||
merged[n].setdefault("reflection", 0.1)
|
||||
merged[n].setdefault("transparency", 0.0)
|
||||
@@ -2228,8 +2227,6 @@ def _get_all_materials(doc):
|
||||
for m in ps.get("materials", []):
|
||||
n = m.get("name")
|
||||
if not n: continue
|
||||
# Komplettes dict uebernehmen — _normalize_material hat
|
||||
# bereits alle Felder validiert.
|
||||
merged[n] = dict(m)
|
||||
except Exception as ex:
|
||||
print("[ELEMENTE] _get_all_materials:", ex)
|
||||
@@ -2268,7 +2265,11 @@ def _set_layer_section_hatch(doc, layer_idx, hatch_name, scale=1.0,
|
||||
|
||||
def _ensure_material_sublayer(doc, geschoss_name, material_name):
|
||||
"""Stellt sicher dass `<geschoss>::20_WAENDE::<material>` existiert,
|
||||
mit Material-Farbe + Section-Hatch konfiguriert. Liefert Layer-Index.
|
||||
mit Material-Farbe konfiguriert. Liefert Layer-Index.
|
||||
Section-Hatch (2D-Schnitt) wird NICHT mehr aus dem Material gesetzt —
|
||||
der kommt vom Parent-Layer (= Ebenen-Settings). Sub-Layer haben default
|
||||
keine eigene Section-Hatch, sie inherit'en Rhino-typisch ihre Optik
|
||||
fuer den Schnitt vom Parent.
|
||||
Bei leerem oder unbekanntem Material: Fallback auf das normale
|
||||
Wand-Volume-Layer (= Standard fuer Solid-Waende)."""
|
||||
all_mats = _get_all_materials(doc)
|
||||
@@ -2285,14 +2286,20 @@ def _ensure_material_sublayer(doc, geschoss_name, material_name):
|
||||
hex_str = mat["color"].lstrip("#")
|
||||
r = int(hex_str[0:2], 16); g = int(hex_str[2:4], 16); b = int(hex_str[4:6], 16)
|
||||
new_col = SD.Color.FromArgb(255, r, g, b)
|
||||
# Nur aendern wenn die Farbe abweicht (vermeidet unnoetige Doc-Dirty)
|
||||
try:
|
||||
if int(layer.Color.ToArgb()) != int(new_col.ToArgb()):
|
||||
layer.Color = new_col
|
||||
doc.Layers.Modify(layer, idx, True)
|
||||
except Exception: pass
|
||||
_set_layer_section_hatch(doc, idx, mat["hatch"],
|
||||
mat.get("scale", 1.0))
|
||||
# Section-Hatch: legacy-fields hatch/scale am Sub-Layer LOESCHEN
|
||||
# damit alte Setzungen weg sind. Index=-1 = "kein eigener Hatch,
|
||||
# User kann in Rhino-Layer-Dialog oder Ebenen-Settings setzen".
|
||||
try:
|
||||
if hasattr(layer, "SectionHatchIndex"):
|
||||
if layer.SectionHatchIndex >= 0:
|
||||
layer.SectionHatchIndex = -1
|
||||
doc.Layers.Modify(layer, idx, True)
|
||||
except Exception: pass
|
||||
except Exception as ex:
|
||||
print("[ELEMENTE] _ensure_material_sublayer:", ex)
|
||||
return idx
|
||||
@@ -6295,8 +6302,7 @@ class ElementeBridge(panel_base.BaseBridge):
|
||||
"siaFillMode": _sia_fill_enabled(doc),
|
||||
"hatchPatterns": _list_hatch_patterns(doc),
|
||||
"materials": [
|
||||
{"name": n, "color": m["color"],
|
||||
"hatch": m.get("hatch", ""), "scale": m.get("scale", 1.0)}
|
||||
{"name": n, "color": m["color"]}
|
||||
for n, m in _get_all_materials(doc).items()],
|
||||
"oeffStyles": list_oeff_styles(doc),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user