From fa23f64e9facaeaaad063a75479a5389dc19ff80 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 8 Mar 2021 14:20:43 +1100 Subject: [PATCH] Fix #1344. You can now reorder items in a material layer set --- .../bim/module/material/__init__.py | 1 + .../bim/module/material/operator.py | 24 +++++++++++++++++++ .../bim/module/material/reorder_layer.py | 11 +++++++++ .../blenderbim/bim/module/material/ui.py | 16 +++++++++---- 4 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py b/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py index 9400233676..db36383ed8 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/__init__.py @@ -10,6 +10,7 @@ classes = ( operator.RemoveConstituent, operator.AddLayer, operator.RemoveLayer, + operator.ReorderLayer, operator.AddListItem, operator.RemoveListItem, operator.EnableEditingAssignedMaterial, diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py index 404cf58d04..0f3b0dbbf7 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/operator.py @@ -8,6 +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.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 @@ -137,6 +138,29 @@ class AddLayer(bpy.types.Operator): return {"FINISHED"} +class ReorderLayer(bpy.types.Operator): + bl_idname = "bim.reorder_layer" + bl_label = "Reorder Layer" + obj: bpy.props.StringProperty() + old_index: bpy.props.IntProperty() + new_index: bpy.props.IntProperty() + layer_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( + self.file, + { + "layer_set": self.file.by_id(self.layer_set), + "old_index": self.old_index, + "new_index": self.new_index, + }, + ).execute() + Data.load_layers() + return {"FINISHED"} + + class RemoveLayer(bpy.types.Operator): bl_idname = "bim.remove_layer" bl_label = "Remove Layer" diff --git a/src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py b/src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py new file mode 100644 index 0000000000..4ee10d2655 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/material/reorder_layer.py @@ -0,0 +1,11 @@ +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/ui.py b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py index 1aec18d6c1..742287c58e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/material/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/module/material/ui.py @@ -145,7 +145,9 @@ class BIM_PT_object_material(Panel): if self.props.active_material_set_item_id == set_item_id: self.draw_editable_set_item_ui(set_item_id) else: - self.draw_read_only_set_item_ui(set_item_id, is_first=index == 0, is_last=index == total_items - 1) + self.draw_read_only_set_item_ui( + set_item_id, index, is_first=index == 0, is_last=index == total_items - 1 + ) def draw_editable_set_item_ui(self, set_item_id): item = self.set_data[set_item_id] @@ -170,7 +172,7 @@ class BIM_PT_object_material(Panel): row.prop(attribute, "bool_value", text=attribute.name) row.prop(attribute, "is_null", icon="RADIOBUT_OFF" if attribute.is_null else "RADIOBUT_ON", text="") - def draw_read_only_set_item_ui(self, set_item_id, is_first=False, is_last=False): + def draw_read_only_set_item_ui(self, set_item_id, index, is_first=False, is_last=False): if self.product_data["type"] == "IfcMaterialList": item = Data.materials[set_item_id] row = self.layout.row(align=True) @@ -183,9 +185,15 @@ class BIM_PT_object_material(Panel): row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL") if not is_first: - row.operator("bim.edit_attributes", icon="TRIA_UP", text="") + op = row.operator(f"bim.reorder_{self.set_item_name}", 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) if not is_last: - row.operator("bim.edit_attributes", icon="TRIA_DOWN", text="") + op = row.operator(f"bim.reorder_{self.set_item_name}", 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) 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