« 今までのC4Dユーザスクリプトを振り返る… | トップページ | ベジェの角を丸くする…XPressoでのtest2(半径を指定して角丸) »

今までのC4Dユーザスクリプトを振り返る…2

「実際にユーザスクリプトをチョロッと」
http://villager-and-c4d.cocolog-nifty.com/blog/2008/05/post_139d.html
この記事の「スクリプトマネージャとコンソールの表示」は、コマンドマネージャからドロップするだけなので全く問題ないですね。

main()関数の記事も問題なしですね。

次は…

「スクリプトマネージャの「メニューの状態」」
http://villager-and-c4d.cocolog-nifty.com/blog/2008/05/post_4143.html
「オブジェクトクラスの表示」も問題なしですね。
ENABLEの値は「TURE:1」「FALSE:0」の2値と書いてありますが、整数型でも実数型でも問題が無いようです。ま、通常整数型ですけどね。0か1ではなくて「0か、それ以外」です。

「選択された複数のオブジェクトを処理」
http://villager-and-c4d.cocolog-nifty.com/blog/2008/05/post_8e95.html
「前回のスクリプトのやり直し」
http://villager-and-c4d.cocolog-nifty.com/blog/2008/05/post_6d6c.html
最初の選択された複数のオブジェクトを取得する為に、
BaseDocumentクラスのGetFirstObject()メンバ関数
BaseList2DクラスのGetBit()/SearchNext()メンバ関数を使用していました。
が、選択された最初のオブジェクトを取得する単独の関数があります。

aobj = GetActiveObject(doc);//最初の選択されたオブジェクトを取得

BaseDocumentクラスのGetActiveObject()メンバ関数は、1個だけ選択されていれば、そのオブジェクトを返しますが、2個以上選択されているとnilになります。
メンバ関数ではないGetActiveObject()関数は複数選択されていても、選択されている最初のオブジェクトを返します。
オブジェクト以外にも選択された最初のマテリアルを取得するGetActiveMaterial()もあります。

最初の方法GetFirstObject()メンバ関数は覚える必要がないのか?
そうではありません。処理する対象が選択されているオブジェクトのみとは限らないからです。
その他にオブジェクトマネージャからオブジェクトを取得する方法は、オブジェクトの名前からオブジェクトを探すBaseDocumentクラスのFindObject("ObjectName")メンバ関数もあります。ただし同じ名前がある場合、最初のオブジェクトしか取得できませんが…

では、この記事での
「選択した全てのオブジェクトをグローバル座標の原点(0.0 , 0.0 , 0.0)に配置」
スクリプトを変更してみよう。

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


Copyright(c)2008/5/27 村人とC4D
修正2009.4.29
*/


var gm;
var ob = GetActiveObject(doc);//選択された最初のオブジェクトを取得
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();//追加  の記録の終了

GetBit()/SearchNext()の1行だけ減りました。激減するわけではないですね。

では、「メニューの状態」は、

ENABLE = (GetActiveObject(doc) != nil);

こちらは、5行が1行へ。

「前々回のC4Dスクリプトのプラグイン化」
http://villager-and-c4d.cocolog-nifty.com/blog/2008/05/c4d_0b78.html
上の記事のスクリプトをプラグインにしたわけですが、
このプラグインの
メニューの状態であるGetState()
メニューが選択され実行するExecute()の部分を同じように変更します。

/*
ツール名:グローバルの原点へ
ファイル名:原点へ.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。


  if(GetActiveObject(GetActiveDocument()))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 = GetActiveObject(doc);

  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へ組み込む
}

と、こんな具合だろう…

|

« 今までのC4Dユーザスクリプトを振り返る… | トップページ | ベジェの角を丸くする…XPressoでのtest2(半径を指定して角丸) »