From fab96619480429a4f01ad004343d5fff8c30220f Mon Sep 17 00:00:00 2001 From: Brett Williams Date: Mon, 5 Jun 2023 13:11:18 -0500 Subject: [PATCH] Update pack_project script for Blender --- lib/render_engines/blender_engine.py | 12 ++---- .../get_file_info.py} | 0 .../scripts/blender/pack_project.py | 41 +++++++++++++++++++ 3 files changed, 44 insertions(+), 9 deletions(-) rename lib/render_engines/scripts/{get_blender_info.py => blender/get_file_info.py} (100%) create mode 100644 lib/render_engines/scripts/blender/pack_project.py diff --git a/lib/render_engines/blender_engine.py b/lib/render_engines/blender_engine.py index c217168..adbf9dd 100644 --- a/lib/render_engines/blender_engine.py +++ b/lib/render_engines/blender_engine.py @@ -61,7 +61,7 @@ class Blender(BaseRenderEngine): scene_info = None try: results = cls.run_python_script(project_path, os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'scripts', 'get_blender_info.py'), timeout=timeout) + 'scripts', 'blender', 'get_file_info.py'), timeout=timeout) result_text = results.stdout.decode() for line in result_text.splitlines(): if line.startswith('SCENE_DATA:'): @@ -75,15 +75,9 @@ class Blender(BaseRenderEngine): @classmethod def pack_project_file(cls, project_path, timeout=30): # Credit to L0Lock for pack script - https://blender.stackexchange.com/a/243935 - pack_expression = "import bpy\n" \ - "bpy.ops.file.pack_all()\n" \ - "bpy.ops.file.make_paths_absolute()\n" \ - "myPath = bpy.data.filepath\n" \ - "myPath = str(myPath)\n" \ - "bpy.ops.wm.save_as_mainfile(filepath=myPath[:-6]+'_packed'+myPath[-6:])" - try: - results = Blender.run_python_expression(project_path, pack_expression, timeout=timeout) + results = cls.run_python_script(project_path, os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'scripts', 'blender', 'pack_project.py'), timeout=timeout) result_text = results.stdout.decode() dir_name = os.path.dirname(project_path) diff --git a/lib/render_engines/scripts/get_blender_info.py b/lib/render_engines/scripts/blender/get_file_info.py similarity index 100% rename from lib/render_engines/scripts/get_blender_info.py rename to lib/render_engines/scripts/blender/get_file_info.py diff --git a/lib/render_engines/scripts/blender/pack_project.py b/lib/render_engines/scripts/blender/pack_project.py new file mode 100644 index 0000000..d4e155f --- /dev/null +++ b/lib/render_engines/scripts/blender/pack_project.py @@ -0,0 +1,41 @@ +import bpy +import os +import shutil +import zipfile + + +def zip_files(file_paths, output_zip_path): + # Create a new Zip file + with zipfile.ZipFile(output_zip_path, 'w') as myzip: + for file_path in file_paths: + # Add each file to the Zip file + myzip.write(file_path) + + +# Get File path +project_path = str(bpy.data.filepath) + +# Pack Files +bpy.ops.file.pack_all() +bpy.ops.file.make_paths_absolute() + +# Temp dir +tmp_dir = os.path.join(os.path.dirname(project_path), 'tmp') +asset_dir = os.path.join(tmp_dir, 'assets') +os.makedirs(tmp_dir, exist_ok=True) + +try: + # Find images we could not pack - usually videos + for img in bpy.data.images: + if not img.packed_file and img.filepath and img.users: + os.makedirs(asset_dir, exist_ok=True) + shutil.copy2(img.filepath, os.path.join(asset_dir, os.path.basename(img.filepath))) + img.filepath = '//' + os.path.join('assets', os.path.basename(img.filepath)) + + # Save Output + bpy.ops.wm.save_as_mainfile(filepath=os.path.join(tmp_dir, os.path.basename(project_path)), compress=True) + + zip_files([os.path.join(tmp_dir, os.path.basename(project_path)), asset_dir], + os.path.join(os.path.dirname(project_path), 'output.zip')) +finally: + os.remove(tmp_dir)