diff --git a/src/ifcopenshell-python/ifcopenshell/util/fm.py b/src/ifcopenshell-python/ifcopenshell/util/fm.py new file mode 100644 index 0000000000..b0ac0cba43 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/util/fm.py @@ -0,0 +1,107 @@ +cobie_type_classes = [ + "IfcDoorStyle", + "IfcBuildingElementProxyType", + "IfcChimneyType", + "IfcCoveringType", + "IfcDoorType", + "IfcFootingType", + "IfcPileType", + "IfcRoofType", + "IfcShadingDeviceType", + "IfcWindowType", + "IfcDistributionControlElementType", + "IfcDistributionChamberElementType", + "IfcEnergyConversionDeviceType", + "IfcFlowControllerType", + "IfcFlowMovingDeviceType", + "IfcFlowStorageDeviceType", + "IfcFlowTerminalType", + "IfcFlowTreatmentDeviceType", + "IfcElementAssemblyType", + "IfcBuildingElementPartType", + "IfcDiscreteAccessoryType", + "IfcMechanicalFastenerType", + "IfcReinforcingElementType", + "IfcVibrationIsolatorType", + "IfcFurnishingElementType", + "IfcGeographicElementType", + "IfcTransportElementType", + "IfcSpatialZoneType", + "IfcWindowStyle", +] + +cobie_component_classes = [ + "IfcBuildingElementProxy", + "IfcChimney", + "IfcCovering", + "IfcDoor", + "IfcShadingDevice", + "IfcWindow", + "IfcDistributionControlElement", + "IfcDistributionChamberElement", + "IfcEnergyConversionDevice", + "IfcFlowController", + "IfcFlowMovingDevice", + "IfcFlowStorageDevice", + "IfcFlowTerminal", + "IfcFlowTreatmentDevice", + "IfcDiscreteAccessory", + "IfcTendon", + "IfcTendonAnchor", + "IfcVibrationIsolator", + "IfcFurnishingElement", + "IfcGeographicElement", + "IfcTransportElement", +] + +fmhem_classes = [ + "IfcDoorStyle", + "IfcWindowStyle", + "IfcDoorType", + "IfcWindowType", + "IfcRoofType", + "IfcShadingDeviceType", + "IfcDistributionControlElementType", + "IfcEnergyConversionDeviceType", + "IfcFlowControllerType", + "IfcJunctionBoxType", + "IfcFlowMovingDeviceType", + "IfcFlowStorageDeviceType", + "IfcFlowTerminalType", + "IfcFlowTreatmentDeviceType", + "IfcFurnishingElementType", + "IfcTransportElementType", +] + + +def get_cobie_types(ifc_file): + elements = [] + for ifc_class in cobie_type_classes: + try: + elements += self.file.by_type(ifc_class) + except: + pass + return elements + + +def get_cobie_components(ifc_file): + elements = [] + for ifc_class in cobie_component_classes: + try: + elements += self.file.by_type(ifc_class) + except: + pass + return elements + + +def get_fmhem_types(ifc_file): + elements = [] + for ifc_class in fmhem_classes: + try: + if ifc_class == "IfcEnergyConversionDeviceType": + elements += [e for e in ifc_file.by_type(ifc_class) if not e.is_a("IfcCooledBeamType")] + else: + elements += ifc_file.by_type(ifc_class) + except: + pass + return elements diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index d56d69ce83..dd7fc99c4d 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -1,62 +1,8 @@ import ifcopenshell.util +import ifcopenshell.util.fm import ifcopenshell.util.element import lark -cobie_type_assets = [ - "IfcDoorStyle", - "IfcBuildingElementProxyType", - "IfcChimneyType", - "IfcCoveringType", - "IfcDoorType", - "IfcFootingType", - "IfcPileType", - "IfcRoofType", - "IfcShadingDeviceType", - "IfcWindowType", - "IfcDistributionControlElementType", - "IfcDistributionChamberElementType", - "IfcEnergyConversionDeviceType", - "IfcFlowControllerType", - "IfcFlowMovingDeviceType", - "IfcFlowStorageDeviceType", - "IfcFlowTerminalType", - "IfcFlowTreatmentDeviceType", - "IfcElementAssemblyType", - "IfcBuildingElementPartType", - "IfcDiscreteAccessoryType", - "IfcMechanicalFastenerType", - "IfcReinforcingElementType", - "IfcVibrationIsolatorType", - "IfcFurnishingElementType", - "IfcGeographicElementType", - "IfcTransportElementType", - "IfcSpatialZoneType", - "IfcWindowStyle", -] -cobie_component_assets = [ - "IfcBuildingElementProxy", - "IfcChimney", - "IfcCovering", - "IfcDoor", - "IfcShadingDevice", - "IfcWindow", - "IfcDistributionControlElement", - "IfcDistributionChamberElement", - "IfcEnergyConversionDevice", - "IfcFlowController", - "IfcFlowMovingDevice", - "IfcFlowStorageDevice", - "IfcFlowTerminal", - "IfcFlowTreatmentDevice", - "IfcDiscreteAccessory", - "IfcTendon", - "IfcTendonAnchor", - "IfcVibrationIsolator", - "IfcFurnishingElement", - "IfcGeographicElement", - "IfcTransportElement", -] - class Selector: def parse(self, ifc_file, query): @@ -174,19 +120,11 @@ class Selector: def get_class_selector(self, class_selector): if class_selector.children[0] == "COBie": - elements = [] - for ifc_class in cobie_component_assets: - try: - elements += self.file.by_type(ifc_class) - except: - pass + ifcopenshell.util.fm.get_cobie_components(self.file) elif class_selector.children[0] == "COBieType": - elements = [] - for ifc_class in cobie_type_assets: - try: - elements += self.file.by_type(ifc_class) - except: - pass + ifcopenshell.util.fm.get_cobie_types(self.file) + elif class_selector.children[0] == "FMHEM": + ifcopenshell.util.fm.get_fmhem_types(self.file) else: elements = self.file.by_type(class_selector.children[0]) if len(class_selector.children) > 1 and class_selector.children[1].data == "filter":