From ff90728a227cb33660f74378f01dd372fcd54668 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 7 Nov 2022 18:47:15 +1100 Subject: [PATCH] New unassign container API function --- .../api/spatial/unassign_container.py | 40 +++++++++++++++++ .../api/spatial/test_unassign_container.py | 43 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py create mode 100644 src/ifcopenshell-python/test/api/spatial/test_unassign_container.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py new file mode 100644 index 0000000000..f703311d35 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py @@ -0,0 +1,40 @@ +# 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 +import ifcopenshell.api + + +class Usecase: + def __init__(self, file, **settings): + self.file = file + self.settings = { + "product": None, + } + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + for rel in self.settings["product"].ContainedInStructure or []: + related_elements = list(rel.RelatedElements) + related_elements.remove(self.settings["product"]) + if related_elements: + rel.RelatedElements = related_elements + ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel) + else: + self.file.remove(rel) diff --git a/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py b/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py new file mode 100644 index 0000000000..df65897ab2 --- /dev/null +++ b/src/ifcopenshell-python/test/api/spatial/test_unassign_container.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 numpy +import pytest +import test.bootstrap +import ifcopenshell.api +import ifcopenshell.util.element +import ifcopenshell.util.placement + + +class TestAssignContainer(test.bootstrap.IFC4): + def test_unassigning_a_container(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBuilding") + subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + ifcopenshell.api.run("spatial.assign_container", self.file, product=subelement, relating_structure=element) + ifcopenshell.api.run("spatial.unassign_container", self.file, product=subelement) + assert not self.file.by_type("IfcRelContainedInSpatialStructure") + + def test_unassigning_a_container_with_other_elements(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBuilding") + subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + subelement2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + ifcopenshell.api.run("spatial.assign_container", self.file, product=subelement, relating_structure=element) + ifcopenshell.api.run("spatial.assign_container", self.file, product=subelement2, relating_structure=element) + ifcopenshell.api.run("spatial.unassign_container", self.file, product=subelement) + rel = self.file.by_type("IfcRelContainedInSpatialStructure")[0] + assert list(rel.RelatedElements) == [subelement2]