こんにちは!Rhinoです。
自粛要請のため家に閉じこもりがちな休日を送ってはおりますが、
最近は温かい日も増えてきています。
気分を上げていきたいですね!
さて、今日は何を書こうかと思ったのですが、お仕事ではテクスチャ名や
マテリアル名などが決まっていることがありませんか?
例えばT_sample_texture_01.tgaというテクスチャが接続されているマテリアル名を
M_sample_texture_01と付けなければいけないルールがあることってよくありますよね。
そこで今回はテクスチャ名からマテリアル名を自動的に変更する方法をご紹介したいと
思います。
今回はこんな感じです。
選択したマテリアル名を接続されているテクスチャ名を使って置き換えるScriptになります。
ちょっと長いでしょうか?
# -*- coding: utf-8 -*-
import maya.cmds as cmds
selection = cmds.ls( sl=True, mat=True )
for mat in selection:
textureFileNode = cmds.listConnections( mat, d=False, s=True, t="file" )[0]
textureFileFullName = cmds.getAttr( textureFileNode + ".fileTextureName" )
textureFileName = textureFileFullName.split( "/" )[-1]
textureFileNewName = textureFileName.replace( "T_", "M_" )[:-4]
cmds.rename( mat, textureFileNewName )
解説
まずは選択したマテリアルを取ってきちゃいましょう!
今回はmatというフラグをTrueにしていますね。
slもTrueですので、これで選択したマテリアルのみを取得することができます。
selectionには選択したマテリアルのリストが入っていますよ。
selection = cmds.ls( sl=True, mat=True )
ピンとこない場合はprintで表示することもできます。
スクリプトエディタのpythonタブに下記のように書いて実行してみて下さい。
# -*- coding: utf-8 -*-
import maya.cmds as cmds
selection = cmds.ls( sl=True, mat=True )
print selection
[]で囲まれたマテリアル名が表示されましたでしょう?
変数の中身が知りたい場合はprintが便利ですね。
頭についているuは unicode 型 という意味なのですが、今は気にしなくて大丈夫です!
[u'blinn2', u'phong1', u'blinn3']
ちょっと脱線しましたね。
続いてselectionの中身をループで一つ一つ取り出してみましょう。
取り出したmatの中に入っているものは各マテリアルかと思いますので、
listConnectionsという関数を使ってマテリアルに接続されている
ファイルノードを取得します。
listConnectionsのフラグはd=False, s=Trueとしています。
入力側をオフ、出力側をオンにするという意味です。
さらにt=”file”でfileノードというタイプのみを取得しています。
今回はマテリアルに1つのファイルノードのみしか接続されていませんので、
[0]で listConnectionsで取得したリストの0番名のみを取り出しています。
for mat in selection:
textureFileNode = cmds.listConnections( mat, d=False, s=True, t="file" )[0]
textureFileNodeという変数に各マテリアルに接続されているファイルノードが入っています。
今度はこのファイルノードのアトリビュートからテクスチャの名前を取得したいと思います。
使いうのはgetAttrです。指定したアトリビュートの値を取れる便利な関数ですよ。
テクスチャを取るためにfileTextureNameというアトリビュートを使います。
textureFileFullName = cmds.getAttr( textureFileNode + ".fileTextureName" )
この時点で変数の中身をprintで表示してみましょう。
E:/maya/blog/sourceimages/T_sample_texture_01.tga
パス込みの名前が返ってきませんでしたでしょうか?
欲しいのテクスチャ名だけです。よく見ると拡張子もついていますね。
この2つをどうにかしたいです。
パスに注目すると/で区切られているのが分かりますね。
そこでsplitという関数を使って/で区切られている文字列をバラバラに分割します。
欲しいのは最後の T_sample_texture_01.tga ですので[-1]でバラバラになった
最後の文字列を取ってきましょう。
サンプルではT_というのがテクスチャを表し、M_がマテリアルを表すプリフィックスと
しています。
その為、次はreplace関数でT_をM_に変更し、拡張子の.tgaのように最後の4文字部分が
不要なので、[:-4]で削除します。
これで変更したいマテリアル名が準備できました。
textureFileName = textureFileFullName.split( "/" )[-1]
textureFileNewName = textureFileName.replace( "T_", "M_" )[:-4]
最後に既存のマテリアル名を新しいマテリアル名に置換して完了です。
cmds.rename( mat, textureFileNewName )
ちゃんと変わりましたでしょうか?
実際にはもっと複雑な名称がついているかもしれませんが基本はこんな感じです。
ぜひ、工夫してみて下さいね。
では、また!
コメント