From 233e73f9f61351f429008ad7c989fdf8b429fe65 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 15 Mar 2022 14:45:18 +1100 Subject: [PATCH] Removing documents now removes all subdocuments recursively and references --- .../api/document/remove_information.py | 39 +++++++++++++++ ...remove_document.py => remove_reference.py} | 11 ++-- .../api/document/test_remove_information.py | 50 +++++++++++++++++++ .../api/document/test_remove_reference_.py | 43 ++++++++++++++++ 4 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py rename src/ifcopenshell-python/ifcopenshell/api/document/{remove_document.py => remove_reference.py} (76%) create mode 100644 src/ifcopenshell-python/test/api/document/test_remove_information.py create mode 100644 src/ifcopenshell-python/test/api/document/test_remove_reference_.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py new file mode 100644 index 0000000000..11a0fc6cd4 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py @@ -0,0 +1,39 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + + +import ifcopenshell.api + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = {"information": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + for reference in self.settings["information"].HasDocumentReferences or []: + ifcopenshell.api.run("document.remove_reference", self.file, reference=reference) + for rel in self.settings["information"].IsPointer or []: + for information in rel.RelatedDocuments: + ifcopenshell.api.run("document.remove_information", self.file, information=information) + self.file.remove(rel) + for rel in self.settings["information"].DocumentInfoForObjects or []: + self.file.remove(rel) + self.file.remove(self.settings["information"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py similarity index 76% rename from src/ifcopenshell-python/ifcopenshell/api/document/remove_document.py rename to src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py index b83e9fb560..f4cc669912 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/remove_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py @@ -1,5 +1,5 @@ # IfcOpenShell - IFC toolkit and geometry engine -# Copyright (C) 2021 Dion Moult +# Copyright (C) 2022 Dion Moult # # This file is part of IfcOpenShell. # @@ -20,12 +20,11 @@ class Usecase: def __init__(self, file, **settings): self.file = file - self.settings = {"document": None} + self.settings = {"reference": None} for key, value in settings.items(): self.settings[key] = value def execute(self): - self.file.remove(self.settings["document"]) - for rel in self.file.by_type("IfcRelAssociatesDocument"): - if not rel.RelatingDocument: - self.file.remove(rel) + for rel in self.settings["reference"].DocumentRefForObjects or []: + self.file.remove(rel) + self.file.remove(self.settings["reference"]) diff --git a/src/ifcopenshell-python/test/api/document/test_remove_information.py b/src/ifcopenshell-python/test/api/document/test_remove_information.py new file mode 100644 index 0000000000..4df4857052 --- /dev/null +++ b/src/ifcopenshell-python/test/api/document/test_remove_information.py @@ -0,0 +1,50 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +class TestRemoveInformation(test.bootstrap.IFC4): + def test_remove_information(self): + project = self.file.createIfcProject() + element = ifcopenshell.api.run("document.add_information", self.file, parent=None) + ifcopenshell.api.run("document.remove_information", self.file, information=element) + assert len(self.file.by_type("IfcDocumentInformation")) == 0 + assert len(self.file.by_type("IfcRelAssociatesDocument")) == 0 + + def test_removing_all_references_of_an_information(self): + project = self.file.createIfcProject() + information = ifcopenshell.api.run("document.add_information", self.file, parent=None) + ifcopenshell.api.run("document.add_reference", self.file, information=information) + ifcopenshell.api.run("document.remove_information", self.file, information=information) + assert len(self.file.by_type("IfcDocumentInformation")) == 0 + assert len(self.file.by_type("IfcDocumentReference")) == 0 + assert len(self.file.by_type("IfcRelAssociatesDocument")) == 0 + + def test_removing_all_subdocuments_and_their_references_too(self): + project = self.file.createIfcProject() + information = ifcopenshell.api.run("document.add_information", self.file, parent=None) + information2 = ifcopenshell.api.run("document.add_information", self.file, parent=information) + ifcopenshell.api.run("document.add_reference", self.file, information=information) + ifcopenshell.api.run("document.add_reference", self.file, information=information2) + ifcopenshell.api.run("document.remove_information", self.file, information=information) + assert len(self.file.by_type("IfcDocumentInformation")) == 0 + assert len(self.file.by_type("IfcDocumentReference")) == 0 + assert len(self.file.by_type("IfcRelAssociatesDocument")) == 0 + assert len(self.file.by_type("IfcDocumentInformationRelationship")) == 0 diff --git a/src/ifcopenshell-python/test/api/document/test_remove_reference_.py b/src/ifcopenshell-python/test/api/document/test_remove_reference_.py new file mode 100644 index 0000000000..e5f5892172 --- /dev/null +++ b/src/ifcopenshell-python/test/api/document/test_remove_reference_.py @@ -0,0 +1,43 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +class TestRemoveReference(test.bootstrap.IFC4): + def test_removing_reference(self): + project = self.file.createIfcProject() + information = ifcopenshell.api.run("document.add_information", self.file, parent=None) + reference = ifcopenshell.api.run("document.add_reference", self.file, information=information) + ifcopenshell.api.run("document.remove_reference", self.file, reference=reference) + assert len(self.file.by_type("IfcDocumentReference")) == 0 + assert len(self.file.by_type("IfcDocumentInformation")) == 1 + assert len(self.file.by_type("IfcRelAssociatesDocument")) == 1 + + def test_removing_a_reference_assigned_to_an_object(self): + project = self.file.createIfcProject() + wall = self.file.createIfcWall() + information = ifcopenshell.api.run("document.add_information", self.file, parent=None) + reference = ifcopenshell.api.run("document.add_reference", self.file, information=information) + ifcopenshell.api.run("document.assign_document", self.file, product=wall, document=reference) + assert len(self.file.by_type("IfcRelAssociatesDocument")) == 2 + ifcopenshell.api.run("document.remove_reference", self.file, reference=reference) + assert len(self.file.by_type("IfcDocumentReference")) == 0 + assert len(self.file.by_type("IfcDocumentInformation")) == 1 + assert len(self.file.by_type("IfcRelAssociatesDocument")) == 1