MRが楽しい

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

Blender2.9で利用可能なpythonスクリプトを作る その85(オブジェクトを選択状態にする)

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

オブジェクトを選択状態にする

オブジェクトを選択状態にするには Object クラスの select_set() 関数を呼び出します。
また、選択状態を取得する select_get() 関数もあります。
docs.blender.org

Blender2.7 以前では select_set 関数は利用できない点に注意が必要です。
bluebirdofoz.hatenablog.com

bpy.context.view_layer.objects.active によるオブジェクトのアクティブとは状態が異なります。
オブジェクトのアクティブは1つのオブジェクトのみ選択できます。
docs.blender.org

例えば、複数のオブジェクトを同時に削除したい場合は上記の select_set() 関数でオブジェクトを選択状態にすると、delete() 関数の実行と同時に削除できます。
docs.blender.org

サンプルコード

体積が 2 以下のオブジェクトのみを選択状態にします。
不要なオブジェクトが選択状態にならないように、初めに全ての選択状態を解除しています。
・Script_select_objectlist.py

# bpyインポート
import bpy

# オブジェクトの選択状態をクリアする
def clear_select_object():
    """オブジェクトの選択状態をクリアする

    Keyword Arguments:

    Returns:
    """

    # アクティブなオブジェクトを解除する    
    bpy.context.view_layer.objects.active = None

    # シーン内の全オブジェクトを走査する
    for obj in bpy.context.scene.objects:

        # 選択状態のオブジェクトを非選択状態にする
        if obj.select_get():
            obj.select_set(False)
        
    return

# 指定のオブジェクトを全て選択状態にする
def select_objectlist(arg_targetobjectlist:list):
    """オブジェクトの寸法情報から体積を計算する

    Keyword Arguments:
        arg_targetobjectlist {list} -- 対象オブジェクトリスト

    Returns:
    """
    
    for obj in arg_targetobjectlist:

        # 指定データがオブジェクトでない場合は処理しない
        if isinstance(obj, bpy.types.Object) == False:
            continue

        # 指定のオブジェクトを選択状態にする
        obj.select_set(True)
        
    return

def delete_object():
    """オブジェクトの選択状態をクリアする

    Keyword Arguments:

    Returns:
    """

    # アクティブなオブジェクトを解除する    
    bpy.context.view_layer.objects.active = None

    # シーン内の全オブジェクトを走査する
    for obj in bpy.context.scene.objects:

        # 指定のオブジェクトを非選択状態にする
        obj.select_set(False)
        
    return

# オブジェクトの寸法情報から体積を計算する
def get_volume_object(arg_targetobject:bpy.types.Object) -> float:
    """オブジェクトの寸法情報から体積を計算する

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

    Returns:
        float -- 体積(取得失敗時:0)
    """
    
    # 指定オブジェクトがメッシュか確認する
    if arg_targetobject.type != 'MESH':

        # 指定オブジェクトがMESHでない場合は処理しない
        return 0
        
    # 指定オブジェクトの寸法情報を取得する
    # オブジェクトのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.Object.html)
    target_dimensions = arg_targetobject.dimensions

    # 体積を計算する(X軸の長さ x Y軸の長さ x Z軸の長さ)
    result_volume = target_dimensions[0] * target_dimensions[1] * target_dimensions[2]

    return result_volume

# 関数の実行例
# 最初に全てのオブジェクトの選択状態を解除する
clear_select_object()
# 体積が 2 以下のMeshオブジェクトリストを作成する
target_objectlist = list()
for obj in bpy.context.scene.objects:
    if obj.type != 'MESH':
        continue
    if (get_volume_object(obj) < 2.0):
        target_objectlist.append(obj)
# オブジェクトリストのオブジェクトを選択状態にする
select_objectlist(target_objectlist)

・実行前
f:id:bluebirdofoz:20211007205936j:plain
・実行後
f:id:bluebirdofoz:20211007205947j:plain