NukeのTcl(Tool Command Language)でツールを作ってみよう
はじめまして、TDの安田です。
この度DFTalkが復活しましたが、学生時代に読んでいたDFTalkを、まさか自分が書く側になるとは思ってもいませんでした。
なんだか感慨深いです…。
さて、今回はNukeで文字列を制御できる、Tool Command Language(以下Tcl)についてお届けしようと思います。
繰り返し行われるような単純な作業などを、Tclを使うことによって効率化が図れるかもしれません。
はじめに
まず、NukeでTclを使うために、外部でのインストールなどの事前準備は必要ありません。
ノードのプロパティに文字を入力できるアトリビュートは、Tcl形式で記述ができます。
数値を入力する部分では、Expression内でTclを使うことも多いでしょう。
今回はTclの基本的な使用方法と、Tclを使用した簡単なツールを紹介したいと思います。
実行環境
Nuke14.1v4
knobの参照方法
Tclの入力方法の基本は[command]の形です。
例としてGrade1ノードのwhite knobの値を取得する場合、以下の記述になります。
※knobはNukeノードのパラメータを入力する箇所を表します。
[value Grade1.white]値を取得する為、コマンドvalueを使います。引数で値を取得するGrade1というノードのwhite knobを指定します。
実践として値取得のためのGradeノードと、Tclを入力して動作を確認するためのNoOpノードを作成し、NoOpノードのLabel knobに上記のTclを入れてみましょう。
ノードグラフのNoOpノードに数値が表示されましたでしょうか。

注意点
Tclで表示しているknobの値について、参照元のknobの値を直接変更しても、値は動的に変更はされません。 上記の場合では、Grade1が持つwhiteの値を変更しても、動的にNoOp1のLabel表示は変わりません。
シーンを保存して再度開く、再度入力し直すことなどで、Tclが再評価され値が変更されます。
Expressionを使用することで動的に変更することができます。(Expressionが使用できるknob限定で、Labelなどのテキスト入力knobなどではExpressionが使用できません)

ところで、Gradeノードのpropertiesを見ていても、whiteというknobがないように見えます。
じゃあ、whiteってなんの値…? white pointのことかな…?
いいえ、違います。
正解はgainのことです。
gainの値を入力する欄をマウスカーソルでホバーさせると、ツールチップが出てきます。
そこに表示される名前が、TclやPythonなどで使うknobの名前になります。
どのknobにも、表示上のラベルとスクリプトで使用する名前それぞれ設定されています。

今回は例としてgainの値を他ノードのNoOpに表示していますが、もちろんGradeノードのLabelに直接記入することもできます。
また他にも、Readノードには読み込んだファイルのバージョン部分や素材名部分のみを表示されるようにするなど、様々な活用方法があります。
Tclを使ってツールを作ってみよう
少し応用編で、簡単なツールの作成をしてみたいと思います。
今回はボタンを押すと現在のシーンパスの+1バージョンを別名保存する、といったコードを作成したいと思います。
(Nuke標準メニューでできる機能なことは内緒…)
※今回のツールでは、すでにfile_name_v000.nkのようにシーンが保存されている前提になります。新しく名前をつけて保存できるツールではないことをご了承ください。
ノードのknobでの使用方法と基本的な書き方は同じですが、Tclの実行ボタンでの使用方法は違いがあります。
ツールの作成の前に、今回のツールで使用する変数のルールについて少し触れておきたいと思います。
変数
#set 変数名 格納したい値
set grade_gain [value Grade1.white]
# 変数を使用する場合は、$変数名と記述しましょう
$grade_gainツール作成
まず、実行するための環境が必要なので、NoOpノード(他ノードでも問題なし)を作成します。
そこにTclを実行するボタンをつくりましょう。
作成手順:
NoOpのPropertiesを右クリックしてManage User Knobs…を選択
表示されたダイアログから、Add > TCL Script Buttonを選択
更に表示されたダイアログから、knobの設定を行う(設定内容については以下に続きます)
今回設定する項目は、Name(スクリプトで使用する名前)、Label(UIでの表示名)、Script(実行するTcl)になります。
LabelとNameは、先程gainのときに話した、表示上のラベルとスクリプトで使用する名前の違いです。今回はスクリプトで使用しないため、適当に入力して問題ありません。

Scriptには以下のTclを入力します。
# 現在シーンのパスを取得
# rootは、Project Settings(ノードグラフでSキー)を指します
set path [value root.name]
# ファイル名とディレクトリを分ける
# file dirname: ディレクトリを取得
set dir [file dirname $path]
# file tail: ファイル名を取得
set file [file tail $path]
# v001 形式のバージョン番号を正規表現で抽出
# 正規表現内の()の中を取得
# ├ base: バージョン以外のファイル名
# └ version: v000のようなバージョン表記の数字部分のみ取得
regexp {(.+)v([0-9]+)\.nk} $file -> base version
# バージョンを数値に変換して +1
# expr: 式(expression)を評価して数値結果を返す
# format "%03d" -> 三桁にゼロ埋めする
set new_version [format "%03d" [expr $version + 1]]
# 新しいファイル名を作成
set new_name "${base}v${new_version}.nk"
# ディレクトリと統合してバージョンアップした新しいパスを作成
set new_path [file join $dir $new_name]
# 保存する
script_save_as $new_path入力が終わったら、OK、Doneボタンでそれぞれダイアログを閉じ、作成されたボタンを押してみましょう。
同じディレクトリ内に、バージョンアップされたシーンが新規保存できていれば成功です。
まとめ
今回はTclを使用した簡単なバージョンアップセーブツールを作ってみました。
Tclの使い方や発想次第で、Nukeでの様々な作業の効率化が望めると思います。
今回紹介しきれなかった使用方法もまだまだありますので、ぜひ今回の記事がきっかけに、Tclについて興味をもっていただければ嬉しいです。
ここまでのご精読、ありがとうございます。
引用
Tclのコマンドについて詳細や、ほかコマンドについては以下のサイトをご参照ください。
Tclコマンドリファレンス
Nuke Tclコマンドリファレンス
※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。
テクニカルスタッフ募集
デジタル・フロンティアでは、テクニカルスタッフを随時募集しています。
まずは気軽に門戸を叩いてみて下さい。
一緒に日本のコンテンツ産業を盛り上げていきましょう!
