mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-27 18:57:17 +00:00
Fix #4484. Clarify inheritance rules of predefined types.
This commit is contained in:
@@ -42,6 +42,7 @@ class IfcClassData:
|
|||||||
cls.data["contexts"] = cls.contexts()
|
cls.data["contexts"] = cls.contexts()
|
||||||
cls.data["has_entity"] = cls.has_entity()
|
cls.data["has_entity"] = cls.has_entity()
|
||||||
cls.data["name"] = cls.name()
|
cls.data["name"] = cls.name()
|
||||||
|
cls.data["has_inherited_predefined_type"] = cls.has_inherited_predefined_type()
|
||||||
cls.data["ifc_class"] = cls.ifc_class()
|
cls.data["ifc_class"] = cls.ifc_class()
|
||||||
cls.data["ifc_predefined_types"] = cls.ifc_predefined_types()
|
cls.data["ifc_predefined_types"] = cls.ifc_predefined_types()
|
||||||
cls.data["can_reassign_class"] = cls.can_reassign_class()
|
cls.data["can_reassign_class"] = cls.can_reassign_class()
|
||||||
@@ -162,6 +163,15 @@ class IfcClassData:
|
|||||||
name += f"[{predefined_type}]"
|
name += f"[{predefined_type}]"
|
||||||
return name
|
return name
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def has_inherited_predefined_type(cls):
|
||||||
|
element = tool.Ifc.get_entity(bpy.context.view_layer.objects.active)
|
||||||
|
if not element:
|
||||||
|
return
|
||||||
|
if element_type := ifcopenshell.util.element.get_type(element):
|
||||||
|
return ifcopenshell.util.element.get_predefined_type(element_type) != "NOTDEFINED"
|
||||||
|
return False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def ifc_class(cls):
|
def ifc_class(cls):
|
||||||
element = tool.Ifc.get_entity(bpy.context.view_layer.objects.active)
|
element = tool.Ifc.get_entity(bpy.context.view_layer.objects.active)
|
||||||
|
|||||||
@@ -61,7 +61,10 @@ class BIM_PT_class(Panel):
|
|||||||
self.layout.prop(context.scene.BIMRootProperties, "relating_class_object", icon="COPYDOWN")
|
self.layout.prop(context.scene.BIMRootProperties, "relating_class_object", icon="COPYDOWN")
|
||||||
else:
|
else:
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.label(text=IfcClassData.data["name"])
|
row.label(
|
||||||
|
text=IfcClassData.data["name"],
|
||||||
|
icon="CON_CHILDOF" if IfcClassData.data["has_inherited_predefined_type"] else "NONE",
|
||||||
|
)
|
||||||
row.operator("bim.select_ifc_class", text="", icon="RESTRICT_SELECT_OFF")
|
row.operator("bim.select_ifc_class", text="", icon="RESTRICT_SELECT_OFF")
|
||||||
row.operator("bim.unlink_object", icon="UNLINKED", text="")
|
row.operator("bim.unlink_object", icon="UNLINKED", text="")
|
||||||
if IfcClassData.data["can_reassign_class"]:
|
if IfcClassData.data["can_reassign_class"]:
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ def get_pset(
|
|||||||
element: ifcopenshell.entity_instance,
|
element: ifcopenshell.entity_instance,
|
||||||
name: str,
|
name: str,
|
||||||
prop: Optional[str] = None,
|
prop: Optional[str] = None,
|
||||||
psets_only=False,
|
psets_only: bool = False,
|
||||||
qtos_only=False,
|
qtos_only: bool = False,
|
||||||
should_inherit=True,
|
should_inherit: bool = True,
|
||||||
verbose=False,
|
verbose: bool = False,
|
||||||
) -> Union[Any, dict[str, Any]]:
|
) -> Union[Any, dict[str, Any]]:
|
||||||
"""Retrieve a single property set or single property
|
"""Retrieve a single property set or single property
|
||||||
|
|
||||||
@@ -429,8 +429,7 @@ def get_predefined_type(element: ifcopenshell.entity_instance) -> str:
|
|||||||
element = ifcopenshell.by_type("IfcWall")[0]
|
element = ifcopenshell.by_type("IfcWall")[0]
|
||||||
predefined_type = ifcopenshell.util.element.get_predefined_type(element)
|
predefined_type = ifcopenshell.util.element.get_predefined_type(element)
|
||||||
"""
|
"""
|
||||||
element_type = get_type(element)
|
if element_type := get_type(element):
|
||||||
if element_type:
|
|
||||||
predefined_type = getattr(element_type, "PredefinedType", None)
|
predefined_type = getattr(element_type, "PredefinedType", None)
|
||||||
if predefined_type == "USERDEFINED" or not predefined_type:
|
if predefined_type == "USERDEFINED" or not predefined_type:
|
||||||
predefined_type = getattr(element_type, "ElementType", ...)
|
predefined_type = getattr(element_type, "ElementType", ...)
|
||||||
@@ -563,7 +562,9 @@ def get_material(
|
|||||||
return get_material(relating_type, should_skip_usage)
|
return get_material(relating_type, should_skip_usage)
|
||||||
|
|
||||||
|
|
||||||
def get_materials(element: ifcopenshell.entity_instance, should_inherit=True) -> list[ifcopenshell.entity_instance]:
|
def get_materials(
|
||||||
|
element: ifcopenshell.entity_instance, should_inherit: bool = True
|
||||||
|
) -> list[ifcopenshell.entity_instance]:
|
||||||
"""Gets individual materials of an element
|
"""Gets individual materials of an element
|
||||||
|
|
||||||
If the element has a material set, the individual materials of that set are
|
If the element has a material set, the individual materials of that set are
|
||||||
@@ -826,7 +827,7 @@ def get_layers(
|
|||||||
|
|
||||||
|
|
||||||
def get_container(
|
def get_container(
|
||||||
element: ifcopenshell.entity_instance, should_get_direct=False, ifc_class: Optional[str] = None
|
element: ifcopenshell.entity_instance, should_get_direct: bool = False, ifc_class: Optional[str] = None
|
||||||
) -> ifcopenshell.entity_instance:
|
) -> ifcopenshell.entity_instance:
|
||||||
"""
|
"""
|
||||||
Retrieves the spatial structure container of an element.
|
Retrieves the spatial structure container of an element.
|
||||||
|
|||||||
@@ -291,6 +291,16 @@ class TestGetPredefinedTypeIFC4(test.bootstrap.IFC4):
|
|||||||
element_type.ProcessType = "FOOBAR"
|
element_type.ProcessType = "FOOBAR"
|
||||||
assert subject.get_predefined_type(element) == "FOOBAR"
|
assert subject.get_predefined_type(element) == "FOOBAR"
|
||||||
|
|
||||||
|
def test_getting_an_element_type_predefined_type(self):
|
||||||
|
element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType")
|
||||||
|
element_type.PredefinedType = "PARTITIONING"
|
||||||
|
assert subject.get_predefined_type(element_type) == "PARTITIONING"
|
||||||
|
|
||||||
|
def test_getting_an_element_type_null_predefined_type(self):
|
||||||
|
element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType")
|
||||||
|
element_type.PredefinedType = "NOTDEFINED"
|
||||||
|
assert subject.get_predefined_type(element_type) == "NOTDEFINED"
|
||||||
|
|
||||||
|
|
||||||
class TestGetTypeIFC4(test.bootstrap.IFC4):
|
class TestGetTypeIFC4(test.bootstrap.IFC4):
|
||||||
def test_getting_the_type_of_a_product(self):
|
def test_getting_the_type_of_a_product(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user