Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Iterate through all Inputs and Outputs of a Given Node?

    Cinema 4D SDK
    r25 python
    2
    5
    552
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      bentraje
      last edited by

      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?

      1 Reply Last reply Reply Quote 0
      • ManuelM
        Manuel
        last edited by

        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

        1 Reply Last reply Reply Quote 0
        • B
          bentraje
          last edited by

          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.

          1 Reply Last reply Reply Quote 0
          • ManuelM
            Manuel
            last edited by

            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

            B 1 Reply Last reply Reply Quote 0
            • B
              bentraje @Manuel
              last edited by

              @manuel

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

              1 Reply Last reply Reply Quote 0
              • First post
                Last post