我正在编写一些Python来创建一个更动态的角钉节点。我之前在其他管道中看到过这种做法,我喜欢它,并且这似乎是一个继续学习用于 nuke 的 python 的好项目。 (或者根本是Python哈哈)
我已设置“自动标签”以将节点显示为“稳定”或“匹配移动”,但是当我设置自动标签时,我无法在标签旋钮中输入 tcl 并使其工作。我已经尝试了一些方法来让它发挥作用,但我仍然不太明白。不知道是什么问题,也不知道如何解决。
我尝试设置自动标签,然后在其上附加“标签”,我什至尝试过 nuke.tcl() 来解释标签中的 [value ref_frame] 并显示它,这有效,但它只是在创建节点时吐出值,而不是将该文本放入标签中并允许其被解释为 tcl。
这是代码:
def customCornerPin():
n = nuke.thisNode()
n.addKnob(nuke.Int_Knob('ref_frame',"reference frame"))
n.addKnob(nuke.PyScript_Knob('setFrame', "set to current frame", "{nuke.thisNode()['ref_frame'].setValue(nuke.frame())}"))
n.addKnob(nuke.Boolean_Knob('stabilize',"stabilize"))
n["stabilize"].setFlag(nuke.STARTLINE)
n["from1"].setExpression("to1(ref_frame)")
n["from2"].setExpression("to2(ref_frame)")
n["from3"].setExpression("to3(ref_frame)")
n["from4"].setExpression("to4(ref_frame)")
n["invert"].setExpression("stabilize")
n["ref_frame"].setValue(1001)
n["label"].setValue("[value ref_frame]")
def cornerPinLabel():
n = nuke.thisNode()
customAutoLabel = n.name() + '\n' + "(" + str('stabilize' if n['stabilize'].value()==1 else 'matchmove') + ")"
if n['label'].value():
customAutoLabel = customAutoLabel + '\n' + nuke.tcl("expr", "[value ref_frame]") + n['label'].value()
return customAutoLabel
nuke.addAutolabel(cornerPinLabel, nodeClass="CornerPin2D")
nuke.addOnCreate(customCornerPin, nodeClass="CornerPin2D")
我可以忽略自动标签位,并使用 setValue() 将 stable/matchmove if/else 语句放入标签中,但我更愿意保持标签框尽可能干净。
我还尝试过此版本的 customAutoLabel = line:
customAutoLabel = customAutoLabel + '\n' + n['label'].value()
,它允许您在节点的标签中输入任何内容,但如果我输入 [value to1],它不会将其评估为 tcl或者无论如何,它实际上并没有这样做,它只是将其显示为字符串。
我正在尝试以最有效的方式做到这一点,而不是减慢核武器的速度。据我所知,通过 python 来做是最好的,但也许我错了,我应该只做 tcl。
我自己没有使用过 autolabel,但文档表明它的工作方式与其他回调函数类似,因为它期望第一个参数是这样的函数:
def AutoLabelFunction(*args, **kwargs):
return "text for label"
nuke.addAutoLabel(AutoLabelFunction, nodeClass="CornerPin2D")
您可以在“addAutoLabel”中使用可选的args、kwargs参数将信息传递给函数。