Es kann unordentlich sein, dies in MEL zu tun, wenn Sie nicht eindeutige Namen haben, weil das Handle, das Sie für das Objekt haben, der Name selbst ist. Sobald Sie ein Elternelement eines Knotens mit einem nicht eindeutigen Namen umbenennen, unterscheidet sich der Name des Kindes. Wenn Sie die Liste aller Namen vor dem Umbenennen gespeichert haben, erhalten Sie Fehler, da der Umbenennungsbefehl versucht, Knoten umzubenennen, die nicht vorhanden sind. Es gibt 2 Lösungen, die ich mit MEL kenne. Aber zuerst, hier ist die pyMel-Lösung, die viel einfacher ist und ich empfehle Ihnen, sie zu verwenden.
PyMel Lösung:
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])
Als pm.ls
gibt eine Liste der realen Objekte, und nicht nur die Namen, können Sie sicher einen übergeordneten Knoten umbenennen und haben noch einen gültigen Handle auf seine Kinder.
Wenn Sie es wirklich in MEL machen wollen, müssen Sie entweder von unten nach oben umbenennen, oder recurse, so dass Sie nicht nach den Namen der Kinder fragen, bevor Sie sich mit dem Elternteil beschäftigen.
Die erste MEL-Lösung besteht darin, eine Liste langer Objektnamen zu erhalten und sie nach ihrer Tiefe zu sortieren, der tiefsten zuerst. Auf diese Weise wird garantiert, dass ein Elternteil nie vor seinen Kindern umbenannt wird. Das Sortierbit ist zu verschachtelt, um hier gestört zu werden, und die rekursive Lösung ist sowieso besser.
rekursive MEL Lösung:
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);
}
Diese rekursive Lösung Bohrer bis zu den Blattknoten und benennt sie vor ihren Eltern umbenennen.
Wenn einige Namen nicht eindeutig sind, gibt ls den kürzesten eindeutigen Pfad zurück - z. B. left_hip | knee. Wenn du Knie mit "fred_" sagst, erhältst du fred_knee nicht. Es wird versuchen, fred_left_hip | knee zu geben, aber das wird ein Fehler sein. // Kein Objekt stimmt mit name überein // –