本日は 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")