リネームツールを作ってみました

こんにちは!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

今後も必要になったらいろいろな機能を追加してみたいです、より良い記述の仕方があれば勉強してみたいと思います。
では、また!

コメント

タイトルとURLをコピーしました