mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +00:00
Purging styles to also purge associated blender materials #3914
This commit is contained in:
@@ -648,9 +648,7 @@ class PurgeUnusedObjects(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
elif object_type == "PROFILE":
|
elif object_type == "PROFILE":
|
||||||
purged = bonsai.core.profile.purge_unused_profiles(tool.Ifc, tool.Profile)
|
purged = bonsai.core.profile.purge_unused_profiles(tool.Ifc, tool.Profile)
|
||||||
elif object_type == "STYLE":
|
elif object_type == "STYLE":
|
||||||
# It's okay to remove IfcPresentationStyle if just remove_deep
|
purged = tool.Style.purge_unused_styles()
|
||||||
# as there are no white listed inverses.
|
|
||||||
purged = tool.Debug.purge_unused_class("IfcPresentationStyle")
|
|
||||||
elif object_type == "MATERIAL":
|
elif object_type == "MATERIAL":
|
||||||
purged = tool.Material.purge_unused_materials()
|
purged = tool.Material.purge_unused_materials()
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -55,7 +55,15 @@ def update_external_style(
|
|||||||
ifc.run("style.edit_surface_style", style=external_style, attributes=attributes)
|
ifc.run("style.edit_surface_style", style=external_style, attributes=attributes)
|
||||||
|
|
||||||
|
|
||||||
def remove_style(ifc: tool.Ifc, style_tool: tool.Style, style: ifcopenshell.entity_instance) -> None:
|
def remove_style(
|
||||||
|
ifc: tool.Ifc, style_tool: tool.Style, style: ifcopenshell.entity_instance, reload_styles_ui: bool = False
|
||||||
|
) -> None:
|
||||||
|
"""Remove IfcPresentationStyle and associated Blender material.
|
||||||
|
|
||||||
|
:param reload_styles_ui: Whether to reload Styles UI after removal.
|
||||||
|
Useful to disable if you plan to remove many styles and want to
|
||||||
|
avoid unnecessary reloads.
|
||||||
|
"""
|
||||||
obj = ifc.get_object(style)
|
obj = ifc.get_object(style)
|
||||||
# Get style_type before removing object as later StylesData might fail to load
|
# Get style_type before removing object as later StylesData might fail to load
|
||||||
# due object not yet removed completely.
|
# due object not yet removed completely.
|
||||||
@@ -63,7 +71,7 @@ def remove_style(ifc: tool.Ifc, style_tool: tool.Style, style: ifcopenshell.enti
|
|||||||
ifc.unlink(element=style)
|
ifc.unlink(element=style)
|
||||||
ifc.run("style.remove_style", style=style)
|
ifc.run("style.remove_style", style=style)
|
||||||
style_tool.delete_object(obj)
|
style_tool.delete_object(obj)
|
||||||
if style_tool.is_editing_styles():
|
if reload_styles_ui and style_tool.is_editing_styles():
|
||||||
style_tool.import_presentation_styles(style_type)
|
style_tool.import_presentation_styles(style_type)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -98,15 +98,3 @@ class Debug(bonsai.core.tool.Debug):
|
|||||||
print(f"{class_string: <50} {unused[ifc_class]: >5}")
|
print(f"{class_string: <50} {unused[ifc_class]: >5}")
|
||||||
|
|
||||||
return sum(unused.values())
|
return sum(unused.values())
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def purge_unused_class(cls, ifc_class: str) -> int:
|
|
||||||
ifc_file = tool.Ifc.get()
|
|
||||||
elements = ifc_file.by_type(ifc_class)
|
|
||||||
i = 0
|
|
||||||
for element in elements:
|
|
||||||
if ifc_file.get_total_inverses(element) != 0:
|
|
||||||
continue
|
|
||||||
ifcopenshell.util.element.remove_deep(ifc_file, element)
|
|
||||||
i += 1
|
|
||||||
return i
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import numpy as np
|
|||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import ifcopenshell.util.element
|
import ifcopenshell.util.element
|
||||||
import ifcopenshell.util.representation
|
import ifcopenshell.util.representation
|
||||||
|
import bonsai.core.style
|
||||||
import bonsai.core.tool
|
import bonsai.core.tool
|
||||||
import bonsai.tool as tool
|
import bonsai.tool as tool
|
||||||
import bonsai.bim.helper
|
import bonsai.bim.helper
|
||||||
@@ -695,3 +696,20 @@ class Style(bonsai.core.tool.Style):
|
|||||||
blender_material = tool.Ifc.get_object(style)
|
blender_material = tool.Ifc.get_object(style)
|
||||||
# Will implicitly update the style name using handler.
|
# Will implicitly update the style name using handler.
|
||||||
blender_material.name = name
|
blender_material.name = name
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def purge_unused_styles(cls) -> int:
|
||||||
|
"""Purge unused styles (and related Blender materials).
|
||||||
|
|
||||||
|
Note that Styles UI should be updated manually after using this method.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ifc_file = tool.Ifc.get()
|
||||||
|
elements = ifc_file.by_type("IfcPresentationStyle")
|
||||||
|
i = 0
|
||||||
|
for element in elements:
|
||||||
|
if ifc_file.get_total_inverses(element) != 0:
|
||||||
|
continue
|
||||||
|
bonsai.core.style.remove_style(tool.Ifc, tool.Style, element, reload_styles_ui=False)
|
||||||
|
i += 1
|
||||||
|
return i
|
||||||
|
|||||||
Reference in New Issue
Block a user