// SptPtSort.cpp: implementation of the CSptPtSort class. // ////////////////////////////////////////////////////////////////////// #include "geomative.h" #include "SptPtSort.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CSptPtSort::CSptPtSort() { } CSptPtSort::~CSptPtSort() { } bool CSptPtSort::MultiChannlePtSortForMNB(CPtrArray* pSptPtArray) { if (NULL == pSptPtArray) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("pSptPtArray不能为空")); else MessageBoxEx(NULL, _T("pSptPtArray can not be null."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_mapSptKey.clear(); STSptPtSubKetVt sptKeyInfoVt; int iSize = pSptPtArray->GetSize(); CSptRecord *pSptRecord = NULL; std::map::iterator iter; STSptPtSubKetVt stSptPtVt; //首先构建MAP表 int i = 0; for (i = 0; i < iSize; i++) { pSptRecord = (CSptRecord*)pSptPtArray->GetAt(i); if (pSptRecord == NULL) continue; //int iATmp = (pSptRecord->m_iC1 < 1) ? 0 : pSptRecord->m_iC1; //int iAB = ((iATmp << 16) | (WORD)(pSptRecord->m_iC2)); iter = m_mapSptKey.find(pSptRecord->m_iTsn); STSptPtSubKeyInfo stSubKeyInfo; stSubKeyInfo.iPosIndex = i; stSubKeyInfo.wMPt = pSptRecord->m_iP1; stSubKeyInfo.wNPt = pSptRecord->m_iP2; stSubKeyInfo.bIsFind = false; //如果查找到 if (iter != m_mapSptKey.end()) { iter->second.mapSptSubkeyInfo[pSptRecord->m_iP1] = stSubKeyInfo; } //如果没有查找到则将新的点作为节点插入 else { stSptPtVt.ClearContent(); stSptPtVt.mapSptSubkeyInfo[pSptRecord->m_iP1] = stSubKeyInfo; m_mapSptKey[pSptRecord->m_iTsn] = stSptPtVt; } } CPtrArray sortPtrArr; sortPtrArr.RemoveAll(); iter = m_mapSptKey.begin(); //开始遍历整个MAP表,获取排序后的 for (; iter != m_mapSptKey.end(); iter++) { int iFindCnt = 1; std::map::iterator subIter = iter->second.mapSptSubkeyInfo.begin(); sortPtrArr.Add(pSptPtArray->GetAt(subIter->second.iPosIndex)); int iSize = iter->second.mapSptSubkeyInfo.size(); subIter->second.bIsFind = true; int iN = subIter->second.wNPt; std::map::iterator iterLastMinM = subIter; while (iFindCnt < iSize) { subIter = iter->second.mapSptSubkeyInfo.find(iN); //用此时的N去查找,如果查找到,则直接用该值作为下一个MN的位置 if (subIter != iter->second.mapSptSubkeyInfo.end()) { sortPtrArr.Add(pSptPtArray->GetAt(subIter->second.iPosIndex)); iN = subIter->second.wNPt; subIter->second.bIsFind = true; } else { while (iterLastMinM != iter->second.mapSptSubkeyInfo.end()) { iterLastMinM++; //如果没有被使用 if (false == iterLastMinM->second.bIsFind) { iterLastMinM->second.bIsFind = true; sortPtrArr.Add(pSptPtArray->GetAt(iterLastMinM->second.iPosIndex)); iN = iterLastMinM->second.wNPt; break; } } } iFindCnt++; } } //开始将排序好的链表代替原有的 if (iSize != sortPtrArr.GetSize()) { CString strErr = _T(""); if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("多通道错误的排序点。初始大小= %d,排序大小= %d"), iSize, sortPtrArr.GetSize()); AfxMessageBox(strErr); } else { strErr.Format(_T("Sort point of multi-channel error.orginal size = %d, sort size = %d"), iSize, sortPtrArr.GetSize()); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } pSptPtArray->RemoveAll(); int iTsn = 0; CString strLog; strLog.Format(_T("\n\nCSptPtSort::MultiChannlePtSortForMNB 测点排序----------------begin---\n")); OutputDebugString(strLog); for (i = 0; i < iSize; i++) { pSptRecord = (CSptRecord*)sortPtrArr.GetAt(i); pSptRecord->m_iTsn = ++iTsn; strLog.Format(_T("CSptPtSort::MultiChannlePtSortForMNB Tsn=%d,A=%d,M=%d,N=%d,B=%d,k=%d,n=%d,level=%d\n"), pSptRecord->m_iTsn, pSptRecord->m_iC1, pSptRecord->m_iP1, pSptRecord->m_iP2, pSptRecord->m_iC2, pSptRecord->m_fK, pSptRecord->m_iN, pSptRecord->m_iLevel); OutputDebugString(strLog); pSptPtArray->Add(pSptRecord); } strLog.Format(_T("CSptPtSort::MultiChannlePtSortForMNB 测点排序----------------end---\n\n")); OutputDebugString(strLog); return true; } bool CSptPtSort::MultiChannlePtSort(CPtrArray* pSptPtArray) { if (NULL == pSptPtArray) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("pSptPtArray不能为空")); else MessageBoxEx(NULL, _T("pSptPtArray can not be null."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_mapSptKey.clear(); STSptPtSubKetVt sptKeyInfoVt; int iSize = pSptPtArray->GetSize(); CSptRecord *pSptRecord = NULL; std::map::iterator iter; STSptPtSubKetVt stSptPtVt; //首先构建MAP表 int i = 0; for (i = 0; i < iSize; i++) { pSptRecord = (CSptRecord*)pSptPtArray->GetAt(i); int iATmp = (pSptRecord->m_iC1 < 1 ) ? 0 : pSptRecord->m_iC1; int iAB = ((iATmp << 16) | (WORD)(pSptRecord->m_iC2)); iter = m_mapSptKey.find(iAB); STSptPtSubKeyInfo stSubKeyInfo; stSubKeyInfo.iPosIndex = i; stSubKeyInfo.wMPt = pSptRecord->m_iP1; stSubKeyInfo.wNPt = pSptRecord->m_iP2; stSubKeyInfo.bIsFind = false; //如果查找到 if (iter != m_mapSptKey.end()) { iter->second.mapSptSubkeyInfo[pSptRecord->m_iP1] = stSubKeyInfo; } //如果没有查找到则将新的点作为节点插入 else { stSptPtVt.ClearContent(); stSptPtVt.mapSptSubkeyInfo[pSptRecord->m_iP1] = stSubKeyInfo; m_mapSptKey[iAB] = stSptPtVt; } } CPtrArray sortPtrArr; sortPtrArr.RemoveAll(); iter = m_mapSptKey.begin(); //开始遍历整个MAP表,获取排序后的 for (; iter != m_mapSptKey.end(); iter++) { int iFindCnt = 1; std::map::iterator subIter = iter->second.mapSptSubkeyInfo.begin(); sortPtrArr.Add(pSptPtArray->GetAt(subIter->second.iPosIndex)); int iSize = iter->second.mapSptSubkeyInfo.size(); subIter->second.bIsFind = true; int iN = subIter->second.wNPt; std::map::iterator iterLastMinM = subIter; while(iFindCnt < iSize) { subIter = iter->second.mapSptSubkeyInfo.find(iN); //用此时的N去查找,如果查找到,则直接用该值作为下一个MN的位置 if (subIter != iter->second.mapSptSubkeyInfo.end()) { sortPtrArr.Add(pSptPtArray->GetAt(subIter->second.iPosIndex)); iN = subIter->second.wNPt; subIter->second.bIsFind = true; } else { while(iterLastMinM != iter->second.mapSptSubkeyInfo.end()) { iterLastMinM++; //如果没有被使用 if (false == iterLastMinM->second.bIsFind) { iterLastMinM->second.bIsFind = true; sortPtrArr.Add(pSptPtArray->GetAt(iterLastMinM->second.iPosIndex)); iN = iterLastMinM->second.wNPt; break; } } } iFindCnt++; } } //开始将排序好的链表代替原有的 if (iSize != sortPtrArr.GetSize()) { CString strErr = _T(""); if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("多通道错误的排序点。初始大小= %d,排序大小= %d"), iSize, sortPtrArr.GetSize()); AfxMessageBox(strErr); } else { strErr.Format(_T("Sort point of multi-channel error.orginal size = %d, sort size = %d"), iSize, sortPtrArr.GetSize()); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } pSptPtArray->RemoveAll(); int iTsn = 0; for (i = 0; i < iSize; i++) { pSptRecord = (CSptRecord*)sortPtrArr.GetAt(i); pSptRecord->m_iTsn = ++iTsn; pSptPtArray->Add(pSptRecord); } return true; } bool CSptPtSort::MultiChannlePtCplSort(CPtrArray* pSptPtArray) { if (NULL == pSptPtArray) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("pSptPtArray不能为空")); else MessageBoxEx(NULL, _T("pSptPtArray can not be null."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_mapSptKey.clear(); STSptPtSubKetVt sptKeyInfoVt; int iSize = pSptPtArray->GetSize(); CSptRecord *pSptRecord = NULL; std::map::iterator iter; STSptPtSubKetVt stSptPtVt; //首先构建MAP表 int i = 0; for (i = 0; i < iSize; i++) { pSptRecord = (CSptRecord*)pSptPtArray->GetAt(i); int iATmp = (pSptRecord->m_iC1 < 1 ) ? 0 : pSptRecord->m_iC1; int iAB = ((iATmp << 16) | (WORD)(pSptRecord->m_iC2)); iter = m_mapSptKey.find(iAB); STSptPtSubKeyInfo stSubKeyInfo; stSubKeyInfo.iPosIndex = i; stSubKeyInfo.wMPt = pSptRecord->m_iP1; stSubKeyInfo.wNPt = pSptRecord->m_iP2; stSubKeyInfo.bIsFind = false; std::map::iterator iterCplSubKey; //如果查找到AB if (iter != m_mapSptKey.end()) { //继续查找M iterCplSubKey = iter->second.mapSptCplSubkey.find(stSubKeyInfo.wMPt); //如果查找到M,则往同一个M的容器里插入 if (iterCplSubKey != iter->second.mapSptCplSubkey.end()) iterCplSubKey->second.vtSptSubkey.push_back(stSubKeyInfo); else { STSptPtCplSubkeyInfo stCplSubKeyTmp; stCplSubKeyTmp.vtSptSubkey.push_back(stSubKeyInfo); iter->second.mapSptCplSubkey[stSubKeyInfo.wMPt] = stCplSubKeyTmp; } } //如果没有查找到则将新的点作为节点插入 else { stSptPtVt.ClearContent(); STSptPtCplSubkeyInfo stCplSubKey; stCplSubKey.vtSptSubkey.push_back(stSubKeyInfo); stSptPtVt.mapSptCplSubkey[stSubKeyInfo.wMPt] = stCplSubKey; m_mapSptKey[iAB] = stSptPtVt; } } CPtrArray sortPtrArr; sortPtrArr.RemoveAll(); iter = m_mapSptKey.begin(); //开始遍历整个MAP表,获取排序后的 for (; iter != m_mapSptKey.end(); iter++) { std::map::iterator iterCplSubKey = iter->second.mapSptCplSubkey.begin(); for (; iterCplSubKey != iter->second.mapSptCplSubkey.end(); iterCplSubKey++) { //开始遍历同一个M值里的vector的循环 while(1) { int iIndex = iterCplSubKey->second.FindMinNPosIndex(); if (iIndex < 0) { break; } sortPtrArr.Add(pSptPtArray->GetAt(iterCplSubKey->second.vtSptSubkey[iIndex].iPosIndex)); WORD wNPos = iterCplSubKey->second.vtSptSubkey[iIndex].wNPt; iterCplSubKey->second.vtSptSubkey[iIndex].bIsFind = true; std::map::iterator iterTmp; while(1) { //此时开始以N的值作为M来进行搜索 iterTmp = iter->second.mapSptCplSubkey.find(wNPos); //如果没有找到则退出循环 if (iterTmp == iter->second.mapSptCplSubkey.end()) { break; } //如果找到的,之前已经被用过了,也推出循环 int iTmpIndex = iterTmp->second.FindMinNPosIndex(); if (iTmpIndex < 0) { break; } sortPtrArr.Add(pSptPtArray->GetAt(iterTmp->second.vtSptSubkey[iTmpIndex].iPosIndex)); iterTmp->second.vtSptSubkey[iTmpIndex].bIsFind = true; wNPos = iterTmp->second.vtSptSubkey[iTmpIndex].wNPt; } } } } //开始将排序好的链表代替原有的 if (iSize != sortPtrArr.GetSize()) { CString strErr = _T(""); if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("多通道错误的排序点。初始大小= %d,排序大小= %d"), iSize, sortPtrArr.GetSize()); AfxMessageBox(strErr); } else { strErr.Format(_T("Sort point of multi-channel error.orginal size = %d, sort size = %d"), iSize, sortPtrArr.GetSize()); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } pSptPtArray->RemoveAll(); int iTsn = 0; for (i = 0; i < iSize; i++) { pSptRecord = (CSptRecord*)sortPtrArr.GetAt(i); pSptRecord->m_iTsn = ++iTsn; pSptPtArray->Add(pSptRecord); } return true; }