diff --git a/utilities/blender_worker.py b/utilities/blender_worker.py index 5cdd693..eee34a1 100644 --- a/utilities/blender_worker.py +++ b/utilities/blender_worker.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import json import re from utilities.render_worker import * @@ -126,6 +127,18 @@ def run_python_expression_in_blend(path, python_expression): raise FileNotFoundError +def run_python_script_in_blend(path, python_path): + if os.path.exists(path) and os.path.exists(python_path): + try: + return subprocess.run([BlenderRenderWorker.renderer_path(), '-b', path, '--python', python_path], + capture_output=True) + except Exception as e: + logger.warning(f"Error running python expression in blender: {e}") + pass + else: + raise FileNotFoundError + + def pack_blender_files(path): # Credit to L0Lock for pack script - https://blender.stackexchange.com/a/243935 pack_script = "import bpy\nbpy.ops.file.pack_all()\nmyPath = bpy.data.filepath\nmyPath = str(myPath)\n" \ @@ -153,22 +166,21 @@ def pack_blender_files(path): return None -def get_cameras_in_scene(path): - cam_script = "import bpy;print('CAM:' + str([x.name + '@' + str(x.lens) for x in bpy.data.cameras]))" +def get_scene_info(path): + scene_info = None try: - results = run_python_expression_in_blend(path, cam_script) - + results = run_python_script_in_blend(path, os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'get_blender_info.py')) result_text = results.stdout.decode() - p = re.compile('CAM:\[(.*)\]') - match = p.search(result_text) - if match: - cameras = match.group(1).replace("'", "").split(",") - cameras = [{'name': x.split('@')[0].strip(), 'lens': x.split('@')[-1].strip()} for x in cameras] - return cameras + for line in result_text.splitlines(): + if line.startswith('SCENE_DATA:'): + raw_data = line.split('SCENE_DATA:')[-1] + scene_info = json.loads(raw_data) + break except Exception as e: logger.error(f'Error getting file details for .blend file: {e}') - return None + return scene_info if __name__ == '__main__': diff --git a/utilities/get_blender_info.py b/utilities/get_blender_info.py new file mode 100644 index 0000000..d105b5c --- /dev/null +++ b/utilities/get_blender_info.py @@ -0,0 +1,19 @@ +import json +import bpy + +# Get all cameras +cameras = [] +for cam_obj in bpy.data.cameras: + user_map = bpy.data.user_map(subset={cam_obj}, value_types={'OBJECT'}) + for data_obj in user_map[cam_obj]: + cam = {'name': data_obj.name, 'lens': cam_obj.lens} + cameras.append(cam) + +data = {'cameras': cameras, + 'frame_start': bpy.data.scenes[0].frame_start, + 'frame_end': bpy.data.scenes[0].frame_end, + 'resolution_x': bpy.data.scenes[0].render.resolution_x, + 'resolution_y': bpy.data.scenes[0].render.resolution_y} + +data_string = json.dumps(data) +print("SCENE_DATA:" + data_string) \ No newline at end of file