Blenderの簡単なアドオンを作成してみた

2022/04/11に公開

Blender2.8以降のバージョンの簡単なアドオンを作成してみました。
作成したアドオンは以下の2つ。

  • skipframeアドオン
  • set_start&endアドオン

ソースコード
https://github.com/textcunma/MyBlenderAddon

skipframeアドオン

概要

現在のフレームから+2、+3、+4飛ばしすることができるアドオン。ボタンまたはショートカットで操作可能。ドープシートまたはタイムライン上でボタンを表示。

経緯

2コマベタ打ちや3コマベタ打ちする際に毎回現在のフレームを1つずつ変更するのが面倒だった

コード説明

2フレーム前に進む処理の場合は小難しいことはせずに、現在のフレームに対して2を追加

# 2フレーム前に進む処理をするクラス
class AddonTranslationFrameNum2_Forward(Operator):
  # 省略----
    def execute(self,context):
        bpy.context.scene.frame_current+=2
        return {'FINISHED'}

ショートカットを適用するエディタの設定。アニメーションに関するエディタに対してショートカットキーを有効にしています。

def registershortcut():
	editor_l = [
	    ('Dopesheet', 'DOPESHEET_EDITOR'),
	    ('Graph Editor', 'GRAPH_EDITOR'),
	    ("NLA Editor", "NLA_EDITOR"),
	    ("Sequencer", "SEQUENCE_EDITOR")
	]

ボタンを配置するエディタの設定。タイムラインとドープシートでボタンを配置しています

def register():
    # 省略
    bpy.types.TIME_MT_editor_menus.append(draw_menu)
    bpy.types.DOPESHEET_MT_editor_menus.append(draw_menu)

Blenderのドキュメント読んだところエディタのクラス名等が不明だったため、実際のコードを見に行った方が理解が速かったです。例えば、以下はspace_time.pyの最終行付近のコードでクラス名が明記されています。このクラス名を手掛かりにボタンの配置のコードを書いています。

classes = (
    TIME_MT_editor_menus,
    TIME_MT_marker,
    TIME_MT_view,
    TIME_MT_cache,
    TIME_PT_playback,
    TIME_PT_keyframing_settings,
    TIME_PT_auto_keyframing,
)

set_start&endアドオン

概要

コンテクストメニューから開始フレーム・終了フレームを現在のフレームにするアドオン。

経緯

シミュレーションの開始時間がデフォルトで1フレームからで、毎回ちょうど良い状態で開始時間になるように設定することが面倒だった

コード説明

開始フレームを現在のフレーム数にする処理は、開始フレームの変数に現在のフレームに関する変数の値を渡しているだけです。

# 現在のフレームを開始時間にするクラス
class AddonStartTimeNow(Operator):
  # 省略----
    def execute(self,context):
        bpy.context.scene.frame_start=bpy.context.scene.frame_current
        return {'FINISHED'}

コンテクストメニューに要素を追加するために、context_menuに対してメニューを描画する関数を渡しています。

def draw_menu(self, context):
    layout = self.layout
    layout.separator()
    layout.operator(AddonStartTimeNow.bl_idname, text="現在のフレームを開始フレームにする")
    layout.operator(AddonEndTimeNow.bl_idname, text="現在のフレームを終了フレームにする")
    
def register():
    # 省略
  bpy.types.DOPESHEET_MT_context_menu.append(draw_menu)

参考

Discussion