複数のシーンファイルを一括で処理する方法
2015/6/29
どうもこんにちは、TD室の石田です。
今回の内容はMayaで複数のシーンファイルに対して一括処理を行う方法について書いてみました。
例えばシーンファイルが大量にある状況で全てのシーンファイルに対して
アトリビュートを一箇所変更したい。
いらないノードを消したい。追加したい。
レンダリングの設定をしたい。
などなどあると思います。
これを一つ一つ手動でやるには時間も掛かるし苦行ですよね。
弊社ではこういう自動処理を行うツールはいくつか存在しますが、今回はツールというほどのものではなく簡易的なものを作ってみました。
今回の内容ではPythonとbatファイルで構成されています。
サンプルもあるのであとでダウンロードしてみてください。
今回の手順
1、create.batに複数シーンファイルの入ったフォルダをDrag&Drop ※図ではrunFilesフォルダ
2、create.batが複数シーンファイルのパスをcreateBat.pyに渡してrun.batを作成
3、run.batを実行すれば自動処理が動き出す。
※ついでにログも出すようにしています。
1、のDrag&Dropした時点で自動処理が走ってもスムーズでいい気がしますが
run.batを作っておけば中身の確認と処理が編集出来るので今回はこの形で作ってみました。
create.batでrun.batを作る
ここからメインとなるDrag&Drop先のbatファイルとpyファイルの解説をしていきます。
create.bat Drag&Dropしたパスを受け取りcreateBat.pyに渡す
createBat.py create.batからパスを受け取りrun.batを作る。
—- create.bat —-
@echo off set PYPATH=%~d0%~p0createBat.py echo %PYPATH% "C:\Program Files\Autodesk\Maya2014\bin\mayapy.exe" %PYPATH% %1 pause
create.bat解説
set PYPATH=%~d0%~p0%PYTHONFILE%
この記述はcreate.batと同じ階層のパスを取得してPYTHONFILEとくっ付けています。
例えばcreate.batがC:Users\Documents\create.batにある場合
PYPATHはC:Users\Documents\createBat.pyになります。
"C:\Program Files\Autodesk\Maya2014\bin\mayapy.exe" %PYPATH% %1
mayapy.exeがなんなのかって感じだと思いますがmayaが用意しているpython.exeだと思ってください。
もちろんpython.exeでも大丈夫です。python.exeを用意するのが面倒なときはmayapyを使いましょう。
%1はDrag&Dropしたフォルダのパスが入ります。
この文を直訳してみます。
例えば
%1 = C:Users\Documents\runFiles
PYPATH = C:\Users\Documents\createBat.py
とします。
訳すとこんな感じ。
“C:Program FilesAutodeskMaya2014binmayapy.exe” C:\Users\Documents\createBat.py C:\Users\Documents\runFiles
runFilesをcreateBat.py渡して実行、と言うことになります。
—- createBat.py —-
# -*- coding: utf-8 -*- import sys import os mayaexe = r'C:\Program Files\Autodesk\Maya2015\bin\maya.exe' mayabatchexe = r'C:\Program Files\Autodesk\Maya2015\bin\mayabatch.exe' pythonPath = r'C:\Users\Documents\python' #pythonファイルが置かれているパス def main(): srcDir = sys.argv[1] file_list = listDirFiles(srcDir) cmd = 'SET MAYA_UI_LANGUAGE=en_US'+'\n' #cmd += 'SET MAYA_PLUG_IN_PATH=C:dir'+'\n' #cmd += 'SET MAYA_MODULE_PATH=C:dir'+'\n' #cmd += 'SET MAYA_SCRIPT_PATH=C:dir'+'\n' cmd += 'SET PYTHONPATH=%s'%pythonPath+'\n' # logを入れるフォルダを作成 check_dir(os.path.join(srcDir,'log')) for fileName in file_list: filePath = os.path.join(srcDir,fileName).replace('\\','/') root,ext = os.path.splitext(filePath) logPath = os.path.join(srcDir,'log',fileName).replace(ext,'.log') cmd += '\n' cmd += 'SET MAYA_CMD_FILE_OUTPUT=%s'%logPath + '\n' cmd += '"%s" -command "python("import runCmd;runCmd.run('%s')")"'%(mayaexe, filePath)+'\n' cmd += '\n' print cmd dirPath, curPathName = os.path.split(srcDir) path = os.path.join(dirPath,'run.bat') saveBat(path, cmd) # コマンドの内容を書き込む def saveBat(path,cmd): with open(path, "w") as file: file.write(cmd) # ディレクトリがなければ作成 def check_dir(path): if os.path.isdir(path) == False: os.makedirs(path) # 指定されたフォルダからファイルのみのリストを取得 def listDirFiles(dirPath): file_list = [] for fileName in os.listdir(dirPath): filePath = os.path.join(dirPath,fileName) if os.path.isfile(filePath): file_list.append(fileName) return file_list if __name__ == '__main__': main()
createBat.py解説
run.batを作成する処理です。
sys.argv[1]がDrag&Dropで渡されたパスが入ります。
ちなみに現状の設定だとmaya.exeで処理が走るようになっているのでUIがいらない処理であればmayabatch.exeにしてください
あとはほとんどがディレクトリ操作なので省略します。
—- runBat.py —-
SET MAYA_UI_LANGUAGE=en_US SET PYTHONPATH=C:\Users\Documents\python SET MAYA_CMD_FILE_OUTPUT=C:project\autoBat\runFiles\log\cube.log "C:\Program Files\Autodesk\Maya2014\bin\maya.exe" -command "python("import runCmd;runCmd.run('C:/project/autoBat/runFiles/cube.mb')")" SET MAYA_CMD_FILE_OUTPUT=C:project\autoBat\runFiles\log\plane.log "C:\Program Files\Autodesk\Maya2014\bin\maya.exe" -command "python("import runCmd;runCmd.run('C:/project/autoBat/runFiles/plane.mb')")" SET MAYA_CMD_FILE_OUTPUT=C:project\autoBat\runFiles\log\sphere.log "C:\Program Files\Autodesk\Maya2014\bin\maya.exe" -command "python("import runCmd;runCmd.run('C:/project/autoBat/runFiles/sphere.mb')")"
runBat.py解説
createBat.pyで作られたbatファイルです。
このbatファイルを実行すれば自動処理が動き出します。
ここでやっていることは順番にmaya.exeを立ち上げてscriptを実行。
これのみです。
途中で終了したい場合はコマンドプロンプトを閉じてから、mayaを閉じてください。
python("import runCmd;runCmd.run('C:/project/autoBat/runFiles/sphere.mb')")
ここの部分はPYTHONPATHに通っているパスのpythonが走ります。
pythonにしていますがもちろんmelでも大丈夫です。
今回の例では
—- runCmd.py —-
# -*- coding: utf-8 -*- from maya import cmds def run(filePath): #maya シーンファイルのオープン print '## Scene File Open >> ' + filePath cmds.file(filePath, f=1, o=1) # # なにか適当に自動処理を書いてください。 # #maya.exeで処理していた場合にmayaを終了させる。 if not cmds.about(batch=1): cmds.evalDeferred('from maya import cmds;cmds.quit(f=1)')
こんな感じで書いています。
別名保存したいなどいろいろあるかと思いますが挑戦してみてください。
今回はMayaを例にしましたが中身を書き替えればMayaでなくても関係なく動きます。
これで時間がかかる単純処理は全部マシンに任せて時間を有効活用できますね!
それでは、また
ソースコードはこちら。→ダウンロード
※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください
コメント
コメントフォーム