Fix #3483. You can now conveniently duplicate material layers.

This commit is contained in:
Dion Moult
2023-07-30 22:34:40 +10:00
parent caff4d0b20
commit 12d70324b8
3 changed files with 19 additions and 2 deletions
@@ -32,9 +32,10 @@ classes = (
operator.CopyMaterial,
operator.DisableEditingAssignedMaterial,
operator.DisableEditingMaterial,
operator.DisableEditingMaterials,
operator.DisableEditingMaterialSetItem,
operator.DisableEditingMaterialSetItemProfile,
operator.DisableEditingMaterials,
operator.DuplicateLayer,
operator.EditAssignedMaterial,
operator.EditMaterial,
operator.EditMaterialSetItem,
@@ -311,7 +311,6 @@ class RemoveLayer(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.remove_layer"
bl_label = "Remove Layer"
bl_options = {"REGISTER", "UNDO"}
obj: bpy.props.StringProperty()
layer: bpy.props.IntProperty()
def _execute(self, context):
@@ -323,6 +322,21 @@ class RemoveLayer(bpy.types.Operator, tool.Ifc.Operator):
ifcopenshell.api.run("material.remove_layer", tool.Ifc.get(), layer=layer)
class DuplicateLayer(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.duplicate_layer"
bl_label = "Duplicate Layer"
bl_options = {"REGISTER", "UNDO"}
layer: bpy.props.IntProperty()
def _execute(self, context):
layer = tool.Ifc.get().by_id(self.layer)
new_layer = ifcopenshell.util.element.copy(tool.Ifc.get(), layer)
for material_set in layer.ToMaterialLayerSet:
layers = list(material_set.MaterialLayers)
layers.insert(layers.index(layer), new_layer)
material_set.MaterialLayers = layers
class AddListItem(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_list_item"
bl_label = "Add List Item"
@@ -275,6 +275,8 @@ class BIM_PT_object_material(Panel):
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"]
if ObjectMaterialData.data["set_item_name"] == "layer":
row.operator("bim.duplicate_layer", icon="DUPLICATE", text="").layer = set_item["id"]
op = row.operator(f"bim.remove_{ObjectMaterialData.data['set_item_name']}", icon="X", text="")
if ObjectMaterialData.data["material_class"] == "IfcMaterialList":
setattr(op, "list_item_set", ObjectMaterialData.data["set"]["id"])