Skip to content

Instantly share code, notes, and snippets.

@draconiansolo
Last active December 16, 2015 18:20
Show Gist options
  • Save draconiansolo/5476864 to your computer and use it in GitHub Desktop.
Save draconiansolo/5476864 to your computer and use it in GitHub Desktop.
Nuke Python for artists tutorials Callback Knobs with opinionated comments and notes in spanglish.
#########################################################
########### CALLBACK KNOBS PART A ###################
###### checking script name for version
#should be on onSaveScript callback
import re
def checkScriptName(name):
print name
if not re.search( r'_[vV]\d+', name ): #esto es un regular expresion
raise Exception, 'No version found in script name.\nplease use proper name convention.'
else:
print 'all good'
#nuke.root()['onScriptSave'].setValue("checkScriptName(nuke.root()['name'].value())")#tiene que haber una manera mas decente de hacer esto.
#--------------------
def nameCheck():
checkScriptName(nuke.root()['name'].value())
nuke.addOnScriptSave(nameCheck) #por alguna razon, no sirvio cuando lo trate de hacer directamente como checkScriptName,(rootname), algo de inmutabilidad, I guess.
#----------------------------------------------------------
##############funcion para hacer que cree automaticamente los directorios en los que esta guardando el script
#############esto es del OhulIO.py ########################
####mal#####
import os #os module, file manipulation and stuff
import nuke #main nuke module
import nukescripts #no entiendo bien para que hay que llamar esto.
def createOutDir(file): #funcion para crear directorios para los renders automaticamente
myFile=os.path.dirname(file) #variable para guardar el path
myDir=nuke.callbacks.filenameFilter(myFile)
print myDir
if not os.path.isdir(file): #si el path no existe
if nuke.ask('Create directory?\n%s'%myDir): #preguntar si uno lo quiere crear
return os.makedirs(myDir) #lo crea
else: raise Exception,"can't render into a nonexistent directory" #o hace una excepcion
#createOutDir(nuke.thisNode()['file'].value()) #esto es lo que va en el callback de before render
#OhulIO.createOutDir(nuke.thisNode()['file'].value()) #asi iria si estuviera en el archivo OhulIO.py y estuviera importado en menu.py
#createOutDir(nuke.thisNode()['file'].value())
nuke.knobDefault("Write.beforeRender",
"createOutDir(nuke.thisNode()['file'].value())") # con esto hago que siempre que se cree un write node, tenga este callback ja!
#(esto) tambien lo podria hacer con el root.
#todo este pedazo, no sirve porque por alguna razon isdir siempre retorna false... #hay algo raro que pasa cuando uno pone los callbacks con parametros y es que parece que evalua los parametros solo cuando se pone el callback y no los actualiza
#####/mal#######
#----------------------------------------------------------
#mejor el del ejemplo del python nuke sdk
#####ejemplo#####
def createWriteDir():
import nuke, os, errno
file=nuke.filename(nuke.thisNode())
dir=os.path.dirname(file)
osdir=nuke.callbacks.filenameFilter(dir)
try:
os.makedirs(osdir)
except OSError, e:
if e.errno != errno.EEXIST:
raise
nuke.addBeforeRender(createWriteDir)
#######/ejemplo
#-------------------------------------------------------------
##### mas chevere algo que tenga lo mejor de los dos #####
def createWriteDir():
import nuke, os, errno
file=nuke.filename(nuke.thisNode())
dir=os.path.dirname(file)
osdir=nuke.callbacks.filenameFilter(dir)
if not os.path.isdir(osdir): #si el path no existe
if nuke.ask('Create directory?\n%s'%osdir): #preguntar si uno lo quiere crear
try:
os.makedirs(osdir)
except OSError, e:
if e.errno != errno.EEXIST:
raise
else: raise Exception,"can't render into nonexistent directory" #o hace una excepcion
nuke.addBeforeRender(createWriteDir)
#print nuke.filename(nuke.thisNode(),nuke.REPLACE)
nuke.knobDefault("Write.beforeFrameRender",
"print nuke.filename(nuke.thisNode(),nuke.REPLACE)") # callback para que imprima en la consola el nombre de cada cuadro que vaya haciendo. nuke.filename es para retornar el nombre del cuadro con el que esta trabajando ene este momento, nuke.REPLACE es para que aplique las variables al formato del string, reemplazando #### por el numero del cuadro y asi.
#os.system( 'say the render is done, dude. get back to your desk!' )
nuke.knobDefault("Write.afterRender",
"os.system( 'say the render is done. yay!' )") #comando para llamar utilidades del sistema, en este caso, para que hable el computador y diga eso.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment