3

我正在编写一个 MEL 脚本,它将关节层次结构中的所有关节重命名为已知格式。这个想法是您将选择髋关节,脚本将重命名髋关节,并遍历所有其他关节并根据其在层次结构中的位置对其进行重命名。

您如何遍历 MEL 中的联合层次结构?

4

3 回答 3

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);
}

希望这可以帮助

于 2012-04-10T16:39:05.077 回答
0

如果您需要在进行过程中做出详细的决定,而不是批量重命名,遍历层次结构非常简单。命令是'listRelatives';使用 'c' 标志它返回节点的子节点,使用 'p' 标志它返回父节点。(注意 -p 返回单个对象,-c 返回一个数组)

Joint1
    Joint2
        Joint3
        Joint4

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

棘手的一点是重命名,因为 Maya 并不总是给您期望的名称(它不允许在同一层次结构级别上出现重复的名称)。您需要跟踪重命名的对象,否则在重命名后您将无法找到它们,以防新名称与您的期望不符。

如果需要跟踪它们,可以在重命名之前使用 set 命令创建一个集合;无论名称如何,所有对象仍将在集合中。或者,您可以通过选择对象并重命名当前选择来遍历层次结构——这不会记录更改,但是您不会遇到对象在操作过程中更改名称和弄乱命令的问题。

于 2012-12-29T09:46:39.910 回答
0

如果您有非唯一名称,则在 MEL 中执行此操作可能会很麻烦,因为您拥有的对象句柄就是名称本身。使用非唯一名称重命名节点的父节点后,子节点的名称就会不同。如果在开始重命名之前存储了所有名称的列表,则会出现错误,因为 rename 命令将尝试重命名不存在的节点。我知道有两种使用 MEL 的解决方案。但首先,这里是更简单的 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])

作为pm.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);
}

这个递归解决方案深入到叶节点并在重命名它们的父节点之前重命名它们。

于 2013-06-08T00:21:07.020 回答