MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その7(モディファイアの適用と並べ替え)

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

モディファイアの適用

指定のオブジェクトに設定された特定のモディファイアを適用します。
・apply_modifier_target.py

# bpyインポート
import bpy

# 特定のモディファイアを適用する
# - ミラーモディファイア
# - 細分割曲面モディファイア
# - シュリンクラップモディファイア
# - 辺分離モディファイア
# - 厚み付けモディファイア
# - ベベルモディファイア
#   対象モディファイアを保持しない場合は無視する
# モディファイアのタイプ一覧
# (https://docs.blender.org/api/current/bpy.types.Modifier.html#bpy.types.Modifier.type)
def apply_modifier_target(arg_objectname="Default") -> bool:
    """特定のモディファイアを適用する
    
    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})

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

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

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

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

    # オブジェクトの全てモディファイアを走査する
    # モディファイアのタイプ一覧
    # (https://docs.blender.org/api/current/bpy.types.Modifier.html#bpy.types.Modifier.type)
    for modifier in targetob.modifiers:
        # ミラーモディファイアを適用する
        if modifier.type == 'MIRROR':
            bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)
        # 細分割曲面モディファイアを適用する
        if modifier.type == 'SUBSURF':
            bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)
        # シュリンクラップモディファイアを適用する
        if modifier.type == 'SHRINKWRAP':
            bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)
        # 辺分離モディファイアを適用する
        if modifier.type == 'EDGE_SPLIT':
            bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)
        # 厚み付けモディファイアを適用する
        if modifier.type == 'SOLIDIFY':
            bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)
        # ベベルモディファイアを適用する
        if modifier.type == 'BEVEL':
            bpy.ops.object.modifier_apply(apply_as='DATA',modifier=modifier.name)

    return True


# 関数の実行例
apply_modifier_target("Cube")

f:id:bluebirdofoz:20191231223055j:plain

モディファイアの並べ替え

指定のオブジェクトに設定されたミラーモディファイアをリスト上位に並べ替えます。
・moveup_modifier_mirror.py

# bpyインポート
import bpy

# ミラーモディファイアをリストの先頭に移動する
# 対象モディファイアを保持しない場合は無視する
def moveup_modifier_mirror(arg_objectname="Default") -> bool:
    """ミラーモディファイアをリストの先頭に移動する
    
    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})

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

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

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

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

    # オブジェクトに設定中のモディファイア数を取得する
    modifier_num = len(targetob.modifiers)

    # 走査中のモディファイア位置を記録する(先頭から開始)
    check_num = 0
    
    # 全てのモディファイアを走査する
    while modifier_num > check_num:
      # ミラーモディファイアかチェックする
      if targetob.modifiers[check_num].type == 'MIRROR':

        # 操作中インデックスを保存する
        loop_num = check_num

        # 対象モディファイアなら先頭インデックスに移動する
        while check_num > 0:
          # ループ回避のため、上位モディファイアが同じモディファイアでないことを確認する
          if targetob.modifiers[check_num - 1].type != 'MIRROR':

            # モディファイア名を取得する
            name = targetob.modifiers[check_num].name

            # モディファイアを上位に移動する
            bpy.ops.object.modifier_move_up(modifier=name)

            # アクティブモディファイアを合わせて上位に移動する
            check_num = check_num - 1

          else:
            # 上位モディファイアが同じモディファイアなら処理を終了する
            break

      # 走査位置を移動する
      check_num = check_num + 1

    return True


# 関数の実行例
moveup_modifier_mirror("Cube")

f:id:bluebirdofoz:20191231223041j:plain