Q100372: Pythonで入力ポートと出力ポートの名前を変更して接続を明確にする方法

まとめ

複数の入力を持つノード(Mergeノード、Switchノード、Global State Variablesノードなど)を設定する際、接続目的を明確にするために各接続ポートの名前を手動で変更するのは非常に面倒です。このプロセスを自動化するには、名前変更を処理するカスタムシェルフアイテムまたはPythonスーパーツールを作成できます。この記事では、その方法を説明します。

詳細情報

選択された各ノードの入力ポートをループし、それらの名前を特定の値に変更するサンプル スクリプトが以下に記載されており、説明されています。

これは、たとえば Merge ノードまたは VariableSwitch ノードを使用してKatana内でテストできます。

サンプルスクリプト

# Grab all currently selected nodes
selectedNodes = NodegraphAPI.GetAllSelectedNodes()

# Loop through each selected node for node in selectedNodes:
# Get all the import ports within the node     inputPorts = node.getInputPorts()
# Loop through each port within the node     for inputs in inputPorts:         index = inputs.getIndex()         name = node.getInputPortByIndex(index).getName()
# Name each port 'Shot' plus their indexed location         node.renameInputPort(name,('Shot'+repr(index+1)))

スクリプトの使用

Katana内では、Merge ノードまたは VariableSwitch ノードを作成し、それに複数の入力ポートを追加するだけでスクリプトをテストできます (入力ポートを追加するには、ノード上の大きな矢印をクリックします)。



ノードを選択した状態で上記のスクリプトを Python タブに貼り付け/実行すると、デフォルトの入力ポートの名前が次のように変更されます。

添付の「renameInputPorts.py」ファイルをダウンロードし、ユーザーのホーム領域「 .katana/Shelves/ 」ディレクトリの Shelf フォルダ名の下に配置することで、上記のスクリプトをカスタム Shelf アイテムとしてテストすることもできます。

例えば:

Windows: C:\Users\username\.katana\Shelves\RenameShelf\renameInputPorts.py
Linux: /home/username/.katana/Shelves/RenameShelf/renameInputPorts.py

この設定は、カスタムシェルフまたはスーパーツールのベースとなります。ここから、各ポートの名前を変更できるポップアップウィジェットを追加したり、スーパーツールノード自体にコードを組み込んだりすることも可能です。

接続の設定、シェルフ アイテムとスーパー ツールの作成の詳細については、以下のリンクを使用してKatanaユーザー ガイドとKatana開発者ガイドを確認してください。

Python のノード接続: Katana開発者ガイド - ノードの操作 - ノードの接続
シェルフ スクリプト: Katanaユーザー ガイド - Katanaでのスクリプトとプログラミング - シェルフ アイテム スクリプト
SuperTools: Katanaユーザーガイド - グループ、マクロ、および Super Tools - SuperTools


スクリプトの説明

selectedNodes = NodegraphAPI.GetAllSelectedNodes()

NodegraphAPI を使用すると、まずスクリプトロジックを適用する対象ノードを検索します。これは2つの方法で実行できます。ノード名を指定するか、現在選択されているノードをクエリする方法です。上記の行は、現在選択されているノードオブジェクトのリストを検索し、 selectedNodesに保存します。

for node in selectedNodes:
inputPorts = node.getInputPorts()

ノード オブジェクトのリストを取得したら、for ループを使用して各オブジェクトを反復処理し、ノードのすべての入力ポートを取得するgetInputPorts()関数を呼び出すことができます。

for inputs in inputPorts:         
index = inputs.getIndex()

各ノードのポートが取得できたので、ポート名またはインデックス番号で各ポートをループするように設定できます。上記の行は、 getIndex()関数を使用してポートのインデックス番号を取得しています。

name = node.getInputPortByIndex(index).getName()
node.renameInputPort(name,('Shot'+repr(index+1))) 

上記の行は、ノードポートの現在の名前を取得し、「Shot」にそのポートのインデックスを付加した名前に変更します。最終的な名前は、ノードのポート数に応じて、Shot1、Shot2、Shot3 のようになります。

添付ファイル

私たちはそれを聞いて申し訳ございません

理由をお聞かせください