mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
resource.add_resource_quantity to ensure quantity type is supported
This commit is contained in:
@@ -41,20 +41,7 @@ quantitytypes_enum = {}
|
|||||||
|
|
||||||
|
|
||||||
def setup_quantity_types_enum():
|
def setup_quantity_types_enum():
|
||||||
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcConstructionResource.htm#Table-7.3.3.7.1.3.H
|
resources = ifcopenshell.util.resource.RESOURCES_TO_QUANTITIES
|
||||||
resources = {
|
|
||||||
"IfcCrewResource": ("IfcQuantityTime",),
|
|
||||||
"IfcLaborResource": ("IfcQuantityTime",),
|
|
||||||
"IfcSubContractResource": ("IfcQuantityTime",),
|
|
||||||
"IfcConstructionEquipmentResource": ("IfcQuantityTime",),
|
|
||||||
"IfcConstructionMaterialResource": (
|
|
||||||
"IfcQuantityVolume",
|
|
||||||
"IfcQuantityArea",
|
|
||||||
"IfcQuantityLength",
|
|
||||||
"IfcQuantityWeight",
|
|
||||||
),
|
|
||||||
"IfcConstructionProductResource": ("IfcQuantityCount",),
|
|
||||||
}
|
|
||||||
for resource, quantities in resources.items():
|
for resource, quantities in resources.items():
|
||||||
quantitytypes_enum[resource] = [(q, q, "") for q in quantities]
|
quantitytypes_enum[resource] = [(q, q, "") for q in quantities]
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
# 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.element
|
import ifcopenshell.util.element
|
||||||
|
import ifcopenshell.util.resource
|
||||||
|
|
||||||
|
|
||||||
def add_resource_quantity(
|
def add_resource_quantity(
|
||||||
@@ -66,6 +67,14 @@ def add_resource_quantity(
|
|||||||
"""
|
"""
|
||||||
settings = {"resource": resource, "ifc_class": ifc_class}
|
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")
|
quantity = file.create_entity(settings["ifc_class"], Name="Unnamed")
|
||||||
# 3 IfcPhysicalSimpleQuantity Value
|
# 3 IfcPhysicalSimpleQuantity Value
|
||||||
if settings["ifc_class"] == "IfcQuantityCount":
|
if settings["ifc_class"] == "IfcQuantityCount":
|
||||||
|
|||||||
@@ -23,6 +23,20 @@ from typing import Union, Any
|
|||||||
|
|
||||||
|
|
||||||
PRODUCTIVITY_PSET_DATA = Union[dict[str, Any], None]
|
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:
|
def get_productivity(resource: ifcopenshell.entity_instance, should_inherit: bool = True) -> PRODUCTIVITY_PSET_DATA:
|
||||||
|
|||||||
@@ -16,27 +16,45 @@
|
|||||||
# 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 pytest
|
||||||
import test.bootstrap
|
import test.bootstrap
|
||||||
import ifcopenshell.api
|
import ifcopenshell.api
|
||||||
|
import ifcopenshell.api.resource
|
||||||
|
import ifcopenshell.util.resource
|
||||||
|
|
||||||
|
|
||||||
class TestAddResourceQuantity(test.bootstrap.IFC4):
|
class TestAddResourceQuantity(test.bootstrap.IFC4):
|
||||||
def test_run(self):
|
def test_run(self):
|
||||||
schema = ifcopenshell.schema_by_name(self.file.schema)
|
schema = ifcopenshell.schema_by_name(self.file.schema)
|
||||||
quantity_types = [t.name() for t in schema.declaration_by_name("IfcPhysicalSimpleQuantity").subtypes()]
|
quantity_types = [t.name() for t in schema.declaration_by_name("IfcPhysicalSimpleQuantity").subtypes()]
|
||||||
self.file.create_entity("IfcProject") # add_resource
|
resource_types = [t.name() for t in schema.declaration_by_name("IfcConstructionResource").subtypes()]
|
||||||
resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcCrewResource")
|
|
||||||
|
|
||||||
for quantity_type in quantity_types:
|
self.file.create_entity("IfcProject") # add_resource
|
||||||
quantity = ifcopenshell.api.run(
|
|
||||||
"resource.add_resource_quantity", self.file, resource=resource, ifc_class=quantity_type
|
for resource_type in resource_types:
|
||||||
)
|
resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class=resource_type)
|
||||||
assert quantity.is_a(quantity_type)
|
available_quantities = ifcopenshell.util.resource.RESOURCES_TO_QUANTITIES[resource_type]
|
||||||
assert quantity.Name == "Unnamed"
|
|
||||||
assert quantity[3] == 0.0
|
for quantity_type in quantity_types:
|
||||||
# previous quantity is reassigned and removed
|
if quantity_type not in available_quantities:
|
||||||
assert resource.BaseQuantity == quantity
|
with pytest.raises(ValueError):
|
||||||
assert len(self.file.by_type("IfcPhysicalSimpleQuantity")) == 1
|
quantity = ifcopenshell.api.resource.add_resource_quantity(
|
||||||
|
self.file, resource=resource, ifc_class=quantity_type
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
quantity = ifcopenshell.api.resource.add_resource_quantity(
|
||||||
|
self.file, resource=resource, ifc_class=quantity_type
|
||||||
|
)
|
||||||
|
|
||||||
|
assert quantity.is_a(quantity_type)
|
||||||
|
assert quantity.Name == "Unnamed"
|
||||||
|
assert quantity[3] == 0.0
|
||||||
|
# previous quantity is reassigned and removed
|
||||||
|
assert resource.BaseQuantity == quantity
|
||||||
|
assert len(self.file.by_type("IfcPhysicalSimpleQuantity")) == 1
|
||||||
|
|
||||||
|
ifcopenshell.api.resource.remove_resource(self.file, resource)
|
||||||
|
|
||||||
|
|
||||||
class TestAddResourceQuantityIFC2X3(test.bootstrap.IFC2X3, TestAddResourceQuantity):
|
class TestAddResourceQuantityIFC2X3(test.bootstrap.IFC2X3, TestAddResourceQuantity):
|
||||||
|
|||||||
Reference in New Issue
Block a user