« C4D C.O.F.F.E.E.メニュープラグインにダイアログを…02 | トップページ | C4D チュートリアル »

C4D ユーザスクリプトでモードレスダイアログを考えてみる…

前回は、メニュープラグインにモードレスダイアログを組み込みました。

C4Dが起動している間ずっとグローバル変数を保持できないユーザスクリプトに組み込むとどうだろう?
前にも取り上げたような気がするが…

モードレスダイアログに必要な手続きを考えてみよう。

  • C4D起動中の間保持できるグローバルにダイアログを割り当てる。
  • GeDialogクラスのサブクラスを使い、コンストラクタからsuper()の引数にプラグインIDを渡す。
  • C4Dがレイアウトを構築した中に、プラグインのダイアログが含まれていれば、ダイアログのメンバ関数RestoreLayout()でダイアログをレイアウトに組み込む。

さて、この3つの項目について考えてみよう。

まず1つ目…
C4Dが起動中ずっと保持できるグローバル変数…
ユーザスクリプトでは無理なので、ユーザスクリプトが実行中の間だけ保持できるユーザスクリプトのグローバル変数を使う。
ユーザスクリプト実行中だけ、モードレスダイアログを使えれば良いのだ。
ユーザスクリプト終了時に、強制的にモードレスダイアログを閉じれば問題ないだろう…
要するに使用を制限をすれば良いのだ。

2つ目…
ダイアログのコンストラクタからsuper()の引数にプラグインIDを指定する。
これは、使用するユーザスクリプトを一度保存して、コマンドマネージャを参照してユーザスクリプトのIDを確認。
このIDをsuper()の引数にすれば問題なし。

3つ目…
C4Dがレイアウトを構築した中に、ユーザスクリプトのダイアログが含まれていた時の処理。
ユーザスクリプト自体がメニュープラグインのようなもので…
ただ、C4Dがレイアウトを構築したとき、メニュープラグインのダイアログが含まれると、そのプラグインのRestoreLayout()が呼ばれますが、ユーザスクリプトには該当するものがありません。
組み込んだレイアウトを保存しなければ問題は無いのですが…
ユーザスクリプトを組む人の制限ではなく、ユーザスクリプトを使う人に制限しなければいけません。
スクリプト中で、レイアウトに組み込めないような処理ができれば良いのですが、そのような機能はありません。
組み込んでも問題ないので、レイアウトさえ保存されなければ良いのだ…でもレイアウトの保存を禁止できる処理もできません。
仮に、組み込まれたレイアウトを保存され呼び出されても、カラのダイアログが組み込まれるだけだろう…

さて、そうすると、なんとなくできそうな気がするが…
ここで、一つの疑問が…

ユーザスクリプトの終了はどの時点だろうか?
ダイアログが閉じたとき?
モードレスだからC4Dの操作もでき、ダイアログでの操作もでき…
そもそも、C4Dとユーザスクリプトは、マルチタスクなのだろうか?(この場合、マルチタスクとは言わないのだろうか?)
結局、ユーザスクリプトが終了しないとC4Dの操作はできないのだ。
その証拠に、ユーザスクリプト内で無限ループを作ると、C4Dも応答無しになってしまうのだ…

ユーザスクリプトでモードレスダイアログは、試すまでの事では無いのだ…

では、あえて試してみよう。

スクリプトマネージャで新規で「test」と言うユーザスクリプトを作りました。

Modeless_01

コマンドマネージャでIDを確認します。

Modeless_02

IDは600000080です。

ダイアログは、前回のものを流用しました。

/*
ユーザスクリプトでモードレスダイアログ
2009.8.12
*/


var dlg;

//ダイアログ===============================================
class test_dialog:GeDialog
{
  public:
    test_dialog();
    CreateLayout();
    Command(id , msg);
}

test_dialog::test_dialog()
{
  super(600000080);//コマンドマネージャで確認してください。
}

test_dialog::CreateLayout()
{
  SetTitle("test non modal");

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

  AddGroupBeginH(20000 , BFH_SCALEFIT , 1 , "group-2" , 0);
    AddButton(20001 , BFH_SCALEFIT , 0 , 0 , "適用");

  AddGroupEnd();
}

test_dialog::Command(id , msg)
{
  println("Command()内   ID : " , id);
}


//メイン==================================================
main(doc , op)
{
  dlg = new(test_dialog);
  dlg->Open(TRUE , -1 , -1);
}

実行すると、一瞬マウスポインターの辺りにダイアログが表示され消えます。
ユーザスクリプトが終了と同時に消えるのです。

レイアウトが、どうのこうの考える余地は無いのだ。

やはり、試すまでも無かったのだ…

結論…
ユーザスクリプトではモードレスは使えない。

|

« C4D C.O.F.F.E.E.メニュープラグインにダイアログを…02 | トップページ | C4D チュートリアル »