本日は 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)
・実行前
・実行後