Houdini Pythonを覚えて作業効率を上げたい(備忘録1)
よく使うノードの組み合わせは自動化したい
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は学習を始めたばかりのため、この記事は備忘録としてまとめました。少しでもお役に立てれば幸いです。
参考
Discussion