From 5c41baeaf132f3ff9487db6bc804c8d7449033fc Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 7 Jun 2024 17:13:56 +0500 Subject: [PATCH] remove_work_plan - unassign work schedules #4819 --- .../api/sequence/assign_workplan.py | 1 + .../api/sequence/remove_work_plan.py | 7 ++- .../api/sequence/test_remove_work_plan.py | 46 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py index e2ed6b7c00..de73e98104 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py @@ -20,6 +20,7 @@ import ifcopenshell import ifcopenshell.api +# TODO: rename to assign_work_plan for consistency def assign_workplan( file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance, work_plan: ifcopenshell.entity_instance ) -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index b34d6bc6eb..bf027f1581 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.api.aggregate import ifcopenshell.util.element @@ -44,13 +45,17 @@ def remove_work_plan(file: ifcopenshell.file, work_plan: ifcopenshell.entity_ins """ settings = {"work_plan": work_plan} - # TODO: do a deep purge ifcopenshell.api.run( "project.unassign_declaration", file, definitions=[settings["work_plan"]], relating_context=file.by_type("IfcContext")[0], ) + + related_objects = [obj for rel in work_plan.IsDecomposedBy for obj in rel.RelatedObjects] + if related_objects: + ifcopenshell.api.aggregate.unassign_object(file, related_objects) + history = settings["work_plan"].OwnerHistory file.remove(settings["work_plan"]) if history: diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py new file mode 100644 index 0000000000..f9e7fa186b --- /dev/null +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py @@ -0,0 +1,46 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 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 pytest +import test.bootstrap +import ifcopenshell.api +import ifcopenshell.api.sequence + + +def declared_objects(ifc_file: ifcopenshell.file) -> set[ifcopenshell.entity_instance]: + project = ifc_file.by_type("IfcProject")[0] + declared = {obj for rel in project.Declares for obj in rel.RelatedDefinitions} + return declared + + +# NOTE: sequence module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests +class TestRemoveWorkPlan(test.bootstrap.IFC4): + def test_remove_work_plan(self): + self.file.create_entity("IfcProject") + work_plan = ifcopenshell.api.sequence.add_work_plan(self.file) + work_schedule = ifcopenshell.api.sequence.add_work_schedule(self.file) + ifcopenshell.api.sequence.assign_workplan(self.file, work_schedule, work_plan) + ifcopenshell.api.sequence.remove_work_plan(self.file, work_plan=work_plan) + assert len(self.file.by_type("IfcWorkPlan")) == 0 + assert declared_objects(self.file) == set() + assert len(self.file.by_type("IfcRelAggregates")) == 0 + + +class TestRemoveWorkPlanIFC4X3(test.bootstrap.IFC4X3, TestRemoveWorkPlan): + pass