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

reader = app.createNode("fr.inria.openfx.ReadOIIO", -1, 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:

../_images/helpButton.png
../_images/pluginID.png

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

#Create a read node
reader = app.createNode("fr.inria.openfx.ReadOIIO")

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

#Connect the blur to the read node
blur.connectInput(0,reader)

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

node = app.createNode("fr.inria.openfx.ReadOIIO")
print(node.getScriptName()) # prints ReadOIIO1

#The ReadOIIO node is now available via its script name app.ReadOIIO1

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

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.