« 以前作成した実用性の無い「選択オブジェクトにヌルオブジェクト配置する」スクリプトに、R11SDKのobject()関数を使用する | トップページ | C4D C.O.F.F.E.E.でポリゴンの座標を算出する関数について、考えてみる »

R11SDKのtag()関数を使用して、選択された(ポイント/ポリゴン)選択範囲タグで選択されたエレメントにヌルオブジェクトを配置するスクリプトです。

C.O.F.F.E.E. R11 SDK の選択されたタグを取得するtag()を使用して、オブジェクトにアクセスします。

今回も実用的ではないスクリプトですが、参考のまでに…

では、今回使用するタグは、ポリゴン選択範囲タグとポイント選択範囲タグです。
クラスはPointSelectionTag/PolygonSelectionTagです。

複数選択されたタグの内、ポリゴンとポイントの選択範囲タグを判別し、そのタグを取り付けられたオブジェクトの名前をコンソールに表示します。

/*
複数選択されたタグの内、ポイントとポリゴンの選択範囲タグを判別し、
そのタグの取り付けられたオブジェクトの名前をコンソールに表示します。
2009.5.30
*/


main(doc , op)
{
  if(!tag(0))return;//選択されたタグが無ければ終了
  var tag_c;//選択されたタグのカウンター
  var obj;  //選択範囲タグが取り付けられたオブジェクト

  for(tag_c = 0 ; tag(tag_c) ; tag_c++){
    if(!instanceof(tag(tag_c) , PointSelectionTag)
      && !instanceof(tag(tag_c) , PolygonSelectionTag))continue;//ポイントやポリゴンの選択範囲タグでなければループを飛ばします。
    obj = tag(tag_c)->GetObject();//タグの取り付けられたオブジェクトの取得
    println(obj->GetName());      //取得したオブジェクトの名前をコンソールに表示します。
  }
}

これで、選択されたポリゴンとポイントの選択範囲タグが取り付けられたオブジェクトの名前がコンソールに表示されます。

ただし、1つのオブジェクトに選択されたタグが2個あれば、名前も2度表示されますけどね。

R9.5 SDKの時に比べるとシンプルになりますね。

では、選択範囲タグが記録した選択範囲にヌルオブジェクトを配置してみましょう。

ここで考慮しておく事は、ポイントやポリゴンの選択範囲タグは、ポイントやポリゴンオブジェクト以外にも取り付けることが可能である事。

確かにライトやカメラ等のポイントにもポリゴンにも全く関係の無いオブジェクトに、メニューから選択範囲の記録は実行できません。
がしかし、スクリプトからや、既に取り付けられた選択範囲タグをドラッグして、ライト等の全く関係の無いオブジェクトに複製取り付けが可能であると言う事。

タグから取得したオブジェクトも、PointObject/PolygonObjectか判別しなければ、エラーが出るでしょう。

ま、エラーが出たら直せば良いのだけどね。

では、スクリプトです。

/*
複数選択されたタグの内、ポイントとポリゴンの選択範囲タグを判別し、
そのタグの取り付けられたオブジェクトの、選択範囲のエレメントに
ヌルオブジェクトを配置します。
2009.5.30
*/


main(doc , op)
{
  if(!tag(0))return;
  var tag_c;
  var obj;
  var kindofsel;  //選択された選択範囲タグの種類
  var sel;        //選択範囲タグの選択範囲
  var cs;         //判別用オブジェクトのクラス
  var gp , nulobj;//追加するヌルオブジェクト
  var name , pos; //追加するヌルオブジェクトの名前と位置
  var pts , pgs;  //オブジェクトのポイントとポリゴン
  var lpc , i;   //ループ回数とループカウンター


  doc->StartUndo();//Undo記録の開始


  //複数選択されたタグの捜査
  for(tag_c = 0 ; tag(tag_c) ; tag_c++){

    kindofsel = 0;

    //ポイント選択範囲タグの場合
    if(instanceof(tag(tag_c) , PointSelectionTag)){
      kindofsel = 1;
      cs = PointObject;
      name = "point_";
    }

    //ポリゴン選択範囲タグの場合
    if(instanceof(tag(tag_c) , PolygonSelectionTag)){
      kindofsel = 2;
      cs = PolygonObject;
      name = "polygon_";
    }
    if(!kindofsel)continue;

    //タグが取り付けられたオブジェクトを取得し、対象オブジェクト以外を除外
    obj = tag(tag_c)->GetObject();
    if(!instanceof(obj , cs))continue;


    doc->AddUndo(UNDO_OBJECT_REC , obj);//Undoに変更前のオブジェクトを記録


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

    pts = obj->GetPoints();//ポイント配列の取得
    sel = tag(tag_c)->GetSelection();//選択範囲から選択範囲を取得

    //繰り返し回数の取得
    switch(kindofsel){
      case 1://ポイント選択範囲タグの場合
        lpc = obj->GetPointCount();
        break;
      case 2://ポリゴン選択範囲タグの場合
        lpc = obj->GetPolygonCount();
        pgs = obj->GetPolygons();
    }


    //オブジェクトの選択範囲の為の捜査
    for(i = 0 ; i < lpc ; i++){
      if(!(sel->IsSelected(i)))continue;//選択範囲がカラの場合は処理を飛ばします

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

      //ヌルオブジェクトの位置の調整と適用
      switch(kindofsel){
        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);//位置の適用
    }

  }
}

半分以上が見覚えのあるコードになりました。
正確に言うと、なったのではなく、コピペして変更しました。

問題なく動作します。
ただし今回は、選択範囲タグが取り付けられていても、選択範囲が記録されていないカラの選択範囲の場合は何も適用しません。

|

« 以前作成した実用性の無い「選択オブジェクトにヌルオブジェクト配置する」スクリプトに、R11SDKのobject()関数を使用する | トップページ | C4D C.O.F.F.E.E.でポリゴンの座標を算出する関数について、考えてみる »