Nuke的Call Back使用

callback的应用

添加在创建节点时,执行的callback

1
2
3
4
def test():
print "this is test"

nuke.addOnCreate(test, nodeClass='Blur')

执行上述代码,在创建一个Blur节点的时候,就可以看到调用里test函数。

如果需要传参,可以参照:
nuke.addOnCreate(callable, args=(), kwargs={}, nodeClass='')

如果要删除callback,使用:
nuke.removeOnCreate(test, nodeClass='Blur')

还有一个方法是:
nuke.addOnUserCreate()
和addOnCreate雷同,区别在于
前者是节点在被创建时调用(包括加载脚本,粘贴等等),
后者只有在用户使用GUI的时候调用,粘贴或者打开工程是无效的。

两个例子
创建节点时,随机生成颜色的功能。

1
2
3
4
5
6
7
8
9
10
11
12
import random

def randomColor():
r = random.uniform(0, 1)
g = random.uniform(0, 1)
b = random.uniform(0, 1)
color = int("%02x%02x%02x%02" % (r*255, g*255, b*255, 255), 16)
nuke.thisNode()["title_color"].setValue(color)

# 没有指定class的时候,默认给所有节点添加callback
nuke.addOnCreate(randomColor)

创建FrameHold节点后,帧数自动设置为当前帧。

1
2
3
4
5
def setFrame():
nuke.thisNode()["first_frame"].setValue(nuke.frame())

nuke.addOnUserCreate(setFrame, nodeClass="FrameHold")

callback 类型

Knob 使用
onCreate 节点创建时
onUserCreate 用户创建节点时
onScriptLoad 工程文件加载时
onScriptSave 工程文件保存时
beforeRender 渲染前执行
afterRender 渲染后执行
beforeFrameRender 每一帧的渲染前
afterFrameRender 每一帧的渲染后
knobChanged knob被改动后

两个例子

1.输出前创建文件夹

1
2
3
4
5
6
7
8
9
10
def createWriteDir():
node = nuke.thisNode()
filename = node['file'].value()
import os
dir_path = os.path.dirname(filename)
if not os.path.exists(dir_path):
os.makedirs(dir_path)

nuke.addBeforeRender(createWriteDir)

2.使用knobChanged关联属性

1
2
3
4
5
6
7
8
9
10
def gangGammaGainSliders():
n = nuke.thisNode()
k = nuke.thisKnob()
if k.name() == "gamma":
n['gain'].setValue(k.value())
elif k.name() == "gain":
n['gamma'].setValue(k.value())

nuke.addKnobChanged(gangGammaGainSliders, nodeClass="ColorCorrect")

也可以直接修改knobChanged的值

1
2
3
4
5
nuke.selectedNode()["knobChanged"].setValue('''
print "test"
print 1
''')

重要: 查看knobChanged的值

1
2
print nuke.selectedNode()["knobChanged"].value()