mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 08:45:22 +00:00
Implement support for removing styles. See #1557.
This commit is contained in:
@@ -4,6 +4,7 @@ from . import ui, operator
|
|||||||
classes = (
|
classes = (
|
||||||
operator.AddStyle,
|
operator.AddStyle,
|
||||||
operator.EditStyle,
|
operator.EditStyle,
|
||||||
|
operator.RemoveStyle,
|
||||||
operator.UnlinkStyle,
|
operator.UnlinkStyle,
|
||||||
ui.BIM_PT_style,
|
ui.BIM_PT_style,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -29,13 +29,32 @@ class EditStyle(bpy.types.Operator):
|
|||||||
|
|
||||||
def _execute(self, context):
|
def _execute(self, context):
|
||||||
self.file = IfcStore.get_file()
|
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 = get_colour_settings(material)
|
||||||
settings["style"] = self.file.by_id(material.BIMMaterialProperties.ifc_style_id)
|
settings["style"] = self.file.by_id(material.BIMMaterialProperties.ifc_style_id)
|
||||||
ifcopenshell.api.run("style.edit_style", self.file, **settings)
|
ifcopenshell.api.run("style.edit_style", self.file, **settings)
|
||||||
return {"FINISHED"}
|
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):
|
class AddStyle(bpy.types.Operator):
|
||||||
bl_idname = "bim.add_style"
|
bl_idname = "bim.add_style"
|
||||||
bl_label = "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
|
material = bpy.data.materials.get(self.material) if self.material else bpy.context.active_object.active_material
|
||||||
settings = get_colour_settings(material)
|
settings = get_colour_settings(material)
|
||||||
settings["name"] = material.name
|
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)
|
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"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,5 +24,7 @@ class BIM_PT_style(Panel):
|
|||||||
row.operator("bim.edit_style", icon="GREASEPENCIL")
|
row.operator("bim.edit_style", icon="GREASEPENCIL")
|
||||||
op = row.operator("bim.unlink_style", icon="UNLINKED", text="")
|
op = row.operator("bim.unlink_style", icon="UNLINKED", text="")
|
||||||
op.material = context.active_object.active_material.name
|
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:
|
else:
|
||||||
row.operator("bim.add_style", icon="ADD")
|
row.operator("bim.add_style", icon="ADD")
|
||||||
|
|||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user