mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-23 04:39:54 +00:00
Fix bug where nested aggregates were not nested in the Blender scene during import
This commit is contained in:
@@ -301,7 +301,6 @@ class IfcImporter:
|
|||||||
self.native_elements = {}
|
self.native_elements = {}
|
||||||
self.native_data = {}
|
self.native_data = {}
|
||||||
self.aggregates = {}
|
self.aggregates = {}
|
||||||
self.aggregate_collections = {}
|
|
||||||
|
|
||||||
self.material_creator = MaterialCreator(ifc_import_settings, self)
|
self.material_creator = MaterialCreator(ifc_import_settings, self)
|
||||||
|
|
||||||
@@ -333,6 +332,8 @@ class IfcImporter:
|
|||||||
self.profile_code("Create spatial hierarchy")
|
self.profile_code("Create spatial hierarchy")
|
||||||
self.create_aggregates()
|
self.create_aggregates()
|
||||||
self.profile_code("Create aggregates")
|
self.profile_code("Create aggregates")
|
||||||
|
self.create_aggregate_tree()
|
||||||
|
self.profile_code("Create aggregate tree")
|
||||||
self.create_openings_collection()
|
self.create_openings_collection()
|
||||||
self.profile_code("Create opening collection")
|
self.profile_code("Create opening collection")
|
||||||
self.process_element_filter()
|
self.process_element_filter()
|
||||||
@@ -1212,29 +1213,32 @@ class IfcImporter:
|
|||||||
for rel_aggregate in rel_aggregates:
|
for rel_aggregate in rel_aggregates:
|
||||||
self.create_aggregate(rel_aggregate)
|
self.create_aggregate(rel_aggregate)
|
||||||
|
|
||||||
|
def create_aggregate_tree(self):
|
||||||
|
for aggregate in self.aggregates.values():
|
||||||
|
if aggregate["container"].is_a("IfcSpatialStructureElement"):
|
||||||
|
self.spatial_structure_elements[aggregate["container"].GlobalId]["blender"].children.link(aggregate["blender"])
|
||||||
|
else:
|
||||||
|
self.aggregates[aggregate["container"].GlobalId]["blender"].children.link(aggregate["blender"])
|
||||||
|
|
||||||
def create_aggregate(self, rel_aggregate):
|
def create_aggregate(self, rel_aggregate):
|
||||||
element = rel_aggregate.RelatingObject
|
element = rel_aggregate.RelatingObject
|
||||||
|
|
||||||
obj = bpy.data.objects.new("{}/{}".format(element.is_a(), element.Name), None)
|
obj = bpy.data.objects.new("{}/{}".format(element.is_a(), element.Name), None)
|
||||||
self.link_element(element, obj)
|
self.link_element(element, obj)
|
||||||
|
|
||||||
container = self.get_aggregate_spatial_container(element)
|
|
||||||
container_collection = self.spatial_structure_elements[container.GlobalId]["blender"]
|
|
||||||
|
|
||||||
collection = bpy.data.collections.new(obj.name)
|
collection = bpy.data.collections.new(obj.name)
|
||||||
container_collection.children.link(collection)
|
|
||||||
collection.objects.link(obj)
|
collection.objects.link(obj)
|
||||||
|
self.aggregates[element.GlobalId] = {
|
||||||
|
"blender": collection,
|
||||||
|
"blender_obj": obj,
|
||||||
|
"container": self.get_aggregate_container(element)
|
||||||
|
}
|
||||||
|
|
||||||
self.aggregates[element.GlobalId] = obj
|
def get_aggregate_container(self, element):
|
||||||
self.aggregate_collections[rel_aggregate.id()] = collection
|
|
||||||
|
|
||||||
def get_aggregate_spatial_container(self, element):
|
|
||||||
if hasattr(element, "ContainedInStructure") and element.ContainedInStructure:
|
if hasattr(element, "ContainedInStructure") and element.ContainedInStructure:
|
||||||
container = element.ContainedInStructure[0].RelatingStructure
|
container = element.ContainedInStructure[0].RelatingStructure
|
||||||
elif hasattr(element, "Decomposes") and element.Decomposes:
|
elif hasattr(element, "Decomposes") and element.Decomposes:
|
||||||
return self.get_aggregate_spatial_container(element.Decomposes[0].RelatingObject)
|
container = element.Decomposes[0].RelatingObject
|
||||||
if container.is_a("IfcSpace"):
|
if container.is_a("IfcSpace"):
|
||||||
return self.get_aggregate_spatial_container(container)
|
return self.get_aggregate_container(container)
|
||||||
return container
|
return container
|
||||||
|
|
||||||
def create_openings_collection(self):
|
def create_openings_collection(self):
|
||||||
@@ -1265,6 +1269,8 @@ class IfcImporter:
|
|||||||
return
|
return
|
||||||
elif element.is_a("IfcTypeObject"):
|
elif element.is_a("IfcTypeObject"):
|
||||||
self.type_collection.objects.link(obj)
|
self.type_collection.objects.link(obj)
|
||||||
|
elif element.GlobalId in self.aggregates:
|
||||||
|
return
|
||||||
elif element.GlobalId in self.spatial_structure_elements:
|
elif element.GlobalId in self.spatial_structure_elements:
|
||||||
if not obj.data:
|
if not obj.data:
|
||||||
return
|
return
|
||||||
@@ -1312,7 +1318,7 @@ class IfcImporter:
|
|||||||
if not collection:
|
if not collection:
|
||||||
return self.place_object_in_spatial_tree(element.Decomposes[0].RelatingObject, obj)
|
return self.place_object_in_spatial_tree(element.Decomposes[0].RelatingObject, obj)
|
||||||
else:
|
else:
|
||||||
collection = self.aggregate_collections[element.Decomposes[0].id()]
|
collection = self.aggregates[element.Decomposes[0].RelatingObject.GlobalId]["blender"]
|
||||||
if collection:
|
if collection:
|
||||||
collection.objects.link(obj)
|
collection.objects.link(obj)
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user