見出し画像

[Blender]「毎フレーム再生」「コマ落とし」「音声に同期」切替ボタンを常に見える場所に表示するスクリプト

今回もchtGPT産です。
Blenderは頻繁に変更する設定がちょっと深い場所にあって、現在の状態がひと目で分からない事が多いです。

import bpy

class PlayEveryFrameToggleOperator(bpy.types.Operator):
    """Toggle Play Every Frame"""
    bl_idname = "screen.play_every_frame_toggle"
    bl_label = "Toggle Play Every Frame"

    def execute(self, context):
        scene = context.scene
        scene.sync_mode = 'FRAME_DROP' if scene.sync_mode == 'PLAY_EVERY_FRAME' else 'PLAY_EVERY_FRAME'
        return {'FINISHED'}

def draw_play_every_frame_toggle(self, context):
    layout = self.layout
    scene = context.scene

    layout.prop(scene, "sync_mode", text="", toggle=True)

def register():
    bpy.utils.register_class(PlayEveryFrameToggleOperator)
    bpy.types.DOPESHEET_HT_header.append(draw_play_every_frame_toggle)
    bpy.types.GRAPH_HT_header.append(draw_play_every_frame_toggle)

def unregister():
    bpy.utils.unregister_class(PlayEveryFrameToggleOperator)
    bpy.types.DOPESHEET_HT_header.remove(draw_play_every_frame_toggle)
    bpy.types.GRAPH_HT_header.remove(draw_play_every_frame_toggle)

if __name__ == "__main__":
    register()

余談。テキストエディターの「登録」から、シーンファイルを読み込んだ時に自動実行するスクリプトを登録出来るのを知りました。
こういうスクリプトをアドオン化するか、スタートアップファイルに登録すするか、どう運用すべきか。。

追加
テキストエディタで登録してスタートアップファイルに保存すると何故かボタンが二つ追加されてしまいます。
下記でスタートアップファイルに保存すれば重複が起こりません。これもchatGPTによる修正。

import bpy

class PlayEveryFrameToggleOperator(bpy.types.Operator):
    """Toggle Play Every Frame"""
    bl_idname = "screen.play_every_frame_toggle"
    bl_label = "Toggle Play Every Frame"

    def execute(self, context):
        scene = context.scene
        scene.sync_mode = 'FRAME_DROP' if scene.sync_mode == 'PLAY_EVERY_FRAME' else 'PLAY_EVERY_FRAME'
        return {'FINISHED'}

def draw_play_every_frame_toggle(self, context):
    layout = self.layout
    scene = context.scene

    # プルダウンメニューを表示
    layout.prop(scene, "sync_mode", text="")

def register():
    bpy.utils.register_class(PlayEveryFrameToggleOperator)

    if not hasattr(bpy.types, "DOPESHEET_HT_header_draw_registered"):
        bpy.types.DOPESHEET_HT_header.append(draw_play_every_frame_toggle)
        bpy.types.DOPESHEET_HT_header_draw_registered = True

    if not hasattr(bpy.types, "GRAPH_HT_header_draw_registered"):
        bpy.types.GRAPH_HT_header.append(draw_play_every_frame_toggle)
        bpy.types.GRAPH_HT_header_draw_registered = True

def unregister():
    bpy.utils.unregister_class(PlayEveryFrameToggleOperator)

    if hasattr(bpy.types, "DOPESHEET_HT_header_draw_registered"):
        bpy.types.DOPESHEET_HT_header.remove(draw_play_every_frame_toggle)
        del bpy.types.DOPESHEET_HT_header_draw_registered

    if hasattr(bpy.types, "GRAPH_HT_header_draw_registered"):
        bpy.types.GRAPH_HT_header.remove(draw_play_every_frame_toggle)
        del bpy.types.GRAPH_HT_header_draw_registered

if __name__ == "__main__":
    register()

この記事が気に入ったらサポートをしてみませんか?