Blender を使った経験が全く無いので練習兼ねてプラグイン作ります。
Blender 2.65 を install 。
Script は python 3.3 で、plug-in (addon) もこれで記述するようです。
本体に DirectX .x や fbx など多くの exporter addon が含まれているので、これらのスクリプトが参考になります。
Windows だとこの辺に入っています。
C:\Program Files\Blender Foundation\Blender\2.65\scripts\addons
●Python Console
Blender 上の 3D View など、Window を Python Console に切り替えられます。
直接コマンドを実行して動作確認ができるので便利です。
●スクリプトの置き場所
addon として作成した script は下記の場所に入れておきます。
◎ Windows 7/8 C:\Users\<ユーザー名>\AppData\Roaming\Blender Foundation\Blender\2.65\scripts\addons ◎ MacOS X /Users/<ユーザー名>/Library/Application Support/Blender/2.65/scripts/addons
・Add-Ons
・Configuration & Data Paths
上記場所に入れたスクリプトでは最低限 bl_info の定義が必要です。
User Preferences の Addons を開くときに、フォルダ内の python ファイルから bl_info を検索して定義内容を取り込んでいるようです。
bl_info がなかったり定義にミスがあるとエラーになります。
# test.py (Preference に列挙されるための最小限)
bl_info= {
"name": "Test",
"category": "Import-Export",
}
print( "on load message" );
●スクリプトの読み込み&実行
Blender のメニューから addon を有効にします。
File → User Preferences … → Addons
上記の Addon スクリプト置き場に入っていて、かつ bl_info が定義されていればここに列挙されます。
左サイドの Categories で絞り込むと見つけやすくなります。
上の test.py なら “Import-Export” に入ります。
test.py である「Import-Export: Test」のチェックボックスを On にすると script が読み込まれて走ります。
ただし上の test.py は class を定義しておらず、内容が不完全なのでエラーになります。
●エラーコンソール
addon としてロードした script の print 出力 (stdout) は、
Blender 内の Python Console には表示されません。
エラーなどのログを見るにはコンソールを開きます。
Windows の場合、メニューの “Window” から
Window → Toggle System Console
Maya でも別ウィンドウになっているあれ (Output Window) と同じです。
MacOS X/Linux の場合上記のメニューがないのでコマンドラインから起動します。
Finder からではなく、ターミナルを開いて blender コマンドを直接実行します。
$ /Applications/Blender/blender.app/Contents/MacOS/blender
これで上記 test.py を読み込もうとすると “on load message” が表示されたあと
エラーが出ていることを確認できます。
●コマンドの追加と実行
addon はコマンドの class を定義してシステムに登録する必要があります。
Preferences Addons のチェックボックスの on/off で script 内の
register()/unregister() が呼び出されています。
このタイミングで class を登録を行います。
# test.py (2)
import bpy
bl_info= {
"name": "Test",
"category": "Import-Export",
}
class ExportTest( bpy.types.Operator ):
bl_label= 'export test'
bl_idname= 'export.test_a6'
def execute( self, context ):
print( "exec-command" )
return {'FINISHED'}
def unregister():
bpy.utils.register_module(__name__)
def register():
bpy.utils.unregister_module(__name__)
定義クラスは bl_label, bl_idname が必須で、bl_idname が識別子になっています。
(2) の test.py は Preferences Addos で正しくロードできます。
Preferences Addos の “Import-Export: Test” のチェックを入れると
register() が呼び出されて bl_idname で指定したコマンド名が有効になります。
Python Console を開いて export.test_a6() が実行できることを確認できます。
(↓太字は出力結果)
>>> bpy.ops.export.test_a6()
exec-command
{'NIFISHED'}
●Export Menu に追加する
付属の scripts/addons/io_scene_fbx を参考にしました。
io_export_direct_x.py の方は ExportHelper を使わずに実装されているようです。
# io_export_test_a6.py
import bpy
from bpy_extras.io_utils import ExportHelper
bl_info= {
"name": "Export Test a6",
"category": "Import-Export",
}
class ExportTestA6( bpy.types.Operator, ExportHelper ):
bl_label= 'export test a6'
bl_idname= 'export.test_a6'
filename_ext= '.txt' # ←必須
def execute( self, context ):
print( 'file=' + self.filepath )
return {'FINISHED'}
def menu_func(self, context):
self.layout.operator( ExportTestA6.bl_idname, text="Export Test a6 (.txt)" )
def unregister():
bpy.utils.unregister_module(__name__)
bpy.types.INFO_MT_file_export.remove(menu_func)
def register():
bpy.utils.register_module(__name__)
bpy.types.INFO_MT_file_export.append(menu_func)
register()/unregister() の中で class だけでなく menu_func も登録しています。
この menu_func() はメニューの
File → Export
のサブメニューを開くタイミングで呼ばれるようです。
self.layout.operator() の最初の引数が実行する class id、text が Menu のラベルです。
例えば menu_func() を
def menu_func(self, context):
self.layout.operator( "export_scene.fbx", text="Export Test a6?" )
と書き換えると File → Export →「Export Test a6?」の選択で fbx の
export を呼び出せます。
●Export 時のオプション
Export 実行時に左側のサイドバーでオプション選択ができます。
例えば選択されたオブジェクトだけ Export したり、Axis を変更したりなど。
このようなプロパティは Export class に追加しておきます。
~
class ExportTestA6( bpy.types.Operator, ExportHelper ):
bl_label= 'export test a6'
bl_idname= 'export.test_a6'
filename_ext= '.txt'
# ↓追加
flag_selected= BoolProperty( name= "Selected Objects",
description= "Export selected objects",
default= False )
def execute( self, context ):
print( 'file=' + self.filepath )
print( 'flag=', self.flag_selected )
return {'FINISHED'}
~
これで File → Export →「Export Test a6」を選択すると、
Export ファイル選択画面となり、左サイドバーから「Selected Objects」の
チェックが可能となります。
右上の「export test a6」ボタンを押すと、コンソール出力で
入力したファイル名と “Selected Objects” のチェック状態が読み取れている事がわかります。
まだ必要最小限ですが addon 登録周りの挙動がわかったので、
次は内部データのアクセスを行います。