🐐

Houdini Pythonを覚えて作業効率を上げたい(備忘録1)

2025/02/05に公開

よく使うノードの組み合わせは自動化したい

HoudiniでRBD(Rigid Body Dynamics)の仕込みを行う際、パーツ数が増えると繰り返し作業が多くなり、時間を浪費しているような気がしました。そこで、Pythonを使ってNetwork Editorの作業を一部自動化することにしました。備忘録として、作成したPythonスクリプトの例をZennにまとめます。

環境

Windows10 Pro
Houdini Indie 20.5.332 py3

選択ノードを新しいsubnetworkに移動

import hou

# Get the selected node
selected_nodes = hou.selectedNodes()

if selected_nodes:
    # Create a subnetwork node
    parent = selected_nodes[0].parent()
    subnet = parent.createNode("subnet", "my_subnet")
    
    # Adjust the position
    subnet.moveToGoodPosition()
    
    # Move selected nodes to the subnetwork
    moved_nodes = hou.moveNodesTo(selected_nodes, subnet)
    
    # Adjust the position
    for node in moved_nodes:
        node.moveToGoodPosition()
        print(node)
    
    # Select the subnetwork node
    subnet.setSelected(True)
else:
    print ("Please select nodes.")

Geometry SOP内で、複数のノードを選択した状態で実行すると、選択したノードが新規subnetwork内に移動します。subnetworkを作成するボタンはすでにUI上にあるので、このままではあまり役立つものではないです。ここから色々スクリプトを加えて、用途に合わせて便利にしていきたい。


複数ノードを選択してからスクリプトを実行します


作成されたsubnetwork内に選択されたノードが配置されています


デフォルトで用意されているNetwork Editorの右上のボタンでsubnetを作成した場合

選択ノードを新しいsubnetwork内のobject mergeノードで読み込み


import hou

# Get the selected node
selected_nodes = hou.selectedNodes()

# Create a Subnetwork Node
parent = selected_nodes[0].parent()
subnet = parent.createNode("subnet", "my_subnet")

# Adjust the position
subnet.moveToGoodPosition()

# Create a merge node in the subnetwork
merge_node = subnet.createNode("merge", "my_merge")
color = hou.Color((0.302,0.525,0.114))

# Create an object merge node and connect it to the merge node
for i,node in enumerate(selected_nodes):
    new_name = "IN_" + node.name()
    object_merge = subnet.createNode("object_merge", "my_object_merge")
    object_merge.moveToGoodPosition()
    object_merge.setName(new_name)
    object_merge.setColor(color)
    object_merge.parm("objpath1").set(node.path())
    merge_node.setInput(i,object_merge)
    node.setSelected(False)

# Adjust the position
merge_node.moveToGoodPosition()
    
# Select the subnetwork node
subnet.setSelected(True)

Geometry SOP内で、複数のノードを選択した状態で実行すると、新しいsubnetworkが作成されます。subnet内にobject mergeノードが作成され、選択したノードがリンクされています。最後にobject mergeノードをまとめてmergeノードに接続します。

複数ノードを選択してからスクリプトを実行します


新しいsubnetworkが作成されます


subnetwork内には、object mergeノードとそれらをまとめるmergeノードが作成されます

選択したsubnetworkノードの2つ目のアウトプットを新しいmergeノードに接続


import hou

# Get the selected node
selected_nodes = hou.selectedNodes()

# Create a Merge Node
parent = selected_nodes[0].parent()
merge_node = parent.createNode("merge", "my_merge")

# Connect the second output of the selected node to a Merge node
for i, node in enumerate(selected_nodes):
    merge_node.setInput(i, node, output_index=1)
    node.setSelected(False)

# Adjust the position of the Merge node again
merge_node.moveToGoodPosition()

# Select the merge node
merge_node.setSelected(True)

Geometry SOP内で、複数のsubnetworkノードを選択した状態で実行すると、新しいmergeノードが作成されます。subnetworkの2つ目のアウトプットがmergeノードに接続されます。スクリプト中のoutput_index=1を0にすると1つ目のアウトプットと接続されます。


subnetworkを選択してからスクリプトを実行します


2つめのアウトプットとmergeノードが接続されます

まとめ

お読みいただきありがとうございました。Houdini Pythonは学習を始めたばかりのため、この記事は備忘録としてまとめました。少しでもお役に立てれば幸いです。

参考

https://qiita.com/70_cg_art/items/46dd9ca06bee4478c495
https://qiita.com/daxanya1/items/2c3e23cd3cd0eb69eb17
https://www.sidefx.com/ja/docs/houdini/hom/hou/Node.html

Discussion