NukeのTCL入門!さまざまな情報を取得して活用する方法
- 2023/04/18
NukeではTCL(ティーシーエルまたはティクル)というスクリプト言語を使用できます。TCLでさまざまな情報を取得してNuke上で利用することで、作業効率アップが期待できます。この記事では、実際の現場で使われる実用的なTCLの活用法を紹介したいと思います。
Blurノードの[label]にこのように記述します。
[size] ノブの値がノード上に表示されるようになります。
この方法は他のノード、他のノブでも応用できます。ノブの上にマウスオーバーしたときに表示される、「内部的な名前」で記述する必要がある点に注意してください。今回の場合は表示名も内部的な名前も同じ"size"でしたが、違う名前になっているケースも少なくありません。また、大文字/小文字は区別されます。
menu.pyに以下の記述を追加しておけば、Blurノードをつくったときにデフォルトでラベルが設定されるようになります。
※menu.pyはWindowsなら C:\Users\<ユーザー名>\.nuke にあるテキスト形式のファイルです。
Textノードをつくり、[message] ノブに入力してみましょう。
年月日を表示します。要素を個別に取得した上で、「_」(アンダーバー)で繋いでいます。
小文字の「%y」だと2桁の年になります。今度は「/」(スラッシュ)で繋いでみました。
ノードの持つメタデータを取得することもできます。たとえば、上流から流れてくるノードの情報にタイムコードのメタデータが含まれていれば、以下のようにして取得できます。
Nukeでは、ノードが持つメタデータをViewMetaDataノードで確認できます。また、ModifyMetaDataノードを使ってNuke上でメタデータを独自に追加することもできます。レンダリングするときにEXRにすべてのメタデータを入れる/メタデータを一切入れない/一部のメタデータのみを入れる、といった選択がWriteノードで可能です。
Nukeの現在のフレーム番号を表示します。
「数字が2桁になったり3桁になったり4桁になったりして見栄えが悪いよ~」というときは、以下のように書いて4桁に揃えることができます。
「root」という書き方で、NukeのProject Settingsの各項目にアクセスできます。これを利用して、フレームレンジを取得したいと思います。
開始フレームと終了フレームを取得して、現在のNukeのフレームレンジを表示します。それぞれ個別に取得してから、「-」(ハイフン)で繋ぎます。
上記の応用で、現在のNukeの持つデュレーション(フレーム数)を表示します。「終了フレーム引く開始フレーム」という引き算をして、1を足して取得します。
NukeのProject Settingsにある[name]という項目から、今開いているNukeのファイルパスを取得することができます。
Nukeファイルのフルパスを取得します。
Nukeファイル名部分のみを取得します。拡張子(.nk)を含みます。
拡張子(.nk)なしのNukeファイル名を取得します。
Nukeファイルが入っている親フォルダまでの部分のファイルパスを取得します。
Nukeファイルのフルパスを「/」で分割して、1つ目のブロックを取得します。0から数えます。
2つ目のブロックを取得します。
「end」と書いて、最後のブロックを取得します。
「end-1」と書いて、最後から2番目のブロックを取得します。
先ほど取得できた拡張子(.nk)なしのNukeファイル名をさらに分解して、個々の要素を取得したいと思います。「_」で分割して、1つ目のブロックを取得します。0から数えます。
2つ目のブロックを取得します。
「end」で最後のブロックを取得します。
「end-1」で最後から2番目のブロックを取得します。
分解して取得した個々の要素は、好きなように扱えます。たとえば、このように離れていた2つの要素を「_」で繋ぐことができます。
「_」で分割したときの1つ目から3つ目までの部分が欲しい、というときは、一度分割してから、joinを繰り返し使って再度「_」で結合させて取得できます。比較的短い記述で済みます。
以上のようにして取得した要素を利用し、レンダリング先のファイルパスを自動的につくることもできます。
Writeノードの[file]ノブにこの文字列を入れておけば、Nukeファイル名に連動して自動的に書き出し先が設定されます。ファイルパスを手で入力したり、書き換えたりする必要がないので効率的です!
なお、Writeノードの [create directories] のチェックを入れておくことで、レンダリング実行時にフォルダが作成されます。
今度はReadノードから取得してみたいと思います。
Readノードの下にTextノードをつくり、[message] ノブに入力してみましょう。
「現在入力されているノード」が持つ開始フレームと終了フレームを取得して、フレームレンジを表示します。それぞれ個別に取得してから、「-」(ハイフン)で繋ぎます。
「現在入力されているノード」が持つデュレーション(フレーム数)を表示します。「終了フレーム引く開始フレーム」という引き算をして、1を足して取得します。
[topnode]という書き方で、最上流のノードにアクセスできます。これを利用して、最上流にあるReadノードのファイルを取得したいと思います。
Readノードの [File] ノブに入っているファイルのフルパスを取得します。
ちなみに「knob」ではなく「value」と書いてもファイルパスを取得できますが、以下のように連番部分(%04d)に実際のフレーム番号が出てきてフレームごとに更新される、という違いがあります。
※「knob」は、そのノブに入力されている文字列を素直に返します。つまり、もしそこにエクスプレッション(計算式)が書いてあれば、その文字列そのままが取得されます。一方「value」は、エクスプレッションがあればその計算結果、実際の値を返します。ケースバイケースで使い分けると良いと思います。
ファイルが入っている親フォルダまでの部分のファイルパスを取得します。
ファイル名の部分のみを取得します。拡張子を含みます。
(※前述のように knob ではなく value で書けば、「%04d」の部分に連番のフレーム番号が出てきてフレームごとに更新されます。)
拡張子を除去したファイル名を取得します。
Readノードの持つファイルのフルパスを「/」で分割して、1つ目のブロックを取得します。0から数えます。
2つ目のブロックを取得します。
「end」で最後のブロックを取得します。
「end-1」で最後から2番目のブロックを取得します。
先ほど拡張子を除去したファイル名を取得できましたが、さらに「.」で分割したときの1つ目を取得します。これで連番のフレーム番号の部分「.%04d」を除去できます。
このようにして取得したファイル名を「_」で分割して、1つ目のブロックを取得します。
2つ目のブロックを取得します。
「end」で最後のブロックを取得します。
「end-1」で最後から2番目のブロックを取得します。
上述のように、こうして取得した要素を繋いだり組み合わせて利用することができます。
今回は[topnode]で最上流のノードにアクセスしましたが、ノードへのアクセス方法は他にもあります。
ノード名を指定して取得することができます。「Read1」という名前のノードの[File]ノブの値を取得します。
「input」と書くと、1つ上流のノードを意味します。1つ上流のノードの[File]ノブの値を取得します。
「inputの、inputの、input」と書いて1つずつ上流のノードにさかのぼることができます。
Mergeノードのように複数のインプットがあり、上流のノードが複数ある場合は、1つ目のインプットを単に「input」または「input0」と書き、2つ目のインプットは「input1」、3つ目のインプットは「input2」と書いて取得できます。
グループの中からは「parent」で親のグループノードを取得します。以下のように書けば、親のグループノードの、さらに1つ上流のノードの[File]ノブの値を取得します。
TCLを使ったエクスプレッションで、ノードの値をコントロールできます。試してみましょう。
Blurノードを2つ作成します。2つ目のBlurノードの[size]ノブを右クリック > [Add expression...] からエクスプレッションを入力します。
以下のように書くことで、2つ目のBlurノードのブラー量は、1つ上流のBlurノードの2倍の量に自動的に設定されます。
参考になりそうなサイトのリンクを掲載しておきます。
gatimedia. Nuke Tutorial. TCL FUNCTIONS IN TEXT NODE
https://www.gatimedia.co.uk/tcl-functions
gatimedia. Nuke Tutorial. EXPRESSIONS & TCL Tips
https://www.gatimedia.co.uk/expressions
gatimedia. Nuke Tutorial. CONDITIONAL TCL EXPRESSIONS IN NUKE
https://www.gatimedia.co.uk/conditional-expressions
thoughtvfx. Nuke tcl tips
http://thoughtvfx.blogspot.com/2012/12/nuke-tcl-tips.html
Luca Mignardi. Nuke TCL Snippets
https://www.lucamignardi.com/nuke-tcl-snippets/
Ben McEwan's Compositing Blog. TCL Tips For Visualizing Data In Your Comp
https://benmcewan.com/blog/2018/05/30/tcl-tips-for-visualizing-data-in-your-comp/
yamagishi-2bit-BLog. [Nuke] Metadataを用いたFile入出力の検証
http://yamagishi-2bit.blogspot.com/2020/10/nuke-metadatafile.html
yamagishi-2bit-BLog. [Nuke Python] ExpressionやTCLによる最終的なファイル名の取得 [ nuke.filename() ]
http://yamagishi-2bit.blogspot.com/2020/01/nuke-python-expressiontcl-nukefilename.html
Nukepedia. TCL. write nodes filename from topmost read
http://www.nukepedia.com/tcl/write-nodes-filename-from-topmost-read
Nukepedia. Written Tutorials. Expressions 101
http://www.nukepedia.com/written-tutorials/expressions-101
ノードのラベルにノブの値を表示する
Blurノードの[label]にこのように記述します。
[value size]
[size] ノブの値がノード上に表示されるようになります。
この方法は他のノード、他のノブでも応用できます。ノブの上にマウスオーバーしたときに表示される、「内部的な名前」で記述する必要がある点に注意してください。今回の場合は表示名も内部的な名前も同じ"size"でしたが、違う名前になっているケースも少なくありません。また、大文字/小文字は区別されます。
menu.pyに以下の記述を追加しておけば、Blurノードをつくったときにデフォルトでラベルが設定されるようになります。
nuke.knobDefault('Blur.label', '[value size]')
※menu.pyはWindowsなら C:\Users\<ユーザー名>\.nuke にあるテキスト形式のファイルです。
年月日を画面に表示させる
Textノードをつくり、[message] ノブに入力してみましょう。
年月日を表示します。要素を個別に取得した上で、「_」(アンダーバー)で繋いでいます。
[date %Y_%m_%d]
小文字の「%y」だと2桁の年になります。今度は「/」(スラッシュ)で繋いでみました。
[date %y/%m/%d]
メタデータの取得
ノードの持つメタデータを取得することもできます。たとえば、上流から流れてくるノードの情報にタイムコードのメタデータが含まれていれば、以下のようにして取得できます。
[metadata input/timecode]
Nukeでは、ノードが持つメタデータをViewMetaDataノードで確認できます。また、ModifyMetaDataノードを使ってNuke上でメタデータを独自に追加することもできます。レンダリングするときにEXRにすべてのメタデータを入れる/メタデータを一切入れない/一部のメタデータのみを入れる、といった選択がWriteノードで可能です。
Nukeのフレーム情報を取得する
Nukeの現在のフレーム番号を表示します。
[frame]
「数字が2桁になったり3桁になったり4桁になったりして見栄えが悪いよ~」というときは、以下のように書いて4桁に揃えることができます。
[format %04d [frame]]
「root」という書き方で、NukeのProject Settingsの各項目にアクセスできます。これを利用して、フレームレンジを取得したいと思います。
開始フレームと終了フレームを取得して、現在のNukeのフレームレンジを表示します。それぞれ個別に取得してから、「-」(ハイフン)で繋ぎます。
[value root.first_frame] - [value root.last_frame]
上記の応用で、現在のNukeの持つデュレーション(フレーム数)を表示します。「終了フレーム引く開始フレーム」という引き算をして、1を足して取得します。
[expr [value root.last_frame] - [value root.first_frame] + 1]
今開いているNukeのファイルパスを取得する
NukeのProject Settingsにある[name]という項目から、今開いているNukeのファイルパスを取得することができます。
Nukeファイルのフルパスを取得します。
[value root.name]
Nukeファイル名部分のみを取得します。拡張子(.nk)を含みます。
[basename [value root.name]]
拡張子(.nk)なしのNukeファイル名を取得します。
[basename [file rootname [value root.name]]]
または
[file rootname [file tail [value root.name]]]
Nukeファイルが入っている親フォルダまでの部分のファイルパスを取得します。
[file dirname [value root.name]]
Nukeファイルのフルパスを分解する
Nukeファイルのフルパスを「/」で分割して、1つ目のブロックを取得します。0から数えます。
[lindex [split [value root.name] "/"] 0]
2つ目のブロックを取得します。
[lindex [split [value root.name] "/"] 1]
「end」と書いて、最後のブロックを取得します。
[lindex [split [value root.name] "/"] end]
「end-1」と書いて、最後から2番目のブロックを取得します。
[lindex [split [value root.name] "/"] end-1]
Nukeファイル名を分解する
先ほど取得できた拡張子(.nk)なしのNukeファイル名をさらに分解して、個々の要素を取得したいと思います。「_」で分割して、1つ目のブロックを取得します。0から数えます。
[lindex [split [file rootname [file tail [value root.name]]] "_"] 0]
2つ目のブロックを取得します。
[lindex [split [file rootname [file tail [value root.name]]] "_"] 1]
「end」で最後のブロックを取得します。
[lindex [split [file rootname [file tail [value root.name]]] "_"] end]
「end-1」で最後から2番目のブロックを取得します。
[lindex [split [file rootname [file tail [value root.name]]] "_"] end-1]
分解して取得した要素を繋いで使う
分解して取得した個々の要素は、好きなように扱えます。たとえば、このように離れていた2つの要素を「_」で繋ぐことができます。
[lindex [split [file rootname [file tail [value root.name]]] "_"] 0]_[lindex [split [file rootname [file tail [value root.name]]] "_"] end]
「_」で分割したときの1つ目から3つ目までの部分が欲しい、というときは、一度分割してから、joinを繰り返し使って再度「_」で結合させて取得できます。比較的短い記述で済みます。
[join [lrange [split [basename [value root.name]] _] 0 2] _]
以上のようにして取得した要素を利用し、レンダリング先のファイルパスを自動的につくることもできます。
D:/Render/[lindex [split [file rootname [file tail [value root.name]]] "_"] 1]_[lindex [split [file rootname [file tail [value root.name]]] "_"] 2]_[lindex [split [file rootname [file tail [value root.name]]] "_"] end]/[lindex [split [file rootname [file tail [value root.name]]] "_"] 1]_[lindex [split [file rootname [file tail [value root.name]]] "_"] 2]_[lindex [split [file rootname [file tail [value root.name]]] "_"] end].%04d.exr
Writeノードの[file]ノブにこの文字列を入れておけば、Nukeファイル名に連動して自動的に書き出し先が設定されます。ファイルパスを手で入力したり、書き換えたりする必要がないので効率的です!
なお、Writeノードの [create directories] のチェックを入れておくことで、レンダリング実行時にフォルダが作成されます。
ノードの持つフレーム情報を取得する
今度はReadノードから取得してみたいと思います。
Readノードの下にTextノードをつくり、[message] ノブに入力してみましょう。
「現在入力されているノード」が持つ開始フレームと終了フレームを取得して、フレームレンジを表示します。それぞれ個別に取得してから、「-」(ハイフン)で繋ぎます。
[value first_frame] - [value last_frame]
「現在入力されているノード」が持つデュレーション(フレーム数)を表示します。「終了フレーム引く開始フレーム」という引き算をして、1を足して取得します。
[expr [value last_frame] - [value first_frame] + 1]
Readノードのファイルを取得する
[topnode]という書き方で、最上流のノードにアクセスできます。これを利用して、最上流にあるReadノードのファイルを取得したいと思います。
Readノードの [File] ノブに入っているファイルのフルパスを取得します。
[filename [topnode]]
または
[knob [topnode].file]
ちなみに「knob」ではなく「value」と書いてもファイルパスを取得できますが、以下のように連番部分(%04d)に実際のフレーム番号が出てきてフレームごとに更新される、という違いがあります。
[value [topnode].file]
※「knob」は、そのノブに入力されている文字列を素直に返します。つまり、もしそこにエクスプレッション(計算式)が書いてあれば、その文字列そのままが取得されます。一方「value」は、エクスプレッションがあればその計算結果、実際の値を返します。ケースバイケースで使い分けると良いと思います。
ファイルが入っている親フォルダまでの部分のファイルパスを取得します。
[file dirname [knob [topnode].file]]
ファイル名の部分のみを取得します。拡張子を含みます。
[basename [knob [topnode].file]]
または
[file tail [knob [topnode].file]]
(※前述のように knob ではなく value で書けば、「%04d」の部分に連番のフレーム番号が出てきてフレームごとに更新されます。)
拡張子を除去したファイル名を取得します。
[basename [file rootname [knob [topnode].file]]]
Readノードのファイルのフルパスを分解する
Readノードの持つファイルのフルパスを「/」で分割して、1つ目のブロックを取得します。0から数えます。
[lindex [split [knob [topnode].file] "/"] 0]
2つ目のブロックを取得します。
[lindex [split [knob [topnode].file] "/"] 1]
「end」で最後のブロックを取得します。
[lindex [split [knob [topnode].file] "/"] end]
「end-1」で最後から2番目のブロックを取得します。
[lindex [split [knob [topnode].file] "/"] end-1]
Readノードのファイルの名前を分解する
先ほど拡張子を除去したファイル名を取得できましたが、さらに「.」で分割したときの1つ目を取得します。これで連番のフレーム番号の部分「.%04d」を除去できます。
[lindex [split [basename [file rootname [knob [topnode].file]]] "."] 0]
このようにして取得したファイル名を「_」で分割して、1つ目のブロックを取得します。
[lindex [split [lindex [split [basename [file rootname [knob [topnode].file]]] "."] 0] "_"] 0]
2つ目のブロックを取得します。
[lindex [split [lindex [split [basename [file rootname [knob [topnode].file]]] "."] 0] "_"] 1]
「end」で最後のブロックを取得します。
[lindex [split [lindex [split [basename [file rootname [knob [topnode].file]]] "."] 0] "_"] end]
「end-1」で最後から2番目のブロックを取得します。
[lindex [split [lindex [split [basename [file rootname [knob [topnode].file]]] "."] 0] "_"] end-1]
上述のように、こうして取得した要素を繋いだり組み合わせて利用することができます。
ノードへのいろいろなアクセス方法
今回は[topnode]で最上流のノードにアクセスしましたが、ノードへのアクセス方法は他にもあります。
ノード名を指定して取得することができます。「Read1」という名前のノードの[File]ノブの値を取得します。
[value Read1.file]
「input」と書くと、1つ上流のノードを意味します。1つ上流のノードの[File]ノブの値を取得します。
[value input.file]
「inputの、inputの、input」と書いて1つずつ上流のノードにさかのぼることができます。
[value input.input.input.file]
Mergeノードのように複数のインプットがあり、上流のノードが複数ある場合は、1つ目のインプットを単に「input」または「input0」と書き、2つ目のインプットは「input1」、3つ目のインプットは「input2」と書いて取得できます。
[value input1.file]
グループの中からは「parent」で親のグループノードを取得します。以下のように書けば、親のグループノードの、さらに1つ上流のノードの[File]ノブの値を取得します。
[value parent.input.file]
エクスプレッション使用例
TCLを使ったエクスプレッションで、ノードの値をコントロールできます。試してみましょう。
Blurノードを2つ作成します。2つ目のBlurノードの[size]ノブを右クリック > [Add expression...] からエクスプレッションを入力します。
以下のように書くことで、2つ目のBlurノードのブラー量は、1つ上流のBlurノードの2倍の量に自動的に設定されます。
[value input.size]*2
終わりに
参考になりそうなサイトのリンクを掲載しておきます。
gatimedia. Nuke Tutorial. TCL FUNCTIONS IN TEXT NODE
https://www.gatimedia.co.uk/tcl-functions
gatimedia. Nuke Tutorial. EXPRESSIONS & TCL Tips
https://www.gatimedia.co.uk/expressions
gatimedia. Nuke Tutorial. CONDITIONAL TCL EXPRESSIONS IN NUKE
https://www.gatimedia.co.uk/conditional-expressions
thoughtvfx. Nuke tcl tips
http://thoughtvfx.blogspot.com/2012/12/nuke-tcl-tips.html
Luca Mignardi. Nuke TCL Snippets
https://www.lucamignardi.com/nuke-tcl-snippets/
Ben McEwan's Compositing Blog. TCL Tips For Visualizing Data In Your Comp
https://benmcewan.com/blog/2018/05/30/tcl-tips-for-visualizing-data-in-your-comp/
yamagishi-2bit-BLog. [Nuke] Metadataを用いたFile入出力の検証
http://yamagishi-2bit.blogspot.com/2020/10/nuke-metadatafile.html
yamagishi-2bit-BLog. [Nuke Python] ExpressionやTCLによる最終的なファイル名の取得 [ nuke.filename() ]
http://yamagishi-2bit.blogspot.com/2020/01/nuke-python-expressiontcl-nukefilename.html
Nukepedia. TCL. write nodes filename from topmost read
http://www.nukepedia.com/tcl/write-nodes-filename-from-topmost-read
Nukepedia. Written Tutorials. Expressions 101
http://www.nukepedia.com/written-tutorials/expressions-101
- 関連記事
-
- 10分で分かるNUKE*4 (ブラー&デフォーカス編) (2024/05/26)
- 10分で分かるNUKE*3 (Rotoノード編) (2023/11/06)
- さまざまなグレイン・ワークフロー(Nuke) (2023/09/14)
- Nukeのノードのクローンは使ってはいけない!(という都市伝説?) (2023/05/11)
- NukeのTCL入門!さまざまな情報を取得して活用する方法 (2023/04/18)
- スクリーンクリーン: Nukeでグリーンバックを均一にするテクニック (2023/04/04)
- 10分で分かるNUKE*2 (2020/12/15)
- 10分で分かるNUKE (2020/12/01)
- NukeにおけるOCIOを使ったACESシーンリニアワークフロー (2019/05/08)
- NUKEのスピードを速くするためのTips集 (2016/12/19)
- Nuke Pythonを使ってノードの設定を一括変更する (2016/12/03)
- NUKEのエクスプレッション(Expression)の便利な使い方 (2016/10/18)
- NUKE初心者におすすめのショートカット (2016/10/11)
- NUKE入門! 画像サイズをマスターする10項目のルール (2016/07/15)
- NUKEのノードツリーを整理してワンランク上の合成作業を目指す (2015/11/17)