« C4D 複数選択されたシーン全体のタグの取得 C.O.F.F.E.E. R11 SDK | トップページ | R11SDKのtag()関数を使用して、選択された(ポイント/ポリゴン)選択範囲タグで選択されたエレメントにヌルオブジェクトを配置するスクリプトです。 »

以前作成した実用性の無い「選択オブジェクトにヌルオブジェクト配置する」スクリプトに、R11SDKのobject()関数を使用する

C4Dのポイントに新規ヌルオブジェクトを追加配置するユーザスクリプト
http://villager-and-c4d.cocolog-nifty.com/blog/2009/05/c4d-9916.html

最初は、ヌルオブジェクトをポイントに配置する事から始まって、改良をしていきました。

C4Dのポリゴンに新規ヌルオブジェクトを追加配置するユーザスクリプト
http://villager-and-c4d.cocolog-nifty.com/blog/2009/05/c4d-bc2a.html

前回の新規ヌルオブジェクトをポイントやポリゴンに追加配置するユーザスクリプトを統合する
http://villager-and-c4d.cocolog-nifty.com/blog/2009/05/post-c749.html

前回の新規ヌルオブジェクトをポイントやポリゴンに追加配置するユーザスクリプトに「オブジェクトモード」を追加する
http://villager-and-c4d.cocolog-nifty.com/blog/2009/05/post-6e66.html

では、最終のスクリプトを変更します。

/*
ポイントやポリゴンにヌルオブジェクトを追加配置する。
2009.5.26
*/



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(IsCommandChecked(12101)){
    mode = 3;
//オブジェクトモードだと:3
    cs =
BaseObject;
  }
 
if(!mode)return;


  doc->
StartUndo();

 
for(obj = GetActiveObject(doc) ; obj ; obj = obj->SearchNext(BIT_AOBJ)){
   
if(!instanceof(obj , cs))continue;

    doc->
AddUndo(UNDO_OBJECT_REC , obj);

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

   
if(mode == 3)continue;

    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())continue;
      //ヌルオブジェクトの追加
      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);
    }

  }
  doc->
EndUndo();
}

選択オブジェクト変数であるobj
この変数の宣言

var obj = GetActiveObject(doc);

を削除します。

object()関数の引数:選択オブジェクトカウンターをobj_cとして、
選択オブジェクト変数である全てのobjをobject(obj_c)に置き換えます。

スクリプト最初の選択オブジェクトの有無の判定を

if(!object(0))return;

へ変更。
object(0)がnilならば、シーン中の選択オブジェクトは1個も無いと言う事です。

繰り返しのfor()は、

for(obj_c = 0 ; object(obj_c) ; obj_c++){

カウンタ変数をインクリメントし判定式にobject(カウンタ)として、選択オブジェクトが無ければ繰り返しを終了する。

/*
ポイントやポリゴンにヌルオブジェクトを追加配置する。
R11SDK object(n)
2009.5.30
*/



main(doc , op)
{
  if(!object(0))return;//選択されたオブジェクトが無ければ終了

 
var mode = 0;
 
var cs;
 
var name;

 
var gp;
 
var nulobj;
 
var pts , pgs;
 
var lpc;
 
var sel;
 
var pos;
 
var i;
  var obj_c;//選択オブジェクトカウンター

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


  doc->
StartUndo();

  for(obj_c = 0 ; object(obj_c) ; obj_c++){
   
if(!instanceof(object(obj_c) , cs))continue;

    doc->AddUndo(UNDO_OBJECT_REC , object(obj_c));

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

   
if(mode == 3)continue;

    pts = object(obj_c)->GetPoints();

   
switch(mode){
      
case 1:
        lpc = object(obj_c)->GetPointCount();
        sel =
object(obj_c)->GetPointSelection();
        break;
      
case 2:
        lpc = object(obj_c)->GetPolygonCount();
        pgs =
object(obj_c)->GetPolygons();
        sel =
object(obj_c)->GetPolygonSelection();
    }
   
for(i = 0 ; i < lpc ; i++){
      if(!(sel->IsSelected(i)) && sel->GetCount())continue;
      //ヌルオブジェクトの追加
      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);
    }

  }
  doc->
EndUndo();
}

これで問題なく動作します。

前回のメニューの状態は、

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

変更後は、

var i;
ENABLE = FALSE;
for(i = 0 ; object(i) ; i++){
  if(instanceof(object(i) , PointObject)){
    ENABLE = TRUE;
    break;
  }
}

これで、変更完了です。

|

« C4D 複数選択されたシーン全体のタグの取得 C.O.F.F.E.E. R11 SDK | トップページ | R11SDKのtag()関数を使用して、選択された(ポイント/ポリゴン)選択範囲タグで選択されたエレメントにヌルオブジェクトを配置するスクリプトです。 »