如何在Nuke表达式中给Python函数传递参数?

3
我正在尝试将一个Python函数放入表达式节点表达式中。 以下语法完美地起作用:
[python testMe()]

我的问题是如何给我的函数传递一些参数。

例如,如何将像素设为红色,比如在tcl中:r(x,y)


这似乎与tcl没有太大关系。 - nurdglaw
2
看起来Nuke支持Python和TCL。我相信OP的问题是一个有效的问题。 - Hai Vu
好的,我认错了。 - nurdglaw
2个回答

2

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

[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
}

1
"[python "testme([value userknob])"]" 可能有效,但我还没有设置好来测试... - Donal Fellows
啊,原来是这样。这说明我对tcl一窍不通!谢谢。 - mhlester
谢谢大家。虽然这回答了我的问题,但我的参数不是旋钮值,所以并没有解决我的问题。假设我想在我的Python函数中计算每个像素周围8个像素的平均值,是否可以在迭代图像像素时将像素值传递给我的函数?(我希望这可以在Tcl表达式中完成,但这只是一个例子)。 - Pic
@Pic,抱歉还没有达到100%。如果您能在Tcl中找出解决方法,我相信我们可以想办法将其转换为Python。我也会继续寻找。 - mhlester

2

很遗憾,我认为你想做的事情是不可能的,因为旋钮表达式和像素处理表达式的求值顺序冲突。

简而言之:表达式节点中旋钮上的TCL表达式在实际变量可用之前先被求值

详细说明

这样做是为了更简洁地回答原始问题,因此省略或简化了Nuke算子评估的许多内容。

旋钮上的表达式(即方括号内的表达式,或使用右键单击-"添加表达式..."设置的表达式)在操作符处理开始时(在你可以称其为“旋钮存储”阶段期间)被评估,在任何像素处理开始之前。这一步生成实际的(数值)值,由内部C ++ Knob对象存储,以便在像素处理过程中使用。大多数内置旋钮类型都会自动进行扩展,从而使插件开发人员无需在其操作符代码中担心该问题。

观察在任何渲染环境之外评估Nuke表达式的一种方法是查看正在进行的一些内容:

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

这里使用Nuke TCL命令in将表达式的求值上下文设置为像素表达式旋钮之一。然后,expression命令(不要与TCL的expr命令混淆)将给定的字符串作为普通的Nuke旋钮表达式进行评估(旋钮表达式使用实质上是TCL的expr语法的受限子集,仅对浮点值进行操作,并对诸如Grade1.blackpoint这样的字符串进行旋钮和变量分辨率)。
你会注意到,这个nuke.tcl调用实际上确实返回了一个值,但不幸的是,该值是当前帧数。如果你在表达式中用y代替x,你会得到0。换句话说,在“旋钮存储”阶段(当Nuke将扩展您的TCL表达式时),像素坐标在旋钮的表达式上下文中是不可用的。
当Expression节点实际处理像素时,每个表达式旋钮的文本值都由运算符在表达式上下文中扩展,该上下文将xy变量设置为当前正在处理的像素的坐标。
无论如何,我知道这可能有点技术性和冗长,但我希望它能帮助解释这里正在发生的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接