首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MEL:遍历层次

MEL:遍历层次
EN

Stack Overflow用户
提问于 2012-04-09 17:54:10
回答 3查看 8.1K关注 0票数 3

我正在编写一个MEL脚本,该脚本将关节层次中的所有关节重命名为已知格式。其思路是选择髋关节,脚本将重命名髋部,并遍历每个其他关节并根据其在层次中的位置对其进行重命名。

如何在MEL中遍历关节层次?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-11 00:39:05

如果将层次中顶级关节的名称指定给$stat_element,并运行以下代码,则会为该关节的所有子元素添加前缀"myPrefix_"

代码语言:javascript
复制
string $stat_element = "joint1";
select -r $stat_element;
string $nodes[] = `ls -sl -dag`;
for($node in $nodes){
    rename -ignoreShape $node ("myPrefix_" + $node);
}

希望这能有所帮助

票数 4
EN

Stack Overflow用户

发布于 2012-12-29 17:46:40

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

代码语言:javascript
复制
Joint1
    Joint2
        Joint3
        Joint4

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-06-08 08:21:07

如果具有不唯一的名称,则在MEL中执行此操作可能会很混乱,因为对象的控制柄就是名称本身。一旦使用非唯一名称重命名节点的父节点,子节点的名称就会不同。如果在开始重命名之前存储了所有名称的列表,则会出现错误,因为rename命令将尝试重命名不存在的节点。我知道使用MEL有两种解决方案。但首先,这里有一个更简单的pyMel解决方案,我建议你使用它。

PyMel解决方案:

代码语言:javascript
复制
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解决方案:

代码语言:javascript
复制
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);
}

这个递归解决方案向下钻取到叶节点,并在重命名它们的父节点之前对它们进行重命名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10071584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档