« 乳カメラ。お乳なカメラを作るプラグイン。 | トップページ | ClassID でもストーク。 »

2008年6月17日 (火)

GUID でストーク。

                  
先日のプロキシセレクトプラグインの話で有り難きコメントを頂き、早速実験してみました。 オブジェクトの名前や Model 階層が変わっても、どこまでも、いつまでも、執拗に追いかけられるサンプルです。
      
  粘着質でしつこい女。 どこまででも追ってくるストーカー。
  名前を変えても、住所(Model階層)を変えても、必ず追いかけてきます。
  こうなったらもう、死ぬ(Delete)しかありません。
  嫌な女です。
      

Stalker_guid_ppg


スクリプティングに興味のある方は、オブジェクトが適当に多いシーンを開いて、以下のスクリプト(JScript)をスクリプトエディタにペーストして実 行してみて下さい。                                                
//Stalker.js

// ****** カスタムプロパティ作成
var oCProp = XSIFactory.CreateObject('CustomProperty');
oCProp.name = 'ストーカー ~ あなたを絶対逃がさない ~';
            
// ****** UI 作成
var oLayout = oCProp.PPGLayout;
oCProp.AddParameter3('sGUID',siString,'');
oCProp.AddParameter3('sName',siString,'','','',false,true);
oLayout.AddRow();
    oLayout.AddItem('sGUID','GUID');
    oLayout.AddButton('GetGUID','GUID取得。');
oLayout.EndRow();
oLayout.AddItem('sName','(元の)名前');
oLayout.AddSpacer(0,10);
var oItem = oLayout.AddButton('Stalk','ストーク。');
oItem.SetAttribute(siUICX,300);
            
// ****** ボタンに機能割り当て
oLayout.Logic =    GetGUID_OnClicked.toString()+
               Stalk_OnClicked.toString();
oLayout.Language = 'JScript';
            
// ****** 選択中のオブジェクト(最初の1個)から GUID をゲット
function GetGUID_OnClicked()
{
    if (Selection.count !=0)
    {
        var oDataRep = XSIUtils.DataRepository;
        GUID = oDataRep.GetIdentifier( Selection(0), siObjectGUID ) ;
        PPG.sGUID.value = GUID;
        PPG.sName.value = Selection(0).fullname;
    }
    else
    {
        var Msg = XSIUIToolkit.MsgBox('つけまわす人を選んどけっての。( ゚Д゚)オラ!',siMsgOkOnly,'ストークする気あんのかゴルァ');
    }
}
            
// ****** Scene_Root 以下のすべてのオブジェクトから、GUID が一致するものを探す
function Stalk_OnClicked()
{
    if (PPG.sGUID.value != '')
    {
        var oChildren = ActiveSceneRoot.FindChildren();
        var oDataRep = XSIUtils.DataRepository;
        Flag = 0;
        for (var i=0; i<oChildren.count; i++)
        {
            GUID = oDataRep.GetIdentifier( oChildren(i), siObjectGUID ) ;
            if (PPG.sGUID.value == GUID)
            {
               Flag ++;
               SelectObj(oChildren(i));
               CenterSelection(null,true);
               FrameSelection(null,true);
               Msg = 'みーつーけーたーわーよー   ヽ(°▽、°)ノエヘヘヘヘ';
               if (oChildren(i).fullname != PPG.sName.value)
               {
                   Msg += '\r\n\r\n' + '名前を変えても無駄よう~   ヽ(°▽、°)ノ ケケケケケケ';
                   Msg += '\r\n\r\n' + '元の名前 = ' + PPG.sName.value;
                   Msg += '\r\n' + '今の名前 = ' + oChildren(i).fullname;
               }
               var Msg = XSIUIToolkit.MsgBox(Msg,siMsgInformation ,'ストーク成功。');
               break;
            }
        }
        if (Flag == 0)
        {
            var Msg = XSIUIToolkit.MsgBox('・゚・(つД`)・゚・  どこへ行ったのっ !!!',siMsgCritical,'あなたの大切な人は死にますた。');
        }
    }
    else
    {
        var Msg = XSIUIToolkit.MsgBox('つけまわす人を決めとけっての。(#゚Д゚)ドルァ!!',siMsgExclamation,'ストーク する気あんのかゴルァ');
    }
}
            
InspectObj(oCProp,null,null,siLock);
            
      
で、1つだけオブジェクトを選んで GUID取得。 ボタンを押して下さい。 
その後、ストーク。 ボタンを押してみて下さい。 GUID を確保したオブジェクトをストークできるはずです。
次に、そのオブジェクトの名前を変えて、またストークしてみて下さい。まだストークできるはずです。
次に、オブジェクトを他の Model 階層にぶち込むなどして、またストークしてみて下さい。ストークできます。
次に、そのオブジェクトを削除してからストークしてみて下さい。今度はストーク失敗するはずです。
      
ということで、削除しない限り、名前が変わろうが住所が変わろうが、GUID は唯一かつ不変であるため永遠に関係を保てる、という風に見えます。 試しにそのオブジェクトを複製して新たに GUID を取得してみると、ちゃんと別の GUID が割り当てられています。マニュアルによると、日付や場所やネットワークカードのIDを使って乱数を発生させて GUID を決めているようです。
      
これを利用すると、先日のプロキシセレクトプラグインの「名前を変えたりするともう関係が保たれていない」の問題を解決できそうな気がします。 Thiago さまに提案してみようかしら。どきどき。
      
有用な情報のヒントを下さった氏に感謝します。
      
      
      
      
ところで全然別の話なんだけど、スクリプティングにに詳しい方に質問させて頂きます。
上記のスクリプトで、シーン内の全てのオブジェクトを取得するのに
                                                              
var oChildren = ActiveSceneRoot.FindChildren();
            
を使っているのですが、これだと3Dオブジェクト(X3DObject)しか取得できません。 GUID は 3Dオブジェクトに限らず Pass だろうが Group だろうが Property だろうが何にでもあるわけで、その証拠に上記のストーカースクリプトにおいて、Pass だのなんだの3Dオブジェクト以外のものを選んでいてもちゃんと GUID を取得できます。しかしその後のストークの段階で ActiveSceneRoot.FindChildren(); を使うことによって捜索対象を3Dオブジェクトに自ら限定してしまっているため、ストークできないことになっています。
      
このように、Pass だろうが Property だろうが全てを対象に、つまり XSI のシーン内に存在するありとあらゆるものをひとまとめに取得する方法はあるでしょうか?  ActiveProject.ActiveScene.GetEverything(); みたいなことができればいいのですが。
      
詳しい方がいらっしゃいましたら、何卒教えて下さいませ。
      
      

|

« 乳カメラ。お乳なカメラを作るプラグイン。 | トップページ | ClassID でもストーク。 »

コメント

GUIDと一緒にCLSIDをチェックしておけばFindObjectsでストーク範囲が限定できるっぽいです
http://www.ceres.dti.ne.jp/xb1080/GUID.zip

注意:自己インストールカスタムオペレータを探すには、{72936430-9B0C-4167-8CA7-C30FC2188BB9}を使用します。また、自己インストールカスタムプロパティを探すには、{76332571-D242-11d0-B69C-00AA003B3EA6}を使用します。

上二つをストークするときはあらかじめtypeみておいて、CLSIDに代入しておけばおkぽいです

一発でfindできないんすかね(・ω・)

投稿: りんぷる | 2008年6月17日 (火) 23時45分

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: GUID でストーク。:

« 乳カメラ。お乳なカメラを作るプラグイン。 | トップページ | ClassID でもストーク。 »