MRが楽しい

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

Blender2.9で利用可能なpythonスクリプトを作る その75(UVマップレイヤーの編集)

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

UVマップレイヤーのリネーム

指定オブジェクトのレンダリング時に有効なUVマップレイヤーの名前を変更します。
・Script_rename_uvlayer_renderactive.py

# bpyインポート
import bpy

# 指定オブジェクトのレンダリング時に有効なUVマップレイヤーの名前を変更する
def rename_uvlayer_renderactive(arg_object:bpy.types.Object,
  arg_rename:str) -> bpy.types.MeshUVLoopLayer:
    """指定オブジェクトのレンダリング時に有効なUVマップレイヤーの名前を変更する

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト
        arg_rename (str): 変更名

    Returns:
        bpy.types.MeshUVLoopLayer: 有効なUVマップレイヤーの参照
    """

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

    # 対象オブジェクトのメッシュデータを取得する
    # メッシュデータ操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.Mesh.html)
    meshdata = arg_object.data

    # UVマップレイヤーのリストを取得する
    # UVマップレイヤーのリスト操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.UVLoopLayers.html)
    uv_layers = meshdata.uv_layers

    # レンダー設定がアクティブなUVマップを取得する
    active_uvlayer = None

    # UVマップレイヤーを全て走査する
    # 削除処理を行うので逆順に要素を追う
    for num in range(len(uv_layers))[::-1]:
        # UVマップレイヤーを取得する
        # UVマップレイヤー操作のマニュアル
        # (https://docs.blender.org/api/current/bpy.types.MeshUVLoopLayer.html)
        uv_layer = uv_layers[num]
        # レンダー設定の有効無効を判定する
        if uv_layer.active_render:
            # レンダー設定がアクティブなUVマップの名前を変更する
            uv_layer.name = arg_rename
            # レンダー設定がアクティブなUVマップを取得する
            active_uvlayer = uv_layer

    return active_uvlayer

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
renderactive_uvlayer = rename_uvlayer_renderactive(arg_object=target_obj, arg_rename="ActiveUVMap")
print("render active = " + renderactive_uvlayer.name)

・実行前
f:id:bluebirdofoz:20201207175847j:plain
・実行後
f:id:bluebirdofoz:20201207175856j:plain

UVマップレイヤーの削除

指定オブジェクトのレンダリング時に有効なUVマップレイヤー以外を削除します。
・Script_clean_uvlayer_renderactive.py

# bpyインポート
import bpy

# 指定オブジェクトのレンダリング時に有効なUVマップレイヤー以外を削除する
def clean_uvlayer_renderactive(arg_object:bpy.types.Object) -> bpy.types.MeshUVLoopLayer:
    """指定オブジェクトのレンダリング時に有効なUVマップレイヤー以外を削除する

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト

    Returns:
        bpy.types.MeshUVLoopLayer: 有効なUVマップレイヤーの参照
    """

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

    # 対象オブジェクトのメッシュデータを取得する
    # メッシュデータ操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.Mesh.html)
    meshdata = arg_object.data

    # UVマップレイヤーのリストを取得する
    # UVマップレイヤーのリスト操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.UVLoopLayers.html)
    uv_layers = meshdata.uv_layers

    # レンダー設定がアクティブなUVマップを取得する
    active_uvlayer = None

    # UVマップレイヤーを全て走査する
    # 削除処理を行うので逆順に要素を追う
    for num in range(len(uv_layers))[::-1]:
        # UVマップレイヤーを取得する
        # UVマップレイヤー操作のマニュアル
        # (https://docs.blender.org/api/current/bpy.types.MeshUVLoopLayer.html)
        uv_layer = uv_layers[num]
        # レンダー設定の有効無効を判定する
        if uv_layer.active_render:
            # レンダー設定がアクティブなUVマップを取得する
            active_uvlayer = uv_layer
        else:
            # アクティブでないUVマップは削除する
            uv_layers.remove(uv_layer)

    return active_uvlayer

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
renderactive_uvlayer = clean_uvlayer_renderactive(arg_object=target_obj)
print("render active = " + renderactive_uvlayer.name)

・実行前
f:id:bluebirdofoz:20201207175907j:plain
・実行後
f:id:bluebirdofoz:20201207175917j:plain