On this page |
概要 ¶
ネットワークエディタのFindウィンドウのノード検索を実行するコードは、nodesearch
パッケージを利用することでスクリプト化することができます。
このパッケージでは、“Matcher”オブジェクトを使ってマッチしたノードを検索します。Matcherオブジェクトは以下のメソッドを持っています:
Matcher.nodes(network, ignore_case=False, recursive=False, recurse_in_locked_nodes=True)
→ list
of hou.OpNode
指定したネットワークから開始して、マッチしたノードを表現したhou.OpNode
インスタンスのリストを返します。
network
検索されるネットワークを表現したhou.OpNodeオブジェクト。
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で、この名前を含んだサブ文字列にマッチします。
これは、foo
Query文字列と等価です。
nodesearch.Parm(name, op, value)
指定したパラメータ値とターゲット値が同じノードにマッチします。
以下は、Translate Yが10以上のノードにマッチします:
matcher = nodesearch.Parm("ty", ">=", 10)
name
マッチさせるパラメータの内部名。パラメータエディタのラベル上にマウスカーソルを置くと、そのパラメータの内部名が表示されます。
op
パラメータ値とターゲット値を比較する方法を指定した文字列。
数値パラメータに関しては、ここには、<
, >
, <=
, =<
, >=
, =>
, =
, ==
, !=
のどれかを指定することができます。
文字列パラメータに関しては、=
, ==
または特殊演算子の|=
や~=
を指定することができます。
|=
は、ターゲット値がパラメータ値のサブ文字列かどうかをチェックします。
~=
は、ターゲット文字列をパターンとして扱い、それをパラメータ値とマッチさせます。
value
各ノードのパラメータ値と比較する“ターゲット”値。
これは、ty:>=10
Query文字列と等価です。
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 -displaydescriptivename
Query文字列と等価です。
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/vex
Query文字列と等価です。
nodesearch.ParameterState(condition)
特定の条件のパラメータを持つノードにマッチします。
この条件は、以下の値のどれかを使った文字列です:
"off_default_parm"
– デフォルト値以外の値のパラメータを持ったノード。
"spare_parm"
– 最低でも1個のSpareパラメータを持ったノード。
"animated_parm"
– 時間依存のパラメータを持ったノード。
"expression_parm"
– エクスプレッションで駆動されるパラメータを持ったノード。
これは、@off_default_parm @spare_parm
Query文字列と等価です。
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)