夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Blender Pyhonで選択中の複数オブジェクトを順に取得する

本日はBlender Python枠です。

BlenderではオブジェクトモードでShiftキーを押しながらオブジェクトを選択すること複数のオブジェクトを選択することができます。

結合(Ctrlキー+Jキー)やウェイトペイントの転写など一部の機能は最後に選択したオブジェクトに対して前に選択したオブジェクトを操作させるようなことができます。

今回はこのように複数オブジェクトの選択における最後に選択したオブジェクトとすでに選択されているオブジェクトについてPythonを使用してどのように取得できるのかを見ていきます。

〇環境

・Windows11

Blender 4.1

Blender Pythonで選択中のオブジェクトの取得

Blender Pythonを用いて選択中のオブジェクトを取得するには次のように処理をします。

import bpy

# アクティブなオブジェクトを取得
active_object = bpy.context.active_object

if active_object is not None:
    # オブジェクト名を表示
    print("選択中のオブジェクト名: ", active_object.name)
else:
    print("オブジェクトが選択されていません。")

このコードでは選択中のオブジェクト名が表示されます。

コードを実行することでオブジェクト名を表示することができます。

bpy.context.active_objectは選択中のオブジェクトを取得します。今回はnameのデータとしてオブジェクト名を取得しています。

しかしながらこのコードでは最後に選択したもののみが出力対象で複数選択に対応していません。

〇複数選択に対応したオブジェクトの取得

複数選択に対応させたオブジェクトの取得のコードはこちらです。

import bpy

# 選択されたすべてのオブジェクトを取得
selected_objects = bpy.context.selected_objects

if selected_objects:
    # 選択されたすべてのオブジェクトの名前を表示
    for obj in selected_objects:
        print("選択中のオブジェクト名: ", obj.name)
else:
    print("オブジェクトが選択されていません。")

bpy.context.selected_objectsと最初のコードと同じように見えて複数形であることが特徴です。これによって複数取得できます。

あとはfor文で名前を表示しています。

複数選択されている状態でこのコードを実行することで選択中のオブジェクトすべてを取得できます。

では応用して最後に選択されているオブジェクトを別に表示します。

import bpy

# 選択されたすべてのオブジェクトを取得
selected_objects = bpy.context.selected_objects

# アクティブなオブジェクトを取得
active_object = bpy.context.active_object

if selected_objects:
    # 選択されたすべてのオブジェクトの名前を表示
    for obj in selected_objects:
        print("選択中のオブジェクト名: ", obj.name)
    
    # アクティブなオブジェクトの名前を特別に表示
    if active_object is not None and active_object in selected_objects:
        print("最後に選択したオブジェクト名: ", active_object.name)
else:
    print("オブジェクトが選択されていません。")

特徴はif active_object is not None and active_object in selected_objectsです。

この条件式は2つの条件がともに満たされている場合に実行されます。

①アクティブオブジェクトが存在する場合active_object is not None

②アクティブオブジェクトがselect_objectsのリストに含まれることNone and active_object in selected_objects

つまり、最初のコードの条件を使用しています。

これを実行することで期待していた挙動を見せました。

本日は以上です。