蒼水技術録

蒼水家技術録

蒼水が普段制作とか勉強とかして覚えたことを復習としてまとめてるものです。 それが最適解かどうかはわからないけど、何を目的として始めて、何が必要で、実際何をやって、どうなったか、まで全部過程を残すための技術ブログです。

Blender アドオン編 #3 -アドオン開発勉強記録 第3回-

どうも蒼水です。
今回は前回の内容をもう少し掘り下げていく回になります。
前回の記事はこちら
atelier-aomi.hatenablog.com

今回の目的

前回実際にアドオンとして機能する部分であるオペレータークラスを1つ作成しましたが、今回はこのクラスを複数作成した場合どうすれば良いのか、という部分まで掘り下げていきます。
また、そのために機能をもう一つ作成することになります。
今回はそこまで重い内容でもないのでさらっと流す程度になるかなと思います。

オペレータークラスを1つ追加する。

前回ICO球を生成する機能を追加しましたが、今回はさらに立方体も生成する機能も付けてみます。
オペレータークラスに関する基本的なことは前回解説しているので省きますが、クラス変数、execute関数がクラスごとに必ず必要になるのでそれに合わせて今回は以下のようにしました。

class SAMPLE21_OT_CreateICOSphere(bpy.types.Operator):
    bl_idname = "object.sample21_create_icosphere"
    bl_label = "ICO Sphere"
    bl_description = "Add ICO Sphere."
    bl_options = {'REGISTER' , 'UNDO'}
    
    def execute(self, context):
        bpy.ops.mesh.primitive_ico_sphere_add()
        print("Sample : Add ICO Sphere.")
        
        return {'FINISHED'}
    
class SAMPLE21_OT_CreateCube(bpy.types.Operator):
    bl_idname = "object.sample21_create_cube"
    bl_label = "Cube"
    bl_description = "Add Cube."
    bl_options = {'REGISTER' , 'UNDO'}
    
    def execute(self, context):
        bpy.ops.mesh.primitive_cube_add()
        print("Sample : Add Cube")
        
        return{'FINISHED'}

前回からクラス名は変更していますが基本的には同じです。
プリミティブモデルを生成する関数を呼び出しているだけです。
適宜クラス変数の内容等は前回から変更しています。
クラスに関してはとりあえずこれだけです。

メニューに登録する

オペレータークラスが増えたということはそれぞれをメニューに追加してやらねばなりません。
こちらも前回と同様に引数にクラス.bl_idnameを渡してやるだけでOKです。

def menu_fn(self, context):
    self.layout.separator()
    self.layout.operator(SAMPLE21_OT_CreateICOSphere.bl_idname)
    self.layout.operator(SAMPLE21_OT_CreateCube.bl_idname)

Blenderにアドオンをぞれぞれ登録する

最後にいつものごとくBlenderにアドオンを登録していくわけですが、クラスが複数ある場合はこのあとのregister/unregisterでfor文に使うため、配列に入れておきます。

classes = [
    SAMPLE21_OT_CreateICOSphere,
    SAMPLE21_OT_CreateCube,
]

次にこれを使って1つずつ登録していきます。

def register():
    for c in classes:
        bpy.utils.register_class(c)
    bpy.types.VIEW3D_MT_mesh_add.append(menu_fn)
    print("クラスを二つ使用するサンプルアドオンが有効化されました。")

def unregister():
    bpy.types.VIEW3D_MT_mesh_add.remove(menu_fn)
    for c in classes:
        bpy.utils.unregister_class(c)
    print("クラスを二つ使用するサンプルアドオンが無効化されました。")

これでアドオンを有効化してみるときちんと【上部メニュー -> 追加】 にICO球に加え立方体も表示されていることが確認できます。
もちろん2個まで、ということもなくもっとたくさん扱うこともできます。登録さえできればとりあえす動く。(良いかどうかはさておき)
f:id:Yui_Aomi:20200315174352p:plain

コード全体

import bpy

bl_info = {
    "name": "サンプル:クラスを二つ使用するアドオン",
    "author": "Yui_Aomi",
    "version": (3, 0),
    "blender": (2, 80, 0),
    "location": "3D view Port > mesh > add",
    "description": "クラスを二つ使用するサンプルアドオン",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Object"
}

class SAMPLE21_OT_CreateICOSphere(bpy.types.Operator):
    bl_idname = "object.sample21_create_icosphere"
    bl_label = "ICO Sphere"
    bl_description = "Add ICO Sphere."
    bl_options = {'REGISTER' , 'UNDO'}
    
    def execute(self, context):
        bpy.ops.mesh.primitive_ico_sphere_add()
        print("Sample : Add ICO Sphere.")
        
        return {'FINISHED'}
    
class SAMPLE21_OT_CreateCube(bpy.types.Operator):
    bl_idname = "object.sample21_create_cube"
    bl_label = "Cube"
    bl_description = "Add Cube."
    bl_options = {'REGISTER' , 'UNDO'}
    
    def execute(self, context):
        bpy.ops.mesh.primitive_cube_add()
        print("Sample : Add Cube")
        
        return{'FINISHED'}

def menu_fn(self, context):
    self.layout.separator()
    self.layout.operator(SAMPLE21_OT_CreateICOSphere.bl_idname)
    self.layout.operator(SAMPLE21_OT_CreateCube.bl_idname)
    
classes = [
    SAMPLE21_OT_CreateICOSphere,
    SAMPLE21_OT_CreateCube,
]
    

def register():
    for c in classes:
        bpy.utils.register_class(c)
    bpy.types.VIEW3D_MT_mesh_add.append(menu_fn)
    print("クラスを二つ使用するサンプルアドオンが有効化されました。")

def unregister():
    bpy.types.VIEW3D_MT_mesh_add.remove(menu_fn)
    for c in classes:
        bpy.utils.unregister_class(c)
    print("クラスを二つ使用するサンプルアドオンが無効化されました。")

if __name__ == "__main__":
    register()

まとめ

クラスをひとつコードの中で複数扱う場合はそれぞれクラスを作成後、使用するクラスを配列にすべて格納、それをBlenderに登録してやる。
これで複数のオペレータークラスを扱うことが可能になるらしい。とりあえずクラスたくさん作ったら配列にぶっこんでおこう(雑)

次回はこれまで使用してきたプリミティブオブジェクトを生成するときにオペレータープロパティを使用して後から各種パラメータを制御する、ということをまとめていきます。

前回
atelier-aomi.hatenablog.com

次回(リンク作成予定)