XSIのプラグインでダイアログを使用する1

今回はC++プラグインでダイアログを作成する方法です。
一気にやってしまおうと思いましたが、解説の量が半端じゃなくなりそうなので、
まずは基本的なところを紹介したいと思います。

前回作成したNewCommand.cppのNewCommand_Execute関数の中にコードを追加していきます。
まずは空のダイアログを作成してみます。

ダイアログを作成するにはCustomPropertyクラスを使用します。

XSIPLUGINCALLBACK CStatus NewCommand_Execute( CRef& in_ctxt )
{
    Context ctxt( in_ctxt );
    CValueArray args = ctxt.GetAttribute( L"Arguments" );

    Application( ).LogMessage( L"NewCommand_Execute called" );
    // 
    // TODO: Put your command implementation here.

    Application app;
    Project project = app.GetActiveProject();
    Scene   scene   = project.GetActiveScene();
    Model   root    = scene.GetRoot();

    CustomProperty cpset;
    root.AddProperty( L"CustomProperty", false, L"Test", cpset );

    CValue retval;

    // 起動
    CValueArray inspect_args( 5 );
    inspect_args[ 0 ] = cpset;
    inspect_args[ 2 ] = L"NewCommand";
    inspect_args[ 3 ] =( LONG )siModal;
    inspect_args[ 4 ] = false;
    app.ExecuteCommand( L"InspectObj", inspect_args, retval );

    // 削除
    CValueArray delete_args( 1 );
    delete_args[ 0 ] = cpset;
    app.ExecuteCommand( L"DeleteObj", delete_args, retval );

    // 
    // Return a value by setting this attribute:
    ctxt.PutAttribute( L"ReturnValue", true );

    // Return CStatus::Fail if you want to raise a script error
    return CStatus::OK;
}

手順は、
1.シーンのルートにSceneItem::AddPropertyでCustomPropertyを登録する。(ModelはSceneItemの派生クラス)
2.XSIの内部コマンドInspectObjに渡す引数をCValueArrayを使用して設定する。
3.Application::ExecuteCommandを呼び出してInspectObjを実行する。
4.ここでダイアログが表示されて、OKまたはCancelのボタンを押すまで待機になる。
5.XSIの内部コマンドDeleteObjに渡す引数をCValueArrayを使用して設定する。
6.Application::ExecuteCommandを呼び出してDeleteObjを実行する。
以上です。
5,6の手順をとばしてもダイアログは表示されますが、
これをやらないとダイアログが削除されたことにならず、
ダイアログを立ち上げるたびにTest1,Test2と表示がカウントアップされていってしまいます。

これをコンパイルして実行すると以下のようなダイアログが表示されるはずです。
plugin11

次に簡単なアイテムを追加してみます。
上のコードの16~18行目の間辺りにさらにコードを追加します。
アイテムを追加するには、PPGLayout、PPGItemクラスを使用します。

    PPGLayout layout = cpset.GetPPGLayout();
    PPGItem   item;
    Parameter param;

    //--------------------------------------------------------------
    // スタティックなテキスト
    //--------------------------------------------------------------
    item = layout.AddStaticText(
        L"StaticText"
    );

    //--------------------------------------------------------------
    // テキストボックス
    //--------------------------------------------------------------
    cpset.AddParameter( L"test_string", CValue::siString, siPersistable, L"", L"", L"Default String", param );
    item = layout.AddString(
        L"test_string",
        L"String"
    );

    //--------------------------------------------------------------
    // エディットボックス
    //--------------------------------------------------------------
    cpset.AddParameter( L"test_edit", CValue::siString, siPersistable, L"", L"", L"Default Edit", param );
    item = layout.AddString(
        L"test_edit",
        L"Edit",
        true, 120
    );

アイテムを追加する基本的な流れは、
1.CustomProperty::AddParameterでパラメータを追加する。(StaticTextでは不要。)
2.PPGLayout::Add*関数を使用して、パラメータとレイアウトを関連付ける。
3.必要があれば、PPGItem::PutAttributeを使用して、アイテムの属性を変更する。
CustomProperty::AddParameterと、PPGLayout::Add*の第一引数は必ず同じでないと反映されません。

これをコンパイルして実行すると以下のようなダイアログが表示されるはずです。
plugin12

また、StaticTextとStringに関しては、以下のようなコードでも動作します。

    //--------------------------------------------------------------
    // スタティックなテキスト
    //--------------------------------------------------------------
    cpset.AddParameter( L"test_static_text", CValue::siString, siPersistable, L"", L"", L"StaticText", param );
    item = layout.AddItem(
        L"test_static_text",
        L"",
        siControlStatic
    );

    //--------------------------------------------------------------
    // テキストボックス
    //--------------------------------------------------------------
    cpset.AddParameter( L"test_string", CValue::siString, siPersistable, L"", L"", L"Default String", param );
    item = layout.AddItem(
        L"test_string",
        L"String",
        siControlString
    );

複数行のテキストボックスを作成するには、
PPGLayout::AddStringで第3引数をtrueにする方法しか無いようです。
(自分が知らないだけで実はあるのかも知れませんが…)


最後に、パラメータに設定された値をとってくる方法です。
上記のコードの下にさらにコードを追加します。

    // 入力を確認
    if( !( bool )retval ){

        app.LogMessage(
            L"test_string : " +
            cpset.GetParameterValue( L"test_string" ).GetAsText()
        );
        app.LogMessage(
            L"test_edit : " +
            cpset.GetParameterValue( L"test_edit" ).GetAsText()
        );
    }
    else{
        app.LogMessage( L"User cancelled" );
    }

ダイアログから制御が帰ってくると、retvalにブール値が格納されているので、
それがtrueだったらOK、falseだったらCancelされたと言う事になります。
パラメータの値を取ってくるには、CustomProperty::GetParameterValue()を使用します。
CValue形で帰ってくるので、必要な型にキャストして使用してください。
ちなみに格納されている型はAddParameterの第2引数で指定した型になっています。
このコードを追加するとログにテキストボックスとエディットボックスの内容が表示されるはずです。


今回はこの辺までにしておきたいと思います。
まだアイテムは他にもあるので、次の機会に紹介したいと思います。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です