Help us understand the problem. What is going on with this article?

switchで作るUIいろいろ

More than 1 year has passed since last update.

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

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

Switch の基本は、Select Input のところで入力ノードを切り替えます。
「0」が1つめの入力、「1」が2つめの入力です。
青い矢印ボタンで入力順を変更することもできます。
この Select Input の部分には最終的に数字が渡されていれば良いので、エクスプレッションを使った様々な工夫で切り替えをコントロールできます。
input.gif
余談ですが、Switch に限らず Shift+R キーでも入力順を変更できるようです。
shift_r.gif

CheckBox

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

Switch の入っている Geometryノードのインターフェイスを編集します。
右クリックから Edit Parameter Interface を選びます。
ParamEdit.png
左からToggle パラメータを選んでインターフェイスに追加します。
名前は checkBox にしてみました。見やすいよう他は Invisible にしておきます。
Applyするとチェックボックスができます。
ParamCheck.png
このチェックボックスの上で右クリックから Copy Parameter をして、
Switch の Select Input の上で右クリックから Paste Relative References をすると
チェックボックスはブール値(真=1/偽=0)を返すので、Select Input がその値を参照し、0と1が切り替わる形になります。
Check_copy.png
Check_paste.png
Check_toggle.gif
チェックボックスと連動した Switch ができました。簡単!

Radio Button

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

先程と同様に、右クリックから Edit Parameter Interface を選びます。
Folder を追加し、Folder Type を Radio Buttons にします。
Name は任意ですが radio にしてみます。
radio_modelA.PNG
選択肢の数だけ複製します。
radio_modelB.PNG
2つ目以降の Folder は Name が勝手に連番になり、グレーアウトして編集できなくなります。セットで扱われる、ということのようです。

switch ノードの Select Input には

ch("../radio1")

と、Folder の Name の末尾に「」をつけたものを記入します。
これはフォーラムによると(要約)

"1" is first element in the set.

とのことで、フォルダセットの1つめ、という事のようです。
radio_UI.gif
ラジオボタンで Input が切り替わる Switch ができました。

Input の有無を判定する

インプットがある場合はそのインプットを処理し、無い場合は元の流れのまま、というケースです。
例えばHeightField関連ノードで「マスク入力がある場合はそれを使用する」などで使われています。
exist_mask.PNG
exist_node.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 ができました。
exist.gif


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

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

saty
3DCG artist
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした