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