#include "StdAfx.h"
|
#include "CHReviewPrioritySorter/PrioritySorter_Aps.h"
|
#include <algorithm>
|
|
enum ProcessTypeSharp { PROCESS_TYPE_REVIEW=0, PROCESS_TYPE_WSI };
|
|
CPrioritySorter_Aps::CPrioritySorter_Aps(int nMaxPointCount) : CPrioritySorter(nMaxPointCount)
|
{
|
|
}
|
|
CPrioritySorter_Aps::~CPrioritySorter_Aps(void)
|
{
|
|
}
|
|
int CPrioritySorter_Aps::AddDefectPointPriority(int nPriorityData, const CRcpPriorityInfo *pRcpPriorityInfo)
|
{
|
return 1;
|
}
|
|
int CPrioritySorter_Aps::PrioritySorting()
|
{
|
return 0;
|
}
|
|
int CPrioritySorter_Aps::FilteringAndSorting()
|
{
|
if (m_pPS2P==NULL) return 0;
|
|
if (m_pGlassResult==NULL) return 0;
|
|
if (m_pRsRcpReviewInfo==NULL) return -1;
|
|
int nTotalPointCount = 0;
|
|
// Total Plan
|
int nRcpPlanCount = m_pRsRcpReviewInfo->GetRcpPlanInfoCount();
|
for (int nPlanIdx=0; nPlanIdx<nRcpPlanCount; nPlanIdx++)
|
{
|
const CRcpPlanInfo *pPlanInfo = m_pRsRcpReviewInfo->GetRcpPlanInfo(nPlanIdx);
|
if (pPlanInfo==NULL) continue;
|
|
int nPointCount = 0;
|
|
switch(pPlanInfo->GetReviewType())
|
{
|
case REVIEW_PLAN_DEFECT:
|
nPointCount = AddReviewPoint();
|
break;
|
|
case REVIEW_PLAN_WSI:
|
nPointCount = AddWsiPoint();
|
break;
|
|
case REVIEW_PLAN_USER:
|
nPointCount = AddUserPoint();
|
break;
|
|
case REVIEW_PLAN_MEASURE:
|
nPointCount = AddMeasurePoint();
|
break;
|
}
|
|
nTotalPointCount += nPointCount;
|
}
|
|
return nTotalPointCount;
|
}
|
|
int CPrioritySorter_Aps::AddReviewPoint()
|
{
|
int nTotalPointCount = 0;
|
|
// review result clear
|
m_vecDefectResultPtr.clear();
|
|
//MapDefectRsult & pDefectResult Define
|
const MapDefectResult* pMapDefectResult = m_pGlassResult->GetMapDefectResult();
|
if (pMapDefectResult==NULL)
|
{
|
return nTotalPointCount;
|
}
|
CDefectResult* pDefectResult = NULL;
|
|
int nCount = 1;//m_pRsRcpReviewInfo->GetRcpPriorityInfoCount();
|
|
for (int nIdx=0; nIdx<nCount; nIdx++)
|
{
|
const CRcpPriorityInfo *pPriorityInfo = m_pRsRcpReviewInfo->GetRcpPriorityInfo(nIdx);
|
if (pPriorityInfo==NULL) continue;
|
|
for(constMapDefectResultIt it=pMapDefectResult->begin();it!=pMapDefectResult->end();it++)
|
{
|
//pDefectResult´Â MapDefectResult<int,CDefectResult>¿¡¼ 2¹øÂ° °ª
|
pDefectResult = static_cast<CDefectResult*>(it->second);
|
if(pDefectResult == NULL || pDefectResult->bReviewAdded==TRUE) continue;
|
|
// check priority
|
//if (CheckReviewPriority(pPriorityInfo, pDefectResult) == FALSE) continue;
|
|
pDefectResult->nSortSection = nIdx;
|
m_vecDefectResultPtrTemp.push_back(pDefectResult);
|
|
pDefectResult->bReviewAdded = TRUE;
|
|
nTotalPointCount++;
|
}
|
|
const CRcpSortingInfo *pSortingInfo = m_pRsRcpReviewInfo->GetRcpReviewSortInfo();
|
|
if (pSortingInfo)
|
{
|
//SIZE
|
if (pSortingInfo->m_nSortType == RCP_SORT_TYPE_SIZE)
|
{
|
//DEC
|
if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_DECEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectSizeDescending);
|
}
|
else if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_ASCEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectSizeAscending);
|
}
|
}
|
else if (pSortingInfo->m_nSortType == RCP_SORT_TYPE_PEAK)
|
{
|
if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_DECEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectPeakDescending);
|
}
|
else if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_ASCEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectPeakAscending);
|
}
|
}
|
}
|
|
for(int i=0;i<m_vecDefectResultPtrTemp.size();i++)
|
{
|
m_vecDefectResultPtr.push_back(m_vecDefectResultPtrTemp[i]);
|
}
|
m_vecDefectResultPtrTemp.clear();
|
}
|
|
// °áÇÔ ¿ì¼±¼øÀ§ Á¤·Ä°á°ú Ãâ·Â
|
CString strFilename = _T("");
|
//strFilename.Format(_T("C:\\Users\\dit-344\\Desktop\\testfile\\Sorting_Review.csv"));
|
strFilename.Format(_T("D:\\Sorting_Review.csv"));
|
SaveDefectPoint(m_vecDefectResultPtr, strFilename);
|
|
// °á°ú ¸¸µé±â
|
return AddReviewDefectResult();
|
}
|
|
int CPrioritySorter_Aps::AddWsiPoint()//ÇÊÅÍ
|
{
|
int nTotalPointCount = 0;
|
|
// wsi result clear
|
m_vecDefectResultPtr.clear();
|
|
//MapDefectRsult & pDefectResult Define
|
const MapDefectResult* pMapDefectResult = m_pGlassResult->GetMapDefectResult();
|
if (pMapDefectResult==NULL)
|
{
|
return nTotalPointCount;
|
}
|
CDefectResult* pDefectResult = NULL;
|
|
// [2016:11:2]-[WEZASW] : Review ³»¿ë »ç¿ë -> FIC ±âÁØ¿¡¼ º¯°æ ÀÌ·Â È®ÀÎÇÊ¿ä.
|
#if 1
|
int nCount = m_pRsRcpReviewInfo->GetRcpPriorityInfoCount();
|
|
for (int nIdx=0; nIdx<nCount; nIdx++)
|
{
|
const CRcpPriorityInfo *pPriorityInfo = m_pRsRcpReviewInfo->GetRcpPriorityInfo(nIdx);
|
if (pPriorityInfo==NULL) continue;
|
|
for(constMapDefectResultIt it=pMapDefectResult->begin();it!=pMapDefectResult->end();it++)
|
{
|
//pDefectResult´Â MapDefectResult<int,CDefectResult>¿¡¼ 2¹øÂ° °ª
|
pDefectResult = static_cast<CDefectResult*>(it->second);
|
if(pDefectResult == NULL) continue;
|
|
// [2016:11:3]-[WEZASW] : ±âÁØ È®ÀÎÇÊ¿ä
|
// check priority
|
if (CheckReviewPriority(pPriorityInfo, pDefectResult) == FALSE) continue;
|
|
pDefectResult->nSortSection = nIdx;
|
m_vecDefectResultPtrTemp.push_back(pDefectResult);
|
nTotalPointCount++;
|
}
|
|
const CRcpSortingInfo *pSortingInfo = m_pRsRcpReviewInfo->GetRcpWSISortInfo();
|
|
if (pSortingInfo)
|
{
|
//SIZE
|
if (pSortingInfo->m_nSortType == RCP_SORT_TYPE_SIZE)
|
{
|
//DEC
|
if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_DECEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectSizeDescending);
|
}
|
else if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_ASCEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectSizeAscending);
|
}
|
}
|
else if (pSortingInfo->m_nSortType == RCP_SORT_TYPE_PEAK)
|
{
|
if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_DECEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectPeakDescending);
|
}
|
else if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_ASCEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectPeakAscending);
|
}
|
}
|
}
|
for(int i=0;i<m_vecDefectResultPtrTemp.size();i++)
|
{
|
m_vecDefectResultPtr.push_back(m_vecDefectResultPtrTemp[i]);
|
}
|
m_vecDefectResultPtrTemp.clear();
|
}
|
#else
|
int nFilterCount = m_pRsRcpReviewInfo->GetRcpWSIFilterInfoCount();
|
|
for (int nFilterIdx=0; nFilterIdx<nFilterCount; nFilterIdx++)
|
{
|
const CRcpFilteringInfo *pFilterInfo = m_pRsRcpReviewInfo->GetRcpWSIFilterInfo(nFilterIdx);
|
if (pFilterInfo==NULL) continue;
|
|
for(constMapDefectResultIt it=pMapDefectResult->begin();it!=pMapDefectResult->end();it++)
|
{
|
//pDefectResult´Â MapDefectResult<int,CDefectResult>¿¡¼ 2¹øÂ° °ª
|
pDefectResult = static_cast<CDefectResult*>(it->second);
|
if(pDefectResult == NULL) continue;
|
|
// [2016:11:4]-[WEZASW] : È®ÀÎ - WSI ¿ì¼±¼øÀ§ ¹× Á¤·Ä »ó¾ç È®ÀÎ ÇÊ¿ä.
|
if((pDefectResult->nJudgeType-1) != pFilterInfo->m_FilterJudge)
|
continue;
|
if((pDefectResult->nSubType-1) != pFilterInfo->m_FilterSubType)
|
continue;
|
if(pFilterInfo->m_FilterCode.Compare(_T("")) != 0)
|
{
|
if(pDefectResult->strDefectCode.Compare(pFilterInfo->m_FilterCode) != 0)
|
continue;
|
}
|
pDefectResult->nSortSection = nFilterIdx;
|
m_vecDefectResultPtrTemp.push_back(pDefectResult);
|
nTotalPointCount++;
|
}
|
|
const CRcpSortingInfo *pSortingInfo = m_pRsRcpReviewInfo->GetRcpWSISortInfo();
|
|
if (pSortingInfo)
|
{
|
//SIZE
|
if (pSortingInfo->m_nSortType == RCP_SORT_TYPE_SIZE)
|
{
|
//DEC
|
if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_DECEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectSizeDescending);
|
}
|
else if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_ASCEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectSizeAscending);
|
}
|
}
|
else if (pSortingInfo->m_nSortType == RCP_SORT_TYPE_PEAK)
|
{
|
if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_DECEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectPeakDescending);
|
}
|
else if (pSortingInfo->m_nSortData == RCP_SORT_DATA_ORDER_ASCEND)
|
{
|
std::sort(m_vecDefectResultPtrTemp.begin(), m_vecDefectResultPtrTemp.end(), CompareDefectPeakAscending);
|
}
|
}
|
}
|
for(int i=0;i<m_vecDefectResultPtrTemp.size();i++)
|
{
|
m_vecDefectResultPtr.push_back(m_vecDefectResultPtrTemp[i]);
|
}
|
m_vecDefectResultPtrTemp.clear();
|
}
|
#endif
|
|
// °áÇÔ ¿ì¼±¼øÀ§ Á¤·Ä°á°ú Ãâ·Â
|
CString strFilename = _T("");
|
// strFilename.Format(_T("C:\\Users\\dit-344\\Desktop\\testfile\\Sorting_WSI.csv"));
|
strFilename.Format(_T("D:\\Sorting_WSI.csv"));
|
|
SaveDefectPoint(m_vecDefectResultPtr, strFilename);
|
|
// °á°ú ¸¸µé±â..
|
return AddWsiDefectResult();
|
}
|
|
int CPrioritySorter_Aps::AddUserPoint()
|
{
|
int nTotalCount = 0;
|
SReviewResult sResult;
|
int nPointCount = m_pRsRcpReviewInfo->GetRcpUserDefectInfoCount();
|
for (int nPointIdx=0; nPointIdx<nPointCount; nPointIdx++)
|
{
|
const CRcpUserDefectInfo *pDefectInfo = m_pRsRcpReviewInfo->GetRcpUserDefectInfo(nPointIdx);
|
if (pDefectInfo==NULL) continue;
|
|
sResult.Reset();
|
|
sResult.nUMOriginX = int(pDefectInfo->GetPosX() * 1000.0);
|
sResult.nUMOriginY = int(pDefectInfo->GetPosY() * 1000.0);
|
|
sResult.nReviewType = ReviewType_User;
|
sResult.nModuleIdx = -1;
|
sResult.nResultIdx = nPointIdx;
|
|
sResult.nZoomIdx = -1;
|
sResult.dMagnification = 1.0;
|
sResult.dMeasureResolution = 1.0;
|
sResult.bDigitalZoom = FALSE;
|
|
sResult.strCellID = _T(""); // cell id add
|
|
m_vecSortingResultUser.push_back(sResult);
|
|
nTotalCount++;
|
}
|
|
return nTotalCount;
|
}
|
|
int CPrioritySorter_Aps::AddMeasurePoint()
|
{
|
int nTotalCount = 0;
|
SReviewResult sResult;
|
int nPointCount = m_pRsRcpMeasureInfo->GetRcpMeasureInfoCount();
|
|
for (int nPointIdx=0; nPointIdx<nPointCount; nPointIdx++)
|
{
|
const CRcpMeasureInfo *pInfo = m_pRsRcpMeasureInfo->GetRcpMeasureInfo(nPointIdx);
|
if (pInfo==NULL) continue;
|
|
sResult.Reset();
|
|
sResult.nReviewType = ReviewType_Measure;
|
sResult.nUMOriginX = int(pInfo->GetPosX() * 1000.0);
|
sResult.nUMOriginY = int(pInfo->GetPosY() * 1000.0);
|
|
|
sResult.nModuleIdx = pInfo->GetModuleIdx();
|
sResult.nResultIdx = pInfo->GetResultIdx();
|
|
sResult.nMeasure_RecipeIndex = pInfo->GetMeasureModelIdx();
|
sResult.nZoomIdx = pInfo->GetMagnificationIdx();
|
|
sResult.dMagnification = 1.0;
|
sResult.dMeasureResolution = 1.0;
|
sResult.bDigitalZoom = FALSE;
|
|
sResult.strCellID = _T(""); // cell id add
|
|
m_vecSortingResultMeasure.push_back(sResult);
|
|
nTotalCount++;
|
}
|
|
return nTotalCount;
|
}
|
|
int CPrioritySorter_Aps::AddReviewDefectResult(int nModuleIdx)
|
{
|
int nResultIdx = 0;
|
SReviewResult sResult;
|
CDefectResult *pDefectResult = NULL;
|
for (VectorDetectResultPrtIt it=m_vecDefectResultPtr.begin(); it!=m_vecDefectResultPtr.end(); it++)
|
{
|
pDefectResult = static_cast<CDefectResult*>(*it);
|
if(pDefectResult == NULL) continue;
|
|
// clear review result
|
sResult.Reset();
|
|
// set defect result
|
*(dynamic_cast<CDefectResult*>(&sResult)) = *pDefectResult;
|
|
sResult.nReviewType = ReviewType_Review;
|
sResult.nModuleIdx = nModuleIdx;
|
sResult.nResultIdx = nResultIdx++;
|
|
sResult.nZoomIdx = -1;
|
sResult.dMagnification = 1.0;
|
sResult.dMeasureResolution = 1.0;
|
sResult.bDigitalZoom = FALSE;
|
|
m_vecSortingResult.push_back(sResult);
|
}
|
|
return int(m_vecSortingResult.size());
|
}
|
|
int CPrioritySorter_Aps::AddWsiDefectResult(int nModuleIdx)
|
{
|
int nResultIdx = 0;
|
SReviewResult sResult;
|
CDefectResult *pDefectResult = NULL;
|
for (VectorDetectResultPrtIt it=m_vecDefectResultPtr.begin(); it!=m_vecDefectResultPtr.end(); it++)
|
{
|
pDefectResult = static_cast<CDefectResult*>(*it);
|
if(pDefectResult == NULL) continue;
|
|
// clear review result
|
sResult.Reset();
|
|
// set defect result
|
*(dynamic_cast<CDefectResult*>(&sResult)) = *pDefectResult;
|
|
sResult.nReviewType = ReviewType_Wsi;
|
sResult.nModuleIdx = nModuleIdx;
|
sResult.nResultIdx = nResultIdx++;
|
|
m_vecSortingResultWsi.push_back(sResult);
|
}
|
|
return 1;
|
}
|
|
BOOL CPrioritySorter_Aps::CheckReviewPriority(const CRcpPriorityInfo* pPriorityInfo, CDefectResult* pDefectResult)
|
{
|
if (pPriorityInfo==NULL || pDefectResult==NULL) return FALSE;
|
|
// check optic
|
if (pPriorityInfo->GetPriorityOpticData() != RCP_PRIORITY_ORDER_OPTIC_ALL)
|
{
|
if (pDefectResult->nOpticType != pPriorityInfo->GetPriorityOpticData()) return FALSE;
|
}
|
|
// check gray
|
if (pPriorityInfo->GetPriorityGrayData() != RCP_PRIORITY_ORDER_GRAY_ALL)
|
{
|
if (pDefectResult->nGrayType != pPriorityInfo->GetPriorityGrayData()) return FALSE;
|
}
|
|
// check stack
|
if (pPriorityInfo->GetPriorityStackData() != RCP_PRIORITY_ORDER_STACK_ALL)
|
{
|
if (pDefectResult->nStackType != pPriorityInfo->GetPriorityStackData()) return FALSE;
|
}
|
|
return TRUE;
|
}
|