株式会社デジタル・フロンティア-Digital Frontier

Header

Main

NukeのPluginを作ってみる

2015/2/10

Tag: ,,

皆さん、お久しぶりです開発部の山口です。

そろそろNukeのPluginでも作ってみたいなとか思い始めたので
今回はそれをネタに書き進めたいと思います。

Welcome to the NDK Developer Guide Nuke8.0

まず始めに

プラグイン開発といえばNukeのSDKが必用ですが、すでにNuke Development Kitということで
NDKという名前でインストールされていますので、それを使用します。
※今回の説明で使用するNukeのバージョンは”8.0v5″です。

NDKは以下の場所にありますので探してみてください。

・”Nukeインストールディレクトリ”\Nuke8.0v5\Documentation\NDK
※例: C:\Program Files\Nuke8.0v5\Documentation\NDK

この中のファイルを直接修正してもいいのですが、元のファイルはそのまま
残しておきたいので、NDKフォルダごと自分の開発したい場所にコピーします。

準備ができましたらNDKフォルダにあるvc10フォルダ内の
ソリューションファイルをVisual Studioで開きます。

・NDK\vc10\ExamplePlugin.sln

Visual Studioのバージョンは同フォルダのReadme.txtを読むと2010を使用すると
書いてありますのでVisualStudio 2010を使用します。
フォルダ名がvc10となっているので、そこからも分かりますね。

ソリューションファイルを開くと、下記のような構成になっているかと思います。

ビルドの設定

次にビルドの設定を行います。フォルダを移動させた場合はincludeパス,
libパスの2つを通しなおす必用があります。
※移動させなかった場合は、全て相対パスで記述されているので設定する必要は無いです。

■インクルードパス

■ライブラリパス

その他注意事項として、ビルドで作成されたDLLを自動的に“.nuke”フォルダに
コピーするコマンドが仕込まれています。

このコマンドが設定されていると、ビルドしてすぐにデバックできるので便利ですが
リリース時に邪魔になる場合もあるので気をつけてください。

ビルドして、実行してみる

パスの設定が終了しましたら、Releaseでビルドしてみます。
※Debugではなぜかクラッシュするのでここでは使用しません。

無事終了すれば、ビルド後にコピーのコマンドが実行され、“.nuke”フォルダにExamplePlugin.dllという
ファイルが作成されていると思います。

“.nuke”にはすでにPluginPathが通っているので、この場所に配置されたPythonやDLL,アイコンは自動的に
Nukeで認識するようになります。

試しに以下のどれかの操作を行ってみてください。
※PLEでは動作しません

■ 下記のコマンドをNode Graphにペーストする
※文字列と{}の間のスペースがないとエラーになります。{}は無くても良いです。

ExamplePlugin {}

■ 下記のコマンドをScriptEditorで実行する

nuke.createNode('ExamplePlugin')

■ Windowで実行する

NodeGraphの場所でショートカットの”x”を押します。
するとTCL/Pythonを実行するウインドウが出てきます。

そこに上で紹介したコマンドを入力し、実行します。
※下記はTCLで実行した場合の例です。

実行結果

以上が成功すると下図のようにノードが作成されると思います。

“.nuke”について

NukeではユーザーのPriferenceなどの設定情報を格納しておく
.nukeフォルダというものがあります。

1度でもNukeを起動していれば、環境変数”USERPROFILE”(もしくは%HOME%)で設定されている場所に
作成されていると思います。エクスプローラーに下記のとおり文字列を入力してみてください
※隠しフォルダになってる場合がありますので、直接パスを指定しないといけないかもしれません。

プラグインのパッケージ化

実際にプラグインをリリースする場合には、このまま”.nuke”フォルダに配置するのも
ファイル類が煩雑になりすぎるので、ひとつのフォルダにまとめリリースしたいです。

まずDLLファイルを置く場所を決めます。試しにCドライブの直下にNukePluginsという
フォルダを作成します。

そこにビルドしたDLLを配置します。

次にこのフォルダを.nukeフォルダと同じように、プラグインを認識するフォルダになるように
Nukeに登録します。

登録方法は2つ有ります。

1. 環境変数でパスを登録

NukeにはNUKE_PATHという環境変数が有りますので、そこに追加していきます。
起動バッチに以下の要領で追加していきます。

SET NUKE_PATH=C:\NukePlugins

2.initファイルに登録

“.nuke”フォルダにinit.pyファイルを作成すると、Nuke起動時にそのファイルが
実行されるようになります。これはGUIが作成する前に実行されるファイルです。

ここにpythonでプラグインパスを通します。

# -*- coding: utf-8 -*-
import nuke
nuke.pluginAddPath('C:/NukePlugins')

これでC:\NukePluginsフォルダが認識されるようになりました。

次にコマンドでノードを作成するのも面倒なのでメニュー登録を行います。

C:\NukePluginsフォルダ内にmenu.pyというファイルを作成し、ここに
メニューへ登録するコマンドを記述していきます。

# -*- coding: utf-8 -*-
import nuke
toolbar = nuke.menu('Nodes')
toolbar.addCommand('CustomTools/ExamplePlugin', 'nuke.createNode("ExamplePlugin")')

これでメニューに登録されました。

サンプルプラグインのビルド

これだけでは何もできないので、exampleフォルダに入っている物を何か
ビルドしてみます。

・Nuke8.0v5\Documentation\NDK\examples

例としてGradeノードをビルドしてみます。

まず以下の手順を行います。

1. プロジェクトの名前をExamplePlugin -> Gradeに変更
2. プロジェクトの中にGrade.cppを登録
3. ExamplePlugin.cppを削除

これを全て行うと下図のようになります。

※ExamplePlugin.cppを残しても良いのですが、今回は除きます。

このままビルドし、実行してみると、無事Grade.dllが作成されていると思います。

ただこのままだと既存のGradeとかぶってしまうので成功しているかどうか分かりません。
試しにhelpのコマンドを変更してビルドしてみます。

// Grade.C
// Copyright (c) 2009 The Foundry Visionmongers Ltd.  All Rights Reserved.

const char* const HELP =
  "<p>Applies a linear ramp followed by a gamma function to each color channel.</p>"
  "<p>  A = multiply * (gain-lift)/(whitepoint-blackpoint)<br>"
  "  B = offset + lift - A*blackpoint<br>"
  "  output = pow(A*input + B, 1/gamma)</p>"
  "The <i>reverse</i> option is also provided so that you can copy-paste this node to "
  "invert the grade. This will do the opposite gamma correction followed by the "
  "opposite linear ramp.";

// Grade.C
// Copyright (c) 2009 The Foundry Visionmongers Ltd. All Rights Reserved.

const char* const HELP ="hogehoge";

変更してビルドし、ノードのヘルプを確認してみます。

■通常のグレードノード

■Helpを変更したノード

ヘルプのメッセージが変更されていれば成功です。

ノードの名前の変更

このままGradeノードのプログラムを修正しビルドしても、ノードの名前を変更しないと
既存のものとかぶってしまい、どちらかが使用できなくなるのでノードの名前を変更したいと思います。

※ノードの名前が同じ場合、PluginPathで先に見つかったものが実行されます。
PluginPathは下記のコマンドで確認してください。

import nuke
print nuke.pluginPath()

NukeにはDLLの名前と”CLASS”変数に登録した名前が一致している場合に
Nuke内でノードとして自動で認識されるという仕様があります。
※他にもやり方はありますが、ややこしいので今回は省きます。

まず変数を修正します。Grade.cppの下記の変数の名前を変更します。

static const char* const CLASS = "Grade";

static const char* const CLASS = "CustomGrade";

次にDLLの名前を変更します。プロジェクの設定でプロジェクト名が
DLLの名前になるように設定されているので、プロジェクト名を修正します。

以上で完了です。
これでビルドすれば、CustomGradeという名前のノードが作成できると思います。


最後に

今回はビルドして配置、簡単なNukeの仕組み等をお話しました。
次回は何か作成してみたいと思います。

※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

CAPTCHA


 

*