MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その21(マテリアルの作成と削除)

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

対象オブジェクトにマテリアルを追加する

指定のオブジェクトに指定名のマテリアルを追加します。
スクリプトからマテリアルを作成する場合、ノードの使用はデフォルトで無効になっています。
・add_material_target.py

# bpyインポート
import bpy

# 指定オブジェクトに指定名のマテリアルを追加する
def add_material_target(arg_objectname="Default",
      arg_materialname="NewMaterial", arg_usenode=True) -> bool:
    """指定オブジェクトに新規マテリアルを作成する

    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})
        arg_materialname {str} -- 追加マテリアル名 (default: {"NewMaterial"})
        arg_usenode {bool} -- ノード利用の有無 (default: {True})

    Returns:
        Bool -- 実行正否
    """

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

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # 指定オブジェクトがメッシュオブジェクトか確認する
    if selectob.type != 'MESH':
        # メッシュオブジェクトでない場合は処理しない
        return False

    # オブジェクトをアクティブにする
    bpy.context.view_layer.objects.active = selectob

    # 指定名のマテリアルを取得する
    add_mat = bpy.data.materials.get(arg_materialname)

    # 指定名のマテリアルが存在するか確認する
    if add_mat == None:
        # 指定名のマテリアルが存在しない場合は新規マテリアルを作成する
        add_mat = bpy.data.materials.new(arg_materialname)

        # ノードの利用指定を確認する
        if arg_usenode == True:
            # ノードを使用する
            add_mat.use_nodes = True

    # 指定名のマテリアルスロットを取得する
    check_matslot = selectob.material_slots.get(arg_materialname)

    # 指定マテリアルが存在するか確認する
    if check_matslot != None:
        # 指定名のマテリアルスロットが既に存在する場合は処理しない
        return False

    # マテリアルスロットを追加する
    bpy.ops.object.material_slot_add()

    # 追加したマテリアルスロットに指定名のマテリアルを設定する
    selectob.active_material = add_mat

    return True

# 関数の実行例
add_material_target(
    arg_objectname = "Sphere",
    arg_materialname = "SphereMaterial",
    arg_usenode=True
)

f:id:bluebirdofoz:20200427225243j:plain

対象オブジェクトの指定マテリアルを削除する

指定のオブジェクトの指定マテリアルを削除します。
・delete_material_target.py

# bpyインポート
import bpy

# 指定オブジェクトの指定マテリアルを削除する
def delete_material_target(arg_objectname="Default", arg_materialslotname="DeleteMaterial") -> bool:
    """指定オブジェクトの指定マテリアルを削除する

    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})
        arg_materialslotname {str} -- 削除マテリアルスロット名 (default: {"DeleteMaterial"})

    Returns:
        Bool -- 実行正否
    """

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

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # 指定オブジェクトがメッシュオブジェクトか確認する
    if selectob.type != 'MESH':
        # メッシュオブジェクトでない場合は処理しない
        return False

    # オブジェクトをアクティブにする
    bpy.context.view_layer.objects.active = selectob

    # 指定のマテリアルスロットを取得する
    deletematerial_slot = selectob.material_slots.get(arg_materialslotname)

    # 指定マテリアルが存在するか確認する
    if deletematerial_slot == None:
        # 指定マテリアルが存在しない場合は処理しない
        return False
        
    # 指定マテリアルスロットをアクティブにする
    selectob.active_material = deletematerial_slot.material

    # マテリアルスロットを削除する
    bpy.ops.object.material_slot_remove()
    
    return True

# 関数の実行例
delete_material_target(arg_objectname = "Sphere", arg_materialslotname = "SphereMaterial")

f:id:bluebirdofoz:20200427225257j:plain

対象オブジェクトの全マテリアルを削除する

指定のオブジェクトの全マテリアルを削除します。
・delete_material_all.py

# bpyインポート
import bpy

# 指定オブジェクトの全マテリアルを削除する
def delete_material_all(arg_objectname="Default") -> bool:
    """指定オブジェクトに新規マテリアルを作成する

    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})

    Returns:
        Bool -- 実行正否
    """

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

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # 指定オブジェクトがメッシュオブジェクトか確認する
    if selectob.type != 'MESH':
        # メッシュオブジェクトでない場合は処理しない
        return False

    # オブジェクトをアクティブにする
    bpy.context.view_layer.objects.active = selectob

    # マテリアルスロットを走査する
    for material_slot in selectob.material_slots:

        # マテリアルスロットをアクティブにする
        selectob.active_material = material_slot.material

        # マテリアルスロットを削除する
        bpy.ops.object.material_slot_remove()
    
    return True

# 関数の実行例
delete_material_all(arg_objectname = "Sphere")

f:id:bluebirdofoz:20200427225307j:plain