Solved Iterate through all Inputs and Outputs of a Given Node?

Hi,

I'm trying to retrieve inputs and outputs of a selected node. But it gives me error when using the result from the GetInputs or GetOutputs method

    def 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 says Output 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

MAXON SDK Specialist

MAXON Registered Developer

Ah so I guess there's really no port object. Everything is graph 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 actual port object and have just the port object a subclass of a the graph 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

MAXON SDK Specialist

MAXON Registered Developer

@manuel

ah gotcha. the node kinda. thanks.
will close this thread for now.