【逆引き】Python で操作する Bifrost ③ ~ポートとワイヤー編~

Tech

Maya の Bifrost Graph は、Python スクリプトで一通りの基本操作を行うことができます。

本シリーズでは、 Script Editor の Python タブで実行できるサンプルを使い、Bifrost Graph の基本操作をまとめます。

第一回: 作成編

第二回: コンパウンド編

第三回: 本記事

第3回では、値設定や接続など、ポートやワイヤー関連の操作について扱います。

「コンパウンド」、「ポート」、「型」のような Bifrost における基本的な用語、および「引数」、「タプル」のような Python における基本的な用語を説明なしで用いることがあるので、分からない場合は入門サイトや公式ドキュメントなども合わせて参照してください。

動作確認環境

Maya 2027
Bifrost 3.1.0.8

※ 一部のスクリーンショットは旧バージョンのものを使用しています。

コンパウンドのポート一覧を取得

ports = cmds.vnnNode(
    '<Bifrost Graph シェイプ名>', '<コンパウンドのパス>', listPorts=True
)

例: 新規グラフに create_mesh_sphere コンパウンドを作成し、そのポートを確認する

import maya.cmds as cmds
bg_shape = cmds.createNode('bifrostGraphShape') 
create_mesh_sphere = cmds.vnnCompound(
    bg_shape, '/', addNode='BifrostGraph,Modeling::Primitive,create_mesh_sphere'
)[0]

ports = cmds.vnnNode(bg_shape, f'/{create_mesh_sphere}', listPorts=True)
print(ports)

vnnNode コマンド で listPorts フラグを使用することで、コンパウンドが持つポートの一覧を取得できます。

以下のように、コンパウンド名.ポート名のリストとして返ってきます。

# 結果:
['create_mesh_sphere.radius', 'create_mesh_sphere.axis_segments', 'create_mesh_sphere.height_segments', 'create_mesh_sphere.create_UVs', 'create_mesh_sphere.position', 'create_mesh_sphere.up_axis', 'create_mesh_sphere.base_to_pivot', 'create_mesh_sphere.sphere_mesh']

ポートの型と値を取得

# 型の取得
port_type = cmds.vnnNode(
    '<Bifrost Graph シェイプ名>', '<コンパウンドのパス>',
    queryPortDataType='<ポート名>'
)
# 値の取得
value = cmds.vnnNode(
    '<Bifrost Graph シェイプ名>', '<コンパウンドのパス>',
    queryPortDefaultValues='<ポート名>'
)

例: bifrostGraphShape1 のルート階層の create_mesh_sphere という名前の create_mesh_sphere コンパウンドの radius ポートの値を取得する

import maya.cmds as cmds

port_type = cmds.vnnNode(
    'bifrostGraphShape1', '/create_mesh_sphere', queryPortDataType='radius'
)
value = cmds.vnnNode(
    'bifrostGraphShape1', '/create_mesh_sphere', queryPortDefaultValues='radius'
)
print(port_type, value)

vnnNode コマンド の queryPortDataType, queryPortDefaultValues にポート名を渡すことで、それぞれそのポートの型、既定値を取得できます。

queryPortDefaultValues で取得できるのは既定値であることに注意してください。
Bifrost Graph Editor で手動設定した値は反映されますが、接続された値は反映されません。

また、出力ポートの場合、型の取得は可能ですが値の取得はできません。

ポートの型と値を設定

# 型の設定
cmds.vnnNode(
    '<Bifrost Graph シェイプ名>', '<コンパウンドのパス>',
    setPortDataType=('<ポート名>', '<型>')
)
# 値の設定
cmds.vnnNode(
    '<Bifrost Graph シェイプ名>', '<コンパウンドのパス>',
    setPortDefaultValues=('<ポート名>', '<値>')
)

例: bifrostGraphShape1 のルート階層の sequence_array という名前の sequence_array コンパウンドで、0から9の整数の配列を作成する

import maya.cmds as cmds

# 型の設定
cmds.vnnNode('bifrostGraphShape1', '/sequence_array', setPortDataType=('step', 'int'))
# 値の設定
cmds.vnnNode('bifrostGraphShape1', '/sequence_array', setPortDefaultValues=('size', '10'))
cmds.vnnNode('bifrostGraphShape1', '/sequence_array', setPortDefaultValues=('step', '1'))

vnnNode コマンド の setPortDataType, setPortDefaultValues にポート名を渡すことで、それぞれそのポートの型、既定値を設定できます。

基本的に型を変更できるのは、対応する入力ポートのみです。
出力ポートに関しては基本的に型や値の設定ができません。

ポートの接続

cmds.vnnConnect(
    '<Bifrost Graph シェイプ名>', 
    '<接続元コンパウンドのパス>.<ポート名>', 
    '<接続先コンパウンドのパス>.<ポート名>'
)

例: 新規 BifrostGraph に sequence_array と array_size を作成し、接続する

import maya.cmds as cmds
bg_shape = cmds.createNode('bifrostGraphShape') 

# コンパウンドの作成
sequence_array = cmds.vnnCompound(
    bg_shape, '/', addNode='BifrostGraph,Core::Array,sequence_array'
)[0]
array_size = cmds.vnnCompound(
    bg_shape, '/', addNode='BifrostGraph,Core::Array,array_size'
)[0]

# 接続
cmds.vnnConnect(bg_shape, f'/{sequence_array}.sequence', f'/{array_size}.array')

コンパウンドとコンパウンドを接続するには、vnnConnect コマンドを使用します。

vnnConnect コマンド

コンパウンドのポートを接続できます。

第一引数には Bifrost Graph のシェイプノードのノード名またはフルパスを渡します。

第二引数は、接続元のコンパウンドのパスとポート名を . でつないだ文字列を渡します。

第三引数は、接続先のコンパウンドのパスとポート名を . でつないだ文字列を渡します。

詳しくは、コマンドヘルプを参照してください。

これにより、この2つのポートが接続されます。

グラフの input ポート / output ポートを作成

# input にポートを作成 
cmds.vnnCompound(
    '<Bifrost Graph シェイプ名>', '<階層>', createInputPort=('<ポート名>', '<ポートの型>')
)

# output にポートを作成
cmds.vnnCompound(
    '<Bifrost Graph シェイプ名>', '<階層>', createOutputPort=('<ポート名>', '<ポートの型>')
)

例: BifrostGraphShape1 のルート階層にある mesh_to_volume コンパウンドを input, output につなぐ

import maya.cmds as cmds

# 入力ポート
in_port = 'input_mesh'  # 入力ポート名
cmds.vnnCompound('bifrostGraphShape1', '/', createInputPort=(in_port, 'Object'))
cmds.vnnConnect('bifrostGraphShape1', f'/input.{in_port}', '/mesh_to_volume.mesh')

# 出力ポート
out_port = 'output_volume'  # 出力ポート名
cmds.vnnCompound('bifrostGraphShape1', '/', createOutputPort=(out_port, 'Object'))
cmds.vnnConnect('bifrostGraphShape1', f'/mesh_to_volume.volume', f'/output.{out_port}')
Bifrost Graph Editorでmesh_to_volumeをグラフのinput_meshポートとoutput_volumeポートへ接続した状態

グラフの input や output にコンパウンドをつなぎたい場合、事前に input / output にポートを作成してから接続を行います。

vnnCompound コマンド の createInputPort / createOutputPort にポート名とポートの型をタプルにまとめて渡すことでポートを作成することができます。

ポートの型の確認

ポートの型は、ポートにマウスカーソルを合わせると分かります。

Bifrost Graph Editorでcreate_mesh_sphereのsphere_meshポートにObject型のツールチップを表示した状態
create_mesh_sphere の sphere_mesh ポートの型は Object

接続元/先を取得

connections = cmds.vnnNode(
    '<Bifrost Graph シェイプ名>', '<コンパウンドのパス>', 
    listConnectedNodes=True, 
    connectedTo='<ポート名>'
)

例: BifrostGraphShape1 のルート階層にある mesh_to_volume コンパウンドの volume ポートと接続されているコンパウンドの一覧を取得

import maya.cmds as cmds

connections = cmds.vnnNode(
    'bifrostGraphShape1', '/mesh_to_volume', 
    listConnectedNodes=True, connectedTo='volume'
)
print(connections)

vnnNode コマンド で listConnectedNodes フラグを使用することで、対象コンパウンドと接続しているコンパウンドとポートを取得できます。

結果は、コンパウンド名とポート名を.でつないだ形式の文字列のリストとして返ります。

connectedTo を省略することで、そのコンパウンドに接続されているすべてのコンパウンドを取得できます。
その場合の結果はコンパウンド名のみのリストとして返され、ポート名は含まれません。

input ポートや output ポートにつながっている場合は、親コンパウンドが返されます。
ルート階層で input ポートや output ポートにつながっている場合、Bifrost Graph シェイプ名が返されます。

Watchpoint の作成

cmds.vnnWatchPoint(
    '<Bifrost Graph シェイプ名>', '<コンパウンドのパス>', '<入力ポート名>', create=True
)

例: bifrostGraphShape1 のルート階層の sequence_array.sequence と array_size.array を接続し、Watchpoint を作成する

import maya.cmds as cmds

# 接続
cmds.vnnConnect('bifrostGraphShape1', '/sequence_array.sequence', '/array_size.array')

# ウォッチポイントの作成
cmds.vnnWatchPoint('bifrostGraphShape1', '/array_size', 'array', create=True)

vnnWatchPoint コマンドで create フラグを使用することで、ウォッチポイントを作成できます。

vnnWatchPoint コマンド

第一引数には Bifrost Graph のシェイプノードのノード名またはフルパスを渡します。

第二引数は、Watchpoint を作成したいワイヤーが接続されたコンパウンドのパスを渡します。

第三引数は、Watchpoint を作成したいワイヤーが接続されたポートの名前を渡します。

コンパウンドおよびポートは、ワイヤーの接続元ではなく、接続先の入力ポートを指定する必要があることに注意してください。

まとめ

今回は、ポートや接続に関する操作を Python で実行する方法をまとめました。

次回は、エディタを Python から操作する方法をまとめます。

コメント

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