# Creating and controlling nodes¶

## Creating a new node:¶

To create a node in Natron, you would do so using the app instance via the function createNode(pluginId,majorVersion,group) like this:

app1.createNode("fr.inria.openfx.ReadOIIO")


In this line we specify that we want the first opened project to create a node instantiating the plug-in ReadOIIO. Note that if we were in background mode we could just write the following which would be equivalent:

app.createNode("fr.inria.openfx.ReadOIIO")


Since in command-line there is only a single project opened, Natron does the following assignment:

app = app1


If we were to create the node into a specific group, we would do so like this:

group = app.createNode("fr.inria.built-in.Group")



Note that when passed the number -1, it specifies that we want to load the highest version of the plug-in found. This version parameter can be useful to load for example a specific version of a plug-in.

The pluginID passed to this function is a unique ID for each plug-in. If 2 plug-ins were to have the same ID, then Natron will create separate entries for each version.

You can query all plug-ins available in Natron this way:

allPlugins = natron.getPluginIDs()


You can also filter out plug-ins that contain only a given filter name:

# Returns only plugin IDs containing ".inria" in it

filteredPlugins = natron.getPluginIDs(".inria.")


In the user interface, the plug-in ID can be found when pressing the ? button located in the top right-hand corner of the settings panel:

## Connecting a node to other nodes:¶

To connect a node to the input of another node you can use the connectInput(inputNumber,input) function.

The inputNumber is a 0-based index specifying the input on which the function should connect the given input Effect.

You can query the input name at a specific index with the following function:

print(node.getInputLabel(i))


Here is a small example where we would create 3 nodes and connect them together:

#Create a write node
writer = app.createNode("fr.inria.openfx.WriteOIIO")

#Create a blur
blur = app.createNode("net.sf.cimg.CImgBlur")

#Connect the write node to the blur
writer.connectInput(0,blur)

#Connect the blur to the read node


Note that the following script would do the same since nodes are auto-declared variables

node = app.createNode("fr.inria.openfx.WriteOIIO")
print(node.getScriptName()) # prints WriteOIIO1

#The write node is now available via its script name app.WriteOIIO1

node = app.createNode("net.sf.cimg.CImgBlur")
print(node.getScriptName()) # prints CImgBlur1

#The blur node is now available via its script name app.BlurCImg1

app.WriteOIIO1.connectInput(0,app.BlurCImg1)


Note that not all connections are possible, and sometimes it may fail for some reasons explained in the documentation of the connectInput(inputNumber,input) function.

You should then check for errors this way:

if not app.WriteOIIO1.connectInput(0,app.BlurCImg1):
# Handle errors


You can check beforehand whether a subsequent connectInput call would succeed or not by calling the canConnectInput(inputNumber,input) which basically checks whether is is okay to do the connection or not. You can then safely write the following instructions:

if app.WriteOIIO1.canConnectInput(0,app.BlurCImg1):
app.WriteOIIO1.connectInput(0,app.BlurCImg1)
else:
# Handle errors


Note that internally connectInput calls canConnectInput to validate whether the connection is possible.

To disconnect an existing connection, you can use the disconnectInput(inputNumber) function.