1. saty

    No comment

    saty
Changes in title
-switchいろいろ
+switchで作るUIいろいろ
Changes in body
Source | HTML | Preview
@@ -1,110 +1,121 @@
好きなノードの1つである Switch について書いてみます。
-Switchは処理が分岐できるので、ツールを作る時によくお世話になります。
-(環境)Houdini 17.0.352 / Windows 10
+Switch ノードは処理が分岐できるので、ツールのUIを作る時によくお世話になります。
+作例の環境)Houdini 17.0.352 / Windows 10
-Switch の基本としては、**Select Input** のところで入力ノードを切り替えることができます。
+Switch の基本は、**Select Input** のところで入力ノードを切り替えます。
上矢印で入力順を変更することもできます。
-この Select Input には数字が渡されていれば良いので、エクスプレッションを使ってあの手この手で入力を切り替えることになります。
+この 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
-まずGeometryノードのインターフェイスを編集します。
-右クリックから **Edit Parameter Interface** を選びます。
+まずはチェックボックスのON/OFFで処理を分岐させる方法です。
-**Toggle** パラメータを選んでインターフェイスに追加します。
+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)を受けて入力が切り替わる Switch ができました。
+チェックボックスのON/OFFで入力が切り替わる Switch ができました。
+![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)
+チェックボックスはブール値(真=1/偽=0)を返すので、その値を Select Input から参照している形になります。
+
+
##Radio Button
ラジオボタンのインターフェイスを作ります。
チェックボックスはON/OFFの二択ですが、ラジオボタンは複数の選択肢から1つを選びます。
先程と同様に、右クリックから **Edit Parameter Interface** を選びます。
**Folder** を追加し、Folder Type を **Radio Buttons** にします。
Name は任意ですが `radio` にしてみます。
この Folder がラジオボタンになりますので、選択肢の数だけ増やします。
2つ目以降の Folder は Name が勝手に連番になり、グレーアウトして編集できなくなります。セットで扱われる、ということのようです。
switch ノードの Select Input には
`ch("../radio1")`
と、Folder の Name の末尾に「**1**」をつけたものを記入します。
これはフォーラムによると
>"1" is first element in the set.
とのことで、フォルダセットの1つめ、という事のようです。
ラジオボタンで Input が切り替わる Switch ができました。
-##Random CopyStamp
+##Input 数を取得する
+
+###Random CopyStamp
**Copy Stamp** ノードで複製するモデルを、Switch でランダムに切り替える方法です。
こちらはチュートリアルなども多いので、簡単に触れます。
Copy Stamp ノードの Stamp タブで、**Stamp Inputs** にチェックを入れて有効にし、
下部の欄に変数名とエクスプレッションを入れます。
この例では下記のように入れました。
変数名: `switcher`
値: `floor(fit01(rand(@ptnum),0,3))`
分解すると、
`rand(@ptnum)`で、各pointごとにランダムな0~1の少数点の値を生成します。
`fit01( 元の値 ,0,3)`で、ランダムな0~1の値を、0以上3未満のレンジに合わせます。
`floor()`で、小数点を切り捨てて 0,1,2 の整数値になります。
各pointごとにランダムな 0,1,2 の値を作ることができたので、これを Select Input に渡します。
switch の Select Input 側には下記を入力します。
`stamp("../copy1","switcher",0)`
先程の Copy Stampノードの 「switcher」という変数を受け取ります、受け取れなければ「0」にします。
3つのモデルがランダムで切り替わるようになりました。
-##Input 数を取得する Random CopyStamp
+###Input 数を取得する Random CopyStamp
切り替えるモデルの数を増やすごとに、エクスプレッションの数字を変更するのは面倒なので、
Switchノードのインプット数を取得し、勝手にその値が入るようにします。
先程とほぼ同じエクスプレッションですが、最後の部分だけ違います。
`floor(fit01(rand(@ptnum),0,opninputs("../switch1")))`
`opninputs()`を使って、ランダムの最大値に switch ノードのインプット数が入ります。
##Input の有無を判定する
「2番目の入力がある時は…」というように、インプットの有無を判定して処理を分岐させる方法です。
HeightField関連ノードの中身を参考にしました。
```
if(strcmp(opinputpath("../null1", 0), ""), 1, 0)
```
null1にインプットがある場合は、1にスイッチします。
分解すると、
`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 ができました。
___
以上、少々くどくなってしまいましたが、お役に立てば幸いです。
ありがとうございました。