右、あなたが反抗している2つのことがあります。まず、文字列に対してsetValue()呼び出しを実行しようとしている元のコードでは、正しく機能しません。理想的には、2つの呼び出しのいずれか(x.knob('name_of_the_knob')
またはx['name_of_the_knob']
、プロジェクト/施設/個人のスタイルと一致する方)を使用して、ノブオブジェクトの値を取得および設定します。
コメントから、あなたのコードは次のようになります(私のコメントは、Nukeにそれほど精通していない他の人々のために追加されました):
# select all the nodes
curSel = nuke.selectedNodes()
# nuke.thisNode() returns the script's context
# i.e. the node from which the script was invoked
knobToChange = nuke.thisNode()['knobname'].getValue()
codeIn = nuke.thisNode()['codeinput'].getValue()
for x in curSel:
x.knob(knobToChange).setValue(codeIn)
このサンプルUIを使用して、示されている2つのフィールドの値と、スクリプトを起動するボタンを使用します。

...このコードを実行すると、「foo」という名前はありません」というエラーメッセージが表示されます。これは、呼び出しが実際にノブの評価結果.getValue()
を返しているためです。これは、実行しようとしたときのエラーメッセージです。 TCL [value foo]であり、fooという名前のオブジェクトがないことを検出します。
.toScript()
理想的には、生のテキストを返すinvokeを実行するのが理想的です。
# select all the nodes
curSel = nuke.selectedNodes()
# nuke.thisNode() returns the script's context
# i.e. the node from which the script was invoked
knobToChange = nuke.thisNode()['knobname'].toScript()
codeIn = nuke.thisNode()['codeinput'].toScript()
for x in curSel:
x.knob(knobToChange).setValue(codeIn)
元のコードに従って文字列を作成したり、角かっこを追加したりすることで、この問題を回避できますが、そうです、それは苦痛であり、メンテナンスの悪夢であり、オブジェクトを構築するそのルートをたどり始めます文字列から(@mgilsonがaglobals()
またはeval()
メソッドの両方で行う方法を説明しています)
Nukeを使用する喜びがなかった人のために、より多くのコンテキストを提供する(または提供しない)小さなスクリーンショットを次に示します。
