From 4c8f93d737020d5fd0fb93f54e6c2736828eabcc Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 16:33:05 +1000 Subject: [PATCH] Add error catching to model loading and let users hide error dialog --- src/blenderbim/blenderbim/bim/__init__.py | 1 + .../blenderbim/bim/module/project/operator.py | 27 +++++++++++-------- src/blenderbim/blenderbim/bim/operator.py | 9 +++++++ src/blenderbim/blenderbim/bim/ui.py | 4 ++- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 20c39c6aa3..20979d5360 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -103,6 +103,7 @@ classes = [ operator.BIM_OT_select_object, operator.BIM_OT_show_description, operator.ClippingPlaneCutWithCappings, + operator.CloseError, operator.EditBlenderCollection, operator.FileAssociate, operator.FileUnassociate, diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 11b817c77f..ede1645996 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -21,6 +21,7 @@ import bpy import time import logging import tempfile +import traceback import subprocess import numpy as np import ifcopenshell @@ -674,19 +675,23 @@ class LoadProject(bpy.types.Operator, IFCFileSelector): return self.finish_loading_project(context) def finish_loading_project(self, context): - if not self.is_existing_ifc_file(): - return {"FINISHED"} + try: + if not self.is_existing_ifc_file(): + return {"FINISHED"} - if tool.Blender.is_default_scene(): - for obj in bpy.data.objects: - bpy.data.objects.remove(obj) + if tool.Blender.is_default_scene(): + for obj in bpy.data.objects: + bpy.data.objects.remove(obj) - context.scene.BIMProperties.ifc_file = self.get_filepath() - context.scene.BIMProjectProperties.is_loading = True - context.scene.BIMProjectProperties.total_elements = len(tool.Ifc.get().by_type("IfcElement")) - tool.Blender.register_toolbar() - if not self.is_advanced: - bpy.ops.bim.load_project_elements() + context.scene.BIMProperties.ifc_file = self.get_filepath() + context.scene.BIMProjectProperties.is_loading = True + context.scene.BIMProjectProperties.total_elements = len(tool.Ifc.get().by_type("IfcElement")) + tool.Blender.register_toolbar() + if not self.is_advanced: + bpy.ops.bim.load_project_elements() + except: + blenderbim.last_error = traceback.format_exc() + raise return {"FINISHED"} def invoke(self, context, event): diff --git a/src/blenderbim/blenderbim/bim/operator.py b/src/blenderbim/blenderbim/bim/operator.py index 55032392f7..85249ef19e 100644 --- a/src/blenderbim/blenderbim/bim/operator.py +++ b/src/blenderbim/blenderbim/bim/operator.py @@ -90,6 +90,15 @@ class OpenUri(bpy.types.Operator): return {"FINISHED"} +class CloseError(bpy.types.Operator): + bl_idname = "bim.close_error" + bl_label = "Close Error" + + def execute(self, context): + blenderbim.last_error = None + return {"FINISHED"} + + class SelectURIAttribute(bpy.types.Operator): bl_idname = "bim.select_uri_attribute" bl_label = "Select URI Attribute" diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 2b55904929..29c02d5f63 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -406,7 +406,9 @@ class BIM_PT_tabs(Panel): if blenderbim.last_error: box = self.layout.box() - box.label(text="BlenderBIM experienced an error :(", icon="ERROR") + row = box.row(align=True) + row.label(text="BlenderBIM experienced an error :(", icon="ERROR") + row.operator("bim.close_error", text="", icon="CANCEL") box.label(text="View the console for full logs.", icon="CONSOLE") box.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") op = box.operator("bim.open_uri", text="How Can I Fix This?")