## ICENode

Object Hierarchy | Related C++ Class: ICENode

### Inheritance

###

SIObject

ProjectItem

ICENode

### Introduced

v7.0

### Description

The ICENode class represents a built-in or custom effect node in the Softimage ICE graph. ICENodes can be assembled in sub-graphs called compound nodes, which are represented as ICECompoundNode objects.
The ICENode class API is convenient for accessing the different components of an effect node such as ports, port groups and port group instances. The node ports are organized in groups similar to the Softimage operator Ports, where groups are logical groupings of multiple port connections. Other ICENode objects can connect to an ICENode object via its ports represented as ICENodeInputPort and ICENodeOutputPort.

### Methods

AddCustomOp | AddICEAttribute | AddScriptedOp | AddScriptedOpFromFile
AnimatedParameters2 | BelongsTo | EvaluateAt | GetGroupInstanceCount
GetICEAttributeFromName | GetPortCount | GetPortFromIndex | GetPortFromIndex2
GetPortFromName | GetPortFromName2 | IsA | IsAnimated2
IsClassOf | IsEqualTo | IsKindOf | IsLocked
IsSelected | LockOwners | RemoveICEAttribute | SetAsSelected
SetCapabilityFlag | SetLock | TaggedParameters | UnSetLock

### Properties

Application | BranchFlag | Capabilities | Categories
EvaluationID | Families | FullName | Help
HierarchicalEvaluationID | ICEAttributes | InputPorts | IsConnected
LockLevel | LockMasters | LockType | Model
Name | NestedObjects | ObjectID | Origin
OriginPath | OutputPorts | Owners | PPGLayout
Parameters | Parent | Parent3DObject | PortGroupCount
RootNodeContainer | Selected | Type |

### Examples

#### Python Example

    # Sample code to show how to access the ICENode elements.

    import win32com.client

    from win32com.client import constants

    xsi = Application

    # Recursive function for traversing a node graph

    def TraverseNodeGraph( node, level ):

    	indent = level * '.'

    	# Log info on the visited node

    	xsi.LogMessage( "* * *" )

    	# Node info

    	xsi.LogMessage( indent + "node: " + node.FullName );

    	xsi.LogMessage( indent + "node type: " + node.Type );

    	xsi.LogMessage( indent + "node proxy class: " + xsi.ClassName(node) );

    	xsi.LogMessage( indent + "node connected: " + str(node.IsConnected) );

    	xsi.LogMessage( indent + "node parent: " + str(node.Parent.Name) )

    	xsi.LogMessage( indent + "node root: " + str(node.RootNodeContainer.Name) )

    	# Node port group info

    	portGroupCount = node.PortGroupCount

    	xsi.LogMessage( indent + "number of groups: " + str(portGroupCount) )

    	for iGroup in range(portGroupCount):

    		nPortsInGroup = node.GetPortCount(iGroup)

    		xsi.LogMessage( indent + "number of ports in group " + str(iGroup) + ": " + str(nPortsInGroup) )

    		nGroupInst = node.GetGroupInstanceCount(iGroup)

    		xsi.LogMessage( indent + "number of instances of group " + str(iGroup) + ": " + str(nGroupInst) )

    		for iInst in range( nGroupInst ):

    			for iPort in range( nPortsInGroup ):

    				xsi.LogMessage( indent + "port " + str(iPort) + "," + str(iGroup) + "," + str(iInst) )

    				p = node.GetPortFromIndex(iPort,iGroup,iInst)

    				xsi.LogMessage( indent + "port name: " + p.Name )

    				xsi.LogMessage( indent + "output port: " + str(p.IsOutput) )

    	# Node input port info

    	inPorts = node.InputPorts

    	inputPortCount = inPorts.Count

    	xsi.LogMessage( indent + "node input ports: " + str(inputPortCount) )

    	# Node output port info

    	outPorts = node.OutputPorts

    	outputPortCount = outPorts.Count

    	xsi.LogMessage( indent + "node output ports: " + str(outputPortCount) )

    	nodeCount = 0

    	nodes = ()

    	if node.IsClassOf( constants.siICENodeContainerID ):

    		# The input node might be a ICETree or ICECompoundNode, let's get their ICENodes

    		nodes = node.Nodes

    		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.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", "")

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

    cube = xsi.Selection(0)

    cubeICETree = cube.ActivePrimitive2.ICETrees[0]

    level = 0

    TraverseNodeGraph( cubeICETree, level )

### See Also

ICENodeInputPort ICENodeOutputPort ICENodeContainer ICETree ICECompoundNode