## ICECompoundNode.ExposedPorts

### Description

Returns an Array of 2 ICENodePortCollection objects. The first collection contains the exposed ports and the second one the associated compound node ports also known as proxy ports. The collections work as a pair, the exposed port at position 0 in the first collection matches the node port at position 0 in the second collection, etc.
The exposed ports are the contained nodes ports of a compound node and act as connection points to outer nodes. These ports can be either ICENodeInputPort or ICENodeOutputPort objects. This property and the AddExposedParamToICECompoundNode command are typically used in pair for exposing the contained node ports to other graph nodes.

### C# Syntax

    // get accessor

    Object rtn = ICECompoundNode.ExposedPorts;

### Examples

#### Python Example

    # Sample code to access the exposed ports on the compound nodes of a graph

    import win32com.client

    from win32com.client import constants

    xsi = Application

    # Recursive function for traversing a node graph

    def TraverseNodeGraph( in_node, level ):

    	indent = level * '.'

    	if in_node.IsClassOf( constants.siICECompoundNodeID ):

    		# Log the visited compound node name

    		xsi.LogMessage( indent + in_node.Name )

    		# Get the exposed port info for the compound node

    		ports = in_node.ExposedPorts

    		# The exposed ports

    		exposedPorts = ports[0]

    		exposedPortsCount = exposedPorts.Count

    		# The compound node ports

    		nodePorts = ports[1]

    		for i in range(exposedPortsCount):

    			xsi.LogMessage( indent + "Node port " + str(i) + ": " + str(nodePorts[i]) )

    			xsi.LogMessage( indent + "Exposed port " + str(i) + ": " + str(exposedPorts[i]) )

    	nodeCount = 0

    	nodes = ()

    	if in_node.IsClassOf( constants.siICENodeContainerID ):

    		# The input node is a ICENodeContainer, let's get its inner compound nodes

    		nodes = in_node.CompoundNodes

    		nodeCount = nodes.Count

    	# Recursively traverse the graph

    	for i in range(nodeCount):

    		TraverseNodeGraph( nodes[i], level+2 )

    # Create a sample twist deformer graph first

    xsi.NewScene("", "")

    xsi.CreatePrim( "Cube", "MeshSurface" )

    xsi.SetValue( "cube.polymsh.geom.subdivu", 15 )

    xsi.SetValue( "cube.polymsh.geom.subdivv", 14 )

    xsi.ApplyOp( "ICETree", "cube", None, None, None, 0 )

    xsi.AddICENode( "GetDataNode", "cube.polymsh.ICETree" )

    xsi.SetValue( "cube.polymsh.ICETree.SceneReferenceNode.Reference", "cube.polymsh.PointPosition" )

    xsi.AddICENode( "RotateVectorNode", "cube.polymsh.ICETree" )

    xsi.AddICENode( "3DVectorToScalarNode", "cube.polymsh.ICETree" )

    xsi.AddICENode( "SetData", "cube.polymsh.ICETree" )

    xsi.SetValue( "cube.polymsh.ICETree.SetData.PredefinedAttributeName", "PointPosition" )

    xsi.AddAttributeToSetDataICENode( "cube.polymsh.ICETree.SetData", "PointPosition", constants.siComponentDataTypeVector3, constants.siComponentDataContextComponent0D, constants.siComponentDataStructureSingle )

    xsi.ConnectICENodes( "cube.polymsh.ICETree.port1", "cube.polymsh.ICETree.SetData.set" )

    xsi.ConnectICENodes( "cube.polymsh.ICETree.RotateVectorNode.vector", "cube.polymsh.ICETree.SceneReferenceNode.value" )

    xsi.ConnectICENodes( "cube.polymsh.ICETree.SetData.pointposition", "cube.polymsh.ICETree.RotateVectorNode.result" )

    xsi.ConnectICENodes( "cube.polymsh.ICETree.3DVectorToScalarNode.vector", "cube.polymsh.ICETree.SceneReferenceNode.value" )

    xsi.AddICENode( "MultiplyNode", "cube.polymsh.ICETree" )

    xsi.ConnectICENodes( "cube.polymsh.ICETree.MultiplyNode.value1", "cube.polymsh.ICETree.3DVectorToScalarNode.y" )

    xsi.AddICENode( "ScalarToRotationNode", "cube.polymsh.ICETree" )

    xsi.ConnectICENodes( "cube.polymsh.ICETree.ScalarToRotationNode.angle", "cube.polymsh.ICETree.MultiplyNode.result" )

    xsi.ConnectICENodes( "cube.polymsh.ICETree.RotateVectorNode.rotation", "cube.polymsh.ICETree.ScalarToRotationNode.rotation" )

    xsi.SetValue( "cube.polymsh.ICETree.ScalarToRotationNode.y", 1 )

    xsi.SetValue( "cube.polymsh.ICETree.ScalarToRotationNode.x", 0 )

    xsi.SetValue( "cube.polymsh.ICETree.MultiplyNode.value2", 20 )

    xsi.CreateICECompoundNode("cube.polymsh.ICETree.3DVectorToScalarNode,cube.polymsh.ICETree.MultiplyNode,cube.polymsh.ICETree.ScalarToRotationNode", "Compound1")

    xsi.CreateICECompoundNode("cube.polymsh.ICETree.Compound1.ScalarToRotationNode,cube.polymsh.ICETree.Compound1.MultiplyNode", "Compound2")

    xsi.CreateICECompoundNode("cube.polymsh.ICETree.Compound1", "CompoundTop")

    # Get the ICETree off the cube primitive and start iterating the graph

    cube = xsi.Selection(0)

    cubeICETree = cube.ActivePrimitive2.ICETrees[0]

    level = 0

    TraverseNodeGraph( cubeICETree, level )