mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 17:31:45 +00:00
More general solution for #3466
This commit is contained in:
@@ -76,9 +76,10 @@ def generate_ifc4_entity_map(filepath, schema_name, manual_corrections={}):
|
|||||||
|
|
||||||
type_to_entity_map = {value: [key] for key in entity_to_type_map for value in entity_to_type_map[key]}
|
type_to_entity_map = {value: [key] for key in entity_to_type_map for value in entity_to_type_map[key]}
|
||||||
|
|
||||||
|
check_all_types_are_mapped(schema, type_to_entity_map)
|
||||||
schema_version = schema_name.lower().strip("ifc")
|
schema_version = schema_name.lower().strip("ifc")
|
||||||
with open(f"src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_{schema_version}.json", "w") as f:
|
with open(f"src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_{schema_version}.json", "w") as f:
|
||||||
json.dump(entity_to_type_map, f, indent=4)
|
json.dump(entity_to_type_map, f, indent=4, sort_keys=False)
|
||||||
|
|
||||||
return entity_to_type_map
|
return entity_to_type_map
|
||||||
|
|
||||||
@@ -120,13 +121,26 @@ def generate_ifc2x3_entity_map():
|
|||||||
entity_to_type_map.setdefault(declaration.name(), []).append(subtype.name())
|
entity_to_type_map.setdefault(declaration.name(), []).append(subtype.name())
|
||||||
|
|
||||||
type_to_entity_map2x3 = {value: [key] for key in entity_to_type_map for value in entity_to_type_map[key]}
|
type_to_entity_map2x3 = {value: [key] for key in entity_to_type_map for value in entity_to_type_map[key]}
|
||||||
|
check_all_types_are_mapped(schema2x3, type_to_entity_map2x3)
|
||||||
|
|
||||||
with open("src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_2x3.json", "w") as f:
|
with open("src/ifcopenshell-python/ifcopenshell/util/entity_to_type_map_2x3.json", "w") as f:
|
||||||
json.dump(entity_to_type_map, f, indent=4)
|
json.dump(entity_to_type_map, f, indent=4, sort_keys=False)
|
||||||
|
|
||||||
return entity_to_type_map
|
return entity_to_type_map
|
||||||
|
|
||||||
|
|
||||||
|
def check_all_types_are_mapped(schema, type_to_entity_map):
|
||||||
|
def is_element_type(declaration):
|
||||||
|
if not hasattr(declaration, "supertype"):
|
||||||
|
return False
|
||||||
|
return ifcopenshell.util.schema.is_a(declaration, "IfcElementType")
|
||||||
|
|
||||||
|
for declaration in schema.declarations():
|
||||||
|
type_name = declaration.name()
|
||||||
|
if is_element_type(declaration) and type_name not in type_to_entity_map and not declaration.is_abstract():
|
||||||
|
print(f"WARNING. {type_name} (not abstract) is not present in the mapping {schema.name()}.")
|
||||||
|
|
||||||
|
|
||||||
# specs: https://technical.buildingsmart.org/standards/ifc/ifc-schema-specifications
|
# specs: https://technical.buildingsmart.org/standards/ifc/ifc-schema-specifications
|
||||||
# ifc4x3 - https://github.com/buildingSMART/IFC4.3-html/releases/tag/sep-13-release (inside .zip)
|
# ifc4x3 - https://github.com/buildingSMART/IFC4.3-html/releases/tag/sep-13-release (inside .zip)
|
||||||
# ifc4 - https://standards.buildingsmart.org/IFC/RELEASE/IFC4/FINAL/EXPRESS/IFC4.exp
|
# ifc4 - https://standards.buildingsmart.org/IFC/RELEASE/IFC4/FINAL/EXPRESS/IFC4.exp
|
||||||
@@ -136,6 +150,9 @@ def generate_ifc2x3_entity_map():
|
|||||||
|
|
||||||
ifc4x3_corrections = {
|
ifc4x3_corrections = {
|
||||||
"IfcCivilElement": ["IfcCivilElementType"],
|
"IfcCivilElement": ["IfcCivilElementType"],
|
||||||
|
"IfcFurnishingElement": ["IfcFurnishingElementType"],
|
||||||
|
"IfcDistributionElement": ["IfcDistributionElementType"],
|
||||||
|
"IfcBuiltElement": ["IfcBuiltElementType"],
|
||||||
}
|
}
|
||||||
entity_to_type_map4x3 = generate_ifc4_entity_map("IFC4X3_TC1.exp", "ifc4x3", ifc4x3_corrections)
|
entity_to_type_map4x3 = generate_ifc4_entity_map("IFC4X3_TC1.exp", "ifc4x3", ifc4x3_corrections)
|
||||||
|
|
||||||
@@ -144,6 +161,8 @@ ifc4_corrections = {
|
|||||||
"IfcDoor": ["IfcDoorStyle"], # also will apply change to IfcDoorStandardCase
|
"IfcDoor": ["IfcDoorStyle"], # also will apply change to IfcDoorStandardCase
|
||||||
"IfcWindow": ["IfcWindowStyle"], # also will aply change to IfcWindowStandardCase
|
"IfcWindow": ["IfcWindowStyle"], # also will aply change to IfcWindowStandardCase
|
||||||
"IfcCivilElement": ["IfcCivilElementType"],
|
"IfcCivilElement": ["IfcCivilElementType"],
|
||||||
|
"IfcFurnishingElement": ["IfcFurnishingElementType"],
|
||||||
|
"IfcDistributionElement": ["IfcDistributionElementType"],
|
||||||
}
|
}
|
||||||
#
|
#
|
||||||
entity_to_type_map4 = generate_ifc4_entity_map("IFC4.exp", "ifc4", ifc4_corrections)
|
entity_to_type_map4 = generate_ifc4_entity_map("IFC4.exp", "ifc4", ifc4_corrections)
|
||||||
|
|||||||
@@ -50,9 +50,6 @@
|
|||||||
"IfcChimney": [
|
"IfcChimney": [
|
||||||
"IfcChimneyType"
|
"IfcChimneyType"
|
||||||
],
|
],
|
||||||
"IfcCivilElement": [
|
|
||||||
"IfcCivilElementType"
|
|
||||||
],
|
|
||||||
"IfcCoil": [
|
"IfcCoil": [
|
||||||
"IfcCoilType"
|
"IfcCoilType"
|
||||||
],
|
],
|
||||||
@@ -92,9 +89,6 @@
|
|||||||
"IfcDistributionChamberElement": [
|
"IfcDistributionChamberElement": [
|
||||||
"IfcDistributionChamberElementType"
|
"IfcDistributionChamberElementType"
|
||||||
],
|
],
|
||||||
"IfcDistributionElement": [
|
|
||||||
"IfcDistributionElementType"
|
|
||||||
],
|
|
||||||
"IfcDoor": [
|
"IfcDoor": [
|
||||||
"IfcDoorType",
|
"IfcDoorType",
|
||||||
"IfcDoorStyle"
|
"IfcDoorStyle"
|
||||||
@@ -159,9 +153,6 @@
|
|||||||
"IfcFooting": [
|
"IfcFooting": [
|
||||||
"IfcFootingType"
|
"IfcFootingType"
|
||||||
],
|
],
|
||||||
"IfcFurnishingElement": [
|
|
||||||
"IfcFurnishingElementType"
|
|
||||||
],
|
|
||||||
"IfcFurniture": [
|
"IfcFurniture": [
|
||||||
"IfcFurnitureType"
|
"IfcFurnitureType"
|
||||||
],
|
],
|
||||||
@@ -319,16 +310,55 @@
|
|||||||
"IfcWindowType",
|
"IfcWindowType",
|
||||||
"IfcWindowStyle"
|
"IfcWindowStyle"
|
||||||
],
|
],
|
||||||
|
"IfcCivilElement": [
|
||||||
|
"IfcCivilElementType"
|
||||||
|
],
|
||||||
|
"IfcFurnishingElement": [
|
||||||
|
"IfcFurnishingElementType"
|
||||||
|
],
|
||||||
|
"IfcDistributionElement": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
"IfcBeamStandardCase": [
|
"IfcBeamStandardCase": [
|
||||||
"IfcBeamType"
|
"IfcBeamType"
|
||||||
],
|
],
|
||||||
"IfcColumnStandardCase": [
|
"IfcColumnStandardCase": [
|
||||||
"IfcColumnType"
|
"IfcColumnType"
|
||||||
],
|
],
|
||||||
|
"IfcDistributionControlElement": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcDistributionFlowElement": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
"IfcDoorStandardCase": [
|
"IfcDoorStandardCase": [
|
||||||
"IfcDoorType",
|
"IfcDoorType",
|
||||||
"IfcDoorStyle"
|
"IfcDoorStyle"
|
||||||
],
|
],
|
||||||
|
"IfcEnergyConversionDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowController": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowFitting": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowMovingDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowSegment": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowStorageDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowTerminal": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowTreatmentDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
"IfcMemberStandardCase": [
|
"IfcMemberStandardCase": [
|
||||||
"IfcMemberType"
|
"IfcMemberType"
|
||||||
],
|
],
|
||||||
@@ -351,4 +381,4 @@
|
|||||||
"IfcWindowType",
|
"IfcWindowType",
|
||||||
"IfcWindowStyle"
|
"IfcWindowStyle"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -374,6 +374,54 @@
|
|||||||
"IfcCivilElement": [
|
"IfcCivilElement": [
|
||||||
"IfcCivilElementType"
|
"IfcCivilElementType"
|
||||||
],
|
],
|
||||||
|
"IfcFurnishingElement": [
|
||||||
|
"IfcFurnishingElementType"
|
||||||
|
],
|
||||||
|
"IfcDistributionElement": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcBuiltElement": [
|
||||||
|
"IfcBuiltElementType"
|
||||||
|
],
|
||||||
|
"IfcDistributionControlElement": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcDistributionFlowElement": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcEarthworksElement": [
|
||||||
|
"IfcBuiltElementType"
|
||||||
|
],
|
||||||
|
"IfcEarthworksFill": [
|
||||||
|
"IfcBuiltElementType"
|
||||||
|
],
|
||||||
|
"IfcEnergyConversionDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowController": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowFitting": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowMovingDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowSegment": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowStorageDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowTerminal": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcFlowTreatmentDevice": [
|
||||||
|
"IfcDistributionElementType"
|
||||||
|
],
|
||||||
|
"IfcReinforcedSoil": [
|
||||||
|
"IfcBuiltElementType"
|
||||||
|
],
|
||||||
"IfcWallStandardCase": [
|
"IfcWallStandardCase": [
|
||||||
"IfcWallType"
|
"IfcWallType"
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user