### Navigation

- next
- previous |
- NUKE Python Developer's Guide v11.2v1 documentation »

# 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 )

### Navigation

- next
- previous |
- NUKE Python Developer's Guide v11.2v1 documentation »