diff --git a/TODO.md b/TODO.md index d2cc308..f2bec35 100644 --- a/TODO.md +++ b/TODO.md @@ -340,5 +340,6 @@ Bevy Side: - [ ] the ability to map external TEXT files to data in BLender (git-able, hand editable) - [x] make aabbs calculation non configurable, getting rid of the last setting (for now) - [ ] add information & screenshots about adding assets to the Blender add-on docs +- [x] finally deal cleanly with gltf export failures & make sure to always reset the state of the blend file clear && pytest -svv --blender-template ../../testing/bevy_example/art/testing_library.blend --blender-executable /home/ckaos/tools/blender/blender-4.1.0-linux-x64/blender tests/test_bevy_integration_prepare.py && pytest -svv --blender-executable /home/ckaos/tools/blender/blender-4.1.0-linux-x64/blender tests/test_bevy_integration.py \ No newline at end of file diff --git a/tools/blenvy/add_ons/auto_export/common/export_gltf.py b/tools/blenvy/add_ons/auto_export/common/export_gltf.py index 131ab4f..10d6ae5 100644 --- a/tools/blenvy/add_ons/auto_export/common/export_gltf.py +++ b/tools/blenvy/add_ons/auto_export/common/export_gltf.py @@ -83,3 +83,4 @@ def export_gltf (path, gltf_export_settings): # print("export settings",settings) os.makedirs(os.path.dirname(path), exist_ok=True) bpy.ops.export_scene.gltf(**settings) + diff --git a/tools/blenvy/add_ons/auto_export/common/generate_temporary_scene_and_export.py b/tools/blenvy/add_ons/auto_export/common/generate_temporary_scene_and_export.py index 2665d5f..5be49a5 100644 --- a/tools/blenvy/add_ons/auto_export/common/generate_temporary_scene_and_export.py +++ b/tools/blenvy/add_ons/auto_export/common/generate_temporary_scene_and_export.py @@ -1,13 +1,11 @@ -import json import bpy from blenvy.core.helpers_collections import (set_active_collection) from blenvy.core.object_makers import (make_empty) from .duplicate_object import duplicate_object from .export_gltf import export_gltf -from blenvy.core.scene_helpers import add_scene_property from ..constants import custom_properties_to_filter_out from ..utils import remove_unwanted_custom_properties - +from ....core.utils import exception_traceback, show_message_box """ generates a temporary scene, fills it with data, cleans up after itself @@ -52,22 +50,23 @@ def generate_temporary_scene_and_export(settings, gltf_export_settings, gltf_out # detect scene mistmatch scene_mismatch = bpy.context.scene.name != bpy.context.window.scene.name if scene_mismatch: - raise Exception("Context scene mismatch, aborting", bpy.context.scene.name, bpy.context.window.scene.name) - - set_active_collection(bpy.context.scene, temp_root_collection.name) - # generate contents of temporary scene - scene_filler_data = tempScene_filler(temp_root_collection) - # export the temporary scene - try: - print("dry_run MODE", settings.auto_export.dry_run) - if settings.auto_export.dry_run == "DISABLED": - export_gltf(gltf_output_path, gltf_export_settings) - except Exception as error: - print("failed to export gltf !", error) - raise error - finally: - # restore everything - tempScene_cleaner(temp_scene, scene_filler_data) + show_message_box("Error in Gltf Exporter", icon="ERROR", lines=[f"Context scene mismatch, aborting: {bpy.context.scene.name} vs {bpy.context.window.scene.name}"]) + else: + set_active_collection(bpy.context.scene, temp_root_collection.name) + # generate contents of temporary scene + scene_filler_data = tempScene_filler(temp_root_collection) + # export the temporary scene + try: + print("dry_run MODE", settings.auto_export.dry_run) + if settings.auto_export.dry_run == "DISABLED": + export_gltf(gltf_output_path, gltf_export_settings) + except Exception as error: + print("failed to export gltf !", error) + show_message_box("Error in Gltf Exporter", icon="ERROR", lines=exception_traceback(error)) + finally: + print("restoring state of scene") + # restore everything + tempScene_cleaner(temp_scene, scene_filler_data) # reset active scene bpy.context.window.scene = active_scene diff --git a/tools/blenvy/core/utils.py b/tools/blenvy/core/utils.py new file mode 100644 index 0000000..cfc3890 --- /dev/null +++ b/tools/blenvy/core/utils.py @@ -0,0 +1,33 @@ +import sys +import inspect +import bpy + +def full_stack_lines(tb=None): + text = [] + try: + if tb is None: + tb = sys.exc_info()[2] + + text.append('Traceback (most recent call last):') + for item in reversed(inspect.getouterframes(tb.tb_frame)[1:]): + text.append(' File "{1}", line {2}, in {3}\n'.format(*item)) + for line in item[4]: + text.append(' ' + line.lstrip()) + for item in inspect.getinnerframes(tb): + text.append(' File "{1}", line {2}, in {3}\n'.format(*item)) + for line in item[4]: + text.append(' ' + line.lstrip()) + except: pass + return text + +def exception_traceback(error): + traceback_formated = [str(error)] + traceback_formated += full_stack_lines() + return traceback_formated + +def show_message_box(title = "Message Box", icon = 'INFO', lines=""): + myLines=lines + def draw(self, context): + for n in myLines: + self.layout.label(text=n) + bpy.context.window_manager.popup_menu(draw, title = title, icon = icon)