テキストベースでモデリングする際に頻繁に行う、オブジェクトのアクティブ化を毎度処理を記述しなくてよいように関数化しておく


動作確認環境 : Blender 4.2


bpyでオブジェクトをアクティブ化


複数あるオブジェクトからアクティブ状態にするオブジェクトを指定します。

Python:
# オブジェクトアクティブ化
def active_element_select(
        object_name_list    # オブジェクト名リスト
):
    # 現在のモード保存
    current_mode = bpy.context.object.mode
    # モード切り替え
    bpy.ops.object.mode_set(mode='OBJECT')
    # 全オブジェクト選択解除
    bpy.ops.object.select_all(action='DESELECT')
    # アクティブオブジェクト選択
    for i in range(len(object_name_list)):
        object_name = object_name_list[i]
        myobject = bpy.data.objects.get(object_name)
        if myobject:
            myobject.select_set(True)  # 選択
            bpy.context.view_layer.objects.active = myobject  # アクティブ化
    # モードを戻す
    bpy.ops.object.mode_set(mode=current_mode)

    return myobject

6行目, 19行目
現在のモードを保存して、処理を抜けるタイミングでモードを元に戻す


アクティブ化処理の使用例


テキストベースのモデリング処理中で具体的に以下のように使用します。

Python :
def Base_create():
    # Mode 切り替え
    bpy.ops.object.mode_set(mode='OBJECT')

    # 立方体生成
    bpy.ops.mesh.primitive_cube_add(
        size=1
    ,   location=(0, 0, 0)
    ,   scale=(1,1,1)
    )
    bpy.context.object.name = "MyCube_001"

    # 立方体生成
    bpy.ops.mesh.primitive_cube_add(
        size=1
    ,   location=(1, 0, 0) 
    ,   scale=(1,1,1) 
    )
    bpy.context.object.name = "MyCube_002"

    # アクティブオブジェクト
    active_element_select(object_name_list=["MyCube_001"])

    # オブジェクト移動
    bpy.ops.transform.translate(
        value=(0, 0, 1)
    ,   orient_type='GLOBAL'
    )

Base_create()

22行目
「"MyCube_001"」と「"MyCube_002"」を切り替えると、25行目で移動するオブジェクトが切り替わります。

両方のオブジェクト名を指定することで、両方をアクティブオブジェクトとして選択することも可能です。

以上
このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット