This commit is contained in:
Andrej730
2024-05-10 11:21:53 +05:00
parent e7eb00eaa3
commit c50d1ea2fe
105 changed files with 502 additions and 251 deletions
@@ -19,9 +19,15 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.api.owner.settings import ifcopenshell.api.owner.settings
from typing import Optional
def append_asset(file, library=None, element=None, reuse_identities=None) -> None: def append_asset(
file: ifcopenshell.file,
library: ifcopenshell.file,
element: ifcopenshell.entity_instance,
reuse_identities: Optional[dict[int, ifcopenshell.entity_instance]] = None,
) -> ifcopenshell.entity_instance:
"""Appends an asset from a library into the active project """Appends an asset from a library into the active project
A BIM library asset may be a type product (e.g. wall type), product A BIM library asset may be a type product (e.g. wall type), product
@@ -17,10 +17,11 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell import ifcopenshell
import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
def add_pset(file, product=None, name=None) -> None: def add_pset(file: ifcopenshell.file, product: ifcopenshell.entity_instance, name: str) -> ifcopenshell.entity_instance:
"""Adds a new property set to a product """Adds a new property set to a product
Products, such as physical objects or types in IFC may have properties Products, such as physical objects or types in IFC may have properties
@@ -21,7 +21,7 @@ import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
def add_qto(file, product=None, name=None) -> None: def add_qto(file: ifcopenshell.file, product: ifcopenshell.entity_instance, name: str) -> ifcopenshell.entity_instance:
"""Adds a new quantity set to a product """Adds a new quantity set to a product
Products, such as physical objects or types in IFC may have quantities Products, such as physical objects or types in IFC may have quantities
@@ -18,9 +18,16 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.util.pset import ifcopenshell.util.pset
from typing import Optional, Any
def edit_qto(file, qto=None, name=None, properties=None, pset_template=None) -> None: def edit_qto(
file: ifcopenshell.file,
qto: ifcopenshell.entity_instance,
name: Optional[str] = None,
properties: Optional[dict[str, Any]] = None,
pset_template: Optional[ifcopenshell.entity_instance] = None,
) -> None:
"""Edits a quantity set and its quantities """Edits a quantity set and its quantities
At its simplest usage, this may be used to edit the name of a quantity At its simplest usage, this may be used to edit the name of a quantity
@@ -50,7 +57,7 @@ def edit_qto(file, qto=None, name=None, properties=None, pset_template=None) ->
:param pset_template: If a quantity set template is provided, this will :param pset_template: If a quantity set template is provided, this will
be used to determine data types. If no user-defined template is be used to determine data types. If no user-defined template is
provided, the built-in buildingSMART templates will be loaded. provided, the built-in buildingSMART templates will be loaded.
:type pset_template: ifcopenshell.entity_instance :type pset_template: ifcopenshell.entity_instance, optional
:return: None :return: None
:rtype: None :rtype: None
@@ -20,7 +20,9 @@ import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_pset(file, product=None, pset=None) -> None: def remove_pset(
file: ifcopenshell.file, product: ifcopenshell.entity_instance, pset: ifcopenshell.entity_instance
) -> None:
"""Removes a property set from a product """Removes a property set from a product
All properties that are part of this property set are also removed. All properties that are part of this property set are also removed.
@@ -18,16 +18,17 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.guid import ifcopenshell.guid
from typing import Optional
def add_prop_template( def add_prop_template(
file, file: ifcopenshell.file,
pset_template=None, pset_template: ifcopenshell.entity_instance,
name="NewProperty", name: str = "NewProperty",
description=None, description: Optional[str] = None,
template_type="P_SINGLEVALUE", template_type: str = "P_SINGLEVALUE",
primary_measure_type="IfcLabel", primary_measure_type: str = "IfcLabel",
) -> None: ) -> ifcopenshell.entity_instance:
"""Adds new property templates to a property set template """Adds new property templates to a property set template
Assuming you first have a property set template, this allows you to add Assuming you first have a property set template, this allows you to add
@@ -21,11 +21,11 @@ import ifcopenshell.guid
def add_pset_template( def add_pset_template(
file, file: ifcopenshell.file,
name="New_Pset", name: str = "New_Pset",
template_type="PSET_TYPEDRIVENOVERRIDE", template_type: str = "PSET_TYPEDRIVENOVERRIDE",
applicable_entity="IfcObject,IfcTypeObject", applicable_entity: str = "IfcObject,IfcTypeObject",
) -> None: ) -> ifcopenshell.entity_instance:
"""Adds a new property set template """Adds a new property set template
This creates a new template for property sets. A template defines what This creates a new template for property sets. A template defines what
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_prop_template(file, prop_template=None, attributes=None) -> None: def edit_prop_template(
file: ifcopenshell.file, prop_template: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcSimplePropertyTemplate """Edits the attributes of an IfcSimplePropertyTemplate
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_prop_template(file, prop_template=None, attributes=None) -> None:
:param prop_template: The IfcSimplePropertyTemplate entity you want to edit :param prop_template: The IfcSimplePropertyTemplate entity you want to edit
:type prop_template: ifcopenshell.entity_instance :type prop_template: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -43,7 +47,7 @@ def edit_prop_template(file, prop_template=None, attributes=None) -> None:
ifcopenshell.api.run("pset_template.edit_prop_template", model, ifcopenshell.api.run("pset_template.edit_prop_template", model,
prop_template=prop, attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLengthMeasure"}) prop_template=prop, attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLengthMeasure"})
""" """
settings = {"prop_template": prop_template, "attributes": attributes or {}} settings = {"prop_template": prop_template, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
setattr(settings["prop_template"], name, value) setattr(settings["prop_template"], name, value)
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_pset_template(file, pset_template=None, attributes=None) -> None: def edit_pset_template(
file: ifcopenshell.file, pset_template: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcPropertySetTemplate """Edits the attributes of an IfcPropertySetTemplate
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_pset_template(file, pset_template=None, attributes=None) -> None:
:param pset_template: The IfcPropertySetTemplate entity you want to edit :param pset_template: The IfcPropertySetTemplate entity you want to edit
:type pset_template: ifcopenshell.entity_instance :type pset_template: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -41,7 +45,7 @@ def edit_pset_template(file, pset_template=None, attributes=None) -> None:
ifcopenshell.api.run("pset_template.edit_pset_template", model, ifcopenshell.api.run("pset_template.edit_pset_template", model,
pset_template=template, attributes={"Name": "ABC_RiskFactors"}) pset_template=template, attributes={"Name": "ABC_RiskFactors"})
""" """
settings = {"pset_template": pset_template, "attributes": attributes or {}} settings = {"pset_template": pset_template, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
setattr(settings["pset_template"], name, value) setattr(settings["pset_template"], name, value)
@@ -19,7 +19,7 @@
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_prop_template(file, prop_template=None) -> None: def remove_prop_template(file: ifcopenshell.file, prop_template: ifcopenshell.entity_instance) -> None:
"""Removes a property template """Removes a property template
Note that a property set template should always have at least one Note that a property set template should always have at least one
@@ -19,7 +19,7 @@
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_pset_template(file, pset_template=None) -> None: def remove_pset_template(file: ifcopenshell.file, pset_template: ifcopenshell.entity_instance) -> None:
"""Removes a property set template """Removes a property set template
All property templates within the property set template are also removed All property templates within the property set template are also removed
@@ -17,15 +17,16 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.api import ifcopenshell.api
from typing import Optional
def add_resource( def add_resource(
file, file: ifcopenshell.file,
parent_resource=None, parent_resource: Optional[ifcopenshell.entity_instance] = None,
ifc_class="IfcCrewResource", ifc_class: str = "IfcCrewResource",
name=None, name: Optional[str] = None,
predefined_type="NOTDEFINED", predefined_type: str = "NOTDEFINED",
) -> None: ) -> ifcopenshell.entity_instance:
"""Add a new construction resource """Add a new construction resource
Construction resources may be managed and connected to cost schedules Construction resources may be managed and connected to cost schedules
@@ -48,7 +49,7 @@ def add_resource(
:param parent_resource: If this is a child resource (typically to a crew :param parent_resource: If this is a child resource (typically to a crew
resource), then nominate the parent IfcConstructionResource here. resource), then nominate the parent IfcConstructionResource here.
:type parent_resource: ifcopenshell.entity_instance :type parent_resource: ifcopenshell.entity_instance, optional
:param ifc_class: The class of resource chosen from :param ifc_class: The class of resource chosen from
IfcConstructionEquipmentResource, IfcConstructionMaterialResource, IfcConstructionEquipmentResource, IfcConstructionMaterialResource,
IfcConstructionProductResource, IfcCrewResource, IfcLaborResource, IfcConstructionProductResource, IfcCrewResource, IfcLaborResource,
@@ -19,7 +19,9 @@
import ifcopenshell.util.element import ifcopenshell.util.element
def add_resource_quantity(file, resource=None, ifc_class="IfcQuantityCount") -> None: def add_resource_quantity(
file: ifcopenshell.file, resource: ifcopenshell.entity_instance, ifc_class: str = "IfcQuantityCount"
) -> ifcopenshell.entity_instance:
"""Adds a quantity to a resource """Adds a quantity to a resource
The quantity of a resource represents the "unit quantity" of that The quantity of a resource represents the "unit quantity" of that
@@ -65,6 +67,7 @@ def add_resource_quantity(file, resource=None, ifc_class="IfcQuantityCount") ->
settings = {"resource": resource, "ifc_class": ifc_class} settings = {"resource": resource, "ifc_class": ifc_class}
quantity = file.create_entity(settings["ifc_class"], Name="Unnamed") quantity = file.create_entity(settings["ifc_class"], Name="Unnamed")
# 3 IfcPhysicalSimpleQuantity Value
quantity[3] = 0.0 quantity[3] = 0.0
old_quantity = settings["resource"].BaseQuantity old_quantity = settings["resource"].BaseQuantity
settings["resource"].BaseQuantity = quantity settings["resource"].BaseQuantity = quantity
@@ -19,7 +19,7 @@
import ifcopenshell.util.date import ifcopenshell.util.date
def add_resource_time(file, resource=None) -> None: def add_resource_time(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance:
"""Adds the time that a resource is used for """Adds the time that a resource is used for
For labour and equipment resources, the total duration that the resource For labour and equipment resources, the total duration that the resource
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
def assign_resource(file, relating_resource=None, related_object=None) -> None: def assign_resource(
file: ifcopenshell.file,
relating_resource: ifcopenshell.entity_instance,
related_object: ifcopenshell.entity_instance,
) -> ifcopenshell.entity_instance:
"""Assigns a resource to an object """Assigns a resource to an object
Two types of objects are typically assigned to resources: products and Two types of objects are typically assigned to resources: products and
@@ -89,7 +93,7 @@ def assign_resource(file, relating_resource=None, related_object=None) -> None:
assignment.is_a("IfclRelAssignsToResource") assignment.is_a("IfclRelAssignsToResource")
and assignment.RelatingResource == settings["relating_resource"] and assignment.RelatingResource == settings["relating_resource"]
): ):
return return assignment
resource_of = None resource_of = None
if settings["relating_resource"].ResourceOf: if settings["relating_resource"].ResourceOf:
@@ -18,12 +18,13 @@
import math import math
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.util.constraint
import ifcopenshell.util.date import ifcopenshell.util.date
import ifcopenshell.util.element import ifcopenshell.util.element
import ifcopenshell.util.resource import ifcopenshell.util.resource
def calculate_resource_usage(file, resource=None) -> None: def calculate_resource_usage(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None:
"""Calculates the number of resources required to perform scheduled work on a task.""" """Calculates the number of resources required to perform scheduled work on a task."""
settings = {"resource": resource} settings = {"resource": resource}
@@ -18,12 +18,13 @@
import math import math
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.util.constraint
import ifcopenshell.util.date import ifcopenshell.util.date
import ifcopenshell.util.element import ifcopenshell.util.element
import ifcopenshell.util.resource import ifcopenshell.util.resource
def calculate_resource_work(file, resource=None) -> None: def calculate_resource_work(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None:
"""Calculates the work that a resource is used for """Calculates the work that a resource is used for
This is an unofficial parametric calculation that may be done on a This is an unofficial parametric calculation that may be done on a
@@ -15,9 +15,11 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_resource(file, resource=None, attributes=None) -> None: def edit_resource(file: ifcopenshell.file, resource: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None:
"""Edits the attributes of an IfcResource """Edits the attributes of an IfcResource
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +28,7 @@ def edit_resource(file, resource=None, attributes=None) -> None:
:param resource: The IfcResource entity you want to edit :param resource: The IfcResource entity you want to edit
:type resource: ifcopenshell.entity_instance :type resource: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -40,7 +42,7 @@ def edit_resource(file, resource=None, attributes=None) -> None:
# Change the name of the resource to "Zone A Crew" # Change the name of the resource to "Zone A Crew"
ifcopenshell.api.run("resource.edit_resource", model, resource=resource, attributes={"Name": "Foo"}) ifcopenshell.api.run("resource.edit_resource", model, resource=resource, attributes={"Name": "Foo"})
""" """
settings = {"resource": resource, "attributes": attributes or {}} settings = {"resource": resource, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
setattr(settings["resource"], name, value) setattr(settings["resource"], name, value)
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_resource_quantity(file, physical_quantity=None, attributes=None) -> None: def edit_resource_quantity(
file: ifcopenshell.file, physical_quantity: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IFC quantity """Edits the attributes of an IFC quantity
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_resource_quantity(file, physical_quantity=None, attributes=None) -> Non
:param physical_quantity: The IfC quantity entity you want to edit :param physical_quantity: The IfC quantity entity you want to edit
:type physical_quantity: ifcopenshell.entity_instance :type physical_quantity: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -51,7 +55,7 @@ def edit_resource_quantity(file, physical_quantity=None, attributes=None) -> Non
""" """
settings = { settings = {
"physical_quantity": physical_quantity, "physical_quantity": physical_quantity,
"attributes": attributes or {}, "attributes": attributes,
} }
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
@@ -18,9 +18,12 @@
import datetime import datetime
import ifcopenshell import ifcopenshell
from typing import Any
def edit_resource_time(file, resource_time=None, attributes=None) -> None: def edit_resource_time(
file: ifcopenshell.file, resource_time: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcResourceTime """Edits the attributes of an IfcResourceTime
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -29,7 +32,7 @@ def edit_resource_time(file, resource_time=None, attributes=None) -> None:
:param resource_time: The IfcResourceTime entity you want to edit :param resource_time: The IfcResourceTime entity you want to edit
:type resource_time: ifcopenshell.entity_instance :type resource_time: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -59,7 +62,7 @@ def edit_resource_time(file, resource_time=None, attributes=None) -> None:
""" """
usecase = Usecase() usecase = Usecase()
usecase.file = file usecase.file = file
usecase.settings = {"resource_time": resource_time, "attributes": attributes or {}} usecase.settings = {"resource_time": resource_time, "attributes": attributes}
return usecase.execute() return usecase.execute()
@@ -21,7 +21,7 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_resource(file, resource=None) -> None: def remove_resource(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None:
"""Removes a resource and all relationships """Removes a resource and all relationships
Example: Example:
@@ -19,7 +19,7 @@
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_resource_quantity(file, resource=None) -> None: def remove_resource_quantity(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None:
"""Removes the base quantity of a resource """Removes the base quantity of a resource
Example: Example:
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def unassign_resource(file, relating_resource=None, related_object=None) -> None: def unassign_resource(
file: ifcopenshell.file,
relating_resource: ifcopenshell.entity_instance,
related_object: ifcopenshell.entity_instance,
) -> None:
"""Removes the relationship between a resource and object """Removes the relationship between a resource and object
:param relating_resource: The IfcResource to assign the object to. :param relating_resource: The IfcResource to assign the object to.
@@ -29,8 +33,8 @@ def unassign_resource(file, relating_resource=None, related_object=None) -> None
:param related_object: The IfcProduct or IfcActor to assign to the :param related_object: The IfcProduct or IfcActor to assign to the
object. object.
:type related_object: ifcopenshell.entity_instance :type related_object: ifcopenshell.entity_instance
:return: The newly created IfcRelAssignsToResource :return: None
:rtype: ifcopenshell.entity_instance :rtype: None
Example: Example:
@@ -74,4 +78,3 @@ def unassign_resource(file, relating_resource=None, related_object=None) -> None
related_objects.remove(settings["related_object"]) related_objects.remove(settings["related_object"])
rel.RelatedObjects = related_objects rel.RelatedObjects = related_objects
ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel})
return rel
@@ -17,11 +17,13 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell import ifcopenshell
import ifcopenshell.api
import ifcopenshell.util.system import ifcopenshell.util.system
import ifcopenshell.util.element import ifcopenshell.util.element
import ifcopenshell.util.placement
def copy_class(file, product=None) -> None: def copy_class(file: ifcopenshell.file, product: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance:
"""Copies a product """Copies a product
The following relationships are also duplicated: The following relationships are also duplicated:
@@ -20,14 +20,15 @@ import ifcopenshell
import ifcopenshell.util.type import ifcopenshell.util.type
import ifcopenshell.util.schema import ifcopenshell.util.schema
import ifcopenshell.util.element import ifcopenshell.util.element
from typing import Optional
def reassign_class( def reassign_class(
file, file: ifcopenshell.file,
product=None, product: ifcopenshell.entity_instance,
ifc_class="IfcBuildingElementProxy", ifc_class: str = "IfcBuildingElementProxy",
predefined_type=None, predefined_type: Optional[str] = None,
) -> None: ) -> ifcopenshell.entity_instance:
"""Changes the class of a product """Changes the class of a product
If you ever created a wall then realised it's meant to be something If you ever created a wall then realised it's meant to be something
@@ -19,17 +19,18 @@
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell import ifcopenshell
import ifcopenshell.guid import ifcopenshell.guid
from typing import Optional
def add_task( def add_task(
file, file: ifcopenshell.file,
work_schedule=None, work_schedule: Optional[ifcopenshell.entity_instance] = None,
parent_task=None, parent_task: Optional[ifcopenshell.entity_instance] = None,
name=None, name: Optional[str] = None,
description=None, description: Optional[str] = None,
identification=None, identification: Optional[str] = None,
predefined_type="NOTDEFINED", predefined_type: str = "NOTDEFINED",
) -> None: ) -> ifcopenshell.entity_instance:
"""Adds a new task """Adds a new task
Tasks are typically used for two purposes: construction scheduling and Tasks are typically used for two purposes: construction scheduling and
@@ -66,11 +67,11 @@ def add_task(
:param work_schedule: The work schedule to group the task in, if the :param work_schedule: The work schedule to group the task in, if the
task is to be a top-level or root task. This is mutually exclusive task is to be a top-level or root task. This is mutually exclusive
with the parent_task parameter. with the parent_task parameter.
:type work_schedule: ifcopenshell.entity_instance :type work_schedule: ifcopenshell.entity_instance, optional
:param parent_task: The parent task, if the task is to be a subtask or :param parent_task: The parent task, if the task is to be a subtask or
child task. This is mutually exclusive with the work_schedule child task. This is mutually exclusive with the work_schedule
parameter. parameter.
:type parent_task: ifcopenshell.entity_instance :type parent_task: ifcopenshell.entity_instance, optioanl
:param name: The name of the task. :param name: The name of the task.
:type name: str,optional :type name: str,optional
:param description: The description of the task. :param description: The description of the task.
@@ -15,9 +15,12 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def add_task_time(file, task=None, is_recurring=False) -> None: def add_task_time(
file: ifcopenshell.file, task: ifcopenshell.entity_instance, is_recurring: bool = False
) -> ifcopenshell.entity_instance:
"""Adds a task time to a task """Adds a task time to a task
Some tasks, such as activities within a work breakdown structure or Some tasks, such as activities within a work breakdown structure or
@@ -19,11 +19,17 @@
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.util.date import ifcopenshell.util.date
import ifcopenshell.util.sequence import ifcopenshell.util.sequence
from datetime import datetime from datetime import datetime, time
from datetime import timedelta from datetime import timedelta
from typing import Optional, Union
def add_time_period(file, recurrence_pattern=None, start_time=None, end_time=None) -> None: def add_time_period(
file: ifcopenshell.file,
recurrence_pattern: ifcopenshell.entity_instance,
start_time: Optional[Union[str, time]] = None,
end_time: Optional[Union[str, time]] = None,
) -> ifcopenshell.entity_instance:
"""Adds a time period to a recurrence pattern """Adds a time period to a recurrence pattern
A recurring time may be an all-day event, or only during certain time A recurring time may be an all-day event, or only during certain time
@@ -19,7 +19,9 @@
import ifcopenshell.api import ifcopenshell.api
def add_work_calendar(file, name="Unnamed", predefined_type="NOTDEFINED") -> None: def add_work_calendar(
file: ifcopenshell.file, name: str = "Unnamed", predefined_type: str = "NOTDEFINED"
) -> ifcopenshell.entity_instance:
"""Add a work calendar """Add a work calendar
A work calendar defines when work is allowed to occur and when the A work calendar defines when work is allowed to occur and when the
@@ -17,11 +17,18 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.api.owner.settings
import ifcopenshell.util.date import ifcopenshell.util.date
from datetime import datetime from datetime import datetime, time
from typing import Optional, Union
def add_work_plan(file, name=None, predefined_type="NOTDEFINED", start_time=None) -> None: def add_work_plan(
file: ifcopenshell.file,
name: Optional[str] = None,
predefined_type: str = "NOTDEFINED",
start_time: Optional[Union[str, time]] = None,
) -> ifcopenshell.entity_instance:
"""Add a new work plan """Add a new work plan
A work plan is a group of work schedules. Since work schedules may have A work plan is a group of work schedules. Since work schedules may have
@@ -17,18 +17,21 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.api.owner.settings
import ifcopenshell.util.date import ifcopenshell.util.date
from datetime import time
from datetime import datetime from datetime import datetime
from typing import Union, Optional
def add_work_schedule( def add_work_schedule(
file, file: ifcopenshell.file,
name="Unnamed", name: str = "Unnamed",
predefined_type="NOTDEFINED", predefined_type: str = "NOTDEFINED",
object_type=None, object_type=None,
start_time=None, start_time: Optional[Union[str, time]] = None,
work_plan=None, work_plan: Optional[ifcopenshell.entity_instance] = None,
) -> None: ) -> ifcopenshell.entity_instance:
"""Add a new work schedule """Add a new work schedule
A work schedule is a group of tasks, where the tasks are typically A work schedule is a group of tasks, where the tasks are typically
@@ -15,9 +15,12 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def add_work_time(file, work_calendar=None, time_type="WorkingTimes") -> None: def add_work_time(
file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance, time_type: str = "WorkingTimes"
) -> ifcopenshell.entity_instance:
"""Add either working times or holiday times to a calendar """Add either working times or holiday times to a calendar
A calendar defines when work occurs by defining working times and A calendar defines when work occurs by defining working times and
@@ -19,7 +19,9 @@
import ifcopenshell.util.date import ifcopenshell.util.date
def assign_lag_time(file, rel_sequence=None, lag_value=None, duration_type="WORKTIME") -> None: def assign_lag_time(
file: ifcopenshell.file, rel_sequence: ifcopenshell.entity_instance, lag_value: str, duration_type: str = "WORKTIME"
) -> ifcopenshell.entity_instance:
"""Assign a lag time to a sequence relationship between tasks """Assign a lag time to a sequence relationship between tasks
A task sequence (e.g. finish to start) may optionally have a lag time A task sequence (e.g. finish to start) may optionally have a lag time
@@ -94,3 +96,4 @@ def assign_lag_time(file, rel_sequence=None, lag_value=None, duration_type="WORK
if settings["rel_sequence"].TimeLag and len(file.get_inverse(settings["rel_sequence"].TimeLag)) == 1: if settings["rel_sequence"].TimeLag and len(file.get_inverse(settings["rel_sequence"].TimeLag)) == 1:
file.remove(settings["rel_sequence"].TimeLag) file.remove(settings["rel_sequence"].TimeLag)
settings["rel_sequence"].TimeLag = lag_time settings["rel_sequence"].TimeLag = lag_time
return lag_time
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
def assign_process(file, relating_process=None, related_object=None) -> None: def assign_process(
file: ifcopenshell.file,
relating_process: ifcopenshell.entity_instance,
related_object: ifcopenshell.entity_instance,
) -> ifcopenshell.entity_instance:
"""Assigns an object to be related to a process, typically a construction task """Assigns an object to be related to a process, typically a construction task
Processes work using the ICOM (Input, Controls, Outputs, Mechanisms) Processes work using the ICOM (Input, Controls, Outputs, Mechanisms)
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
def assign_product(file, relating_product=None, related_object=None) -> None: def assign_product(
file: ifcopenshell.entity_instance,
relating_product: ifcopenshell.entity_instance,
related_object: ifcopenshell.entity_instance,
) -> ifcopenshell.entity_instance:
"""Assigns a product to be produced as a result of a process """Assigns a product to be produced as a result of a process
A construction task may result in products (e.g. a wall) being A construction task may result in products (e.g. a wall) being
@@ -71,7 +75,7 @@ def assign_product(file, relating_product=None, related_object=None) -> None:
if settings["related_object"].HasAssignments: if settings["related_object"].HasAssignments:
for assignment in settings["related_object"].HasAssignments: for assignment in settings["related_object"].HasAssignments:
if assignment.is_a("IfcRelAssignsToProduct") and assignment.RelatingProduct == settings["relating_product"]: if assignment.is_a("IfcRelAssignsToProduct") and assignment.RelatingProduct == settings["relating_product"]:
return return assignment
referenced_by = None referenced_by = None
if settings["relating_product"].ReferencedBy: if settings["relating_product"].ReferencedBy:
@@ -15,9 +15,12 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def assign_recurrence_pattern(file, parent=None, recurrence_type="WEEKLY") -> None: def assign_recurrence_pattern(
file: ifcopenshell.file, parent: ifcopenshell.entity_instance, recurrence_type: str = "WEEKLY"
) -> ifcopenshell.entity_instance:
"""Define a time to recur at a particular interval """Define a time to recur at a particular interval
There are two scenarios where you might want to define a recurring time There are two scenarios where you might want to define a recurring time
@@ -22,11 +22,11 @@ import ifcopenshell.guid
def assign_sequence( def assign_sequence(
file, file: ifcopenshell.file,
relating_process=None, relating_process: ifcopenshell.entity_instance,
related_process=None, related_process: ifcopenshell.entity_instance,
sequence_type="FINISH_START", sequence_type: str = "FINISH_START",
) -> None: ) -> ifcopenshell.entity_instance:
"""Assign a sequential relationship between tasks """Assign a sequential relationship between tasks
Tasks in construction sequencing typically have sequence relationships Tasks in construction sequencing typically have sequence relationships
@@ -20,7 +20,9 @@ import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
def assign_workplan(file, work_schedule=None, work_plan=None) -> None: def assign_workplan(
file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance, work_plan: ifcopenshell.entity_instance
) -> ifcopenshell.entity_instance:
"""Assigns a work schedule to a work plan """Assigns a work schedule to a work plan
Typically, work schedules would be assigned to a work plan at creation. Typically, work schedules would be assigned to a work plan at creation.
@@ -22,7 +22,7 @@ import ifcopenshell.util.date
import ifcopenshell.util.element import ifcopenshell.util.element
def calculate_task_duration(file, task=None) -> None: def calculate_task_duration(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> None:
"""Calculates the task duration based on resource usage """Calculates the task duration based on resource usage
If a task has labour or equipment resources assigned to it, its duration If a task has labour or equipment resources assigned to it, its duration
@@ -21,7 +21,7 @@ import ifcopenshell.util.date
import ifcopenshell.util.sequence import ifcopenshell.util.sequence
def cascade_schedule(file, task=None) -> None: def cascade_schedule(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> None:
"""Cascades start and end dates of tasks based on durations """Cascades start and end dates of tasks based on durations
Given a start task with a start date and duration, the end date, and the Given a start task with a start date and duration, the end date, and the
@@ -17,12 +17,17 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell import ifcopenshell
import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
import ifcopenshell.util.system
import ifcopenshell.util.element import ifcopenshell.util.element
import ifcopenshell.util.sequence
import ifcopenshell.util.system
from typing import Optional
def create_baseline(file, work_schedule=None, name=None) -> None: def create_baseline(
file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance, name: Optional[str] = None
) -> None:
"""Creates a baseline for your Work Schedule """Creates a baseline for your Work Schedule
Using a IfcWorkSchdule having PredefinedType=PLANNED, Using a IfcWorkSchdule having PredefinedType=PLANNED,
@@ -38,6 +43,8 @@ def create_baseline(file, work_schedule=None, name=None) -> None:
:param work_schedule: The planned work_schedule to baseline :param work_schedule: The planned work_schedule to baseline
:type work_schedule: ifcopenshell.entity_instance :type work_schedule: ifcopenshell.entity_instance
:param name: baseline work schedule name
:type name: str, optional
:return: The baseline work_schedule :return: The baseline work_schedule
:rtype: ifcopenshell.entity_instance :rtype: ifcopenshell.entity_instance
@@ -23,7 +23,7 @@ import ifcopenshell.util.element
import ifcopenshell.util.sequence import ifcopenshell.util.sequence
def duplicate_task(file, task=None) -> None: def duplicate_task(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance:
"""Duplicates a task in the project """Duplicates a task in the project
The following relationships are also duplicated: The following relationships are also duplicated:
@@ -18,9 +18,10 @@
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.util.date import ifcopenshell.util.date
from typing import Any
def edit_lag_time(file, lag_time=None, attributes=None) -> None: def edit_lag_time(file: ifcopenshell.file, lag_time: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None:
"""Edits the attributes of an IfcLagTime """Edits the attributes of an IfcLagTime
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -29,7 +30,7 @@ def edit_lag_time(file, lag_time=None, attributes=None) -> None:
:param lag_time: The IfcLagTime entity you want to edit :param lag_time: The IfcLagTime entity you want to edit
:type lag_time: ifcopenshell.entity_instance :type lag_time: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -74,7 +75,7 @@ def edit_lag_time(file, lag_time=None, attributes=None) -> None:
# Or, let's make it 2 days instead. # Or, let's make it 2 days instead.
ifcopenshell.api.run("sequence.edit_lag_time", model, lag_time=lag, attributes={"LagValue": "P2D"}) ifcopenshell.api.run("sequence.edit_lag_time", model, lag_time=lag, attributes={"LagValue": "P2D"})
""" """
settings = {"lag_time": lag_time, "attributes": attributes or {}} settings = {"lag_time": lag_time, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
if name == "LagValue" and value is not None: if name == "LagValue" and value is not None:
@@ -18,9 +18,12 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.util.sequence import ifcopenshell.util.sequence
from typing import Any
def edit_recurrence_pattern(file, recurrence_pattern=None, attributes=None) -> None: def edit_recurrence_pattern(
file: ifcopenshell.file, recurrence_pattern: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcRecurrencePattern """Edits the attributes of an IfcRecurrencePattern
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -29,7 +32,7 @@ def edit_recurrence_pattern(file, recurrence_pattern=None, attributes=None) -> N
:param recurrence_pattern: The IfcRecurrencePattern entity you want to edit :param recurrence_pattern: The IfcRecurrencePattern entity you want to edit
:type recurrence_pattern: ifcopenshell.entity_instance :type recurrence_pattern: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -54,7 +57,7 @@ def edit_recurrence_pattern(file, recurrence_pattern=None, attributes=None) -> N
""" """
settings = { settings = {
"recurrence_pattern": recurrence_pattern, "recurrence_pattern": recurrence_pattern,
"attributes": attributes or {}, "attributes": attributes,
} }
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
@@ -18,9 +18,12 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
from typing import Any
def edit_sequence(file, rel_sequence=None, attributes=None) -> None: def edit_sequence(
file: ifcopenshell.file, rel_sequence: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcRelSequence """Edits the attributes of an IfcRelSequence
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -29,7 +32,7 @@ def edit_sequence(file, rel_sequence=None, attributes=None) -> None:
:param rel_sequence: The IfcRelSequence entity you want to edit :param rel_sequence: The IfcRelSequence entity you want to edit
:type rel_sequence: ifcopenshell.entity_instance :type rel_sequence: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -59,7 +62,7 @@ def edit_sequence(file, rel_sequence=None, attributes=None) -> None:
ifcopenshell.api.run("sequence.edit_sequence", model, ifcopenshell.api.run("sequence.edit_sequence", model,
rel_sequence=sequence, attributes={"SequenceType": "START_START"}) rel_sequence=sequence, attributes={"SequenceType": "START_START"})
""" """
settings = {"rel_sequence": rel_sequence, "attributes": attributes or {}} settings = {"rel_sequence": rel_sequence, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
setattr(settings["rel_sequence"], name, value) setattr(settings["rel_sequence"], name, value)
@@ -15,9 +15,11 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_task(file, task=None, attributes=None) -> None: def edit_task(file: ifcopenshell.file, task: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None:
"""Edits the attributes of an IfcTask """Edits the attributes of an IfcTask
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +28,7 @@ def edit_task(file, task=None, attributes=None) -> None:
:param task: The IfcTask entity you want to edit :param task: The IfcTask entity you want to edit
:type task: ifcopenshell.entity_instance :type task: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -20,13 +20,13 @@ import datetime
import ifcopenshell.util.constraint import ifcopenshell.util.constraint
import ifcopenshell.util.date import ifcopenshell.util.date
import ifcopenshell.util.sequence import ifcopenshell.util.sequence
from typing import Any, Optional from typing import Any
def edit_task_time( def edit_task_time(
file: ifcopenshell.file, file: ifcopenshell.file,
task_time: ifcopenshell.entity_instance, task_time: ifcopenshell.entity_instance,
attributes: Optional[dict[str, Any]] = None, attributes: dict[str, Any],
) -> None: ) -> None:
"""Edits the attributes of an IfcTaskTime """Edits the attributes of an IfcTaskTime
@@ -36,7 +36,7 @@ def edit_task_time(
:param task_time: The IfcTaskTime entity you want to edit :param task_time: The IfcTaskTime entity you want to edit
:type task_time: ifcopenshell.entity_instance :type task_time: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -59,7 +59,7 @@ def edit_task_time(
""" """
usecase = Usecase() usecase = Usecase()
usecase.file = file usecase.file = file
usecase.settings = {"task_time": task_time, "attributes": attributes or {}} usecase.settings = {"task_time": task_time, "attributes": attributes}
return usecase.execute() return usecase.execute()
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_work_calendar(file, work_calendar=None, attributes=None) -> None: def edit_work_calendar(
file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcWorkCalendar """Edits the attributes of an IfcWorkCalendar
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_work_calendar(file, work_calendar=None, attributes=None) -> None:
:param work_calendar: The IfcWorkCalendar entity you want to edit :param work_calendar: The IfcWorkCalendar entity you want to edit
:type work_calendar: ifcopenshell.entity_instance :type work_calendar: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -41,7 +45,7 @@ def edit_work_calendar(file, work_calendar=None, attributes=None) -> None:
ifcopenshell.api.run("sequence.edit_work_calendar", model, ifcopenshell.api.run("sequence.edit_work_calendar", model,
work_calendar=calendar, attributes={"Description": "Monday to Friday 8 hour days"}) work_calendar=calendar, attributes={"Description": "Monday to Friday 8 hour days"})
""" """
settings = {"work_calendar": work_calendar, "attributes": attributes or {}} settings = {"work_calendar": work_calendar, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
setattr(settings["work_calendar"], name, value) setattr(settings["work_calendar"], name, value)
@@ -17,9 +17,12 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.util.date import ifcopenshell.util.date
from typing import Any
def edit_work_plan(file, work_plan=None, attributes=None) -> None: def edit_work_plan(
file: ifcopenshell.file, work_plan: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcWorkPlan """Edits the attributes of an IfcWorkPlan
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -28,7 +31,7 @@ def edit_work_plan(file, work_plan=None, attributes=None) -> None:
:param work_plan: The IfcWorkPlan entity you want to edit :param work_plan: The IfcWorkPlan entity you want to edit
:type work_plan: ifcopenshell.entity_instance :type work_plan: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -43,7 +46,7 @@ def edit_work_plan(file, work_plan=None, attributes=None) -> None:
ifcopenshell.api.run("sequence.edit_work_plan", model, ifcopenshell.api.run("sequence.edit_work_plan", model,
work_plan=work_plan, attributes={"Description": "Construction of phase 1"}) work_plan=work_plan, attributes={"Description": "Construction of phase 1"})
""" """
settings = {"work_plan": work_plan, "attributes": attributes or {}} settings = {"work_plan": work_plan, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
if value: if value:
@@ -17,9 +17,12 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.util.date import ifcopenshell.util.date
from typing import Any
def edit_work_schedule(file, work_schedule=None, attributes=None) -> None: def edit_work_schedule(
file: ifcopenshell.entity_instance, work_schedule: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcWorkSchedule """Edits the attributes of an IfcWorkSchedule
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -28,7 +31,7 @@ def edit_work_schedule(file, work_schedule=None, attributes=None) -> None:
:param work_schedule: The IfcWorkSchedule entity you want to edit :param work_schedule: The IfcWorkSchedule entity you want to edit
:type work_schedule: ifcopenshell.entity_instance :type work_schedule: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -47,7 +50,7 @@ def edit_work_schedule(file, work_schedule=None, attributes=None) -> None:
ifcopenshell.api.run("sequence.edit_work_schedule", model, ifcopenshell.api.run("sequence.edit_work_schedule", model,
work_schedule=work_schedule, attributes={"Description": "3 crane design option"}) work_schedule=work_schedule, attributes={"Description": "3 crane design option"})
""" """
settings = {"work_schedule": work_schedule, "attributes": attributes or {}} settings = {"work_schedule": work_schedule, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
if value: if value:
@@ -17,13 +17,13 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.util.date import ifcopenshell.util.date
from typing import Any, Optional from typing import Any
def edit_work_time( def edit_work_time(
file: ifcopenshell.file, file: ifcopenshell.file,
work_time: ifcopenshell.entity_instance, work_time: ifcopenshell.entity_instance,
attributes: Optional[dict[str, Any]] = None, attributes: dict[str, Any],
) -> None: ) -> None:
"""Edits the attributes of an IfcWorkTime """Edits the attributes of an IfcWorkTime
@@ -33,7 +33,7 @@ def edit_work_time(
:param work_time: The IfcWorkTime entity you want to edit :param work_time: The IfcWorkTime entity you want to edit
:type work_time: ifcopenshell.entity_instance :type work_time: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -54,7 +54,7 @@ def edit_work_time(
ifcopenshell.api.run("sequence.edit_work_time", model, ifcopenshell.api.run("sequence.edit_work_time", model,
work_time=work_time, attributes={"StartDate": "2000-01-01", "FinishDate": "2000-01-02"}) work_time=work_time, attributes={"StartDate": "2000-01-01", "FinishDate": "2000-01-02"})
""" """
settings = {"work_time": work_time, "attributes": attributes or {}} settings = {"work_time": work_time, "attributes": attributes}
for name, value in settings["attributes"].items(): for name, value in settings["attributes"].items():
if name in ("Start", "StartDate"): if name in ("Start", "StartDate"):
@@ -23,7 +23,7 @@ import ifcopenshell.util.date
import ifcopenshell.util.sequence import ifcopenshell.util.sequence
def recalculate_schedule(file, work_schedule=None) -> None: def recalculate_schedule(file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance) -> None:
"""Calculate the critical path and floats for a work schedule """Calculate the critical path and floats for a work schedule
This implements critical path analysis, using the forward pass and This implements critical path analysis, using the forward pass and
@@ -21,7 +21,7 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_task(file, task=None) -> None: def remove_task(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> None:
"""Removes a task """Removes a task
All subtasks are also removed recursively. Any relationships such as All subtasks are also removed recursively. Any relationships such as
@@ -19,7 +19,7 @@
import ifcopenshell.api import ifcopenshell.api
def remove_time_period(file, time_period=None) -> None: def remove_time_period(file: ifcopenshell.file, time_period: ifcopenshell.entity_instance) -> None:
"""Removes a time period """Removes a time period
:param time_period: The IfcTimePeriod to remove. :param time_period: The IfcTimePeriod to remove.
@@ -17,10 +17,11 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell import ifcopenshell
import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_work_calendar(file, work_calendar=None) -> None: def remove_work_calendar(file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance) -> None:
"""Removes a work calendar """Removes a work calendar
All relationships are also removed, such as if a task is set to use that All relationships are also removed, such as if a task is set to use that
@@ -20,7 +20,7 @@ import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_work_plan(file, work_plan=None) -> None: def remove_work_plan(file: ifcopenshell.entity_instance, work_plan: ifcopenshell.entity_instance) -> None:
"""Removes a work plan """Removes a work plan
Note that schedules that are grouped under the work plan are not Note that schedules that are grouped under the work plan are not
@@ -21,7 +21,7 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_work_schedule(file, work_schedule=None) -> None: def remove_work_schedule(file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance) -> None:
"""Removes a work schedule """Removes a work schedule
All tasks in the work schedule are also removed recursively. All tasks in the work schedule are also removed recursively.
@@ -15,9 +15,10 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def remove_work_time(file, work_time=None) -> None: def remove_work_time(file: ifcopenshell.file, work_time: ifcopenshell.entity_instance) -> None:
"""Removes a work time """Removes a work time
:param work_time: The IfcWorkTime to remove. :param work_time: The IfcWorkTime to remove.
@@ -19,7 +19,7 @@
import ifcopenshell.api import ifcopenshell.api
def unassign_lag_time(file, rel_sequence=None) -> None: def unassign_lag_time(file: ifcopenshell.file, rel_sequence: ifcopenshell.entity_instance) -> None:
"""Removes any lag time in a sequence """Removes any lag time in a sequence
The schedule is cascaded afterwards. The schedule is cascaded afterwards.
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def unassign_process(file, relating_process=None, related_object=None) -> None: def unassign_process(
file: ifcopenshell.file,
relating_process: ifcopenshell.entity_instance,
related_object: ifcopenshell.entity_instance,
) -> None:
"""Unassigns a process and object relationship """Unassigns a process and object relationship
See ifcopenshell.api.sequence.assign_process for details. See ifcopenshell.api.sequence.assign_process for details.
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def unassign_product(file, relating_product=None, related_object=None) -> None: def unassign_product(
file: ifcopenshell.file,
relating_product: ifcopenshell.entity_instance,
related_object: ifcopenshell.entity_instance,
) -> None:
"""Unassigns a product and object relationship """Unassigns a product and object relationship
See ifcopenshell.api.sequence.assign_product for details. See ifcopenshell.api.sequence.assign_product for details.
@@ -15,9 +15,10 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def unassign_recurrence_pattern(file, recurrence_pattern=None) -> None: def unassign_recurrence_pattern(file: ifcopenshell.file, recurrence_pattern: ifcopenshell.entity_instance) -> None:
"""Unassigns a recurrence pattern """Unassigns a recurrence pattern
Note that a recurring task time must have a recurrence pattern, so if Note that a recurring task time must have a recurrence pattern, so if
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def unassign_sequence(file, relating_process=None, related_process=None) -> None: def unassign_sequence(
file: ifcopenshell.file,
relating_process: ifcopenshell.entity_instance,
related_process: ifcopenshell.entity_instance,
) -> None:
"""Removes a sequence relationship between tasks """Removes a sequence relationship between tasks
:param relating_process: The previous / predecessor task. :param relating_process: The previous / predecessor task.
@@ -17,15 +17,16 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.api import ifcopenshell.api
from typing import Literal
def add_structural_activity( def add_structural_activity(
file, file: ifcopenshell.file,
ifc_class="IfcStructuralPlanarAction", applied_load: ifcopenshell.entity_instance,
predefined_type="CONST", structural_member: ifcopenshell.entity_instance,
global_or_local="GLOBAL_COORDS", ifc_class: str = "IfcStructuralPlanarAction",
applied_load=None, predefined_type: str = "CONST",
structural_member=None, global_or_local: Literal["GLOBAL_COORDS", "LOCAL_COORDS"] = "GLOBAL_COORDS",
) -> None: ) -> None:
"""Adds a new structural activity """Adds a new structural activity
@@ -20,7 +20,7 @@ import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
def add_structural_analysis_model(file) -> None: def add_structural_analysis_model(file: ifcopenshell.file) -> ifcopenshell.entity_instance:
"""Add a new structural analysis model """Add a new structural analysis model
A structural analysis model is a group of all the loads, reactions, A structural analysis model is a group of all the loads, reactions,
@@ -39,8 +39,6 @@ def add_structural_analysis_model(file) -> None:
# Create a fresh blank structural analysis # Create a fresh blank structural analysis
analysis = ifcopenshell.api.run("structural.add_structural_analysis_model", model) analysis = ifcopenshell.api.run("structural.add_structural_analysis_model", model)
""" """
settings = {}
return ifcopenshell.api.run( return ifcopenshell.api.run(
"root.create_entity", file, ifc_class="IfcStructuralAnalysisModel", predefined_type="LOADING_3D" "root.create_entity", file, ifc_class="IfcStructuralAnalysisModel", predefined_type="LOADING_3D"
) )
@@ -15,9 +15,16 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Optional
def add_structural_boundary_condition(file, name=None, connection=None, ifc_class="IfcBoundaryNodeCondition") -> None: def add_structural_boundary_condition(
file: ifcopenshell.file,
name: Optional[str] = None,
connection: Optional[ifcopenshell.entity_instance] = None,
ifc_class: str = "IfcBoundaryNodeCondition",
) -> ifcopenshell.entity_instance:
"""Adds a new structural boundary condition to a structural connection """Adds a new structural boundary condition to a structural connection
The type of boundary condition depends on the connection. Point The type of boundary condition depends on the connection. Point
@@ -60,7 +67,9 @@ def add_structural_boundary_condition(file, name=None, connection=None, ifc_clas
elif related_connection.is_a("IfcStructuralSurfaceConnection"): elif related_connection.is_a("IfcStructuralSurfaceConnection"):
boundary_class = "IfcBoundaryFaceCondition" boundary_class = "IfcBoundaryFaceCondition"
settings["connection"].AppliedCondition = file.create_entity(boundary_class, Name=settings["name"]) condition = file.create_entity(boundary_class, Name=settings["name"])
settings["connection"].AppliedCondition = condition
return condition
else: else:
# add an orphan boundary condition # add an orphan boundary condition
return file.create_entity(settings["ifc_class"], Name=settings["name"]) return file.create_entity(settings["ifc_class"], Name=settings["name"])
@@ -17,9 +17,12 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.api import ifcopenshell.api
from typing import Optional
def add_structural_load(file, name=None, ifc_class="IfcStructuralLoadLinearForce") -> None: def add_structural_load(
file: ifcopenshell.file, name: Optional[str] = None, ifc_class: str = "IfcStructuralLoadLinearForce"
) -> ifcopenshell.entity_instance:
"""Adds a new structural load """Adds a new structural load
Structural loads may be actions or reactions. A simple load might be a Structural loads may be actions or reactions. A simple load might be a
@@ -42,9 +45,4 @@ def add_structural_load(file, name=None, ifc_class="IfcStructuralLoadLinearForce
# Create a simple linear load # Create a simple linear load
ifcopenshell.api.run("structural.add_structural_load", model) ifcopenshell.api.run("structural.add_structural_load", model)
""" """
settings = { return file.create_entity(ifc_class, Name=name)
"name": name,
"ifc_class": ifc_class,
}
return file.create_entity(settings["ifc_class"], Name=settings["name"])
@@ -19,7 +19,9 @@
import ifcopenshell.api import ifcopenshell.api
def add_structural_load_case(file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED") -> None: def add_structural_load_case(
file: ifcopenshell.file, name: str = "Unnamed", action_type: str = "NOTDEFINED", action_source: str = "NOTDEFINED"
) -> ifcopenshell.entity_instance:
"""Adds a new load case, which is a collection of related load groups """Adds a new load case, which is a collection of related load groups
:param name: The name of the load case :param name: The name of the load case
@@ -34,19 +36,14 @@ def add_structural_load_case(file, name="Unnamed", action_type="NOTDEFINED", act
:return: The new IfcStructuralLoadCase :return: The new IfcStructuralLoadCase
:rtype: ifcopenshell.entity_instance :rtype: ifcopenshell.entity_instance
""" """
settings = {
"name": name,
"action_type": action_type,
"action_source": action_source,
}
load_case = ifcopenshell.api.run( load_case = ifcopenshell.api.run(
"root.create_entity", "root.create_entity",
file, file,
ifc_class="IfcStructuralLoadCase", ifc_class="IfcStructuralLoadCase",
predefined_type="LOAD_CASE", predefined_type="LOAD_CASE",
name=settings["name"], name=name
) )
load_case.ActionType = settings["action_type"] load_case.ActionType = action_type
load_case.ActionSource = settings["action_source"] load_case.ActionSource = action_source
return load_case return load_case
@@ -19,7 +19,9 @@
import ifcopenshell.api import ifcopenshell.api
def add_structural_load_group(file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED") -> None: def add_structural_load_group(
file: ifcopenshell.file, name: str = "Unnamed", action_type: str = "NOTDEFINED", action_source: str = "NOTDEFINED"
) -> ifcopenshell.entity_instance:
"""Adds a new load group, which is a collection of related loads """Adds a new load group, which is a collection of related loads
:param name: The name of the load group :param name: The name of the load group
@@ -34,19 +36,14 @@ def add_structural_load_group(file, name="Unnamed", action_type="NOTDEFINED", ac
:return: The new IfcStructuralLoadCase :return: The new IfcStructuralLoadCase
:rtype: ifcopenshell.entity_instance :rtype: ifcopenshell.entity_instance
""" """
settings = {
"name": name,
"action_type": action_type,
"action_source": action_source,
}
load_group = ifcopenshell.api.run( load_group = ifcopenshell.api.run(
"root.create_entity", "root.create_entity",
file, file,
ifc_class="IfcStructuralLoadGroup", ifc_class="IfcStructuralLoadGroup",
predefined_type="LOAD_GROUP", predefined_type="LOAD_GROUP",
name=settings["name"], name=name,
) )
load_group.ActionType = settings["action_type"] load_group.ActionType = action_type
load_group.ActionSource = settings["action_source"] load_group.ActionSource = action_source
return load_group return load_group
@@ -20,7 +20,11 @@ import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
def add_structural_member_connection(file, relating_structural_member=None, related_structural_connection=None) -> None: def add_structural_member_connection(
file: ifcopenshell.file,
relating_structural_member: ifcopenshell.entity_instance,
related_structural_connection: ifcopenshell.entity_instance,
) -> ifcopenshell.entity_instance:
"""Relates a structural member and a structural connection """Relates a structural member and a structural connection
:param relating_structural_member: The IfcStructuralMember to have a :param relating_structural_member: The IfcStructuralMember to have a
@@ -39,7 +43,7 @@ def add_structural_member_connection(file, relating_structural_member=None, rela
for connection in settings["related_structural_connection"].ConnectsStructuralMembers or []: for connection in settings["related_structural_connection"].ConnectsStructuralMembers or []:
if connection.RelatingStructuralMember == settings["relating_structural_member"]: if connection.RelatingStructuralMember == settings["relating_structural_member"]:
return return connection
rel = ifcopenshell.api.run("root.create_entity", file, ifc_class="IfcRelConnectsStructuralMember") rel = ifcopenshell.api.run("root.create_entity", file, ifc_class="IfcRelConnectsStructuralMember")
rel.RelatingStructuralMember = settings["relating_structural_member"] rel.RelatingStructuralMember = settings["relating_structural_member"]
rel.RelatedStructuralConnection = settings["related_structural_connection"] rel.RelatedStructuralConnection = settings["related_structural_connection"]
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
def assign_structural_analysis_model(file, product=None, structural_analysis_model=None) -> None: def assign_structural_analysis_model(
file: ifcopenshell.file,
product: ifcopenshell.entity_instance,
structural_analysis_model: ifcopenshell.entity_instance,
) -> ifcopenshell.entity_instance:
"""Assigns a load or structural member to an analysis model """Assigns a load or structural member to an analysis model
:param product: The structural element that is part of the analysis. :param product: The structural element that is part of the analysis.
@@ -52,3 +56,4 @@ def assign_structural_analysis_model(file, product=None, structural_analysis_mod
related_objects.add(settings["product"]) related_objects.add(settings["product"])
rel.RelatedObjects = list(related_objects) rel.RelatedObjects = list(related_objects)
ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel})
return rel
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_structural_analysis_model(file, structural_analysis_model=None, attributes=None) -> None: def edit_structural_analysis_model(
file: ifcopenshell.file, structural_analysis_model: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcStructuralAnalysisModel """Edits the attributes of an IfcStructuralAnalysisModel
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_structural_analysis_model(file, structural_analysis_model=None, attribu
:param structural_analysis_model: The IfcStructuralAnalysisModel entity you want to edit :param structural_analysis_model: The IfcStructuralAnalysisModel entity you want to edit
:type structural_analysis_model: ifcopenshell.entity_instance :type structural_analysis_model: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
""" """
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_structural_boundary_condition(file, condition=None, attributes=None) -> None: def edit_structural_boundary_condition(
file: ifcopenshell.file, condition: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcBoundaryCondition """Edits the attributes of an IfcBoundaryCondition
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,11 +30,11 @@ def edit_structural_boundary_condition(file, condition=None, attributes=None) ->
:param condition: The IfcBoundaryCondition entity you want to edit :param condition: The IfcBoundaryCondition entity you want to edit
:type condition: ifcopenshell.entity_instance :type condition: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
""" """
settings = {"condition": condition, "attributes": attributes or {}} settings = {"condition": condition, "attributes": attributes}
for name, data in settings["attributes"].items(): for name, data in settings["attributes"].items():
if data["type"] == "string" or data["type"] == "null": if data["type"] == "string" or data["type"] == "null":
@@ -15,26 +15,32 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def edit_structural_connection_cs(file, structural_item=None, axis=None, ref_direction=None) -> None: def edit_structural_connection_cs(
file: ifcopenshell.file,
structural_item: ifcopenshell.entity_instance,
axis: tuple[float, float, float] = (0.0, 0.0, 1.0),
ref_direction: tuple[float, float, float] = (1.0, 0.0, 0.0),
) -> None:
"""Edits the coordinate system of a structural connection """Edits the coordinate system of a structural connection
:param structural_item: The IfcStructuralItem you want to modify. :param structural_item: The IfcStructuralItem you want to modify.
:type structural_item: ifcopenshell.entity_instance :type structural_item: ifcopenshell.entity_instance
:param axis: The unit Z axis vector defined as a list of 3 floats. :param axis: The unit Z axis vector defined as a list of 3 floats.
Defaults to [0., 0., 1.]. Defaults to (0., 0., 1.).
:type axis: list[float] :type axis: tuple[float, float, float]
:param ref_direction: The unit X axis vector defined as a list of 3 :param ref_direction: The unit X axis vector defined as a list of 3
floats. Defaults to [1., 0., 0.]. floats. Defaults to (1., 0., 0.).
:type ref_direction: list[float] :type ref_direction: tuple[float, float, float]
:return: None :return: None
:rtype: None :rtype: None
""" """
settings = { settings = {
"structural_item": structural_item, "structural_item": structural_item,
"axis": axis or [0.0, 0.0, 1.0], "axis": axis,
"ref_direction": ref_direction or [1.0, 0.0, 0.0], "ref_direction": ref_direction,
} }
if settings["structural_item"].ConditionCoordinateSystem is None: if settings["structural_item"].ConditionCoordinateSystem is None:
@@ -15,20 +15,25 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def edit_structural_item_axis(file, structural_item=None, axis=None) -> None: def edit_structural_item_axis(
file: ifcopenshell.file,
structural_item: ifcopenshell.entity_instance,
axis: tuple[float, float, float] = (0.0, 0.0, 1.0),
) -> None:
"""Edits the coordinate system of a structural connection """Edits the coordinate system of a structural connection
:param structural_item: The IfcStructuralItem you want to modify. :param structural_item: The IfcStructuralItem you want to modify.
:type structural_item: ifcopenshell.entity_instance :type structural_item: ifcopenshell.entity_instance
:param axis: The unit Z axis vector defined as a list of 3 floats. :param axis: The unit Z axis vector defined as a list of 3 floats.
Defaults to [0., 0., 1.]. Defaults to (0., 0., 1.).
:type axis: list[float] :type axis: tuple[float, float, float]
:return: None :return: None
:rtype: None :rtype: None
""" """
settings = {"structural_item": structural_item, "axis": axis or [0.0, 0.0, 1.0]} settings = {"structural_item": structural_item, "axis": axis}
if len(file.get_inverse(settings["structural_item"].Axis)) == 1: if len(file.get_inverse(settings["structural_item"].Axis)) == 1:
file.remove(settings["structural_item"].Axis) file.remove(settings["structural_item"].Axis)
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_structural_load(file, structural_load=None, attributes=None) -> None: def edit_structural_load(
file: ifcopenshell.file, structural_load: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcStructuralLoad """Edits the attributes of an IfcStructuralLoad
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_structural_load(file, structural_load=None, attributes=None) -> None:
:param structural_load: The IfcStructuralLoad entity you want to edit :param structural_load: The IfcStructuralLoad entity you want to edit
:type structural_load: ifcopenshell.entity_instance :type structural_load: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
""" """
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_structural_load_case(file, load_case=None, attributes=None) -> None: def edit_structural_load_case(
file: ifcopenshell.file, load_case: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcStructuralLoadCase """Edits the attributes of an IfcStructuralLoadCase
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_structural_load_case(file, load_case=None, attributes=None) -> None:
:param load_case: The IfcStructuralLoadCase entity you want to edit :param load_case: The IfcStructuralLoadCase entity you want to edit
:type load_case: ifcopenshell.entity_instance :type load_case: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
""" """
@@ -20,7 +20,9 @@ import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_structural_analysis_model(file, structural_analysis_model=None) -> None: def remove_structural_analysis_model(
file: ifcopenshell.file, structural_analysis_model: ifcopenshell.entity_instance
) -> None:
"""Removes an analysis model """Removes an analysis model
Note that the contents of an analysis model are currently preserved. Note that the contents of an analysis model are currently preserved.
@@ -15,16 +15,22 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Optional
def remove_structural_boundary_condition(file, connection=None, boundary_condition=None) -> None: def remove_structural_boundary_condition(
file: ifcopenshell.file,
connection: Optional[ifcopenshell.entity_instance] = None,
boundary_condition: Optional[ifcopenshell.entity_instance] = None,
) -> None:
"""Removes a condition from a connection, or an orphased boundary condition """Removes a condition from a connection, or an orphased boundary condition
:param connection: The IfcStructuralConnection to remove the condition :param connection: The IfcStructuralConnection to remove the condition
from. If omitted, it is assumed to be an orphaned condition. from. If omitted, it is assumed to be an orphaned condition.
:type connection: ifcopenshell.entity_instance,optional :type connection: ifcopenshell.entity_instance,optional
:param boundary_condition: The IfcBoundaryCondition to remove. :param boundary_condition: The IfcBoundaryCondition to remove.
:type boundary_condition: ifcopenshell.entity_instance :type boundary_condition: ifcopenshell.entity_instance, optional.
:return: None :return: None
:rtype: None :rtype: None
""" """
@@ -21,7 +21,7 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_structural_connection_condition(file, relation=None) -> None: def remove_structural_connection_condition(file: ifcopenshell.file, relation: ifcopenshell.entity_instance) -> None:
"""Removes a relationship between a connection and a condition """Removes a relationship between a connection and a condition
The condition and the member itself is preserved. The condition and the member itself is preserved.
@@ -15,9 +15,10 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def remove_structural_load(file, structural_load=None) -> None: def remove_structural_load(file: ifcopenshell.file, structural_load: ifcopenshell.entity_instance) -> None:
"""Removes a structural load """Removes a structural load
:param structural_load: The IfcStructuralLoad to remove. :param structural_load: The IfcStructuralLoad to remove.
@@ -21,7 +21,7 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_structural_load_case(file, load_case=None) -> None: def remove_structural_load_case(file: ifcopenshell.file, load_case: ifcopenshell.entity_instance) -> None:
"""Removes a structural load case """Removes a structural load case
:param load_case: The IfcStructuralLoadCase to remove. :param load_case: The IfcStructuralLoadCase to remove.
@@ -21,7 +21,7 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_structural_load_group(file, load_group=None) -> None: def remove_structural_load_group(file: ifcopenshell.file, load_group: ifcopenshell.entity_instance) -> None:
"""Removes a structural load group """Removes a structural load group
:param load_group: The IfcStructuralLoadGroup to remove. :param load_group: The IfcStructuralLoadGroup to remove.
@@ -21,7 +21,11 @@ import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def unassign_structural_analysis_model(file, product=None, structural_analysis_model=None) -> None: def unassign_structural_analysis_model(
file: ifcopenshell.file,
product: ifcopenshell.entity_instance,
structural_analysis_model: ifcopenshell.entity_instance,
) -> None:
"""Removes a relationship between a structural element and the analysis model """Removes a relationship between a structural element and the analysis model
:param product: The structural element that is part of the analysis. :param product: The structural element that is part of the analysis.
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Optional
def add_style(file, name=None, ifc_class="IfcSurfaceStyle") -> None: def add_style(
file: ifcopenshell.file, name: Optional[str] = None, ifc_class="IfcSurfaceStyle"
) -> ifcopenshell.entity_instance:
"""Add a new presentation style """Add a new presentation style
A presentation style is a container of visual settings (called A presentation style is a container of visual settings (called
@@ -54,8 +58,10 @@ def add_style(file, name=None, ifc_class="IfcSurfaceStyle") -> None:
# Create a new surface style # Create a new surface style
style = ifcopenshell.api.run("style.add_style", model) style = ifcopenshell.api.run("style.add_style", model)
""" """
settings = {"name": name, "ifc_class": ifc_class}
if settings["ifc_class"] == "IfcSurfaceStyle": kwargs = {"Name": name}
if ifc_class == "IfcSurfaceStyle":
# Name is filled out because Revit treats this incorrectly as the material name # Name is filled out because Revit treats this incorrectly as the material name
return file.createIfcSurfaceStyle(settings["name"], "BOTH") kwargs["Side"] = "BOTH"
return file.create_entity(ifc_class, **kwargs)
@@ -18,9 +18,15 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
from typing import Any, Optional
def add_surface_style(file, style=None, ifc_class="IfcSurfaceStyleShading", attributes=None) -> None: def add_surface_style(
file: ifcopenshell.file,
style: ifcopenshell.entity_instance,
ifc_class: str = "IfcSurfaceStyleShading",
attributes: Optional[dict[str, Any]] = None,
) -> None:
"""Adds a new presentation item to a surface style """Adds a new presentation item to a surface style
A surface style can have multiple different types of presentation items A surface style can have multiple different types of presentation items
@@ -15,18 +15,29 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
from typing import TYPE_CHECKING, Optional
if TYPE_CHECKING:
import bpy
def add_surface_textures(file, material=None, uv_maps=None, textures=None) -> None: def add_surface_textures(
file: ifcopenshell.entity_instance,
material: Optional[bpy.types.Material] = None,
textures: Optional[list[dict]] = None,
uv_maps: Optional[list[ifcopenshell.entity_instance]] = None,
) -> list[ifcopenshell.entity_instance]:
"""Add surface texture based on a Blender material definition or texture data. """Add surface texture based on a Blender material definition or texture data.
Either `material` or `textures` should be provided.
:param material: The Blender material definition with a node tree that :param material: The Blender material definition with a node tree that
is compatible with glTF. See one of the valid combinations here: is compatible with glTF. See one of the valid combinations here:
https://docs.blender.org/manual/en/dev/addons/import_export/scene_gltf2.html https://docs.blender.org/manual/en/dev/addons/import_export/scene_gltf2.html
:type material: bpy.types.Material :type material: bpy.types.Material, optional
:param uv_maps: A list of IfcIndexedTextureMap for any :param uv_maps: A list of IfcIndexedTextureMap for any
IfcTessellatedFaceSets that the representation has, obtained from IfcTessellatedFaceSets that the representation has, obtained from
the HasTextures attribute. the HasTextures attribute.
@@ -44,7 +55,7 @@ def add_surface_textures(file, material=None, uv_maps=None, textures=None) -> No
based on geometry); based on geometry);
* `Camera` - IfcTextureCoordinateGenerator with mode COORD_EYE (autogenerated UV * `Camera` - IfcTextureCoordinateGenerator with mode COORD_EYE (autogenerated UV
based on camera position) based on camera position)
:type textures: list[dict] :type textures: list[dict], optional
:return: A list of IfcImageTexture :return: A list of IfcImageTexture
:rtype: list[ifcopenshell.entity_instance] :rtype: list[ifcopenshell.entity_instance]
""" """
@@ -22,7 +22,11 @@ import ifcopenshell.util.element
def assign_material_style( def assign_material_style(
file, material=None, style=None, context=None, should_use_presentation_style_assignment=False file: ifcopenshell.file,
material: ifcopenshell.entity_instance,
style: ifcopenshell.entity_instance,
context: ifcopenshell.entity_instance,
should_use_presentation_style_assignment: bool = False,
) -> None: ) -> None:
"""Assigns a style to a material """Assigns a style to a material
@@ -15,15 +15,16 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def assign_representation_styles( def assign_representation_styles(
file, file: ifcopenshell.file,
shape_representation=None, shape_representation: ifcopenshell.entity_instance,
styles=None, styles: list[ifcopenshell.entity_instance],
replace_previous_same_type_style=True, replace_previous_same_type_style: bool = True,
should_use_presentation_style_assignment=False, should_use_presentation_style_assignment: bool = False,
) -> None: ) -> list[ifcopenshell.entity_instance]:
"""Assigns a style directly to an object representation """Assigns a style directly to an object representation
A style may either be assigned directly to an object's representation, A style may either be assigned directly to an object's representation,
@@ -56,7 +57,7 @@ def assign_representation_styles(
that this is no longer a valid IFC. Blame Autodesk. that this is no longer a valid IFC. Blame Autodesk.
:type should_use_presentation_style_assignment: bool :type should_use_presentation_style_assignment: bool
:return: List of created IfcStyledItems :return: List of created IfcStyledItems
:rtype: ifcopenshell.entity_instance :rtype: list[ifcopenshell.entity_instance]
Example: Example:
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_presentation_style(file, style=None, attributes=None) -> None: def edit_presentation_style(
file: ifcopenshell.file, style: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcPresentationStyle """Edits the attributes of an IfcPresentationStyle
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -26,7 +30,7 @@ def edit_presentation_style(file, style=None, attributes=None) -> None:
:param style: The IfcPresentationStyle entity you want to edit :param style: The IfcPresentationStyle entity you want to edit
:type style: ifcopenshell.entity_instance :type style: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -15,9 +15,13 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
from typing import Any
def edit_surface_style(file, style=None, attributes=None) -> None: def edit_surface_style(
file: ifcopenshell.file, style: ifcopenshell.entity_instance, attributes: dict[str, Any]
) -> None:
"""Edits the attributes of an IfcPresentationItem """Edits the attributes of an IfcPresentationItem
For more information about the attributes and data types of an For more information about the attributes and data types of an
@@ -34,7 +38,7 @@ def edit_surface_style(file, style=None, attributes=None) -> None:
:param style: The IfcPresentationStyle entity you want to edit :param style: The IfcPresentationStyle entity you want to edit
:type style: ifcopenshell.entity_instance :type style: ifcopenshell.entity_instance
:param attributes: a dictionary of attribute names and values. :param attributes: a dictionary of attribute names and values.
:type attributes: dict, optional :type attributes: dict
:return: None :return: None
:rtype: None :rtype: None
@@ -15,11 +15,11 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_style(file, style=None) -> None: def remove_style(file: ifcopenshell.file, style: ifcopenshell.entity_instance) -> None:
"""Removes a presentation style """Removes a presentation style
All of the presentation items of the style will also be removed. All of the presentation items of the style will also be removed.
@@ -15,9 +15,10 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def remove_styled_representation(file, representation=None) -> None: def remove_styled_representation(file: ifcopenshell.file, representation: ifcopenshell.entity_instance) -> None:
"""Removes a styled representation """Removes a styled representation
Styled representations are typically associated with materials. This Styled representations are typically associated with materials. This
@@ -20,7 +20,7 @@ import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
def remove_surface_style(file, style=None) -> None: def remove_surface_style(file: ifcopenshell.file, style: ifcopenshell.entity_instance) -> None:
"""Removes a presentation item from a presentation style """Removes a presentation item from a presentation style
:param style: The IfcPresentationItem to remove. :param style: The IfcPresentationItem to remove.
@@ -18,9 +18,16 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.api
import ifcopenshell.util.element
def unassign_material_style(file, material=None, style=None, context=None) -> None: def unassign_material_style(
file: ifcopenshell.file,
material: ifcopenshell.entity_instance,
style: ifcopenshell.entity_instance,
context: ifcopenshell.entity_instance,
) -> None:
"""Unassigns a style to a material """Unassigns a style to a material
This does the inverse of assign_material_style. This does the inverse of assign_material_style.
@@ -15,10 +15,14 @@
# #
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>. # along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell
def unassign_representation_styles( def unassign_representation_styles(
file, shape_representation=None, styles=None, should_use_presentation_style_assignment=False file: ifcopenshell.file,
shape_representation: ifcopenshell.entity_instance,
styles: list[ifcopenshell.entity_instance],
should_use_presentation_style_assignment: bool = False,
) -> None: ) -> None:
"""Unassigns styles directly assigned to an object representation """Unassigns styles directly assigned to an object representation
@@ -18,9 +18,10 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
from typing import Optional
def add_port(file, element=None) -> None: def add_port(file: ifcopenshell.file, element: Optional[ifcopenshell.entity_instance] = None) -> None:
"""Adds a new distribution port to an element """Adds a new distribution port to an element
A distribution port represents a connection point on an element, where A distribution port represents a connection point on an element, where
@@ -34,7 +35,7 @@ def add_port(file, element=None) -> None:
:param element: The IfcDistributionElement you want to add a :param element: The IfcDistributionElement you want to add a
distribution port to. distribution port to.
:type element: ifcopenshell.entity_instance :type element: ifcopenshell.entity_instance, optional
:return: The newly created IfcDistributionPort :return: The newly created IfcDistributionPort
:rtype: ifcopenshell.entity_instance :rtype: ifcopenshell.entity_instance
@@ -19,9 +19,14 @@
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
from typing import Union
def assign_flow_control(file, relating_flow_element=None, related_flow_control=None) -> None: def assign_flow_control(
file: ifcopenshell.file,
relating_flow_element: ifcopenshell.entity_instance,
related_flow_control: ifcopenshell.entity_instance,
) -> Union[ifcopenshell.entity_instance, None]:
"""Assigns to the flow element control element that either sense or control """Assigns to the flow element control element that either sense or control
some aspect of the flow element. some aspect of the flow element.
@@ -22,7 +22,9 @@ import ifcopenshell.guid
import ifcopenshell.util.placement import ifcopenshell.util.placement
def assign_port(file, element=None, port=None) -> None: def assign_port(
file: ifcopenshell.file, element: ifcopenshell.entity_instance, port: ifcopenshell.entity_instance
) -> ifcopenshell.entity_instance:
"""Assigns a port to an element """Assigns a port to an element
If you have an orphaned port, you may assign it to a distribution If you have an orphaned port, you may assign it to a distribution
@@ -73,7 +75,7 @@ class Usecase:
for rel in rels: for rel in rels:
if self.settings["port"] in rel.RelatedObjects: if self.settings["port"] in rel.RelatedObjects:
return return rel
if rels: if rels:
rel = rels[0] rel = rels[0]
@@ -97,7 +99,7 @@ class Usecase:
def execute_ifc2x3(self): def execute_ifc2x3(self):
for rel in self.settings["element"].HasPorts or []: for rel in self.settings["element"].HasPorts or []:
if rel.RelatingPort == self.settings["port"]: if rel.RelatingPort == self.settings["port"]:
return return rel
rel = self.file.create_entity( rel = self.file.create_entity(
"IfcRelConnectsPortToElement", "IfcRelConnectsPortToElement",
GlobalId=ifcopenshell.guid.new(), GlobalId=ifcopenshell.guid.new(),
@@ -20,9 +20,16 @@ import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.guid import ifcopenshell.guid
import ifcopenshell.util.element import ifcopenshell.util.element
from typing import Optional
def connect_port(file, port1=None, port2=None, direction="NOTDEFINED", element=None) -> None: def connect_port(
file: ifcopenshell.file,
port1: ifcopenshell.entity_instance,
port2: ifcopenshell.entity_instance,
direction: str = "NOTDEFINED",
element: Optional[ifcopenshell.entity_instance] = None,
) -> None:
"""Connects two ports together """Connects two ports together
A distribution element (e.g. a duct) may be connected to another A distribution element (e.g. a duct) may be connected to another
@@ -61,7 +68,7 @@ def connect_port(file, port1=None, port2=None, direction="NOTDEFINED", element=N
connectivity is made, such as a segment or fitting. This is only to connectivity is made, such as a segment or fitting. This is only to
be used for implicit port connectivity where the segments and be used for implicit port connectivity where the segments and
fittings are less important. fittings are less important.
:type element: ifcopenshell.entity_instance :type element: ifcopenshell.entity_instance, optional
Example: Example:

Some files were not shown because too many files have changed in this diff Show More