Blender addonを作ろう
最近モデリングが停滞気味なので気分転換にaddonを作成した。
addon作成のサイトは多くあるけど、それを読むには前提が飛躍している感じがしたので、その備忘録としてここに残しておく。
まずこの記事を読むにはpythonがある程度わかることが前提条件、具体的に言うとclassの概念を知っていればOK。
そして目指すところはaddonの構成を知り、他のサイトやサンプルコードがわかる程度を目指す。
今回のサンプルコードはスザンヌ(サル)のオブジェクトを追加し、メニューとサイドパネルに実行ボタンを置くaddonを作成する。
addonは4部構成に分けることができる。
・head部
・UI部
・Operator部
・foot部
head部
pythonお約束のライブラリインポート。bpyは必須でインポートする。from~を使うのは好みでこれを使うと後でモジュールを書くのが楽になる。
bl_infoにaddonの基本情報を書く。bl_infoはaddonインポート時のpreferencesに表示される。warning、wiki_url、tracker_urlは必須ではないのでaddon製作が慣れてきたら作る。
# ライブラリインポート
import bpy
from bpy.types import Panel,Operator
# 基本情報
bl_info = {
"name": "monkey_test",
"author": "Kageji",
"version": (0, 1),
"blender": (2, 83, 0),
"location": "3D View",
"description": "monkey test",
"warning": "",
"support": "TESTING",
"wiki_url": "",
"tracker_url": "",
"category": "Object"
}
UI部
機能を実行するためのUIを設計するところ。今回はメニュー、サイドバーに実行のボタンを追加する。
他にもpreferencesのUIやキーマップの設定など目的に応じて設定する。
# メニューに実行ボタン追加するための関数
def menu_monkey(self, context):
self.layout.separator()
#第一引数は実行機能クラスのbl_idname、textは間違えないようにあえてSaruと書いた
self.layout.operator(KJ_Create_Monkey.bl_idname, text="Saru")
# サイドバーに実行ボタンを追加するためのクラス
class KJ_Monkey_Panel(Panel):
bl_label = "Monkey_test"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "KJaddon"
def draw(self, context):
layout = self.layout
layout.label(text="Monky")
#第一引数は実行機能クラスのbl_idname
layout.operator(KJ_Create_Monkey.bl_idname, text="Monkey")
Operator部
実行する機能を書くところ。今回はスザンヌを追加する機能を作成した。
# 機能のクラス
class KJ_Create_Monkey(Operator):
bl_idname = "kjcreatemonkey.operator" #bl_idnameは小文字必須
bl_label = "KJ_Monkey"
def execute(self, context):
bpy.ops.mesh.primitive_monkey_add()
return {"FINISHED"}
foot部
設計したaddonをblenderに登録しON/OFFするところ。
ここはお約束みたいなところなので型で覚える。
register、unregisterはblender登録関数でどのaddonでも必須。
# 作ったクラスを格納
classes = [KJ_Monkey_Panel,KJ_Create_Monkey]
# belnderに登録する関数
def register():
for cls in classes:
bpy.utils.register_class(cls)
# メニュー関数はappendする
bpy.types.VIEW3D_MT_mesh_add.append(menu_monkey)
# belnderから登録解除する関数
def unregister():
for cls in classes:
bpy.utils.unregister_class(cls)
bpy.types.VIEW3D_MT_mesh_add.remove(menu_monkey)
# pythonファイルを実行するおまじない
if __name__ == "__main__":
register()
まとめ
こんな感じでaddonを4つに分解してみた。あとは作りたい機能をOperator部に書いて、自分が望むUI設計をすればオリジナルのaddonを作ることができる。
サンプルコード全部
import bpy
from bpy.types import Panel,Operator
bl_info = {
"name": "monkey_test",
"author": "Kageji",
"version": (0, 1),
"blender": (2, 83, 0),
"location": "3D View",
"description": "monkey test",
"warning": "",
"support": "TESTING",
"wiki_url": "",
"tracker_url": "",
"category": "Object"
}
def menu_monkey(self, context):
self.layout.separator()
self.layout.operator(KJ_Create_Monkey.bl_idname, text="Saru")
class KJ_Monkey_Panel(Panel):
bl_label = "Monkey_test"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "KJaddon"
def draw(self, context):
layout = self.layout
layout.label(text="Monky")
layout.operator(KJ_Create_Monkey.bl_idname, text="Monkey")
class KJ_Create_Monkey(Operator):
bl_idname = "kjcreatemonkey.operator"
bl_label = "KJ_Monkey"
def execute(self, context):
bpy.ops.mesh.primitive_monkey_add()
return {"FINISHED"}
classes = [KJ_Monkey_Panel,KJ_Create_Monkey]
def register():
for cls in classes:
bpy.utils.register_class(cls)
bpy.types.VIEW3D_MT_mesh_add.append(menu_monkey)
def unregister():
for cls in classes:
bpy.utils.unregister_class(cls)
bpy.types.VIEW3D_MT_mesh_add.remove(menu_monkey)
if __name__ == "__main__":
register()