Hey #b3d peeps!!
Hello Worldをダイアログ表示するAdd-onを作成します。
最初なので、ごく簡単な、以下のようなものを。
プロパティのオブジェクトタブにHello Worldパネルを追加(パネル)
ボタンを押したら、Hello World!! ダイアログを表示(オペレーター)
Add-onの大まかな流れとしては、以下のようになることが分かればそれで良いです。オペレータークラスのexcute,invoke,drawが厳密にどんなことをするか、というのは書いていくうちになんとなくわかってくると思います :)
機能を実行するためにアクセスするパネルをクラスとして作成
パネルをどこに置くか、を決定する必要があります。
パネル内のレイアウトが必要です
機能を実行するオペレーターをクラスとして作成
定義する関数に決まりがあります
上記2つのクラスを登録して使えるように(使わないときは解除)
ソースコード
bl_info = { "name": "Hello World", "author": "Author", "version": (0, 0, 1), "blender": (2, 73, 0), "location": "Properties > Object", "description": "Simple Panel", "warning": "", "wiki_url": "", "tracker_url": "", "category": "Object"} import bpy class DialogOperator(bpy.types.Operator): bl_idname = "object.dialog_operator" bl_label = "Hello World Message" def execute(self, context): return {'FINISHED'} def invoke(self, context, event): wm = context.window_manager return wm.invoke_props_dialog(self) def draw(self, context): layout = self.layout col = layout.column() col.label(text="Hello World!!") class HelloWorldPanel(bpy.types.Panel): bl_idname = "OBJECT_PT_hello_world" bl_label = "Hello World" bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "object" def draw(self, context): layout = self.layout layout.label(text="Hello World!!") row = layout.row() row.operator("object.dialog_operator") def register(): bpy.utils.register_class(HelloWorldPanel) bpy.utils.register_class(DialogOperator) def unregister(): bpy.utils.unregister_class(HelloWorldPanel) bpy.utils.unregister_class(DialogOperator) if __name__ == "__main__": register()
'bl_info'は、Add-onとして登録するための情報です。ユーザープリファレンスのAdd-onタブで表示される情報や動作するバージョンなどの情報です。
bl_info = { "name": "Hello World", "author": "Author", "version": (0, 0, 1), "blender": (2, 73, 0), "location": "Properties > Object", "description": "Simple Panel", "warning": "", "wiki_url": "", "tracker_url": "", "category": "Object"}
Blenderへののデータアクセスのためにbpyパッケージをインポートします。インタラクティブコンソールではimportすることなく使えるのですが、Add-onとして実行時にはbpyパッケージのインポートが必要です。
import bpy
ダイアログを表示するオペレータークラスを作成します。ダイアログの開始時の描画処理(draw)、実行処理(execute)、呼び出し時処理(invoke)を記述しておきます。
class DialogOperator(bpy.types.Operator): bl_idname = "object.dialog_operator" bl_label = "Hello World Message" def execute(self, context): return {'FINISHED'} def invoke(self, context, event): wm = context.window_manager return wm.invoke_props_dialog(self) def draw(self, context): layout = self.layout col = layout.column() col.label(text="Hello World!!")
プロパティエディタ> Object に Hello Word パネルを登録します。その中にラベルとボタンを仕込みます。
PropertiesエディタのObjectタブに追加します。
ボタンは id_name =”object.dialog_operator"のクラス、すなわちDialogOperatorクラスを呼び出すよう指定します。
class HelloWorldPanel(bpy.types.Panel): bl_idname = "OBJECT_PT_hello_world" bl_label = "Hello World" bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "object" def draw(self, context): layout = self.layout layout.label(text="Hello World!!") row = layout.row() row.operator("object.dialog_operator")
HelloWorldPanelクラスとDialogOperatorクラスをregister()で登録、unregister()で登録解除します。これはプロパティパネルでそれぞれ有効にする(チェックを入れる)、無効にする(チェックを外す)操作時に呼び出されます。
def register(): bpy.utils.register_class(HelloWorldPanel) bpy.utils.register_class(DialogOperator) def unregister(): bpy.utils.unregister_class(HelloWorldPanel) bpy.utils.unregister_class(DialogOperator)
まあ、これはおまじないのようなものですので、特には説明しません。
if __name__ == "__main__": register()