switchで作るUIいろいろ

こんにちは、初めてのアドカレ参加、宜しくお願いします。

今回は好きなノードの１つである Switch について書いてみます。
Switch は処理が分岐できるので、ツールのUIを作る時によくお世話になります。
（作例の環境）Houdini 17.0.352 / Windows 10


Switch の基本は、**Select Input** のところで入力ノードを切り替えます。
「0」が１つめの入力、「1」が２つめの入力です。
青い矢印ボタンで入力順を変更することもできます。
この Select Input の部分には最終的に数字が渡されていれば良いので、エクスプレッションを使った様々な工夫で切り替えをコントロールできます。
![input.gif](https://qiita-image-store.s3.amazonaws.com/0/183392/0857f3f2-481a-10d1-2e1c-fcbaa2cc6276.gif)
余談ですが、Switch に限らず **Shift+R** キーでも入力順を変更できるようです。
![shift_r.gif](https://qiita-image-store.s3.amazonaws.com/0/183392/40818dad-d8b3-e76d-87e7-e4eeb2141e12.gif)

##CheckBox

まずはチェックボックスのON/OFFで処理を分岐させる方法です。

Switch の入っている Geometryノードのインターフェイスを編集します。
右クリックから **Edit Parameter Interface** を選びます。
![ParamEdit.png](https://qiita-image-store.s3.amazonaws.com/0/183392/8df557d3-ad1b-c88e-4957-29171048e588.png)
左から**Toggle** パラメータを選んでインターフェイスに追加します。
名前は `checkBox` にしてみました。見やすいよう他は Invisible にしておきます。
Applyするとチェックボックスができます。
![ParamCheck.png](https://qiita-image-store.s3.amazonaws.com/0/183392/a47944c7-5ff7-f80f-7521-9bab64cef2df.png)
このチェックボックスの上で右クリックから **Copy Parameter** をして、
Switch の Select Input の上で右クリックから **Paste Relative References** をすると
チェックボックスはブール値（真=1/偽=0）を返すので、Select Input がその値を参照し、0と1が切り替わる形になります。
![Check_copy.png](https://qiita-image-store.s3.amazonaws.com/0/183392/9a649664-281b-2149-33f3-8e9e70750228.png)
![Check_paste.png](https://qiita-image-store.s3.amazonaws.com/0/183392/241b1dc8-5034-5309-fbef-5294fb4eebe7.png)
![Check_toggle.gif](https://qiita-image-store.s3.amazonaws.com/0/183392/55c51226-5dc4-5c73-9495-ab8d4e4c97da.gif)
チェックボックスと連動した Switch ができました。簡単！


##Radio Button

チェックボックスはON/OFFの二択ですが、ラジオボタンは複数の選択肢から１つを選びます。

先程と同様に、右クリックから **Edit Parameter Interface** を選びます。
**Folder** を追加し、Folder Type を **Radio Buttons** にします。
Name は任意ですが `radio` にしてみます。
![radio_modelA.PNG](https://qiita-image-store.s3.amazonaws.com/0/183392/82a4258f-91d9-1b4d-f1ee-fd79a28280b0.png)
選択肢の数だけ複製します。
![radio_modelB.PNG](https://qiita-image-store.s3.amazonaws.com/0/183392/d5c2dd5f-827d-2a0e-8b73-72091fdf6d06.png)
２つ目以降の Folder は Name が勝手に連番になり、グレーアウトして編集できなくなります。セットで扱われる、ということのようです。

switch ノードの Select Input には

```
ch("../radio1")
```
と、Folder の Name の末尾に「**１**」をつけたものを記入します。
これはフォーラムによると（要約）

>"1" is first element in the set.

とのことで、フォルダセットの１つめ、という事のようです。
![radio_UI.gif](https://qiita-image-store.s3.amazonaws.com/0/183392/23fdc5e2-76b9-6819-d035-b00968190d15.gif)
ラジオボタンで Input が切り替わる Switch ができました。


##Input の有無を判定する

インプットがある場合はそのインプットを処理し、無い場合は元の流れのまま、というケースです。
例えばHeightField関連ノードで「マスク入力がある場合はそれを使用する」などで使われています。
![exist_mask.PNG](https://qiita-image-store.s3.amazonaws.com/0/183392/92a3b8fd-638b-fcce-2a24-cc22549bdbb7.png)
![exist_node.PNG](https://qiita-image-store.s3.amazonaws.com/0/183392/5be7cbe8-38ea-fd83-9edf-822fd49071e9.png)
ちょっと簡略化しましたが、上図のようなネットワークになっており、null1（＝親ノードのマスク用input）に入力がある場合は、１に切り替わります。
Select Input にはこのようなエクスプレッションが入っています。

```
if(strcmp(opinputpath("../null1", 0), ""), 1, 0)
```

分解すると、
`opinputpath(ノード, インプット番号)`
指定ノードの指定したインプットに接続されたノードのフルパスを返します。
この場合null1にインプットがあればその「フルパス」を返し、無かったら空「""」が返されます。

`strcmp(文字列1, 文字列2)`
文字列を比較し、ASCII順でどちらが前か、あるいは同じか、を数字で返します。
「フルパス」と「""」の比較ではフルパスのほうが後ろに来るので「1」を返します。
「""」と「""」の比較では同じなので「0」を返します。

`if(expression, 真の時の値, 偽の時の値)`
最初の「expression」の真偽値に応じて、2番目または3番目の値を返します。
ここで先程の strcmp の結果をブール値として扱っています。
strcmpの結果が「1」の場合、「真の時の値」が使われます。（この例では「1」が使われる）
strcmpの結果が「0」の場合、「偽の時の値」が使われます。（この例では「0」が使われる）

これで、入力があれば Input 1、無いなら Input 0 に切り替わる Switch ができました。
![exist.gif](https://qiita-image-store.s3.amazonaws.com/0/183392/723521f0-eadd-56be-70a5-e9863a036275.gif)
___

以上、簡単ですが何かのお役に立てば幸いです。
シーンファイルもあげておきます。
https://www.dropbox.com/s/4vx9tkojcipwxmn/switch_UI.hipnc?dl=0


ありがとうございました！