diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 385ca383c9..2fecf1b793 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -714,6 +714,10 @@ class OverrideOutlinerDelete(bpy.types.Operator): else: bpy.data.objects.remove(obj) for collection in collections_to_delete: + # Removing an aggregate object would also remove it's collection + # making the collection data-block invalid. + if not tool.Blender.is_valid_data_block(collection): + continue bpy.data.collections.remove(collection) if self.is_batch: old_file = tool.Ifc.get() diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 3726911796..a58392b16c 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -196,6 +196,21 @@ class Blender(blenderbim.core.tool.Blender): return False return False + @classmethod + def is_valid_data_block(cls, data_block: bpy.types.ID) -> bool: + """Check if Blender data-block is still valid. + + If Blender data-block (e.g. an Object) is removed then it's + python object gets invalidated and accessing any of it's attributes + leads to ReferenceError: StructRNA of type Object has been removed. + This method helps avoiding try / except ReferenceError constructions. + """ + try: + data_block.bl_rna + return True + except ReferenceError: + return False + @classmethod def show_info_message(cls, text: str, message_type: Literal["INFO", "ERROR"] = "INFO") -> None: """useful for showing error messages outside blender operators