Nuke的Call Back使用

zhangly 2021-11-05 23:16:35
Categories: > Tags:

callback的应用

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

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的时候调用,粘贴或者打开工程是无效的。

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

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节点后,帧数自动设置为当前帧。

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.输出前创建文件夹

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关联属性

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的值

nuke.selectedNode()["knobChanged"].setValue('''
print "test"
print 1
''')

重要: 查看knobChanged的值

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