ifc5d - add ifc4x3 base quantities #6325

This commit is contained in:
Andrej730
2025-03-13 17:17:37 +05:00
parent 4eae112087
commit 6c04669543
7 changed files with 771 additions and 209 deletions
+5
View File
@@ -17,6 +17,7 @@
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy
import bonsai.tool as tool
import ifc5d.qto
from bonsai.bim.prop import StrProperty, Attribute
from bpy.types import PropertyGroup
@@ -33,8 +34,12 @@ from bpy.props import (
def get_qto_rule(self, context):
ifc_file = tool.Ifc.get()
is_ifc4x3 = ifc_file.schema == "IFC4X3"
results = []
for rule_id, rule in ifc5d.qto.rules.items():
if rule_id.startswith("IFC4X3") != is_ifc4x3:
continue
results.append((rule_id, rule["name"], rule["description"]))
return results
+110 -14
View File
@@ -1,6 +1,12 @@
"""Update ifc5d json files with qtos from the provided pset templates path."""
import json
import ifcopenshell.util.pset
import ifcopenshell.util.type
import ifc5d
from collections import defaultdict
from pathlib import Path
from typing import Union
def order_dict(dictionary):
@@ -8,20 +14,110 @@ def order_dict(dictionary):
return {k: order_dict(v) if isinstance(v, dict) else v for k, v in sorted(dictionary.items())}
results = {}
PSET_TEMPLATES_FOLDER = Path(ifcopenshell.util.__file__).parent / "schema"
JSON_FOLDER = Path(ifc5d.__file__).parent
QueriesData = dict[str, dict[str, dict[str, Union[str, None]]]]
psetqto = ifcopenshell.util.pset.get_template("IFC4")
for template in psetqto.templates:
for pset_template in template.by_type("IfcPropertySetTemplate"):
if not pset_template.Name.startswith("Qto_"):
def main() -> None:
# Update IFC4X3 json files from pset templates.
update_json_with_qtos_from_template_file(
JSON_FOLDER / "IFC4X3QtoBaseQuantities.json", PSET_TEMPLATES_FOLDER / "Pset_IFC4X3.ifc"
)
update_json_with_qtos_from_template_file(
JSON_FOLDER / "IFC4X3QtoBaseQuantitiesBlender.json", PSET_TEMPLATES_FOLDER / "Pset_IFC4X3.ifc"
)
# Reuse methods defined in IFC4 in IFC4X3 calculators.
reuse_methods_from_other_json_file(
JSON_FOLDER / "IFC4QtoBaseQuantities.json", JSON_FOLDER / "IFC4X3QtoBaseQuantities.json"
)
reuse_methods_from_other_json_file(
JSON_FOLDER / "IFC4QtoBaseQuantitiesBlender.json", JSON_FOLDER / "IFC4X3QtoBaseQuantitiesBlender.json"
)
def update_json_with_qtos_from_template_file(json_filepath: Path, ifc_filepath: Path) -> None:
"""Add missing qtos and properties to the json file from the provided pset template file."""
qto_templates: dict[str, list[ifcopenshell.entity_instance]] = defaultdict(list)
qto_props: dict[str, set[str]] = defaultdict(set)
ifc_file: ifcopenshell.file
ifc_file = ifcopenshell.open(ifc_filepath)
for template in ifc_file.by_type("IfcPropertySetTemplate"):
template_name = template.Name
if not template_name.startswith("Qto_"):
continue
query = pset_template.ApplicableEntity
results.setdefault(query, {})
results[query].setdefault(pset_template.Name, {})
for quantity in pset_template.HasPropertyTemplates:
results[query][pset_template.Name][quantity.Name] = None
qto_templates[template_name].append(template)
for prop in template.HasPropertyTemplates:
qto_props[template_name].add(prop.Name)
results = order_dict(results)
print(results)
with open("results.json", "w") as f:
json.dump(results, f, indent=4)
qto_base_quantities_data = json.loads(json_filepath.read_text())
calculator_queries_data: QueriesData
added_qtos: set[str] = set()
for calculator, calculator_queries_data in qto_base_quantities_data["calculators"].items():
# Gather all supported QTOs.
calculator_supported_qtos: set[str] = set()
for selector_query, query_qtos_data in calculator_queries_data.items():
for qto_name in query_qtos_data:
calculator_supported_qtos.add(qto_name)
# Check for missing QTOs.
for template_name in qto_templates:
template = qto_templates[template_name][0]
applicable_entity_value: str
applicable_entity_value = template.ApplicableEntity
applicable_entities = ifcopenshell.util.pset.parse_applicable_entity(applicable_entity_value)
selector_query = ifcopenshell.util.pset.convert_applicable_entities_to_query(applicable_entities)
# Add missing selector queries and qtos.
query_qtos_data = calculator_queries_data.setdefault(selector_query, {})
qto_props_data = query_qtos_data.setdefault(template_name, {})
# Add missing properties.
for prop_name in qto_props[template_name]:
if prop_name in qto_props_data:
continue
qto_props_data[prop_name] = None
added_qtos.add(template_name)
if not added_qtos:
print(f"No Qtos updates for calculator '{calculator}'.")
continue
# Sort dict alphabetically to keep it looking nice.
# Don't sort the entire json to keep the header structure.
qto_base_quantities_data["calculators"][calculator] = order_dict(calculator_queries_data)
print(f"Added Qtos for {calculator}: {added_qtos}")
json_filepath.write_text(json.dumps(qto_base_quantities_data, indent=4) + "\n")
def reuse_methods_from_other_json_file(json_source_filepath: Path, json_target_filepath: Path) -> None:
json_source_data = json.loads(json_source_filepath.read_text())
json_target_data = json.loads(json_target_filepath.read_text())
queries_data: QueriesData
queries_data_target: QueriesData
for calculator, queries_data in json_source_data["calculators"].items():
for selector_query, query_qtos_data in queries_data.items():
queries_data_target = json_target_data["calculators"][calculator]
# Don't match exactly since queries between IFC4 and IFC4X3 are not in sync currently.
target_query = next((q for q in queries_data_target if q.startswith(selector_query)), None)
if target_query is None:
continue
query_qtos_data_target = queries_data_target[target_query]
for qto_name in query_qtos_data:
if qto_name not in query_qtos_data_target:
continue
props_data = query_qtos_data[qto_name]
props_data_target = query_qtos_data_target[qto_name]
for prop_name in props_data:
if prop_name not in props_data_target:
continue
props_data_target[prop_name] = props_data[prop_name]
json_target_filepath.write_text(json.dumps(json_target_data, indent=4) + "\n")
if __name__ == "__main__":
main()
+267 -94
View File
@@ -3,39 +3,39 @@
"description": "This ruleset quantifies every single possible standardised base quantity in IFC4X3 using only IfcOpenShell as a geometry processor.",
"calculators": {
"IfcOpenShell": {
"IfcActuator": {
"IfcActuator + IfcActuatorType": {
"Qto_ActuatorBaseQuantities": {
"GrossWeight": null
}
},
"IfcAirTerminal": {
"IfcAirTerminal + IfcAirTerminalType": {
"Qto_AirTerminalBaseQuantities": {
"GrossWeight": null,
"Perimeter": null,
"TotalSurfaceArea": null
}
},
"IfcAirTerminalBox": {
"IfcAirTerminalBox + IfcAirTerminalBoxType": {
"Qto_AirTerminalBoxTypeBaseQuantities": {
"GrossWeight": null
}
},
"IfcAirToAirHeatRecovery": {
"IfcAirToAirHeatRecovery + IfcAirToAirHeatRecoveryType": {
"Qto_AirToAirHeatRecoveryBaseQuantities": {
"GrossWeight": null
}
},
"IfcAlarm": {
"IfcAlarm + IfcAlarmType": {
"Qto_AlarmBaseQuantities": {
"GrossWeight": null
}
},
"IfcAudioVisualAppliance": {
"IfcAudioVisualAppliance + IfcAudioVisualApplianceType": {
"Qto_AudioVisualApplianceBaseQuantities": {
"GrossWeight": null
}
},
"IfcBeam": {
"IfcBeam + IfcBeamType": {
"Qto_BeamBaseQuantities": {
"CrossSectionArea": null,
"GrossSurfaceArea": "gross_get_area",
@@ -48,7 +48,7 @@
"OuterSurfaceArea": "net_get_outer_surface_area"
}
},
"IfcBoiler": {
"IfcBoiler + IfcBoilerType": {
"Qto_BoilerBaseQuantities": {
"GrossWeight": null,
"NetWeight": null,
@@ -58,7 +58,7 @@
"IfcBuilding": {
"Qto_BuildingBaseQuantities": {
"EavesHeight": null,
"FootprintArea": null,
"FootPrintArea": null,
"GrossFloorArea": null,
"GrossVolume": null,
"Height": null,
@@ -66,7 +66,7 @@
"NetVolume": null
}
},
"IfcBuildingElementProxy": {
"IfcBuildingElementProxy + IfcBuildingElementProxyType": {
"Qto_BuildingElementProxyQuantities": {
"NetSurfaceArea": null,
"NetVolume": null
@@ -79,21 +79,21 @@
"GrossPerimeter": null,
"GrossVolume": null,
"NetFloorArea": null,
"NetHeigtht": null,
"NetHeight": null,
"NetVolume": null
}
},
"IfcBurner": {
"IfcBurner + IfcBurnerType": {
"Qto_BurnerBaseQuantities": {
"GrossWeight": null
}
},
"IfcCableCarrierFitting": {
"IfcCableCarrierFitting + IfcCableCarrierFittingType": {
"Qto_CableCarrierFittingBaseQuantities": {
"GrossWeight": null
}
},
"IfcCableCarrierSegment": {
"IfcCableCarrierSegment + IfcCableCarrierSegmentType": {
"Qto_CableCarrierSegmentBaseQuantities": {
"CrossSectionArea": null,
"GrossWeight": null,
@@ -101,12 +101,18 @@
"OuterSurfaceArea": null
}
},
"IfcCableFitting": {
"IfcCableCarrierSegment, PredefinedType=\"CONDUITSEGMENT\" + IfcCableCarrierSegmentType, PredefinedType=\"CONDUITSEGMENT\"": {
"Qto_ConduitSegmentBaseQuantities": {
"InnerDiameter": null,
"OuterDiameter": null
}
},
"IfcCableFitting + IfcCableFittingType": {
"Qto_CableFittingBaseQuantities": {
"GrossWeight": null
}
},
"IfcCableSegment": {
"IfcCableSegment + IfcCableSegmentType": {
"Qto_CableSegmentBaseQuantities": {
"CrossSectionArea": null,
"GrossWeight": null,
@@ -114,22 +120,22 @@
"OuterSurfaceArea": null
}
},
"IfcChiller": {
"IfcChiller + IfcChillerType": {
"Qto_ChillerBaseQuantities": {
"GrossWeight": null
}
},
"IfcChimney": {
"IfcChimney + IfcChimneyType": {
"Qto_ChimneyBaseQuantities": {
"Length": "net_get_max_xyz"
}
},
"IfcCoil": {
"IfcCoil + IfcCoilType": {
"Qto_CoilBaseQuantities": {
"GrossWeight": null
}
},
"IfcColumn": {
"IfcColumn + IfcColumnType": {
"Qto_ColumnBaseQuantities": {
"CrossSectionArea": null,
"GrossSurfaceArea": "gross_get_area",
@@ -142,28 +148,28 @@
"OuterSurfaceArea": "net_get_outer_surface_area"
}
},
"IfcCommunicationsAppliance": {
"IfcCommunicationsAppliance + IfcCommunicationsApplianceType": {
"Qto_CommunicationsApplianceBaseQuantities": {
"GrossWeight": null
}
},
"IfcCompressor": {
"IfcCompressor + IfcCompressorType": {
"Qto_CompressorBaseQuantities": {
"GrossWeight": null
}
},
"IfcCondenser": {
"IfcCondenser + IfcCondenserType": {
"Qto_CondenserBaseQuantities": {
"GrossWeight": null
}
},
"IfcConstructionEquipmentResource": {
"IfcConstructionEquipmentResource + IfcConstructionEquipmentResourceType": {
"Qto_ConstructionEquipmentResourceBaseQuantities": {
"OperatingTime": null,
"UsageTime": null
}
},
"IfcConstructionMaterialResource": {
"IfcConstructionMaterialResource + IfcConstructionMaterialResourceType": {
"Qto_ConstructionMaterialResourceBaseQuantities": {
"GrossVolume": null,
"GrossWeight": null,
@@ -171,29 +177,39 @@
"NetWeight": null
}
},
"IfcController": {
"IfcController + IfcControllerType": {
"Qto_ControllerBaseQuantities": {
"GrossWeight": null
}
},
"IfcCooledBeam": {
"IfcCooledBeam + IfcCooledBeamType": {
"Qto_CooledBeamBaseQuantities": {
"GrossWeight": null
}
},
"IfcCoolingTower": {
"IfcCoolingTower + IfcCoolingTowerType": {
"Qto_CoolingTowerBaseQuantities": {
"GrossWeight": null
}
},
"IfcCovering": {
"IfcCourse + IfcCourseType": {
"Qto_CourseBaseQuantities": {
"GrossVolume": null,
"Length": null,
"Thickness": null,
"Volume": null,
"Weight": null,
"Width": null
}
},
"IfcCovering + IfcCoveringType": {
"Qto_CoveringBaseQuantities": {
"GrossArea": "gross_get_max_side_area",
"NetArea": "net_get_max_side_area",
"Width": "gross_get_min_xyz"
}
},
"IfcCurtainWall": {
"IfcCurtainWall + IfcCurtainWallType": {
"Qto_CurtainWallQuantities": {
"GrossSideArea": null,
"Height": null,
@@ -202,20 +218,21 @@
"Width": null
}
},
"IfcDamper": {
"IfcDamper + IfcDamperType": {
"Qto_DamperBaseQuantities": {
"GrossWeight": null
}
},
"IfcDistributionChamberElement": {
"IfcDistributionChamberElement + IfcDistributionChamberElementType": {
"Qto_DistributionChamberElementBaseQuantities": {
"Depth": null,
"GrossSurfaceArea": null,
"GrossVolume": null,
"NetSurfaceArea": null,
"NetVolume": null
}
},
"IfcDoor": {
"IfcDoor + IfcDoorType": {
"Qto_DoorBaseQuantities": {
"Area": null,
"Height": null,
@@ -223,7 +240,7 @@
"Width": null
}
},
"IfcDuctFitting": {
"IfcDuctFitting + IfcDuctFittingType": {
"Qto_DuctFittingBaseQuantities": {
"GrossCrossSectionArea": null,
"GrossWeight": null,
@@ -232,7 +249,7 @@
"OuterSurfaceArea": null
}
},
"IfcDuctSegment": {
"IfcDuctSegment + IfcDuctSegmentType": {
"Qto_DuctSegmentBaseQuantities": {
"GrossCrossSectionArea": null,
"GrossWeight": null,
@@ -241,78 +258,106 @@
"OuterSurfaceArea": null
}
},
"IfcDuctSilencer": {
"IfcDuctSilencer + IfcDuctSilencerType": {
"Qto_DuctSilencerBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricAppliance": {
"IfcEarthworksCut": {
"Qto_EarthworksCutBaseQuantities": {
"Depth": null,
"Length": null,
"LooseVolume": null,
"UndisturbedVolume": null,
"Weight": null,
"Width": null
}
},
"IfcEarthworksFill": {
"Qto_EarthworksFillBaseQuantities": {
"CompactedVolume": null,
"Depth": null,
"Length": null,
"LooseVolume": null,
"Width": null
}
},
"IfcElectricAppliance + IfcElectricApplianceType": {
"Qto_ElectricApplianceBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricDistributionBoard": {
"Qto_ElectricDistributionBoardBaseQuantities": {
"IfcElectricDistributionBoard + IfcElectricDistributionBoardType": {
"Qto_DistributionBoardBaseQuantities": {
"GrossWeight": null,
"NumberOfCircuits": null
}
},
"IfcElectricFlowStorageDevice": {
"IfcElectricFlowStorageDevice + IfcElectricFlowStorageDeviceType": {
"Qto_ElectricFlowStorageDeviceBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricGenerator": {
"IfcElectricGenerator + IfcElectricGeneratorType": {
"Qto_ElectricGeneratorBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricMotor": {
"IfcElectricMotor + IfcElectricMotorType": {
"Qto_ElectricMotorBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricTimeControl": {
"IfcElectricTimeControl + IfcElectricTimeControlType": {
"Qto_ElectricTimeControlBaseQuantities": {
"GrossWeight": null
}
},
"IfcEvaporativeCooler": {
"IfcEvaporativeCooler + IfcEvaporativeCoolerType": {
"Qto_EvaporativeCoolerBaseQuantities": {
"GrossWeight": null
}
},
"IfcEvaporator": {
"IfcEvaporator + IfcEvaporatorType": {
"Qto_EvaporatorBaseQuantities": {
"GrossWeight": null
}
},
"IfcFan": {
"IfcFacilityPart": {
"Qto_FacilityPartBaseQuantities": {
"Area": null,
"Height": null,
"Length": null,
"Volume": null,
"Width": null
}
},
"IfcFan + IfcFanType": {
"Qto_FanBaseQuantities": {
"GrossWeight": null
}
},
"IfcFilter": {
"IfcFilter + IfcFilterType": {
"Qto_FilterBaseQuantities": {
"GrossWeight": null
}
},
"IfcFireSuppressionTerminal": {
"IfcFireSuppressionTerminal + IfcFireSuppressionTerminalType": {
"Qto_FireSuppressionTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcFlowInstrument": {
"IfcFlowInstrument + IfcFlowInstrumentType": {
"Qto_FlowInstrumentBaseQuantities": {
"GrossWeight": null
}
},
"IfcFlowMeter": {
"IfcFlowMeter + IfcFlowMeterType": {
"Qto_FlowMeterBaseQuantities": {
"GrossWeight": null
}
},
"IfcFooting": {
"IfcFooting + IfcFootingType": {
"Qto_FootingBaseQuantities": {
"CrossSectionArea": null,
"GrossSurfaceArea": null,
@@ -326,44 +371,88 @@
"Width": null
}
},
"IfcHeatExchanger": {
"IfcGeotechnicalStratum": {
"Qto_ArealStratumBaseQuantities": {
"Area": null,
"Length": null,
"PlanLength": null
},
"Qto_LinearStratumBaseQuantities": {
"Diameter": null,
"Length": null
},
"Qto_VolumetricStratumBaseQuantities": {
"Area": null,
"Mass": null,
"PlanArea": null,
"Volume": null
}
},
"IfcHeatExchanger + IfcHeatExchangerType": {
"Qto_HeatExchangerBaseQuantities": {
"GrossWeight": null
}
},
"IfcHumidifier": {
"IfcHumidifier + IfcHumidifierType": {
"Qto_HumidifierBaseQuantities": {
"GrossWeight": null
}
},
"IfcInterceptor": {
"IfcImpactProtectionDevice + IfcImpactProtectionDeviceType": {
"Qto_ImpactProtectionDeviceBaseQuantities": {
"Weight": null
}
},
"IfcInterceptor + IfcInterceptorType": {
"Qto_InterceptorBaseQuantities": {
"GrossWeight": null
}
},
"IfcJunctionBox": {
"IfcJunctionBox + IfcJunctionBoxType": {
"Qto_JunctionBoxBaseQuantities": {
"GrossWeight": null,
"NumberOfGangs": null
"Height": null,
"Length": null,
"NumberOfGangs": null,
"Width": null
}
},
"IfcLaborResource": {
"IfcKerb + IfcKerbType": {
"Qto_KerbBaseQuantities": {
"Depth": null,
"Height": null,
"Length": null,
"Volume": null,
"Weight": null,
"Width": null
}
},
"IfcLaborResource + IfcLaborResourceType": {
"Qto_LaborResourceBaseQuantities": {
"OvertimeWork": null,
"StandardWork": null
}
},
"IfcLamp": {
"IfcLamp + IfcLampType": {
"Qto_LampBaseQuantities": {
"GrossWeight": null
}
},
"IfcLightFixture": {
"IfcLightFixture + IfcLightFixtureType": {
"Qto_LightFixtureBaseQuantities": {
"GrossWeight": null
}
},
"IfcMember": {
"IfcMarineFacility": {
"Qto_MarineFacilityBaseQuantities": {
"Area": null,
"Height": null,
"Length": null,
"Volume": null,
"Width": null
}
},
"IfcMember + IfcMemberType": {
"Qto_MemberBaseQuantities": {
"CrossSectionArea": null,
"GrossSurfaceArea": "gross_get_area",
@@ -376,7 +465,7 @@
"OuterSurfaceArea": "net_get_outer_surface_area"
}
},
"IfcMotorConnection": {
"IfcMotorConnection + IfcMotorConnectionType": {
"Qto_MotorConnectionBaseQuantities": {
"GrossWeight": null
}
@@ -390,12 +479,23 @@
"Width": "gross_get_x"
}
},
"IfcOutlet": {
"IfcOutlet + IfcOutletType": {
"Qto_OutletBaseQuantities": {
"GrossWeight": null
}
},
"IfcPile": {
"IfcPavement + IfcPavementType": {
"Qto_PavementBaseQuantities": {
"Depth": null,
"GrossArea": null,
"GrossVolume": null,
"Length": null,
"NetArea": null,
"NetVolume": null,
"Width": null
}
},
"IfcPile + IfcPileType": {
"Qto_PileBaseQuantities": {
"CrossSectionArea": null,
"GrossSurfaceArea": null,
@@ -407,7 +507,7 @@
"OuterSurfaceArea": null
}
},
"IfcPipeFitting": {
"IfcPipeFitting + IfcPipeFittingType": {
"Qto_PipeFittingBaseQuantities": {
"GrossCrossSectionArea": null,
"GrossWeight": null,
@@ -417,8 +517,9 @@
"OuterSurfaceArea": null
}
},
"IfcPipeSegment": {
"IfcPipeSegment + IfcPipeSegmentType": {
"Qto_PipeSegmentBaseQuantities": {
"FootPrintArea": null,
"GrossCrossSectionArea": null,
"GrossWeight": null,
"Length": "net_get_segment_length",
@@ -427,7 +528,7 @@
"OuterSurfaceArea": null
}
},
"IfcPlate": {
"IfcPlate + IfcPlateType": {
"Qto_PlateBaseQuantities": {
"GrossArea": "gross_get_max_side_area",
"GrossVolume": "gross_get_volume",
@@ -439,33 +540,50 @@
"Width": "net_get_min_xyz"
}
},
"IfcProduct": {
"Qto_BodyGeometryValidation": {
"GrossSurfaceArea": null,
"GrossVolume": null,
"NetSurfaceArea": null,
"NetVolume": null,
"SurfaceGenusAfterFeatures": null,
"SurfaceGenusBeforeFeatures": null
}
},
"IfcProjectionElement": {
"Qto_ProjectionElementBaseQuantities": {
"Area": null,
"Volume": null
}
},
"IfcProtectiveDevice": {
"IfcProtectiveDevice + IfcProtectiveDeviceType": {
"Qto_ProtectiveDeviceBaseQuantities": {
"GrossWeight": null
}
},
"IfcProtectiveDeviceTrippingUnit": {
"IfcProtectiveDeviceTrippingUnit + IfcProtectiveDeviceTrippingUnitType": {
"Qto_ProtectiveDeviceTrippingUnitBaseQuantities": {
"GrossWeight": null
}
},
"IfcPump": {
"IfcPump + IfcPumpType": {
"Qto_PumpBaseQuantities": {
"GrossWeight": null
}
},
"IfcRailing": {
"IfcRail + IfcRailType": {
"Qto_RailBaseQuantities": {
"Length": null,
"Volume": null,
"Weight": null
}
},
"IfcRailing + IfcRailingType": {
"Qto_RailingBaseQuantities": {
"Length": null
}
},
"IfcRampFlight": {
"IfcRampFlight + IfcRampFlightType": {
"Qto_RampFlightBaseQuantities": {
"GrossArea": null,
"GrossVolume": null,
@@ -475,37 +593,65 @@
"Width": null
}
},
"IfcReinforcingElement": {
"IfcReinforcedSoil": {
"Qto_ReinforcedSoilBaseQuantities": {
"Area": null,
"Depth": null,
"Length": null,
"Volume": null,
"Width": null
}
},
"IfcReinforcingElement + IfcReinforcingElementType": {
"Qto_ReinforcingElementBaseQuantities": {
"Count": null,
"Length": null,
"Weight": null
}
},
"IfcRoof": {
"IfcRoof + IfcRoofType": {
"Qto_RoofBaseQuantities": {
"GrossArea": "gross_get_top_area",
"NetArea": "net_get_top_area",
"ProjectedArea": null
}
},
"IfcSanitaryTerminal": {
"IfcSanitaryTerminal + IfcSanitaryTerminalType": {
"Qto_SanitaryTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcSensor": {
"IfcSensor + IfcSensorType": {
"Qto_SensorBaseQuantities": {
"GrossWeight": null
}
},
"IfcSign + IfcSignType": {
"Qto_SignBaseQuantities": {
"Height": null,
"Thickness": null,
"Weight": null,
"Width": null
}
},
"IfcSign, PredefinedType=\"PICTORAL\" + IfcSignType, PredefinedType=\"PICTORAL\"": {
"Qto_PictorialSignQuantities": {
"Area": null,
"SignArea": null
}
},
"IfcSignal + IfcSignalType": {
"Qto_SignalBaseQuantities": {
"Weight": null
}
},
"IfcSite": {
"Qto_SiteBaseQuantities": {
"GrossArea": null,
"GrossPerimeter": null
}
},
"IfcSlab": {
"IfcSlab + IfcSlabType": {
"Qto_SlabBaseQuantities": {
"Depth": "net_get_z",
"GrossArea": "gross_get_footprint_area",
@@ -519,13 +665,13 @@
"Width": "net_get_y"
}
},
"IfcSolarDevice": {
"IfcSolarDevice + IfcSolarDeviceType": {
"Qto_SolarDeviceBaseQuantities": {
"GrossArea": null,
"GrossWeight": null
}
},
"IfcSpace": {
"IfcSpace + IfcSpaceType": {
"Qto_SpaceBaseQuantities": {
"FinishCeilingHeight": null,
"FinishFloorHeight": null,
@@ -542,89 +688,116 @@
"NetWallArea": null
}
},
"IfcSpaceHeater": {
"IfcSpaceHeater + IfcSpaceHeaterType": {
"Qto_SpaceHeaterBaseQuantities": {
"GrossWeight": null,
"Length": null,
"NetWeight": null
}
},
"IfcStackTerminal": {
"IfcSpatialZone + IfcSpatialZoneType": {
"Qto_SpatialZoneBaseQuantities": {
"Height": null,
"Length": null,
"Width": null
}
},
"IfcStackTerminal + IfcStackTerminalType": {
"Qto_StackTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcStairFlight": {
"IfcStairFlight + IfcStairFlightType": {
"Qto_StairFlightBaseQuantities": {
"GrossVolume": null,
"Length": "net_get_max_xy",
"NetVolume": "net_get_volume"
}
},
"IfcSwitchingDevice": {
"IfcSurfaceFeature": {
"Qto_SurfaceFeatureBaseQuantities": {
"Area": null,
"Length": null
}
},
"IfcSwitchingDevice + IfcSwitchingDeviceType": {
"Qto_SwitchingDeviceBaseQuantities": {
"GrossWeight": null
}
},
"IfcTank": {
"IfcTank + IfcTankType": {
"Qto_TankBaseQuantities": {
"GrossWeight": null,
"NetWeight": null,
"TotalSurfaceArea": null
}
},
"IfcTransformer": {
"IfcTrackElement, PredefinedType=\"SLEEPER\" + IfcTrackElementType, PredefinedType=\"SLEEPER\"": {
"Qto_SleeperBaseQuantities": {
"Height": null,
"Length": null,
"Width": null
}
},
"IfcTransformer + IfcTransformerType": {
"Qto_TransformerBaseQuantities": {
"GrossWeight": null
}
},
"IfcTubeBundle": {
"IfcTubeBundle + IfcTubeBundleType": {
"Qto_TubeBundleBaseQuantities": {
"GrossWeight": null,
"NetWeight": null
}
},
"IfcUnitaryControlElement": {
"IfcUnitaryControlElement + IfcUnitaryControlElementType": {
"Qto_UnitaryControlElementBaseQuantities": {
"GrossWeight": null
}
},
"IfcUnitaryEquipment": {
"IfcUnitaryEquipment + IfcUnitaryEquipmentType": {
"Qto_UnitaryEquipmentBaseQuantities": {
"GrossWeight": null
}
},
"IfcValve": {
"IfcValve + IfcValveType": {
"Qto_ValveBaseQuantities": {
"GrossWeight": null
}
},
"IfcVibrationIsolator": {
"IfcVehicle, PredefinedType=\"ROLLINGSTOCK\" + IfcVehicle, PredefinedType=\"VEHICLEAIR\" + IfcVehicle, PredefinedType=\"VEHICLEMARINE\" + IfcVehicle, PredefinedType=\"VEHICLE\" + IfcVehicle, PredefinedType=\"VEHICLETRACKED\" + IfcVehicleType, PredefinedType=\"ROLLINGSTOCK\" + IfcVehicleType, PredefinedType=\"VEHICLEAIR\" + IfcVehicleType, PredefinedType=\"VEHICLEMARINE\" + IfcVehicleType, PredefinedType=\"VEHICLE\" + IfcVehicleType, PredefinedType=\"VEHICLETRACKED\"": {
"Qto_VehicleBaseQuantities": {
"Height": null,
"Length": null,
"Width": null
}
},
"IfcVibrationIsolator + IfcVibrationIsolatorType": {
"Qto_VibrationIsolatorBaseQuantities": {
"GrossWeight": null
}
},
"IfcWall": {
"IfcWall + IfcWallType": {
"Qto_WallBaseQuantities": {
"GrossFootprintArea": null,
"GrossFootPrintArea": null,
"GrossSideArea": "gross_get_side_area",
"GrossVolume": "gross_get_volume",
"GrossWeight": null,
"Height": "net_get_z",
"Length": "net_get_x",
"NetFootprintArea": null,
"NetFootPrintArea": null,
"NetSideArea": "net_get_side_area",
"NetVolume": "net_get_volume",
"NetWeight": null,
"Width": "net_get_y"
}
},
"IfcWasteTerminal": {
"IfcWasteTerminal + IfcWasteTerminalType": {
"Qto_WasteTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcWindow": {
"IfcWindow + IfcWindowType": {
"Qto_WindowBaseQuantities": {
"Area": "net_get_max_side_area",
"Height": "net_get_z",
@@ -3,39 +3,39 @@
"description": "This ruleset quantifies every single possible standardised base quantity in IFC4X3 using Blender.",
"calculators": {
"Blender": {
"IfcActuator": {
"IfcActuator + IfcActuatorType": {
"Qto_ActuatorBaseQuantities": {
"GrossWeight": null
}
},
"IfcAirTerminal": {
"IfcAirTerminal + IfcAirTerminalType": {
"Qto_AirTerminalBaseQuantities": {
"GrossWeight": null,
"Perimeter": null,
"TotalSurfaceArea": null
}
},
"IfcAirTerminalBox": {
"IfcAirTerminalBox + IfcAirTerminalBoxType": {
"Qto_AirTerminalBoxTypeBaseQuantities": {
"GrossWeight": null
}
},
"IfcAirToAirHeatRecovery": {
"IfcAirToAirHeatRecovery + IfcAirToAirHeatRecoveryType": {
"Qto_AirToAirHeatRecoveryBaseQuantities": {
"GrossWeight": null
}
},
"IfcAlarm": {
"IfcAlarm + IfcAlarmType": {
"Qto_AlarmBaseQuantities": {
"GrossWeight": null
}
},
"IfcAudioVisualAppliance": {
"IfcAudioVisualAppliance + IfcAudioVisualApplianceType": {
"Qto_AudioVisualApplianceBaseQuantities": {
"GrossWeight": null
}
},
"IfcBeam": {
"IfcBeam + IfcBeamType": {
"Qto_BeamBaseQuantities": {
"CrossSectionArea": "get_cross_section_area",
"GrossSurfaceArea": "get_gross_surface_area",
@@ -48,7 +48,7 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcBoiler": {
"IfcBoiler + IfcBoilerType": {
"Qto_BoilerBaseQuantities": {
"GrossWeight": null,
"NetWeight": null,
@@ -58,7 +58,7 @@
"IfcBuilding": {
"Qto_BuildingBaseQuantities": {
"EavesHeight": null,
"FootprintArea": null,
"FootPrintArea": null,
"GrossFloorArea": null,
"GrossVolume": null,
"Height": null,
@@ -66,7 +66,7 @@
"NetVolume": null
}
},
"IfcBuildingElementProxy": {
"IfcBuildingElementProxy + IfcBuildingElementProxyType": {
"Qto_BuildingElementProxyQuantities": {
"NetSurfaceArea": "get_net_surface_area",
"NetVolume": "get_net_volume"
@@ -79,21 +79,21 @@
"GrossPerimeter": null,
"GrossVolume": null,
"NetFloorArea": null,
"NetHeigtht": null,
"NetHeight": null,
"NetVolume": null
}
},
"IfcBurner": {
"IfcBurner + IfcBurnerType": {
"Qto_BurnerBaseQuantities": {
"GrossWeight": null
}
},
"IfcCableCarrierFitting": {
"IfcCableCarrierFitting + IfcCableCarrierFittingType": {
"Qto_CableCarrierFittingBaseQuantities": {
"GrossWeight": null
}
},
"IfcCableCarrierSegment": {
"IfcCableCarrierSegment + IfcCableCarrierSegmentType": {
"Qto_CableCarrierSegmentBaseQuantities": {
"CrossSectionArea": null,
"GrossWeight": null,
@@ -101,12 +101,18 @@
"OuterSurfaceArea": null
}
},
"IfcCableFitting": {
"IfcCableCarrierSegment, PredefinedType=\"CONDUITSEGMENT\" + IfcCableCarrierSegmentType, PredefinedType=\"CONDUITSEGMENT\"": {
"Qto_ConduitSegmentBaseQuantities": {
"InnerDiameter": null,
"OuterDiameter": null
}
},
"IfcCableFitting + IfcCableFittingType": {
"Qto_CableFittingBaseQuantities": {
"GrossWeight": null
}
},
"IfcCableSegment": {
"IfcCableSegment + IfcCableSegmentType": {
"Qto_CableSegmentBaseQuantities": {
"CrossSectionArea": null,
"GrossWeight": null,
@@ -114,22 +120,22 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcChiller": {
"IfcChiller + IfcChillerType": {
"Qto_ChillerBaseQuantities": {
"GrossWeight": null
}
},
"IfcChimney": {
"IfcChimney + IfcChimneyType": {
"Qto_ChimneyBaseQuantities": {
"Length": "get_height"
}
},
"IfcCoil": {
"IfcCoil + IfcCoilType": {
"Qto_CoilBaseQuantities": {
"GrossWeight": null
}
},
"IfcColumn": {
"IfcColumn + IfcColumnType": {
"Qto_ColumnBaseQuantities": {
"CrossSectionArea": "get_cross_section_area",
"GrossSurfaceArea": "get_gross_surface_area",
@@ -142,28 +148,28 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcCommunicationsAppliance": {
"IfcCommunicationsAppliance + IfcCommunicationsApplianceType": {
"Qto_CommunicationsApplianceBaseQuantities": {
"GrossWeight": null
}
},
"IfcCompressor": {
"IfcCompressor + IfcCompressorType": {
"Qto_CompressorBaseQuantities": {
"GrossWeight": null
}
},
"IfcCondenser": {
"IfcCondenser + IfcCondenserType": {
"Qto_CondenserBaseQuantities": {
"GrossWeight": null
}
},
"IfcConstructionEquipmentResource": {
"IfcConstructionEquipmentResource + IfcConstructionEquipmentResourceType": {
"Qto_ConstructionEquipmentResourceBaseQuantities": {
"OperatingTime": null,
"UsageTime": null
}
},
"IfcConstructionMaterialResource": {
"IfcConstructionMaterialResource + IfcConstructionMaterialResourceType": {
"Qto_ConstructionMaterialResourceBaseQuantities": {
"GrossVolume": "get_gross_volume",
"GrossWeight": null,
@@ -171,29 +177,39 @@
"NetWeight": null
}
},
"IfcController": {
"IfcController + IfcControllerType": {
"Qto_ControllerBaseQuantities": {
"GrossWeight": null
}
},
"IfcCooledBeam": {
"IfcCooledBeam + IfcCooledBeamType": {
"Qto_CooledBeamBaseQuantities": {
"GrossWeight": null
}
},
"IfcCoolingTower": {
"IfcCoolingTower + IfcCoolingTowerType": {
"Qto_CoolingTowerBaseQuantities": {
"GrossWeight": null
}
},
"IfcCovering": {
"IfcCourse + IfcCourseType": {
"Qto_CourseBaseQuantities": {
"GrossVolume": null,
"Length": null,
"Thickness": null,
"Volume": null,
"Weight": null,
"Width": null
}
},
"IfcCovering + IfcCoveringType": {
"Qto_CoveringBaseQuantities": {
"GrossArea": "get_covering_gross_area",
"NetArea": "get_covering_net_area",
"Width": "get_covering_width"
}
},
"IfcCurtainWall": {
"IfcCurtainWall + IfcCurtainWallType": {
"Qto_CurtainWallQuantities": {
"GrossSideArea": null,
"Height": null,
@@ -202,20 +218,21 @@
"Width": null
}
},
"IfcDamper": {
"IfcDamper + IfcDamperType": {
"Qto_DamperBaseQuantities": {
"GrossWeight": null
}
},
"IfcDistributionChamberElement": {
"IfcDistributionChamberElement + IfcDistributionChamberElementType": {
"Qto_DistributionChamberElementBaseQuantities": {
"Depth": null,
"GrossSurfaceArea": "get_gross_surface_area",
"GrossVolume": "get_gross_volume",
"NetSurfaceArea": "get_net_surface_area",
"NetVolume": "get_net_volume"
}
},
"IfcDoor": {
"IfcDoor + IfcDoorType": {
"Qto_DoorBaseQuantities": {
"Area": "get_net_side_area",
"Height": "get_height",
@@ -223,7 +240,7 @@
"Width": "get_length"
}
},
"IfcDuctFitting": {
"IfcDuctFitting + IfcDuctFittingType": {
"Qto_DuctFittingBaseQuantities": {
"GrossCrossSectionArea": null,
"GrossWeight": null,
@@ -232,7 +249,7 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcDuctSegment": {
"IfcDuctSegment + IfcDuctSegmentType": {
"Qto_DuctSegmentBaseQuantities": {
"GrossCrossSectionArea": null,
"GrossWeight": null,
@@ -241,78 +258,106 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcDuctSilencer": {
"IfcDuctSilencer + IfcDuctSilencerType": {
"Qto_DuctSilencerBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricAppliance": {
"IfcEarthworksCut": {
"Qto_EarthworksCutBaseQuantities": {
"Depth": null,
"Length": null,
"LooseVolume": null,
"UndisturbedVolume": null,
"Weight": null,
"Width": null
}
},
"IfcEarthworksFill": {
"Qto_EarthworksFillBaseQuantities": {
"CompactedVolume": null,
"Depth": null,
"Length": null,
"LooseVolume": null,
"Width": null
}
},
"IfcElectricAppliance + IfcElectricApplianceType": {
"Qto_ElectricApplianceBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricDistributionBoard": {
"Qto_ElectricDistributionBoardBaseQuantities": {
"IfcElectricDistributionBoard + IfcElectricDistributionBoardType": {
"Qto_DistributionBoardBaseQuantities": {
"GrossWeight": null,
"NumberOfCircuits": null
}
},
"IfcElectricFlowStorageDevice": {
"IfcElectricFlowStorageDevice + IfcElectricFlowStorageDeviceType": {
"Qto_ElectricFlowStorageDeviceBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricGenerator": {
"IfcElectricGenerator + IfcElectricGeneratorType": {
"Qto_ElectricGeneratorBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricMotor": {
"IfcElectricMotor + IfcElectricMotorType": {
"Qto_ElectricMotorBaseQuantities": {
"GrossWeight": null
}
},
"IfcElectricTimeControl": {
"IfcElectricTimeControl + IfcElectricTimeControlType": {
"Qto_ElectricTimeControlBaseQuantities": {
"GrossWeight": null
}
},
"IfcEvaporativeCooler": {
"IfcEvaporativeCooler + IfcEvaporativeCoolerType": {
"Qto_EvaporativeCoolerBaseQuantities": {
"GrossWeight": null
}
},
"IfcEvaporator": {
"IfcEvaporator + IfcEvaporatorType": {
"Qto_EvaporatorBaseQuantities": {
"GrossWeight": null
}
},
"IfcFan": {
"IfcFacilityPart": {
"Qto_FacilityPartBaseQuantities": {
"Area": null,
"Height": null,
"Length": null,
"Volume": null,
"Width": null
}
},
"IfcFan + IfcFanType": {
"Qto_FanBaseQuantities": {
"GrossWeight": null
}
},
"IfcFilter": {
"IfcFilter + IfcFilterType": {
"Qto_FilterBaseQuantities": {
"GrossWeight": null
}
},
"IfcFireSuppressionTerminal": {
"IfcFireSuppressionTerminal + IfcFireSuppressionTerminalType": {
"Qto_FireSuppressionTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcFlowInstrument": {
"IfcFlowInstrument + IfcFlowInstrumentType": {
"Qto_FlowInstrumentBaseQuantities": {
"GrossWeight": null
}
},
"IfcFlowMeter": {
"IfcFlowMeter + IfcFlowMeterType": {
"Qto_FlowMeterBaseQuantities": {
"GrossWeight": null
}
},
"IfcFooting": {
"IfcFooting + IfcFootingType": {
"Qto_FootingBaseQuantities": {
"CrossSectionArea": "get_cross_section_area",
"GrossSurfaceArea": "get_gross_surface_area",
@@ -326,44 +371,88 @@
"Width": "get_width"
}
},
"IfcHeatExchanger": {
"IfcGeotechnicalStratum": {
"Qto_ArealStratumBaseQuantities": {
"Area": null,
"Length": null,
"PlanLength": null
},
"Qto_LinearStratumBaseQuantities": {
"Diameter": null,
"Length": null
},
"Qto_VolumetricStratumBaseQuantities": {
"Area": null,
"Mass": null,
"PlanArea": null,
"Volume": null
}
},
"IfcHeatExchanger + IfcHeatExchangerType": {
"Qto_HeatExchangerBaseQuantities": {
"GrossWeight": null
}
},
"IfcHumidifier": {
"IfcHumidifier + IfcHumidifierType": {
"Qto_HumidifierBaseQuantities": {
"GrossWeight": null
}
},
"IfcInterceptor": {
"IfcImpactProtectionDevice + IfcImpactProtectionDeviceType": {
"Qto_ImpactProtectionDeviceBaseQuantities": {
"Weight": null
}
},
"IfcInterceptor + IfcInterceptorType": {
"Qto_InterceptorBaseQuantities": {
"GrossWeight": null
}
},
"IfcJunctionBox": {
"IfcJunctionBox + IfcJunctionBoxType": {
"Qto_JunctionBoxBaseQuantities": {
"GrossWeight": null,
"NumberOfGangs": null
"Height": null,
"Length": null,
"NumberOfGangs": null,
"Width": null
}
},
"IfcLaborResource": {
"IfcKerb + IfcKerbType": {
"Qto_KerbBaseQuantities": {
"Depth": null,
"Height": null,
"Length": null,
"Volume": null,
"Weight": null,
"Width": null
}
},
"IfcLaborResource + IfcLaborResourceType": {
"Qto_LaborResourceBaseQuantities": {
"OvertimeWork": null,
"StandardWork": null
}
},
"IfcLamp": {
"IfcLamp + IfcLampType": {
"Qto_LampBaseQuantities": {
"GrossWeight": null
}
},
"IfcLightFixture": {
"IfcLightFixture + IfcLightFixtureType": {
"Qto_LightFixtureBaseQuantities": {
"GrossWeight": null
}
},
"IfcMember": {
"IfcMarineFacility": {
"Qto_MarineFacilityBaseQuantities": {
"Area": null,
"Height": null,
"Length": null,
"Volume": null,
"Width": null
}
},
"IfcMember + IfcMemberType": {
"Qto_MemberBaseQuantities": {
"CrossSectionArea": "get_cross_section_area",
"GrossSurfaceArea": "get_gross_surface_area",
@@ -376,7 +465,7 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcMotorConnection": {
"IfcMotorConnection + IfcMotorConnectionType": {
"Qto_MotorConnectionBaseQuantities": {
"GrossWeight": null
}
@@ -390,12 +479,23 @@
"Width": "get_length"
}
},
"IfcOutlet": {
"IfcOutlet + IfcOutletType": {
"Qto_OutletBaseQuantities": {
"GrossWeight": null
}
},
"IfcPile": {
"IfcPavement + IfcPavementType": {
"Qto_PavementBaseQuantities": {
"Depth": null,
"GrossArea": null,
"GrossVolume": null,
"Length": null,
"NetArea": null,
"NetVolume": null,
"Width": null
}
},
"IfcPile + IfcPileType": {
"Qto_PileBaseQuantities": {
"CrossSectionArea": "get_cross_section_area",
"GrossSurfaceArea": "get_gross_surface_area",
@@ -407,7 +507,7 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcPipeFitting": {
"IfcPipeFitting + IfcPipeFittingType": {
"Qto_PipeFittingBaseQuantities": {
"GrossCrossSectionArea": null,
"GrossWeight": null,
@@ -417,8 +517,9 @@
"OuterSurfaceArea": null
}
},
"IfcPipeSegment": {
"IfcPipeSegment + IfcPipeSegmentType": {
"Qto_PipeSegmentBaseQuantities": {
"FootPrintArea": null,
"GrossCrossSectionArea": null,
"GrossWeight": "get_gross_weight",
"Length": "get_length",
@@ -427,7 +528,7 @@
"OuterSurfaceArea": "get_outer_surface_area"
}
},
"IfcPlate": {
"IfcPlate + IfcPlateType": {
"Qto_PlateBaseQuantities": {
"GrossArea": "get_gross_footprint_area",
"GrossVolume": "get_gross_volume",
@@ -439,33 +540,50 @@
"Width": "get_height"
}
},
"IfcProduct": {
"Qto_BodyGeometryValidation": {
"GrossSurfaceArea": null,
"GrossVolume": null,
"NetSurfaceArea": null,
"NetVolume": null,
"SurfaceGenusAfterFeatures": null,
"SurfaceGenusBeforeFeatures": null
}
},
"IfcProjectionElement": {
"Qto_ProjectionElementBaseQuantities": {
"Area": "get_net_side_area",
"Volume": "get_net_volume"
}
},
"IfcProtectiveDevice": {
"IfcProtectiveDevice + IfcProtectiveDeviceType": {
"Qto_ProtectiveDeviceBaseQuantities": {
"GrossWeight": null
}
},
"IfcProtectiveDeviceTrippingUnit": {
"IfcProtectiveDeviceTrippingUnit + IfcProtectiveDeviceTrippingUnitType": {
"Qto_ProtectiveDeviceTrippingUnitBaseQuantities": {
"GrossWeight": null
}
},
"IfcPump": {
"IfcPump + IfcPumpType": {
"Qto_PumpBaseQuantities": {
"GrossWeight": null
}
},
"IfcRailing": {
"IfcRail + IfcRailType": {
"Qto_RailBaseQuantities": {
"Length": null,
"Volume": null,
"Weight": null
}
},
"IfcRailing + IfcRailingType": {
"Qto_RailingBaseQuantities": {
"Length": "get_length"
}
},
"IfcRampFlight": {
"IfcRampFlight + IfcRampFlightType": {
"Qto_RampFlightBaseQuantities": {
"GrossArea": "get_gross_stair_area",
"GrossVolume": "get_gross_volume",
@@ -475,37 +593,65 @@
"Width": "get_width"
}
},
"IfcReinforcingElement": {
"IfcReinforcedSoil": {
"Qto_ReinforcedSoilBaseQuantities": {
"Area": null,
"Depth": null,
"Length": null,
"Volume": null,
"Width": null
}
},
"IfcReinforcingElement + IfcReinforcingElementType": {
"Qto_ReinforcingElementBaseQuantities": {
"Count": null,
"Length": "get_length",
"Weight": null
}
},
"IfcRoof": {
"IfcRoof + IfcRoofType": {
"Qto_RoofBaseQuantities": {
"GrossArea": "get_gross_top_area",
"NetArea": "get_net_top_area",
"ProjectedArea": null
}
},
"IfcSanitaryTerminal": {
"IfcSanitaryTerminal + IfcSanitaryTerminalType": {
"Qto_SanitaryTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcSensor": {
"IfcSensor + IfcSensorType": {
"Qto_SensorBaseQuantities": {
"GrossWeight": null
}
},
"IfcSign + IfcSignType": {
"Qto_SignBaseQuantities": {
"Height": null,
"Thickness": null,
"Weight": null,
"Width": null
}
},
"IfcSign, PredefinedType=\"PICTORAL\" + IfcSignType, PredefinedType=\"PICTORAL\"": {
"Qto_PictorialSignQuantities": {
"Area": null,
"SignArea": null
}
},
"IfcSignal + IfcSignalType": {
"Qto_SignalBaseQuantities": {
"Weight": null
}
},
"IfcSite": {
"Qto_SiteBaseQuantities": {
"GrossArea": "get_gross_footprint_area",
"GrossPerimeter": "get_gross_perimeter"
}
},
"IfcSlab": {
"IfcSlab + IfcSlabType": {
"Qto_SlabBaseQuantities": {
"Depth": "get_height",
"GrossArea": "get_gross_footprint_area",
@@ -519,13 +665,13 @@
"Width": "get_width"
}
},
"IfcSolarDevice": {
"IfcSolarDevice + IfcSolarDeviceType": {
"Qto_SolarDeviceBaseQuantities": {
"GrossArea": null,
"GrossWeight": null
}
},
"IfcSpace": {
"IfcSpace + IfcSpaceType": {
"Qto_SpaceBaseQuantities": {
"FinishCeilingHeight": "get_finish_ceiling_height",
"FinishFloorHeight": "get_finish_floor_height",
@@ -542,89 +688,116 @@
"NetWallArea": null
}
},
"IfcSpaceHeater": {
"IfcSpaceHeater + IfcSpaceHeaterType": {
"Qto_SpaceHeaterBaseQuantities": {
"GrossWeight": null,
"Length": "get_length",
"NetWeight": null
}
},
"IfcStackTerminal": {
"IfcSpatialZone + IfcSpatialZoneType": {
"Qto_SpatialZoneBaseQuantities": {
"Height": null,
"Length": null,
"Width": null
}
},
"IfcStackTerminal + IfcStackTerminalType": {
"Qto_StackTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcStairFlight": {
"IfcStairFlight + IfcStairFlightType": {
"Qto_StairFlightBaseQuantities": {
"GrossVolume": "get_gross_volume",
"Length": "get_stair_length",
"NetVolume": "get_net_volume"
}
},
"IfcSwitchingDevice": {
"IfcSurfaceFeature": {
"Qto_SurfaceFeatureBaseQuantities": {
"Area": null,
"Length": null
}
},
"IfcSwitchingDevice + IfcSwitchingDeviceType": {
"Qto_SwitchingDeviceBaseQuantities": {
"GrossWeight": null
}
},
"IfcTank": {
"IfcTank + IfcTankType": {
"Qto_TankBaseQuantities": {
"GrossWeight": null,
"NetWeight": null,
"TotalSurfaceArea": "get_outer_surface_area"
}
},
"IfcTransformer": {
"IfcTrackElement, PredefinedType=\"SLEEPER\" + IfcTrackElementType, PredefinedType=\"SLEEPER\"": {
"Qto_SleeperBaseQuantities": {
"Height": null,
"Length": null,
"Width": null
}
},
"IfcTransformer + IfcTransformerType": {
"Qto_TransformerBaseQuantities": {
"GrossWeight": null
}
},
"IfcTubeBundle": {
"IfcTubeBundle + IfcTubeBundleType": {
"Qto_TubeBundleBaseQuantities": {
"GrossWeight": null,
"NetWeight": null
}
},
"IfcUnitaryControlElement": {
"IfcUnitaryControlElement + IfcUnitaryControlElementType": {
"Qto_UnitaryControlElementBaseQuantities": {
"GrossWeight": null
}
},
"IfcUnitaryEquipment": {
"IfcUnitaryEquipment + IfcUnitaryEquipmentType": {
"Qto_UnitaryEquipmentBaseQuantities": {
"GrossWeight": null
}
},
"IfcValve": {
"IfcValve + IfcValveType": {
"Qto_ValveBaseQuantities": {
"GrossWeight": null
}
},
"IfcVibrationIsolator": {
"IfcVehicle, PredefinedType=\"ROLLINGSTOCK\" + IfcVehicle, PredefinedType=\"VEHICLEAIR\" + IfcVehicle, PredefinedType=\"VEHICLEMARINE\" + IfcVehicle, PredefinedType=\"VEHICLE\" + IfcVehicle, PredefinedType=\"VEHICLETRACKED\" + IfcVehicleType, PredefinedType=\"ROLLINGSTOCK\" + IfcVehicleType, PredefinedType=\"VEHICLEAIR\" + IfcVehicleType, PredefinedType=\"VEHICLEMARINE\" + IfcVehicleType, PredefinedType=\"VEHICLE\" + IfcVehicleType, PredefinedType=\"VEHICLETRACKED\"": {
"Qto_VehicleBaseQuantities": {
"Height": null,
"Length": null,
"Width": null
}
},
"IfcVibrationIsolator + IfcVibrationIsolatorType": {
"Qto_VibrationIsolatorBaseQuantities": {
"GrossWeight": null
}
},
"IfcWall": {
"IfcWall + IfcWallType": {
"Qto_WallBaseQuantities": {
"GrossFootprintArea": "get_gross_footprint_area",
"GrossFootPrintArea": null,
"GrossSideArea": "get_gross_side_area",
"GrossVolume": "get_gross_volume",
"GrossWeight": "get_gross_weight",
"Height": "get_height",
"Length": "get_x",
"NetFootprintArea": "get_net_footprint_area",
"NetFootPrintArea": null,
"NetSideArea": "get_net_side_area",
"NetVolume": "get_net_volume",
"NetWeight": "get_net_weight",
"Width": "get_width"
}
},
"IfcWasteTerminal": {
"IfcWasteTerminal + IfcWasteTerminalType": {
"Qto_WasteTerminalBaseQuantities": {
"GrossWeight": null
}
},
"IfcWindow": {
"IfcWindow + IfcWindowType": {
"Qto_WindowBaseQuantities": {
"Area": "get_net_side_area",
"Height": "get_height",
+6 -1
View File
@@ -35,7 +35,12 @@ from typing import Any, Literal, get_args, Union, Iterable
Function = namedtuple("Function", ["measure", "name", "description"])
RULE_SET = Literal["IFC4QtoBaseQuantities", "IFC4QtoBaseQuantitiesBlender"]
RULE_SET = Literal[
"IFC4QtoBaseQuantities",
"IFC4QtoBaseQuantitiesBlender",
"IFC4X3QtoBaseQuantities",
"IFC4X3QtoBaseQuantitiesBlender",
]
rules: dict[RULE_SET, dict[str, Any]] = {}
ResultsDict = dict[ifcopenshell.entity_instance, dict[str, dict[str, float]]]
QtosFormulas = dict[str, dict[str, str]]
@@ -24,7 +24,7 @@ import ifcopenshell.util.schema
import ifcopenshell.util.type
from ifcopenshell.entity_instance import entity_instance
from functools import lru_cache
from typing import Optional, Literal
from typing import Optional, Literal, NamedTuple, Union
templates: dict[str, "PsetQto"] = {}
@@ -111,11 +111,17 @@ class PsetQto:
template_type: str = "NOTDEFINED",
schema: ifcopenshell.util.schema.IFC_SCHEMA = "IFC4",
) -> bool:
"""applicables can have multiple possible patterns :
IfcBoilerType (IfcClass)
IfcBoilerType/STEAM (IfcClass/PREDEFINEDTYPE)
IfcBoilerType[PerformanceHistory] (IfcClass[PerformanceHistory])
IfcBoilerType/STEAM[PerformanceHistory] (IfcClass/PREDEFINEDTYPE[PerformanceHistory])
"""
applicables can have multiple possible patterns :
.. code-block:: text
IfcBoilerType (IfcClass)
IfcBoilerType/STEAM (IfcClass/PREDEFINEDTYPE)
IfcBoilerType[PerformanceHistory] (IfcClass[PerformanceHistory])
IfcBoilerType/STEAM[PerformanceHistory] (IfcClass/PREDEFINEDTYPE[PerformanceHistory])
"""
for applicable in applicables.split(","):
match = re.match(r"(\w+)(\[\w+\])*/*(\w+)*(\[\w+\])*", applicable)
@@ -194,3 +200,37 @@ def get_pset_template_type(pset_template: entity_instance) -> Literal["PSET", "Q
pset_type = next(iter(pset_types)) if len(pset_types) == 1 else None
return pset_type
class ApplicableEntity(NamedTuple):
value: str
ifc_class: str
predefined_type: Union[str, None]
performance_history: bool
def parse_applicable_entity(applicable_entity: str) -> list[ApplicableEntity]:
"""Parse ApplicableEntity string query to tuples.
:param applicable_entity: IfcPropertySetTemplate.ApplicableEntity query.
:return: List of ApplicableEntity tuples.
"""
items: list[ApplicableEntity] = []
for item in applicable_entity.split(","):
value = item
item, predefined_type = parts if len(parts := item.split("/")) > 1 else (item, None)
ifc_class, performance_history = (parts[0], True) if len(parts := item.split("[")) > 1 else (item, False)
items.append(ApplicableEntity(value, ifc_class, predefined_type, performance_history))
return items
def convert_applicable_entities_to_query(applicable_entities: list[ApplicableEntity]) -> str:
"""Get query supported by :func:`ifcopenshell.util.selector.filter_elements`."""
parts: list[str] = []
for entity in applicable_entities:
# NOTE: selector currently doesn't support checking if element has performance history.
part = entity.ifc_class
if entity.predefined_type:
part += f', PredefinedType="{entity.predefined_type}"'
parts.append(part)
return " + ".join(parts)
@@ -19,6 +19,7 @@
"""Run this test from src/ifcopenshell-python folder: pytest --durations=0 ifcopenshell/util/test_pset.py"""
from ifcopenshell.util import pset
from ifcopenshell import util
from ifcopenshell.util.pset import ApplicableEntity
class TestPsetQto:
@@ -66,3 +67,72 @@ class TestPsetQto:
assert "Pset_MaterialConcrete" not in names
names = self.pset_qto.get_applicable_names("IfcMaterial", "concrete")
assert "Pset_MaterialConcrete" in names
class TestParseApplicableEntity:
def test_run(self):
assert pset.parse_applicable_entity("IfcBoilerType") == [
ApplicableEntity("IfcBoilerType", "IfcBoilerType", None, False)
]
def test_two_entities(self):
assert pset.parse_applicable_entity("IfcBoilerType,IfcWallType") == [
ApplicableEntity("IfcBoilerType", "IfcBoilerType", None, False),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
def test_two_entities_with_performance_history(self):
assert pset.parse_applicable_entity("IfcBoilerType[PerformanceHistory],IfcWallType") == [
ApplicableEntity("IfcBoilerType[PerformanceHistory]", "IfcBoilerType", None, True),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
def test_two_entities_with_predefined_type(self):
assert pset.parse_applicable_entity("IfcBoilerType/STEAM,IfcWallType") == [
ApplicableEntity("IfcBoilerType/STEAM", "IfcBoilerType", "STEAM", False),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
def test_two_entities_with_predefined_type_and_performance_history(self):
assert pset.parse_applicable_entity("IfcBoilerType[PerformanceHistory]/STEAM,IfcWallType") == [
ApplicableEntity("IfcBoilerType[PerformanceHistory]/STEAM", "IfcBoilerType", "STEAM", True),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
class TestConvertApplicableEntitiesToQuery:
def test_run(self):
entities = [ApplicableEntity("IfcBoilerType", "IfcBoilerType", None, False)]
assert pset.convert_applicable_entities_to_query(entities) == "IfcBoilerType"
def test_two_entities(self):
entities = [
ApplicableEntity("IfcBoilerType", "IfcBoilerType", None, False),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
assert pset.convert_applicable_entities_to_query(entities) == "IfcBoilerType + IfcWallType"
def test_two_entities_with_performance_history(self):
entities = [
ApplicableEntity("IfcBoilerType[PerformanceHistory]", "IfcBoilerType", None, True),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
assert pset.convert_applicable_entities_to_query(entities) == "IfcBoilerType + IfcWallType"
def test_two_entities_with_predefined_type(self):
entities = [
ApplicableEntity("IfcBoilerType/STEAM", "IfcBoilerType", "STEAM", False),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
assert (
pset.convert_applicable_entities_to_query(entities) == 'IfcBoilerType, PredefinedType="STEAM" + IfcWallType'
)
def test_two_entities_with_predefined_type_and_performance_history(self):
entities = [
ApplicableEntity("IfcBoilerType[PerformanceHistory]/STEAM", "IfcBoilerType", "STEAM", True),
ApplicableEntity("IfcWallType", "IfcWallType", None, False),
]
assert (
pset.convert_applicable_entities_to_query(entities) == 'IfcBoilerType, PredefinedType="STEAM" + IfcWallType'
)