Improve Blender file parsing.

This commit is contained in:
Brett Williams
2022-10-27 00:11:27 -07:00
parent eb9e719f47
commit 446f7b81a6
2 changed files with 42 additions and 11 deletions

View File

@@ -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__':

View File

@@ -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)