Manipulating the Node Graph
You can use Python to:
get and set node properties that define the node’s position in the Node Graph (sometimes called the DAG)
control the Node Graph’s zoom and pan values.
There is a video tutorial about manipulating the Node Graph on Nukepedia.
Getting and Setting Node Positions
You can access a node’s x and y position in the Node Graph via its knobs:
node = nuke.createNode( 'NoOp' )
print node['xpos'].value()
Use the usual knob method to set a new position:
node['xpos'].setValue( 100 )
print 'new position is', node['xpos'].value()
For convenience, there are also methods to set and get node positions:
node.setXpos( 111 )
node.setYpos( 222 )
xPos = node.xpos()
yPos = node.ypos()
print 'new x position is', xPos
print 'new y position is', yPos
To set both x and y value at once:
node.setXYpos( 123, 234 )
To get a node’s width and height in pixels at zoom level 1:
nodeWidth = node.screenWidth()
nodeHeight = node.screenHeight()
print "Node dimensions are %s x %s" % ( nodeWidth, nodeHeight )
To arrange nodes in a neat tree formation so they don’t overlap, use node.autoplace():
for n in nuke.allNodes():
n.autoplace()
To snap nodes to the nearest grid position:
for n in nuke.allNodes():
nuke.autoplaceSnap( n )
Controlling the Node Graph’s Pan and Zoom
To pan and zoom the Node Graph, use nuke.zoom().
When called without any arguments, this simply returns the current zoom level:
nuke.zoom()
With an argument larger than 0, the Node Graph zooms to the given level. For example, to reset the view to 1:1, use:
nuke.zoom(1)
You can also specify the center of the zoom operation. To zoom into the selected node, use:
node = nuke.selectedNode()
nuke.zoom( 3, [ node.xpos(), node.ypos() ])
The above example actually zooms into the node’s upper left corner. Let’s zoom into the center of the node instead:
node = nuke.selectedNode()
xC = node.xpos() + node.screenWidth()/2
yC = node.ypos() + node.screenHeight()/2
nuke.zoom( 3, [ xC, yC ])
Examples
A Circle Made of Dot Nodes
import math
for x in xrange(1000):
n = nuke.nodes.Dot( xpos = math.sin(x)*100, ypos = math.cos(x)*100)
n['hide_input'].setValue(True)
A Spiral
import math
for x in xrange(1000):
n = nuke.nodes.Dot( xpos = math.sin(x)*x/10, ypos = math.cos(x)*x/10)
n['hide_input'].setValue(True)
Controlling the Distance between Nodes
import nuke
def scaleNodes( scale ):
nodes = nuke.selectedNodes() # GET SELECTED NODES
amount = len( nodes ) # GET NUMBER OF SELECTED NODES
if amount == 0: return # DO NOTHING IF NO NODES WERE SELECTED
allX = sum( [ n.xpos()+n.screenWidth()/2 for n in nodes ] ) # SUM OF ALL X VALUES
allY = sum( [ n.ypos()+n.screenHeight()/2 for n in nodes ] ) # SUM OF ALL Y VALUES
# CENTER OF SELECTED NODES
centreX = allX / amount
centreY = allY / amount
# REASSIGN NODE POSITIONS AS A FACTOR OF THEIR DISTANCE TO THE SELECTION CENTER
for n in nodes:
n.setXpos( centreX + ( n.xpos() - centreX ) * scale )
n.setYpos( centreY + ( n.ypos() - centreY ) * scale )
scaleNodes( 3 )
scaleNodes( .7 )