Hero img
[Blender]アドオンの自作備忘録

blenderアドオンの自作備忘録

個人的に自作し、使用しているアドオンがあり、その備忘録となります。主にUIに表示させる方法。クラスを登録する方法がメインとなります。


目次

  • blenderのスクリプトを作成するテンプレート
  • 解説
  • pluginについての説明文
  • UIを追加
  • サンプルのコード
  • コンテキストメニュー
  • オブジェクト追加時
  • editモード時
  • まとめ

blenderのスクリプトを作成するテンプレート

import bpy
bl_info = {
    "name": "weight: pluginname",
    "author": "yumeno",
    "version": (1, 0),
    "blender": (3, 3, 1),
    "location": "",
    "description": "説明文",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Mesh"
}

class Original_Class(bpy.types.Panel):
  bl_space_type = 'VIEW_3D'
  bl_region_type = 'UI'
  bl_category = "tabname"
  bl_label = "ABCD"
  def draw(self, context):
    layout = self.layout
    layout.label = "text"
classs = [
  Original_Class
]

#
# register
#
def register():
  for c in classs:
    bpy.utils.register_class(c)
  
#
# unregister
#        
def unregister():
  for c in classs:
    bpy.utils.unregister_class(c)
#
# script entry
#        
if __name__ == "__main__":
  register()

解説

上記のコードをコピペして使用することができます。3.3.1vまで4.0以降は未確認。
blender 2.8からapi関連がかなり変わったので度々使えない機能があったりするのがまた大変だ。

pluginについての説明文

bl_info = {}

このに「bl_info」あるものはプラグインの概要を記入します。

  • name:プラグインの名前

weight,View,Mesh,Animationなどあり、厳格にルールが決められていませんが暗黙的ルールで入れておく方が無難

  • support:大枠のカテゴリー

Testing,Community,OfficialがあるCommunityで良いと思う。

  • category

プラグインのカテゴリー

blender-script-plugincategory

他のものについては個人で使う上ではあまり重要ではないので割愛します。

UIを追加

プラグインを作成するうえで重要なUI,結構ややこしい、とりあえず、UI,WINDOWだけが使えれば一旦いいのかな?

サンプルのコード

このサンプルのコードから簡単に解説します。

class Original_Class(bpy.types.Panel):
  bl_space_type = 'VIEW_3D'
  bl_region_type = 'UI'
  bl_category = "tabname"
  bl_label = "ABCD"
  def draw(self, context):
    layout = self.layout
    layout.label = "text"

bl_space_type

どのモード時に表示させるかを記入します。 bl_space_type一覧

例えば「DOPESHEET_EDITOR」とするとここでしか表示されません。 blender-script-dopesheet-editor 私はモデリング時に使うプラグインなので、基本的にはVIEW_3Dを入れることが多いかな

bl_region_type

これもまた重要で

region_type一覧 どこのカテゴリーに入れるかを聞かれます。   それぞれ覚えにくいため、動くコードも記載しておきます。

  • UI

右のタブにUIを追加できます。

表示位置
blender-script-region-ui
class Original_Class(bpy.types.Panel):
  bl_space_type = 'VIEW_3D'
  bl_region_type = 'UI'
  bl_category = "tabname"
  bl_label = "ABCD"
  def draw(self, context):
    layout = self.layout
    layout.label = "text"
  • TOOLS

左のツールにUIを追加できます。

表示位置
blender-script-region-tools
class Original_Class(bpy.types.Panel):
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
    bl_label = "ABCD"
    def draw(self, context):
        layout = self.layout
        layout.label(text="text")
  • TOOL_PROPS 新しく何か開いたときのオプションとして表示できます。
    ※ファイルを開く、fbxエクスポートする時等...
表示位置
blender-script-region-toolprops
class Original_Class(bpy.types.Panel):
    bl_space_type = 'FILE_BROWSER'
    bl_region_type = 'TOOL_PROPS'
    bl_label = "Sample"
    bl_parent_id = "FILE_PT_operator"
    def draw(self, context):
        layout = self.layout
        layout.label(text="text")
  • WINDOW

右のプロパティに追加する時に使う。
これもよく使う。

表示位置
class Original_Class(bpy.types.Panel):
    bl_space_type = 'VIEW_3D'
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "data"
    bl_label = "SAMPLES"
    def draw(self, context):
        layout = self.layout
        layout.label(text="text")
blender-script-region-window

bl_context

dataと設定しているので、dataのタブ時に表示されます。他には、「bl_context」,「material」、「curve_edit」,「render」,「scene」,「objectmode」,「view_layer」等々...

コンテキストメニュー

これも便利な機能だが、コードがちょっとめんどくさいことに...
右クリックして出てくるメニューに追加するには次の通りです。

オブジェクト追加時

import bpy
bl_info = {
    "name": "weight: pluginname",
    "author": "yumeno",
    "version": (1, 0),
    "blender": (3, 3, 1),
    "location": "",
    "description": "説明文",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Mesh"
}


def appendcontextmenu(self, context):
    #self.layout.operator_context = 'INVOKE_REGION_WIN'
    self.layout.menu(VERTEX_MT_custom_menu.bl_idname,
                     text="ABCDEEE")


class VERTEX_MT_custom_menu(bpy.types.Menu):
  bl_idname = "VIEWContextmenu"
  bl_label = "contextmenue-desu"

  def draw(self, context):
    layout = self.layout
    layout.label(text="SAMPLE")

classs = [
 VERTEX_MT_custom_menu
]


#
# register
#
def register():
  for c in classs:
    bpy.utils.register_class(c)
    bpy.types.VIEW3D_MT_mesh_add.prepend(appendcontextmenu)
  
#
# unregister
#        
def unregister():
  for c in classs:
    bpy.utils.unregister_class(c)
    bpy.types.VIEW3D_MT_mesh_add.remove(appendcontextmenu)
    

#
# script entry
#        
if __name__ == "__main__":
  register()

blender-script-contextmenu

editモード時

import bpy
bl_info = {
    "name": "weight: pluginname",
    "author": "yumeno",
    "version": (1, 0),
    "blender": (3, 3, 1),
    "location": "",
    "description": "説明文",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Mesh"
}


def appendcontextmenu(self, context):
    layout = self.layout
    layout.label(text="SAMPLE")
    
class VERTEX_MT_custom_menu(bpy.types.Menu):
  bl_idname = "VIEWContextmenu"
  bl_label = "contextmenue-desu"

  def draw(self, context):
    layout = self.layout
    layout.label(text="SAMPLE")

classs = [
 VERTEX_MT_custom_menu
]


#
# register
#
def register():
  for c in classs:
    bpy.utils.register_class(c)
    bpy.types.VIEW3D_MT_edit_mesh_context_menu.prepend(appendcontextmenu)
  
#
# unregister
#        
def unregister():
  for c in classs:
    bpy.utils.unregister_class(c)
    bpy.types.VIEW3D_MT_edit_mesh_context_menu.remove(appendcontextmenu)
    

#
# script entry
#        
if __name__ == "__main__":
  register()

blender-script-edit-context-menu

まとめ

個人的にはパイメニューをよく使っているが、かなり複雑なので、後でこの記事に追加します。 4.0でもプラグインが使えますように...

関連記事

コメント

コメントを書く

質問や、間違いがありましたら、お気軽にどうぞ

※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください