You're currently only viewing posts tagged "tutorial". See all posts instead.

Nuke Autolabel Magic

Nuke has some powerful ways to define how nodes are labeled in the DAG. And they make for some fun ways to augment your gizmos. By default, Nuke ships with a script called which takes care of labeling all the nodes in various ways:

various autolabels in Nuke

pictured: various autolabels

  • the node’s name (obviously)
  • a channel combo like “green blue” in case the node doesn’t simply process RGBA.
  • the value of a node’s “output” knob, if such a knob exists (try adding one as a user knob to see this magic label)
  • the current file name of a read node
  • the merge mode of a merge node (sic!)
  • the text of a node’s label knob
  • and probably much more…

You can, however, write your own autolabel function for either a specific node or a whole class of nodes. The downside is that you lose all of the default autolabels if you don’t reimplement them yourself.

autolabel knob:

Every tool has a hidden knob called autolabel that can hold a Python expression. Its return value is used to label the node. So let’s see how this works. Create a node (mine’s called “Blur3” from now on) and open the scripting console panel. Type:

autoLabel = "abc"


Of course this fails. But you see clearly that Nuke tries to execute your autolabel string as a Python expression. So let’s start with a basic example:

autoLabel = "nuke.thisNode().name()"

This works. Note how the command nuke.thisNode() is used to refer to the node whose label is currently being processed. Just using the node’s name as a label is the most basic thing to do. As the presence of an autolabel string will override Nuke’s default behavior, you won’t get anything else that a blur node might usually have (channel info and custom label value). Also note how this label is only applied to “Blur3”. Any other blur nodes will continue to use Nuke’s default behavior. But these autolabel expressions can get more useful, complex and powerful:


Here I’m changing the label based on the value of another knob. Python doesn’t have the C-like syntax “expression ? yes : no” which would be really handy in this case. But it has something similar which I wasn’t aware of before a fellow TD showed this to me:

("some string" if expression else "another string")

This will help us build even more powerful autolabel expressions. Note how all of this is still one single string so I’m using single quotes inside it and I need to escape all newline characters as \\n. A single backslash would cause a line break in the code itself instead of the string. What’s still missing is the label knob which Nuke adds to all nodes by default. We need to implement this ourselves and it’s a bit tricky because you need to add a line break for this only if there actually is a label.

autoLabel = "nuke.thisNode().name() + (' big!' if nuke.thisNode()['size'].value()>100 else ' small') + ('\\n'+nuke.thisNode()\['label'].value() if nuke.thisNode()['label'].value() else '')"


The further you go the more complex all of this gets. So why would you use the autolabel knob when Nuke has autolabel event handlers as well?

  • the knob affects a single tool, not a whole class of nodes
  • that string will get copy&pasted around with the node, autolabel event handlers remain separate from your nuke scripts (the latter has its advantages of course when it comes to maintainability and preventing your pipeline’s code from leaving your company)
  • the knob can be used with groups and node presets. All groups share the same class so it’s not possible to single one of them out.

autolabel event handlers:

To finish this tutorial, here’s the autolabel event handler that corresponds to the knob monstrosity above. It needs to be placed into your (or any python modules that are imported). You can have multiple autolabel handlers so you don’t need to cover all node classes in one function. Nuke calls all of them in a row and uses the first one that doesn’t return None.

def BlurLabel():
    n = nuke.thisNode()
    if n.Class() == "Blur":
        autoLabel = + (' big!' if n['size'].value()>100 else ' small')
        if n['label'].value():
            autoLabel = autoLabel + '\n' + n['label'].value()
        return autoLabel


Patching Your Pipeline



  • AutoSaveDeleteFilter (called before an autosave gets deleted).





import os, re, shutil
import nuke
def onAutoSave(filename):
  localdir = os.path.dirname(localfilename)
  if not os.path.isdir(localdir):
  return localfilename
def onAutoSaveRestore(filename):
def onAutoSaveDelete(filename):
  # only delete untiled autosave
    return filename
  # build local autosave file name
    if os.path.isfile(localfilename):
      shutil.copy2(localfilename, os.path.splitext(localfilename)[0])
  except Exception as e:
  return localfilename
def init():
  nuke.addAutoSaveFilter( onAutoSave )
  nuke.addAutoSaveRestoreFilter( onAutoSaveRestore )
  nuke.addAutoSaveDeleteFilter( onAutoSaveDelete )




TCL string magic

Here’s another small expression for Nuke. I wanted to burn in a read node’s current frame number using a Text node. It’s easy to get the current image’s source file name from the input’s metadata. But can you extract the frame number from a string like “/server/path/filename.01234.exr”?

Sure! This expression splits the file name into parts separated by the dot character. The 2nd part (index 1 in tcl) is the number we’re looking for:

[lindex [split [metadata input/filename] "."] 1]

A text node with this expression is useful for Hiero burn-ins by the way…


Nuke Python Expression Switch

Nuke’s Python expression syntax can be shorter and more readable than tcl.

Imagine, you want to use a switch to toggle part of your comp on or off on certain frames – maybe to fix artifacts in a 3D pass. Instead of animating a switch’s input or a tool’s mix slider between 0 and 1 you could use an expression:

frame == 1025

This will set the knob to 1 on frame 1025 and to 0 anywhere else. An expression like that also works if you want to enable that knob on several frames, but it gets increasingly unreadable:

frame == 1025 || frame == 1072 || frame == 1074

TCL expression switch

A Python expression is shorter and easier to extend. Enable the Py button in the expression popup and there you go:

nuke.frame() in [1025,1072,1074]

Python expression switch

Logarithmic Conversion in Nuke vs. After Effects

If you ever need to use the Cineon Converter effect in After Effects… you know, maybe you want to create a LUT adjustment layer to match your real comps… you might save yourself some time by remembering this:

Nuke’s default log2lin gamma of 0.6 is like 1.0 in After Effects.

This concludes my public service announcement.

Countdown #6

Another video for the Fusion webinar countdown.

You can download the comp here. You’ll need one of my fuses and Krokodove 5.70 alpha as well as this font.

Music: Berry Nuggons by EAT! (cc-by)


This is a short clip for eyeon’s Fusion 7 preview webinar in October. Motion graphics artist Dunn Lewis started a countdown series and I’m contributing this clip today:

It’s 100% Fusion, but using a couple of custom lens flare plugins I wrote. Some relighting is done using a spherical harmonics technique (that’s how I got the smooth shading along the round parts of the text).

Download the comp here. Zip includes my flare fuses as well as the font.

This clip and all the other artists’ work is available on vimeo.