« 果てしなきコンストレイン。果てしないプラグイン。 | トップページ | 名前。 バージョンアップ。 »

2008年4月11日 (金)

さらばモーダル。

                  
 
 最近、GOTETZさまの書いた InteractiveThickness というプラグインを使ってみた。とても使い勝手が良いと思ったが、それは使った人ならわかるだろうからここでは触れない。それよか、PPG が表示されるにも関わらず、シーンのどこにもその PPG 自体が存在していないことに気が付いた。 あれえ? どうなってるの? PPG の実体がないのに PPGが表示されてるよ?
      
 ということで、恐れ多くもソースコードを拝見させていただくと、    
                                        
var oProp = XSIFactory.CreateObject( "CustomProperty" );
oProp.Name = "Interactive_Thickness";
この2行を発見した。ま、2行目は名前を付けているだけで重要ではない。着眼すべきは1行目である。 XSIFactoryオブジェクトの CreateObject メソッドは、XSICollection を作成する時にいつも使っている馴染み深いものである。しかし意味をわかって使っているのではなく、とにかく XSICollection が必要なときは

                                               
var コレクションの名前 = XSIFactory.CreateObject( 'XSI.Collection' );
と呪文を唱えればいい、くらいにしか思っていなかった。すいません、素人です。
      
 で、XSIFactory をマニュアルで調べてみたが、予想通り超簡潔な説明しか載っていなく、また日本語版のマニュアルは相変わらず無責任かつ超愚直 な直訳かつユーザ置いてけぼりな書き方しかされてないのでマシンを1台破壊して閉じてしまった。ただ、「シーングラフに残らない方法でオブジェクトを作る ときに云々」と書かれていたので気になった。
 次に CreateObject メソッドのページを見てみると、サンプルコードのコメントに、「この方法はカスタムプロパティの一時的なインスタンスを作るが、シーンに残らないので、 使った後にそのオブジェクトを削除する必要もない」という意味のことが書かれていた。 つまりこの方法でPPGを作った場合は、そのPPGはそもそもオブ ジェクトとしてシーンの中の階層に存在しない。InspectObjコマンドで開かれて、あとはウインドウを閉じられるまでの命である。ウインドウを閉じ たら永遠に消える。
      
 おおう、こんなことができたのですか。 なんとなく初めて読んだわけではないような、知っていたような、知らなかったような。 でもこの方法で使ったこ ともなければ深く考えたこともなかったので、まあ知らなかったと同じことだわな。これは便利かもしれない。
      
ちなみに1。 ここでいうオブジェクトとは通常の 3DCG のオブジェクトではなくプログラミング的な意味も含む広義のオブジェクトです。

ちなみに2。 SDKガイド日本語版は、サンプルコードのコメントは翻訳されていません。ここも重要だっちゅうの。わかってますかあなた。 SDK ガイドを翻訳した人。あなたです。 しかもあなた、CGのこともプログラミングのことも何も知らないでしょ。バレバレですよ。なんですかこのひどい翻訳 は。はい、そう、あなたのことです。

      
      
 で、たまたま GOTETZ さまとお話をさせて頂く機会に恵まれた。氏によると、シーンに余計なものを残さないためにこの方法を使っているとのことである。 しかも、PPG 内部のボタンを押すと自分自身を消去するようになっている。これも知らなかった。 試しに、シーンに実体が残るPPGにもこういうボタンを仕込んでみたと ころ、同じことができた。なるほど。やはりそういう使い方ですな。正しく使えばこれはとても handy ですな。目からウロコが落ちました。
      
 氏との話の中で、そしてその後の実験の中で、なんとなく俺的結論が出て来た気がする。
 これまでは、その場限りの使い捨て PPG を作るときは、シーンの中に実体があるオブジェクトとして PPG を作成し、それをモーダルモードで開き、モーダルウインドウをOKまたはキャンセルした後に消す、ということをやってきた。しかしモーダルPPG は処理を完全に奪ってしまうのがまず気に入らないし、使い捨てなので(1回使ったらもう要らない)、使用後に自動で消すルーチンを仕込まないとシーンにゴ ミが残ることにもなる。今ひとつスマートじゃないと思っていた。
      
 しかし、この XSIFactory.CreateObject で PPG を作り非モーダルモードで Inspect すれば、非モーダルゆえにPPG を開いたまま他の処理ができるし、手動で使用済みプロパティを削除する必要もない。 ひとつ手間が増えるとすればモーダルPPGと違ってOK/キャンセル ボタンがないため、処理を明示的に実行させるボタン、またはパラメータが変化したときに処理を起動するための logic function を仕込むことくらいである。特に問題はない。
 またはシーンに実体が残る PPG を作成したとしても、基本的には非モーダルPPGとして開くことにし、PPG内に自殺ボタン(自分自身を消去)を作れば、少なくとも Explorer から手動消去の必要はなくなる。
      
 うーむ、これはもう、モーダルPPG の出番がなくなってしまった気がする。
      
      
      
--------
      
 一応、モーダルとか非モーダルとかについて書いておくと。
      
 
 プリミティブの sphere を選んで Enter を押すと、

Nonmodal

 こういう PPG が出てきます。これが非モーダルPPGですね。 PPG を開いたまま他のオブジェクトを選ぶでも、シーンの何かのパラメータをいじるでも、メシを食うでも納期遅らせるでもモントリオールを爆撃するでも、何でも できますね。当たり前ですね。
      


 これと同じ PPG を、今度はモーダルモードで開くことにします。 スクリプトを書くことになります。                                                
InspectObj (null, siGeneralKeyword, null, siModal );            
sphere を選んだ状態で↑これを実行すると、

      

Modal

 ↑これがモーダルPPG ですね。OK/キャンセルボタンが付いていて、これを押すまでは一切の処理を奪われます。 他のオブジェクトを選ぶことも、シーンの何かのパラメータをいじることも、メシを食うことも納期を遅らせることもモントリオールを爆撃することも、何もで きません。
      
 しかもモーダルPPG は、PPGが開く初期位置も、ウインドウの大きさも決められません。少し大きめの PPG になるとすぐスクロールバーが出てきて、とても見づらい状態になります。そうなるとスクロールさせる必要が出てこないよう、PPGLayout を駆使して少しでも小さい UI にしようと必死の開発になります。消耗します。
      
 モーダルダイアログの説明 ( IT用語辞典 e-words )
 ↑この説明によると、非モーダルPPG は「モードレスダイアログ」というものに含まれるんでしょうかね。
 ちなみにカスタムプロパティなどではなく XSI の標準操作でモーダルPPG が出てくるのは、パッと思いつくのは UV (Texture_Projection)の名前を変更する時でしょうかね。 Animation > Sequence All とかもそうですね。 ああ、あとは Immed ボタンがオンの状態で色んなことをすると、モーダルPPG が出てきますね。その場でパラメータを確定するために。
      

--------


 ともかくモーダルPPG はこのように使い勝手が良くない。 ユーザに他のことをさせずにこのパラメータをまず決めさせないといけない、という時以外には使わない方がよさそう。ま ずは使い捨て PPG にモーダル使うのはやめよう。 ・・・という仮ルールを、今後のプラグイン開発で設定してみることにしよう。
      
      
 モーダルPPG よ、しばしの別れだ。
 いつかたくましくなって戻って来い。
 せめてウインドウの大きさと位置をユーザが決められるようになったら、
 何かの時に使ってやる。
      
      
      
      
参考にさせて頂いた GOTETZさまにこの場を借りてお礼を申し上げます。勉強になりました。
      
ちなみにですが、個人的な好みの問題もありますが、Interactive Thickness はやはり、PPG をシーンに実体として残す方が使いやすいと感じています。最初に厚みを仮に決めて、邪魔なのでPPGは閉じた状態で他のオブジェクトの具合などを調整し、 あとからもう一回 PPG を開いて厚みを再調整したいことが多い。しかし現在の仕様では、ウインドウを閉じると PPG は永遠に失われます。まあ weld と push は生きているわけで、そこを手でいじればいいと言えばいいのですが。
      
なので自分は勝手に、シーンに PPG が残るように改造して使わせて頂こうと思います。
もし次のプロジェクトでガンガン使うことになれば、どっちが自分のワークフローに合うか答えも出るでしょう。
      




そういえば、SI3D の頃って、PPGと言えばモーダルモードしかなかった気がする。ウインドウ開いたらOKするまでは何もできないという。 その場でパラメータ決めないといけないという。 おそらく当時の Power Animator など、ウインドウ開いたまま作業するスタイルの3Dソフトウェアを見ると、おおおー なんかかっこいいーと思ったものでした。

|

« 果てしなきコンストレイン。果てしないプラグイン。 | トップページ | 名前。 バージョンアップ。 »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: さらばモーダル。:

« 果てしなきコンストレイン。果てしないプラグイン。 | トップページ | 名前。 バージョンアップ。 »