MRが楽しい

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

Blenderで利用可能なpythonスクリプトを作る その27(空マテリアルスロットの削除、類似マテリアルの差し替え)

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

空マテリアルの削除

指定のオブジェクトからマテリアルが設定されていないからマテリアルを削除します。
delete_materialslot.py

# bpyインポート
import bpy

# 空のマテリアルスロットを削除する
# 引数   arg_objectname:指定オブジェクト名
# 戻り値
def delete_materialslot_none(arg_objectname='Default'):
   # 指定オブジェクトを取得する
   targetob = bpy.data.objects[arg_objectname]
   # 空のマテリアルスロットを削除する
   for num in range(len(targetob.material_slots))[::-1]:
     # 削除処理を行うので逆順に要素を追う
     targetmat=targetob.material_slots[num].material
     # マテリアルが空であるか
     if targetmat == None:
       # 空ならば削除する
       targetob.active_material_index=num
       bpy.ops.object.material_slot_remove()
   return

# 関数実行例
delete_materialslot_none('Cube')

f:id:bluebirdofoz:20190723092850j:plain
f:id:bluebirdofoz:20190723092903j:plain

類似マテリアルの差し替え

マテリアルスロットに登録されているマテリアルと全マテリアルを比較し、類似するマテリアルがあれば差し替えます。
スクリプトではディフューズ色のみを比較しています。
material_marge.py

# bpyインポート
import bpy

# 指定したオブジェクトのマテリアルを類似マテリアルにマージする
# マージ条件
#  - Diffuse カラー値
# 引数   arg_objectname:指定オブジェクト名
# 戻り値
def material_marge_object(arg_objectname='Default'):
   # 指定オブジェクトを取得する
   selectob = bpy.data.objects[arg_objectname]
   # 変更オブジェクトをアクティブに変更する
   bpy.context.scene.objects.active = selectob
   # オブジェクトがメッシュならマージ処理を実行する
   if selectob.type == 'MESH':
     # オブジェクトのマテリアルスロットを走査する
     for material_slot in selectob.material_slots:
       # スロットのマテリアルを取得
       checkmat = material_slot.material
       # マテリアルのディフューズ色を取得
       check_diffuse_color = checkmat.diffuse_color
       # 全マテリアルデータを走査する
       for compmat in bpy.data.materials:
         # 一致マテリアルを検出する前に自身がリストに出た場合
         # マージ処理を行わない
         if checkmat.name == compmat.name:
           break
         # 一致確認フラグ
         match_flg = True
         # ディフューズ色を比較
         if checkmat.diffuse_color != compmat.diffuse_color:
           # 不一致判定
           match_flg = False
         # 最終的なマテリアルの一致判定
         if match_flg:
           print('match')
           # マテリアルを一致したものに差し替え
           material_slot.material = compmat
           # マージ処理を終了する
           break
         else:
           print('nonmatch')
   return

# 関数の実行例
for ob in bpy.context.scene.objects:
   material_marge_object(ob.name)

f:id:bluebirdofoz:20190723092918j:plain
f:id:bluebirdofoz:20190723092933j:plain