見出し画像

[Blender][スクリプト]Fカーブモディファイアの一括オンオフ

選択中のオブジェクトのFカーブモディファイアを一括でオン/オフするコマンドをグラフエディタのチャンネルメニューに追加します。
こういうの標準で必要だと思う。

import bpy

# モディファイアをオンにする関数
def enable_modifiers(self, context):
    selected_objects = bpy.context.selected_objects  # 選択中のオブジェクトを取得
    
    if not selected_objects:
        self.report({'WARNING'}, "オブジェクトが選択されていません。")
        return
    
    for obj in selected_objects:
        if obj.animation_data and obj.animation_data.action:
            action = obj.animation_data.action
            
            # アクション内のすべてのモディファイアをオンにする
            for fcurve in action.fcurves:
                for mod in fcurve.modifiers:
                    mod.mute = False  # モディファイアをオンに設定
            self.report({'INFO'}, f"{obj.name}のモディファイアがオンにされました。")
        else:
            self.report({'WARNING'}, f"{obj.name}にはアクションまたはモディファイアがありません。")

# モディファイアをオフにする関数
def disable_modifiers(self, context):
    selected_objects = bpy.context.selected_objects  # 選択中のオブジェクトを取得
    
    if not selected_objects:
        self.report({'WARNING'}, "オブジェクトが選択されていません。")
        return
    
    for obj in selected_objects:
        if obj.animation_data and obj.animation_data.action:
            action = obj.animation_data.action
            
            # アクション内のすべてのモディファイアをオフにする
            for fcurve in action.fcurves:
                for mod in fcurve.modifiers:
                    mod.mute = True  # モディファイアをオフに設定
            self.report({'INFO'}, f"{obj.name}のモディファイアがオフにされました。")
        else:
            self.report({'WARNING'}, f"{obj.name}にはアクションまたはモディファイアがありません。")

# メニューにカスタム項目を追加する関数
def menu_func(self, context):
    layout = self.layout
    layout.separator()
    layout.operator("graph.enable_modifiers", text="Enable Modifiers for Selected Objects")
    layout.operator("graph.disable_modifiers", text="Disable Modifiers for Selected Objects")

# モディファイアをオンにするオペレータークラス
class GRAPH_OT_EnableModifiers(bpy.types.Operator):
    bl_idname = "graph.enable_modifiers"
    bl_label = "Enable Modifiers"
    
    def execute(self, context):
        enable_modifiers(self, context)
        return {'FINISHED'}

# モディファイアをオフにするオペレータークラス
class GRAPH_OT_DisableModifiers(bpy.types.Operator):
    bl_idname = "graph.disable_modifiers"
    bl_label = "Disable Modifiers"
    
    def execute(self, context):
        disable_modifiers(self, context)
        return {'FINISHED'}

# メニューにオペレーターを登録する
def register():
    bpy.utils.register_class(GRAPH_OT_EnableModifiers)
    bpy.utils.register_class(GRAPH_OT_DisableModifiers)
    bpy.types.GRAPH_MT_channel.append(menu_func)

# メニューからオペレーターを削除する
def unregister():
    bpy.types.GRAPH_MT_channel.remove(menu_func)
    bpy.utils.unregister_class(GRAPH_OT_EnableModifiers)
    bpy.utils.unregister_class(GRAPH_OT_DisableModifiers)

if __name__ == "__main__":
    register()

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