Maya の Bifrost Graph は、Python スクリプトで一通りの基本操作を行うことができます。
本シリーズでは、 Script Editor の Python タブで実行できるサンプルを使い、Bifrost Graph の基本操作をまとめます。
前回は、Bifrost Graph やコンパウンドをPython で作成する方法を紹介しました。
第二回は、コンパウンドの情報を取得・編集する方法について扱います。
「コンパウンド」、「ポート」、「型」のような Bifrost における基本的な用語、および「引数」、「タプル」のような Python における基本的な用語を説明なしで用いることがあるので、分からない場合は入門サイトなどで調べてください。
動作確認環境
Maya 2027
Bifrost 3.1.0.8
コンパウンドのノードタイプを取得
node_type = cmds.vnnNode(
'<Bifrost Graph シェイプ名>', '<コンパウンドのパス>', queryTypeName=True
)
例: bifrostGraphShape1 のルート階層にある add コンパウンドのノードタイプを取得する
import maya.cmds as cmds
node_type = cmds.vnnNode('bifrostGraphShape1', '/add', queryTypeName=True)
print(node_type)
コンパウンドのノードタイプを取得するには、 vnnNode コマンドで queryTypeName フラグを使用します。
vnnNode コマンド
ノードの情報の取得や設定ができます。
第一引数には 対象となる Bifrost Graph のシェイプノードのノード名またはフルパスを渡します。
第二引数は、対象となるノード(コンパウンド)のパスを指定します。
たとえばルート階層にある compound1 のパスは ‘/compound1’ となります。
詳しくは、コマンドヘルプを参照してください。
結果は BifrostGraph,Core::Math,add のような文字列で得られます。
これは、Python によるコンパウンドの作成 時に引数 addNode に渡す文字列としてそのまま使用することができます。
コンパウンドの削除
cmds.vnnCompound('<Bifrost Graph シェイプ名>', '<階層>', removeNode='<コンパウンド名>')
例: bifrostGraphShape1 のルート階層にあるコンパウンド add1 を削除する
import maya.cmds as cmds
cmds.vnnCompound('bifrostGraphShape1', '/', removeNode='add1')
vnnCompound コマンド で removeNode に削除したいコンパウンドの名前を渡すことで削除ができます。
Backdrop や Sticky Note の削除
削除したいのが Backdrop や Sticky Note の場合は、removeNode の代わりに removeAnnotation にノード名を渡します。
例: bifrostGraphShape1 のルート階層にある sticky_note という名前の Sticky Note を削除
import maya.cmds as cmds
cmds.vnnCompound('bifrostGraphShape1', '/', removeAnnotation='sticky_note')
コンパウンドの位置を取得
position_str = cmds.vnnNode(
'<Bifrost Graph シェイプ名>',
'<コンパウンドのパス>',
queryMetaData='LayoutPos',
)[0]
position = list(map(float, position_str.split()))
例: bifrostGraphShape1 のルート階層にある add コンパウンドの座標を取得する
import maya.cmds as cmds
position_str = cmds.vnnNode('bifrostGraphShape1', '/add', queryMetaData='LayoutPos')[0]
position = list(map(float, position_str.split()))
コンパウンドの座標は vnnNode コマンド により、コンパウンドのメタデータ LayoutPos を読み取ることで取得できます。
読み取った座標はスペース区切りの文字列のリスト(例: ['200 -60'])なので、上のサンプルコードでは、変数 position_str に代入する前に1つ目の要素だけ取り出し、その後変数 position に代入する前に float のリストに変換しています。
コンパウンドの位置を移動
cmds.vnnNode(
'<Bifrost Graph シェイプ名>',
'<コンパウンドのパス>',
setMetaData=('LayoutPos', '<X座標> <Y座標>')
)
例: bifrostGraphShape1 のルート階層にある add コンパウンドを X 座標 0, Y 座標 200 の位置に移動する
import maya.cmds as cmds
cmds.vnnNode('bifrostGraphShape1', '/add', setMetaData=('LayoutPos', '0 200'))
コンパウンドの位置を移動するには vnnNode コマンド を使用します。
setMetaData には、’LayoutPos’ という文字列と、スペースを空けた文字列であらわされた座標をまとめたタプルを渡します。
座標は、グラフ原点を基準として右下に向かって大きくなっていくので、例えば、原点から右に 100.0、下に 300.0 の位置にコンパウンドを移動したい場合の setMetaData は、('LayoutPos', '100.0 300.0') となります。
現在の位置から相対的に移動したい場合は、先にコンパウンドの座標を取得して移動ベクトルを足します。
コンパウンドを別の階層に移動
※コピー&ペースト後に移動元を削除する処理
cmds.vnnCopy('<Bifrost Graph シェイプ名>', '<移動元階層>', sourceNode='<コンパウンド名>')
cmds.vnnPaste('<Bifrost Graph シェイプ名>', '<移動先階層>')
cmds.vnnCompound('<Bifrost Graph シェイプ名>', '<移動元階層>', removeNode='<コンパウンド名>')
例: bifrostGraphShape1 のルート階層にある add コンパウンドを、ルート階層にある compound1 の中に移動する
import maya.cmds as cmds
bg_shape = 'bifrostGraphShape1'
cmds.vnnCopy(bg_shape, '/', sourceNode='add')
cmds.vnnPaste(bg_shape, '/compound1/')
cmds.vnnCompound(bg_shape, '/', removeNode='add')
vnnCopy コマンドと vnnPaste コマンドを使うことで、コンパウンドを別の階層にコピーすることができます。
vnnCopy コマンドと vnnPaste コマンド
ノードのコピー & ペーストができます。
いずれも第一引数には 対象となる Bifrost Graph のシェイプノードのノード名またはフルパスを渡します。
vnnCopy コマンドの第二引数は、コピー元のコンパウンドがある階層を指定します。
たとえばルート階層にある compound1 の中にある compound2 をコピーしたい場合、パスは ‘/compound1/’ となります。
vnnCopy コマンドの sourceNode には、コピーしたいノードの名前を渡します。
複数渡したい場合はリスト形式(例:[‘compound1’, ‘compound2’, ‘compound3’])で渡すことも可能です。
vnnPaste コマンドの第二引数は、ペーストしたい階層を渡します。
移動先の階層にコピー&ペーストした後に、元のノードを削除します。
削除については コンパウンドの削除 を参照してください。
コンパウンドを新規コンパウンドにまとめる
cmds.vnnCompound(
'<Bifrost Graph シェイプ名>',
'<階層>',
create='<作成コンパウンド名>',
moveNodeIn=['<子コンパウンド名>']
)
例: bifrostGraphShape1 のルート階層にあるコンパウンド compound1, compound2, compound3 を新規コンパウンド my_compound にまとめる
import maya.cmds as cmds
cmds.vnnCompound(
'bifrostGraphShape1', '/',
create='my_compound', moveNodeIn=['compound1', 'compound2', 'compound3']
)
空のコンパウンドの作成 に moveNodeIn を加えることで、任意のコンパウンドを子にすることができます。
コンパウンドのリネーム
cmds.vnnCompound(
'<Bifrost Graph シェイプ名>', '<階層>', renameNode=('<元の名前>', '<新しい名前>')
)
例: bifrostGraphShape1 のルート階層にある compound1 という名前のコンパウンドを my_comp にリネーム
import maya.cmds as cmds
cmds.vnnCompound('bifrostGraphShape1', '/', renameNode=('compound1', 'my_comp'))
vnnCompound コマンド で renameNode を使用することでコンパウンドのリネームができます。
コンパウンドの表示切替
cmds.vnnNode(
'<Bifrost Graph シェイプ名>',
'<コンパウンドのパス>',
setMetaData=('DisplayMode', '<0 または 1 または 2>'))
例: bifrostGraphShape1 のルート階層にあるコンパウンド create_mesh_sphere を折りたたむ
import maya.cmds as cmds
cmds.vnnNode(
'bifrostGraphShape1', '/create_mesh_sphere', setMetaData=('DisplayMode', '0')
)
vnnNode コマンド により、コンパウンドのメタデータ DisplayMode を書き換えることで設定できます。
DisplayMode = 0 (折りたたまれた状態)

DisplayMode = 1 (折りたたまれた状態でポートも非表示)

DisplayMode = 2 (展開した状態)

階層内のノード取得
nodes = cmds.vnnCompound('<Bifrost Graph シェイプ名>', '<階層>', listNodes=True)
例: bifrostGraphShape1 のルート階層のノードを一覧する
import maya.cmds as cmds
nodes = cmds.vnnCompound('bifrostGraphShape1', '/', listNodes=True)
print(nodes)
vnnCompound コマンド で listNodes フラグを使用することで、指定階層にあるすべてのノードをリストとして取得できます。
Sticky Note や Backdrop は含まれません。
まとめ
今回は、Bifrost Graph 内のコンパウンドについて、ノードタイプや位置の取得、削除、移動、リネーム、表示切替、一覧取得などの方法をまとめました。
次回は、接続やポート関連のコマンドについてまとめます。
前回:第1回 ポートとワイヤー編
次回:第3回(近日公開予定)


コメント