Nuke学习笔记
Nuke API 文档
- 本地文档:C:\Program Files\Nuke12.2v2\Documentation
- 在线文档:https://learn.foundry.com/nuke/12.2/content/misc/nuke_devs.html
- Nuke Python Developers Guide: 案例教程
- Python Scripting Reference: API 参考文档
- TCL Scripting Reference: TCL 表达式参考文档
节点创建和删除
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,这样也可以正确导入节点组。