« C4Dのポリゴンに新規ヌルオブジェクトを追加配置するユーザスクリプト | トップページ | C4D BasePointのGetPoint()/SetPoint()の簡単なスピードテスト »

前回の新規ヌルオブジェクトをポイントやポリゴンに追加配置するユーザスクリプトを統合する

前回の、新規ヌルオブジェクトをポイントやポリゴンに追加配置するユーザスクリプトを統合します。

編集モードの「ポリゴンモード」「ポイントモード」に対応してみましょう。
ポリゴンモード/ポイントモードは以前に取り上げました。
http://villager-and-c4d.cocolog-nifty.com/blog/2009/03/post-0d9b.html
「今は、何モード?ポリゴンモード?それとも、ポイントモード?」
も参考にしてください。

では、モードチェックして処理の流れを分岐するスクリプトです。

/*
ポイントモードとポリゴンモードで処理を分岐させる。
2009.5.25
*/


main(doc , op)
{
  var mode = 0;

  if(IsCommandChecked(12139))mode = 1;//ポイントモードだと:1
  if(IsCommandChecked(12187))mode = 2;//ポリゴンモードだと:2 

  switch(mode){
    case 1:
      println("ポイントモード");
      break;
    case 2:
      println("ポリゴンモード");
      break;
  }
}

これでコンソールには、ポリゴンモード時とポイントモード時に、それぞれのモードが表示されます。

でも、switch()じゃなくてもif()だけで良いよね。

/*
ポイントモードとポリゴンモードで処理を分岐させる。
2009.5.25
*/


main(doc , op)
{
  if(IsCommandChecked(12139))println("ポイントモード");
  if(IsCommandChecked(12187))println("ポリゴンモード");
}

でもこのままswitch()で続けます。

これに、前回のスクリプトを組み込んで見ましょう。

一番簡単な方法は、前回のスクリプトを関数にしてswitch()のprintln()の位置でそれぞれを呼び出します。

/*
ポイントモードとポリゴンモードで処理を分岐させ
ポイントやポリゴンにヌルオブジェクトを追加配置する。
2009.5.25
*/



//ポイントにヌルオブジェクトを追加配置します。
SetNullObjctToPoint(doc , op)
{
  var obj = GetActiveObject(doc);

 
if(!obj)return;

  var i;
  var ptc , pts , sel;
  var nulobj;
  var gp;

  doc->StartUndo();

  //複数選択オブジェクトの処理
  while(obj){
    if(instanceof(obj , PointObject)){
      doc->AddUndo(UNDO_OBJECT_REC , obj);

      //グループオブジェクトの追加
      gp = new(NullObject);
      gp->SetName("group");
      gp->InsertUnder(obj);


      ptc = obj->GetPointCount();
      sel = obj->GetPointSelection();
      pts = obj->GetPoints();


      //ヌルオブジェクトを追加し選択されたポイントに配置する
      for(i = 0 ; i < ptc ; i++){
        if(sel->IsSelected(i) || !(sel->GetCount())){
          nulobj = new(NullObject);
          nulobj->InsertUnder(gp);
          nulobj->SetName("point_" + tostring(i));
          nulobj->SetPosition(pts[i]);
        }
      }
    }
    obj = obj->SearchNext(BIT_AOBJ);
  }
  doc->EndUndo();
}


//ポリゴンにヌルオブジェクトを追加配置します。
SetNullObjctToPolygon(doc , op)
{
  var obj = GetActiveObject(doc);

 
if(!obj)return;

  var i;
  var pts , sel;
  var pgc , pgs;
  var pos;
  var nulobj;
  var gp;

  doc->StartUndo();


  //複数選択オブジェクトの処理
  while(obj){
    if(instanceof(obj , PolygonObject)){
      doc->AddUndo(UNDO_OBJECT_REC , obj);


      //グループオブジェクトの追加
      gp = new(NullObject);
      gp->SetName("group");
      gp->InsertUnder(obj);


      pgc = obj->GetPolygonCount();
      pgs = obj->
GetPolygons();
      sel = obj->
GetPolygonSelection();
      pts = obj->GetPoints();


      //ヌルオブジェクトを追加し選択されたポリゴンに配置する
      for(i = 0 ; i < pgc ; i++){
        if(sel->IsSelected(i) || !(sel->GetCount())){
          nulobj = new(NullObject);
          nulobj->InsertUnder(gp);
          nulobj->SetName("polygon_" + tostring(i));
         
if(pgs[i * 4 + 2] != pgs[i * 4 + 3]){
            pos = (pts[pgs[i * 4]] +
                   pts[pgs[i * 4 + 1]] +
                   pts[pgs[i * 4 + 2]] +
                   pts[pgs[i * 4 + 3]]) / 4;
          }
else{
            pos = (pts[pgs[i * 4]] +
                   pts[pgs[i * 4 + 1]] +
                   pts[pgs[i * 4 + 2]]) / 3;
          }
          nulobj->
SetPosition(pos);
        }
      }
    }
    obj = obj->SearchNext(BIT_AOBJ);
  }
  doc->EndUndo();
}



main(doc , op)
{
  var mode = 0;

  if(IsCommandChecked(12139))mode = 1;//ポイントモードだと:1
  if(IsCommandChecked(12187))mode = 2;//ポリゴンモードだと:2 

  switch(mode){
    case 1:
      SetNullObjctToPoint(doc , op);
      break;
    case 2:
      SetNullObjctToPolygon(doc , op);
      break;
  }
}

前回のmain(doc , op)を、そのまま名前を変えただけの関数にしました。
パラメータのopは必要ないのですが…一番簡単な方法なので、変更箇所を少なくしました。ちょっと照れますね。
確認しやすいですけどね。

実行しても問題ありません。モード毎にポリゴン対象/ポイント対象が切り替わって処理します。

Undoも問題ないでしょう。

このスクリプト。このままでも問題は無いのですが、共通部分があるので、もう少しスリムにして見よう。

/*
ポイントモードとポリゴンモードで処理を分岐させ
ポイントやポリゴンにヌルオブジェクトを追加配置する。
2009.5.25
*/



main(doc , op)
{
  var obj = GetActiveObject(doc);
 
if(!obj)return;

 
var mode = 0;
 
var cs;
 
var name;

 
var gp;
 
var nulobj;
 
var pts , pgs;
 
var lpc;
 
var sel;
 
var pos;
 
var i;

 
if(IsCommandChecked(12139)){
    mode = 1;
//ポイントモードだと:1
    cs =
PointObject;
    name =
"point_";
  }
 
if(IsCommandChecked(12187)){
    mode = 2;
//ポリゴンモードだと:2
    cs = PolygonObject;
    name =
"polygon_";
  }
 
if(!mode)return;

  doc->
StartUndo();

 
while(obj){
   
if(instanceof(obj , cs)){
      doc->
AddUndo(UNDO_OBJECT_REC , obj);

      
//グループオブジェクトの追加
      gp =
new(NullObject);
      gp->
SetName("group");
      gp->
InsertUnder(obj);

      pts = obj->
GetPoints();

      
switch(mode){
       
case 1:
          lpc = obj->
GetPointCount();
          sel = obj->
GetPointSelection();
         
break;
       
case 2:
          lpc = obj->
GetPolygonCount();
          pgs = obj->
GetPolygons();
          sel = obj->
GetPolygonSelection();
      }
      
for(i = 0 ; i < lpc ; i++){
       
if(sel->IsSelected(i) || !(sel->GetCount())){

          //ヌルオブジェクトの追加
          nulobj =
new(NullObject);
          nulobj->
InsertUnder(gp);
          nulobj->
SetName(name + tostring(i));
          nulobj#
NULLOBJECT_DISPLAY = 2;

         
//ヌルオブジェクトの位置の調整と適用
         
switch(mode){
            
case 1:
              pos = pts[i];
             
break;
            
case 2:
              if(pgs[i * 4 + 2] != pgs[i * 4 + 3]){
                pos = (pts[pgs[i * 4]] +
                       pts[pgs[i * 4 + 1]] +
                       pts[pgs[i * 4 + 2]] +
                       pts[pgs[i * 4 + 3]]) / 4;
              }
else{
                pos = (pts[pgs[i * 4]] +
                       pts[pgs[i * 4 + 1]] +
                       pts[pgs[i * 4 + 2]]) / 3;
              }

          }

          nulobj->SetPosition(pos);
        }
      }
    }
    obj = obj->
SearchNext(BIT_AOBJ);
  }
  doc->
EndUndo();
}

スリムになってないなぁ…
わかり辛くなったかなぁ…
共通部分を基準にちょっと無理に合わせたからなぁ。
ま、switch()を使っているので、モードが増えても追加は難しくないと思う…

メニューの状態も修正しよう。

var obj = GetActiveObject(doc);
ENABLE = FALSE;
while(obj){
  if(instanceof(obj , PointObject)){
    ENABLE = TRUE;
    break;
  }
  obj = obj->SearchNext(BIT_AOBJ);
}

これで、選択されたオブジェクトの中にポリゴンやスプラインオブジェクトが無ければ、メニューの状態が不可視になります。

|

« C4Dのポリゴンに新規ヌルオブジェクトを追加配置するユーザスクリプト | トップページ | C4D BasePointのGetPoint()/SetPoint()の簡単なスピードテスト »