MRが楽しい

MRやVRについて学習したことを書き残す

Blender3.0で利用可能なpythonスクリプトを作る その112(対象がアーマチュアオブジェクトかチェックしてポーズモードへ移行する)

本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。

対象がアーマチュアオブジェクトかチェックしてポーズモードへ移行する

Blender の Operator ではその関数が現在実行可能か poll 関数を利用することで確認できます。
bluebirdofoz.hatenablog.com

ただしモードを移行する mode_set 関数では引数にモードを指定するため、個別のモードごとのチェックができません。
よって今回は対象オブジェクトが ARMATURE オブジェクトかチェックすることで実行可否を判定しています。

サンプルスクリプト

指定のオブジェクトをチェックして ARMATURE オブジェクトであればポーズモードに移行可能と判定して指定オブジェクトをアクティブオブジェクトとして移行します。
・Script_change_posemodet.py

# bpyインポート
import bpy

# 対象がアーマチュアオブジェクトかチェックしてポーズモードへ移行する
# モード切替のマニュアル
# (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.mode_set)
def change_mode_pose(arg_targetobject:bpy.types.Object) -> bool:
    """対象がアーマチュアオブジェクトかチェックしてポーズモードへ移行する

    Keyword Arguments:
        arg_targetobject {bpy.types.Object} -- 対象オブジェクト

    Returns:
        bool -- 実行の正否
    """

    # 指定オブジェクトがアーマチュアか確認する
    # オブジェクトタイプの一覧
    # (https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object.type)
    if arg_targetobject.type != 'ARMATURE':
        # アーマチュアでない場合はポーズモードに移行しない
        return False

    # 一旦全てのオブジェクトの選択状態を外す
    for check_object in bpy.data.objects:
        check_object.select_set(False)

    # 指定のオブジェクトをアクティブオブジェクトに変更する
    bpy.context.view_layer.objects.active = arg_targetobject

    # ポーズモードに移行する
    set_mode_pose()

    return True

# ポーズモードへの移行
# モード切替のマニュアル
# (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.mode_set)
def set_mode_pose() -> bool:
    """ポーズモードへの移行

    Returns:
        bool -- 実行の正否
    """

    # ポーズモードに移行する
    # モード切替のマニュアル
    # (https://docs.blender.org/api/current/bpy.ops.object.html#bpy.ops.object.mode_set)
    # mode:POSE ポーズモードに切り替え
    # toggle:True の場合、既にポーズモードの時、オブジェクトモードに戻る
    bpy.ops.object.mode_set(mode='POSE', toggle=False)
    return True

# 関数の実行例
# 対象オブジェクトがアーマチュアオブジェクトであり「ポーズモード(POSE)」に移行可能なら移行する
result = change_mode_pose(arg_targetobject=bpy.data.objects.get("metarig"))
# 結果をコンソールに表示する
print("Set PoseMode : " + str(result))

・移行可能な場合
f:id:bluebirdofoz:20220312233412j:plain
f:id:bluebirdofoz:20220312233423j:plain

・移行できない場合
f:id:bluebirdofoz:20220312233434j:plain
f:id:bluebirdofoz:20220312233443j:plain