メッシュの名前を「MESH_オブジェクト名たち」にする
Pythonを使ってBlenderでできる事をまとめています。解説もあります。
はじめに
レシピ一覧
Pythonの難易度: ★★★☆☆
動機
オブジェクトの名前を変更しても、メッシュの名前までは変わりません。
いちいち変えるのも面倒くさいので、Pythonにやってもらいましょう。
細かい仕様
- メッシュ名を「MESH_オブジェクト名」にしてください。
- 複数のオブジェクトに共有されている場合、オブジェクト名の間を
_
で繋いでください - オブジェクトに使われていないメッシュは「MESH_NOUSER」と名付けてください。
サンプルコード
import bpy
meshes = bpy.data.meshes
mesh_obj_dict = {mesh.name:[] for mesh in meshes} # mesh_obj_dictを初期化
for obj in bpy.data.objects: # mesh_obj_dictのvalueを埋める
if obj.type == "MESH":
mesh = obj.data
mesh_obj_dict[mesh.name].append(obj.name)
for mesh, objs in mesh_obj_dict.items(): # meshの名前を変更する
if len(objs) == 0:
meshes[mesh].name = "MESH_NOUSER"
continue
meshes[mesh].name = "MESH_{0}".format("_".join(objs))
上記サンプルコードを、Blender内蔵のテキストエディタに貼り付けた後、Alt-Pを実行してください。
解説
全体の流れ
まず、{メッシュ:そのメッシュを使っているオブジェクトのlist}
(コード中ではmesh_obj_dict
)を初期化し、最初のfor文で完成させます。
その次のfor文ではmesh_obj_dict
を元にmeshの名前を上書きしています。
mesh_obj_dict
オブジェクトからそれが使用しているメッシュを知るにはobject.data
を除けばいいだけです。
一方、メッシュからそれを使用しているオブジェクトをたどる事は(一発では)出来ません。どうしてかは知りません。
そのため、bpy.data.objects内を探して、各オブジェクトが参照するメッシュごとに分類しています。
また、オブジェクトやmaterialなどデータの名前を一度変えてしまうと、そのデータを探すのが非常に難しくなります。
そのため、最初のfor文では名前の変更はしません。