株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 【MotionBuilder】自動処理で効率よく作業をしよう!【初心者向け】

【MotionBuilder】自動処理で効率よく作業をしよう!【初心者向け】

2016/8/22

Tag: ,,

こんにちは、TD室の森本@DF大阪です。

私事ですが6月からDF大阪事務所に転勤して仕事をしています。
大阪での生活にも慣れてきました。

今回はMotionBuilder(以後MB)で初心者向けのバッチを使った自動処理について書いてみます。
なお、今回紹介するコードについてはMB2016にてテストしています。
(特にMB2010ぐらいまで古いバージョンになると、ファイル保存の記述等が変わるため、動かない可能性があります。)

MBバッチ起動+スクリプト実行

まずは単純にバッチでMBを起動してスクリプトを実行してみます。

下記記述でバッチファイルをつくります。
test.bat

set APPLICATION="motionbuilder.exeのファイルアドレス"
set EXECUTE_SCRIPT=Hello.py
call %APPLICATION% %EXECUTE_SCRIPT%

Hello.py

print "Hello World !"

1行目のset APPLICATION=でMBのインストール先のmotionbuilder.exeのパスに変更してください。
test.batとHello.pyを同じフォルダ内に配置してtest.batを実行すると
MBが起動したあとScriptEditorを確認すると”Hello World !”のログがあるはずです。

MBバッチ起動+複数のスクリプト実行

このままでは決めうちで一つのスクリプトしか実行できないので、
ファイルを書き換えて自由に複数のスクリプトファイルを使えるように変更します。
test.bat

set APPLICATION="motionbuilder.exeのファイルアドレス"
set PYTHON_FOLDER=py
set EXECUTE_SCRIPT=RunPythonList.py
call %APPLICATION% %EXECUTE_SCRIPT%

RunPythonList.py

# -*- coding: utf-8 -*-
from pyfbsdk import *
import os
oApp=FBApplication()

# Pythonファイルリストの取得(ファイル名でソート)
lPythonList = [oPyFile for oPyFile in os.listdir(os.environ['PYTHON_FOLDER']) if oPyFile.endswith(".py")]
lPythonList.sort()

# Pythonファイルを実行
for oPyFile in lPythonList:
    oPyFilePath=os.path.join(os.environ['PYTHON_FOLDER'],oPyFile )
    oApp.ExecuteScript(oPyFilePath)

実行用に適当にヌルを1つ作るスクリプトを用意
CreateNull.py

from pyfbsdk import *
FBModelNull("Test")
print "Create Null"

先ほどのHello.pyも合わせて以下のように配置します。



配置後test.batを実行すると、MBが立ち上がりpyフォルダ内のファイルがファイル名順に実行されて、
Testという名前のNullとScriptEditerのログに”Create Null”、”Hello World !”の順で書き出されていて
pyファイルが名前順に実行されているのが確認できます。

MBバッチ起動+複数のスクリプト実行+シーンファイル処理

実際は、作業シーンファイルに対して特定の処理をスクリプトをつかって自動処理していきたいので、
さらに複数ファイルのオープン、セーブの機能を追加していきます。
test.bat

set APPLICATION="motionbuilder.exeのファイルアドレス"
set PYTHON_FOLDER=py
set SRC_FOLDER=src
set DST_FOLDER=dst
set SAVE_FILE=1
set EXECUTE_SCRIPT=RunPythonList.py
call %APPLICATION% %EXECUTE_SCRIPT%

RunPythonList.py

# -*- coding: utf-8 -*-
from pyfbsdk import *
import os
oApp=FBApplication()

# FBXファイルOpen時の設定
oFbOp=FBFbxOptions(True)
oFbOp.SetAll(FBElementAction.kFBElementActionAppend,True)
oFbOp.BaseCameras = True
oFbOp.CameraSwitcherSettings = True
oFbOp.CurrentCameraSettings = True
oFbOp.TransportSettings = True
oFbOp.GlobalLightingSettings = True

# Pythonファイルリストの取得(ファイル名でソート)
lPythonList = [oPyFile for oPyFile in os.listdir(os.environ['PYTHON_FOLDER']) if oPyFile.endswith(".py")]
lPythonList.sort()

# srcフォルダ内のfbxファイルを検索
for oFile in os.listdir(os.environ['SRC_FOLDER']):
    if oFile.endswith(".fbx"):
        FbxFile=os.path.join(os.environ['SRC_FOLDER'],oFile)

        # FBXファイルを開く
        oApp.FileOpen(FbxFile,False,oFbOp)

        # Pythonファイルを実行
        for oPyFile in lPythonList:
            oPyFilePath=os.path.join(os.environ['PYTHON_FOLDER'],oPyFile )
            oApp.ExecuteScript(oPyFilePath)

        # SAVE_FILEが1だった場合ファイルをdstフォルダ内に保存する
        if int(os.environ['SAVE_FILE'])==1:
            oSaveFilePath=os.path.join(os.environ['DST_FOLDER'],oFile)
            oFbSOp=FBFbxOptions(False)
            oFbSOp.EmbedMedia=False
            oApp.FileSave(oSaveFilePath,oFbSOp)

# MotionBuilderを終了する
oApp.FileExit()

ファイルを以下の図のように配置します。



srcフォルダにスクリプト処理にかけたいシーンファイル、
pyフォルダにスクリプトファイル(複数の場合はファイル名順に処理)を配置して、
test.batを実行すると、srcフォルダ内のシーンデータを開いて、pyフォルダのスクリプトファイルを実行した後、
test.bat内でset SAVE_FILE=1設定だった場合dstフォルダに保存します。
(シーンファイルの保存が必要ない場合は1以外の数値(0が分かりやすいと思います)を入れてください)

まとめ

上記のような処理はバッチ形式にしなくてもMB上のPython処理内でも行うことができます。

ただし、バッチ化処理をして必要なファイルとフォルダをまとめておくことで、
フォルダ単位を一つのパッケージとして同じ設定の自動処理を他の人に配ることで、
使用者はバッチを叩くだけで同じ自動処理を行うことができます。

今回は扱いやすいように単純な形の自動処理について書いてみましたが、
帰宅時に自動処理できるようにバッチファイルの最後にシャットダウン処理を追加したり、
紹介した記述ではエラーが起こった場合に処理が途中で止まってしまうので、
エラーが出た場合に備えて例外処理を追加して自動処理自体が止まらないようにしたり、
基本形をベースに用途に合わせてさらに手を加えればより使いやすくなります。

また、今回はバッチからMBを立ち上げた後、MB上で実行するPyファイル内で
複数のシーンファイルのオープン、セーブを行っていましたが、
重いシーンファイルを扱う場合はバッチ内でシーンファイルのループ処理を入れることで、
シーンファイル毎にMBを立ち上げなおす形にするほうが安定すると思います。
(その分シーンファイル毎にMBを立ち上げるので処理に時間がかかります)

単純な作業の繰り返し処理等は、手動でやっていると無駄に時間がかかってしまうので、
そういう処理はぜひ自動化して効率よく作業していきましょう!

※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。
Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*