resource.add_resource_quantity to ensure quantity type is supported

This commit is contained in:
Andrej730
2024-06-03 12:26:50 +05:00
parent 5ccdf187d5
commit c399eb259a
4 changed files with 54 additions and 26 deletions
@@ -17,6 +17,7 @@
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
import ifcopenshell.util.element
import ifcopenshell.util.resource
def add_resource_quantity(
@@ -66,6 +67,14 @@ def add_resource_quantity(
"""
settings = {"resource": resource, "ifc_class": ifc_class}
resource_type = resource.is_a()
supported_quantities = ifcopenshell.util.resource.RESOURCES_TO_QUANTITIES[resource_type]
if ifc_class not in supported_quantities:
raise ValueError(
f"Resource type '{resource_type}' does not support quantity type '{ifc_class}'. "
f"Supported quantities: {','.join(supported_quantities)}"
)
quantity = file.create_entity(settings["ifc_class"], Name="Unnamed")
# 3 IfcPhysicalSimpleQuantity Value
if settings["ifc_class"] == "IfcQuantityCount":
@@ -23,6 +23,20 @@ from typing import Union, Any
PRODUCTIVITY_PSET_DATA = Union[dict[str, Any], None]
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcConstructionResource.htm#Table-7.3.3.7.1.3.H
RESOURCES_TO_QUANTITIES: dict[str, tuple[str, ...]] = {
"IfcCrewResource": ("IfcQuantityTime",),
"IfcLaborResource": ("IfcQuantityTime",),
"IfcSubContractResource": ("IfcQuantityTime",),
"IfcConstructionEquipmentResource": ("IfcQuantityTime",),
"IfcConstructionMaterialResource": (
"IfcQuantityVolume",
"IfcQuantityArea",
"IfcQuantityLength",
"IfcQuantityWeight",
),
"IfcConstructionProductResource": ("IfcQuantityCount",),
}
def get_productivity(resource: ifcopenshell.entity_instance, should_inherit: bool = True) -> PRODUCTIVITY_PSET_DATA: