見出し画像

[Blender][スクリプト]キーを指定したフレーム数だけ移動するツール(240920修正)

グラフエディタとドープシートのサイドバー(ツールタブ)にサムネの様なツールが出るので、数値を入力してボタンを押すと数値分フレーム移動します。
(240920修正)反動が置いていかれる問題を修正しました。AIが。


import bpy

# キーフレームを指定したフレーム数だけ移動する関数(グラフエディタ用)
def move_keys_graph(offset):
    # グラフエディタ用の移動
    bpy.ops.transform.translate(value=(offset, 0, 0))
    bpy.context.area.tag_redraw()

# キーフレームを指定したフレーム数だけ移動する関数(ドープシート用)
def move_keys_dope(offset):
    # ドープシート用の移動
    bpy.ops.transform.transform(mode='TIME_TRANSLATE', value=(offset, 0, 0, 0))
    bpy.context.area.tag_redraw()

# オペレーター定義(グラフエディタ用)
class ANIM_OT_move_keys_forward_graph(bpy.types.Operator):
    bl_idname = "anim.move_keys_forward_graph"
    bl_label = "+"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        offset = context.scene.key_move_offset
        move_keys_graph(offset)
        return {'FINISHED'}

class ANIM_OT_move_keys_backward_graph(bpy.types.Operator):
    bl_idname = "anim.move_keys_backward_graph"
    bl_label = "-"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        offset = -context.scene.key_move_offset
        move_keys_graph(offset)
        return {'FINISHED'}

# オペレーター定義(ドープシート用)
class ANIM_OT_move_keys_forward_dope(bpy.types.Operator):
    bl_idname = "anim.move_keys_forward_dope"
    bl_label = "+"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        offset = context.scene.key_move_offset
        move_keys_dope(offset)
        return {'FINISHED'}

class ANIM_OT_move_keys_backward_dope(bpy.types.Operator):
    bl_idname = "anim.move_keys_backward_dope"
    bl_label = "-"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        offset = -context.scene.key_move_offset
        move_keys_dope(offset)
        return {'FINISHED'}

# パネル定義(グラフエディタ用)
class ANIM_PT_key_mover_graph(bpy.types.Panel):
    bl_idname = "ANIM_PT_key_mover_graph"
    bl_label = "Move Keys"
    bl_space_type = 'GRAPH_EDITOR'
    bl_region_type = 'UI'
    bl_category = 'Custom'
    
    def draw(self, context):
        layout = self.layout
        scene = context.scene

        row = layout.row()
        row.prop(scene, "key_move_offset", text="Offset")
        
        row = layout.row(align=True)
        row.operator("anim.move_keys_backward_graph", text="-")  # - ボタンを先に配置
        row.operator("anim.move_keys_forward_graph", text="+")   # + ボタンを後に配置

# パネル定義(ドープシート用)
class ANIM_PT_key_mover_dope(bpy.types.Panel):
    bl_idname = "ANIM_PT_key_mover_dope"
    bl_label = "Move Keys"
    bl_space_type = 'DOPESHEET_EDITOR'
    bl_region_type = 'UI'
    bl_category = 'Custom'
    
    def draw(self, context):
        layout = self.layout
        scene = context.scene

        row = layout.row()
        row.prop(scene, "key_move_offset", text="Offset")
        
        row = layout.row(align=True)
        row.operator("anim.move_keys_backward_dope", text="-")  # - ボタンを先に配置
        row.operator("anim.move_keys_forward_dope", text="+")   # + ボタンを後に配置

# プロパティ登録
def register():
    bpy.utils.register_class(ANIM_OT_move_keys_forward_graph)
    bpy.utils.register_class(ANIM_OT_move_keys_backward_graph)
    bpy.utils.register_class(ANIM_OT_move_keys_forward_dope)
    bpy.utils.register_class(ANIM_OT_move_keys_backward_dope)
    bpy.utils.register_class(ANIM_PT_key_mover_graph)
    bpy.utils.register_class(ANIM_PT_key_mover_dope)
    
    bpy.types.Scene.key_move_offset = bpy.props.IntProperty(
        name="Offset",
        description="Number of frames to move keys",
        default=1
    )

def unregister():
    bpy.utils.unregister_class(ANIM_OT_move_keys_forward_graph)
    bpy.utils.unregister_class(ANIM_OT_move_keys_backward_graph)
    bpy.utils.unregister_class(ANIM_OT_move_keys_forward_dope)
    bpy.utils.unregister_class(ANIM_OT_move_keys_backward_dope)
    bpy.utils.unregister_class(ANIM_PT_key_mover_graph)
    bpy.utils.unregister_class(ANIM_PT_key_mover_dope)
    
    del bpy.types.Scene.key_move_offset

if __name__ == "__main__":
    register()

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