【逆引き】Python で操作する Bifrost ② ~コンパウンド編~

Tech

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 コマンドの第二引数は、ペーストしたい階層を渡します。

詳しくは、vnnCopy と 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 (折りたたまれた状態)

Bifrost Graph Editorでcreate_mesh_sphereコンパウンドをDisplayMode 0で表示した状態

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

Bifrost Graph Editorでcreate_mesh_sphereコンパウンドをDisplayMode 1で表示した状態

DisplayMode = 2 (展開した状態)

Bifrost Graph Editorでcreate_mesh_sphereコンパウンドを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回(近日公開予定)

コメント

タイトルとURLをコピーしました