From af0f0a4f6cd86e464b59a23532d8ef33a831c9f7 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 10 Jul 2021 11:43:01 +1000 Subject: [PATCH] Implement support for removing styles. See #1557. --- .../blenderbim/bim/module/style/__init__.py | 1 + .../blenderbim/bim/module/style/operator.py | 25 ++++++++++++++-- .../blenderbim/bim/module/style/ui.py | 2 ++ .../ifcopenshell/api/style/remove_style.py | 30 +++++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py diff --git a/src/blenderbim/blenderbim/bim/module/style/__init__.py b/src/blenderbim/blenderbim/bim/module/style/__init__.py index 590bb7d66e..e9d7bf9e4b 100644 --- a/src/blenderbim/blenderbim/bim/module/style/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/style/__init__.py @@ -4,6 +4,7 @@ from . import ui, operator classes = ( operator.AddStyle, operator.EditStyle, + operator.RemoveStyle, operator.UnlinkStyle, ui.BIM_PT_style, ) diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index 06b33c8a21..0e53ab57bb 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -29,13 +29,32 @@ class EditStyle(bpy.types.Operator): def _execute(self, context): self.file = IfcStore.get_file() - material = bpy.data.objects.get(self.material) if self.material else bpy.context.active_object.active_material + material = bpy.data.materials.get(self.material) if self.material else bpy.context.active_object.active_material settings = get_colour_settings(material) settings["style"] = self.file.by_id(material.BIMMaterialProperties.ifc_style_id) ifcopenshell.api.run("style.edit_style", self.file, **settings) return {"FINISHED"} +class RemoveStyle(bpy.types.Operator): + bl_idname = "bim.remove_style" + bl_label = "Remove Style" + bl_options = {"REGISTER", "UNDO"} + material: bpy.props.StringProperty() + + def execute(self, context): + return IfcStore.execute_ifc_operator(self, context) + + def _execute(self, context): + self.file = IfcStore.get_file() + material = bpy.data.materials.get(self.material) if self.material else bpy.context.active_object.active_material + ifcopenshell.api.run( + "style.remove_style", self.file, style=self.file.by_id(material.BIMMaterialProperties.ifc_style_id) + ) + material.BIMMaterialProperties.ifc_style_id = 0 + return {"FINISHED"} + + class AddStyle(bpy.types.Operator): bl_idname = "bim.add_style" bl_label = "Add Style" @@ -50,9 +69,9 @@ class AddStyle(bpy.types.Operator): material = bpy.data.materials.get(self.material) if self.material else bpy.context.active_object.active_material settings = get_colour_settings(material) settings["name"] = material.name - settings["external_definition"] = None # TODO: Implement. See #1222 + settings["external_definition"] = None # TODO: Implement. See #1222 style = ifcopenshell.api.run("style.add_style", self.file, **settings) - material.BIMMaterialProperties.ifc_style_id = int(style.id()) + material.BIMMaterialProperties.ifc_style_id = style.id() return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index b34f4595fb..a56705a751 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -24,5 +24,7 @@ class BIM_PT_style(Panel): row.operator("bim.edit_style", icon="GREASEPENCIL") op = row.operator("bim.unlink_style", icon="UNLINKED", text="") op.material = context.active_object.active_material.name + op = row.operator("bim.remove_style", icon="X", text="") + op.material = context.active_object.active_material.name else: row.operator("bim.add_style", icon="ADD") diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py new file mode 100644 index 0000000000..fa2f9de046 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py @@ -0,0 +1,30 @@ +import ifcopenshell.util.element + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"style": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + self.purge_styled_items(self.settings["style"]) + ifcopenshell.util.element.remove_deep(self.file, self.settings["style"]) + + def purge_styled_items(self, style): + for inverse in self.file.get_inverse(style): + if inverse.is_a("IfcStyledItem") and len(inverse.Styles) == 1: + self.purge_styled_representations(inverse) + self.file.remove(inverse) + + def purge_styled_representations(self, styled_item): + for inverse in self.file.get_inverse(styled_item): + if inverse.is_a("IfcStyledRepresentation") and len(inverse.Items) == 1: + self.purge_material_definition_representations(inverse) + self.file.remove(inverse) + + def purge_material_definition_representations(self, styled_representation): + for inverse in self.file.get_inverse(styled_representation): + if inverse.is_a("IfcMaterialDefinitionRepresentation") and len(inverse.Representations) == 1: + self.file.remove(inverse)