« 取得 その1。 | トップページ | 取得 その3。 »

2010年10月11日 (月)

取得 その2。

では取得行きましょう。

    var oRoot = ActiveSceneRoot;

はい、これでシーンルートが取得できました。 細かいことはともかく、こう書けば、現在開いている XSI シーンの、シーンルートというものを取得できた、と覚えてしまえばいいです。

で、ActiveSceneRoot のヘルプのページを見てみましょう。 スクリプトエディタ上で ActiveSceneRoot という文字を選択し、F1 を押します。

すると「アクティブなプロジェクトのアクティブなシーンのルートModelを戻します」という説明があります。  「戻します」という言い方は Return Value つまり戻り値というものを意識しての記述だと思いますが、「取得します」と同じ意味と思って差し支えないと思います。 「シーンルート Model を取得します」 と同義だということです。


で、ここで大事なのが、取得できたものはいったい何オブジェクトなのか? ということです。 ActiveSceneRoot で得られるオブジェクトは、Model オブジェクトです。 まあそりゃそうですよね。XSI をそれなりに使っている人ならわかると思いますが、シーンルートって、XSI にとってはただの Model ですからね。 ただし削除できないとか他の Model の子供なれないとか、シーンルートならではの特別な性質もありますけどね。でも基本的にはただの Model です。エクスプローラやスケマティック上のアイコンも Model の人型アイコンですよね。
Shutoku21

SDK Explorer というものを使っても、それを確認できます。エクスプローラでシーンルートを選択し、Ctrl + Shift + 4 あるいは GUI 上のトップメニューから View > Scripting > SDK Explorer で開くことができます。
Shutoku22
ClassName のところに Model とあるじゃないですか。 同様に、Create > Model > New Model で普通に Model を1個出して、SDK Explorer で見てみましょう。やはり ClassNameModel となってますよね。 これは Model というオブジェクトである、という意味だと思って良いと思います。例外があるかも知れませんが、んなこた知りません。どーでもいいです。厳密にならないことが、スクリプティングの初期においては最も重要です。

ってことで、 シーンルート= Model オブジェクトを取得できました。  Model オブジェクトを取得できたってことは、Model オブジェクトに対する操作は何でもできるようになったということです。ここが重要です。取得さえしちまえばなんでもできるんです。もうあなたは自由です。大空に羽ばたいてください。




ちなみに var oRoot = という記述によって、ActiveSceneRoot で取得できた Model オブジェクトは oRoot という名前の変数にアサインされました。 なので、以降 oRoot と書けばそれは シーンルートを表します。

ためしに、こう書いて実行してみましょう。

    var oRoot = ActiveSceneRoot;
    Logmessage ( oRoot );

スクリプトエディタ上に Scene_Root と表示されましたよね。 2行目の Logmessage は、スクリプトエディタ上に何かを表示させるための呪文です。死ぬほど使うので覚えましょう。 で、oRoot を表示しろ、と指令したところ、Scene_Root と表示されているんだから、ちゃんと oRoot の中身はシーンルートが入っているということがわかります。 ためしにシーンルートの名前をテキトーに変えて、再びこの2行のスクリプトを実行してみましょう。 するとリネーム後の名前が表示されるはずです。 このことから、ActiveSceneRoot によって、シーンルートの名前がなんであろうと、ちゃんと現在開いているシーンのトップ階層のルートが取得され、そして取得されたオブジェクトは oRoot に格納されたということがわかると思います。

oRoot の部分は自分で好きな名前を付ければいいと思います。 でも aaa とか bbb みたいな意味不明な名前にしてしまうと後で自分で意味がわからなくなり、スクリプトが大きくなるにつれ収集が付かなくなり、ついにはブチ切れて、まるで内田裕也のようにマンションの10階からモニタやPCを遠投することになるので不経済です。なるべくそれらしい名前にするといいと思います。今回はシーンルートを取得したので Root という言葉を使い、かつシーンルートをオブジェクトとして取得しているので object の o を頭に付けて oRoot としています。

余談ですが、実はこの ActiveSceneRoot というのは省略形であり、省略しないと Application.ActiveSceneRoot という書き方になります。 でも今はどうでもいいです。余談です。忘れてください。


で、シーンルートつまり Model オブジェクトを取得できたんだから、Model オブジェクトのヘルプを見てみましょう。色んなことができるのがわかります。
Shutoku23

では取得した Model オブジェクトを使ってなんかやってみましょう。

    var oRoot = ActiveSceneRoot;
    var oNull = oRoot.AddNull( "hoge" );


2行目を追加しました。 oRoot の中に格納された Model オブジェクトに対し、AddNull メソッドを使って null を追加しています。 カッコの中に何を書いてあるのかは、AddNull のヘルプを見ればわかりますが、null の名前です。AddNull のヘルプページにたどり着くには、キーワード検索してもいいですが、Model オブジェクトのヘルプページのメソッド一覧にも載っているので、そこからリンクをたどってもよいです。

こうして、「シーンルートに null をひとつ追加する」 というスクリプトが書けました。こんなもん何の役に立つのか、と言われるともちろんそのまんまでは役に立たないのですが、何事も基本からであります。基本をわかってしまえば、このスクリプトにほんのちょっと手を入れるだけで、例えばぬるぬるボンデージのようなツールができます。 ぬるぬるやボンデージは、そこそこ役に立つツールだと思います(俺は日常的に使っています)。 ちょっとのことで、普段役に立つツールができるんです。 ほんとだってば。

そして、AddNull メソッドで得られた null は、Null オブジェクトです。SDK Explorer で null を見てみましょう。 ClassName に Null とあります。では SDK ガイドで Null オブジェクトのページを探してみましょう。
Shutoku24
ありました。 説明には「 Nullオブジェクトは特化されたX3DObject オブジェクトであり、空間内にある大きさを持たないポイントです」だとか何とか書いてます。そして Null オブジェクトに使えるプロパティやメソッドがずらりです。 もう oNull という変数の中に Null オブジェクトを取得済みなのですから、Null オブジェクトに対する操作は何でもできるようになったということです。ここが重要です。もうあなたは自由です。大海原をこぎ出してください。

  var oRoot = ActiveSceneRoot;
  var oNull = oRoot.AddNull( "hoge" );

  var oChildNull = oNull.AddNull( "hage" );
  oNull.size.value = 0.5;
  oNull.primary_icon.value = 2;
  oChildNull.size.value = 0.1;
  oChildNull.primary_icon.value = 3;

こんな風にしてみました。

3行目の

    var oChildNull = oNull.AddNull( "hage" );

ですが、oNull に対して、つまり最初にシーンルートに AddNull メソッドでゲットした1つ目の null に対して、さらに AddNull メソッドしてます。つまり、1つ目の null の子供として新たな2つ目の null が作られます。名前は hage です。 hage は、oChildNull という変数に格納されます。
Shutoku25

そして、oNull や oChildNull に対して、null のサイズや null のアイコンを設定しています。これで、新たな null を既存の null にぶら下げたり、そのサイズやアイコンを変えるというスクリプトになりました。


ここで疑問に思うのが、primary_icon.value という言い方や size.value という言い方がマニュアルに載っているのか? ということです。 Null オブジェクトに対してできる全ての操作は Null オブジェクトのヘルプページに載っているというようなことを言ってきましたが、Null オブジェクトのページを見ても primary_icon.value とか size.value とかは載っていません。

 実は上記のスクリプトは若干省略した書き方をしてあり、省略せずに書くと、

    var oRoot = ActiveSceneRoot;
    var oNull = oRoot.AddNull( "hoge" );
    var oChildNull = oNull.AddNull( "hage" );
    oNull.ActivePrimitive.Parameters( "size" ).value = 0.5;
    oNull.ActivePrimitive.Parameters( "primary_icon" ).value = 2;
    oChildNull.ActivePrimitive.Parameters( "size" ).value = 0.1;
    oChildNull.ActivePrimitive.Parameters( "primary_icon" ).value = 3;


こうなります。あ、ややこしくなったからってここで読むのやめないで下さい。こんなややこしいこと考える必要はないとう話を以下でするので。

上記の省略してない書き方を一応解説すると、Null オブジェクトが持つ Primitive オブジェクトにアクセスし、Primitive オブジェクトが持つ Parameter オブジェクトにアクセスし、その中で size という名前でより分け、値を 0.5 などとセットしてやる・・・・という書き方です。SDK ガイドで Null オブジェクトのページを起点にし、リンクをこの順でたどっていけば、ちゃんと全部書かれています。つまり「ちゃんとマニュアルには載っている」ということになります。

でもちゃんとマニュアルに載っていれば何でも理解できるのか、記載さえあればスクリプト書けるようになるのかというと、これはまた別の話です。 はっきり言ってこんなややこしいこと、さっぱりわかりません。

じゃあどうするかと言うと、スクリプトでやりたいことを、まずは GUI 上でやってみるのです。 この例で言えば、null の PPG を開き、手でサイズやアイコンを変えてみればいいのです。
Shutoku26
すると、スクリプトエディタにログが残ります。 

      SetValue("hoge.null.primary_icon", 2, null);
      SetValue("hoge.null.size", 0.5, null);


とか出ています。 ここに出ているログはコマンドで値を変える場合の書き方です。でも今は Null オブジェクトを取得した上で、オブジェクトモデル的に操作しようとしているので、ここをヒントにオブジェクトモデルで書き直します。

書き直すって言っても大したことではありません。まずはログを見て、「ああ、アイコンを変えるには primary_icon というやつに何かをセットしてやればいいんだな、今 Ring にセットしたら 2 という数字が出ているから、2 を primary_icon に入れてやればアイコンが Ring になるんだな」 と想像をつけます。

で、取得済みの Null オブジェクトに対し、

  oNull.primary_icon.value = 2;

と書いて実行してやれば、予想した結果が得られたことがわかります。 値をセットする時は、何でもかんでも .value = 値 という書き方になると覚えてしまいましょう。

このようにして、何かをやろうとする時、いちいち真面目にマニュアルのリンクをたどってやりたいことが載っているかどうかを調べるのではなく、まず○○オブジェクトを取得するとこころまでをやり、その後は GUI で適当に何か操作をしてみて、ログされる結果から予想し、書いてみて、予想通りになったらそれでOK、ならなければ俺はどっかで勘違いしてるぞということで更に調べる。 これを繰り返して覚えていきます。 初心者はそうやって覚えろと言っているわけではなく、初心者じゃない人も普段こうやってスクリプト書いてると思います。俺はそうしてます。日々それの繰り返しです。


ちなみにですが、オブジェクトモデルとコマンドが混じってはいけないなんてことはありません。 なので、○○オブジェクトを取得する、というオブジェクトモデルな操作をした後、値をセットするのはコマンドで書く、というのは全然アリです。 というかモノによってはコマンドでセットする以外に無い場合もあるので、両者混在したスクリプトはいたって普通です。

この例の場合は、

    var oRoot = ActiveSceneRoot;
    var oNull = oRoot.AddNull( "hoge" );
    var oChildNull = oNull.AddNull( "hage" );

    SetValue( oNull + ".null.size", 0.5, null);
    SetValue( oNull + ".null.primary_icon", 2, null);
    SetValue( oChildNull + ".null.size", 0.1, null);
    SetValue( oChildNull + ".null.primary_icon", 3, null);

こう書いても良いと言うことです。前半で Null オブジェクトを取得し、後半はコマンドを使ってその null のパラメータを書き換えています。 GUI で値をいじった結果ログされるのが

      SetValue("hoge.null.primary_icon", 2, null);
      SetValue("hoge.null.size", 0.5, null);


なんだから、この null の名前である hoge の部分のみ、取得済みの oNull に置き換えてやるだけです。 hoge という文字を取っ払い、 「 oNull + 」 を頭につなげます。 oNull には hoge が入っているんだから、結果的に hoge.null.primary_icon と書いたのと同じことになるわけですね。 なんでもかんでもオブジェクトモデルでやるのがつらいと感じた時は、取得までできたら、以降コマンドで書いちまうというのも手ですね。





ダメだ、まとまらない。
ともかく、「俺は今何を取得しているのか」 というのを常に意識しておくのが大事だと思うんですよね。  スクリプトなんて、ちゃんと理解してなくても動いていればOKというもんではありますが、今俺の手中にあるもの=取得できているものは何なんだ? ということがわかっていれば、色んなことがすんげーたやすくなるんです。 だから、取得という切り口でスクリプトをおベンキョする、っていう考え方を提示したかったのですが、どうなのか。  まあ、また時間とやる気のある時に、「取得して何かやる」というサンプルを書いてみようと思います。




うーむ、なんかやっぱり、スッキリわかり易く書けてない気がしますね。
わかりますかねこんなんで?
概念的な話、しくみの説明をし過ぎている気がしますが、どうなんだろう。

ま、しつこいですがサンプルのスクリプトを溺れるように見ていくしかないですね。この記事も、前回「カンニング」と言ったように、サンプルの提供、つまりカンニング元にさえできれば多少の価値はあるのではないかと思っています。 取得の仕方のサンプル、取得した後にやる操作のサンプル。 そういったものを溺れるように見ていくうちにわかっていくものです。

その道のりは、超簡単とまでは言いません。やはり「わかんねえよ、どうすりゃいいんだよ」というストレスを感じる時期はどうしても通過せねばなりません。 しかし、超難しいわけでは全然ないです。参考書の1冊も持っていない俺が何とか理解できてるくらいなんですから。 わかんねぇよというストレスが体に馴染んでくると、こっちのもんです。わかんねぇことはわかんねぇまま、持っておけばいいんです。 わかんねぇからやめるとか、わかんねぇから更に調べてもっとわかんなくなってイライラするとかではなく、わかんねぇけどとりあえずここだけはどうにかなったように見える、というような実に半端で曖昧でストレスもある状態を受け入れてそこに身を浸しておくのです。 あるいはわかんなくてもいいからサンプルをダラダラと見ては、挫折しない程度に少しのトライを続けるのです。すると、いつのまにかわかっていることもあれば、わかってはいないんだけど結果的にやりたいことはできてるように見えるからわかんねぇこと自体を問題視しなくなる、という状態になって行きます。 ←俺は今ココです。

俺がここに書いていることは、全部マニュアルで調べて理解して来たのではない、というところが重要だと思います。 むしろ逆。 わかんねぇからひらすらカンニングしながらごちゃごちゃやってきて、ある程度わかった気になったくらいの時点でマニュアルを調べたらこう書いてあった、って感じですね。 よく「マニュアルに全部書いてあるから読め」とか言いますが、わかんねぇうちはマニュアル見てもわかんねぇんですよね。 わかってから初めてマニュアルに書いてあることの意味がわかる、って感じですよね。 だからマニュアルが意味不明でもダイジョーブ、逆の順番でどうにかなるもんです。

また、カンニングの最も手っ取り早い方法は「人に聞く」です。知っている人が近くにいるとすげえ助かります。 俺は近くにはいなかったので、SDK ガイドのサンプルスクリプト、およびインターネット上に転がっているものをカンニングすることが主体になりました。多少つらいと感じた時期はあるかな。 あとは、有償サポートに質問するのと、WEBフォーラム上で質問するというのはありましたね。 質問できる人間と仲良くしておくというのが最も良いです。

俺は気まぐれでこんな記事を書いているだけなので人様の助けを積極的にしようなんてつもりは毛頭無いのですが、基本的なことなら、質問してくれれば答えられるかもしれません。○○オブジェクトってどう取得するの? ○○のコンストレインだけ削除したいんだけど、何をどう取得すればできるの? みたいな話なら、このブログ上でできるんではないのかな、という気もする。自分の研究にもなるというメリットがあれば、そういうことをしてみたいという気分はある。

まあ、気前のいいようなこと書いちゃって、勘違い野郎が変な質問してきたりするのが怖いんですがね。前にもあったからなあ・・・。 



たぶんつづく。

.

|

« 取得 その1。 | トップページ | 取得 その3。 »

コメント

>わかんねぇことはわかんねぇまま、持っておけばいい
自分もわかんなくなったら積んどきますw
わかんなくても動いたら良しとしますw
ほっといても別の機会で理解が進んだりしますからねー

投稿: ringpull(りんぷる | 2010年10月11日 (月) 23時52分

御無沙汰してます。順調に生育してますか。


わかんなくても動いたらよし。 もちろん基本です。

しかし、わかんなくて、それゆえやっぱり動かない場合でも、やはり積んでおくのです。
わかんないことをヤダーと言うのではなく、わかんないモヤモヤのストレスフルな状況を受け入れればいい、という意味で書きました。


そのわかんなさが体に馴染んでくると、ひとつきっかけがあればわかるぜという、「理解準備ヨーシ」という状態になる気がするんです。 例えばリニアカラースペースワークフローとか、俺、何度読んでもわかりません(読んでるだけで実践が少ないのがいけないんですが)。 最近そのわかんなさが馴染んできたような気がして、しめしめと思っています。 この状態で、本番の仕事で作業せざるを得ない状況があったりすると、何か小さいことをきっかけに、イッキにわかったりします。 急にわかったという自覚はなく、やってるうちに当たり前のように思えてきて、後日ちゃんとわかったあとに振り返ってみると、ああ、俺はここでつまづいていたんだな、ここを勘違いしてたんだな、という風に分析できるみたいな感じだと思っています。

っていうか、俺のスクリプト関係の文章で、ヤヴァいところないですか。りんぷるさんや garu さんからどんなすごいツッコミが来るかと、毎日おびえているんですよ。いやほんとに。

投稿: junki | 2010年10月12日 (火) 00時11分

知らなかった事とか出てきたりするので楽しみにしてますよ、
友愛のプロパティ右クリックでリフレッシュとか知らなかったですしw

投稿: ringpull(りんぷる | 2010年10月12日 (火) 17時01分

あんまり楽しみにされるとキンチョーします。

「それ違うぜ」など突っ込みどころがあれば、どうか遠慮なく突っ込んで下さい。期待しています。

投稿: junki | 2010年10月13日 (水) 00時44分

とてもわかりやすいです。

読んでいたら「子ゲッチュ」が書けるんではないかとやってみた所、
書く事ができました。
4日間便秘した末に、浣腸一発で綺麗さっぱり出し切った気分です。

んで、質問なのですが
例えば
Selection.Add( Object, SelectionMode )と書いた時の
ObjectタイプにはCollection(集合体)はサポートされていないって考え方であっていますか?
Objectタイプの所にfindchildrenメソッドを使って子供を選択しようとしたのですが
怒られちゃうんですよねえ。


あと色々とカンニングしたいのですが…
例えば「子ゲッチュウ」走らせてもスクリプトエディタには
KoGetyou();  としか出ませんよね…?

そうではなくて、どんな手順でスクリプトが走っているのか見る方法はありませんか?


投稿: maruyama | 2010年10月15日 (金) 23時21分

あー、書き込み間違えてますね…

Collectionが駄目なんじゃなくて
findchildrenメソッドがサポートされていないって事ですかね。

あと自分で「子ゲッチュウ」的な物が書けたと思ったら
3階層くらいある一番上の子供を選択して実行すると
2階層目を選択するんではなくて
何階層目であろうが子供全部選択するスクリプトになってました…。

まだまだ便秘が続きそうです…。
お恥ずかしい。

投稿: maruyama | 2010年10月15日 (金) 23時40分

てめえ質問する前にビールよこせドルァ

投稿: junki | 2010年10月16日 (土) 01時19分

maru ちゃん、  ってことで、取得3に書きました。 FindChildren もちょうど書こうと思っていたが、子ゲッチュには必要ないので登場しません。別記事で登場することになるでしょう。


KoGetYou()の中身を見る方法は、また今度。 ま、プラグインマネージャからアドオンの所に降りてってコマンドを右クリック>Edit でいいんだけどね。


昔ならタダで教えてあげられたんだけどなあ。今となってはビールだウルァ。けけけけ。

投稿: junki | 2010年10月17日 (日) 09時17分

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 取得 その2。:

« 取得 その1。 | トップページ | 取得 その3。 »