こんにちは!Rhinoです。
いや~暑いですね。外はそうでもないのですが、部屋の中が暑いです。
換気が悪いのかもしれません。熱中症には気を付けましょうね。
今日は作業中オブジェクトをリネームする必要があり、ちょっとしたスクリプトを書いてみました。こういうものはネット上にたくさんあるでしょうし、ここで紹介するものよりも高機能だと思いますが、どうやって作ろうかということを考えながら書いていくのは楽しいですね。
# -*- coding: utf-8 -*-
import maya.cmds as cmds
def renameObjects( *args ):
name = cmds.textField( 'txtfld_name', q=True, tx=True )
padAmount = cmds.intField( 'intfld_padding', q=True, v=True )
start = cmds.intField( 'intfld_start', q=True, v=True )
state = cmds.checkBox( 'ch_useOrgName', q=True, v=True )
selection = cmds.ls( sl=True, fl=True )
if not selection:
return
index = start
for s in selection:
if state:
cmds.rename( s, s + (str('{0:0' + str(padAmount) + 'd}').format(index)) )
else:
cmds.rename( s, name + (str('{0:0' + str(padAmount) + 'd}').format(index)) )
index += 1
def changeUseOrgNameCheckBox( *args ):
state = cmds.checkBox( 'ch_useOrgName', q=True, v=True )
if state:
cmds.text( 'txt_Name', e=True, en=False )
cmds.textField( 'txtfld_name', e=True, en=False )
else:
cmds.text( 'txt_Name', e=True, en=True )
cmds.textField( 'txtfld_name', e=True, en=True )
def createGUI( *args ):
if cmds.window( 'renamerWindow', exists=True ):
cmds.deleteUI( 'renamerWindow', window=True )
winRenamer = cmds.window( 'renamerWindow', title='Renamer', s=False )
cmds.columnLayout( co=['left', 8], w=356 )
cmds.separator( h=4 )
cmds.checkBox( 'ch_useOrgName', l='Use Original Name', cc=changeUseOrgNameCheckBox )
cmds.separator( h=4 )
cmds.rowLayout( nc=2 )
cmds.text( 'txt_Name', l='Name: ', w=60 )
cmds.textField( 'txtfld_name', w=280 )
cmds.setParent( '..' )
cmds.separator( h=4 )
cmds.rowLayout( nc=4 )
cmds.text( l='Padding: ', w=60 )
cmds.intField( 'intfld_padding', v=2, w=80 )
cmds.text( l='Start: ', w=60 )
cmds.intField( 'intfld_start', v=1, w=80 )
cmds.setParent( '..' )
cmds.separator( h=4 )
cmds.button( l='Rename', w=340, c=renameObjects )
cmds.separator( h=4 )
cmds.setParent( '..' )
cmds.showWindow( winRenamer )
def main():
createGUI()
if __name__ == '__main__':
main()
どんなツールにしようか?
僕はまずはどんなツールにしようか考えるところから始めます。具体的には使い勝手を想像しながら、UIを想像します。
今回はこんな感じにしてみました。
どんなコマンドを使えばよいのか
では、そのUIを作るためにはどんなコマンドが必要でしょうか。
主なコマンドはこの4種類になるかと思います。
機能 | コマンド |
---|---|
チェックボックス | checkBox |
名前の入力フィールド | textField |
桁数の入力フィールド | intField |
連番の最初の数値の入力フィールド | intField |
実行ボタン | button |
これらのコマンドを記述してUIを作成していきます。それはcreateGUI関数の中でやっています。ウィンドウの作り方はこちらをご覧ください。
チェックボックスで入力フィールドの使用可/不可を切り替える
元の名前を使うかどうかのチェックボックスを有効にすると、リネームする際に元々オブジェクトについている名前を使用するようにしてみました。
その際には新しい名前を入力するフィールドは必要ないので、使用不可の状態にします。チェックを無効にした場合は逆の動きをするようにしてみました。
それらは一連の機能はchangeUseOrgNameCheckBox関数でまとめています。
まずは現在のチェックボックスのチェックされているかどうかの状態を取得します。
フラグはvですね。
チェックボックスには’ch_useOrgName’という独自の名前をつけていますので、この名前でどのチェックボックスがどうかを判別します。
state = cmds.checkBox( 'ch_useOrgName', q=True, v=True )
取得した状態がTrueであればチェックされている、逆にFalseであればチェックされていないということなので、if文で場合分けしました。
各コントロールのenというフラグがコントロールの有効、無効を示しています。
eは編集しますよという意味ですね。
if state:
cmds.text( 'txt_Name', e=True, en=False )
cmds.textField( 'txtfld_name', e=True, en=False )
else:
cmds.text( 'txt_Name', e=True, en=True )
cmds.textField( 'txtfld_name', e=True, en=True )
リネームする
リネームはrenameObjects関数の中で行っています。
まずは新しく入力された名前や桁数、最初の数値など必要な値を取得してきましょう。
textFieldはtx、その他はvというフラグで取得してきます。
qはクエリです。欲しい値のフラグと組み合わせて要求することができます。
要は値を取得する際に使うフラグですね。日本語だと’問い合わせ’となるようです。
分かりづらいw
name = cmds.textField( 'txtfld_name', q=True, tx=True )
padAmount = cmds.intField( 'intfld_padding', q=True, v=True )
start = cmds.intField( 'intfld_start', q=True, v=True )
state = cmds.checkBox( 'ch_useOrgName', q=True, v=True )
次にこれまで通り選択したオブジェクトでループを回します。
と、その前に何も選択していなければ、returnで早々に抜けるようにしました。
selection = cmds.ls( sl=True, fl=True )
if not selection:
return
ループの中でオブジェクトを1つずつリネームしていきます。
最初にリネームする名前のリストを作成しておいて、最後にまとめてリネームする方法もありますが、今回は1つずつ行っていきます。この方が分かりやすいですよね。
ここでもチェックボックスの有効/無効でオリジナルの名前を使うか、新しく入力した名前を使うかif文で場合分けしています。
実際のリネームにはrenameというMayaの関数を使います。
index = start
for s in selection:
if state:
cmds.rename( s, s + (str('{0:0' + str(padAmount) + 'd}').format(index)) )
else:
cmds.rename( s, name + (str('{0:0' + str(padAmount) + 'd}').format(index)) )
index += 1
パディングについて
ではパディング、連番数値を付ける場合の桁を揃えるにはどうしたらよいのでしょうか?その場合はPythonにはこういう書き方があります。
int型の4桁の数値0001や000ような書式にformat関数を使って変換することができます。
これを使ってリネームする際の桁数を合わせることにしました。
print( "{0:04d}".format(1))
0001
今後も必要になったらいろいろな機能を追加してみたいです、より良い記述の仕方があれば勉強してみたいと思います。
では、また!
コメント