diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py index a901acec9c..1c922c364f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py @@ -49,7 +49,6 @@ from .edit_work_calendar import edit_work_calendar from .edit_work_plan import edit_work_plan from .edit_work_schedule import edit_work_schedule from .edit_work_time import edit_work_time -from .get_related_products import get_related_products try: from .recalculate_schedule import recalculate_schedule diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py deleted file mode 100644 index df402c31ed..0000000000 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py +++ /dev/null @@ -1,76 +0,0 @@ -# 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 ifcopenshell - - -def get_related_products(file, relating_product=None, related_object=None) -> None: - """Gets the related products being output by a task - - This API function will be removed in the future and migrated to a - utility module. - - :param relating_product: One of the products already output by the task. - :type relating_product: ifcopenshell.entity_instance - :param related_object: The IfcTask that you want to get all the related - products for. - :type related_object: ifcopenshell.entity_instance - :return: A set of IfcProducts output by the IfcTask. - :rtype: set[ifcopenshell.entity_instance] - - Example: - - .. code:: python - - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") - - # Let's say we have a wall somewhere. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # Let's construct that wall! - ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) - - # This will give us a set with that wall in it. - products = ifcopenshell.api.run("sequence.get_related_products", model, related_object=task) - """ - settings = { - "relating_product": relating_product, - "related_object": related_object, - } - - products = set() - related_object = None - if settings["related_object"]: - related_object = settings["related_object"] - elif settings["relating_product"]: - for reference in settings["relating_product"].ReferencedBy: - if reference.is_a("IfcRelAssignsToProduct"): - related_object = reference.RelatedObjects[0] - if related_object: - assignments = settings["related_object"].HasAssignments - for assignment in assignments: - if assignment.is_a("IfcRelAssignsToProduct"): - products.add(assignment.RelatingProduct.id()) - return products diff --git a/src/ifcopenshell-python/ifcopenshell/util/sequence.py b/src/ifcopenshell-python/ifcopenshell/util/sequence.py index db98be456f..04bb4ad555 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/util/sequence.py @@ -478,3 +478,56 @@ def get_sequence_assignment(task: ifcopenshell.entity_instance, sequence="succes return result return [] + + +def get_related_products( + relating_product: Optional[ifcopenshell.entity_instance] = None, + related_object: Optional[ifcopenshell.entity_instance] = None, +) -> set[ifcopenshell.entity_instance]: + """Gets the related products being output by a task + + :param relating_product: One of the products already output by the task. + :type relating_product: ifcopenshell.entity_instance, optional + :param related_object: The IfcTask that you want to get all the related + products for. + :type related_object: ifcopenshell.entity_instance, optional + :return: A set of IfcProducts output by the IfcTask. + :rtype: set[ifcopenshell.entity_instance] + + Example: + + .. code:: python + + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") + + # Let's say we have a wall somewhere. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # Let's construct that wall! + ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) + + # This will give us a set with that wall in it. + products = ifcopenshell.util.sequence.get_related_products(related_object=task) + """ + + products = set() + related_object = None + if related_object: + related_object = related_object + elif relating_product: + for reference in relating_product.ReferencedBy: + if reference.is_a("IfcRelAssignsToProduct"): + related_object = reference.RelatedObjects[0] + if related_object: + assignments = related_object.HasAssignments + for assignment in assignments: + if assignment.is_a("IfcRelAssignsToProduct"): + products.add(assignment.RelatingProduct.id()) + return products