如何在nuke表达式中为python函数提供参数?

时间:2014-06-13 14:29:35

标签: python expression tcl nuke

我正在尝试将python函数放在表达式节点表达式中。 以下语法非常有效:

[python testMe()]

我的问题是如何给我的功能一些参数。 例如,如何给像素红色,如tcl:r(x,y)

2 个答案:

答案 0 :(得分:2)

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

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

示例Python函数:

def testMe(val):
    return val

我不能为我的生活找出如何使用特殊挂钩作为Expression节点的一部分。这似乎是Nuke的一个问题 - > Tcl,而不是Tcl - >蟒蛇。如果你想出那个,请告诉我!

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

Expression {
 expr0 "\[python \[\"testMe(\[value userknob])\"]]"
 name Expression2
 selected true
 xpos -648
 ypos -554
 addUserKnob {20 User}
 addUserKnob {7 userknob}
 userknob 0.47
}

答案 1 :(得分:2)

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

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

更长的版本

这可以掩盖或简化Nuke运营商评估的许多事情,以便更简洁地尝试解决原始问题。

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

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

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

这使用Nuke TCL命令in将表达式的计算上下文设置为其中一个像素表达式旋钮。然后,expression命令(不要与TCL的expr命令混淆),将给定的字符串作为普通的Nuke旋钮表达式进行计算(旋钮表达式使用的是TCL的{{1}的基本限制子集}语法只对浮点值进行操作,并为expr}等字符串执行旋钮和可变分辨率。

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

当Expression节点实际处理像素时,操作符在表达式上下文中扩展每个表达式旋钮的文本值,该表达式上下文将yx变量设置为像素的坐标目前正在处理中。

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