diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py index fbf0909979..eb29d58c74 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py @@ -50,17 +50,21 @@ class Usecase: settings: dict[str, Any] def execute(self, style: ifcopenshell.entity_instance) -> None: - self.purge_styled_items(style) + self.purge_inverses(style) if style.is_a("IfcSurfaceStyle"): for style_ in style.Styles: ifcopenshell.api.style.remove_surface_style(self.file, style=style_) self.file.remove(style) - def purge_styled_items(self, style: ifcopenshell.entity_instance) -> None: + def purge_inverses(self, style: ifcopenshell.entity_instance) -> None: 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) + if inverse.is_a("IfcStyledItem"): + if len(inverse.Styles) == 1: + self.purge_styled_representations(inverse) + self.file.remove(inverse) + # IfcCurveStyle -> IfcFillAreaStyleHatching. + elif inverse.is_a("IfcFillAreaStyleHatching"): + self.purge_fill_area_style_hatching(inverse, style) def purge_styled_representations(self, styled_item: ifcopenshell.entity_instance) -> None: for inverse in self.file.get_inverse(styled_item): @@ -72,3 +76,11 @@ class Usecase: for inverse in self.file.get_inverse(styled_representation): if inverse.is_a("IfcMaterialDefinitionRepresentation") and len(inverse.Representations) == 1: self.file.remove(inverse) + + def purge_fill_area_style_hatching( + self, fill_area_style_hatching: ifcopenshell.entity_instance, style: ifcopenshell.entity_instance + ) -> None: + for inverse in self.file.get_inverse(fill_area_style_hatching): + if inverse.is_a("IfcFillAreaStyle"): + self.execute(inverse) + ifcopenshell.util.element.remove_deep2(self.file, fill_area_style_hatching, do_not_delete=[style]) diff --git a/src/ifcopenshell-python/test/api/style/test_remove_style.py b/src/ifcopenshell-python/test/api/style/test_remove_style.py index 1b65a4d573..e169fe4b95 100644 --- a/src/ifcopenshell-python/test/api/style/test_remove_style.py +++ b/src/ifcopenshell-python/test/api/style/test_remove_style.py @@ -18,6 +18,7 @@ import pytest import test.bootstrap +import ifcopenshell.api.material import ifcopenshell.api.style @@ -46,6 +47,28 @@ class TestRemoveStyle(test.bootstrap.IFC4): ifcopenshell.api.style.remove_style(self.file, style=style) assert len(self.file.by_type("IfcPresentationStyle")) == 0 + def test_remove_curve_style_with_curve_style_hatching(self): + element = self.file.create_entity("IfcWall") + material = ifcopenshell.api.material.add_material(self.file) + ifcopenshell.api.material.assign_material(self.file, products=[element], material=material) + curve_style = self.file.create_entity("IfcCurveStyle") + fill_style = self.file.create_entity("IfcFillAreaStyleHatching", HatchLineAppearance=curve_style) + style = self.file.create_entity("IfcFillAreaStyle", FillStyles=[fill_style]) + self.file.create_entity( + "IfcMaterialDefinitionRepresentation", + RepresentedMaterial=material, + Representations=[ + self.file.create_entity( + "IfcStyledRepresentation", + Items=[self.file.create_entity("IfcStyledItem", Styles=[style])], + ) + ], + ) + ifcopenshell.api.style.remove_style(self.file, curve_style) + assert len(self.file.by_type("IfcPresentationStyle")) == 0 + assert len(self.file.by_type("IfcMaterialDefinitionRepresentation")) == 0 + assert len(self.file.by_type("IfcStyledRepresentation")) == 0 + class TestRemoveStyleIFC2X3(test.bootstrap.IFC2X3, TestRemoveStyle): pass