Houdini 19.5 Pythonスクリプト

ノード検索

ネットワークエディタのFindダイアログと同じコードを使ってプログラム的にノードを検索することができます。

On this page

概要

ネットワークエディタのFindウィンドウのノード検索を実行するコードは、nodesearchパッケージを利用することでスクリプト化することができます。

このパッケージでは、“Matcher”オブジェクトを使ってマッチしたノードを検索します。Matcherオブジェクトは以下のメソッドを持っています:

Matcher.nodes(network, ignore_case=False, recursive=False, recurse_in_locked_nodes=True)list of hou.Node

指定したネットワークから開始して、マッチしたノードを表現したhou.Nodeインスタンスのリストを返します。

network

検索されるネットワークを表現したhou.Nodeオブジェクト。

ignore_case

これをTrueにすると、Matcherによる文字列比較は大文字小文字を区別しなくなります。 デフォルトはFalseです。

recursive

これをTrueにすると、コンテナノード内を再帰的に検索します。 デフォルトはFalseです。

recurse_in_locked_nodes

recursiveをTrue且つこれもTrueにすると、Matcherはロックされたアセット内を検索します。 デフォルトはTrueです。

Matcher.matches(node, ignore_case=False)bool

指定したノードがマッチしたらTrue、マッチしなかったらFalseを返します。

クエリの解析

以下の関数を使用することで、MatcherにQuery文字列(Findウィンドウの上部にある自由形式のテキストボックスの文字列)を解析させることができます:

import hou
from nodesearch import parser

# time_で始まる名前でTranslate Xが>1のノードを検索するMatcherオブジェクトを作成します。
matcher = parser.parse_query("time_* tx:>1")

network = hou.node("/obj/")
for node in matcher.nodes(network, recursive=True):
    ...

select()ハイレベル関数は、自動的にQuery文字列を解析して、ネットワークエディタ内のノードを選択します。

from nodesearch import parser

# オプションで、使用するネットワークエディタペインを指定することができます。
# 指定しなかった場合は、この関数は現行のネットワークエディタを使用します。
editor = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
# ネットワークパスを指定しなかった場合は、この関数は現行のネットワークパスを使用します。
network = hou.node("/obj/geo1")

# frame=Trueは、選択したノードが中心になるようにネットワークエディタをパンしてズームします。
parser.select("time_* tx:>1", editor=editor, network=network, frame=True)

Matcherオブジェクトの構築

Matcherオブジェクトは手動で構築することもできます(これはFindウィンドウの“Add Condition”コントロールを使用するようなものです):

import hou
import nodesearch

# time_で始まる名前のノードを検索するMatcherを作成します。
name_matcher = nodesearch.Name("time_*")

# Translation Xの値が10より大きいノードを検索するMatcherを作成します。
parm_matcher = nodesearch.Parm("tx", ">", 1.0)

# 両方のサブ条件にマッチしなければならないMatcherを作成します。
both_matcher = nodesearch.Group([name_matcher, parm_matcher])

# どちらかのサブ条件にマッチしなければならないMatcherを作成します。
either_matcher = nodesearch.Group([name_mater, parm_matcher], intersect=False)

parser.select()は、構築したMatcherオブジェクトをquery=キーワード引数に指定して動作させることもできます:

parser.select(query=both_matcher, editor=editor, network=network, frame=False)

Matcherクラス

以下のMatcherサブクラスを使ってMatcherオブジェクトを構築することができます:

nodesearch.All()

すべてのノードにマッチします。

これは、*Query文字列と等価です。

nodesearch.Null()

どのノードにもマッチしません。

nodesearch.Name(name, exact=False)

ネットワークエディタ内の個々の名前(例えば、sphere1)でノードをマッチさせます。

matcher = nodesearch.Name("foo")

name

マッチさせる名前の文字列。exact=Trueの場合、この名前のとおりのノードのみにマッチします。 exact=Falseの場合、このサブ文字列を含んだ名前のノードにマッチします。

exact

名前のとおりにマッチさせるかどうか。デフォルトはFalseで、この名前を含んだサブ文字列にマッチします。

これは、fooQuery文字列と等価です。

nodesearch.Parm(name, op, value)

指定したパラメータ値とターゲット値が同じノードにマッチします。

以下は、Translate Yが10以上のノードにマッチします:

matcher = nodesearch.Parm("ty", ">=", 10)

name

マッチさせるパラメータの内部名。パラメータエディタのラベル上にマウスカーソルを置くと、そのパラメータの内部名が表示されます。

op

パラメータ値とターゲット値を比較する方法を指定した文字列。

数値パラメータに関しては、ここには、<, >, <=, =<, >=, =>, =, ==, !=のどれかを指定することができます。

文字列パラメータに関しては、=, ==または特殊演算子の|=~=を指定することができます。 |=は、ターゲット値がパラメータ値のサブ文字列かどうかをチェックします。 ~=は、ターゲット文字列をパターンとして扱い、それをパラメータ値とマッチさせます。

value

各ノードのパラメータ値と比較する“ターゲット”値。

これは、ty:>=10Query文字列と等価です。

nodesearch.RawParm(name, value, is_pattern=False, exact=False)

パラメータのそのままの文字列の内容とターゲット文字列が同じノードにマッチします。 パラメータの“そのままの”値は、変数を展開せず、エクスプレッションも評価しません。

これを使用すれば、例えば特定のエクスプレッションの関数が使用されたノードを検索することができます:

matcher = nodesearch.RawParm("ch(")

is_pattern

これがTrueの場合、Matcherはターゲット文字列をサブ文字列ではなくパターンとして扱います。

exact

これがTrueの場合、パラメータの内容は、そのままのターゲット文字列にマッチしなければなりません。 デフォルトはFalseで、ターゲットがパラメータの内容のサブ文字列の時にマッチします(is_pattern=Trueの場合は無視されます)。

これは、group~="ch("Query文字列と等価です。

nodesearch.State(name, boolean)

特定のフラグ/ステートの有無でノードにマッチします。

例:

# バイパスフラグのノードにマッチさせる:
matcher = nodesearch.State("bypass", True)
# エラーのあるノードを検索する:
matcher = nodesearch.State("error", True)
# Descriptive Parameter表示が無効なノードを検索する:
matcher = nodesearch.State("displaydescriptivename", False)

name

チェックするフラグ/状態を意味した文字列。

ここには、ノードフラグの内部名を指定することができます: audio, bypass, colordefault, compress, current, debug, display, displaycomment, displaydescriptivename, export, expose, footprint, highlight, inoutdetaillow, inoutdetailmedium, inoutdetailhigh, material, lock, softlock, origin, pick, render, selectable, template, unload, visible, xray。

さらに次の状態を検索することもできます: “comment” (ノードのコメントフィールドに内容が書かれている), “warning” (ノードが警告を出している), “error” (ノードがエラーを出している)。

boolean

指定したフラグ/状態の有効/無効のどちらを検索するか。

これは、+bypass +error -displaydescriptivenameQuery文字列と等価です。

nodesearch.NodeType(typename, typecat=None, exact=False)

指定したタイプのノード(例えば、Copy SOP, Geometry Object)にマッチします

例:

# 内部名が"vex"のタイプにマッチします。
matcher = nodesearch.NodeType("vex")
# 内部名が"vex"のSOPにマッチします。
matcher = nodesearch.NodeType("vex", hou.sopNodeTypeCategory())
# そのままの名前のタイプのノードのみにマッチします。
matcher = nodesearch.NodeType("examplecom::character::2.0", "Sop")

typename

exact=Trueの場合、指定した名前のとおりの内部名のノードタイプにマッチします。 exact=Falseの場合、このサブ文字列が含まれている内部名のノードタイプにマッチします。

exact

ノードタイプ名にそのままマッチさせるかどうか。デフォルトはFalseで、サブ文字列が含まれているノードタイプ名にマッチします。

これは、'vex 'Sop/vexQuery文字列と等価です。

nodesearch.ParameterState(condition)

特定の条件のパラメータを持つノードにマッチします。

この条件は、以下の値のどれかを使った文字列です:

"off_default_parm" – デフォルト値以外の値のパラメータを持ったノード。

"spare_parm" – 最低でも1個のSpareパラメータを持ったノード。

"animated_parm" – 時間依存のパラメータを持ったノード。

"expression_parm" – エクスプレッションで駆動されるパラメータを持ったノード。

これは、@off_default_parm @spare_parmQuery文字列と等価です。

nodesearch.Not(matcher)

指定したMatcherの意味を逆にするので、このMatcherは、子Matcherがマッチ しない ノードにマッチします。

これは、NOT _keep_Query文字列と等価です。

nodesearch.Input(matcher)

指定したMatcherが入力としてマッチしたノードにマッチします。

nodesearch.Output(matcher)

指定したMatcherが出力としてマッチしたノードにマッチします。

nodesearch.Group(submatchers, intersect=True)

“and”または“or”の関係を使ってMatcherをグループ化します。

intersect=Trueの場合、すべてのサブMatcherにマッチしたノードのみにマッチします。

これは、(a & b & c)Query文字列と等価です。

intersect=Falseの場合、どれかのサブMatcherにマッチしたノードにマッチします。

これは、(a | b | c)Query文字列と等価です。

matcher = nodesearch.Group([matcher1, matcher2, matcher3], intersect=False)

Pythonスクリプト

はじめよう

次のステップ

リファレンス

  • hou

    Houdiniにアクセスできるサブモジュール、クラス、ファンクションを含んだモジュール。

導師レベル

Python Viewerステート

Pythonビューアハンドル

プラグインタイプ