Last active
December 16, 2015 17:49
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
########### 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