From e89d540236235f24b0098b62b3afafb2f988002e Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 8 Mar 2021 16:19:26 +1100 Subject: [PATCH] Fix bug where assigning a new constituent or profile was borked. Also you can now reorder material lists and constituent set items. --- .../bim/module/material/__init__.py | 2 +- .../bim/module/material/assign_material.py | 2 -- .../bim/module/material/operator.py | 24 ++++++++++++------- .../bim/module/material/reorder_layer.py | 11 --------- .../bim/module/material/reorder_set_item.py | 19 +++++++++++++++ .../blenderbim/bim/module/material/ui.py | 10 ++++---- .../blenderbim/bim/module/pset/ui.py | 2 ++ 7 files changed, 43 insertions(+), 27 deletions(-) delete mode 100644 src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py create mode 100644 src/ifcblenderexport/blenderbim/bim/module/material/reorder_set_item.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py b/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py index db36383ed8..89e1f74243 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py @@ -10,7 +10,7 @@ classes = ( operator.RemoveConstituent, operator.AddLayer, operator.RemoveLayer, - operator.ReorderLayer, + operator.ReorderMaterialSetItem, operator.AddListItem, operator.RemoveListItem, operator.EnableEditingAssignedMaterial, diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py b/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py index 82259dc5cb..766f690774 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/assign_material.py @@ -13,7 +13,6 @@ class Usecase: self.assign_ifc_material() elif self.settings["type"] == "IfcMaterialConstituentSet": material_set = self.file.create_entity(self.settings["type"]) - material_set.MaterialConstituents = [self.settings["material"]] self.create_material_association(material_set) elif self.settings["type"] == "IfcMaterialLayerSet": material_set = self.file.create_entity(self.settings["type"]) @@ -24,7 +23,6 @@ class Usecase: self.create_material_association(material_set_usage) elif self.settings["type"] == "IfcMaterialProfileSet": material_set = self.file.create_entity(self.settings["type"]) - material_set.MaterialProfiles = [self.settings["material"]] self.create_material_association(material_set) elif self.settings["type"] == "IfcMaterialList": material_set = self.file.create_entity(self.settings["type"]) diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py index 0f3b0dbbf7..f656fc5d84 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py @@ -8,7 +8,7 @@ import blenderbim.bim.module.material.remove_constituent as remove_constituent import blenderbim.bim.module.material.add_layer as add_layer import blenderbim.bim.module.material.edit_layer as edit_layer import blenderbim.bim.module.material.remove_layer as remove_layer -import blenderbim.bim.module.material.reorder_layer as reorder_layer +import blenderbim.bim.module.material.reorder_set_item as reorder_set_item import blenderbim.bim.module.material.add_list_item as add_list_item import blenderbim.bim.module.material.remove_list_item as remove_list_item import blenderbim.bim.module.material.edit_assigned_material as edit_assigned_material @@ -138,26 +138,34 @@ class AddLayer(bpy.types.Operator): return {"FINISHED"} -class ReorderLayer(bpy.types.Operator): - bl_idname = "bim.reorder_layer" - bl_label = "Reorder Layer" +class ReorderMaterialSetItem(bpy.types.Operator): + bl_idname = "bim.reorder_material_set_item" + bl_label = "Reorder Material Set Item" obj: bpy.props.StringProperty() old_index: bpy.props.IntProperty() new_index: bpy.props.IntProperty() - layer_set: bpy.props.IntProperty() + material_set: bpy.props.IntProperty() def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object self.file = IfcStore.get_file() - reorder_layer.Usecase( + material_set = self.file.by_id(self.material_set) + reorder_set_item.Usecase( self.file, { - "layer_set": self.file.by_id(self.layer_set), + "material_set": material_set, "old_index": self.old_index, "new_index": self.new_index, }, ).execute() - Data.load_layers() + if material_set.is_a("IfcMaterialConstituentSet"): + Data.load_constituents() + elif material_set.is_a("IfcMaterialLayerSet"): + Data.load_layers() + elif material_set.is_a("IfcMaterialProfileSet"): + Data.load_profiles() + elif material_set.is_a("IfcMaterialList"): + Data.load_lists() return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py b/src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py deleted file mode 100644 index 4ee10d2655..0000000000 --- a/src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py +++ /dev/null @@ -1,11 +0,0 @@ -class Usecase: - def __init__(self, file, settings=None): - self.file = file - self.settings = {"layer_set": None, "old_index": 0, "new_index": 0} - for key, value in settings.items(): - self.settings[key] = value - - def execute(self): - layers = list(self.settings["layer_set"].MaterialLayers or []) - layers.insert(self.settings["new_index"], layers.pop(self.settings["old_index"])) - self.settings["layer_set"].MaterialLayers = layers diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/reorder_set_item.py b/src/ifcblenderexport/blenderbim/bim/module/material/reorder_set_item.py new file mode 100644 index 0000000000..c4f15373fc --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/material/reorder_set_item.py @@ -0,0 +1,19 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = {"material_set": None, "old_index": 0, "new_index": 0} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + if self.settings["material_set"].is_a("IfcMaterialConstituentSet"): + set_name = "MaterialConstituents" + elif self.settings["material_set"].is_a("IfcMaterialLayerSet"): + set_name = "MaterialLayers" + elif self.settings["material_set"].is_a("IfcMaterialProfileSet"): + set_name = "MaterialProfiles" + elif self.settings["material_set"].is_a("IfcMaterialList"): + set_name = "Materials" + items = list(getattr(self.settings["material_set"], set_name) or []) + items.insert(self.settings["new_index"], items.pop(self.settings["old_index"])) + setattr(self.settings["material_set"], set_name, items) diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py index 742287c58e..60b2cec9da 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py @@ -12,7 +12,7 @@ class BIM_PT_material(Panel): @classmethod def poll(cls, context): - return IfcStore.get_file() + return IfcStore.get_file() and context.active_object and context.active_object.active_material def draw(self, context): row = self.layout.row() @@ -185,15 +185,15 @@ class BIM_PT_object_material(Panel): row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL") if not is_first: - op = row.operator(f"bim.reorder_{self.set_item_name}", icon="TRIA_UP", text="") + op = row.operator(f"bim.reorder_material_set_item", icon="TRIA_UP", text="") op.old_index = index op.new_index = index - 1 - setattr(op, f"{self.set_item_name}_set", self.material_set_id) + setattr(op, "material_set", self.material_set_id) if not is_last: - op = row.operator(f"bim.reorder_{self.set_item_name}", icon="TRIA_DOWN", text="") + op = row.operator(f"bim.reorder_material_set_item", icon="TRIA_DOWN", text="") op.old_index = index op.new_index = index + 1 - setattr(op, f"{self.set_item_name}_set", self.material_set_id) + setattr(op, "material_set", self.material_set_id) if not self.props.active_material_set_item_id and self.product_data["type"] != "IfcMaterialList": op = row.operator("bim.enable_editing_material_set_item", icon="GREASEPENCIL", text="") op.material_set_item = set_item_id diff --git a/src/ifcblenderexport/blenderbim/bim/module/pset/ui.py b/src/ifcblenderexport/blenderbim/bim/module/pset/ui.py index 63096d4f1a..d086b4f22d 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/pset/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/module/pset/ui.py @@ -175,6 +175,8 @@ class BIM_PT_material_psets(Panel): def poll(cls, context): if not context.active_object: return False + if not context.active_object.active_material: + return False props = context.active_object.active_material.BIMObjectProperties if not props.ifc_definition_id: return False