diff --git a/src/blenderbim/blenderbim/bim/module/material/__init__.py b/src/blenderbim/blenderbim/bim/module/material/__init__.py index 818cd76977..4a2b06b8dc 100644 --- a/src/blenderbim/blenderbim/bim/module/material/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/material/__init__.py @@ -32,11 +32,14 @@ classes = ( operator.CopyMaterial, operator.DisableEditingAssignedMaterial, operator.DisableEditingMaterialSetItem, + operator.DisableEditingMaterialSetItemProfile, operator.DisableEditingMaterials, operator.EditAssignedMaterial, operator.EditMaterialSetItem, + operator.EditMaterialSetItemProfile, operator.EnableEditingAssignedMaterial, operator.EnableEditingMaterialSetItem, + operator.EnableEditingMaterialSetItemProfile, operator.ExpandMaterialCategory, operator.LoadMaterials, operator.RemoveConstituent, diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 324e1a0931..4b198dc860 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -25,6 +25,7 @@ import ifcopenshell.util.representation import blenderbim.bim.helper import blenderbim.tool as tool import blenderbim.core.material as core +import blenderbim.bim.module.model.profile as model_profile from blenderbim.bim.module.material.prop import purge as material_prop_purge from blenderbim.bim.ifc import IfcStore from ifcopenshell.api.material.data import Data @@ -518,6 +519,52 @@ class EditAssignedMaterial(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.disable_editing_assigned_material(obj=obj.name) +class EnableEditingMaterialSetItemProfile(bpy.types.Operator): + bl_idname = "bim.enable_editing_material_set_item_profile" + bl_label = "Enable Editing Material Set Item" + bl_options = {"REGISTER", "UNDO"} + obj: bpy.props.StringProperty() + material_set_item: bpy.props.IntProperty() + + def execute(self, context): + obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object + self.props = obj.BIMObjectMaterialProperties + self.props.material_set_item_profile_attributes.clear() + profile = tool.Ifc.get().by_id(self.material_set_item).Profile + blenderbim.bim.helper.import_attributes2(profile, self.props.material_set_item_profile_attributes) + return {"FINISHED"} + + +class DisableEditingMaterialSetItemProfile(bpy.types.Operator): + bl_idname = "bim.disable_editing_material_set_item_profile" + bl_label = "Disable Editing Material Set Item" + bl_options = {"REGISTER", "UNDO"} + obj: bpy.props.StringProperty() + + def execute(self, context): + obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object + self.props = obj.BIMObjectMaterialProperties + self.props.material_set_item_profile_attributes.clear() + return {"FINISHED"} + + +class EditMaterialSetItemProfile(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.edit_material_set_item_profile" + bl_label = "Edit Material Set Item Profile" + bl_options = {"REGISTER", "UNDO"} + obj: bpy.props.StringProperty() + material_set_item: bpy.props.IntProperty() + + def _execute(self, context): + obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object + self.props = obj.BIMObjectMaterialProperties + attributes = blenderbim.bim.helper.export_attributes(self.props.material_set_item_profile_attributes) + profile = tool.Ifc.get().by_id(self.material_set_item).Profile + ifcopenshell.api.run("profile.edit_profile", tool.Ifc.get(), profile=profile, attributes=attributes) + self.props.material_set_item_profile_attributes.clear() + model_profile.DumbProfileRegenerator().regenerate_from_profile_def(profile) + + class EnableEditingMaterialSetItem(bpy.types.Operator): bl_idname = "bim.enable_editing_material_set_item" bl_label = "Enable Editing Material Set Item" diff --git a/src/blenderbim/blenderbim/bim/module/material/prop.py b/src/blenderbim/blenderbim/bim/module/material/prop.py index 7faf4c08ff..0cd34bf817 100644 --- a/src/blenderbim/blenderbim/bim/module/material/prop.py +++ b/src/blenderbim/blenderbim/bim/module/material/prop.py @@ -142,6 +142,9 @@ class BIMObjectMaterialProperties(PropertyGroup): material_set_attributes: CollectionProperty(name="Material Set Attributes", type=Attribute) active_material_set_item_id: IntProperty(name="Active Material Set ID") material_set_item_attributes: CollectionProperty(name="Material Set Item Attributes", type=Attribute) + material_set_item_profile_attributes: CollectionProperty( + name="Material Set Item Profile Attributes", type=Attribute + ) material_set_item_material: EnumProperty(items=get_materials, name="Material") profile_classes: EnumProperty(items=get_profile_classes, name="Profile Classes") parameterized_profile_classes: EnumProperty( diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index ce45872412..3764338103 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -209,13 +209,23 @@ class BIM_PT_object_material(Panel): total_items = len(ObjectMaterialData.data["set_items"]) for index, set_item in enumerate(ObjectMaterialData.data["set_items"]): - if self.props.active_material_set_item_id == set_item["id"]: + if len(self.props.material_set_item_profile_attributes): + self.draw_editable_set_item_profile_ui(set_item) + elif self.props.active_material_set_item_id == set_item["id"]: self.draw_editable_set_item_ui(set_item) else: self.draw_read_only_set_item_ui( set_item, index, is_first=index == 0, is_last=index == total_items - 1 ) + def draw_editable_set_item_profile_ui(self, set_item): + box = self.layout.box() + row = box.row(align=True) + op = row.operator("bim.edit_material_set_item_profile", icon="CHECKMARK", text="Save Changes") + op.material_set_item = set_item["id"] + row.operator("bim.disable_editing_material_set_item_profile", icon="CANCEL", text="") + draw_attributes(self.props.material_set_item_profile_attributes, box) + def draw_editable_set_item_ui(self, set_item): box = self.layout.box() row = box.row(align=True) @@ -254,7 +264,7 @@ class BIM_PT_object_material(Panel): setattr(op, "material_set", ObjectMaterialData.data["set"]["id"]) if not self.props.active_material_set_item_id and ObjectMaterialData.data["material_class"] != "IfcMaterialList": if "Profile" in ObjectMaterialData.data["material_class"]: - op = row.operator("bim.enable_editing_material_set_item", icon="ITALIC", text="") + op = row.operator("bim.enable_editing_material_set_item_profile", icon="ITALIC", text="") op.material_set_item = set_item["id"] op = row.operator("bim.enable_editing_material_set_item", icon="GREASEPENCIL", text="") op.material_set_item = set_item["id"] diff --git a/src/blenderbim/blenderbim/bim/module/profile/operator.py b/src/blenderbim/blenderbim/bim/module/profile/operator.py index d3b1575ac8..3f89a867d9 100644 --- a/src/blenderbim/blenderbim/bim/module/profile/operator.py +++ b/src/blenderbim/blenderbim/bim/module/profile/operator.py @@ -99,6 +99,7 @@ class EditProfile(bpy.types.Operator, tool.Ifc.Operator): attributes = blenderbim.bim.helper.export_attributes(props.profile_attributes) profile = tool.Ifc.get().by_id(props.active_profile_id) ifcopenshell.api.run("profile.edit_profile", tool.Ifc.get(), profile=profile, attributes=attributes) + model_profile.DumbProfileRegenerator().regenerate_from_profile_def(profile) bpy.ops.bim.load_profiles()