Fix #2753. Disable mapping representations when appending assets via the ExtractElements recipe to be more forgiving (and faster) on invalid models.

This commit is contained in:
Dion Moult
2023-08-09 00:13:16 +10:00
parent fea0d93162
commit 0f68679295
2 changed files with 17 additions and 9 deletions
@@ -172,6 +172,7 @@ class Usecase:
should_run_listeners=False, should_run_listeners=False,
related_object=element, related_object=element,
relating_type=new_type, relating_type=new_type,
should_map_representations=False,
) )
ifcopenshell.api.owner.settings.restore() ifcopenshell.api.owner.settings.restore()
@@ -22,7 +22,7 @@ import ifcopenshell.util.element
class Usecase: class Usecase:
def __init__(self, file, related_object=None, relating_type=None): def __init__(self, file, related_object=None, relating_type=None, should_map_representations=True):
"""Assigns a type to an occurrence of an object """Assigns a type to an occurrence of an object
IFC supports the concept of occurrences and types. An occurrence is an IFC supports the concept of occurrences and types. An occurrence is an
@@ -87,6 +87,11 @@ class Usecase:
:type related_object: ifcopenshell.entity_instance.entity_instance :type related_object: ifcopenshell.entity_instance.entity_instance
:param relating_type: The IfcElementType type. :param relating_type: The IfcElementType type.
:type relating_type: ifcopenshell.entity_instance.entity_instance :type relating_type: ifcopenshell.entity_instance.entity_instance
:param should_map_representations: If a type has a representation map,
IFC requires all occurrences to map those representations. Some IFC
vendors might disobey this, or you might want to handle it
yourself. In this scenario, you may set this to False.
:type should_map_representations: bool
:return: The IfcRelDefinesByType relationship :return: The IfcRelDefinesByType relationship
:rtype: ifcopenshell.entity_instance.entity_instance :rtype: ifcopenshell.entity_instance.entity_instance
@@ -164,6 +169,7 @@ class Usecase:
self.settings = { self.settings = {
"related_object": related_object, "related_object": related_object,
"relating_type": relating_type, "relating_type": relating_type,
"should_map_representations": should_map_representations,
} }
def execute(self): def execute(self):
@@ -207,14 +213,15 @@ class Usecase:
} }
) )
if getattr(self.settings["relating_type"], "RepresentationMaps", None): if self.settings["should_map_representations"]:
ifcopenshell.api.run( if getattr(self.settings["relating_type"], "RepresentationMaps", None):
"type.map_type_representations", ifcopenshell.api.run(
self.file, "type.map_type_representations",
related_object=self.settings["related_object"], self.file,
relating_type=self.settings["relating_type"], related_object=self.settings["related_object"],
) relating_type=self.settings["relating_type"],
self.map_material_usages() )
self.map_material_usages()
return types return types
def map_material_usages(self): def map_material_usages(self):