MRが楽しい

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

Blender3.0で利用可能なpythonスクリプトを作る その124(指定ボーンの親または子ボーンを参照する)

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

指定ボーンの親または子ボーンを参照する

ボーンの親または子ボーンには bpy.types.Bone データの parent または children 変数からアクセスできます。
docs.blender.org

本変数を再帰的にたどっていくことで指定ボーンの全ての親ボーンまたは子ボーンを参照できます。

サンプルスクリプト

アーマチュアオブジェクトとボーン名を指定すると、指定のボーンとその親ボーンを全て選択状態にします。
・Script_select_bone_parent.py

# bpyインポート
import bpy

# 指定アーマチュア内の指定ボーンの親ボーンを全て選択状態にする
def select_bone_parent(arg_targetobject:bpy.types.Object, arg_bonename:str) -> bool:
    """指定アーマチュア内の指定ボーンの親ボーンを全て選択状態にする

    Keyword Arguments:
        arg_targetobject {bpy.types.Object} -- 対象オブジェクト
        arg_bonename {str} -- 対象ボーン名

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

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

    # アーマチュア内の指定ボーンを取得する(有効状態のレイヤー内のボーンのみ対象)
    target_bone = arg_targetobject.data.bones.get(arg_bonename)
    if target_bone == None:
        # ボーンを取得できない場合は処理を終了する
        return False

    # 対象のボーンと子ボーンを全て選択状態する
    select_loop_bone_parent(target_bone)
        
    return True

# 指定アーマチュア内の指定ボーンの親ボーンを全て選択状態にする
def select_loop_bone_parent(arg_targetbone:bpy.types.Bone) -> bool:
    """指定アーマチュア内の指定ボーンの親ボーンを全て選択状態にする

    Keyword Arguments:
        arg_targetbone {bpy.types.Bone} -- 対象ボーン

    Returns:
        bool -- 実行の正否
    """
    
    # 選択状態に設定する
    # ボーン操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.Bone.html)
    arg_targetbone.select = True

    # 再帰的に処理する
    if arg_targetbone.parent != None :
        select_loop_bone_parent(arg_targetbone.parent)

    return True


# 関数の実行例
# 指定アーマチュア内の指定ボーンの親ボーンを全て選択状態にする
select_bone_parent(
    arg_targetobject=bpy.data.objects.get("metarig"),
    arg_bonename="shoulder.L")

アーマチュアオブジェクトとボーン名を指定すると、指定のボーンとその子ボーンを全て選択状態にします。
・Script_select_bone_children.py

# bpyインポート
import bpy

# 指定アーマチュア内の指定ボーンの子ボーンを全て選択状態にする
def select_bone_children(arg_targetobject:bpy.types.Object, arg_bonename:str) -> bool:
    """指定アーマチュア内の指定ボーンの子ボーンを全て選択状態にする

    Keyword Arguments:
        arg_targetobject {bpy.types.Object} -- 対象オブジェクト
        arg_bonename {str} -- 対象ボーン名

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

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

    # アーマチュア内の指定ボーンを取得する(有効状態のレイヤー内のボーンのみ対象)
    target_bone = arg_targetobject.data.bones.get(arg_bonename)
    if target_bone == None:
        # ボーンを取得できない場合は処理を終了する
        return False

    # 対象のボーンと子ボーンを全て選択状態する
    select_loop_bone_children(target_bone)
        
    return True

# 指定アーマチュア内の指定ボーンの子ボーンを全て選択状態にする
def select_loop_bone_children(arg_targetbone:bpy.types.Bone) -> bool:
    """指定アーマチュア内の指定ボーンの子ボーンを全て選択状態にする

    Keyword Arguments:
        arg_targetbone {bpy.types.Bone} -- 対象ボーン

    Returns:
        bool -- 実行の正否
    """
    
    # 選択状態に設定する
    # ボーン操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.Bone.html)
    arg_targetbone.select = True

    # 再帰的に処理する
    for child_bone in arg_targetbone.children :
        select_loop_bone_children(child_bone)

    return True


# 関数の実行例
# 指定アーマチュア内の指定ボーンの子ボーンを全て選択状態にする
select_bone_children(
    arg_targetobject=bpy.data.objects.get("metarig"),
    arg_bonename="shoulder.L")