如何从maya中的上游节点获取数据?
How to get data from an upstream node in maya?
我有一个 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"
的检查,因为我理解文档应该递归到父节点,当下一个节点 return Mstatus::kInvalidParameter
未知时MPlug,但如果不实施进一步的图形遍历,我无法到达 distance
插头。
即使在中间添加了一些其他节点时,可靠地找到父节点属性的正确方法是什么?
命令本身应该使用距离插头连接到 myNode
或连接到递归获取值的某个插头。如果可能的话,我不想更改 myOtherNode
以使用距离插头和相应的连接来转发数据。
我在 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 object allows to filter for node ids, but only the numeric node ids not node names. I probably add a filter later, when I have unique maya ids。
通常的 Maya 工作流程是让节点独立运行——它不需要任何关于它周围图形结构的知识,它只是对输入的变化做出反应并从其输出中发出新数据。如果用户手动解开输入然后手动将它们重新连接到其他对象,则节点需要正常工作——例如,您不知道某些工具不会在节点上游插入变形器来更改图形布局首次创建节点时是否存在。
您也不希望在 dag 图之外传递数据——如果数据需要更新,您将希望将其作为连接传递。否则,您将无法仅从图表中再现场景。您要确保图表只能产生明确的结果。
当您确实需要进行 DAG 操作时——例如设置连接网络——将它们放入 MPXCommand
或 mel/python 脚本中。
我有一个 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"
的检查,因为我理解文档应该递归到父节点,当下一个节点 return Mstatus::kInvalidParameter
未知时MPlug,但如果不实施进一步的图形遍历,我无法到达 distance
插头。
即使在中间添加了一些其他节点时,可靠地找到父节点属性的正确方法是什么?
命令本身应该使用距离插头连接到 myNode
或连接到递归获取值的某个插头。如果可能的话,我不想更改 myOtherNode
以使用距离插头和相应的连接来转发数据。
我在 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 object allows to filter for node ids, but only the numeric node ids not node names. I probably add a filter later, when I have unique maya ids。
通常的 Maya 工作流程是让节点独立运行——它不需要任何关于它周围图形结构的知识,它只是对输入的变化做出反应并从其输出中发出新数据。如果用户手动解开输入然后手动将它们重新连接到其他对象,则节点需要正常工作——例如,您不知道某些工具不会在节点上游插入变形器来更改图形布局首次创建节点时是否存在。
您也不希望在 dag 图之外传递数据——如果数据需要更新,您将希望将其作为连接传递。否则,您将无法仅从图表中再现场景。您要确保图表只能产生明确的结果。
当您确实需要进行 DAG 操作时——例如设置连接网络——将它们放入 MPXCommand
或 mel/python 脚本中。