property set extraction (#2)

This commit is contained in:
Jedd Morgan
2025-06-20 13:59:07 +01:00
committed by GitHub
parent 5459e81dbe
commit b32d3c3805
3 changed files with 56 additions and 2 deletions
@@ -4,6 +4,8 @@ from ifcopenshell.entity_instance import entity_instance
from specklepy.objects.base import Base
from specklepy.objects.data_objects import DataObject
from speckleifc.property_extraction import extract_properties
def data_object_to_speckle(
display_value: list[Base],
@@ -15,7 +17,7 @@ def data_object_to_speckle(
data_object = DataObject(
applicationId=guid,
properties={},
properties=extract_properties(step_element),
name=name or guid,
displayValue=display_value,
)
@@ -5,6 +5,8 @@ from specklepy.objects.base import Base
from specklepy.objects.data_objects import DataObject
from specklepy.objects.models.collections.collection import Collection
from speckleifc.property_extraction import extract_properties
def spatial_element_to_speckle(
display_value: list[Base],
@@ -31,7 +33,7 @@ def _convert_as_data_object(
name = cast(str, step_element.Name or step_element.LongName or guid)
data_object = DataObject(
applicationId=guid,
properties={},
properties=extract_properties(step_element),
name=name,
displayValue=display_value,
)
+50
View File
@@ -0,0 +1,50 @@
from typing import Any
from ifcopenshell.entity_instance import entity_instance
def extract_properties(element: entity_instance) -> dict[str, object]:
result: dict[str, object] = {}
for rel in getattr(element, "IsDefinedBy", []):
if not rel.is_a("IfcRelDefinesByProperties"):
continue
prop_set = rel.RelatingPropertyDefinition
if not prop_set.is_a("IfcPropertySet"):
continue
set_name = prop_set.Name
properties: dict[str, Any] = {}
for prop in prop_set.HasProperties:
name = prop.Name
if prop.is_a("IfcPropertySingleValue"):
val = prop.NominalValue
if val is not None:
properties[name] = (
val.wrappedValue if hasattr(val, "wrappedValue") else val
)
elif prop.is_a("IfcPropertyListValue"):
values = getattr(prop, "ListValues", None)
if values:
properties[name] = [
v.wrappedValue if hasattr(v, "wrappedValue") else v
for v in values
]
elif prop.is_a("IfcPropertyEnumeratedValue"):
values = getattr(prop, "EnumerationValues", None)
if values:
properties[name] = [
v.wrappedValue if hasattr(v, "wrappedValue") else v
for v in values
]
# elif prop.is_a("IfcPropertyTableValue"):
# properties[name] = #not sure if we want to support these...
if properties:
result[set_name] = properties
return result