fix(auto_export): first draft, working ! but horribly convoluted solution to the correct reseting of change detection state

This commit is contained in:
kaosat.dev 2024-04-06 01:29:41 +02:00
parent 86a1a4d717
commit 11e8786b59
5 changed files with 44 additions and 7 deletions

View File

@ -15,7 +15,7 @@ from pathlib import Path
import json import json
import bpy import bpy
from bpy.types import Context from bpy.types import Context
from bpy.props import (StringProperty, BoolProperty, PointerProperty) from bpy.props import (StringProperty, BoolProperty, IntProperty, PointerProperty)
# from .extension import ExampleExtensionProperties, GLTF_PT_UserExtensionPanel, unregister_panel # from .extension import ExampleExtensionProperties, GLTF_PT_UserExtensionPanel, unregister_panel
@ -133,6 +133,8 @@ def cleanup_file():
def glTF2_post_export_callback(data): def glTF2_post_export_callback(data):
#print("post_export", data) #print("post_export", data)
bpy.context.window_manager.auto_export_tracker.export_finished()
gltf_settings_backup = bpy.context.window_manager.gltf_settings_backup gltf_settings_backup = bpy.context.window_manager.gltf_settings_backup
gltf_filepath = data["gltf_filepath"] gltf_filepath = data["gltf_filepath"]
gltf_export_id = data['gltf_export_id'] gltf_export_id = data['gltf_export_id']
@ -189,6 +191,10 @@ def register():
bpy.types.TOPBAR_MT_file_export.append(menu_func_import) bpy.types.TOPBAR_MT_file_export.append(menu_func_import)
bpy.types.WindowManager.gltf_settings_backup = StringProperty(default="") bpy.types.WindowManager.gltf_settings_backup = StringProperty(default="")
# FIXME: perhaps move this to tracker
bpy.types.WindowManager.exports_count = IntProperty(default=0)
"""bpy.utils.register_class(AutoExportExtensionProperties) """bpy.utils.register_class(AutoExportExtensionProperties)
bpy.types.Scene.AutoExportExtensionProperties = bpy.props.PointerProperty(type=AutoExportExtensionProperties)""" bpy.types.Scene.AutoExportExtensionProperties = bpy.props.PointerProperty(type=AutoExportExtensionProperties)"""
@ -201,6 +207,7 @@ def unregister():
bpy.app.handlers.save_post.remove(post_save) bpy.app.handlers.save_post.remove(post_save)
"""bpy.utils.unregister_class(AutoExportExtensionProperties)""" """bpy.utils.unregister_class(AutoExportExtensionProperties)"""
del bpy.types.WindowManager.exports_count
if "gltf_auto_export" == "__main__": if "gltf_auto_export" == "__main__":
register() register()

View File

@ -107,6 +107,13 @@ def auto_export(changes_per_scene, changed_export_parameters, addon_prefs):
export_materials(collections, library_scenes, folder_path, addon_prefs) export_materials(collections, library_scenes, folder_path, addon_prefs)
main_scenes_to_export = [scene_name for scene_name in main_scene_names if not export_change_detection or changed_export_parameters or scene_name in changes_per_scene.keys() or not check_if_blueprint_on_disk(scene_name, export_levels_path, gltf_extension)]
bpy.context.window_manager.exports_count = len(collections_to_export)
bpy.context.window_manager.exports_count += len(main_scenes_to_export)
if export_materials_library:
bpy.context.window_manager.exports_count += 1
print("--------------") print("--------------")
print("collections: all:", collections) print("collections: all:", collections)
print("collections: changed:", changed_collections) print("collections: changed:", changed_collections)
@ -114,6 +121,9 @@ def auto_export(changes_per_scene, changed_export_parameters, addon_prefs):
print("collections: in library:", library_collections) print("collections: in library:", library_collections)
print("collections: to export:", collections_to_export) print("collections: to export:", collections_to_export)
print("collections: per_scene:", collections_per_scene) print("collections: per_scene:", collections_per_scene)
print("--------------")
print("MAIN SCENES TO EXPORT", main_scenes_to_export)
# backup current active scene # backup current active scene
old_current_scene = bpy.context.scene old_current_scene = bpy.context.scene

View File

@ -206,6 +206,9 @@ class AutoExportGLTF(Operator, AutoExportGltfAddonPreferences, ExportHelper):
params_changed = self.did_export_settings_change() params_changed = self.did_export_settings_change()
auto_export(changes_per_scene, params_changed, self) auto_export(changes_per_scene, params_changed, self)
# cleanup # cleanup
if bpy.context.window_manager.exports_count == 0: # we need this in case there was nothing to export, to make sure change detection is enabled again
print("YOLOOO")
bpy.context.window_manager.auto_export_tracker.enable_change_detection()
#bpy.context.window_manager.auto_export_tracker.enable_change_detection() #bpy.context.window_manager.auto_export_tracker.enable_change_detection()
# FIXME: wrong logic, this should be called only in an glTF2_post_export_callback # FIXME: wrong logic, this should be called only in an glTF2_post_export_callback
bpy.app.timers.register(bpy.context.window_manager.auto_export_tracker.enable_change_detection, first_interval=1) bpy.app.timers.register(bpy.context.window_manager.auto_export_tracker.enable_change_detection, first_interval=1)

View File

@ -53,7 +53,7 @@ class AutoExportTracker(PropertyGroup):
@classmethod @classmethod
def deps_update_handler(cls, scene, depsgraph): def deps_update_handler(cls, scene, depsgraph):
# print("change detection enabled", cls.change_detection_enabled) print("change detection enabled", cls.change_detection_enabled)
active_operator = bpy.context.active_operator active_operator = bpy.context.active_operator
if active_operator: if active_operator:
# print("Operator", active_operator.bl_label, active_operator.bl_idname) # print("Operator", active_operator.bl_label, active_operator.bl_idname)
@ -124,3 +124,9 @@ class AutoExportTracker(PropertyGroup):
self.__class__.change_detection_enabled = True self.__class__.change_detection_enabled = True
return None return None
def export_finished(self):
print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHH export_finished")
bpy.context.window_manager.exports_count -= 1
if bpy.context.window_manager.exports_count == 0:
print("YOLOOO")
self.enable_change_detection()

View File

@ -133,8 +133,8 @@ def test_export_changed_parameters(setup_data):
models_library_path = os.path.join(models_path, "library") models_library_path = os.path.join(models_path, "library")
model_library_file_paths = list(map(lambda file_name: os.path.join(models_library_path, file_name), sorted(os.listdir(models_library_path)))) model_library_file_paths = list(map(lambda file_name: os.path.join(models_library_path, file_name), sorted(os.listdir(models_library_path))))
modification_times_first = list(map(lambda file_path: os.path.getmtime(file_path), model_library_file_paths + [world_file_path])) modification_times_first = list(map(lambda file_path: os.path.getmtime(file_path), model_library_file_paths + [world_file_path]))
print("files", model_library_file_paths) #print("files", model_library_file_paths)
print("mod times", modification_times_first) #print("mod times", modification_times_first)
auto_export_operator( auto_export_operator(
auto_export=True, auto_export=True,
@ -150,7 +150,11 @@ def test_export_changed_parameters(setup_data):
assert modification_times_no_change == modification_times_first assert modification_times_no_change == modification_times_first
# now move the main cube & export again # now move the main cube & export again
bpy.context.window_manager.auto_export_tracker.enable_change_detection() # FIXME: should not be needed, but .. print("----------------")
print("main scene change")
print("----------------")
#py.context.window_manager.auto_export_tracker.enable_change_detection() # FIXME: should not be needed, but ..
bpy.data.objects["Cube"].location = [1, 0, 0] bpy.data.objects["Cube"].location = [1, 0, 0]
auto_export_operator( auto_export_operator(
@ -169,7 +173,10 @@ def test_export_changed_parameters(setup_data):
# now same, but move the cube in the library # now same, but move the cube in the library
print("----------------")
print("library change") print("library change")
print("----------------")
bpy.data.objects["Blueprint1_mesh"].location = [1, 2, 1] bpy.data.objects["Blueprint1_mesh"].location = [1, 2, 1]
auto_export_operator( auto_export_operator(
auto_export=True, auto_export=True,
@ -186,7 +193,11 @@ def test_export_changed_parameters(setup_data):
modification_times_first = modification_times modification_times_first = modification_times
# now same, but using an operator # now same, but using an operator
""" bpy.ops.transform.translate(value=(20.0, 0.0, 0.0)) print("----------------")
print("change using operator")
print("----------------")
bpy.ops.transform.translate(value=(20.0, 0.0, 0.0))
auto_export_operator( auto_export_operator(
auto_export=True, auto_export=True,
@ -200,7 +211,7 @@ def test_export_changed_parameters(setup_data):
modification_times = list(map(lambda file_path: os.path.getmtime(file_path), model_library_file_paths + [world_file_path])) modification_times = list(map(lambda file_path: os.path.getmtime(file_path), model_library_file_paths + [world_file_path]))
assert modification_times != modification_times_first assert modification_times != modification_times_first
modification_times_first = modification_times""" modification_times_first = modification_times