2017年11月6日月曜日

選択オブジェクトの一括結合

先日BlendXJPというBlenderのユーザーイベントがあったのですが
その中で登壇された方のモデリング作業で
モデファイアを活用して組み上げたモデルを1つのオブジェクトにまとめる作業を
一つ一つ変換かけた後に結合していたようだったので
自分が今使ってるスクリプトをアップしておきます
(理解が違ったら恥ずかしい限りですが)

オブジェクトモードで選択しているもののモデファイアを適応した状態のものを
一つのメッシュオブジェクトにまとめるという動作になります

自分の用途では細分化のモデファイアだけは適応していない状態で結合してほしいので実行しない処理になっています
import bpy
bl_info = {
    "name": "duplicate modified mesh objects",
    "author": "Y",
    "version": (3, 0),
    "blender": (2, 60, 0),
    "location": "3Dビュー > オブジェクト",
    "description": "apply modifier on selected objects and join objects",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Object"
}

# 翻訳用辞書
translation_dict = {
    "en_US" :
        {("*", 'duplicate modified mesh') : 'duplicate modified mesh'},
    "ja_JP" :
        {("*", 'duplicate modified mesh') : '結合したメッシュを作成'} }
#モデファイアを適応した複製を作成
def duplicate_modified(obj):
    bpy.ops.object.select_all(action = 'DESELECT')
    bpy.context.scene.objects.active = obj
    obj.select = True
    bpy.ops.object.duplicate()
    for mod in obj.modifiers:
        if  "Subsurf" in mod.name:continue
        try:
            bpy.ops.object.modifier_apply(modifier = mod.name)
        except: pass
    if obj.type == "CURVE":
        bpy.ops.object.convert(target='MESH')
    return(bpy.context.active_object)

#結合オブジェクトの作成
def joined_obj():
    serected_objects = bpy.context.selected_objects
    duplicate_objects = []
    #モデファイアの適応
    for obj in serected_objects:
        if obj.type in ["MESH","CURVE"]: 
            duplicate_objects.append( duplicate_modified(obj))
    #複製を選択
    for obj in duplicate_objects:
        obj.select = True
    #結合
    bpy.ops.object.join()

#モデファイアを適応して結合
class y_join_modified(bpy.types.Operator):
    bl_idname = "object.join_modified"
    bl_label = bpy.app.translations.pgettext('duplicate modified mesh')
    
    def execute(self, context):
        joined_obj()
        return {'FINISHED'}
def menu_funk(self, context):
    self.layout.operator(y_join_modified.bl_idname)

# 有効化時の処理
def register():
    bpy.app.translations.register(__name__, translation_dict)   # 翻訳辞書の登録
    bpy.utils.register_module(__name__)
    #オブジェクト>適応にメニュー項目を追加
    bpy.types.VIEW3D_MT_object_apply.append(menu_funk)
    

# 無効化時の処理
def unregister():
    bpy.app.translations.unregister(__name__)   # 辞書の削除
    bpy.utils.unregister_module(__name__)
    bpy.types.VIEW3D_MT_snap.remove(menu_funk)
################################################    


# メイン処理
if __name__ == "__main__":
    register()
    #joined_obj()
スクリプトエディッタで実行するか アドオンとして読み込むと オブジェクト>適応 の中に duplicate modified mesh という項目が追加されます