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

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

前回の続きで、「C4Dのポイントに新規ヌルオブジェクトを追加配置するユーザスクリプト」をポリゴンに配置するように変更します。

今回のスクリプトの開始は、前回の最後のスクリプトからです。

前回の最後のスクリプトです。

/*
ポイントに新規ヌルオブジェクトを配置します。
2009.5.24
*/


main(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();
}

このスクリプトをポリゴン対応に変更します。

ポイントの数をポリゴンの数に変更。
ポイント選択状況をポリゴン選択状況へ。
ポリゴン配列の取得。
for()で捜査したポイントをポリゴンへ変更。

では、変更します。

/*
ポリゴンに新規ヌルオブジェクトを配置します。
2009.5.24
*/


main(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();
}

ポリゴンの位置は、ポリゴンを構成するポイントabcdの位置の総和の平均です。
三角ポリゴンと四角ポリゴンの区別はポイントcdを比較し、同じであれば三角ポリゴンです。

これで、三角ポリゴンでも四角ポリゴン、複数選択もUndoにも対応しています。

メニューの状態は、前回と同じで問題ありません。

|

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