June 2016

3 simple Python snippets that will make your life (a bit) easier

tl;dr: some usefull Python snippets for Nuke.

So I’m finally applying some Python knowledge I’ve been learning lately to actually usefull stuff. Cool!! I will celebrate it by sharing some very, super simple Python snippets that will enable you to work (slightly) faster within Nuke.
Disclaimer: I’m fairly new to Python so you can expect finding not very elegant, unpythonic code. Sorry for that!
snippet #1
This tiny piece of code enables you to automatically create a new ReadNode reading the filepath from a selected WriteNode. Mapping this code to a hotkey makes it a really handy action to use. So let’s see the actual code:
 
.__author__ Boris Martinez

import nuke, re, math, os

def AutoReadFromWrite():

    try:
        n = nuke.selectedNode()
		
    except:
    
        m = nuke.message('select a WriteNode,dude')
        m.show()
	else:
		if n.Class() == 'Write':
			#fetching data from the write node
            p = n.knob('file').getValue()
			fstf = n.knob('first').getValue()
			lstf = n;knob('last').getValue()
			colorspace = str(i.knob('colorspace').getValue()
			#fetching data from the write node
            r = nuke.createNode('Read')
            r.knob('file').setValue(p)
			r.knob('first').setValue(int(firstFrame))
			r.knob('last').setValue(int(lastFrame))
			r.knob('origfirst').setValue(int(firstFrame))
			r.knob('origlast').setValue(int(lastFrame))
			r.knob('colorspace').setValue(colorspace)
		else:
			m = nuke.message("Select a Write node, dude!")
		
		
 AutoReadFromWrite()
snippet #2
This ones takes advantage of some of the concepts from the AutoReadFromWrite function to enable the user to open in the explorer the folder that the filepath knob of a selected ReadNode is pointing to. 
 
.__author__ Boris Martinez

import nuke,os

def AutoExploreFromRead():
    
    try:
        n = nuke.selectedNode()
        f = n.knob("file").getValue()
        p = os.path.dirname(f)
        print "path is %s" %p
        os.startfile(p)
    except:
        p = nuke.message("no file selected")
        p.show()
        print "no file selected"

AutoExploreFromRead()
snippet #3
Here we have a little trickier code comprising concepts we did not see in the previous ones. Stuff like iterations, classes and GUI creation. Functionality wise, it’s really simple! What it does is just creating a randomized animation curve in selected lights. Useful if you want to create some randomized animation for lights in the scene (it affects specifically the intensity value of selected lights).
 
.__author__ Boris Martinez

import nuke
import random
import nukescripts


def lightRandomizer(m,i,o):
    try:
        nodes = nuke.selectedNodes()
        variation = None
        for light in nodes:
            for e in range(i,o):
                variation = random.randrange(1,5)
                if light.Class() == "Light2":

                    light['intensity'].setAnimated()
                    light['intensity'].setValueAt(variation * m,e)
    except:
        ep = nuke.message("No nodes selected")
        ep.show()

def lightRandExpression():
    nodes = nuke.selectedNodes()
    variation = None
    for light in nodes:
        variation = random.randrange(1,5)
        if light.Class() == "Light2":
            light['intensity'].setExpression("random(frame)")
            light['intensity'].setAnimated()

#creating the panel for introducing a multiplicator and launching the lightRandomizer function

class modalPanel(nukescripts.PythonPanel):

    def __init__(self):
        nukescripts.PythonPanel.__init__(self,"multiplier")
        self.m = nuke.Double_Knob("intensity multiplier", "intensity multiplier: ")
        self.addKnob( self.m )
        self.fRange = nuke.String_Knob('fRange', 'Animation Range', '%s-%s' % (nuke.root().firstFrame(), nuke.root().lastFrame()))
        self.addKnob(self.fRange)

    def showModalDialog( self ):
        nukescripts.PythonPanel.showModalDialog(self)

    def giveMultValue(self):
        return  self.m.getValue()

    def giveFrameRangeValue(self):
        return self.fRange.getValue()

#wrapper function

def lightRandmWrapper():
    panel = modalPanel() # an instance from the modalPanel Class
    show = panel.showModalDialog()
    multiplier = panel.giveMultValue()
    frameRange = panel.giveFrameRangeValue()
    frameRangeSplitted = frameRange.split("-")
    ini = int(frameRangeSplitted[0])
    fin = int(frameRangeSplitted[-1])

    #print "frameRange is: ", frameRange
    #print type(frameRange)

    lightRandomizer(multiplier,ini,fin)
    #p = nuke.message (" Boris says: lights randomized, cool!")
    #p.show()

lightRandmWrapper()
#lightRandExpression

So, for the time being, this is all folks. Feel free to copy this snippets for your personal use in Nuke. For snippets #1 & #2 I highly recommend mapping them to a hotkey. If you don’t know how to do so, checking Fxphd’s “Python for Nuke & Gizmology” course by Victor Perez would be really helpfull. For other general Python questions, I strongly recommend Mark Lutz’s “Programming Python” book.
 
Read more →