2012年2月21日火曜日

Softimage C++ : Select Polygons

C++でインデックスからポリゴンの選択が
できてない事に気づいたΣ(°□°;)


というわけで、ここ1週間、ポリゴンの選択について悩んでました

なかなかにC++楽しませてくれます orz
結果として一度テキストデーターにしてます。

もっとスマートな方法があるかも

他の方法があれば教えてやってください。


Select Polygons

以下コードの抜粋

 Application app;

 //選択したオブジェクト
 Selection oSel(app.GetSelection());

 //X3DObject‚にキャスト
 X3DObject oObj(oSel[0]);
 app.LogMessage(L"SelectObject = " + CValue(oObj.GetFullName()).GetAsText());

 //メッシュを取得
 PolygonMesh oMesh( oObj.GetActivePrimitive().GetGeometry() );
 CPolygonFaceRefArray oPolygons(oMesh.GetPolygons());

 //選択を解除
 oSel.Clear();

//--------------------------------------------------------------
//
//選択する頂点のアレイを用意
//
//--------------------------------------------------------------

 //とりあえず、頂点のアレイを作成‚ [0,1,3]
 int const alength = 3;
 long IndexArray[alength];
 IndexArray[0] = 0;
 IndexArray[1] = 1;
 IndexArray[2] = 3;


//--------------------------------------------------------------
//
//選択する文字列を作成
//
//--------------------------------------------------------------

A.CLongArrayで頂点の配列から、テキストデーターを取得
 CLongArray aIndex;
 for (int i = 0; i < alength; i++){
  CRef ref(oPolygons[IndexArray[i]]);
  aIndex.Add(PolygonFace(ref).GetIndex());
 }
 app.LogMessage(CString(aIndex.GetAsText()));
 CString strSelect(aIndex.GetAsText());


B.テキストを直接作成する方法
 CString strSelect = L"";
 for (int i = 0; i < alength; i++){
  //最後の "," が不要なので場合分け
  if(i == alength - 1)
   strSelect += CString( (CValue(IndexArray[i]).GetAsText() )       );
  else
   strSelect += CString( (CValue(IndexArray[i]).GetAsText() ) + L",");
 }


//--------------------------------------------------------------
//
//文字列からポリゴンを選択
//
//--------------------------------------------------------------

A.新規選択の場合SetAsText‚でOK
 oSel.SetAsText(CString(oObj.GetFullName()) + L".poly[ " + strSelect + L"]");


B.追加選択等の場合はStringsを CRefに設定する必要がある
 CRef ref;
 ref.Set(CString(oObj.GetFullName()) + L".poly[ " + strSelect + L"]");

 //選択
 oSel.Add(ref);


うーん、一度SubComponentとかにすればいい気もするけど、
それを作るなら、結局の所、テキストデーターで直打ちでも・・・

なにかしら、定石があれば知りたいです


追記

選択はB.の一度CRefに変換した方が良いみたい。
(選択状態がポリゴンに変更された)

また、[0,1,2,3,3]などで、3が重複した場合は、
選択が解除されるので注意が必要、
選択>選択解除 のトグルなのかな?
地味にハマりました orz

0 件のコメント:

コメントを投稿