公式ドキュメント:Pythonステート 選択
トップページ:Houdini Python State サンプルコードユースケース
手動型のスクリプトによる選択
シェルフツールに埋め込む
- シェルフタブに新しいシェルフツールを作る
- Edit Tool を開き、Script タブにサンプルコードを貼り付け
- 38, 45行目の「"$HDA_NAME"」を「"copytopoints::2.0"」に書き換える
- Accept で保存
- ネットワークビューに box を配置
- 今作ったシェルフツールをクリック
- box プリミティブを全選択(ダブルクリック)して Enter
- 頂点の 8ポイントを全選択して Enter
copy to points の両入力に box が入るはずです。
HDA に埋め込む
- copytopoints を含む HDA を作成
- Type Properties を開き、Basic タブで Maximum Inputs を 2 にする
- HDA の中に入り、copytopoints に Input #1 と #2 を接続し、Save Node Type
- Type Properties の Interactive > Shelf Tools タブにサンプルコードを貼り付け
- ネットワークビューで tab > 作成した HDA を選択
- box プリミティブを全選択(ダブルクリック)して Enter
- 頂点の 8ポイントを全選択して Enter
作成した HDA の両入力に box が入るはずです。
ジオメトリセレクターのバインド
HDA に埋め込む
- box を含む HDA を作成
- Type Properties を開き、Interactive > State Script タブの右下の New... を選択
- Label に任意の名前を入力し、イベントハンドラから onSelection だけを選択して Accept
- サンプルコードの onSelection 全体をコピーし、State Script の onSelection 全体に書き換え
- template = hou.ViewerStateTemplate(state_typename, state_label, state_cat)
template.bindFactory(State)
template.bindIcon(kwargs["type"].icon())
の三行を削除し、サンプルコードの
template = hou.ViewerStateTemplate(
以下全文を貼り付け、改行を合わせる - ここで Accept するとエラーになるため、selector #1 と #2 の geometry_types と primitive_types をリストにする
- 47-50行目の template = hou.ViewerStateTemplate(... を
template = hou.ViewerStateTemplate(state_typename, state_label, state_cat)に書き換え
- 48行目の MyState を State に書き換え
- Accept で保存
- HDA を選択状態にしてフラグを立てて、ビューポートで Enter を入力
- 下に「Select three polygons」と出るので、3面選択して Enter を入力、エラーが出る
- Type Properties を開き、23行目あたりの are_prims = sel.geometryType() == hou.geometryType.Primitive の末尾を .Primitives に直す
- 29行目 return are_prims and are_all_polys and count == 3 の一行前に print ("Three polygons selected") と追加し、Accept で保存
- もう一度 12 をやり、出力を確認
サンプルコードだけでは 3ポリゴン以外の選択でも出力はされるが、あくまで内容として選択数が 3 かどうかを判定している。Selector #2 は自分で切り替えシステムを作れば起動できる。
これだけでは不十分なので、他のサンプルコードも参考にすることをお勧めします。
オブジェクトセレクターのバインド
HDA に埋め込む
- Object レベルに null を含む(もしくは空の)HDA を作成
- Type Properties を開き、Interactive > State Script タブの右下の New... を選択
- Label に任意の名前を入力し、イベントハンドラから onSelection だけを選択して Accept
- サンプルコードの onSelection 全体をコピーし、State Script の onSelection 全体に書き換え
- サンプルコードの template.bindObjectSelector( 以下 5行をコピーし、State Script の 36行目 template.bindIcon(kwargs["type"].icon()) の下に貼り付け
- 21行目の print 文を ( ) で囲み、Accept で保存
- HDA と同じ Object レベルに box や sphere などの Geometry ノードと camera を複数作成(camera は 2つ以上)
- HDA を選択状態にしてフラグを立てて、ビューポートで Enter を入力
- box や sphere は選択できないが、camera は選択できることを確認
- 任意の数の camera を選択して Enter を入力し、Number of cameras selected:(選択した数)と出力されることを確認