※ Blenderのバージョンは2.81aで検証しています
※ 2020/01/14追記 後日Shift+Gで階層選択ができる事が判明
新年あけましておめでとうございます。
新年一発目のネタですがBlenderでアーマチュア(ボーン)を階層選択するスクリプトです。
なんでこの機能デフォルトで付いてないんや……
コード(最後の注意書きはよく読んでね)
2020年1月1日22時27分:より良い形に修正
import bpy #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # ボーンの階層選択 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ def SelectHierarchyBone(bone): # ボーンを選択しているか判定用関数 def IsSelectBone(bone): retType = False if bone.select_head: retType = True return retType # 再帰的にボーンを選択する関数 def SelectBoneCycle(bone): bone.select = True bone.select_tail = True for childBone in bone.children: SelectBoneCycle(childBone) return # ボーンを選択している場合 if IsSelectBone(bone): SelectBoneCycle(bone) else: for childBone in bone.children: SelectHierarchyBone(childBone) return #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # 実際の処理 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print('+++++++++++++ start +++++++++++++') for armature in bpy.data.armatures: for bone in armature.edit_bones: SelectHierarchyBone(bone)
注意書き
・Blender初心者が作ったものなので間違いはあるかも
・Pythonもほとんど触った事がなかったので間違いはあるかも。(でも思ったよりは便利だった)
・コレクションには「ビューレイヤーから除外」という機能がありますが
こいつが中々の曲者で、オブジェクトリストを全部取得(bpy.data.objects)すると
除外された物も拾ってくる仕組みのようです。
尚且つ除外されたデータにアクセスすると
(アクセス可能なものもあるかもしれませんが)スクリプトエラーになる可能性があるという非常に面倒な代物でした。
除外されたオブジェクトは外してほしいと思う今日この頃。
・オブジェクトを全部探している関係上、少し重たいかもしれません。
最後に感想
これ作るのにめっちゃ時間かかったけど
Blenderの根幹がどういう風になっているか分かったという点では非常に良かった。
どうにもBlender2.8以前の物と思想的に違う部分があるらしく
2.8以前の過去文献と同様の挙動をしない物が多くて少し焦った。
でも、変更された内容は以前の物より洗練化されていて
使いやすくなっているので結果的に良いかなと思ってます。