テクニカル力に左右されないサクッとしたスクリプト共有のために、ShotGridの活用を考えてみる
ShotGridへ投稿すれば、自動的にMayaにメニューが追加される。みたいな仕組みができないかと思い考えてみました。
課題
テクニカルな人……とまではいかなくてもスクリプトをちょいちょい使ってて、共有はしてないけど共有してくれたら多数が嬉しい何某かを持っているというひとは、現場にちらほらいると思います。
そういうのを共有する際の障壁はいろいろあると思うんですが、
煎じ詰めれば要するに「めんどくさい」(「テクニカルな共有に時間を割くよりアートワークしてたい」「テクニカルの人の手を煩わせるのも」等々)ということになるんじゃないかなと。
なので、障壁を下げる一案として、「ShotGridに投稿してください」状態を考えてみます。
別の言い方をすれば、 ShotGridでsnippet共有 といったところです。
……ちなみに、この記事の仕組みをチーム内に展開するには、テクニカルな人員が多分必要です。そこのところは必要ですが、それ以降は多分テクニカル力には左右されないんじゃないかなと思います。
(この記事の内容はじめShotGridまわりがめんどくさい場合は、ご依頼いただければお手伝いできるかもしれません)
ShotGrid側の準備
まずはスクリプト共有用のエンティティを立て、フィールドを整備します。
エンティティを立てる
プロジェクト非依存なカスタムエンティティをひとつ有効にします。
名前は「シンプルスクリプト」としましたが、これは特にこの後の作業に影響しないのでなんでもOK
ちなみに「スクリプト」というエンティティ名だと、デフォルトで存在しているのとかぶるので避けます。(ShotGridのAPIを管理するためのエンティティ)
タスク、バージョン、パイプライン、詳細ページは使わないのでOFFです。
ページを作る
シンプルスクリプトを管理するためのページを新規作成します。
できたページは固有URLが用意されるので、準備完了後にはチーム内へ周知とかしましょう。
フィールド追加
追加するフィールドは以下の三つです。
- スクリプトを記入するための欄
- 実行するソフトの名前欄
- メニュー階層欄
共有するためのスクリプトを記入するための欄です。
「share_script_code」としました。これはあとからPythonで読む際に使います。
mayaとかnukeとかhoudiniとか、スクリプトを実行する環境を入力するための欄です。
「exe_env_menu」としました。これはあとからPythonで読む際に使います。
各ソフトから呼び出すことを想定しての欄ですが、
Mayaだけとか決め込んでいるなら不要です。
メニュー階層を入力するための欄です。
「sg_menu_hierarchy」としましたが、これは今回時間オーバーで断念しました。
APIユーザー追加
「sg_scripts_menu」なるスクリプトを登録しました。
このひとはさっき用意したシンプルスクリプトの情報を読めればいいので、
権限は API Admin ではなくリードオンリーな権限を用意してもよさそうです。
スクリプト
MayaとかNukeとかいろいろなツールから利用できる状態を志したいですが、とりいそぎMayaから利用する版です。
※このスクリプトは改変等して自由に利用していただいて構いません。使用時に生じたトラブル等については、本記事制作者は責任を負いません。
※入力されたスクリプトをそのまま実行しようとするため、記号などが含まれているとちゃんと動かない可能性もありますがそこまで検証していないのでご了承ください。
userSetup.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from maya import cmds
from sg_scripts_share_menu import core as sg_menu
cmds.evalDeferred( 'sg_menu.doIt()' )
本体
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import shotgun_api3
from pymel import core as pm
MENU_LABEL = u'sg share scripts'
class Main(object):
def __init__(self):
self.sg = self._get_sg()
def _get_sg(self):
import shotgun_api3
SERVER = 'https://abcd.shotgunstudio.com/'
SCRIPT = 'sg_scripts_menu'
KEY = '{script key}'
sg_obj = shotgun_api3.Shotgun(SERVER,SCRIPT,KEY)
return sg_obj
def add_menuItems(self):
data = self.sg.find('CustomNonProjectEntity01',
[['sg_exe_env_name','is','maya']],
['sg_share_script_code',
'description','sg_menu_hierarchy','code']
)
with self.sg_menu_root:
for menu_item in data:
pm.menuItem( label=menu_item['code'],
c=menu_item['sg_share_script_code'],
annotation=menu_item['description'].decode('utf-8'),
sourceType='mel' )
pm.menuItem( divider=True )
pm.menuItem( label='Reload',c='sg_menu.reload()',sourceType='python' )
def add_to_menubar(self):
with pm.ui.PyUI(self.mainwindow ):
sg_menu_root = pm.menu( u'sg_menu_root',
tearOff=True,
label=MENU_LABEL )
return sg_menu_root
def build(self):
self.mainwindow = pm.mel.globals['gMainWindow']
self.sg_menu_root = self.add_to_menubar()
self.add_menuItems()
sg_menu = Main()
def reload():
sg_menu.sg_menu_root.deleteAllItems()
sg_menu.add_menuItems()
def doIt():
sg_menu.build()
モジュール構造
「sg_scripts_share_menu」フォルダ
├── __init__.py
└── core.py
Mayaから見える位置に置きます。
ShotGridのPython APIもよきところに置きます。
使う
ShotGridへスクリプトを入力してみました
デフォルトの「code」フィールドを「スクリプト名」欄として、Mayaに読み込まれたときのメニューのラベルとします。
ステータス欄は有効・無効を指定して、メニュー読み込み時の判定に使えたらいいですね。将来的には。
Mayaを起動したら、「シンプルスクリプト」に登録したスクリプトがならんだメニューが追加されているのではないかと思います。
ShotGrid上で情報を更新したら、メニューの一番下の「Reload」で読み直します。
今後
- メニュー階層も登録できるようになるといいですね
- ステータスの有効・無効も反映されるといいですね
- Maya以外のソフトにも対応したいですね
備考
起動時にスクリプトを実行する userSetup についてはこちら
Shotgun Python APIのドキュメントはこちら
ShotGrid のTipsを技術同人誌としてまとめました。
製本版をBOOTHにて、電子版を技術書典オンラインマーケットにて頒布中です。
BOOTH :
技術書典 :明日
明日 12/8 は COYOTE 3DCG STUDIO・Technical Teamさんの担当回で 「HIKキャラクタライズの自動化について!MayaのキャラクタライズのID番号とジョイント」 です、お楽しみに!
更新履歴:
2020/12/07 初版投稿
2021/12/22 記事中の「Shotgun」を「ShotGrid」に書き換え
2022/10/22 BOOTH、技術書典へのリンクを追加
Discussion