Zenn
🐐

Houdini PythonでSubnetの出力コネクタにNullノードを接続(備忘録5)

2025/03/05に公開

Subnetの出力コネクタにNullノードを接続する

今回のスクリプトでは、選択したSubnetの出力コネクタにNullノードを接続します。Nullノードを接続することで、Nullノードの名前から、出力データの視認性や参照しやすさを向上させることができます。


各出力コネクタにNullノードを接続する

今回のスクリプト

  • ノード名から特定のPrefixを削除
  • Subnetの出力コネクタにNullを接続

環境

Windows10 Pro
Houdini Indie 20.5.332 py3.11

ノード名から特定のPrefixを削除

import hou

def remove_prefix(node_name, prefix = "OUT_"):
    
    if node_name.startswith(prefix):
        new_name = node_name[len(prefix):] 
    else:
        new_name = node_name
    return new_name

selected_nodes = hou.selectedNodes()

if selected_nodes:
    for node in selected_nodes:
        node_name = node.name()
        node_name = remove_prefix(node_name)
        print (node_name)
        
        node.setName(node_name)
        
else:
    print ("Please select nodes!")

このスクリプトは、選択されたノードの名前から、Prefixを削除します。デフォルトでは、"OUT_"になっています。

元のノード

ノード名からPrefixが削除されました

6行目のlen(prefix)でPrefixの文字数を取得し、node_name[len(prefix):]によって5文字目以降の文字列をnew_nameに代入しています。"IN_"など他のPrefixを削除するには、関数を呼び出すときに引数として他の文字列を指定することが可能です。以下は"IN_"を削除する場合。

node_name = remove_prefix(node_name, "IN_")

Subnetの出力コネクタにNullを接続

import hou

def get_child_name_by_type(node, type_name = "output"):

    node_names = []
    for child in node.children():
        if child.type().name() == type_name:
            node_names.append(child.name())
            
    return node_names

def remove_prefix(node_name, prefix = "OUT_"):
    
    if node_name.startswith(prefix):
        new_name = node_name[len(prefix):] 
    else:
        new_name = node_name
    return new_name

    
    
selected_nodes = hou.selectedNodes()

if selected_nodes:
    for node in selected_nodes:
        child_names = get_child_name_by_type(node)
        node_offset = hou.Vector2(0.0,-1.5)
        node_pos = node.position() + node_offset
        
        for i in range(len(child_names)):
            print (child_names[i])
            
            child_name = child_names[i]
            child_name = remove_prefix(child_name)
            null_name = node.name() + "_" + child_name
            null_node = node.parent().createNode("null", null_name)
            
            null_node.setInput(0, node, output_index=i)

            null_offset = hou.Vector2(1.5*float(i),-0.5*float(i))
            null_pos = node_pos + null_offset
            null_node.setPosition(null_pos)

else:
    print ("Please select a subnetwork!")

このスクリプトは、選択されたSubnet内のOutputノード名を取得し、それぞれの出力コネクタに対してNullノードを自動的に作成し接続します。Nullノードの名前によって、Subnet出力データの視認性が向上します。Nullノードの名前は、Outputノードの名前を基に生成され、Prefixを削除し、Subnetの名前がPrefixとして付与されます。


出力コネクタが3つある


出力コネクタそれぞれにNullノードを接続

ノード名からPrefixを削除する関数については、記事上段のスクリプトからremove_prefix()を流用しています。また、get_child_name_by_type()についても以前の記事から流用しています。

まとめ

お読みいただきありがとうございました。今回のスクリプトでは、一部を関数化したことで、前回の記事の関数を流用できました。これまでは関数化の重要性を理解できていませんでしたが、複数のスクリプトを作成するうちに、その効果を実感できるようになりました。

この記事が少しでもお役に立てれば幸いです。

参考

https://note.nkmk.me/python-str-compare/

Discussion

ログインするとコメントできます