From 42d321d5534fdfb745454c306debe13294a0b4e1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 1 Oct 2021 09:29:38 +1000 Subject: [PATCH] Removing contexts now also reassign to parent or remove references to the context. --- .../api/context/remove_context.py | 23 +++++++++++-- .../test/api/context/test_edit_context.py | 32 +++++++++++++++++++ .../test/api/context/test_remove_context.py | 32 +++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/context/test_edit_context.py create mode 100644 src/ifcopenshell-python/test/api/context/test_remove_context.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py index 1315d0b01a..8c11a6d6de 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py @@ -1,3 +1,6 @@ +import ifcopenshell + + class Usecase: def __init__(self, file, **settings): self.file = file @@ -6,7 +9,23 @@ class Usecase: self.settings[key] = value def execute(self): - # TODO: this is a light remove only for subcontext in self.settings["context"].HasSubContexts: - self.file.remove(subcontext) + ifcopenshell.api.run("context.remove_context", self.file, context=subcontext) + + if getattr(self.settings["context"], "ParentContext", None): + new = self.settings["context"].ParentContext + for inverse in self.file.get_inverse(self.settings["context"]): + ifcopenshell.util.element.replace_attribute(inverse, self.settings["context"], new) + + representations_in_context = self.settings["context"].RepresentationsInContext + has_coordinate_operation = [] + if self.settings["context"].is_a("IfcGeometricRepresentationSubContext"): + has_coordinate_operation = self.settings["context"].HasCoordinateOperation + self.file.remove(self.settings["context"]) + + for element in representations_in_context: + ifcopenshell.api.run("geometry.remove_representation", self.file, representation=element) + + for element in has_coordinate_operation: + ifcopenshell.util.element.remove_deep(self.file, element) diff --git a/src/ifcopenshell-python/test/api/context/test_edit_context.py b/src/ifcopenshell-python/test/api/context/test_edit_context.py new file mode 100644 index 0000000000..28f4145b15 --- /dev/null +++ b/src/ifcopenshell-python/test/api/context/test_edit_context.py @@ -0,0 +1,32 @@ +import test.bootstrap +import ifcopenshell.api + + +class TestEditContext(test.bootstrap.IFC4): + def test_editing_a_context(self): + context = self.file.createIfcGeometricRepresentationContext() + ifcopenshell.api.run("context.edit_context", self.file, context=context, attributes={ + "ContextIdentifier": "ContextIdentifier", + "ContextType": "ContextType", + "CoordinateSpaceDimension": 1, + "Precision": 1, + }) + assert context.ContextIdentifier == "ContextIdentifier" + assert context.ContextType == "ContextType" + assert context.CoordinateSpaceDimension == 1 + assert context.Precision == 1 + + def test_editing_a_subcontext(self): + subcontext = self.file.createIfcGeometricRepresentationSubcontext() + ifcopenshell.api.run("context.edit_context", self.file, context=subcontext, attributes={ + "ContextIdentifier": "ContextIdentifier", + "ContextType": "ContextType", + "TargetScale": 0.5, + "TargetView": "MODEL_VIEW", + "UserDefinedTargetView": "UserDefinedTargetView", + }) + assert subcontext.ContextIdentifier == "ContextIdentifier" + assert subcontext.ContextType == "ContextType" + assert subcontext.TargetScale == 0.5 + assert subcontext.TargetView == "MODEL_VIEW" + assert subcontext.UserDefinedTargetView == "UserDefinedTargetView" diff --git a/src/ifcopenshell-python/test/api/context/test_remove_context.py b/src/ifcopenshell-python/test/api/context/test_remove_context.py new file mode 100644 index 0000000000..70113eb54d --- /dev/null +++ b/src/ifcopenshell-python/test/api/context/test_remove_context.py @@ -0,0 +1,32 @@ +import test.bootstrap +import ifcopenshell.api + + +class TestRemoveContext(test.bootstrap.IFC4): + def test_removing_a_context(self): + context = self.file.createIfcGeometricRepresentationContext() + ifcopenshell.api.run("context.remove_context", self.file, context=context) + assert len(self.file.by_type("IfcGeometricRepresentationContext")) == 0 + + def test_removing_a_context_with_subcontexts(self): + context = self.file.createIfcGeometricRepresentationContext() + subcontext = self.file.createIfcGeometricRepresentationSubcontext() + subcontext.ParentContext = context + ifcopenshell.api.run("context.remove_context", self.file, context=context) + assert len(self.file.by_type("IfcGeometricRepresentationContext")) == 0 + + def test_removing_a_subcontext_and_reassigning_references_to_its_parent(self): + context = self.file.createIfcGeometricRepresentationContext() + subcontext = self.file.createIfcGeometricRepresentationSubcontext() + subcontext.ParentContext = context + representation = self.file.createIfcRepresentation(ContextOfItems=subcontext) + ifcopenshell.api.run("context.remove_context", self.file, context=subcontext) + assert len(self.file.by_type("IfcGeometricRepresentationSubcontext")) == 0 + assert representation in self.file.get_inverse(context) + + def test_removing_a_context_with_references(self): + subcontext = self.file.createIfcGeometricRepresentationSubContext() + representation = self.file.createIfcRepresentation(ContextOfItems=subcontext) + map_conversion = self.file.createIfcMapConversion(SourceCRS=subcontext) + ifcopenshell.api.run("context.remove_context", self.file, context=subcontext) + assert len([e for e in self.file]) == 0