MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その11(オブジェクトの複製と結合)

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

オブジェクトの複製

指定のオブジェクトを複製します。
引数指定で複製オブジェクトの名前を設定できます。
・duplicate_object_rename.py

# bpyインポート
import bpy

# オブジェクトを複製する
def duplicate_object_rename(arg_objectname="Default", arg_dupname="") -> bool:
    """オブジェクトを複製する
    
    Keyword Arguments:
        arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"})
        arg_dupname {str} -- 作成オブジェクト名 (default: {""})

    Returns:
        bool -- 実行の正否
    """

    # 他のオブジェクトに操作を適用しないよう全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    targetob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if targetob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False

    # 対象オブジェクトを選択状態に変更する
    targetob.select_set(True)

    # オブジェクトを複製する
    bpy.ops.object.duplicate_move(OBJECT_OT_duplicate=None, TRANSFORM_OT_translate=None)

    # 対象オブジェクトの選択状態を解除する
    targetob.select_set(False)

    # 複製オブジェクト名が指定されている場合は名前変更
    if len(arg_dupname) > 0:
        # 複製オブジェクトの名前を取得する
        duplicated_objectname=arg_objectname + ".001"
    
        # 複製オブジェクトを取得する
        duplicatedob=bpy.data.objects[duplicated_objectname]
    
        # 複製オブジェクトの名前を変更する
        duplicatedob.name=arg_dupname

    return True

# 関数の実行例
duplicate_object_rename(arg_objectname="Cube", arg_dupname="Duplicate")

f:id:bluebirdofoz:20200105112741j:plain

メッシュオブジェクトの結合

シーン中にある全てのメッシュオブジェクトを結合します。
・join_objects_mesh.py

# bpyインポート
import bpy

# メッシュオブジェクトを結合する
def join_objects_mesh(arg_objectname="") -> bool:
    """メッシュオブジェクトを結合する
    
    Keyword Arguments:
        arg_objectname {str} -- 結合オブジェクト名 (default: {""})

    Returns:
        bool -- 実行の正否
    """

    # シーン中の全てのオブジェクトを走査する
    for ob in bpy.context.view_layer.objects:
        # オブジェクトがメッシュであるか確認する
        if ob.type == 'MESH':
            # メッシュであれば選択状態にする
            ob.select_set(True)

            # 対象アクティブオブジェクトに切り替える
            # メッシュはアクティブオブジェクトに結合される
            bpy.context.view_layer.objects.active = ob
        else:
            # メッシュでなければ選択状態にしない
            ob.select_set(False)
    
    # オブジェクトの結合を実行する
    bpy.ops.object.join()
    
    # 結合オブジェクト名が設定されているか
    if len(arg_objectname):
        # オブジェクト名が設定されていれば名前を変更する
        bpy.context.view_layer.objects.active.name = arg_objectname
  
    return True

# 関数の実行例
join_objects_mesh("JoinedObject")

f:id:bluebirdofoz:20200105112751j:plain