Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@it_ks

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

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

4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
it_ks
いまは技術記事はnoteに投稿してます > https://note.com/it_ks CG業務の傍ら、CGに関するライター業や技術系同人誌を制作しています > https://circleqt.booth.pm/ なにかありましたらマシュマロからもどうぞ : https://marshmallow-qa.com/it_ks

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?