From 7ecd958e33c7444dd333c2d3b6333b6c26833f2e Mon Sep 17 00:00:00 2001 From: alan Date: Mon, 15 Apr 2024 17:45:59 -0400 Subject: [PATCH] Exporter script is fully automated --- docs/automation.md | 8 ++--- pipeline/batch.py | 16 --------- pipeline/export_all_anims.cmd | 4 ++- pipeline/export_anims.py | 63 ++++++++++++++++++----------------- 4 files changed, 39 insertions(+), 52 deletions(-) delete mode 100644 pipeline/batch.py diff --git a/docs/automation.md b/docs/automation.md index 6cea5b0..43a0005 100644 --- a/docs/automation.md +++ b/docs/automation.md @@ -1,15 +1,15 @@ # Automation ## Setup -- Add Blender 3.6 to your PATH so it can be run from command-line (putting `blender` in cmd should open Blender 3.6) -- Ensure Python is installed on your machine -- Install Blender as a Python module (you might have to do this as administrator): `pip install bpy==3.6.0` +- Ensure you have Blender 3.6 installed (hopefully at the location: `C:\Program Files\Blender Foundation\Blender 3.6`) +- Run the script located at `pipeline/export_all_anims.cmd` ## Editing - +- Ensure Python is installed on your machine - Ensure you have Visual Studio Code installed - Open this directory in VS Code and install the recommended plugins - Open terminal, `cd` into `pipeline`, and run the following command: `$ git clone https://github.com/Korchy/blender_autocomplete.git` +- Your workspace is now set up! ## Resources - [Blender as a Python Module](https://pypi.org/project/bpy/) diff --git a/pipeline/batch.py b/pipeline/batch.py deleted file mode 100644 index 3bd6063..0000000 --- a/pipeline/batch.py +++ /dev/null @@ -1,16 +0,0 @@ -import bpy -from bpy.app.handlers import persistent -import shutil - -blender_bin = shutil.which("blender") -if blender_bin: - print("Found:", blender_bin) - bpy.app.binary_path = blender_bin -else: - print("Unable to find blender!") - -@persistent -def load_handler(dummy): - print("Load Handler", bpy.data.filepath) - -bpy.app.handlers.load_post(load_handler) diff --git a/pipeline/export_all_anims.cmd b/pipeline/export_all_anims.cmd index 27bea95..2c0df3e 100644 --- a/pipeline/export_all_anims.cmd +++ b/pipeline/export_all_anims.cmd @@ -1 +1,3 @@ -blender ..\animations\infantry\anims-alan.blend --background --python export_anims.py \ No newline at end of file +set PATH=%PATH%;"C:\Program Files\Blender Foundation\Blender 3.6" +blender ..\animations\infantry\anims-alan.blend --background --python export_anims.py +blender ..\animations\insurrectionist\anims-alan.blend --background --python export_anims.py diff --git a/pipeline/export_anims.py b/pipeline/export_anims.py index 07488d0..b9905a2 100644 --- a/pipeline/export_anims.py +++ b/pipeline/export_anims.py @@ -1,5 +1,5 @@ import bpy -from bpy.types import Collection, LayerCollection, Object, Armature +from bpy.types import LayerCollection, Object, NlaTrack # Enter object mode bpy.ops.object.mode_set(mode='OBJECT') @@ -19,21 +19,40 @@ def toggle_collection(coll: LayerCollection): bpy.context.view_layer.active_layer_collection = c toggle_collection(bpy.context.view_layer.layer_collection) -# Find rig to make it active -armatureObj: Object = None +# Find rig to make it active, and select all objects for objBase in bpy.context.scene.objects: - # print(objBase) obj: Object = objBase - # print(obj.data) if obj.type == 'ARMATURE': - print("FOUND AN ARMATURE") - armatureObj = obj - obj.select_set(True) -bpy.context.active_object -print(bpy.context.active_object) -#bpy.context.active_object.animation_data.nla_tracks + bpy.context.view_layer.objects.active = obj + if obj.visible_get(): + obj.select_set(True) -exit() + +# EXTREMELY UGLY HACK TO EXIT TWEAK MODE +# see: https://blender.stackexchange.com/questions/316547/how-to-override-context-area-using-script-when-running-blender-using-command-lin +# and https://blender.stackexchange.com/questions/6101/poll-failed-context-incorrect-example-bpy-ops-view3d-background-image-add +def get_view_nla(): # Get any window + for window_manager in bpy.data.window_managers: + for window in window_manager.windows: + for area in window.screen.areas: + area.type = 'NLA_EDITOR' + for region in area.regions: + if region.type == 'WINDOW': + return dict(window=window, workspace=window.workspace, screen=window.screen, area=area, region=region) + raise Exception('NLA context not found.') + +# Forcibly override context to a window so we can access NLA editor +with bpy.context.temp_override(**get_view_nla()): + if bpy.context.scene.is_nla_tweakmode: + bpy.ops.nla.tweakmode_exit() # Exit tweakmode + + +# Go through all NLA tracks, unstar them and mute them +bpy.context.active_object.animation_data.nla_tracks.active = None # Make track inactive +for trackBase in bpy.context.active_object.animation_data.nla_tracks: + track: NlaTrack = trackBase + track.mute = True # Mute all tracks + track.is_solo = False # Disable solo view for all tracks # Get export directory path: str = bpy.data.filepath.replace('\\Shelby', '').replace('\\Tommy', '') @@ -109,22 +128,4 @@ bpy.ops.pose.transforms_clear() # Clear all transforms bpy.ops.object.mode_set(mode='OBJECT') ## FOR DEBUGGING, see https://blender.stackexchange.com/questions/93728/blender-script-run-print-to-console -# from bpy import context -# import builtins as __builtin__ -# def console_print(*args, **kwargs): -# for a in context.screen.areas: -# if a.type == 'CONSOLE': -# c = {} -# c['area'] = a -# c['space_data'] = a.spaces.active -# c['region'] = a.regions[-1] -# c['window'] = context.window -# c['screen'] = context.screen -# s = " ".join([str(arg) for arg in args]) -# for line in s.split("\n"): -# bpy.ops.console.scrollback_append(c, text=line) - -# def print(*args, **kwargs): -# """Console print() function.""" -# console_print(*args, **kwargs) # to py consoles -# __builtin__.print(*args, **kwargs) # to system console +# exit()