H16新機能 コンパイルブロック 5 – コンパイルブロックとPython


こんにちは、篠島です。この間はコンパイルブロックによって複数のノードを一つのノードのようにできると説明しました。Pythonでも同様に一つのPythonノードに複数の処理をまとめて書いて一つのノードの様に振る舞うことが出来ます。

 

SOPの動詞化

SOPノードを普通に追加すると、それぞれのノードは次の3つの事をします。

  1. メモリの割り当てと開放、インプットのキャッシュ、データを加工後アウトプットをキャッシュ。
  2. SOPの実際の処理
  3. パラメーターの評価(UIの部分)

この2番目のSOPの処理の部分だけを抜き出して動詞として使う(要はPyhonの中でメソッドとして呼び出せる)ことができるようになりました。

 

とりあえずPythonコードを見てみましょう。H16のヘルプから抜き出して、一番上の行だけ変更したものです。

 

コピペしたい人用にテキストでも載せておきます。
追記 : なぜかブログ上ではシングルクォーテーションが ‘ の記号に変わってしまいます・・・。エラーが出る人は記号の変化に気をつけてください。

node = hou.pwd()
geo = node.geometry()
resultgeo = hou.Geometry()

# Get a hou.SopVerb that knows how to subdivide.
sops = hou.sopNodeTypeCategory()
subverb = sops.nodeVerb(‘subdivide’)

# Pass in a dictionary mapping parameter names to values.
# Node defaults are already set, so just set non-default things.
subverb.setParms({‘iterations’:3})

# SopVerb.execute() takes a target hou.Geometry to write the results into,
# and a list of hou.Geometry to be the inputs of the verb (use None in the
# list to represent an unwired input).
subverb.execute(resultgeo, [geo])

# Now do an isooffset
isoverb = sops.nodeVerb(‘isooffset’)
isoverb.setParms({‘samplediv’:100, ‘output’:0})
isoverb.execute(resultgeo, [resultgeo])

node.geometry().clear()
node.geometry().merge(resultgeo)

 

 

Python内部で Subdivide と IsoOffset の処理を書いています。これはSOPを別々に作って繋げるのと全く同じです。Python SOPの中でそれぞれのSOPをメソッドから呼び出すことにより、Python SOPの中に処理がまとめられているのが分かるかと思います。

 

Pythonの詳しい説明は次回に・・・。