見出し画像

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"
}

画像1

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")

画像2

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()

いいなと思ったら応援しよう!