我正在尝试将一个Python函数放入表达式节点表达式中。
以下语法完美地起作用:
[python testMe()]
我的问题是如何给我的函数传递一些参数。
例如,如何将像素设为红色,比如在tcl中:r(x,y)
。
[python testMe()]
我的问题是如何给我的函数传递一些参数。
例如,如何将像素设为红色,比如在tcl中:r(x,y)
。
这段代码适用于标准旋钮,如浮点滑块:
[python ["testMe([value userknob])"]]
Python示例函数:
def testMe(val):
return val
我真的无法想象如何将其与Expression节点中的特殊钩子一起使用。这似乎是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
}
很遗憾,我认为你想做的事情是不可能的,因为旋钮表达式和像素处理表达式的求值顺序冲突。
简而言之:表达式节点中旋钮上的TCL表达式在实际变量可用之前先被求值。
这样做是为了更简洁地回答原始问题,因此省略或简化了Nuke算子评估的许多内容。
旋钮上的表达式(即方括号内的表达式,或使用右键单击-"添加表达式..."设置的表达式)在操作符处理开始时(在你可以称其为“旋钮存储”阶段期间)被评估,在任何像素处理开始之前。这一步生成实际的(数值)值,由内部C ++ Knob
对象存储,以便在像素处理过程中使用。大多数内置旋钮类型都会自动进行扩展,从而使插件开发人员无需在其操作符代码中担心该问题。
观察在任何渲染环境之外评估Nuke表达式的一种方法是查看正在进行的一些内容:
nuke.tcl('in Expression1.expr2 {return [expression x]}')
in
将表达式的求值上下文设置为像素表达式旋钮之一。然后,expression
命令(不要与TCL的expr
命令混淆)将给定的字符串作为普通的Nuke旋钮表达式进行评估(旋钮表达式使用实质上是TCL的expr
语法的受限子集,仅对浮点值进行操作,并对诸如Grade1.blackpoint
这样的字符串进行旋钮和变量分辨率)。nuke.tcl
调用实际上确实返回了一个值,但不幸的是,该值是当前帧数。如果你在表达式中用y
代替x
,你会得到0。换句话说,在“旋钮存储”阶段(当Nuke将扩展您的TCL表达式时),像素坐标在旋钮的表达式上下文中是不可用的。x
和y
变量设置为当前正在处理的像素的坐标。