1. saty

    No comment

    saty
Changes in body
Source | HTML | Preview
@@ -1,121 +1,90 @@
好きなノードの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** をして
+このチェックボックスの上で右クリックから **Copy Parameter** をして
Switch の Select Input の上で右クリックから **Paste Relative References** をすると
-チェックボックスのON/OFFで入力が切り替わる Switch ができました
+チェックボックスはブール値(真=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)
-チェックボックスはブール値(真=1/偽=0)を返すので、その値を Select Input から参照している形になります
+チェックボックスと連動した 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")`
と、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 数を取得する
-
-###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
-
-切り替えるモデルの数を増やすごとに、エクスプレッションの数字を変更するのは面倒なので、
-Switchノードのインプット数を取得し、勝手にその値が入るようにします。
-先程とほぼ同じエクスプレッションですが、最後の部分だけ違います。
-
-`floor(fit01(rand(@ptnum),0,opninputs("../switch1")))`
-
-`opninputs()`を使って、ランダムの最大値に switch ノードのインプット数が入ります。
##Input の有無を判定する
-「2番目の入力がある時は…」というように、インプットの有無を判定して処理を分岐させる方法です。
-HeightField関連ノードの中身を参考にしました。
+インプットがある場合はそのインプットを処理し、無い場合は元の流れのまま、というケースです。
+例えば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)
```
-null1にインプットがある場合は、1にスイッチします。
分解すると、
`opinputpath(ノード, インプット番号)`で接続されたノードのフルパスを返します。
-この場合null1にインプットがあればそのフルパスを返し、無かったら空「""」になります。
+この場合null1にインプットがあればそのフルパスを返し、無かったら空「""」が返されます。
-`strcmp(文字列, 文字列)`
+`strcmp(文字列1, 文字列2)`
文字列を比較し、ASCII順でどちらが前か、あるいは同じか、を数字で返します。
-フルパスの場合(フルパス,"")の比較ではフルパスのほうが後ろに来るので「1」を返します。
-空の場合("","")の比較では同じなので「0」を返します。
+フルパス」と「""」の比較ではフルパスのほうが後ろに来るので「1」を返します。
+「""」と「""」の比較では同じなので「0」を返します。
`if(expression, 真の時の値, 偽の時の値)`
-最初のexpressionの真偽値に応じて、2番目または3番目の値を返します。
-ここでstrcmpの結果をブール値として扱っています。
-strcmpの結果が「1」の場合、「真の時の値」の値「1」が使われます。
-strcmpの結果が「0」の場合、「偽の時の値」の値「0」が使われます。
-結果、フルパスが入っているなら Input 1、無いなら Input 0 に切り替わる Switch ができました。
+最初のexpressionの真偽値に応じて、2番目または3番目の値を返します。
+ここで先程の strcmp の結果をブール値として扱っています。
+strcmpの結果が「1」の場合、「真の時の値」が使われます。(この例では「1」を入れてある)
+strcmpの結果が「0」の場合、「偽の時の値」が使われます。(この例では「0」を入れてある)
+
+結果、入力があれば Input 1、無いなら Input 0 に切り替わる Switch ができました。
+
+
___
-以上、少々くどくなってしまいましたが、お役に立てば幸いです。
+以上、何かのお役に立てば幸いです。
ありがとうございました。