Iterate through all Inputs and Outputs of a Given Node?
-
Hi,
I'm trying to retrieve
inputs
andoutputs
of a selected node. But it gives me error when using the result from theGetInputs
orGetOutputs
methoddef RetrieveInformationOfNode(node): port = node.GetOutputs() for p in port: print (p.name) # or p.GetName. Not sure. I can't receah this part of the code. return True graph.GetSelectedNodes(RetrieveInformationOfNode, maxon.frameworks.graph.NODE_KIND.ALL_MASK)
The error:
TypeError: 'GraphNode' object is not iterable
But the documentation saysOutput port list of this node.
Isn't a list iterable? -
Hi,
GetInputs/GetOuputs return a GraphNode. This Graphnode contains all the Inputs or the Outputs port that the Node contains but they are a child of this GraphNode. As this is still a GraphNode, you need to use one of those function. GetChildren, GetInnerNodes.
import c4d import maxon # Display the outputs ports of the selected nodes in the active NodeMaterial of the Active Nodespace. def main(): # Retrieve the selected BaseMaterial mat = doc.GetActiveMaterial() if mat is None: raise ValueError("There is no selected BaseMaterial") # Retrieve the reference of the material as a node material. nodeMaterial = mat.GetNodeMaterialReference() if nodeMaterial is None: raise ValueError("Cannot retrieve node material reference") # Retrieve the current node space Id nodespaceId = c4d.GetActiveNodeSpaceId() # Retrieve the graph corresponding to that node space. graph = nodeMaterial.GetGraph(nodespaceId) if graph is None: raise ValueError("Cannot retrieve the graph of this nimbus ref") def DisplayOutputs(node): # Will display node information def PrintNodeInformation(port): # Print here the needed information print (port) def DisplayChildren(node): # Check if the node is valid and recursively display children. if not node.IsValid(): return True PrintNodeInformation(node) node.GetChildren(DisplayChildren) return True # Retrieve the outputs port and the first level of children with GetChildren. node.GetOutputs().GetChildren(DisplayChildren) return True # Retrieve the nodes that are selected and passed them to the function DisplayOutputs. maxon.GraphModelHelper.GetSelectedNodes(graph, maxon.NODE_KIND.NODE, DisplayOutputs) print('---------------- using Inner') # using GetInnerNodes def DisplayInner(node): def PrintNode(port): print(port) return True node.GetInnerNodes(maxon.NODE_KIND.OUT_MASK, False, PrintNode) return True maxon.GraphModelHelper.GetSelectedNodes(graph, maxon.NODE_KIND.NODE, DisplayInner) if __name__ == "__main__": main()
Cheers,
Manuel -
Ah so I guess there's really no
port
object. Everything isgraph node
object.
How would I know the object is an actual node or a port of an node?
Wouldn't it have been better if there is an actualport
object and have just theport
object a subclass of a thegraph node
so it inherits the methods?P.S. The script works as expected, athough I have to modify it to work for R25.
-
hi,
you can have a look at this page you can see that GraphNode elements can be represented by a hierarchy. As written in that page, to know the node kind, use GetKind. That will return you its NODE_KIND.
There is no "ports" class, only GraphNode. The implementation does not always reflect what the user sees.
Cheers,
Manuel -
ah gotcha. the node kinda. thanks.
will close this thread for now.