見出し画像

[Blender][スクリプト]選択したキーのdurationを表示する

グラフエディタやドープシートで選択中のキーフレームのdurationをサイドバーに表示します。
選択したキーの内、タイムライン上で最後のキーから先頭のキーを引いた後、+1した値を表示します。

因みに何故こういうものを作っているかというと、アニマティックやプリビズの作業をBlenderだけで出来ないかと試行錯誤しているからです。
という事で、編集よりの機能を用意している所です。

bl_info = {
    "name": "ag_keyFrameDuration_sideBar",
    "blender": (4, 1, 0),
    "category": "Animation",
}

import bpy

class DURATION_PT_panel(bpy.types.Panel):
    bl_label = "Keyframe Duration"
    bl_idname = "CUSTOM_PT_panel"
    bl_space_type = 'DOPESHEET_EDITOR'  # ドープシートに表示
    bl_region_type = 'UI'
    bl_category = 'Custom'  # パネル名を「Custom」に変更

    def draw(self, context):
        layout = self.layout
        selected_keys = []

        # シーン内のすべてのオブジェクトからキーを取得
        for obj in bpy.context.scene.objects:
            # 通常のアニメーションキーを取得
            if obj.animation_data and obj.animation_data.action:
                for fcurve in obj.animation_data.action.fcurves:
                    for kp in fcurve.keyframe_points:
                        if kp.select_control_point:
                            selected_keys.append(kp.co.x)

            # グリースペンシルのキーを取得
            if obj.type == 'GPENCIL':
                for layer in obj.data.layers:
                    for frame in layer.frames:
                        if frame.select:
                            selected_keys.append(frame.frame_number)

        # キーフレームが選択されていない場合
        if not selected_keys:
            layout.label(text="No keys selected")
            return

        # 最小フレームと最大フレームを取得
        first_frame = min(selected_keys)
        last_frame = max(selected_keys)
        duration = last_frame - first_frame + 1  

        # フレームを時間(分:秒:フレーム)に変換
        fps = context.scene.render.fps
        total_seconds = duration / fps
        minutes = int(total_seconds // 60)
        seconds = int(total_seconds % 60)
        frames = int(duration % fps)

        # サイドバーにフレーム情報を表示
        layout.label(text=f"First Frame: {int(first_frame)}F")
        layout.label(text=f"Last Frame: {int(last_frame)}F")
        layout.label(text=f"Duration: {minutes:02}:{seconds:02}:{frames:02}f ({int(duration)}f)")

class GRAPH_EDITOR_DURATION_PT_panel(bpy.types.Panel):
    bl_label = "Keyframe Duration"
    bl_idname = "GRAPH_EDITOR_CUSTOM_PT_panel"
    bl_space_type = 'GRAPH_EDITOR'  # グラフエディタに表示
    bl_region_type = 'UI'
    bl_category = 'Custom'  # パネル名を「Custom」に変更

    def draw(self, context):
        layout = self.layout
        selected_keys = []

        # シーン内のすべてのオブジェクトからキーを取得
        for obj in bpy.context.scene.objects:
            # 通常のアニメーションキーを取得
            if obj.animation_data and obj.animation_data.action:
                for fcurve in obj.animation_data.action.fcurves:
                    for kp in fcurve.keyframe_points:
                        if kp.select_control_point:
                            selected_keys.append(kp.co.x)

        # キーフレームが選択されていない場合
        if not selected_keys:
            layout.label(text="No keys selected")
            return

        # 最小フレームと最大フレームを取得
        first_frame = min(selected_keys)
        last_frame = max(selected_keys)
        duration = last_frame - first_frame + 1  # 修正: +1を追加

        # フレームを時間(分:秒:フレーム)に変換
        fps = context.scene.render.fps
        total_seconds = duration / fps
        minutes = int(total_seconds // 60)
        seconds = int(total_seconds % 60)
        frames = int(duration % fps)

        # サイドバーにフレーム情報を表示
        layout.label(text=f"First Frame: {int(first_frame)}F")
        layout.label(text=f"Last Frame: {int(last_frame)}F")
        layout.label(text=f"Duration: {minutes:02}:{seconds:02}:{frames:02}f ({int(duration)}f)")

def register():
    bpy.utils.register_class(DURATION_PT_panel)
    bpy.utils.register_class(GRAPH_EDITOR_DURATION_PT_panel)

def unregister():
    bpy.utils.unregister_class(DURATION_PT_panel)
    bpy.utils.unregister_class(GRAPH_EDITOR_DURATION_PT_panel)

if __name__ == "__main__":
    register()


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