From 6cab7d964e9f03b67ad5dde36a06c5870b45e138 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 10 Jun 2024 12:45:04 +0500 Subject: [PATCH] sequence.remove_work_time to remove IfcRecurrencePattern Previously it was leaving them orphaned. --- .../api/sequence/assign_recurrence_pattern.py | 5 ++- .../api/sequence/remove_work_time.py | 9 +++- .../api/sequence/test_remove_work_time.py | 41 +++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py index 0ae92e66aa..278016bde0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py @@ -16,10 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.util.sequence def assign_recurrence_pattern( - file: ifcopenshell.file, parent: ifcopenshell.entity_instance, recurrence_type: str = "WEEKLY" + file: ifcopenshell.file, + parent: ifcopenshell.entity_instance, + recurrence_type: ifcopenshell.util.sequence.RECURRENCE_TYPE = "WEEKLY", ) -> ifcopenshell.entity_instance: """Define a time to recur at a particular interval diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py index f6914fefbd..c3cadfe42a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api.sequence def remove_work_time(file: ifcopenshell.file, work_time: ifcopenshell.entity_instance) -> None: @@ -40,6 +41,10 @@ def remove_work_time(file: ifcopenshell.file, work_time: ifcopenshell.entity_ins # And remove it immediately ifcopenshell.api.run("sequence.remove_work_time", model, work_time=work_time) """ - settings = {"work_time": work_time} - file.remove(settings["work_time"]) + # Currently in API recurrence patterns are created during assignment + # and removed during unassignment, so they are never reused. + if recurrence_pattern := work_time.RecurrencePattern: + ifcopenshell.api.sequence.unassign_recurrence_pattern(file, recurrence_pattern) + + file.remove(work_time) diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py new file mode 100644 index 0000000000..d0318c5c7a --- /dev/null +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_time.py @@ -0,0 +1,41 @@ +# 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 + + +# NOTE: sequence module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests +class TestRemoveWorkTime(test.bootstrap.IFC4): + def test_remove_work_time(self): + self.file.create_entity("IfcProject") + work_calendar = ifcopenshell.api.sequence.add_work_calendar(self.file) + work_time = ifcopenshell.api.sequence.add_work_time(self.file, work_calendar) + ifcopenshell.api.sequence.assign_recurrence_pattern(self.file, work_time) + assert len(self.file.by_type("IfcRecurrencePattern")) == 1 + + ifcopenshell.api.sequence.remove_work_time(self.file, work_time) + assert len(self.file.by_type("IfcWorkTime")) == 0 + assert len(self.file.by_type("IfcRecurrencePattern")) == 0 + + +class TestRemoveWorkTimeIFC4X3(test.bootstrap.IFC4X3, TestRemoveWorkTime): + pass