できてない事に気づいたΣ(°□°;)
というわけで、ここ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 件のコメント:
コメントを投稿