Skip to content

Instantly share code, notes, and snippets.

@draconiansolo
Last active December 16, 2015 17:49
Show Gist options
  • Save draconiansolo/5473193 to your computer and use it in GitHub Desktop.
Save draconiansolo/5473193 to your computer and use it in GitHub Desktop.
Nuke Python for artists tutorials Callback Functions with opinionated comments and notes in spanglish.
########### CALLBACK FUNCTIONS PART A ###################
def test(): #defino una funcion que retorna un string
return "testing"
nuke.selectedNode().knob("autolabel").setValue("test()")# asigno esa funcion al set value de el knob que quiero modificar (en este caso es un nodo oculto llamado autolabel) ... y en el set value, llamo la funcion como un string
#-------------------
for n in nuke.allNodes("Camera2"): #por si se me olvida...
#n['focal'].setValue(5) #asi es como se ponen valores en los knobs
n.knob('focal').setValue(10)#es lo mismo que ponerlo asi
#--------------------
def showFocal ():
n=nuke.thisNode()#set n as the context node for the callback
label='%s\nfocal: %s'%(
# % formatted string (Y U NO CONCATENATE WITH +?)
n.name(), #name of the knob
n['focal'].value() #value of the focal knob
)
return label #retorna el string
#nuke.selectedNode().knob('autolabel').setValue('showFocal()') # poner el valor.
#nuke.selectedNode()['autolabel'].setValue('showFocal()')# lo mismo pero en shorthand para no tener que llamar la funcion knob.
nuke.addAutolabel(showFocal,nodeClass='Camera2')#esto es el callback como tal. es un callback para tener una etiqueta siempre en el nodo.
#-------------------------
#for the lulz
def mimimi():
'''create a useless and annoying function'''
return "mimimimi"#nonsense annoying function
nuke.AddAutolabel(mimimi)#every single node on the schematic will be mimimimi
#------------------------------------------------------
########### CALLBACK FUNCTIONS PART B ###################
#ahora la explicacion de como hacer el callback con el cambio de valores y todo --- elegante como el pegante jajajaja
import math #para las funciones de trigonometria, i guess
def focalToFov(focal,aperture): #convertir de focal a fov
return math.degrees(math.atan2(aperture/2,focal)*2)
def fovToFocal(fov,aperture): #convertir de fov a focal
return (aperture/2)/(math.tan(math.radians(fov/2)))
def addFovKnob(): #funcion para añadir el knob de fov
n=nuke.thisNode() #agarrar el nodo actual como contexto
fovKnob=nuke.Double_Knob('fov','FOV') #crear un knob double con variable fov y etiqueta FOV
fovKnob.setRange(5,179) #rango del knob
focal=n['focal'].value() #traer el valor de la focal
hap=n['haperture'].value() #traer el valor de la apertura horizontal
fovKnob.setValue(focalToFov(focal,hap)) #aplicar la funcion de focal a FOV
n.addKnob(fovKnob) # añadir el knob de fov al nodo
#aca termina la funcion de addFovKnob()
nuke.addOnUserCreate(addFovKnob,nodeClass='Camera2') #añadir la funcion addFovKnob como callback al fobKnob
def showFocal ():
# para este ejemplo
n=nuke.thisNode()
label='%s\nfocal: %.2f\nfov: %.2f'%( # con string formatting mas bonito
n.name(),
n['focal'].value(),
n['fov'].value()
)
return label #retorna el string
nuke.addAutolabel(showFocal,nodeClass='Camera2')
def fovCB(): #funcion para el callback de fob y focal
n=nuke.thisNode() #contexto del nodo
k=nuke.thisKnob() #knob del nodo
if k.name()=='fov' or k.name()=='focal' or k.name()=='haperture':
#puse ese if para ahorrar asignaciones, probablemente da igual
hap=n['haperture'].value() #valor de la apertura
fov=n['focal'].value() #valor de la focal
focal=n['fov'].value() #valor de el fov
if k.name()=='fov': #si el knob es el fov
n['focal'].setValue(fovToFocal(k.value(),hap))
elif k.name()=='focal': #si el knob es el focal
n['fov'].setValue(focalToFov(k.value(),hap))
elif k.name()=='haperture': #si el knob es el hap
n['fov'].setValue(focalToFov(focal,k.value())) #esto lo agregue... dar prioridad al focal y asegurarse de que las 3 variables sean consistentes
nuke.addKnobChanged(fovCB, nodeClass='Camera2') #añadir el callback a las camaras.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment