// 选中点的操作 void CPathFindEditDlg::DoSelPoint() { if(NULL == m_pListboxPointInRegion) { return; } // 得到选中的索引 int iIndex = m_pListboxPointInRegion->GetSelection(); unsigned long ulPointId = 0; if(-1 != iIndex) { // 得到点id ulPointId = (unsigned long)m_pListboxPointInRegion->GetClientData(iIndex); if(m_pAction) { DWORD dwOldID = m_ulCurPointId; DWORD dwMax, dwMin; FLOAT fDistance = 0.0f; Ogre::Vector3 p1, p2; //设置选中点 m_ulCurPointId = ulPointId; m_pAction->SelPoint(ulPointId); //求原先的选中点和新的选中点的折线距离 CUnreachRegion* pRegion = m_pAction->GetRegionById( m_ulCurRegionId ); if( dwOldID != m_ulCurPointId && pRegion ) { //试图得到原先点和选中点间的每一个点 dwMax = dwOldID > m_ulCurPointId ? dwOldID : m_ulCurPointId; dwMin = dwOldID > m_ulCurPointId ? m_ulCurPointId : dwOldID; for( DWORD dw = dwMin; dw <= dwMax; dw ++ ) { CPointInfo* pPoint = pRegion->GetPointInfoById1(dw); if( !pPoint ) continue; if( dw == dwMin ) { p1 = pPoint->GetPosition(); } else { p2 = pPoint->GetPosition(); fDistance += sqrtf( ( p1.x - p2.x ) * ( p1.x - p2.x ) + ( p1.y - p2.y ) * ( p1.y - p2.y ) + ( p1.z - p2.z ) * ( p1.z - p2.z ) ); p1 = p2; } } } } } }
// 点选择listbox响应的事件函数 void CPathFindEditDlg::OnPointListBox(wxCommandEvent &event) { if (event.GetInt() == -1) { return; } if(event.GetId() == ID_LISTBOX_POINT) { int iIndex = m_pListboxPointInRegion->GetSelection(); if( iIndex != -1 ) { CPointInfo* pInfo = m_pAction->GetRegionById( m_pAction->GetCurEditRegionId() )->GetPointInfoByIndex1( iIndex ); if( pInfo ) { float fTerrainDataPosX = m_pAction->getTerrainData()->mPosition.x; float fTerrainDataPosZ = m_pAction->getTerrainData()->mPosition.z; float fScale = 1.0; if( m_pAction->getSceneManipulator() ) { fScale = m_pAction->getSceneManipulator()->getBaseScale(); if(abs((float)fScale) < 0.00001) fScale = 1.0; } Ogre::Vector3 position = pInfo->GetPosition(); char buf[128]; sprintf( buf, "%.4f", (position.x - fTerrainDataPosX) / fScale ); m_pPointX->Clear(); m_pPointX->WriteText( buf ); sprintf( buf, "%.4f", (position.z - fTerrainDataPosZ) / fScale ); m_pPointZ->Clear(); m_pPointZ->WriteText( buf ); } } DoSelPoint(); } }