SDC C-Project CF Review 프로그램
12c02f064db12d6d94063bf6dd9e4eb80f4252b8..26e2541b87ca76e16cf69399eb9a3cce62d2e864
2021-10-14 LYW
Ongoing80 #3671 CF AOI Review 전설비 Align Matching 방법 개선
26e254 비교 | 트리
2021-10-14 LYW
Ongoing60 #3671 CF AOI Review 전설비 Align Matching 방법 개선
e8ba1e 비교 | 트리
15개 파일 변경됨
443 ■■■■■ 파일 변경됨
ReviewSystem/CHAlignFinder/AlignFinder.cpp 30 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHReviewRecipe/Rcp_RsAlignManager.cpp 28 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHReviewRecipe/RsRcpAlignInfo.cpp 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewRecipeEditor/DlgAlign.cpp 147 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewRecipeEditor/DlgAlign.h 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewRecipeEditor/ReviewRecipeEditor.rc 42 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewRecipeEditor/resource.h 4 ●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/CameraControlAlign.cpp 114 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/CameraControlAlign.h 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewInterface.cpp 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewInterface.h 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/CHAlignFinder/AlignFinderParam.h 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/CHReviewRecipe/RsRcpAlignInfo.h 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/CHReviewResult/AlignResult.h 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHAlignFinder/AlignFinder.cpp
@@ -157,11 +157,14 @@
        return findResult;
    }
    /*< LYW 20211013 - #3671 Delete Start >*/
    // step2. edge find
    if (FindAlignEdge(findResult)==1)
    {
        return findResult;
    }
//     if (FindAlignEdge(findResult) == 1)
//     {
//         return findResult;
//     }
    /*< LYW 20211013 - #3671 Delete End >*/
    return findResult;
}
@@ -205,11 +208,13 @@
    CCHImageData tempImage;
    CCHImageProcess::ImageNormalize(&resultImage, &m_BlobImage, 0, 255);
    if (findResult.dMatchValue<m_findParam.dMatchRate)
    {
        findResult.nResultCode = AlignMatch_LowScore;
        return 0;
    }
    /*< LYW 20211013 - #3671 Delete Start >*/
//     if (findResult.dMatchValue < m_findParam.dMatchRate)
//     {
//         findResult.nResultCode = AlignMatch_LowScore;
//         return 0;
//     }
    /*< LYW 20211013 - #3671 Delete End >*/
    // step5. Make Result 이미지
    findResult.nResultCode = AlignMatch_Success;
@@ -223,6 +228,13 @@
        m_ResultImage.DrawRectangle(CPoint((int)(dResultX+0.5), (int)(dResultY+0.5)), CPoint((int)(dResultX+m_pTempImage->GetWidth()+0.5), (int)(dResultY+m_pTempImage->GetHeight()+0.5)), RGB(255,255,255), 2);
    }
    /*< LYW 20211013 - #3671 ADD Start >*/
    if (findResult.dMatchValue < m_findParam.dMatchRate)
    {
        findResult.nResultCode = AlignMatch_LowScore;
        return 0;
    }
    /*< LYW 20211013 - #3671 ADD End >*/
    return 1;
}
ReviewSystem/CHReviewRecipe/Rcp_RsAlignManager.cpp
@@ -34,6 +34,20 @@
    strItem.Format(_T("RCP_ALIGN_SECOND_IMAGE_FILE"));
    macroFile.SetItem(strItem, m_rsRcpAlignInfo.m_strSecondImageFile);
    /*< LYW 20211012 - #3671 ADD Start >*/
    strItem.Format(_T("RCP_ALIGN_FIRST_ASSISTANT_IMAGE_FILE"));
    macroFile.SetItem(strItem, m_rsRcpAlignInfo.m_strFirstAssistantImageFile);
    strItem.Format(_T("RCP_ALIGN_SECOND_ASSISTANT_IMAGE_FILE"));
    macroFile.SetItem(strItem, m_rsRcpAlignInfo.m_strSecondAssistantImageFile);
    strItem.Format(_T("RCP_ALIGN_MATCHING_PIXEL_STANDARD"));
    macroFile.SetItem(strItem, m_rsRcpAlignInfo.m_strMatchingPixelStandard);
    strItem.Format(_T("RCP_ALIGN_MATCHING_ALARM_CONDITION"));
    macroFile.SetItem(strItem, m_rsRcpAlignInfo.m_strMatchingAlarmCondition);
    /*< LYW 20211012 - #3671 ADD End >*/
    strItem.Format(_T("RCP_ALIGN_TOTAL_PITCH_IMAGE_FILE"));
    macroFile.SetItem(strItem, m_rsRcpAlignInfo.m_strTotalPitchImageFile);
@@ -127,6 +141,20 @@
    strItem.Format(_T("RCP_ALIGN_SECOND_IMAGE_FILE"));
    macroFile.GetItem(strItem, m_rsRcpAlignInfo.m_strSecondImageFile, _T(""));
    /*< LYW 20211012 - #3671 ADD Start >*/
    strItem.Format(_T("RCP_ALIGN_FIRST_ASSISTANT_IMAGE_FILE"));
    macroFile.GetItem(strItem, m_rsRcpAlignInfo.m_strFirstAssistantImageFile, _T(""));
    strItem.Format(_T("RCP_ALIGN_SECOND_ASSISTANT_IMAGE_FILE"));
    macroFile.GetItem(strItem, m_rsRcpAlignInfo.m_strSecondAssistantImageFile, _T(""));
    strItem.Format(_T("RCP_ALIGN_MATCHING_PIXEL_STANDARD"));
    macroFile.GetItem(strItem, m_rsRcpAlignInfo.m_strMatchingPixelStandard, _T("0"));
    strItem.Format(_T("RCP_ALIGN_MATCHING_ALARM_CONDITION"));
    macroFile.GetItem(strItem, m_rsRcpAlignInfo.m_strMatchingAlarmCondition, _T("0"));
    /*< LYW 20211012 - #3671 ADD End >*/
    strItem.Format(_T("RCP_ALIGN_TOTAL_PITCH_IMAGE_FILE"));
    macroFile.GetItem(strItem, m_rsRcpAlignInfo.m_strTotalPitchImageFile, _T(""));
ReviewSystem/CHReviewRecipe/RsRcpAlignInfo.cpp
@@ -20,6 +20,12 @@
    m_dMatchingRate = 0.9;
    m_strFirstImageFile = _T("");
    m_strSecondImageFile = _T("");
    /*< LYW 20211012 - #3671 ADD Start >*/
    m_strFirstAssistantImageFile = _T("");
    m_strSecondAssistantImageFile = _T("");
    m_strMatchingPixelStandard = _T("");
    m_strMatchingAlarmCondition = _T("");
    /*< LYW 20211012 - #3671 ADD End >*/
    m_strTotalPitchImageFile= _T("");
    // edge find param
    m_bUseEdge = TRUE;
ReviewSystem/ReviewRecipeEditor/DlgAlign.cpp
@@ -16,9 +16,15 @@
    CDlgAlign::CDlgAlign(CWnd* pParent /*=NULL*/)
    : CDialog(CDlgAlign::IDD, pParent)
    , m_dMatchingPixelStandard(0)
    , m_dMatchingAlarmCondition(0)
{
    m_pFirstView = new CCHImageView(this);
    m_pSecondView = new CCHImageView(this);
    /*< LYW 20211012 - #3671 ADD Start >*/
    m_pFirstAssistantView = new CCHImageView(this);
    m_pSecondAssistantView = new CCHImageView(this);
    /*< LYW 20211012 - #3671 ADD End >*/
}
CDlgAlign::~CDlgAlign()
@@ -34,7 +40,19 @@
        delete m_pSecondView;
        m_pSecondView = NULL;
    }
    /*< LYW 20211012 - #3671 ADD Start >*/
    if (m_pFirstAssistantView)
    {
        delete m_pFirstAssistantView;
        m_pFirstAssistantView = NULL;
    }
    if (m_pSecondAssistantView)
    {
        delete m_pSecondAssistantView;
        m_pSecondAssistantView = NULL;
    }
    /*< LYW 20211012 - #3671 ADD End >*/
}
void CDlgAlign::DoDataExchange(CDataExchange* pDX)
@@ -55,6 +73,8 @@
    DDX_Control(pDX, IDC_CHECK_EDGEALIGN_PROCESS, m_ctrlCheckEdgeAlignProcess);
    DDX_Control(pDX, IDC_CHECK_ALIGN_SKIP, m_ctrlCheckAlignSkip);
    DDX_Control(pDX, IDC_CHECK_TOTALPITCHMEASRE, m_ctrlTotalPitchMeasure);
    DDX_Text(pDX, IDC_EDIT_MATCHONG_PIXEL_STANDARD, m_dMatchingPixelStandard);
    DDX_Text(pDX, IDC_EDIT_MATCHING_ALARM_CONDITION, m_dMatchingAlarmCondition);
}
@@ -100,6 +120,16 @@
        {
            m_pSecondView->Invalidate(TRUE);
        }
        /*< LYW 20211012 - #3671 ADD Start >*/
        else if (nIdx == 2 && m_pFirstAssistantView->LoadImage(strFilepath))
        {
            m_pFirstAssistantView->Invalidate(TRUE);
        }
        else if (nIdx == 3 && m_pSecondAssistantView->LoadImage(strFilepath))
        {
            m_pSecondAssistantView->Invalidate(TRUE);
        }
        /*< LYW 20211012 - #3671 ADD End >*/
        
        m_ctrlGridAlignImageInfo.SetItemText(nIdx, 1, strFilename);
@@ -131,8 +161,8 @@
        CRect rect;
        rect.left = 10;
        rect.top = 550;
        rect.right = rect.left + 232;
        rect.bottom = rect.top + 232;
        rect.right = rect.left + 150;
        rect.bottom = rect.top + 150;
        m_pFirstView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY , rect, this, 0);
        m_pFirstView->SetDrawType(DrawFit);
@@ -144,16 +174,46 @@
    if (m_pSecondView)
    {
        CRect rect;
        rect.left = 244;
        rect.left = 161;
        rect.top = 550;
        rect.right = rect.left + 232;
        rect.bottom = rect.top + 232;
        rect.right = rect.left + 150;
        rect.bottom = rect.top + 150;
        m_pSecondView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY , rect, this, 0);
        m_pSecondView->SetDrawType(DrawFit);
        m_pSecondView->SetViewName(_T("Second"));
        m_pSecondView->ShowWindow(SW_SHOW);
    }
    /*< LYW 20211012 - #3671 ADD Start >*/
    if (m_pFirstAssistantView)
    {
        CRect rect;
        rect.left = 10;
        rect.top = 701;
        rect.right = rect.left + 150;
        rect.bottom = rect.top + 150;
        m_pFirstAssistantView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY, rect, this, 0);
        m_pFirstAssistantView->SetDrawType(DrawFit);
        m_pFirstAssistantView->SetViewName(_T("FirstAssistant"));
        m_pFirstAssistantView->ShowWindow(SW_SHOW);
    }
    if (m_pSecondAssistantView)
    {
        CRect rect;
        rect.left = 161;
        rect.top = 701;
        rect.right = rect.left + 150;
        rect.bottom = rect.top + 150;
        m_pSecondAssistantView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY, rect, this, 0);
        m_pSecondAssistantView->SetDrawType(DrawFit);
        m_pSecondAssistantView->SetViewName(_T("SecondAssistant"));
        m_pSecondAssistantView->ShowWindow(SW_SHOW);
    }
    /*< LYW 20211012 - #3671 ADD End >*/
    return TRUE;  // return TRUE unless you set the focus to a control
    // 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
@@ -316,6 +376,18 @@
    nRowIdx++;
    pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strSecondImageFile = m_ctrlGridAlignImageInfo.GetItemText(nRowIdx, nColIdx);
    nRowIdx++;
    /*< LYW 20211012 - #3671 ADD Start >*/
    pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strFirstAssistantImageFile = m_ctrlGridAlignImageInfo.GetItemText(nRowIdx, nColIdx);
    nRowIdx++;
    pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strSecondAssistantImageFile = m_ctrlGridAlignImageInfo.GetItemText(nRowIdx, nColIdx);
    nRowIdx++;
    strItemText.Format(_T("%d"), m_dMatchingPixelStandard);
    pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strMatchingPixelStandard = strItemText;
    strItemText.Format(_T("%d"), m_dMatchingAlarmCondition);
    pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strMatchingAlarmCondition = strItemText;
    /*< LYW 20211012 - #3671 ADD End >*/
    strItemText = m_ctrlGridAlignImageInfo.GetItemText(nRowIdx, nColIdx);
    pRcpRsAlignManager->GetRsRcpAlignInfo()->m_dMatchingRate = _tcstod(strItemText, NULL);
@@ -548,6 +620,22 @@
    Item.strText = strTemp;
    m_ctrlGridAlignImageInfo.SetItem(&Item);
    /*< LYW 20211012 - #3671 ADD Start >*/
    nRowIdx++;
    Item.row = nRowIdx;
    Item.col = nColIdx;
    strTemp.Format(_T("1st Assist Mark"));
    Item.strText = strTemp;
    m_ctrlGridAlignImageInfo.SetItem(&Item);
    nRowIdx++;
    Item.row = nRowIdx;
    Item.col = nColIdx;
    strTemp.Format(_T("2nd Assist Mark"));
    Item.strText = strTemp;
    m_ctrlGridAlignImageInfo.SetItem(&Item);
    /*< LYW 20211012 - #3671 ADD End >*/
    nRowIdx++;
    Item.row = nRowIdx;
    Item.col = nColIdx;
@@ -611,15 +699,48 @@
    m_ctrlGridAlignImageInfo.SetCellType(nRowIdx, nColIdx, RUNTIME_CLASS(CGridCellButton));
    pCellButton = (CGridCellButton*)m_ctrlGridAlignImageInfo.GetCell(nRowIdx, nColIdx);
    pCellButton->SetText(_T("Browser"));
    /*< LYW 20211012 - #3671 ADD Start >*/
    // first Assistant
    nRowIdx = 2;
    nColIdx = 1;
    strItemText = pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strFirstAssistantImageFile;
    m_ctrlGridAlignImageInfo.SetItemText(nRowIdx, nColIdx, strItemText);
    strFilename = ALIGN_IMAGE_PATH;
    strFilename = strFilename + _T("\\") + strItemText;
    m_pFirstAssistantView->LoadImage(strFilename);
    /*m_pFirstView->Invalidate(TRUE);*/
    nColIdx = 2;
    m_ctrlGridAlignImageInfo.SetCellType(nRowIdx, nColIdx, RUNTIME_CLASS(CGridCellButton));
    pCellButton = (CGridCellButton*)m_ctrlGridAlignImageInfo.GetCell(nRowIdx, nColIdx);
    pCellButton->SetText(_T("Browser"));
    // second Assistant
    nRowIdx = 3;
    nColIdx = 1;
    strItemText = pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strSecondAssistantImageFile;
    m_ctrlGridAlignImageInfo.SetItemText(nRowIdx, nColIdx, strItemText);
    strFilename = ALIGN_IMAGE_PATH;
    strFilename = strFilename + _T("\\") + strItemText;
    m_pSecondAssistantView->LoadImage(strFilename);
    //m_pSecondView->Invalidate(TRUE);
    nColIdx = 2;
    m_ctrlGridAlignImageInfo.SetCellType(nRowIdx, nColIdx, RUNTIME_CLASS(CGridCellButton));
    pCellButton = (CGridCellButton*)m_ctrlGridAlignImageInfo.GetCell(nRowIdx, nColIdx);
    pCellButton->SetText(_T("Browser"));
    /*< LYW 20211012 - #3671 ADD End >*/
    //
    nRowIdx = 2;
    nRowIdx = 4;
    nColIdx = 1;
    strItemText.Format(_T("%.3lf"), pRcpRsAlignManager->GetRsRcpAlignInfo()->m_dMatchingRate);
    m_ctrlGridAlignImageInfo.SetItemText(nRowIdx, nColIdx, strItemText);
    
    //
    nRowIdx = 3;
    nRowIdx = 5;
    nColIdx = 1;
    strItemText = pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strTotalPitchImageFile;
    m_ctrlGridAlignImageInfo.SetItemText(nRowIdx, nColIdx, strItemText);
@@ -634,6 +755,15 @@
    m_ctrlGridAlignImageInfo.SetCellType(nRowIdx, nColIdx, RUNTIME_CLASS(CGridCellButton));
    pCellButton = (CGridCellButton*)m_ctrlGridAlignImageInfo.GetCell(nRowIdx, nColIdx);
    pCellButton->SetText(_T("Browser"));
    /*< LYW 20211014 - #3671 ADD Start >*/
    strItemText = pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strMatchingPixelStandard;
    m_dMatchingPixelStandard = _tcstod(strItemText, NULL);
    strItemText = pRcpRsAlignManager->GetRsRcpAlignInfo()->m_strMatchingAlarmCondition;
    m_dMatchingAlarmCondition = _tcstod(strItemText, NULL);
    /*< LYW 20211014 - #3671 ADD End >*/
    m_ctrlCheckImageProcess.SetCheck(pRcpRsAlignManager->GetRsRcpAlignInfo()->m_bUseImage);
@@ -840,6 +970,9 @@
    FillAlignRotateInfo();
    FillAlignImageInfo();
    /*< LYW 20211014 - #3671 ADD Start >*/
    UpdateData(FALSE);
    /*< LYW 20211014 - #3671 ADD End >*/
    Invalidate(FALSE);
}
ReviewSystem/ReviewRecipeEditor/DlgAlign.h
@@ -5,7 +5,11 @@
class CCHImageData;
class CCHImageView;
#define ALIGN_IMAGE_INFO_GRID_ROW_COUNT        4
/*< LYW 20211012 - #3671 MOD Start >*/
#define ALIGN_IMAGE_INFO_GRID_ROW_COUNT        6
/*< LYW 20211012 - #3671 MOD End >*/
/*< Origin Code >*/
//#define ALIGN_IMAGE_INFO_GRID_ROW_COUNT        4
#define ALIGN_IMAGE_INFO_GRID_COL_COUNT        3
#define ALIGN_FIND_INFO_GRID_ROW_COUNT        2
#define ALIGN_FIND_INFO_GRID_COL_COUNT        5
@@ -63,6 +67,10 @@
    CCHImageView*    m_pFirstView;
    CCHImageView*    m_pSecondView;
    /*< LYW 20211012 - #3671 ADD Start >*/
    CCHImageView*    m_pFirstAssistantView;
    CCHImageView*    m_pSecondAssistantView;
    /*< LYW 20211012 - #3671 ADD End >*/
    CCHImageView*    m_pTotalPitchView;
    virtual BOOL OnInitDialog();
@@ -75,4 +83,6 @@
    CButton m_ctrlCheckAlignSkip;
    CButton m_ctrlTotalPitchMeasure;
    afx_msg void OnBnClickedButtonRcpFindTest();
    int m_dMatchingPixelStandard;
    int m_dMatchingAlarmCondition;
};
ReviewSystem/ReviewRecipeEditor/ReviewRecipeEditor.rc
@@ -213,28 +213,35 @@
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    PUSHBUTTON      "Apply",IDC_BUTTON_RCP_ALIGN_APPLY,322,24,50,14
    LTEXT           "Edge Find",IDC_STATIC,7,66,38,14,SS_CENTERIMAGE
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_FIND_INFO,"MFCGridCtrl",WS_TABSTOP,7,82,311,30
    LTEXT           "Light Setting",IDC_STATIC,9,143,49,14,SS_CENTERIMAGE
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_LIGHT_INFO,"MFCGridCtrl",WS_TABSTOP,7,160,311,30
    LTEXT           "Edge Find",IDC_STATIC,7,116,38,14,SS_CENTERIMAGE
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_FIND_INFO,"MFCGridCtrl",WS_TABSTOP,7,128,311,30
    LTEXT           "Light Setting",IDC_STATIC,9,170,49,14,SS_CENTERIMAGE
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_LIGHT_INFO,"MFCGridCtrl",WS_TABSTOP,7,182,311,30
    PUSHBUTTON      "Reset",IDC_BUTTON_RCP_ALIGN_RESET,322,7,50,14
    LTEXT           "Auto Light Level",IDC_STATIC,7,195,52,14,SS_CENTERIMAGE
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_AUTO_INFO,"MFCGridCtrl",WS_TABSTOP,7,212,311,44
    CONTROL         "Operate",IDC_CHECK_AUTO_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,197,55,10
    CONTROL         "Operate",IDC_CHECK_MANUAL_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,56,146,55,10
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_ROTATE_INFO,"MFCGridCtrl",WS_DISABLED | WS_TABSTOP,7,277,311,30
    LTEXT           "Rotation Correction",IDC_STATIC,7,263,64,14,SS_CENTERIMAGE | WS_DISABLED
    CONTROL         "Operate",IDC_CHECK_ROTATE_PROCESS,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,74,266,55,10
    LTEXT           "Auto Light Level",IDC_STATIC,7,212,52,14,SS_CENTERIMAGE
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_AUTO_INFO,"MFCGridCtrl",WS_TABSTOP,7,226,311,44
    CONTROL         "Operate",IDC_CHECK_AUTO_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,216,55,10
    CONTROL         "Operate",IDC_CHECK_MANUAL_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,56,173,55,10
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_ROTATE_INFO,"MFCGridCtrl",WS_DISABLED | WS_TABSTOP,7,284,311,30
    LTEXT           "Rotation Correction",IDC_STATIC,7,271,64,14,SS_CENTERIMAGE | WS_DISABLED
    CONTROL         "Operate",IDC_CHECK_ROTATE_PROCESS,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,74,273,55,10
    LTEXT           "Image Matching",IDC_STATIC,7,7,53,14,SS_CENTERIMAGE
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_IMAGE_INFO,"MFCGridCtrl",WS_TABSTOP,7,22,311,44
    CONTROL         "Custom1",IDC_GRID_RCP_ALIGN_IMAGE_INFO,"MFCGridCtrl",WS_TABSTOP,7,22,311,76
    CONTROL         "Operate",IDC_CHECK_IMAGE_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,64,10,55,10
    CONTROL         "Operate",IDC_CHECK_EDGE_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,69,55,10
    CONTROL         "Operate",IDC_CHECK_EDGE_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,118,55,10
    LTEXT           "Align Images",IDC_STATIC,7,315,48,14,SS_CENTERIMAGE
    PUSHBUTTON      "Find Test",IDC_BUTTON_RCP_FIND_TEST,55,316,50,14
    LTEXT           "EdgeAlign ",IDC_STATIC,9,121,49,14,SS_CENTERIMAGE
    CONTROL         "Operate",IDC_CHECK_EDGEALIGN_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,124,55,10
    LTEXT           "EdgeAlign ",IDC_STATIC,9,159,49,14,SS_CENTERIMAGE
    CONTROL         "Operate",IDC_CHECK_EDGEALIGN_PROCESS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,162,55,10
    CONTROL         "Align Skip",IDC_CHECK_ALIGN_SKIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,274,10,43,10
    CONTROL         "TotalPitchMeasure",IDC_CHECK_TOTALPITCHMEASRE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,192,10,74,10
    LTEXT           "main Templete",IDC_STATIC,226,370,53,14,SS_CENTERIMAGE
    LTEXT           "Assistant Templete",IDC_STATIC,226,463,84,14,SS_CENTERIMAGE
    LTEXT           "보조 매칭 pixel 기준값:",IDC_STATIC,8,99,74,14,SS_CENTERIMAGE
    LTEXT           "알람 조건:",IDC_STATIC,132,99,38,14,SS_CENTERIMAGE
    LTEXT           "회 연속 발생시 ",IDC_STATIC,184,99,51,14,SS_CENTERIMAGE
    EDITTEXT        IDC_EDIT_MATCHONG_PIXEL_STANDARD,86,100,32,11,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_MATCHING_ALARM_CONDITION,167,101,16,10,ES_AUTOHSCROLL
END
IDD_DIALOG_REVIEW_RCP_EDITOR_DEFECT_FIND DIALOGEX 0, 0, 379, 526
@@ -749,6 +756,11 @@
    0
END
IDD_DIALOG_REVIEW_RCP_EDITOR_ALIGN AFX_DIALOG_LAYOUT
BEGIN
    0
END
#endif    // 한국어(대한민국) resources
/////////////////////////////////////////////////////////////////////////////
ReviewSystem/ReviewRecipeEditor/resource.h
@@ -78,6 +78,7 @@
#define IDC_EDIT_RRCP_REVIEW_USER_DEFECT_COUNT 1008
#define IDC_EDIT_RCP_REVIEW_USER_DEFECT_COUNT 1008
#define IDC_EDIT_WSI_COUNT              1008
#define IDC_EDIT_MATCHING_ALARM_CONDITION 1008
#define IDC_GRID_RRCP_REVIEW_USER_DEFECT_INFO 1009
#define IDC_GRID_RCP_REVIEW_USER_DEFECT_INFO 1009
#define IDC_EDIT_MAG_INDEX              1009
@@ -141,6 +142,7 @@
#define IDC_REVIEW_DEFOCUS_VAL          1044
#define IDC_REVIEW_DEFOCUS_VALUE        1044
#define IDC_EDIT_RCP_JUDGE_CELL_JUDGE_COUNT 1044
#define IDC_EDIT_MATCHONG_PIXEL_STANDARD 1044
#define IDC_BUTTON_RCP_REVIEW_APPLY2    1045
#define IDC_BUTTON_RCP_REVIEW_PRIORITY_APPLY 1045
#define IDC_EDIT_RCP_MEASURE_COUNT      1045
@@ -305,7 +307,7 @@
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        154
#define _APS_NEXT_RESOURCE_VALUE        155
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1122
#define _APS_NEXT_SYMED_VALUE           106
ReviewSystem/ReviewSystem/CameraControlAlign.cpp
@@ -267,21 +267,37 @@
    CString strFilename = _T("");
    CCHImageData tempImage;
    /*< LYW 20211012 - #3671 ADD Start >*/
    CCHImageData assistanttempImage;
    /*< LYW 20211012 - #3671 ADD End >*/
    for (int i=0; i<2; i++)
    {
        if(m_vecCameraImage.size() <= i) continue;
        (m_vecCameraImage[i]->GetImageData(View_Template))->ReleaseImage();
        /*< LYW 20211012 - #3671 ADD Start >*/
        (m_vecCameraImage[i]->GetImageData(View_AssistantTemplate))->ReleaseImage();
        /*< LYW 20211012 - #3671 ADD End >*/
        // load
        CString strFilename = ALIGN_IMAGE_PATH;
        /*< LYW 20211012 - #3671 ADD Start >*/
        CString strAssistantFilename = ALIGN_IMAGE_PATH;
        /*< LYW 20211012 - #3671 ADD End >*/
        if (i==0)
        {
            strFilename += _T("\\") + m_AlignRecipe.strFirstImageFile;
            /*< LYW 20211012 - #3671 ADD Start >*/
            strAssistantFilename += _T("\\") + m_AlignRecipe.strFirstAssistantImageFile;
            /*< LYW 20211012 - #3671 ADD End >*/
        }
        else if (i==1)
        {
            strFilename += _T("\\") + m_AlignRecipe.strSecondImageFile;
            /*< LYW 20211012 - #3671 ADD Start >*/
            strAssistantFilename += _T("\\") + m_AlignRecipe.strSecondAssistantImageFile;
            /*< LYW 20211012 - #3671 ADD End >*/
        }
        //strFilename += m_AlignRecipe.strTemplateName[i];
@@ -292,7 +308,18 @@
            continue;
        }
        /*< LYW 20211012 - #3671 ADD Start >*/
        if (assistanttempImage.LoadImage(strAssistantFilename) == FALSE)
        {
            bAllLoad = bAllLoad && FALSE;
            continue;
        }
        /*< LYW 20211012 - #3671 ADD End >*/
        bAllLoad = bAllLoad && tempImage.GetBandImage(BandTypeGray, m_vecCameraImage[i]->GetImageData(View_Template));
        /*< LYW 20211012 - #3671 ADD Start >*/
        bAllLoad = bAllLoad && assistanttempImage.GetBandImage(BandTypeGray, m_vecCameraImage[i]->GetImageData(View_AssistantTemplate));
        /*< LYW 20211012 - #3671 ADD End >*/
    }
    return bAllLoad;
@@ -561,7 +588,11 @@
    CCameraImageData* pCameraImage = m_vecCameraImage[nCameraIdx];
    CAlignFinder* pAlignFinder = m_vecAlignFinder[nCameraIdx];
    if (pCameraImage==NULL || pAlignFinder==NULL) return FALSE;
    /*< LYW 20211014 - #index MOD Start >*/
    if (pCameraImage == NULL || pAlignFinder == NULL || m_pACC2P == NULL) return FALSE;
    /*< LYW 20211014 - #index MOD End >*/
    /*< Origin Code >*/
    //if (pCameraImage == NULL || pAlignFinder == NULL) return FALSE;
    // set find param;
    SAlignFindParam findParam;
@@ -574,6 +605,8 @@
    findParam.nEdgeThreshold        = m_AlignRecipe.nEdgeThreshold;
    findParam.nMergeRange            = m_AlignRecipe.nMergeRange;
    findParam.dEdgeRate                = m_AlignRecipe.dEdgeRate;
    findParam.dMatchingPixelStandard = _tcstod(m_AlignRecipe.strMatchingPixelStandard,NULL);
    findParam.dMatchingAlarmCondition = _tcstod(m_AlignRecipe.strMatchingAlarmCondition, NULL);
//    findParam.m_nAlignMarkPos        = m_AlignRecipe.nAlignMarkPosition;
@@ -597,10 +630,26 @@
        wcstombs_s(&CharactersConverted,CDitGlassRawClient::GetInstance()->GetGlassData()->m_strAlignMarkSecond, uploadAlignimage, _TRUNCATE);
    }*/
    // find process
    // find process     바슬러 카메라가 3채널짜리라서 시퀀스 돌때는 1채널로 바꿔서 돔 ksm
    CCHImageData camImage;
    //#3671 TEST CODE Start
//     CCHImageData TestImage;
//
//     (m_vecCameraImage[nCameraIdx]->GetImageData(View_Camera))->ReleaseImage();
//     CString strFilename = ALIGN_IMAGE_PATH;
//     if (nCameraIdx == 0)
//     {
//         strFilename += _T("\\Test1.BMP");
//     }
//     else
//     {
//         strFilename += _T("\\Test2.BMP");
//     }
//     TestImage.LoadImage(strFilename);
//     TestImage.GetBandImage(BandTypeGray, m_vecCameraImage[nCameraIdx]->GetImageData(View_Camera));
//     (m_vecCameraImage[nCameraIdx]->GetImageData(View_Camera))->GetBandImage(BandTypeGray, &camImage);
    //#3671 TEST CODE End
// find process     바슬러 카메라가 3채널짜리라서 시퀀스 돌때는 1채널로 바꿔서 돔 ksm
    if ((pCameraImage->GetImageData(View_Camera))->GetChannels() > 1)
        (pCameraImage->GetImageData(View_Camera))->GetBandImage(BandTypeGray, &camImage);
    else
@@ -609,20 +658,73 @@
    
    //SAlignFindResult findResult = pAlignFinder->FindAlign(pCameraImage->GetImageData(View_Matching), findParam, pCameraImage->GetImageData(View_Template));
    SAlignFindResult findResult = pAlignFinder->FindAlign(&camImage, findParam, pCameraImage->GetImageData(View_Template));
    g_pLog->DisplayMessage(_T("Main TempleteMatching Result : %d Cam ResultCode = %d, PixelX = %d, PixelY = %d, MatchingRate = %.3lf"), nCameraIdx, findResult.nResultCode, int(findResult.dPosX + 0.5), int(findResult.dPosY + 0.5), findResult.dMatchValue);
    // result process
    if (findResult.nResultCode==AlignMatch_Success)
    {
        g_pLog->DisplayMessage(_T("Main TempleteMatching Success!"));
        m_AlignResult.nFindAlign[nCameraIdx] = 1;
        m_AlignResult.dFindPixelX[nCameraIdx] = int(findResult.dPosX + 0.5);
        m_AlignResult.dFindPixelY[nCameraIdx] = int(findResult.dPosY + 0.5);
        m_AlignResult.dFindScore[nCameraIdx] = findResult.dMatchValue;
    }
    /*< LYW 20211013 - #3671 ADD Start >*/
    else
    {
        m_AlignResult.nFindAlign[nCameraIdx] = 0;
        m_AlignResult.dFindScore[nCameraIdx] = findResult.dMatchValue;
        SAlignFindResult findAssistantResult = pAlignFinder->FindAlign(&camImage, findParam, pCameraImage->GetImageData(View_AssistantTemplate));
        g_pLog->DisplayMessage(_T("Assistant TempleteMatching Result : %d Cam ResultCode = %d, PixelX = %d, PixelY = %d, MatchingRate = %.3lf"), nCameraIdx, findAssistantResult.nResultCode, int(findAssistantResult.dPosX + 0.5), int(findAssistantResult.dPosY + 0.5), findAssistantResult.dMatchValue);
        if (findAssistantResult.nResultCode == AlignMatch_Success)
        {
            g_pLog->DisplayMessage(_T("Assistant TempleteMatching Success!"));
            m_AlignResult.nFindAlign[nCameraIdx] = 1;
            m_AlignResult.dFindPixelX[nCameraIdx] = int(findAssistantResult.dPosX + 0.5);
            m_AlignResult.dFindPixelY[nCameraIdx] = int(findAssistantResult.dPosY + 0.5);
            m_AlignResult.dFindScore[nCameraIdx] = findAssistantResult.dMatchValue;
        }
        else
        {
            int dffmain2assistanstX = int(findResult.dPosX) - int(findAssistantResult.dPosX);
            int dffmain2assistanstY = int(findResult.dPosY) - int(findAssistantResult.dPosY);
            g_pLog->DisplayMessage(_T("Main, Assistant TempleteMatching All Low Score! differenceX = %d, differenceY = %d"), dffmain2assistanstX, dffmain2assistanstY);
            if (abs(dffmain2assistanstX) <= findParam.dMatchingPixelStandard && abs(dffmain2assistanstY) <= findParam.dMatchingPixelStandard && findResult.dMatchValue != 0.0)
            {
                m_AlignResult.nFindAlign[nCameraIdx] = 1;
                m_AlignResult.dFindPixelX[nCameraIdx] = int(findResult.dPosX + 0.5);
                m_AlignResult.dFindPixelY[nCameraIdx] = int(findResult.dPosY + 0.5);
                m_AlignResult.dFindScore[nCameraIdx] = findResult.dMatchValue;
                m_pACC2P->IACC2P_SetAccumaulate(m_pACC2P->IACC2P_GetAccumaulate() + 1);
                g_pLog->DisplayMessage(_T("Main, Assistant Templete Find Same Point! Align Success! Accumaulate = %d"), m_pACC2P->IACC2P_GetAccumaulate());
            }
            else
            {
                g_pLog->DisplayMessage(_T("Main Assistant Templete Don`t Find Same Point! Align Fail!"));
                m_AlignResult.nFindAlign[nCameraIdx] = 0;
                m_AlignResult.dFindScore[nCameraIdx] = findResult.dMatchValue;
            }
            if (m_pACC2P->IACC2P_GetAccumaulate() > findParam.dMatchingAlarmCondition)
            {
                m_AlignResult.nFindAlign[nCameraIdx] = 0;
                m_AlignResult.dFindScore[nCameraIdx] = findResult.dMatchValue;
                m_pACC2P->IACC2P_SetAccumaulate(0);
                g_pLog->DisplayMessage(_T("Low Matching, But Align Same Point, Count is more Than MatchingAlarmCondition , Accumaulate = %d Reset"), m_pACC2P->IACC2P_GetAccumaulate());
            }
        }
    }
    /*< LYW 20211013 - #3671 ADD End >*/
    /*< LYW 20211013 - #3671 Delete Start >*/
//     else
//     {
//         m_AlignResult.nFindAlign[nCameraIdx] = 0;
//         m_AlignResult.dFindScore[nCameraIdx] = findResult.dMatchValue;
//     }
    /*< LYW 20211013 - #3671 Delete End >*/
    
    // save threshold image
    strPath.Format(_T("%s\\Cam%02d_AlignTH_%04d%02d%02d%02d%02d%02d.jpg"), m_strSaveImageBasePath, nCameraIdx, 
ReviewSystem/ReviewSystem/CameraControlAlign.h
@@ -98,8 +98,11 @@
typedef std::vector<SLightData*>            VectorLightData;
typedef std::vector<SLightData*>::iterator    VectorLightDataIt;
enum AlignViewMode    { View_Camera=0, View_Result, View_Template, View_Matching };
/*< LYW 20211012 - #3671 MOD Start >*/
enum AlignViewMode { View_Camera = 0, View_Result, View_Template, View_AssistantTemplate, View_Matching };
/*< LYW 20211012 - #3671 MOD End >*/
/*< Origin Code >*/
//enum AlignViewMode    { View_Camera=0, View_Result, View_Template, View_Matching };
enum AlignResult    { Align_Fail=-2, Align_TempFail=-1, Align_None=0, Align_Success=1 };
//#3357 KYH Align Image 초기화 ADD START
enum AlignFinderType { AlignFinderType_Normal = 0, AlignFinderType_Corner, AlignFinderType_Extend, AlignFinderType_count }; //210330 kyh 추가
@@ -113,6 +116,10 @@
    virtual void IACC2P_CameraControl(int nValue) = 0;
    virtual BOOL IACC2P_SetLightLevel(int nCameraIndex, int nValue) = 0;
    virtual BOOL IACC2P_GetLightLevel(int nCameraIndex, int& nValue) = 0;
    /*< LYW 20211014 - #3671 ADD Start >*/
    virtual int     IACC2P_GetAccumaulate() = 0;
    virtual void IACC2P_SetAccumaulate(int dValue) = 0;
    /*< LYW 20211014 - #3671 ADD End >*/
};
class CCameraControlAlign : public CCameraController,
ReviewSystem/ReviewSystem/ReviewInterface.cpp
@@ -127,6 +127,10 @@
    m_bFirstReviewLeft = 0;
    m_bFirstReviewRight = 0;
    /*< LYW 20211014 - #3671 ADD Start >*/
    m_daccumulate = 0;
    /*< LYW 20211014 - #3671 ADD End >*/
    // cs init
    InitializeCriticalSection(&m_csReviewResult);
    InitializeCriticalSection(&m_csReviewSignal);
@@ -3115,6 +3119,16 @@
    return AlignLight_GetLightLevel(nCameraIndex, nValue);
}
int CReviewInterface::IACC2P_GetAccumaulate()
{
    return m_daccumulate;
}
void CReviewInterface::IACC2P_SetAccumaulate(int dValue)
{
    m_daccumulate = dValue;
}
BOOL CReviewInterface::IRCC2P_GetCurrentFrame(int nModuleIndex, int nCameraIndex, int nFrameWidth, int nFrameHeight, int nFrameChannels, CCHImageData* pImageData)
{
    if (m_pVirtualGlassMap==NULL) return FALSE;
@@ -5772,6 +5786,12 @@
        pGlassResult->m_AlignRecipe.dMatchingRate        = pRsRcpAlignInfo->m_dMatchingRate;
        pGlassResult->m_AlignRecipe.strFirstImageFile    = pRsRcpAlignInfo->m_strFirstImageFile;
        pGlassResult->m_AlignRecipe.strSecondImageFile    = pRsRcpAlignInfo->m_strSecondImageFile;
        /*< LYW 20211012 - #3671 ADD Start >*/
        pGlassResult->m_AlignRecipe.strFirstAssistantImageFile = pRsRcpAlignInfo->m_strFirstAssistantImageFile;
        pGlassResult->m_AlignRecipe.strSecondAssistantImageFile = pRsRcpAlignInfo->m_strSecondAssistantImageFile;
        pGlassResult->m_AlignRecipe.strMatchingPixelStandard = pRsRcpAlignInfo->m_strMatchingPixelStandard;
        pGlassResult->m_AlignRecipe.strMatchingAlarmCondition = pRsRcpAlignInfo->m_strMatchingAlarmCondition;
        /*< LYW 20211012 - #3671 ADD End >*/
        pGlassResult->m_AlignRecipe.strTotalPitchImageFile = pRsRcpAlignInfo->m_strTotalPitchImageFile;
        // edge find param
ReviewSystem/ReviewSystem/ReviewInterface.h
@@ -195,6 +195,10 @@
    virtual void    IACC2P_CameraControl(int nValue);
    virtual BOOL    IACC2P_SetLightLevel(int nCameraIndex, int nValue);
    virtual BOOL    IACC2P_GetLightLevel(int nCameraIndex, int& nValue);
    /*< LYW 20211014 - #3671 ADD Start >*/
    virtual int        IACC2P_GetAccumaulate();
    virtual void    IACC2P_SetAccumaulate(int dValue);
    /*< LYW 20211014 - #3671 ADD End >*/
    // review camera control 2 parent
    virtual BOOL    IRCC2P_GetCurrentFrame(int nModuleIndex, int nCameraIndex, int nFrameWidth, int nFrameHeight, int nFrameChannels, CCHImageData *pImageData);
@@ -264,6 +268,7 @@
    BOOL    m_bFirstReviewLeft;
    BOOL    m_bFirstReviewRight;
    int        m_daccumulate;
    virtual BOOL                        IRP2P_SaveDefectMap(const CString& strPath);
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -3772,6 +3772,12 @@
        pGlassResult->m_AlignRecipe.dMatchingRate        = pRsRcpAlignInfo->m_dMatchingRate;
        pGlassResult->m_AlignRecipe.strFirstImageFile    = pRsRcpAlignInfo->m_strFirstImageFile;
        pGlassResult->m_AlignRecipe.strSecondImageFile    = pRsRcpAlignInfo->m_strSecondImageFile;
        /*< LYW 20211012 - #3671 ADD Start >*/
        pGlassResult->m_AlignRecipe.strFirstAssistantImageFile = pRsRcpAlignInfo->m_strFirstAssistantImageFile;
        pGlassResult->m_AlignRecipe.strSecondAssistantImageFile = pRsRcpAlignInfo->m_strSecondAssistantImageFile;
        pGlassResult->m_AlignRecipe.strMatchingPixelStandard = pRsRcpAlignInfo->m_strMatchingPixelStandard;
        pGlassResult->m_AlignRecipe.strMatchingAlarmCondition = pRsRcpAlignInfo->m_strMatchingAlarmCondition;
        /*< LYW 20211012 - #3671 ADD End >*/
        pGlassResult->m_AlignRecipe.strTotalPitchImageFile = pRsRcpAlignInfo->m_strTotalPitchImageFile;
        // edge find param
ReviewSystem/include/CHAlignFinder/AlignFinderParam.h
@@ -17,6 +17,8 @@
        // match
        bMatchProcess            = TRUE;
        dMatchRate                = 0.8;
        dMatchingPixelStandard  = 0;
        dMatchingAlarmCondition = 0;
        // edge
        bEdgeProcess            = TRUE;
@@ -44,6 +46,10 @@
    // match
    BOOL    bMatchProcess;
    double    dMatchRate;
    /*< LYW 20211014 - #3671 ADD Start >*/
    int        dMatchingPixelStandard;
    int        dMatchingAlarmCondition;
    /*< LYW 20211014 - #3671 ADD End >*/
    // edge 
    BOOL    bEdgeProcess;
ReviewSystem/include/CHReviewRecipe/RsRcpAlignInfo.h
@@ -28,6 +28,12 @@
    double    m_dMatchingRate;
    CString m_strFirstImageFile;
    CString m_strSecondImageFile;
/*< LYW 20211012 - #3671 ADD Start >*/
    CString m_strFirstAssistantImageFile;
    CString m_strSecondAssistantImageFile;
    CString m_strMatchingPixelStandard;
    CString m_strMatchingAlarmCondition;
/*< LYW 20211012 - #3671 ADD End >*/
    CString m_strTotalPitchImageFile;
    // edge find param
ReviewSystem/include/CHReviewResult/AlignResult.h
@@ -42,6 +42,12 @@
    double    dMatchingRate;
    CString strFirstImageFile;
    CString strSecondImageFile;
    /*< LYW 20211012 - #3671 ADD Start >*/
    CString strFirstAssistantImageFile;
    CString strSecondAssistantImageFile;
    CString strMatchingPixelStandard;
    CString strMatchingAlarmCondition;
    /*< LYW 20211012 - #3671 ADD End >*/
    CString strTotalPitchImageFile;
    // edge find param