MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その18(オブジェクトの親子関係の取得)

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

オブジェクトの親オブジェクトを取得する

オブジェクトの親オブジェクトをチェックして最上位オブジェクトを選択します。
最上位オブジェクトは親オブジェクトを取得できません。
select_parent_object.py

# bpyインポート
import bpy

# シーン内の最上位のオブジェクトのみ選択する
def select_parent_object() -> bool:
    """シーン内の最上位のオブジェクトのみ選択する

    Returns:
        bool -- 実行の正否
    """
    # シーン内の全てのオブジェクトを走査する
    for check_obj in bpy.context.scene.objects:
        # オブジェクトの親オブジェクト(parent)を取得する
        parent_obj = check_obj.parent
        # 親オブジェクトが取得できたかチェックする
        if parent_obj == None:
            # 親が取得できなければ最上位オブジェクト
            # オブジェクトを選択状態にする
            check_obj.select_set(True)
        else:
            # 親が取得できれば子オブジェクト
            # オブジェクトを非選択状態にする
            check_obj.select_set(False)
            
    return True


# 関数の実行例
select_parent_object()

f:id:bluebirdofoz:20200416205201j:plain

オブジェクトの子オブジェクトの一覧を取得する

オブジェクトの子オブジェクトをチェックして再帰的に選択します。
子オブジェクトは直下のオブジェクト群をタプルで取得できます。
・select_children_object.py

# bpyインポート
import bpy

# 指定オブジェクトとその全ての子オブジェクトを選択する
def select_children_object(arg_objectname='Default') -> bool:
    """指定オブジェクトとその全ての子オブジェクトを選択する

    Keyword Arguments:
        arg_objectname {str} -- 指定オブジェクト名 (default: {'Default'})

    Returns:
        bool -- 実行の正否
    """
    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    selectob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # オブジェクトを選択状態にする
    selectob.select_set(True)
    
    # 指定オブジェクトの子オブジェクト(children)を取得する
    children_objs = selectob.children

    # 子オブジェクトはタプルで取得される
    # 全ての子オブジェクトをチェックする
    for children_obj in children_objs:
        # 子オブジェクトを再帰的に走査して選択する
        select_children_object(children_obj.name)
    
    return True

# 全てのオブジェクトを非選択状態にする
def object_select_clear() -> bool:
    """全てのオブジェクトを非選択状態にする

    Returns:
        bool -- 実行の正否
    """
    # 全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

    return True

# 関数の実行例
object_select_clear()
select_children_object('Cube')

f:id:bluebirdofoz:20200416205214j:plain