diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index e9325feabf..44f8e1b2f4 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -4,32 +4,50 @@ def get_psets(element): if element.is_a('IfcTypeObject'): if element.HasPropertySets: for definition in element.HasPropertySets: - psets[definition.Name] = get_properties(definition) + psets[definition.Name] = get_property_definition(definition) else: for relationship in element.IsDefinedBy: if relationship.is_a('IfcRelDefinesByProperties'): definition = relationship.RelatingPropertyDefinition - psets[definition.Name] = get_properties(definition) + psets[definition.Name] = get_property_definition(definition) except Exception as e: import traceback print('failed to load properties: {}'.format(e)) traceback.print_exc() return psets -def get_properties(definition): + +def get_property_definition(definition): if definition is not None: props = {} if definition.is_a('IfcElementQuantity'): - for q in definition.Quantities: - if q.is_a('IfcPhysicalSimpleQuantity'): - props[q.Name] = q[3] + props.update(get_quantities(definition.Quantities)) elif definition.is_a('IfcPropertySet'): - for prop in definition.HasProperties: - if prop.is_a('IfcPropertySingleValue'): - props[prop.Name] = prop.NominalValue + props.update(get_properties(definition.HasProperties)) else: # Entity introduced in IFC4 # definition.is_a('IfcPreDefinedPropertySet'): for prop in range(4, len(definition)): props[definition.attribute_name(prop)] = definition[prop] return props + + +def get_quantities(quantities): + results = {} + for quantity in quantities: + if quantity.is_a('IfcPhysicalSimpleQuantity'): + results[quantity.Name] = quantity[3] + return results + + +def get_properties(properties): + results = {} + for prop in properties: + if prop.is_a('IfcPropertySingleValue'): + results[prop.Name] = prop.NominalValue + elif prop.is_a('IfcComplexProperty'): + data = prop.get_info() + data['properties'] = get_properties(prop.HasProperties) + del(data['HasProperties']) + results[prop.Name] = data + return results