2012-04-09 11 views
3

私は共同階層内のすべての関節の名前を既知の形式に変更するMELスクリプトを作成しています。アイデアはあなたがヒップジョイントを選択し、スクリプトがヒップの名前を変更し、他のすべてのジョイントを通り、階層内の位置に基づいてリネームするというものです。MEL:階層を越えて移動

どのようにMELのジョイント階層をトラバースできますか?

答えて

4

$stat_elementに階層内のトップジョイントの名前を割り当て、次のコードを実行すると、そのジョイントのすべての子要素に接頭辞"myPrefix_"が追加されます。

string $stat_element = "joint1"; 
select -r $stat_element; 
string $nodes[] = `ls -sl -dag`; 
for($node in $nodes){ 
    rename -ignoreShape $node ("myPrefix_" + $node); 
} 

希望これはあなたが一緒に行くよう代わりにバルクリネームの、詳細な意思決定を行うために必要がある場合は、階層を横断することは非常に単純です

+0

いくつかの名前が一意でない場合、lsはleft_hip | kneeなどの最も短い一意のパスを返します。あなたのメソッドで "fred_"と言って膝を接頭辞付けすると、fred_kneeは与えられません。それはfred_left_hip | kneeを与えようとしますが、それはエラーになります。 //名前に一致するオブジェクトがありません// –

0

に役立ちます。コマンドは 'listRelatives'です。 'c'フラグを指定すると、ノードの子を返し、 'p'フラグを指定すると親を返します。 Mayaはいつもあなたが期待する名前を与えることはありませんので、それは、名前の重複を許可しません(、

Joint1 
    Joint2 
     Joint3 
     Joint4 

listRelatives -p Joint2 
// Result: Joint1 // 
listRelatives -c Joint2 
// Result: Joint3, Joint4 

トリッキーなビットが改名ある(配列を返す-c、単一のオブジェクトを返す-pことに注意してください)階層の同じレベル)。名前が変更されたオブジェクトを追跡する必要があります。新しい名前が期待通りでない場合は、名前が変更されたオブジェクトを見つけることができません。

名前を追跡する必要がある場合は、名前を変更する前にsetコマンドを使用してセットを作成できます。どんな名前になっても、すべてのオブジェクトはまだセットに入っています。また、オブジェクトを選択して現在の選択項目の名前を変更することで階層を走査することもできます。変更を記録することはできませんが、操作の途中で名前を変更したり、コマンドを誤ってしまうオブジェクトには問題はありません。

0

オブジェクトに対して持っているハンドルが名前そのものなので、一意でない名前がある場合は、MELでこれを行うのが面倒かもしれません。一意でない名前のノードの親の名前を変更すると、その子の名前は異なります。名前の変更を開始する前にすべての名前のリストを保存していた場合、renameコマンドは存在しないノードの名前を変更しようとするため、エラーが発生します。私がMELを使って知っている2つのソリューションがあります。しかし、まず、pyMelのソリューションははるかに簡単で、私はそれを使用することをお勧めします。

PyMelソリューション:pm.lsとして

import pymel.core as pm 
objects = pm.ls(selection=True, dag=True, type="joint") 
pfx = 'my_prefix_' 
for o in objects: 
    o.rename(pfx + o.name().split('|')[-1]) 

実際のオブジェクトのリストを返すだけではなく、名前、あなたは安全に親ノードの名前を変更し、まだその子への有効なハンドルを持つことができます。

あなたが本当にMELでやりたいのであれば、名前を上から上に変更するか、親を扱う前に子供の名前を聞かないように再帰する必要があります。

最初のMELソリューションは、長いオブジェクト名のリストを取得し、それらの深さに基づいて最も深いものから並べ替えることです。この方法では、子供の前に親の名前を決して変更しないことが保証されます。ソートビットは複雑すぎてここで悩まされることはなく、再帰的な解決策はとにかく優れています。

再帰MELソリューション:

global proc renameHi(string $o, string $prefix) { 

    string $children[] = `listRelatives -f -c -type "joint $o`; 
    for ($c in $children) { 
     renameHi($c ,$prefix) ; 
    } 

    string $buff[]; 
    int $numToks = tokenize($o, "|", $buff); 
    string $newName = $buff[($numToks - 1)]; 

    $newName = ($prefix + $newName); 
    rename($o,$newName); 
} 

string $prefix = "my_prefix_"; 
string $sel[] = `ls -sl -type "joint"`; 
for ($o in $sel) { 
    renameHi($o, $prefix); 
} 

この再帰的な解決策は、リーフノードにドリルダウンし、両親の名前を変更する前に、それらの名前を変更します。