我有一个maya节点myNode
,它创建了shadeNode
,inMesh
属性与shapeNode.outMesh
相关联,并且属性为distance
。
myNode.outMesh -> shapeNode.inMesh
myNode.distance = 10
然后我有一个命令,它在形状节点上工作,但需要距离参数,它通过迭代inMesh
连接来完成:
MPlugArray meshConnections;
MPlug inMeshPlug = depNodeFn.findPlug("inMesh");
inMeshPlug.connectedTo(meshConnections, true, false); // in connections
bool node_found = false;
for(uint i = 0; i < numConnections; i++) {
MPlug remotePlug = meshConnections[i];
myNode = remotePlug.node();
if(MFnDependencyNode(myNode ).typeName() == "myNode") {
node_found = true;
break;
}
}
MFnDependencyNode myDepNode(myNode);
MPlug distancePlug = myDepNode.findPlug("distance");
现在我在将另一个节点(另一种类型)应用于myShape
时遇到问题,因为依赖关系图现在看起来像这样:
myNode.outMesh -> myOtherNode.inMesh
myOtherNode.outMesh -> shapeNode.inMesh
myNode.distance = 10
我试图删除对typeName() == "myNode"
的检查,因为我理解文档应该递归到父节点,当下一个节点返回Mstatus::kInvalidParameter
未知的MPlug时,但我无法到达distance
插件没有实现进一步的图形转换。
可靠地找到父节点属性的正确方法是什么,即使在其间添加了一些其他节点?
命令本身应该使用距离Plug连接到myNode
或者某个以递归方式获取值的插件。如果可能,我不想更改myOtherNode
以使用距离插头和对应的连接来转发数据。
答案 0 :(得分:2)
通常的Maya工作流程是让节点独立运行 - 它不需要任何围绕它的图形结构的知识,它只是对输入的变化做出反应并从其输出发出新数据。如果用户手动取消挂接输入然后手动将它们重新连接到其他对象,则节点需要正常工作 - 例如,您无法知道某些工具不会在您的节点上游插入变形器首次创建节点时的图形布局。
您也不想在dag图外传递数据 - 如果需要更新数据,您想要将其作为连接传递。否则,您无法仅从图表中重现场景。您希望确保图形只能产生明确的结果。
当你必须进行DAG操作时 - 比如建立一个连接网络 - 将它们放入MPXCommand
或mel / python脚本中。
答案 1 :(得分:0)
我在an answer (python code)中找到了如何获取图中所有节点的答案。我在MPxCommand
中找到节点的代码现在看起来像这样:
MPlugArray meshConnections;
MPlug inMeshPlug = depNodeFn.findPlug("inMesh");
MItDependencyGraph depGraphIt(inMeshPlug, MFn::kInvalid, MItDependencyGraph::Direction::kUpstream);
bool offset_mesh_node_found = false;
while(!depGraphIt.isDone()) {
myNode = depGraphIt.currentItem();
if(MFnDependencyNode(myNode).typeName() == "myNode") {
offset_mesh_node_found = true;
break;
}
depGraphIt.next();
}
MItDependencyGraph
可以从对象或插件开始沿上游或下游方向遍历图形。在这里,我只是搜索myNode
的第一个实例,因为我假设在我的用例中只有一个。然后它连接图中的距离MPlug
,当插入更多网格变换时,它仍然有效。
MItDependencyGraph对象允许过滤节点ID,但只有数字节点ID不是节点名称。我可能会在以后在所有插件中分配unique maya ids时添加过滤器。