HoudiniDay 19

ノードっていくつあるんですか?

More than 1 year has passed since last update.

Houdini アドベントカレンダー2016 19日目の記事です。

内容は掲題の通りですので……

この時点で「あー、ハイハイ」という方はそっ閉じしていただいたり、

他にもっといい方法知ってたらこっそり教えていただけたりすると嬉しいです。


NodeTypeという当て推量

houモジュールの中を見てみようかなーと思います。

dirで返ってくるリストのうち、「NodeType」が含まれていればそれっぽいような気がするので、

そのように調べてみます。

for i in dir(hou):

if 'NodeType' in i:
print( i )

すると

NodeType

結構返ってきました。

前半のとか、_swigregisterとかは違いそうです。

「NodeType」と「NodeTypeCategory」がいるのが興味深いですね。

後者の方がよりそれっぽい気がします。


inspect.getmembers

今度は、inspectモジュールのgetmembersを使って見てみます。

import inspect

for i in inspect.getmembers(hou):
if 'NodeType' in i[0]:
print i

getmembers

NodeTypeCategory系は、軒並み built-in function なようです。

これらの関数は、「NodeTypeCategory」型を返してくれます。

type( hou.sopNodeTypeCategory() )

<class 'hou.NodeTypeCategory'>


NodeTypeCategory

NodeTypeCategory型で、とりあえず名前(name)でも見ようかなと n をタイプしたら、ついでに「nodeTypes」というのもサジェストされました。

name_nodeTypes

sopCategory.name()

'Sop'

sopCategory.nodeTypes()

nameの方は想像通りの結果ですが、

ついでに見つけたnodeTypesの方はこういう感じになりました!

nodeTypes

ちょっとギョッとしましたが、これで各ノードカテゴリ内のノードをチェックできそうです。


nodeTypesの中身をカウント

import inspect

for i in inspect.getmembers(hou):
if 'NodeType' in i[0]:
if inspect.isbuiltin(i[1]):
try:
nodetypecategory= i[1]()
except:
continue
nts = nodetypecategory.nodeTypes()
print( nodetypecategory.name(),len( nts ) )

途中のtry-exceptは、swigregisterの人たちがエラーを起こすために設けたものです。

下から2行目で先ほどのnodeTypesの結果である辞書を受け取り、カテゴリ名と共にその辞書の長さをプリントしてみました。

count

結果……

〜〜Net系はそれぞれ1ノードしかないのはわかるんですが、

SOPとかDOPとかVOPとかそんなに多いものなんですか??? そうですか。

一応結果を貼っておきます。H15.5.632です。

('ChopNet', 1)

('Chop', 103)
('CopNet', 1)
('Cop2', 145)
('Dop', 435)
('Object', 146)
('Particle', 1)
('Pop', 68)
('Driver', 42)
('Shop', 205)
('Sop', 430)
('VopNet', 18)
('Vop', 816)


nodeTypesの中身をカウント(特にCHOP)

比較的数えやすそうなCHOPを比べてみることにしました。

スクリプトの結果が上記のように「103」。

chopNodes = hou.chopNodeTypeCategory().nodeTypes()

sorted( chopNodes.keys() )

スクリーンショット 2016-12-19 23.22.11.png

Houdini UI上だと……

CHOP

4列、25行。掛け算くらいできます

for」と「popnet」と「vopchoptype」の3ノードが、UI上では見当たりません。

でも、H12時点のオンラインドキュメントを見てみると、forCHOPはありますので、

http://sidefx.jp/doc/nodes/chop/for.html

これらは、過去のシーンデータとの互換性を保つためとかで残してあるものなのだろうなと推察できます。

VOPがすごい量になってるのもそうアレなのでしょうか。

ではスクリプトでそのノードだけフィルタリングするには?

といったあたりは次回の宿題になりそうです。


まとめ

サジェストに助けられました。

便利!!

次は yone80@github さんの「四角ポリゴンに合わせて変形」です。