« 画像で痛ポリ。 | トップページ | 友愛その2。 »

2010年7月 2日 (金)

友愛その1。

まったく気まぐれです。
いつかこんなの書いてみようと漠然と思っていただけです。
大してわかっているわけでもないのに。
何をエラソーに。


XSI のスクリプトで、独自の PPG を作る方法。
カスタムプロパティの UI の作り方ということです。
ユーアイです。ユーザーインターフェース。
XSI 的には PPGLayout と言うらしい。
簡単なスクリプトは書けるけど、UI にまとめる方法がわからない、という人には参考になる可能性があります。
簡単なことしか書きません。っていうかそれしか書けません。
スクリプトをガンガンやるお方は、どうかスルーして下さい。
とうか、間違い勘違いを指摘して下さいマジで。
JScript しか知りません。
やっぱ今時 Python やるべきだよねえ?
知りません。







まずはいきなりソースコード全文。

//    CustomProperty を SceneRoot に作る。Branch はオフ。 
//    名前は "hoge"。 作られた CustomPropety は oProp に代入される

var oProp = ActiveSceneRoot.AddProperty("CustomProperty",  false,  "hoge");

//    oProp(さっき作った CustomProperty)に、パラメータを追加する
oProp.AddParameter2("Icon",  siInt4,  1,  0,  10);
oProp.AddParameter2("Size",  siDouble,  1,  0.01,  100);


//    PPGLayoutを作る
var oLayout = oProp.PPGLayout;

//    さっき作ったPPGLayout に、すでに作成してあるパラメータを登場させる
//    AddItem メソッドで、作成済みのパラメータ名、UI に登場させる時の名前を指定

oLayout.AddItem("Icon",  "愛根");
oLayout.AddItem("Size",  "砕図");


//    ボタンを作るときは AddButton メソッドを使う
oLayout.AddButton("Set",  "切吐");

//  表示しておしまい。
InspectObj(oProp); 



これを実行すると、

Ui_11

こんな感じになりますよね。なるんです。

Explorer を見ると、Scene Root に hoge という Custom Property が出来ています。
hoge という Custom Property の PPG が表示されています。
愛根というパラメータとそのスライダがあります。
砕図というパラメータとそのスライダがあります。
切吐というボタンがあります。


これを最初から説明していきます。って言ってもチョー簡単です。コード内のコメントを読むだけでもまあわかるでしょう。 //(スラッシュ2発)で始まる行はただのコメントで、スクリプトエンジンに無視されます。 人に説明する時や後で自分がわけからなくならないように、注釈を付けているということです。





まず最初、

var oProp = ActiveSceneRoot.AddProperty("CustomProperty",  false,  "hoge");

これですが、まずはイコールの右側だけ見て下さい。「シーンルートにカスタムプロパティを作りやがれ。ブランチはオフだ。カスタムプロパティの名前は hoge にしねえと殺すぞゴルァ。」 と言っていることになります。ひとつひとつを以下に解説します。

XSI のシーンルートは、スクリプト内では ActiveSceneRoot という言い方で表せます。これからやる処理は、シーンルートに対してやるんだよと言っていることになります。

次にドットでつないで AddProperty というのが出てきますが、 これは指定したブツに Property を与えろという呪文です。 この場合シーンルートに Property を与えろと言っていることになります。続くカッコの中身でその Property の詳細を指定しています。 XSI のスクリプトはだいたいこういう構造です。

最初は "CustomProperty" となっています。 さっき「シーンルートに Property を与えろ」と言ったわけですが、いったいどんな Property なのかを指定してやらないことには、XSI 様が働いてくれません。 XSI の Property って言ったら、例えば Visibility も Property ですし Rendermap も Property です。Explorer で白黒のグラデーションアイコンが付いているものは何でも Property です。 今回の場合、独自の Property を作るわけなので、CustomProperty  と指定してやります。 

次に false と出てきますが、AddProperty の場合これはブランチフラグです。与える Property を、シーンルートだけに与えるのか、シーンルートにぶら下がる子供オブジェクトたちにもブランチで与えるのかを指定します。false の時はブランチではなく、シーンルートのみに与えられます。true にするとブランチとして与えられます。

次に "hoge" と出てきますが、これは Property の名前です。独自 Property なので好きに名前を決められます。

以上が AddPropety の呪文の解説です。

次にイコールの左側を見ると、var oProp = となっています。これは、AddProperty の呪文の結果として作られた Custom Property を、oProp という箱の中に入れておけという意味です。 この後何度もこの Custom Property を呼び出すので、oProp に代入しておいて、以後は oProp と言ったらこの Custom Property のことを指しているんだからな、間違えんじゃねえぞドルァ と言っていることになります。


以上がこの行の説明ですが、こんなものは、スクリプトエディタ内で AddProperty の部分を選択状態にし、F1 キーを押せばヘルプ様が降臨して全部教えてくれます。 とにかくヘルプを読むことが近道です。各ページにはサンプルのスクリプトがあるので(2011 など最近のバージョンではサンプルのページへのリンクが貼られています)、まずはサンプルをコピペするのがいいと思います。 そして、あんまり深く考えずに、これはもうこういうもんだとして覚えてしまうのが手っ取り早いです。 俺もあんまり理解してないまま結果オーライでやってきてしまっています。 弊害もありますがまあそれはまた別の話。


さて、試しにこの行だけをペーストして実行してみて下さい。
シーンルートに hoge ができますよね?
hoge をクリックして PPG を表示させてみましょう。
Ui_12
こんな風に、中身が空っぽの PPG が表示されましたよね。
そりゃそうです。まだパラメータを作ってないんですから。
hoge は単にパラメータをまとめて入れておく入れ物であって、パラメータ自体を作ってなければ空っぽに決まってます。ガレージを作ったけど車はまだ買ってないという状態です。あるいは炊飯ジャーを新調したけどそこで金を使い果たして米が買えないような状態です。違いますか。まあいいや。なので次にパラメータを作ります。



oProp.AddParameter2("Icon",  siInt4,  1,  0,  10);
oProp.AddParameter2("Size",  siDouble,  1,  0.01,  100);

繰り返しになりますが、さっき oProp を指定してあるので、ここからはもう、oProp という言い方で Custom Property を表せます。oProp に対して以下の処理をしろよ、と言っているということです。

そして AddParameter2 という呪文を使ってパラメータを作っています。

最初の "Icon" というのは、このパラメータの名前です。自分で決められます。

次の siInt4 というのは、この Icon というパラメータは整数だぜ、と指定しています。
パラメータと言っても色んな種類があるわけで、整数だったり小数だったり、文字だったり、オンオフしか値を持てないブールというものだったりするわけです。テキトーに何かのオブジェクトの PPG を出してみればわかるでしょう。オブジェクトの Name(名前)というパラメータは、文字列です。でも、例えば sphere の分割数は数値です。数値は数値でも、整数というタイプの数値になります。 しかし同じ sphere でも Radius (直径)は倍精度数とか呼ばれるタイプの数値であり、小数点以下の値を持つことができます。こんな風にパラメータには色んな種類があるので、AddParameter2 の呪文を唱える段階でどのタイプなのか宣言する必要があります。 一度宣言してしまったら他のタイプを受け付けないパラメータになります。例えば分割数は整数なので、0.1 などという数値は入りません。”hogehoge" などという文字も入りません。 この Icon というパラメータの場合は、整数だと宣言したので、整数以外は入らないパラメータになりました。
ちなみに XSI で扱えるパラメータの値のタイプ全種は、ヘルプの中で siVariantType というのを調べればわかります。

siInt4 の次の 1 という数値は、デフォルト値です。この PPG が呼び出されたときに最初に入っている数値が 1 だということです。

次は 0 です。ここは最小値です。最小値よりも小さい値は、たとえ PPG に数値を手打ちしても入らなくなります。この場合は、-1 などと手打ちしても受け付けてくれず、勝手に最小値である 0 に上書きされます。

次の 10最大値です。10 は受け付けるけど 11 は受け付けません。
はい、これで最初の AddParameter2 の呪文終わり。

二つ目の oProp.AddParameter2("Size",  siDouble,  1,  0.01,  100); も同じですね。

 パラメータの名前は "Size" だぜ。
 パラメータの数値のタイプは siDouble (倍精度数)だぜ。
 デフォルトの値は 1 にしておけよ。
 最小値は 0.01 だ。それ以下の数値は拒否しろよ。
 最大値は 100 だ。101 とかを受け付けやがったら電気アンマかますぞウルァ

と言っていることになります。
はい、2つめの AddParameter2 呪文終わり。これも、まんま暗記するのが良いと思います。っていうか俺、暗記すらしていない。毎回 AddParameter2 のヘルプを見て、何番目の数字が何を指定しているのか確認しています。とにかく毎回ヘルプを見ることです。ここでは指定を省略した機能もいっぱいあります。例えば最小/最大値とは別に、UI 上に表示するときだけのスライダの最小/最大値を指定できたりもします。ヘルプ読めばわかります。



次、
var oLayout = oProp.PPGLayout;

これですが、PPGLayout ってのは UI 上のパラメータの並び方とかを指定するための、いわば「見た目」を司る魔法の呪文の受け皿みたいなもんですね。 「いいかお前、oProp の PPG が表示された時の見た目はだな、これから唱える一連の呪文に従ってもらうからな、以降はこれを oLayout と呼ぶから忘れんじゃねえぞノルァ」 と言っていることになります。

こんなん、もう暗記するしかないですよね。呪文だと思えばいいです。バルス。



次。
oLayout.AddItem("Icon",  "愛根");
oLayout.AddItem("Size",  " 砕図");


さっき宣言した oLayout、つまり oProp の「見た目」の部分に、AddItem の呪文を唱えています。

"Icon" ってのは、さっき AddParameter2 の呪文で作ったパラメータです。すでに作成済みのパラメータを、この AddItem の呪文によって UI にぶち込んでいくわけです。なのでさっき指定した名前と完全に一致したものでなくてはいけません。

次に "愛根" とありますが、これは UI 上に表示される名前 です。 スクリプトを書いていると、スクリプト書きの都合上はこういう名前がいい、でもその名前のまま PPG に出てしまうとユーザにとってはわかりにくい、ということがよくあります。だから、PPG 上のハンドルネームをつけよう、ということです。 この場合、本当は Icon という名前のパラメータなんだけど、PPG 上でだけ "愛根" という名前を名乗ろう。という意味です。
次の行の Size = "砕図” も全く同じです。

しつこいようですが、ヘルプで AddItem のページを見れば、カッコの中の何番目の数値が何を指定しているのか、一目瞭然でわかります。ヘルプを見ましょう。




次。

oLayout.AddButton("Set",  "切吐");

この AddButton というのは、ボタンを作るときの呪文です。oLayout に "Set" という名前のボタンを与えよ~ ただし PPG では "切吐" という名前で表示せよ~ と呪文を唱えているわけです。

ちなみにこのボタン、押しても何も起こりません。ボタンを押したらこれを実行せよ~という呪文を書いてないからです。 これはまた次回以降に書きます。たぶん。



次ラスト。
InspectObj(oProp); 

これは、ここまでの呪文で作った oProp つまり CustomProperty つまりこの場合 hoge を、PPG として表示せよという呪文です。  UI 作成とは直接関係ないですが、作った hoge プロパティを確認するためにいちいち Explorer からクリックするのがめんどくさいので、自動でポンと表示させるようにしているだけです。


以上であります。
別に難しくないです。
ひたすらヘルプ見ながらやれば、あっちゅう間にわかるでしょう。


ちなみにこのスクリプト、何度も実行させればシーンルートにどんどん hoge が増えていきます(名前は hoge1, hoge2 などとなりますが)。 毎回 oProp に新しい CustomProperty として作成しているからです。 現在はとりあえずこうしていますが、いずれは「もしシーンルートに hoge という Property があったらそれを表示する。無ければ新たに作る」という呪文も説明しようと思います。たぶん。


次回以降、

・ボタンを押したときに何かを実行させる
・もっといろんな種類のパラメータを作る
・ドロップダウンメニューとかを作る
・パラメータを横並びにする
・整理された見た目にするために、複数パラメータをグループ(ワク)で囲う
・スライダの大きさを変える
・ボタンの大きさを変える
・数値のくせにスライダが表示されない(つまり手打ちのみの)パラメータにする
・ファイルを指定するようなパラメータを作る
・あるパラメータの値が変わったら、他のパラメータの値も連動して変わるようにする
・スイッチのオンオフによってパラメータが出現したり消えたりする
・シーンルートとかに実体を残さない、その場限りの Property を作る

とかなんとかを、解説するかもしれません。しないかも知れません。わかりません。
ここまで書いて、想像していたより 64倍くらい大変だったので、次回以降は説明を大幅に省略して「いいからこう書いときゃできるんだよ」方式になる可能性が高いです。どうやら説明ビデオを作る方が圧倒的にラクなようです。でもビデオを作るのは、やり始める最初のエネルギーがとてつもなく必要になります。なのでやはりこうしてテキスト中心になる可能性が高そうです。



次回以降があれば、の話です。
わかりません。



.

|

« 画像で痛ポリ。 | トップページ | 友愛その2。 »

コメント

ご苦労様です。
いつもjunkiさんに技術公開しなさいとしかられつつ
披露するようなテクニックがないのでなにもできていませんが、
影ながら応援してます!

投稿: Mitsuhiro Arita | 2010年7月 2日 (金) 05時52分

とても勉強になります
vbsだとこんなかんじかなぁ

' CustomProperty を SceneRoot に作る。Branch はオフ。 
' 名前は "hoge"。 作られた CustomPropety は oProp に代入される
set oProp = ActiveSceneRoot.AddProperty("CustomProperty", false, "hoge")

' oProp(さっき作った CustomProperty)に、パラメータを追加する
set oParam1 = oProp.AddParameter2("Icon", siInt4, 1, 0, 10)
set oParam2 = oProp.AddParameter2("Size", siDouble, 1, 0.01, 100)

' PPGLayoutを作る
set oLayout = oProp.PPGLayout

' さっき作ったPPGLayout に、すでに作成してあるパラメータを登場させる
' AddItem メソッドで、作成済みのパラメータ名、UI に登場させる時の名前を指定。
set oLay1 = oLayout.AddItem("Icon", "愛根")
set oLay2 = oLayout.AddItem("Size", "砕図")

' ボタンを作るときは AddButton メソッドを使う
set oBtn = oLayout.AddButton("Set", "切吐")

' 表示しておしまい。
InspectObj(oProp)

投稿: 通りすがりのvbs勉強中 | 2010年7月 2日 (金) 10時26分

vbs勉強中さんこんにちは。

俺も普段は、set oParam = なんちゃら(JScript では var ですが)という風に、基本的に何かに代入する形で書きます。その後で oParam.ReadOnly = true とかを実行することも多いからです。今回は基本の第1回目ゆえにパラメータ設置後の処理を何もしていなく、ゆえに代入は必要なく、省略してしまいました。 Parameter はともかくとしても、AddItem の結果(PPGItemオブジェクト)は その後で oItem.SetAttribute を実行することがほとんどですので、普段は代入が必須になってます。

ただどうでしょうね、oLay1、oLay2 などと、パラメータごとに別の変数に代入する意味は薄いかもしれませんね。SetAttribute などを「後でまとめて」書きたい場合なら意味があると思いますが、俺の場合は設置するごとに逐一書いてしまうので、大抵の場合変数は新たに宣言せずリサイクルしてるかな。

変数名は何でもいいので突っ込むような話ではないですが、AddItem メソッドの戻り値は PPGItem オブジェクトですので、oLay1 とか言うよりは oItem1 とか言ったほうが分かりやすいかもしれません。っていうか俺はヘルプに載ってるサンプルの書きかたを真似してるだけなんですけどね。 どうでもいい話ですすいませんすいません。

vbs は Output Argument が使えるんですよね。そこがラクそうだな~といつも思ってます。

投稿: junki | 2010年7月 2日 (金) 14時14分

返信ありがとうございます!何でもかんでも代入していました・・・

1ヶ月前から勉強してなんか適当な物は作れるようになったのですが、
まだまだ基本的な部分が抜けているのでとても勉強になります。

次回の解説楽しみにしています^^

とりあえずシンプルにしてみました。
set oProp = ActiveSceneRoot.AddProperty("CustomProperty", false, "hoge")

oProp.AddParameter2 "Icon", siInt4, 1, 0, 10
oProp.AddParameter2 "Size", siDouble, 1, 0.01, 100

set oLayout = oProp.PPGLayout

oLayout.AddItem "Icon", "愛根"
oLayout.AddItem "Size", "砕図"

oLayout.AddButton "Set", "切吐"

InspectObj(oProp)

投稿: 通りすがりのvbs勉強中 | 2010年7月 3日 (土) 00時19分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217974/48770825

この記事へのトラックバック一覧です: 友愛その1。:

« 画像で痛ポリ。 | トップページ | 友愛その2。 »