Nuke学习笔记

Nuke API 文档

节点创建和删除

nuke节点的有可能有不同的版本,比如”Text”和”Text2”、 “Merge”和”Merge2”、”Tracher”和”Tracher3”以及”Tracher4”,默认情况下使用的是新版。右键 > Other > All Plugin > Update,这个操作会扫描并加载所有可用的节点。bezier节点不能被扫描出来,可使用Roto代替,若一定要使用,可使用代码创建或使用 Comp Script Command(TCL) 快捷键(X)创建想要的节点。节点参数的键可以在Nuke中将鼠标悬停在参数选项上,显示的提示框的第一句就是参数的名称,参数的值可复制节点到文本编辑器中查询,有时参数可能设置不上,是Nuke的一些bug,需要寻找别的手段设置。前台模式适合在Gui模式下交互,并且创建的节点会默认连接到当前选择的节点下,若没有选中节点,则创建在鼠标最后一次点击的位置;后台模式更适合后台运行脚本,创建的节点的位置随机。

  • 创建节点:
    • 前台模式:nuke.createNode(“节点类型”)
    • 后台模式:nuke.nodes.Read()
  • 创建节点时不弹出参数设置对话框:nuke.createNode(“节点类型”,inpanel=False)
  • 创建节点时设置参数:
    • 前台模式:nuke.createNode(“Text2”,”message ‘test’ yjustify center”)
    • 后台模式:nuke.nodes.Read(message=’test’, yjustify=center)
  • 获取选中节点类型名:
    • nuke.getNodeClassName()(选中状态的节点)
    • node = createNode(“Text2”);node.Class()
  • 获取节点名:node.name()
  • 删除节点:
    • 前台模式:nuke.delete(node)
    • 后台模式:nuke.nodeDelete()(选中状态的节点)
Read节点读取文件小技巧

通过fromUserText方法读取视频文件,可以直接获取到视频文件的视频的长度。

import nuke
readNode = nuke.nodes.Read()
movPath = r"D:\mov\test.mov"
readNode['file'].fromUserText(movpath)

如果是exr或者别的图片序列呢?
通过nuke.getFileNameList(path)方法可以获取到文件夹下的序列,进行自动分类,并返回一个字符串列表:

[‘N.####.exr 1-15’, ‘Z.####.exr 1-7’, ‘beauty.####.exr 1-160’]

创建read节点示例如下:

import nuke
readNode = nuke.nodes.Read()
exrPath = r"D:\image\beauty"
exrlist = nuke.getFileNameList(exrPath)
for _each in exrlist:
    readNode = nuke.nodes.Read()
    readNode['file'].fromUserText("%s/%s" % (exrPath,_each))

选择和链接节点

  • 获取节点:nuke.toNode(“节点名”)
  • 获取节点输入:
    • 获取所有输入端:nuke.inputs()
    • 获取指定输入端:nuke.input(端口数字)
  • 链接节点:nuke.setInput(端口数字,nuke.toNode(“节点名”))
  • 获取所有节点:nuke.allNodes()
  • 获取选中节点:
    • 仅返回最后一个被选中的节点 nuke.selectedNode()
    • 返回主节点树中所有选中的节点 nuke.selectedNodes()
  • 选中以获得的节点
    • 将节点设置为选中状态 node = createNode(“Text2”);node.setSelect(是否选中) 也可以传递参数设置选中状态
    • 将当前节点设置为整个节点树中唯一被选中的状态 node.selectOnly()
  • 选中所有节点 nuke.selectAll()
  • 选中满足模糊搜索节点名称的节点:nuke.selectPattern() 仅能在GUI模式下使用
  • 选中与当前选中节点类似的节点:nuke.selectSimilar(“要匹配的类型”)
    • 选中有相似的类型 nuke.selectSimilar(nuke.MATCH_CLASS)
    • 选中有相似的label标签 nuke.selectSimilar(nuke.MATCH_LABEL)
    • 选中有相似的颜色 nuke.selectSimilar(nuke.MATCH_COLOR)
  • 将选中节点的上下游都设置为选中状态 nuke.selectConnectedNodes()
  • 判断是否有被选中的节点 nuke.nodesSelected()
  • 反向选择 nuke.invertSelection()
  • 将节点从选中的节点中脱离出来 nuke.extractSelected()
  • 克隆选中的节点 nuke.cloneSelected()
  • 以递归形式清除节点的选中状态 nukescript.misc.clear_selection_recursive() 包括Gizmo 和 Group 中选中的节点也会被清除选中。

节点位置和布局

NodeGraph 的坐标轴方向是X轴向右,Y轴向下;节点的位置指的是节点左上角的位置.
位置相关方法,node = createNode(“Text2”):

  • 获取位置
    • node.xpos()、node.ypos()
    • node[“xpos”].value、node[“ypos”].value
  • 设置位置
    • node.setXpos(“value”)、node.setYpos(“value”)、node.setXYpos(“value1”,”value2”)
    • node[“xpos”].setValue(“value”)、node[“ypos”].setValue(“value”)
  • 获取节点长宽
    • node.screenWidth()、node.screenHeight()
  • 自动布局到选中节点的下方 node.autoplace()
  • NodeGraph 缩放比
    • 查询缩放比 nuke.zoom()
    • 设置缩放比 nuke.zoom(倍数,[焦距的位置X,焦距的位置Y])
    • 聚焦到指定节点 nuke.zoom(倍数,[node.xpos(),node.ypos()])

文件操作

  • 打开新Nuke工程 nuke.scriptNew() ctrl+N
  • 打开指定Nuke工程 nuke.scriptOpen(“存在的Nuke工程路径”)
  • 将已有的Nuke工程导入到当前的Nuke工程中
    • nuke.scriptSource()
    • nuke.scriptRendFile()
  • 清空当前NodeGraph:
    • 直接放弃修改,无返回值 nuke.scriptClear()
    • 提示是否保存更改,有返回值 nuke.scriptClose()
  • 退出Nuke nuke.scriptExit()
  • 获取当前文件名称
    • nuke.scriptName()
    • nuke.Root().name()
    • nuke.Root()[“name”].value()
    • nuke.Root().knob(“name”).value()
  • 从节点中进入节点树环境.使用上下文管理器with ‘with nuke.Root()’
  • 返回当前工程所在的文件夹的路径
    • nuke.utils.script_directory()
    • nukescripts.script_directory()(该方法调用上面的方法)
  • 复制和粘贴
    • 从字符串创建一个节点 nuke.scriptReadText(“表示节点的字符串,超麻烦”)
    • 将选中的节点暂存到文本名或粘贴板名的文件中 nuke.nodeCopy(“文件路径或临时起名的粘贴板中”)
    • 将粘贴板中的内容粘贴到nuke中 nuke.nodePaste(“文件路径或临时起名的粘贴板中”) # %clipboard% 可表示系统粘贴板
  • 保存工程
    • 直接保存 nuke.scriptSave()
    • 另存为 nuke.scriptSaveAs(“文件名”)
    • 另存时不修改Root节点中的路径 nuke.scriptSaveToTemp(“文件名”)
    • 保存文件后清空nuke工程 nuke.scriptSaveAndClear()

Nuke中的控件(Knob)

Nuke中的文本框、下拉菜单、复选框、滑块等基本控件,以及色彩设置
图片尺寸、坐标值等 专属控件都称为Knob。
node = nuke.toNode(“Read”)

  • 获取所有的控件
    • node.allKnobs() 所有控件列表
    • node.knobs() 所有控件字典
  • 获取特定的控件对象
    • 根据控件名获取
      • node.knob(“控件名”) 没找到指定对象返回None
      • node[“控件名”] 没找到指定对象会报错
      • node.knobs().get(“控件名”) 根据控件名获取控件对象
    • 根据序号获取
      • node.numKnobs() 返回当前节点中所有控件的总数量
      • node.knob(控件序号)
  • 获取当前用户操作的控件 nuke.thisNode()
  • 控件状态
    • node.knob(“控件名”).enable() 是否启用
    • node.knob(“控件名”).enable()setEnable() 设置启用状态
    • node.knob(“控件名”).enable()visible() 是否可见
    • node.knob(“控件名”).enable()setVisible() 设置可见状态
  • 返回标签名、控件名、提示信息 label()、name()、tooltip()
  • 设置标签名、控件名、提示信息 setLabel()、setName()、setTooltip()
  • 获取控件值
    • value() 控件会根据需要进行继承和修改函数
    • getValue(oc) 获取特定帧或特定视图下的值
    • getValueAt()
    • defaultValue() 获取默认值
  • 设置控件的值
    • setValue(value,view=”default”) 控件会根据需要进行继承和修改函数
    • setValueAt()
    • setDafaultValue() 设置控件的默认值
    • nuke.knobDefault(“节点名.控件名”,”参数”) 对节点的参数设置全局默认值
  • 控件值是否不为默认值 notDefault()

format_knob 参数默认值来源于Root节点的format值

  • 获取值 node.knob(“format控件名”).value()
  • 设置值 node.knob(“format控件名”).setValue()
  • 新建默认format值 nuke.addFormat(“新建format值”) 新建format值为TCL表达式,其至少要包含 宽度,高度,格式名三项,每项用空格分隔,名称不能用数字开头

TCL表达式相关函数:

  • node.knob(“format控件名”).fromScript(“tcl表达式”) 接受tcl表达式并赋值给对象
  • node.knob(“format控件名”).toScript(bool,time) 将值输出为TCL表达式 bool为Ture,结果两侧加大括号,反之不加,time为具体帧,则仅设置该帧,若为None,则设置所有帧
  • node.knob(“format控件名”).readKnobs(“tcl表达式”) 使用tcl表达式为一个或多个节点控件赋值
  • node.knob(“format控件名”).writeKnobs(value) 将控件值以tcl表达式方式输出,value需要根据常量获取,详情见文档

自定义控件

UI交互式创建

代码创建
可使用NoOp节点进行自定义
node = nuke.toNode(“Read”)

  • 添加控件 node.addKnob(控件对象)
  • 移除控件 node.removeKnob(控件对象)
  • pythonScript中获取当前节点 nuke.thisNode()

Gizmo操作

将具有特定功能的节点组打包成一个节点,可用于别的nuke工程

  • 查询节点全路径 nuke.thisNode().fullName()
  • 查询组内的节点
    • nuke.node(“组名”).node(“内部节点名”)[“knob名”].value()
    • nuke.node(“组名.组内节点名”)[“knob名”].value()
  • 在组织间进行代码操作
    • node.begin() 代码开始
    • node.end() 代码结束
  • 转换正确导入的Gizmo为Group nuke.toNode(“Group”).makeGroup()

导入\导出gizmo

在组节点或者Gizmo节点下面,点击Node > Export gizmo\Copr as Group
不能直接import Gizmo 节点使用,这样导入的节点是不完整的,只能使用nuke标准环境加载的方式进行应用。或将gizmo文件以文本的方式打开,将其中的Gizmo 替换为Group,这样也可以正确导入节点组。