Fixed version of f3f7939c8b + get_element_zones

This commit is contained in:
Andrej730
2025-03-11 12:06:25 +05:00
parent ed0b1c5009
commit 64f51d733e
4 changed files with 26 additions and 9 deletions
+5 -2
View File
@@ -267,5 +267,8 @@ class ActiveObjectZonesData:
@classmethod
def zones(cls):
systems = ifcopenshell.util.system.get_element_systems(tool.Ifc.get_entity(bpy.context.active_object))
return [s.Name or "Unnamed" for s in systems if s.is_a("IfcZone")]
obj = bpy.context.active_object
assert obj
element = tool.Ifc.get_entity(obj)
assert element
return [z.Name or "Unnamed" for z in ifcopenshell.util.system.get_element_zones(element)]
@@ -194,6 +194,7 @@ Valid keys are:
"``classification``", "Gets the element's classification reference(s)"
"``group``", "Gets the element's group(s)"
"``system``", "Gets the element's system(s). This is a subset of group(s)."
"``zone``", "Gets the element's zone(s). This is a subset of group(s)."
"``material`` or ``mat``", "Gets the assigned material, which may be a material set."
"``item`` or ``i``", "If the previous key returns a material set, gets the relevant material set items"
"``materials`` or ``mats``", "Gets a list of IfcMaterials assigned directly or indirectly (such as via a material set) to the element"
@@ -347,6 +347,8 @@ def _get_element_value(element: ifcopenshell.entity_instance, keys: list[str]) -
value = ifcopenshell.util.element.get_groups(value)
elif key == "system":
value = ifcopenshell.util.system.get_element_systems(value)
elif key == "zone":
value = ifcopenshell.util.system.get_element_zones(value)
elif key in ("x", "y", "z", "easting", "northing", "elevation") and hasattr(value, "ObjectPlacement"):
if getattr(value, "ObjectPlacement", None):
matrix = ifcopenshell.util.placement.get_local_placement(value.ObjectPlacement)
@@ -66,13 +66,24 @@ def get_system_elements(system: ifcopenshell.entity_instance) -> list[ifcopenshe
def get_element_systems(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]:
results = []
for rel in element.HasAssignments:
if rel.is_a("IfcRelAssignsToGroup") and rel.RelatingGroup.is_a() in (
"IfcSystem",
"IfcDistributionSystem",
"IfcBuildingSystem",
"IfcZone",
):
results.append(rel.RelatingGroup)
if rel.is_a("IfcRelAssignsToGroup"):
continue
group = rel.RelatingGroup
if not group.is_a("IfcSystem") or group.is_a() in ("IfcStructuralAnalysisModel", "IfcZone"):
continue
results.append(group)
return results
def get_element_zones(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]:
results = []
for rel in element.HasAssignments:
if rel.is_a("IfcRelAssignsToGroup"):
continue
group = rel.RelatingGroup
if not group.is_a("IfcZone"):
continue
results.append(group)
return results