[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()