4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HoudiniAdvent Calendar 2016

Day 19

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

Last updated at Posted at 2016-12-19

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 さんの「四角ポリゴンに合わせて変形」です。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?