my funeral week

少しでも日々の生活に変化を。

MayaScripts_NameReplacer:任意のノードの名前を置換する

こんにちは。
今は梅雨入りしてしばらく経つのですが、最近はずっと家の湿度が高いせいなのでしょうか、外から帰宅した時の部屋の臭さに毎回驚いてしまう毎日です。

今回は小スクリプトの掲載です。



NameReplacer

Maya標準でついてる「Search and Replace Names:名前を検索して置換」って機能あるじゃないですか。
あれって名前を 空白 に置換することって出来なくないですか?私の環境だけですかね。出来るんだったらもう終わりです。さようなら。

1回試して出来なかったもんで・・・面倒だから自分で簡単な名前置換スクリプトを作ってしまいました。
はい。今日はそれだけの為にお集まりいただきました。すみませんね。


コード

# encoding=utf8
# -*- coding:utf-8 -*-

NAME = "NameReplacer"
VERSION = "1.0"

print "-*- import " + NAME + VERSION + " -*-"

import pymel.core as pm

FIND_TARGET_TYPES = ["Selection", "Hierarchy", "Scene"]

def __getTargetNodes (findTargetType):
    """ターゲットとなるノードをタイプ別に取得"""
    
    if findTargetType == FIND_TARGET_TYPES[0]:
        return pm.selected()
    elif findTargetType == FIND_TARGET_TYPES[1]:
        targets = pm.selected()
        targets.extend(pm.listRelatives(ad = True))
        return targets
    return pm.ls()

def replaceIt (replace_target, replace_name, findTargetType):
    """名前置換実行部分"""
    
    if not replace_target : return
    
    for i in __getTargetNodes(findTargetType):
        name = i.name()
        newName = name.replace(replace_target, replace_name)
        
        try:
            i.rename(newName)
        except:
            print "rename action failed : " + i

def __buildUI ():
    """UI構築と表示"""
    
    if pm.window(NAME, q = True, ex = True):
        pm.deleteUI(NAME)
    
    with pm.window(NAME, mnb = False, mxb = False) as w:
        
        w.setWidth(240)
        w.setHeight(100)
        
        with pm.columnLayout(adj = True, rs = 2):
            
            pm.text(l = "Search => Replace", bgc = [0.9,0.5,0.3])
            
            with pm.rowLayout(nc = 2):
                pm.text(l = "Search : ", w = 60)
                target_field = pm.textField(w = 180)
                
            with pm.rowLayout(nc = 2):
                pm.text(l = "Replace : ", w = 60)
                name_field = pm.textField(w = 180)
            
            with pm.rowLayout(nc = 3):
                findTargetType_Field = pm.radioCollection()
                for i in FIND_TARGET_TYPES : pm.radioButton(i, w = 80)
                findTargetType_Field.setSelect(FIND_TARGET_TYPES[0])
            
            cmd_rename = lambda *arg : replaceIt(
                target_field.getText(),
                name_field.getText(),
                findTargetType_Field.getSelect()
                )
                
            pm.button(l = "Rename", c = cmd_rename)
            
def main ():
    __buildUI()


上記を「NameReplacer」とか適当な名前のPythonファイルに保存して、以下の場所に配置してください。

C:\Users\"ユーザー名"\Documents\maya\scripts


使い方

Maya上で以下のコードを実行してください。

import NameReplacer
NameReplacer.main()


実行したら下図のようなウィンドウが表示されます。

f:id:garysfirearms108:20210706001936j:plain

  • Search
    • 置換対象となる文字列を入力。
  • Replace
    • 置換したい文字列を入力。
    • 空白にしておくことで置換対象文字が削除される。
  • ラジオボタンリネーム対象となるノードの検索方法を選択。
    • Selection
      • 選択しているノードが対象。
    • Hierarchy
      • 選択しているノードの子供も対象。
    • Scene
      • シーン内の全てのノードが対象。
      • ノード数によっては激重なので注意。
    • Rename
      • 上記の内容でリネームを実行。

例えば画像にある状態で実行すると選択中のノードの名前から「MyCharacter_」という文字列が削除されます。

まぁ本当にだたそれだけのスクリプトです。標準機能で出来るんなら誰か教えて・・・。