« 前回のスクリプトのやり直し | トップページ | Cinema 4Dスクリプトで画像ファイルを読み込む »

前々回のC4Dスクリプトのプラグイン化

じゃあこれをプラグインにするには、難しいのだろうか。MenuPluginフレームワークに移植してみよう。

その前にCOFFEE SDK9.6やIDの取得はココ、
http://www.maxon.net/pages/support/plugincafe_e.html
http://www.plugincafe.com/developer_plugid.asp
英語だけど、英語が苦手な人も頑張って。参考にココも見て、
http://www.maxoncomputer.com/tutorial_detail.asp?site=CAFE-DEV&tutorialID=137
このあたりも日本語にして欲しいよね。こんな事だから日本発の優良で有料(商業ベースの大きな、そして強力な)のプラグインが出ないんだと思う。こじ付けかなぁ?
でも世界的規模の日本発の3Dソフトってないよね。Shadeは世界規模?日本人はソフト開発は不得意な民族なのかなぁ?そんなこと無いよね。日本のゲームは世界に誇れるレベルだし。

このブログが一人でもいいから、誰かの興味のツボを突ければ良いなぁ。そして誰かが強力なプラグインを開発して。さすが日本人って…ならないかなぁ。

さて、妄想は置いといて、MenuPluginのフレームワーク。SDKに付属してますね。

// MenuPluginフレームワーク

class MyMenuPlugin : MenuPlugin
{
public:
  MyMenuPlugin();
  GetID();
  GetName();
  GetHelp();
  GetIcon();
  GetIconState();
  Execute(doc);
  RestoreLayout(secret);
}

MyMenuPlugin::MyMenuPlugin(){super();コンストラクタ。}
MyMenuPlugin::GetID(){plugincafe.comから配布された唯一のplugin idを返す。}
MyMenuPlugin::GetName(){メニューエントリのテキストを返す。}
MyMenuPlugin::GetHelp(){メニュー項目が選ばれる時に、表示されるヘルプテキストを返す。}
MyMenuPlugin::GetIcon(){ビットマップアイコンを返す。}
MyMenuPlugin::GetIconState(){アイコンが押されたらTRUEを、そうでなければFALSEを返す。}
MyMenuPlugin::GetState(){メニュー項目の状態。CMD_ENABLED、CMD_CHECKEDのコンビネーションを返す。}
MyMenuPlugin::Execute(doc){メニュー項目が選ばれた時に呼ばれる。}
MyMenuPlugin::RestoreLayout(secret){モードレスダイアログを表示するため。}

main()
{
  Register(MyMenuPlugin);
}

フレームワークに必要なコードを入力していく。
クラスの件は面倒だから省略。オブジェクト思考だね。特に3DCGの場合、「オブジェクト思考のオブジェクト」と「3Dモデルのオブジェクト」とゴッチャになるから。
クラスの説明はよく車を使った説明を聞くけど、世界共通なのかなぁ。車クラスにデータメンバのナンバーとガソリン、それらを処理するナンバーメンバー関数とガソリンメンバ関数。もっと気の利いた説明は?考えるの面倒だから自分も説明する時は車クラスを使うか?
ま、クラスの説明を省略したら、なんだか分からないけどゴメンね。とりあえずプラグイン化。

/*
ツール名:グローバルの原点へ
ファイル名:原点へ.cof
プラグインのタイプ:MenuPlugin

インターネットでワールドワイドに配布するなら、ファイル名やメニュー、ヘルプは英語の方がいいのだ。
プラグインを自作したら必ずMAXONサイトでIDを取得してね。
*/


var icn_map;//アイコン用ビットマップの変数。

class GO_Gvl_Plugin : MenuPlugin
{
  public:
  GO_Gvl_Plugin();
  GetID();
  GetName();
  GetHelp();
  GetIcon();
  GetState();
  Execute(doc);
}

// コンストラクタ。
GO_Gvl_Plugin::GO_Gvl_Plugin(){super();}

GO_Gvl_Plugin::GetID(){return 1000002;}
//
http://www.plugincafe.com から取得した唯一のplugin idを返す。
//今回は配布が目的ではないので、IDは取得しません。
//開発中に試用しても良いIDが1000001~1000010までです。
//C4DのツールはID管理されているので同じIDが存在すると組み込みに失敗します。
//ここでは試しに1000002を使ってみます。


GO_Gvl_Plugin::GetName(){return "グローバルの原点へ";}//メニューに表示されるツール名
GO_Gvl_Plugin::GetHelp(){return "村人とC4D";}//ヘルプテキストを返す。
GO_Gvl_Plugin::GetIcon(){return icn_map;}//ビットマップアイコンを返す。

GO_Gvl_Plugin::GetState(){
  //メニューの表示のされ方。
  //ここにはスクリプトマネージャの「メニューの状態」を移植。
  //ただし、ENABLE = FALSE(TRUE)ではなく、FALSEかCMD_ENABLEDをreturnで返す。
  //可視化CMD_ENABLED、不可視化FALSE。


  var doc = GetActiveDocument();
  var firstObj = doc->GetFirstObject();if(!firstObj)return FALSE;
  if((firstObj->GetBit(BIT_AOBJ)) || (firstObj->SearchNext(BIT_AOBJ)))return CMD_ENABLED;
  else return FALSE;
}

GO_Gvl_Plugin::Execute(doc) {
  //ここにスクリプトマネージャにタイプしたコードを入力。
  //注意しなければいけないことは、スクリプトマネージャでは変数opも渡されるが、ここでは変数docのみ。
  //もし変数opを使用しているならば、
  // var op = doc->GetActiveObject();
  //を一番最初に打つべし。今回は使用していないのでいりません。

  //選択した全てのオブジェクトをグローバル座標の
  //原点(0.0 , 0.0 , 0.0)に配置

  //Copyright(c)2008/5/27 村人とC4D


  var gm;
  var ob = doc->GetFirstObject();

  //最初のアクティブオブジェクトを得る
  if(!(ob->GetBit(BIT_AOBJ)))ob = ob->SearchNext(BIT_AOBJ);
  if(!ob)return;

  doc->StartUndo();//アンドゥの記録開始
  //アクティブオブジェクトの捜索しグローバル(0.0 , 0.0 , 0.0)へ

  while(ob){
    doc->AddUndo(UNDO_OBJECT_BASEDATA , ob);//移動させる前に現在の状態をアンドゥに記録
    gm = ob->GetMg();
    gm->SetV0(vector(0.0));
    ob->SetMg(gm);

    ob = ob->SearchNext(BIT_AOBJ);
  }
  doc->EndUndo();//の記録の終了
  EventAdd();//イベントをC4Dへ送る
}

// Main

main()
{
  icn_map = new(BaseBitmap , 1 , 1);//最小のBaseBitmapを割り付ける。
  var f_pass = GeGetRootFilename();//プラグインのパスの取得
  f_pass->RemoveLast();//ファイルパスMAXON\CINEMA 4D Rn\plugins\村人\原点へ.cofのファイル名(原点へ.cof)の部分を削除
  f_pass->AddLast("グローバルの原点へ.tif");//パスの最後に"グローバルの原点へ.tif"を追加
  icn_map->Load(f_pass);//ファイルパスMAXON\CINEMA 4D Rn\plugins\村人\グローバルの原点へ.tifのファイルをicn_mapへ読み込む
  Register(GO_Gvl_Plugin);//プラグインをC4Dへ組み込む
}

これで、後はプラグインフォルダにインストールして、Cinema 4Dを起動。
プラグインメニューに「グローバルの原点へ」が現れているはず。勿論オブジェクトが無ければ不可視になってるけど。
スクリプトマネージャの場合main()関数はツールが呼ばれたとき、すなわちメニューから選択されるか、アイコンをクリックされたときに実行されます。
一方、プラグインはCinema 4Dが起動時にプラグインが組み込まれるときにmain()関数が実行されます。そのmain()関数が呼ばれたときに、MenuPluginクラスを継承した自作したメニュープラグインクラスをC4Dに登録する。あと必要に応じてアイコンなどの処理をする。今回はアイコンを読み込むためのファイルパスの操作とアイコンの読み込み、プラグインの登録という事です。
C4Dのプラグインフォルダにはプラグインごとにフォルダ管理しよう。今回の実験プラグインはplugins\村人\原点へ.cofと配置しました。アイコンは前々回に作ったアイコンをTIFFでplugins\村人\原点へ.tifと保存しました。
このレベルのツールならプラグインではなくユーザスクリプトで充分だと思います。あまりくだらないツールでID取得するのもどうなんだろね?まぁ自由なんだけどね。
ソースを作成して、バグを取って、試して、更にバグを取って、試して、充分確認して完成してからIDを取得して、ネット配布って具合だね。はやる気持ちを抑えて、デバッグ、デバッグ…自分は思い込みや勢いで作成してしまうから気を付けないと…。今回のプラグインは実験だったのでファイル名にもメニューにも日本語を使いました。大丈夫なんだね、日本語使っても。今回の実験結果「MURABITO.ZIP」です。動くことを確認したらプラグインフォルダからはずしてください。今回はちょっと強引だったかなぁ。一応ソースにはコメントもついてるし…

次はなんだろう…まだまだスクリプトだぁ。

|

« 前回のスクリプトのやり直し | トップページ | Cinema 4Dスクリプトで画像ファイルを読み込む »

コメント

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