diff --git a/src/ifcblenderexport/blenderbim/bim/module/root/operator.py b/src/ifcblenderexport/blenderbim/bim/module/root/operator.py index e1f7a3b41f..aee0ecbead 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/root/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/root/operator.py @@ -8,6 +8,7 @@ import blenderbim.bim.module.geometry.add_representation as add_representation import blenderbim.bim.module.geometry.assign_styles as assign_styles import blenderbim.bim.module.geometry.assign_representation as assign_representation import blenderbim.bim.module.geometry.add_object_placement as add_object_placement +import blenderbim.bim.module.spatial.assign_container as assign_container from blenderbim.bim.ifc import IfcStore @@ -136,8 +137,26 @@ class AssignClass(bpy.types.Operator): ) usecase.execute() + relating_structure = None + for collection in obj.users_collection: + if "Ifc" in collection.name: + relating_structure = self.file.by_id( + bpy.data.objects.get(collection.name).BIMObjectProperties.ifc_definition_id + ) + break + + if relating_structure: + usecase = assign_container.Usecase( + self.file, + { + "product": product, + "relating_structure": relating_structure, + }, + ) + usecase.execute() + obj.name = "{}/{}".format(bpy.context.scene.BIMProperties.ifc_class, obj.name) - obj.BIMObjectProperties.ifc_definition_id = int(result.id()) + obj.BIMObjectProperties.ifc_definition_id = int(product.id()) if bpy.context.scene.BIMProperties.ifc_product == "IfcElementType": self.place_in_types_collection(obj) return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/assign_container.py b/src/ifcblenderexport/blenderbim/bim/module/spatial/assign_container.py index 7e0da2739f..29192b9877 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/assign_container.py +++ b/src/ifcblenderexport/blenderbim/bim/module/spatial/assign_container.py @@ -15,7 +15,7 @@ class Usecase: contained_in_structure = self.settings["product"].ContainedInStructure contains_elements = self.settings["relating_structure"].ContainsElements - if contained_in_structure == contains_elements: + if contains_elements and contained_in_structure == contains_elements: return if contained_in_structure: diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/data.py b/src/ifcblenderexport/blenderbim/bim/module/spatial/data.py index 58007f0ae7..b460defc52 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/data.py +++ b/src/ifcblenderexport/blenderbim/bim/module/spatial/data.py @@ -10,9 +10,8 @@ class Data: if not file: return product = file.by_id(product_id) - element = product.ContainedInStructure[0].RelatingStructure if product.ContainedInStructure else None - cls.products[product_id] = { - "type": element.is_a() if element else None, - "Name": element.Name if element else None, - "id": int(element.id()) if element else None - } + if product.ContainedInStructure: + structure = product.ContainedInStructure[0].RelatingStructure + cls.products[product_id] = {"type": structure.is_a(), "Name": structure.Name, "id": int(structure.id())} + else: + cls.products[product_id] = {"type": None, "Name": None, "id": None} diff --git a/src/ifcblenderexport/blenderbim/bim/module/spatial/operator.py b/src/ifcblenderexport/blenderbim/bim/module/spatial/operator.py index c78b24de0b..9b2fb50d0e 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/spatial/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/module/spatial/operator.py @@ -18,6 +18,7 @@ class AssignContainer(bpy.types.Operator): relating_structure = self.file.by_id( bpy.data.objects.get(collection.name).BIMObjectProperties.ifc_definition_id ) + break if not relating_structure: return {"FINISHED"} usecase = assign_container.Usecase(