本日は 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)