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