MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その47(共有メッシュの確認と解除)

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

共有メッシュの確認と解除

オブジェクトのメッシュデータが複数ユーザに共有されているものか確認します。
共有されているものであれば、対象のメッシュデータのシングルユーザ化を行います。
その後、カーブモディファイアの適用を行います。
・copy_mesh_single.py

# bpyインポート
import bpy

# 複数ユーザに参照されているメッシュをシングルユーザ化する
def copy_mesh_single(arg_objectname="Default") -> bool:
    """複数ユーザに参照されているメッシュをシングルユーザ化する

    Args:
        arg_objectname (str, optional): 指定オブジェクト名. Defaults to "Default".

    Returns:
        bool: 実行正否
    """

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

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

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

    # オブジェクトのメッシュデータを取得する
    # IDアクセスのマニュアル
    # (https://docs.blender.org/api/current/bpy.types.ID.html)
    mesh = selectob.data
    
    # メッシュの参照ユーザ数を取得する
    user_count = mesh.users

    # 複数のユーザが参照しているか確認する
    if user_count > 1:
        # シングルユーザ化するため、メッシュのコピーを作成して参照する
        selectob.data = mesh.copy()

    return True

# カーブモディファイアを適用する
# モディファイアのタイプ一覧
# (https://docs.blender.org/api/current/bpy.types.Modifier.html#bpy.types.Modifier.type)
def apply_modifier_curve(arg_objectname="Default") -> bool:
    """カーブモディファイアを適用する
    
    Args:
        arg_objectname (str, optional): 指定オブジェクト名. Defaults to "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

    # オブジェクトの全てモディファイアを走査する
    # モディファイアのタイプ一覧
    # (https://docs.blender.org/api/current/bpy.types.Modifier.html#bpy.types.Modifier.type)
    for modifier in selectob.modifiers:
        # カーブモディファイアを適用する
        if modifier.type == 'CURVE':
            bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)

    return True


# 関数の実行例
for item in bpy.data.objects:
    copy_mesh_single(arg_objectname=item.name)
    apply_modifier_curve(arg_objectname=item.name)

f:id:bluebirdofoz:20200702021735j:plain
f:id:bluebirdofoz:20200702021745j:plain