2018年5月11日金曜日

選択した形状に関連するデータの名前をそろえる

Blenderでは個々のオブジェクトの名前の他
オブジェクトのポリゴンやマテリアル、テクスチャ、画像までがファイル内で名前をつけて管理されています。
映像等、レンダリング画像が最終出力になる場合には問題がないのですが、
ゲームのデータ等では名称を統一する必要があったりします

命名規則は様々ですが 今使ってる命名パターンでアドオンを作成してみました
bl_info = {
    "name": "リソースの名前を統一",
    "author": "Yukimi",
    "version": (3, 0),
    "blender": (2, 60, 0),
    "location": "プロパティ > オブジェクト",
    "description": "アクティブオブジェクトのデータ、マテリアルの名称を統一",
    "warning": "",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Object"
}
import bpy
from bpy.props import StringProperty

class CalibratePanel(bpy.types.Panel):
    """Creates a Panel in the Object properties window"""
    bl_label = "uniform name Panel"
    bl_idname = "OBJECT_uniform_name"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "object"
    
    def draw(self, context):
        
        layout = self.layout
        scene = context.scene
        obj = context.object
        row = layout.row()
        row.label(text="Active object is: " + obj.name)
        row = layout.row()
        row.operator("ab.get_f_name")
        row = layout.row()
        row.prop(scene, "uni_basename")
        row = layout.row()
        row.operator("ab.uniform_name")

#名称の変更
class RenameButton(bpy.types.Operator):
    bl_idname = "ab.uniform_name"
    bl_label = "名前の統一化"
    bl_options = {'REGISTER', 'UNDO'}
    def execute(self, context):
        scene = context.scene
        if not "uni_basename" in scene: pass
        ID = scene.uni_basename
        obj = context.object
        #オブジェクトの名前を揃える
        obj.name = ID + "_Obj"
        obj.data.name = ID + "_Mesh"
        if obj.data.uv_textures:
            obj.data.uv_textures.active.name = ID + "_UV" #アクティブなもののみ変更
        if obj.material_slots:
            for  i,mat_slot in enumerate(obj.material_slots):
                mat = mat_slot.material
                if not mat: continue
                mat.name= ID + "_Mtl_%02d" % i
                if mat.active_texture:
                    tex = mat.active_texture
                    tex.name = ID + "_Tex_%02d" % i
                    if tex.type == 'IMAGE' and tex.image:
                        tex.image.name = ID + "_Img_%02d" % i
        return{'FINISHED'}

#ファイル名を取得してテキスト入力の値を設定
class fpathButtonButton(bpy.types.Operator):
    bl_idname = "ab.get_f_name"
    bl_label = "ファイル名の取得"
    def execute(self, context):
        import os
        base_name = os.path.basename(bpy.context.blend_data.filepath)
        f_name = os.path.splitext(base_name)[0]
        context.scene.uni_basename = f_name
        return{'FINISHED'}

def init_props():
    scene = bpy.types.Scene
    scene.uni_basename = StringProperty(name = "揃える名前", default= "" )


#プロパティの削除
def crear_props():
    scene = bpy.types.Scene
    del uni_basename


def register():
    bpy.utils.register_module(__name__)
    init_props()


def unregister():
    bpy.utils.unregister_module(__name__)
    crear_props()


if __name__ == "__main__":
    register()

プロパティのオブジェクトタブに追加する形になっています
現状はUVはアクティブなもののみ末尾に_UVをつけ、マテリアルに通し番号をつけ、 テクスチャ、イメージ名はマテリアルの通し番号で命名するようにしています
名称の変更部分はシンプルなので 個々の案件によって調整できるかと思います
いかがでしょうか

0 件のコメント:

コメントを投稿