1. saty

    No comment

    saty
Changes in body
Source | HTML | Preview
@@ -1,90 +1,93 @@
好きなノードの1つである Switch について書いてみます。
Switch ノードは処理が分岐できるので、ツールのUIを作る時によくお世話になります。
(作例の環境)Houdini 17.0.352 / Windows 10
Switch の基本は、**Select Input** のところで入力ノードを切り替えます。
「0」が1つめの入力、「1」が2つめの入力です。
青い矢印ボタンで入力順を変更することもできます。
この 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の二択ですが、ラジオボタンは複数の選択肢から1つを選びます。
先程と同様に、右クリックから **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)
この Folder がラジオボタンになりますので、選択肢の数だけ増やします。
![radio_modelB.PNG](https://qiita-image-store.s3.amazonaws.com/0/183392/d5c2dd5f-827d-2a0e-8b73-72091fdf6d06.png)
2つ目以降の Folder は Name が勝手に連番になり、グレーアウトして編集できなくなります。セットで扱われる、ということのようです。
switch ノードの Select Input には
-`ch("../radio1")`
+
+```
+ch("../radio1")
+```
と、Folder の Name の末尾に「**1**」をつけたものを記入します。
これはフォーラムによると
>"1" is first element in the set.
とのことで、フォルダセットの1つめ、という事のようです。
![radio_UI.PNG](https://qiita-image-store.s3.amazonaws.com/0/183392/abe8a621-8a99-3d97-2470-5e79eec562a1.png)
ラジオボタンで 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)に入力がある場合は、1に切り替わります。
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 ができました。
___
以上、何かのお役に立てば幸いです。
ありがとうございました。