diff --git a/src/bonsai/bonsai/bim/module/model/door.py b/src/bonsai/bonsai/bim/module/model/door.py index 18e8b90f84..1d53a2c279 100644 --- a/src/bonsai/bonsai/bim/module/model/door.py +++ b/src/bonsai/bonsai/bim/module/model/door.py @@ -640,6 +640,7 @@ class EnableEditingDoor(bpy.types.Operator, tool.Ifc.Operator): data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Door", "Data")) data.update(data.pop("lining_properties")) data.update(data.pop("panel_properties")) + data.update(tool.Model.get_constituents_props_data(element)) # required since we could load pset from .ifc and BIMDoorProperties won't be set props.set_props_kwargs_from_ifc_data(data) diff --git a/src/bonsai/bonsai/bim/module/model/prop.py b/src/bonsai/bonsai/bim/module/model/prop.py index d02adfcf8d..8c438a384f 100644 --- a/src/bonsai/bonsai/bim/module/model/prop.py +++ b/src/bonsai/bonsai/bim/module/model/prop.py @@ -491,7 +491,13 @@ WindowType = Literal[ # default prop values are in mm and converted later class BIMWindowProperties(PropertyGroup): - non_si_units_props = ("is_editing", "window_type") + non_si_units_props = ( + "is_editing", + "window_type", + "lining_material", + "framing_material", + "glazing_material", + ) # number of panels and default mullion/transom values # fmt: off @@ -690,7 +696,14 @@ DoorType = Literal[ class BIMDoorProperties(PropertyGroup): - non_si_units_props = ("is_editing", "door_type", "panel_width_ratio") + non_si_units_props = ( + "is_editing", + "door_type", + "panel_width_ratio", + "lining_material", + "framing_material", + "glazing_material", + ) is_editing: bpy.props.BoolProperty(default=False) door_type: bpy.props.EnumProperty( name="Door Operation Type", diff --git a/src/bonsai/bonsai/bim/module/model/window.py b/src/bonsai/bonsai/bim/module/model/window.py index 41b767d111..a2ef7507f3 100644 --- a/src/bonsai/bonsai/bim/module/model/window.py +++ b/src/bonsai/bonsai/bim/module/model/window.py @@ -550,6 +550,7 @@ class EnableEditingWindow(bpy.types.Operator, tool.Ifc.Operator): data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Window", "Data")) data.update(data.pop("lining_properties")) data.update(data.pop("panel_properties")) + data.update(tool.Model.get_constituents_props_data(element)) # required since we could load pset from .ifc and BIMWindowProperties won't be set props.set_props_kwargs_from_ifc_data(data) diff --git a/src/bonsai/bonsai/tool/model.py b/src/bonsai/bonsai/tool/model.py index e7fa36358b..d8f986f48c 100644 --- a/src/bonsai/bonsai/tool/model.py +++ b/src/bonsai/bonsai/tool/model.py @@ -133,6 +133,19 @@ class Model(bonsai.core.tool.Model): data[prop_name] = prop_value * si_conversion return data + @classmethod + def get_constituents_props_data(cls, element: ifcopenshell.entity_instance) -> dict[str, str]: + constituents = ("lining", "framing", "glazing") + props: dict[str, str] = {f"{constituent}_material": "0" for constituent in constituents} + material = ifcopenshell.util.element.get_material(element) + if not material or not material.is_a("IfcMaterialConstituentSet"): + return props + for constituent in material.MaterialConstituents: + name = (constituent.Name or "").lower() + if name in constituents: + props[f"{name}_material"] = str(constituent.Material.id()) + return props + @classmethod def convert_mesh_to_curve( cls, position: Matrix, edge_indices: list[tuple[int, int]]