« 自分が使うMenuPluginのフレームワークを作ろう!! | トップページ | 前回のフレームワークを修正 »

C4DにMenuPluginフレームワーク「test_plug」を組み込んだら…

さて、それでは始めよう。C4Dを起動して確かめてみます。
その前に、「test plug」は所定の場所に配置してますか?

Frame_06

それではまずC4Dを起動して、コンソールを開いてエラーが出てないか確認。
ダウンロードしたファイルならば、エラーは出ていないと思います。
意外と違うPluginがエラーを起こしているかもしれません。

ここから先は、SDKを見ながらでも自分で考えたユーザスクリプトが作成できる人という事を前提に進めていきます。

それでは、更に確認します。
コンソールにエラーが表示されていませんね。
Pluginメニューに鉛筆アイコンと「test plug」と標示されていますか?

Frame_02_1

マウスポインタを「test plug」に重ねてください。
情報バーに「これはテストです。」と表示されますか?

Frame_01

では、「test plug」を実行してください。
コンソールに「test plugを実行しましたね…」と表示されましたか?

全てがOKであれば、次に進みます。
C4Dは起動したままで、C4DのPluginsフォルダに保存された、「test_plug.cof」を開いてください。何で開くか?
C4Dで開くなら、適当なオブジェクト(ヌルオブジェクト)にC.O.F.F.E.E.エクスプレッションダグを取り付けて、それで読み込む。
もしくは、テキストエディタ等で開いてください。(言うもでもないですが、ワープロソフトではないですよ。でも.txtで保存できるならば問題ないですが…)

では、次のように変更してください。

/*
test_plug MenuPlugin
2009.2.5
*/


// グローバル変数 ------------------------------------------
var Icon_Bitmap;


//関数、クラス ---------------------------------------------

class TestPlugMenuPlugin : MenuPlugin
{
  public:
  TestPlugMenuPlugin();

  GetID();
  GetName();
  GetHelp();

  GetIcon();
  GetState();
  Execute(doc);


//  RestoreLayout(secret);
}


TestPlugMenuPlugin::TestPlugMenuPlugin(){
  //親コンストラクタを呼びなさい。
  super();
  //ローカル変数などの初期化

  println("コンストラクタが呼ばれました。");

}

TestPlugMenuPlugin::GetID(){
  println("GetID()が呼ばれました。");
  return 1000006;
}



TestPlugMenuPlugin::GetName(){
  println("GetName()が呼ばれました。");
  return "test plug";
}


TestPlugMenuPlugin::GetHelp(){
  println("GetHelp()が呼ばれました。");
  return "これはテストです。";
}


TestPlugMenuPlugin::GetIcon(){
  println("GetIcon()が呼ばれました。");
  return Icon_Bitmap;
}


TestPlugMenuPlugin::GetState(){
  println("GetState()が呼ばれました。");
  var doc = GetActiveDocument();
  var op = doc->GetActiveObject();
  if(op)return CMD_ENABLED; else return FALSE;
}


TestPlugMenuPlugin::Execute(doc){
  var op = doc->GetActiveObject();
  println(op->GetName());
  println("test plugを実行しましたね…");
}

/*モードレスダイアログが必要ならば、ここでそれを再び開き、d->RestoreLayout(secret)を呼びなさい。
TestPlugMenuPlugin::RestoreLayout(secret) {
}
*/



// Main -------------------------------------------------

main()//C4D起動時のPluginを組み込む時に実行されます。
{
  println("test plugを組み込みます。");

  //アイコンの読み込み
  Icon_Bitmap = new(BaseBitmap , 1 , 1);
  var f_pass = GeGetRootFilename();
  f_pass->RemoveLast();
  f_pass->AddLast("test_plug.tif");
  Icon_Bitmap->Load(f_pass);
 
  //プラグインをC4Dに組み込む
  Register(TestPlugMenuPlugin);
  println("test plugを組み込みました。");
}

変更が終了したら、「test_plug.cof」を保存してください。

保存が完了したら、C4Dのコンソールウィンドウの「プラグイン」メニューの「プラグインの再読み込み」を実行してください。

Frame_03

C4D起動時にエラーが起こるとPluginは組み込まれません。その時は、Pluginを修正して、C4Dを再起動させなければいけません。

が、この再読み込み時にエラーを起こしても、Pluginを修正して再び「プラグインの再読み込み」を行ってエラーが起きなければ、C4Dの再起動なしで組み込みが完了します。

C4D起動時のみエラーが起きなければ、Pluginの修正/保存。「プラグインの再読み込み」。Pluginの修正/保存。「プラグインの再…と繰り返すのみです。

では、「プラグインの再読み込み」でエラーが起きなかった事を前提に進めます。

「プラグインの再読み込み」を実行すると、Pluginが組み込まれた数だけコンソールに表示されます。

C.O.F.F.E.E. Reload Start
{
  Reloading BSplineToBezier...
  Reloading Test plug...
        :
        :
}
C.O.F.F.E.E. Reload End

エラーが起こればエラーの内容が表示されます。

では、今回の変更後「プラグインの再読み込み」の結果を見てみよう。

C.O.F.F.E.E. Reload Start
{
  Reloading Test plug...
test plugを組み込みます。
GetID()が呼ばれました。
GetName()が呼ばれました。
GetHelp()が呼ばれました。
test plugを組み込みました。
}
C.O.F.F.E.E. Reload End

「プラグインの再読み込み」時のメンバ関数は、GetIcon()が呼ばれていません。
GetState()も呼ばれていません。
ここで、確認のため一度C4Dを再起動させます。

C4D起動直後のコンソールの結果は…

C.O.F.F.E.E. Reload Start
{
  Reloading Test plug...
test plugを組み込みます。
GetID()が呼ばれました。
GetName()が呼ばれました。
GetHelp()が呼ばれました。
GetIcon()が呼ばれました。 <<=起動直後は、GetIcon()が呼ばれました。
test plugを組み込みました。
}
C.O.F.F.E.E. Reload End

これで、「プラグインの再読み込み」時にはGetIcon()が呼ばれないことがわかりました。
GetState()は組み込み時には呼ばれないことがわかりました。

では次は、「プラグイン」メニューをクリックしてください。

Frame_04_1_2

クリックするたび「GetState()が呼ばれました。」が表示されます。

GetState()が呼ばれました。
GetState()が呼ばれました。
GetState()が呼ばれました。
GetState()が呼ばれました。


更に確認。コマンドマネージャで「test plug」を適当なパレットに組み込みます。
パレットに組み込むと、「プラグイン」メニューを表示しなくても、C4Dのイベントが発生するたび「GetState()が呼ばれました。」が表示されるようになりました。
要するに、アイコンが画面上に表示されていれば、イベントが起こるたびGetState()は呼ばれると言う事がわかりました。

先ほど「プラグイン」メニューをクリックしたとき、「test plug」が非表示になっていました。
そう、このプラグインのメニューの状態は、アクティブオブジェクト(オブジェクトが1個選択されている状態)が無ければメニューは非表示なるわけですね。

TestPlugMenuPlugin::GetState(){
  println("GetState()が呼ばれました。");
  var doc = GetActiveDocument();
  var op = doc->GetActiveObject();
  if(op)return CMD_ENABLED; else return FALSE;
}

ユーザスクリプトに合わせて、アクティブオブジェクト変数名を「op」にしました。
では、適当にオブジェクトを追加して、「プラグイン」メニューを見てみよう。
自分は「立方体」を追加しました。

Frame_05_1

問題なく表示されました。
コンソールにも「GetState()が呼ばれました。」と表示されます。

それでは、「test plug」を実行してみよう。
結果は言うまでも無いが、このれはアクティブオブジェクトの名前をコンソールに表示するプラグインですね。

TestPlugMenuPlugin::Execute(doc){
  var op = doc->GetActiveObject();
  println(op->GetName());
  println("test plugを実行しましたね…");
}

こちらもユーザスクリプトに合わせて、アクティブオブジェクト変数名を「op」にしました。
コンソールには、期待通り…

GetState()が呼ばれました。
立方体
test plugを実行しましたね…

と、なりました。ん?
実行する直前。マウスポインタが「test plug」メニューに重なったときに、情報バーには「これはテストです。」と表示されるが、GetHelp()は呼ばれないんだね。

一通りチェックが終わりました。
これで、このフレームワークのクラスメンバ関数がいつ呼ばれるか、だいたい把握できたと思う。
GetIcon()/GetHelp()は、C4D起動時のみ呼ばれるみたいですね。
この結果で、このフレームワークを少し変更しようと思います。

えっ?
「コンストラクタが呼ばれました。」が表示されていない。
気付きませんでした。組み込み時には表示されてませんでしたね。
残念ながら、わかりませんね。

|

« 自分が使うMenuPluginのフレームワークを作ろう!! | トップページ | 前回のフレームワークを修正 »

コメント

この記事へのコメントは終了しました。