« C4D ユーザスクリプトでダイアログの使い方も大体把握できた事だし… | トップページ | C4D C.O.F.F.E.E.メニュープラグインにダイアログを…02 »

C4D C.O.F.F.E.E.メニュープラグインにダイアログを…01

前回作成した最小限のフレームワークにモーダルダイアログを組み込んで見ます。

前回作成した最小限のフレームワークです。

/*
最小限のメニュープラグインのフレームワーク
2009.08.09
*/


//test_pluginクラス=========================================
class test_plugin:MenuPlugin
{
  public:
    test_plugin();
    GetID();
    GetName();
    GetHelp();
    Execute(doc);
}

test_plugin::test_plugin()
{
  super();
}

test_plugin::GetID()
{
  return 1000001;
}

test_plugin::GetName()
{
  return "test plug";
}

test_plugin::GetHelp()
{
  return "これはテストです。";
}

test_plugin::Execute(doc)
{
  println("メニューから呼ばれると、実行します。");
}


//メイン=================================================
main()
{
  Register(test_plugin);
}

モーダルダイアログは、ユーザスクリプトの時と同様、GeModalDialogクラスのサブクラスを定義し、サブクラス変数を宣言し、そのメンバ関数Open()を使用して開きます。

モーダルダイアログは、プラグインがメニューやアイコンから呼ばれたときに開くので、C4Dに登録したMenuPluginクラスのサブクラスのExecute()内で処理します。

では、組み込むモーダルダイアログです。

Dialog_09

//ダイアログ==============================================
class test_dialog:GeModalDialog
{
  public:
    var valu;

    test_dialog();
    CreateLayout();
    Init();
    AskClose();
}

test_dialog::test_dialog()
{
  super();
  valu = 100.0;
}

test_dialog::CreateLayout()
{
  SetTitle("test_dialogs");

  AddGroupBeginV(10000 , BFH_CENTER , 2 , "group" , 0);
    AddStaticText(10001 , 0 ,   0 , 0 , "項目" , 0);
    AddEditNumber(10002 , 0 , 100 , 0);
  AddGroupEnd();

  AddSeparatorH(0);

  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);
}

test_dialog::Init()
{
  SetFloat(10002 , valu , 0.0 , 10000.0 , 1.0);
}

test_dialog::AskClose()
{
  valu = GetFloat(10002);
}

さて、このモーダルダイアログをプラグインに組み込むには…

まず、メニューからこのプラグインを選択すると、MenuPluginクラスのサブクラスのExecute()メンバ関数が呼ばれます。

Execute()メンバ関数内で、このモーダルダイアログのtest_dialogクラス変数をnew()で割り当て、モーダルダイアログのメンバ関数Open()でダイアログを開きます。
ユーザスクリプトでダイアログを使う時と同じです。

test_plugin::Execute(doc)
{
  println("メニューから呼ばれると、実行します。");

  var dlg = new(test_dialog);
  dlg->Open(-1 , -1);

  if(!dlg->GetResult())return;

  //以後OKボタンを押した時の処理。
  println("okボタンが押されました。");
  println("入力された値 : " , dlg->valu);
}

ユーザスクリプトの時と全く同じです。
このプラグインの組み込みに成功しメニューから実行し、値を入力しOKを押すと、コンソールには次のように表示されます。

メニューから呼ばれると、実行します。
okボタンが押されました。
入力された値 : XXXXX

このスクリプトの全貌です。

/*
メニュープラグインのダイアログテスト
2009.08.09
*/


//test_dialogクラス=======================================

class test_dialog:GeModalDialog
{
  public:
    var valu;

    test_dialog();
    CreateLayout();
    Init();
    AskClose();
}

test_dialog::test_dialog()
{
  super();
  valu = 100.0;
}

test_dialog::CreateLayout()
{
  SetTitle("test_dialogs");

  AddGroupBeginV(10000 , BFH_CENTER , 2 , "group" , 0);
    AddStaticText(10001 , 0 ,   0 , 0 , "項目" , 0);
    AddEditNumber(10002 , 0 , 100 , 0);
  AddGroupEnd();

  AddSeparatorH(0);

  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);
}

test_dialog::Init()
{
  SetFloat(10002 , valu , 0.0 , 10000.0 , 1.0);
}

test_dialog::AskClose()
{
  valu = GetFloat(10002);
}


//test_pluginクラス=========================================
class test_plugin:MenuPlugin
{
  public:
    test_plugin();
    GetID();
    GetName();
    GetHelp();
    Execute(doc);
}

test_plugin::test_plugin()
{
  super();
}

test_plugin::GetID()
{
  return 1000001;
}

test_plugin::GetName()
{
  return "test plug";
}

test_plugin::GetHelp()
{
  return "これはテストです。";
}

test_plugin::Execute(doc)
{
  println("メニューから呼ばれると、実行します。");

  var dlg = new(test_dialog);
  dlg->Open(-1 , -1);

  if(!dlg->GetResult())return;

  //以後OKボタンを押した時の処理。
  println("okボタンが押されました。");
  println("入力された値 : " , dlg->valu);
}


//メイン=================================================
main()
{
  Register(test_plugin);
}

気付いていると思いますが、ユーザスクリプトの時と同じく、プラグインを実行すると必ず100がダイアログに入力されています。

さて、通常のツールであると、値を入力すると、次回プラグインを実行した時、前回の値を保持しています。

ダイアログに使用した変数valuをグローバル変数にするか…
ユーザスクリプトのグローバル変数は、ユーザスクリプトが実行されている間のみですが…
プラグインのグローバル変数は、組み込まれてC4Dが終了するまで…
なので、C4Dが起動している間は、プラグインのグローバル変数は保持されます。

では、変更してみましょう。
まずは、test_dialogクラスからメンバ変数valuを削除しグローバル変数valuとしてクラスや関数の外で宣言します。
test_dialogクラスのコンストラクタ内のvalu変数への代入を削除。

/*
メニュープラグインのダイアログテスト
2009.08.09
*/


//グローバル変数============================================

var valu;



//test_dialogクラス=======================================

class test_dialog:GeModalDialog
{
  public:
    test_dialog();
    CreateLayout();
    Init();
    AskClose();
}

test_dialog::test_dialog()
{
  super();
}

メニュープラグインの本体であるtest_pluginクラスのメンバ関数Execute()を変更。
グローバル変数の初期化は組み込み時のみに実行されるmain()関数でもできますが、今回は、Execute()関数内で行いました。
Execute()関数はプラグインがメニューから呼ばれる度に実行されるので、valu変数が初期化されていないか判別し、されていなければ、200.0を代入します。
メニューから呼ばれる度に判別されるので、やはりmain()関数内で初期化した方が良いかもしれません。

test_plugin::Execute(doc)
{
  println("メニューから呼ばれると、実行します。");

  if(!valu)valu = 200.0;

  var dlg = new(test_dialog);
  dlg->Open(-1 , -1);

  if(!dlg->GetResult())return;

  //以後OKボタンを押した時の処理。
  println("okボタンが押されました。");
  println("入力された値 : " , valu);
}

これで、メニューから呼び出されても、前回入力された値を保持してダイアログが開かれます。

これで、モーダルダイアログをメニュープラグインに組み込めるようになりました。
ダイアログの細かい部分は、ユーザスクリプトの時と同じなので省略します。

|

« C4D ユーザスクリプトでダイアログの使い方も大体把握できた事だし… | トップページ | C4D C.O.F.F.E.E.メニュープラグインにダイアログを…02 »