ジョイント階層内のすべてのジョイントの名前を既知の形式に変更するMELスクリプトを作成しています。アイデアは、股関節を選択すると、スクリプトが股関節の名前を変更し、他のすべての関節を調べて、階層内の位置に基づいて名前を変更するというものです。
MELのジョイント階層をどのようにトラバースできますか?
ジョイント階層内のすべてのジョイントの名前を既知の形式に変更するMELスクリプトを作成しています。アイデアは、股関節を選択すると、スクリプトが股関節の名前を変更し、他のすべての関節を調べて、階層内の位置に基づいて名前を変更するというものです。
MELのジョイント階層をどのようにトラバースできますか?
階層の最上位のジョイントの名前に割り当てて次のコードを実行すると、そのジョイントのすべての子要素に$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);
}
お役に立てれば
オブジェクトのハンドルは名前自体であるため、一意でない名前がある場合、MEL でこれを行うのは面倒です。ノードの親の名前を一意でない名前に変更すると、子の名前は異なります。名前の変更を開始する前にすべての名前のリストを保存すると、名前変更コマンドが存在しないノードの名前を変更しようとするため、エラーが発生します。私が知っている MEL の使用法は 2 つあります。しかし、最初に、はるかに簡単な pyMel ソリューションを使用することをお勧めします。
PyMel ソリューション:
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])
Aspm.ls
は、名前だけでなく、実際のオブジェクトのリストを返します。親ノードの名前を安全に変更し、その子への有効なハンドルを保持することができます。
本当に 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);
}
この再帰的なソリューションは、リーフ ノードにドリルダウンし、親の名前を変更する前にそれらの名前を変更します。
進行中に詳細な決定を行う必要がある場合は、一括で名前を変更するのではなく、階層をトラバースするのは非常に簡単です。コマンドは「listRelatives」です。「c」フラグを使用するとノードの子が返され、「p」フラグを使用すると親が返されます。(-p は単一のオブジェクトを返し、-c は配列を返すことに注意してください)
Joint1
Joint2
Joint3
Joint4
listRelatives -p Joint2
// Result: Joint1 //
listRelatives -c Joint2
// Result: Joint3, Joint4
注意が必要なのは名前の変更です。Maya は常に期待どおりの名前を提供するとは限らないためです (階層の同じレベルで重複した名前を使用することはできません)。名前が変更されたオブジェクトを追跡する必要があります。そうしないと、新しい名前が期待と一致しない場合に備えて、名前が変更された後にそれらを見つけることができなくなります。
それらを追跡する必要がある場合は、名前を変更する前に set コマンドでセットを作成できます。名前がどうなろうとも、すべてのオブジェクトはセット内に残ります。または、オブジェクトを選択して現在の選択の名前を変更することで、階層をトラバースすることもできます。これは変更を記録しませんが、操作の途中でオブジェクトの名前を変更してコマンドを台無しにするという問題はありません。