3

我正在尝试将 python 函数放入表达式节点表达式中。以下语法效果很好:

[python testMe()]

我的问题是如何给我的函数一些参数。例如,我怎样才能给像素红色,就像在 tcl 中一样:r(x,y)

4

2 回答 2

2

此代码适用于标准旋钮,例如浮点滑块:

[python ["testMe([value userknob])"]]

示例 Python 函数:

def testMe(val):
    return val

我一辈子都想不通如何使它与作为表达式节点的一部分的特殊钩子一起工作。这似乎是 Nuke -> Tcl 的问题,而不是 Tcl -> Python 的问题。如果你弄明白了,请告诉我!

这是您可以复制和粘贴的节点:

Expression {
 expr0 "\[python \[\"testMe(\[value userknob])\"]]"
 name Expression2
 selected true
 xpos -648
 ypos -554
 addUserKnob {20 User}
 addUserKnob {7 userknob}
 userknob 0.47
}
于 2014-06-13T15:44:23.847 回答
2

不幸的是,由于旋钮表达式与像素处理表达式的评估顺序,我认为您尝试做的事情是不可能的。

tl;dr: Expression 节点的旋钮中的 TCL 表达式在您所使用的变量实际可用之前被评估。

更长的版本

这掩盖或以其他方式简化了有关 Nuke 操作员评估的许多事情,以便尝试更简洁地解决原始问题。

旋钮上的表达式(即方括号中的表达式,或使用右键单击 ->“添加表达式...”设置)在操作员处理开始时(您可以称为“旋钮存储”阶段)在任何之前进行评估一种像素处理开始。此步骤生成由内部 C++ 对象存储的实际(数字)值,Knob以使这些值可在像素处理期间使用。这种扩展是由大多数内置旋钮类型透明地完成的,因此插件开发人员不必担心自己在他们的操作符代码中做这件事。

了解正在发生的事情的一种方法是在任何渲染上下文之外的这些旋钮之一的上下文中评估 Nuke 表达式:

nuke.tcl('in Expression1.expr2 {return [expression x]}')

这使用 Nuke TCL 命令in将表达式的评估上下文设置为像素表达式旋钮之一。然后,该expression命令(不要与 TCL 的expr命令混淆)将给定的字符串评估为普通的 Nuke 旋钮表达式(旋钮表达式使用本质上是 TCLexpr语法的受限子集,它只对浮点值进行操作,并为像)这样的字符串Grade1.blackpoint

您会注意到此nuke.tcl调用确实返回了一个值,但不幸的是,该值是当前帧号。如果您在表达式中替换xy...,您将得到 0。换句话说,在“旋钮存储”阶段(此时 Nuke 将扩展您的 TCL 表达式),像素坐标在旋钮的表达式上下文中不可用。

当 Expression 节点实际处理像素时,来自每个表达式旋钮的文本值由运算符在表达式上下文中展开,其中xy变量设置为当前正在处理的像素的坐标。

无论如何,我知道这可能有点技术性和冗长,但我希望它有助于解释这里发生了什么。

于 2014-08-30T22:14:18.220 回答