diff --git a/src/ifcblenderexport/generate_util_type_json.py b/src/ifcblenderexport/generate_util_type_json.py new file mode 100644 index 0000000000..1992878ca5 --- /dev/null +++ b/src/ifcblenderexport/generate_util_type_json.py @@ -0,0 +1,100 @@ +# See bug #1300. Dodgy quick results that we should rebuild later. +import json +import ifcopenshell +import ifcopenshell.util.schema + + +filepath = "IFC4.exp" +schema2x3 = ifcopenshell.ifcopenshell_wrapper.schema_by_name("IFC2X3") +schema4 = ifcopenshell.ifcopenshell_wrapper.schema_by_name("IFC4") + +entity_to_type_map = {} + +entity = None +is_in_where_rule = False + +with open(filepath) as fp: + line = fp.readline() + while line: + if "ENTITY " in line: + entity = line[len("ENTITY ") : -1] + elif "END_ENTITY" in line: + is_in_where_rule = False + elif entity and "CorrectTypeAssigned" in line: + is_in_where_rule = True + elif entity and is_in_where_rule and "IN TYPEOF" in line and "RelatingType" in line: + type_class = line.split("'")[1].split(".")[1] + entity_to_type_map.setdefault(entity, []).append(type_class) + line = fp.readline() + +# This type of hacky express parsing doesn't accomodate subtypes, so... + + +def get_inherited_map(declaration): + if not ifcopenshell.util.schema.is_a(declaration, "IfcObject"): + return + if declaration.supertype().name() in entity_to_type_map: + return entity_to_type_map[declaration.supertype().name()] + return get_inherited_map(declaration.supertype()) + + +for declaration in schema4.declarations(): + if not hasattr(declaration, "supertype"): + continue + if not ifcopenshell.util.schema.is_a(declaration, "IfcObject"): + continue + if declaration.is_abstract(): + continue + if declaration.name() in entity_to_type_map: + continue + inherited_map = get_inherited_map(declaration) + if inherited_map: + entity_to_type_map[declaration.name()] = inherited_map + +type_to_entity_map = {value: [key] for key in entity_to_type_map for value in entity_to_type_map[key]} + +# IFC2X3 doesn't seem to define this in EXPRESS, so let's just guess + +entity_to_type_map2x3 = {} + + +def guess_type_declaration(declaration): + if not ifcopenshell.util.schema.is_a(declaration, "IfcObject"): + return + + try: + type_declaration = schema2x3.declaration_by_name(declaration.name() + "Type") + return type_declaration + except: + pass + + try: + type_declaration = schema2x3.declaration_by_name(declaration.name() + "Style") + return type_declaration + except: + pass + + return guess_type_declaration(declaration.supertype()) + + +for declaration in schema2x3.declarations(): + if not hasattr(declaration, "supertype"): + continue + type_declaration = guess_type_declaration(declaration) + if not type_declaration: + continue + if not type_declaration.is_abstract(): + entity_to_type_map2x3.setdefault(declaration.name(), []).append(type_declaration.name()) + for subtype in type_declaration.subtypes(): + if not subtype.is_abstract(): + entity_to_type_map2x3.setdefault(declaration.name(), []).append(subtype.name()) + +type_to_entity_map2x3 = {value: [key] for key in entity_to_type_map2x3 for value in entity_to_type_map2x3[key]} + + +with open("entity_to_type_map_4.json", "w") as f: + json.dump(entity_to_type_map, f, indent=4) + + +with open("entity_to_type_map_2x3.json", "w") as f: + json.dump(entity_to_type_map2x3, f, indent=4) diff --git a/src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_2x3.json b/src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_2x3.json new file mode 100644 index 0000000000..f316fcefa5 --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_2x3.json @@ -0,0 +1,424 @@ +{ + "IfcBeam": [ + "IfcBeamType" + ], + "IfcBuilding": [ + "IfcSpaceType" + ], + "IfcBuildingElement": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcBuildingElementComponent": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcBuildingElementPart": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcBuildingElementProxy": [ + "IfcBuildingElementProxyType" + ], + "IfcBuildingStorey": [ + "IfcSpaceType" + ], + "IfcChamferEdgeFeature": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcColumn": [ + "IfcColumnType" + ], + "IfcCovering": [ + "IfcCoveringType" + ], + "IfcCurtainWall": [ + "IfcCurtainWallType" + ], + "IfcDiscreteAccessory": [ + "IfcDiscreteAccessoryType", + "IfcVibrationIsolatorType" + ], + "IfcDistributionChamberElement": [ + "IfcDistributionChamberElementType" + ], + "IfcDistributionControlElement": [ + "IfcActuatorType", + "IfcAlarmType", + "IfcControllerType", + "IfcFlowInstrumentType", + "IfcSensorType" + ], + "IfcDistributionElement": [ + "IfcDistributionElementType" + ], + "IfcDistributionFlowElement": [ + "IfcDistributionChamberElementType" + ], + "IfcDoor": [ + "IfcDoorStyle" + ], + "IfcEdgeFeature": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcElectricalElement": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcElectricDistributionPoint": [ + "IfcAirTerminalBoxType", + "IfcDamperType", + "IfcElectricTimeControlType", + "IfcFlowMeterType", + "IfcProtectiveDeviceType", + "IfcSwitchingDeviceType", + "IfcValveType" + ], + "IfcElement": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcElementAssembly": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcElementComponent": [ + "IfcDiscreteAccessoryType", + "IfcFastenerType" + ], + "IfcEnergyConversionDevice": [ + "IfcAirToAirHeatRecoveryType", + "IfcBoilerType", + "IfcChillerType", + "IfcCoilType", + "IfcCondenserType", + "IfcCooledBeamType", + "IfcCoolingTowerType", + "IfcElectricGeneratorType", + "IfcElectricMotorType", + "IfcEvaporativeCoolerType", + "IfcEvaporatorType", + "IfcHeatExchangerType", + "IfcHumidifierType", + "IfcMotorConnectionType", + "IfcSpaceHeaterType", + "IfcTransformerType", + "IfcTubeBundleType", + "IfcUnitaryEquipmentType" + ], + "IfcEquipmentElement": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcFastener": [ + "IfcFastenerType", + "IfcMechanicalFastenerType" + ], + "IfcFeatureElement": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcFeatureElementAddition": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcFeatureElementSubtraction": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcFlowController": [ + "IfcAirTerminalBoxType", + "IfcDamperType", + "IfcElectricTimeControlType", + "IfcFlowMeterType", + "IfcProtectiveDeviceType", + "IfcSwitchingDeviceType", + "IfcValveType" + ], + "IfcFlowFitting": [ + "IfcCableCarrierFittingType", + "IfcDuctFittingType", + "IfcJunctionBoxType", + "IfcPipeFittingType" + ], + "IfcFlowMovingDevice": [ + "IfcCompressorType", + "IfcFanType", + "IfcPumpType" + ], + "IfcFlowSegment": [ + "IfcCableCarrierSegmentType", + "IfcCableSegmentType", + "IfcDuctSegmentType", + "IfcPipeSegmentType" + ], + "IfcFlowStorageDevice": [ + "IfcElectricFlowStorageDeviceType", + "IfcTankType" + ], + "IfcFlowTerminal": [ + "IfcAirTerminalType", + "IfcElectricApplianceType", + "IfcElectricHeaterType", + "IfcFireSuppressionTerminalType", + "IfcGasTerminalType", + "IfcLampType", + "IfcLightFixtureType", + "IfcOutletType", + "IfcSanitaryTerminalType", + "IfcStackTerminalType", + "IfcWasteTerminalType" + ], + "IfcFlowTreatmentDevice": [ + "IfcDuctSilencerType", + "IfcFilterType" + ], + "IfcFooting": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcFurnishingElement": [ + "IfcFurnishingElementType", + "IfcFurnitureType", + "IfcSystemFurnitureElementType" + ], + "IfcMechanicalFastener": [ + "IfcMechanicalFastenerType" + ], + "IfcMember": [ + "IfcMemberType" + ], + "IfcOpeningElement": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcPile": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcPlate": [ + "IfcPlateType" + ], + "IfcProjectionElement": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcRailing": [ + "IfcRailingType" + ], + "IfcRamp": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcRampFlight": [ + "IfcRampFlightType" + ], + "IfcReinforcingBar": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcReinforcingElement": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcReinforcingMesh": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcRoof": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcRoundedEdgeFeature": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcSite": [ + "IfcSpaceType" + ], + "IfcSlab": [ + "IfcSlabType" + ], + "IfcSpace": [ + "IfcSpaceType" + ], + "IfcSpatialStructureElement": [ + "IfcSpaceType" + ], + "IfcStair": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcStairFlight": [ + "IfcStairFlightType" + ], + "IfcTendon": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcTendonAnchor": [ + "IfcBeamType", + "IfcBuildingElementProxyType", + "IfcColumnType", + "IfcCoveringType", + "IfcCurtainWallType", + "IfcMemberType", + "IfcPlateType", + "IfcRailingType", + "IfcRampFlightType", + "IfcSlabType", + "IfcStairFlightType", + "IfcWallType" + ], + "IfcTransportElement": [ + "IfcTransportElementType" + ], + "IfcVirtualElement": [ + "IfcDistributionElementType", + "IfcFurnishingElementType", + "IfcTransportElementType" + ], + "IfcWall": [ + "IfcWallType" + ], + "IfcWallStandardCase": [ + "IfcWallType" + ], + "IfcWindow": [ + "IfcWindowStyle" + ] +} \ No newline at end of file diff --git a/src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_4.json b/src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_4.json new file mode 100644 index 0000000000..23b5a2b0bd --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_4.json @@ -0,0 +1,329 @@ +{ + "IfcActuator": [ + "IFCACTUATORTYPE" + ], + "IfcAirTerminal": [ + "IFCAIRTERMINALTYPE" + ], + "IfcAirTerminalBox": [ + "IFCAIRTERMINALBOXTYPE" + ], + "IfcAirToAirHeatRecovery": [ + "IFCAIRTOAIRHEATRECOVERYTYPE" + ], + "IfcAlarm": [ + "IFCALARMTYPE" + ], + "IfcAudioVisualAppliance": [ + "IFCAUDIOVISUALAPPLIANCETYPE" + ], + "IfcBeam": [ + "IFCBEAMTYPE" + ], + "IfcBoiler": [ + "IFCBOILERTYPE" + ], + "IfcBuildingElementPart": [ + "IFCBUILDINGELEMENTPARTTYPE" + ], + "IfcBuildingElementProxy": [ + "IFCBUILDINGELEMENTPROXYTYPE" + ], + "IfcBurner": [ + "IFCBURNERTYPE" + ], + "IfcCableCarrierFitting": [ + "IFCCABLECARRIERFITTINGTYPE" + ], + "IfcCableCarrierSegment": [ + "IFCCABLECARRIERSEGMENTTYPE" + ], + "IfcCableFitting": [ + "IFCCABLEFITTINGTYPE" + ], + "IfcCableSegment": [ + "IFCCABLESEGMENTTYPE" + ], + "IfcChiller": [ + "IFCCHILLERTYPE" + ], + "IfcChimney": [ + "IFCCHIMNEYTYPE" + ], + "IfcCoil": [ + "IFCCOILTYPE" + ], + "IfcColumn": [ + "IFCCOLUMNTYPE" + ], + "IfcCommunicationsAppliance": [ + "IFCCOMMUNICATIONSAPPLIANCETYPE" + ], + "IfcCompressor": [ + "IFCCOMPRESSORTYPE" + ], + "IfcCondenser": [ + "IFCCONDENSERTYPE" + ], + "IfcController": [ + "IFCCONTROLLERTYPE" + ], + "IfcCooledBeam": [ + "IFCCOOLEDBEAMTYPE" + ], + "IfcCoolingTower": [ + "IFCCOOLINGTOWERTYPE" + ], + "IfcCovering": [ + "IFCCOVERINGTYPE" + ], + "IfcCurtainWall": [ + "IFCCURTAINWALLTYPE" + ], + "IfcDamper": [ + "IFCDAMPERTYPE" + ], + "IfcDiscreteAccessory": [ + "IFCDISCRETEACCESSORYTYPE" + ], + "IfcDistributionChamberElement": [ + "IFCDISTRIBUTIONCHAMBERELEMENTTYPE" + ], + "IfcDuctFitting": [ + "IFCDUCTFITTINGTYPE" + ], + "IfcDuctSegment": [ + "IFCDUCTSEGMENTTYPE" + ], + "IfcDuctSilencer": [ + "IFCDUCTSILENCERTYPE" + ], + "IfcElectricAppliance": [ + "IFCELECTRICAPPLIANCETYPE" + ], + "IfcElectricDistributionBoard": [ + "IFCELECTRICDISTRIBUTIONBOARDTYPE" + ], + "IfcElectricFlowStorageDevice": [ + "IFCELECTRICFLOWSTORAGEDEVICETYPE" + ], + "IfcElectricGenerator": [ + "IFCELECTRICGENERATORTYPE" + ], + "IfcElectricMotor": [ + "IFCELECTRICMOTORTYPE" + ], + "IfcElectricTimeControl": [ + "IFCELECTRICTIMECONTROLTYPE" + ], + "IfcElementAssembly": [ + "IFCELEMENTASSEMBLYTYPE" + ], + "IfcEngine": [ + "IFCENGINETYPE" + ], + "IfcEvaporativeCooler": [ + "IFCEVAPORATIVECOOLERTYPE" + ], + "IfcEvaporator": [ + "IFCEVAPORATORTYPE" + ], + "IfcFan": [ + "IFCFANTYPE" + ], + "IfcFastener": [ + "IFCFASTENERTYPE" + ], + "IfcFilter": [ + "IFCFILTERTYPE" + ], + "IfcFireSuppressionTerminal": [ + "IFCFIRESUPPRESSIONTERMINALTYPE" + ], + "IfcFlowInstrument": [ + "IFCFLOWINSTRUMENTTYPE" + ], + "IfcFlowMeter": [ + "IFCFLOWMETERTYPE" + ], + "IfcFooting": [ + "IFCFOOTINGTYPE" + ], + "IfcFurniture": [ + "IFCFURNITURETYPE" + ], + "IfcGeographicElement": [ + "IFCGEOGRAPHICELEMENTTYPE" + ], + "IfcHeatExchanger": [ + "IFCHEATEXCHANGERTYPE" + ], + "IfcHumidifier": [ + "IFCHUMIDIFIERTYPE" + ], + "IfcInterceptor": [ + "IFCINTERCEPTORTYPE" + ], + "IfcJunctionBox": [ + "IFCJUNCTIONBOXTYPE" + ], + "IfcLamp": [ + "IFCLAMPTYPE" + ], + "IfcLightFixture": [ + "IFCLIGHTFIXTURETYPE" + ], + "IfcMechanicalFastener": [ + "IFCMECHANICALFASTENERTYPE" + ], + "IfcMedicalDevice": [ + "IFCMEDICALDEVICETYPE" + ], + "IfcMember": [ + "IFCMEMBERTYPE" + ], + "IfcMotorConnection": [ + "IFCMOTORCONNECTIONTYPE" + ], + "IfcOutlet": [ + "IFCOUTLETTYPE" + ], + "IfcPile": [ + "IFCPILETYPE" + ], + "IfcPipeFitting": [ + "IFCPIPEFITTINGTYPE" + ], + "IfcPipeSegment": [ + "IFCPIPESEGMENTTYPE" + ], + "IfcPlate": [ + "IFCPLATETYPE" + ], + "IfcProtectiveDevice": [ + "IFCPROTECTIVEDEVICETYPE" + ], + "IfcProtectiveDeviceTrippingUnit": [ + "IFCPROTECTIVEDEVICETRIPPINGUNITTYPE" + ], + "IfcPump": [ + "IFCPUMPTYPE" + ], + "IfcRailing": [ + "IFCRAILINGTYPE" + ], + "IfcRamp": [ + "IFCRAMPTYPE" + ], + "IfcRampFlight": [ + "IFCRAMPFLIGHTTYPE" + ], + "IfcReinforcingBar": [ + "IFCREINFORCINGBARTYPE" + ], + "IfcReinforcingMesh": [ + "IFCREINFORCINGMESHTYPE" + ], + "IfcRoof": [ + "IFCROOFTYPE" + ], + "IfcSanitaryTerminal": [ + "IFCSANITARYTERMINALTYPE" + ], + "IfcSensor": [ + "IFCSENSORTYPE" + ], + "IfcShadingDevice": [ + "IFCSHADINGDEVICETYPE" + ], + "IfcSlab": [ + "IFCSLABTYPE" + ], + "IfcSolarDevice": [ + "IFCSOLARDEVICETYPE" + ], + "IfcSpace": [ + "IFCSPACETYPE" + ], + "IfcSpaceHeater": [ + "IFCSPACEHEATERTYPE" + ], + "IfcSpatialZone": [ + "IFCSPATIALZONETYPE" + ], + "IfcStackTerminal": [ + "IFCSTACKTERMINALTYPE" + ], + "IfcStair": [ + "IFCSTAIRTYPE" + ], + "IfcStairFlight": [ + "IFCSTAIRFLIGHTTYPE" + ], + "IfcSwitchingDevice": [ + "IFCSWITCHINGDEVICETYPE" + ], + "IfcSystemFurnitureElement": [ + "IFCSYSTEMFURNITUREELEMENTTYPE" + ], + "IfcTank": [ + "IFCTANKTYPE" + ], + "IfcTendon": [ + "IFCTENDONTYPE" + ], + "IfcTendonAnchor": [ + "IFCTENDONANCHORTYPE" + ], + "IfcTransformer": [ + "IFCTRANFORMERTYPE" + ], + "IfcTransportElement": [ + "IFCTRANSPORTELEMENTTYPE" + ], + "IfcTubeBundle": [ + "IFCTUBEBUNDLETYPE" + ], + "IfcUnitaryControlElement": [ + "IFCUNITARYCONTROLELEMENTTYPE" + ], + "IfcUnitaryEquipment": [ + "IFCUNITARYEQUIPMENTTYPE" + ], + "IfcValve": [ + "IFCVALVETYPE" + ], + "IfcVibrationIsolator": [ + "IFCVIBRATIONISOLATORTYPE" + ], + "IfcWall": [ + "IFCWALLTYPE" + ], + "IfcWasteTerminal": [ + "IFCWASTETERMINALTYPE" + ], + "IfcBeamStandardCase": [ + "IFCBEAMTYPE" + ], + "IfcColumnStandardCase": [ + "IFCCOLUMNTYPE" + ], + "IfcMemberStandardCase": [ + "IFCMEMBERTYPE" + ], + "IfcPlateStandardCase": [ + "IFCPLATETYPE" + ], + "IfcSlabElementedCase": [ + "IFCSLABTYPE" + ], + "IfcSlabStandardCase": [ + "IFCSLABTYPE" + ], + "IfcWallElementedCase": [ + "IFCWALLTYPE" + ], + "IfcWallStandardCase": [ + "IFCWALLTYPE" + ] +} \ No newline at end of file diff --git a/src/ifcopenshell-python/ifcopenshell/util/type.py b/src/ifcopenshell-python/ifcopenshell/util/type.py new file mode 100644 index 0000000000..6a6e57703c --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/util/type.py @@ -0,0 +1,29 @@ +import os +import json + +cwd = os.path.dirname(os.path.realpath(__file__)) + +entity_to_type_map = {} +type_to_entity_map = {} + +with open(os.path.join(cwd, "entity_to_type_map_2x3.json")) as f: + entity_to_type_map["IFC2X3"] = json.load(f) + +with open(os.path.join(cwd, "entity_to_type_map_4.json")) as f: + entity_to_type_map["IFC4"] = json.load(f) + +type_to_entity_map["IFC2X3"] = { + value: [key] for key in entity_to_type_map["IFC2X3"] for value in entity_to_type_map["IFC2X3"][key] +} + +type_to_entity_map["IFC4"] = { + value: [key] for key in entity_to_type_map["IFC4"] for value in entity_to_type_map["IFC4"][key] +} + + +def get_applicable_types(ifc_class, schema="IFC4"): + return entity_to_type_map[schema].get(ifc_class, []) + + +def get_applicable_entities(ifc_type_class, schema="IFC4"): + return type_to_entity_map[schema].get(ifc_type_class, [])