このシリーズもひとまずこれで最終回。
前回までで、共通のinit.pyを作成し、共通のフォルダにインストールされたプラグインをロードする方法、またinit.pyとmenu.pyをリダイレクトしていくことで、フォルダ単位での初期化コマンドの管理というところまで書きました。
それらを踏まえて、今回は、フォルダ内にインストールされているgizmo(など)のメニューを自動作成する話です。
前回までで、共通のinit.pyを作成し、共通のフォルダにインストールされたプラグインをロードする方法、またinit.pyとmenu.pyをリダイレクトしていくことで、フォルダ単位での初期化コマンドの管理というところまで書きました。
それらを踏まえて、今回は、フォルダ内にインストールされているgizmo(など)のメニューを自動作成する話です。
nukepediaなどで便利なgizmoやblinkをダウンロードしても、そのたびにmenu.pyを書き換えるのは面倒な場合があります(よね?...私はあります)。特に単品のgizmoなどでは特に整理せずに同じフォルダに入れておきたいということもあったりします。
そこで今回はダウンロードしたgizmoファイルを所定のフォルダに入れておけば、自動でメニューに追加してくるmeny.pyの書き方です。
ここではgizmosフォルダ(NUKEのプラグインパスは前回までの方法で通っているという仮定です)を作成して、この中に存在しているgizmoをメニューに反映させます。
/Volumes/Share/nuke_pluginsに「gizmo」フォルダを作成し、その中に「tools」と「icons」というフォルダを作成し、init.pyファイルもここにおきます。toolsフォルダにはgizmo本体をいれます。同じフォルダに入れることも可能だったんですが、toolsフォルダ内のファイル数が多くなると起動が重くなりそうなので分けてます。
init.pyファイルは前回まで書いた要領で、
init.py
nuke.pluginAddPath('./icons')
nuke.pluginAddPath('./tools')
nuke.pluginAddPath('./tools')
として、toolsとiconsフォルダにパスを通します。
次にmenu.pyです。menu.pyの実行はNUKEの実行ファイルからのパスになってしまいますので、面倒ですがここでもOS毎のファイルパスを設定しなおします。
※うちの場合はパスを書き換える専用のPythonを間に噛ませてますが、説明が面倒なのでここではそのままmenu.pyに記述します。
menu.py
import nuke, os, glob, platform
# OSごとに今回自動メニューにしたいフォルダのルートパスを設定
# うちの設定ではDarwinとLinuxはパスが同じに設定されているので、Windowsとそれ以外という振り分けです。
if platform.system()=='Windows':
gizmosRootPath = 'W:/nuke_plugins/gizmos/'
else:
gizmosRootPath = '/Volumes/Share/nuke_plugins/gizmos/'
# toolsとiconsのフォルダ設定
toolsFolder = 'tools/'
iconsFolder = 'icons/'
gizmos = glob.glob(gizmosRootPath + toolsFolder + '*.gizmo')
t = nuke.menu("Nodes")
u = t.addMenu("Gizmos") #ここはメニューに表示される名称(任意)です。
# --ここから下はいじらなくて大丈夫
for giz in gizmos:
gizfile = os.path.basename(giz)
gizname, ext = os.path.splitext(gizfile)
if(os.path.exists(gizmosRootPath + iconsFolder + gizname +'.png' )):
t.addCommand("Gizmos/" + gizname, "nuke.createNode('" + gizname + "')", icon = gizname + ".png")
else:
t.addCommand("Gizmos/" + gizname, "nuke.createNode('" + gizname + "')" )
# OSごとに今回自動メニューにしたいフォルダのルートパスを設定
# うちの設定ではDarwinとLinuxはパスが同じに設定されているので、Windowsとそれ以外という振り分けです。
if platform.system()=='Windows':
gizmosRootPath = 'W:/nuke_plugins/gizmos/'
else:
gizmosRootPath = '/Volumes/Share/nuke_plugins/gizmos/'
# toolsとiconsのフォルダ設定
toolsFolder = 'tools/'
iconsFolder = 'icons/'
gizmos = glob.glob(gizmosRootPath + toolsFolder + '*.gizmo')
t = nuke.menu("Nodes")
u = t.addMenu("Gizmos") #ここはメニューに表示される名称(任意)です。
# --ここから下はいじらなくて大丈夫
for giz in gizmos:
gizfile = os.path.basename(giz)
gizname, ext = os.path.splitext(gizfile)
if(os.path.exists(gizmosRootPath + iconsFolder + gizname +'.png' )):
t.addCommand("Gizmos/" + gizname, "nuke.createNode('" + gizname + "')", icon = gizname + ".png")
else:
t.addCommand("Gizmos/" + gizname, "nuke.createNode('" + gizname + "')" )
このブログの表示だとちょっとわかりにくいのでGithub Gistにコード書いておきました。
ためしにtoolsフォルダに適当にgizmoファイルを入れ、その中の「iBlur」だけ、iconsフォルダにアイコンを保存してみた結果です。
こんな感じでフォルダ内のgizmoが読み込まれてます。インストール/アンインストールは所定のフォルダにファイルをコピーしたり削除したりするだけです。ただしあまり調子にのって増やすと起動が重くなるので注意してください。うちではカテゴリに分類できないものや、一時的に使いたいもの、試用したいものを20上限を目安に入れてます。
[関連記事]
NUKEのinit.pyについて
NUKEのinit.pyとmenu.pyをリダイレクト