SDC C-Project CF Review 프로그램
LYW
2021-09-27 b9b6752e83c701cc67241923d2b74dc3a963d243
ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.cpp
»õ ÆÄÀÏ
@@ -0,0 +1,3839 @@

// ReveiwHistoryDlg.cpp: êµ¬í˜„ íŒŒì¼
//
#include "stdafx.h"
#include "ReveiwHistory.h"
#include "ReveiwHistoryDlg.h"
#include "PathSettingDlg.h"
#include "DitGlassRawStruct.h"
#include "afxdialogex.h"
#include "GlassRawCPJT.h"
#include "akGridCtrl/GridCellCheck.h"
#include "akImageView.h"
#include <algorithm>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// ì‘ìš© í”„로그램 ì •보에 ì‚¬ìš©ë˜ëŠ” CAboutDlg ëŒ€í™” ìƒìžìž…니다.
class CAboutDlg : public CDialogEx
{
public:
   CAboutDlg();
// ëŒ€í™” ìƒìž ë°ì´í„°ìž…니다.
#ifdef AFX_DESIGN_TIME
   enum { IDD = IDD_ABOUTBOX };
#endif
   protected:
   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV ì§€ì›ìž…니다.
// êµ¬í˜„입니다.
protected:
   DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CReveiwHistoryDlg ëŒ€í™” ìƒìž
CReveiwHistoryDlg::CReveiwHistoryDlg(CWnd* pParent /*=nullptr*/)
   : CDialogEx(IDD_DLG_REVIEWHISTORY, pParent)
   , m_nFileCount(0)
{
   m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
   AddVecFileHeader();
   AddVecGlassHeader();
   AddVecDefectHeader();
   m_nSelectedRow = 0;
   m_nSelectedCol = 0;
   m_nCount = 0;
   m_nGlassSelect = 0;
   m_bDefectAll = false;
   m_bFirst = false;
   m_nSizeDefect = 0;
   m_nSizeImage = 0;
   m_nDefectCount = 0;
   m_nImageCount = 0;
   m_nCellCount = 0;
   m_bAsending = FALSE;
   for (int i = 0; i < 105; i++)
   {
      m_nSelectFile[i] = 0;
      m_nDefectSize[i] = 0;
      m_nCellSize[i] = 0;
      m_nCellSizeTemp[i] = m_nCellSize[i];
      m_nImageSize[i] = 0;
   }
}
void CReveiwHistoryDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialogEx::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_SLIDER_IMG, m_sldImg);
   DDX_Control(pDX, IDC_EDIT_COUNT, m_ctrCount);
   DDX_Control(pDX, IDC_CHK_All_DEFECT, m_chkAllDefect);
   DDX_Control(pDX, IDC_CHK_REVIEW_DEFECT, m_chkReviewDefect);
   DDX_Control(pDX, IDC_CHK_MUTI, m_chkMuti);
   DDX_Control(pDX, IDC_CHK_SINGLE, m_chkSingle);
   DDX_Control(pDX, IDC_STATIC_IMG_REVIEW, m_ctrReviewImage);
   DDX_Text(pDX, IDC_EDIT_FILE_COUNT, m_nFileCount);
   DDX_Control(pDX, IDC_EDIT_FILE_COUNT, m_ctlFileCount);
   DDX_Control(pDX, IDC_PROGRESS_LOAD, m_ctlProgress);
}
BEGIN_MESSAGE_MAP(CReveiwHistoryDlg, CDialogEx)
   ON_WM_SYSCOMMAND()
   ON_WM_PAINT()
   ON_WM_QUERYDRAGICON()
   ON_WM_DESTROY()
   ON_WM_SIZE()
   ON_WM_HSCROLL()
   ON_BN_CLICKED(IDC_BUTTON_MAPVIEW_FIT, &CReveiwHistoryDlg::OnBnClickedButtonMapviewFit)
   ON_MESSAGE(UM_FORMMAP_DEFECTSELECT, OnMapDefectSelected)
   ON_MESSAGE(UM_FORMMAP_DEFECTMOUSEOVER, OnMapDefectMouseOver)
   ON_COMMAND(ID_OPTION_PATHSETTING, &CReveiwHistoryDlg::OnOptionPathsetting)
   ON_COMMAND(ID_VIEW_ALLDEFECT, &CReveiwHistoryDlg::OnViewAlldefect)
   ON_COMMAND(ID_VIEW_REVIEWDEFECT, &CReveiwHistoryDlg::OnViewReviewdefect)
   ON_COMMAND(ID_ALIGN_VIEW, &CReveiwHistoryDlg::OnAlignView)
   ON_BN_CLICKED(IDC_BTN_FIND_BIN, &CReveiwHistoryDlg::OnBnClickedBtnFindBin)
   ON_EN_CHANGE(IDC_EDIT_COUNT, &CReveiwHistoryDlg::OnChangeEditCount)
   ON_BN_CLICKED(IDC_BUTTON3, &CReveiwHistoryDlg::OnBnClickedButton3)
   ON_BN_CLICKED(IDC_CHK_All_DEFECT, &CReveiwHistoryDlg::OnClickedChkAllDefect)
   ON_BN_CLICKED(IDC_CHK_MUTI, &CReveiwHistoryDlg::OnClickedChkMuti)
   ON_BN_CLICKED(IDC_CHK_REVIEW_DEFECT, &CReveiwHistoryDlg::OnClickedChkReviewDefect)
   ON_BN_CLICKED(IDC_CHK_SINGLE, &CReveiwHistoryDlg::OnClickedChkSingle)
   ON_EN_CHANGE(IDC_EDIT_FILE_COUNT, &CReveiwHistoryDlg::OnChangeEditFileCount)
   ON_WM_KEYDOWN()
END_MESSAGE_MAP()
// CReveiwHistoryDlg ë©”시지 ì²˜ë¦¬ê¸°
BOOL CReveiwHistoryDlg::OnInitDialog()
{
   CDialogEx::OnInitDialog();
   // ì‹œìŠ¤í…œ ë©”뉴에 "정보..." ë©”뉴 í•­ëª©ì„ ì¶”가합니다.
   // IDM_ABOUTBOX는 ì‹œìŠ¤í…œ ëª…ë ¹ ë²”위에 ìžˆì–´ì•¼ í•©ë‹ˆë‹¤.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);
   CMenu* pSysMenu = GetSystemMenu(FALSE);
   if (pSysMenu != nullptr)
   {
      BOOL bNameValid;
      CString strAboutMenu;
      bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
      ASSERT(bNameValid);
      if (!strAboutMenu.IsEmpty())
      {
         pSysMenu->AppendMenu(MF_SEPARATOR);
         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
      }
   }
   // ì´ ëŒ€í™” ìƒìžì˜ ì•„이콘을 ì„¤ì •합니다.  ì‘ìš© í”„로그램의 ì£¼ ì°½ì´ ëŒ€í™” ìƒìžê°€ ì•„닐 ê²½ìš°ì—ëŠ”
   //  í”„레임워크가 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
   SetIcon(m_hIcon, TRUE);         // í° ì•„이콘을 ì„¤ì •합니다.
   SetIcon(m_hIcon, FALSE);      // ìž‘은 ì•„이콘을 ì„¤ì •합니다.
   GetDlgItem(IDC_STATIC_FORMATIONMAP2)->GetWindowRect(m_picture_rect);
   GetDlgItem(IDC_STATIC_IMG_INSPECTOR)->GetWindowRect(m_picture_rect2);
   ScreenToClient(m_picture_rect);
   ScreenToClient(m_picture_rect2);
   GetDlgItem(IDC_STATIC_IMG_ALIGN1)->GetWindowRect(m_Align_rect);
   GetDlgItem(IDC_STATIC_IMG_ALIGN2)->GetWindowRect(m_Align_rect2);
   ScreenToClient(m_Align_rect);
   ScreenToClient(m_Align_rect2);
   m_ImageView.CreateGraph(this, m_picture_rect);
   m_ImageView.SetAutoScale();
   // TODO: ì—¬ê¸°ì— ì¶”ê°€ ì´ˆê¸°í™” ìž‘업을 ì¶”가합니다.
   if (1)
   {
      CRect rectTemp;
      GetDlgItem(IDC_STATIC_FORMATIONMAP)->GetWindowRect(rectTemp);
      ScreenToClient(rectTemp);
      m_FormationMap.CreateGraph(this, rectTemp);
   }
   m_WndArrange.setParentWnd(this);
   m_WndArrange.addChildWnd(&m_FormationMap, WA_RESIZE_WIDTH | WA_RESIZE_HEIGHT);
   GetDlgItem(IDC_STATIC_FORMATIONMAP)->BringWindowToTop();
   LOG(Dbg, _T("[Processe] Review History Start"));
   CreateUserDirectory();
   CreateUserClass();
   InitGridReviewLIst(&m_gridReviewList, IDC_STATIC_GRID_GLASS);
   InitGridDefectLIst(&m_gridDefectInfo, IDC_STATIC_GRID_DEFECT);
   InitGridGlassLIst(&m_gridGlassInfo, IDC_STATIC_GRID_GLASS_INFO);
   OnViewReviewdefect();
   m_chkReviewDefect.SetCheck(TRUE);
   m_chkSingle.SetCheck(TRUE);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
   m_ConfigOption.m_nMaxDataNumCell = 200;
   m_ConfigOption.m_nMaxDataNumDefect = 50000;
   if (m_Server.CreateServer(m_ConfigOption.m_nMaxDataNumCell, m_ConfigOption.m_nMaxDataNumDefect) == FALSE)
   {
      LOG(Dbg, _T("[Processe]서버 ìƒì„± ì‹¤íŒ¨ ì¢…료 í•©ë‹ˆë‹¤."));
      exit(0);
   }
   m_pGlassRawMaker = NULL;
   m_ConfigOption.m_nSelectRawType = 3;
   OnCbnSelchangeComboRawtype();
//////////////////////////////////////////////////////////////////////////////////////////////////
   SlideInit();
   Imagenoload();
   m_ctlProgress.SetRange(0, 100);
   m_ctlProgress.ShowWindow(FALSE);
   return TRUE;  // í¬ì»¤ìŠ¤ë¥¼ ì»¨íŠ¸ë¡¤ì— ì„¤ì •하지 ì•Šìœ¼ë©´ TRUE를 ë°˜í™˜í•©ë‹ˆë‹¤.
}
void CReveiwHistoryDlg::OnDestroy()
{
   CDialogEx::OnDestroy();
   DestroyUserClass();
   m_Filelistfont.DeleteObject();
   m_Defectfont.DeleteObject();
   LOG(Dbg, _T("[Processe] Review History End"));
}
void CReveiwHistoryDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
   if ((nID & 0xFFF0) == IDM_ABOUTBOX)
   {
      CAboutDlg dlgAbout;
      dlgAbout.DoModal();
   }
   else
   {
      CDialogEx::OnSysCommand(nID, lParam);
   }
}
// ëŒ€í™” ìƒìžì— ìµœì†Œí™” ë‹¨ì¶”를 ì¶”가할 ê²½ìš° ì•„이콘을 ê·¸ë¦¬ë ¤ë©´
//  ì•„래 ì½”드가 í•„요합니다.  ë¬¸ì„œ/ë·° ëª¨ë¸ì„ ì‚¬ìš©í•˜ëŠ” MFC ì‘ìš© í”„로그램의 ê²½ìš°ì—ëŠ”
//  í”„레임워크에서 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
void CReveiwHistoryDlg::OnPaint()
{
   CPaintDC dc(this); // ê·¸ë¦¬ê¸°ë¥¼ ìœ„한 ë””바이스 ì»¨í…ìŠ¤íŠ¸ìž…ë‹ˆë‹¤.
   if (IsIconic())
   {
      SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
      // í´ë¼ì´ì–¸íЏ ì‚¬ê°í˜•에서 ì•„이콘을 ê°€ìš´ë°ì— ë§žì¶¥ë‹ˆë‹¤.
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
      GetClientRect(&rect);
      int x = (rect.Width() - cxIcon + 1) / 2;
      int y = (rect.Height() - cyIcon + 1) / 2;
      // ì•„이콘을 ê·¸ë¦½ë‹ˆë‹¤.
      dc.DrawIcon(x, y, m_hIcon);
   }
   else
   {
//       if (!m_ReviewImage.IsNull())
//       {
//          dc.SetStretchBltMode(COLORONCOLOR);
//          // ê·¸ë¦¼ì„ Picture Control í¬ê¸°ë¡œ í™”면에 ì¶œë ¥í•œë‹¤.
//          m_ReviewImage.Draw(dc, m_picture_rect);
//       }
      //LYW 20210825 #3486 ADD START
      if (!m_DefectRotateImage.IsNull())
      {
         dc.SetStretchBltMode(COLORONCOLOR);
         // ê·¸ë¦¼ì„ Picture Control í¬ê¸°ë¡œ í™”면에 ì¶œë ¥í•œë‹¤.
         m_DefectRotateImage.Draw(dc, m_picture_rect2);
      }
      //LYW 20210825 #3486 ADD END
      else if (!m_DefectImage.IsNull())
      {
         dc.SetStretchBltMode(COLORONCOLOR);
         // ê·¸ë¦¼ì„ Picture Control í¬ê¸°ë¡œ í™”면에 ì¶œë ¥í•œë‹¤.
         m_DefectImage.Draw(dc, m_picture_rect2);
      }
      if (!m_AlignFirst.IsNull())
      {
         dc.SetStretchBltMode(COLORONCOLOR);
         m_AlignFirst.Draw(dc, m_Align_rect);
      }
      if (!m_AlignSecend.IsNull())
      {
         dc.SetStretchBltMode(COLORONCOLOR);
         m_AlignSecend.Draw(dc, m_Align_rect2);
      }
      CDialogEx::OnPaint();
   }
}
// ì‚¬ìš©ìžê°€ ìµœì†Œí™”된 ì°½ì„ ë„는 ë™ì•ˆì— ì»¤ì„œê°€ í‘œì‹œë˜ë„록 ì‹œìŠ¤í…œì—ì„œ
//  ì´ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí•©ë‹ˆë‹¤.
HCURSOR CReveiwHistoryDlg::OnQueryDragIcon()
{
   return static_cast<HCURSOR>(m_hIcon);
}
BOOL CReveiwHistoryDlg::PreTranslateMessage(MSG * pMsg)
{
   POINT pt;
   pt.x = GET_X_LPARAM(pMsg->lParam);
   pt.y = GET_Y_LPARAM(pMsg->lParam);
   switch (pMsg->message)
   {
      case WM_MOUSEHWHEEL:
      {
      }
      break;
      case WM_MOUSEMOVE:
      {
      }
      break;
      case WM_LBUTTONDOWN:
      {
//          if (m_picture_rect.left < pt.x && m_picture_rect.right > pt.x && m_picture_rect.top < pt.y && m_picture_rect.bottom > pt.y)
//          {
//             if (m_pParentWnd == NULL || !GetImageExist()) return;
//
//             if (pt.x > -1 && pt.x < GetScaleWidth() &&
//                pt.y > -1 && pt.y < GetScaleHeight())
//             {
//                if (m_rectTracker.HitTest(pt) < 0)
//                {
//                   // just to demonstrate CRectTracker::TrackRubberBand
//                   if (m_rectTracker.TrackRubberBand(this, pt, TRUE))
//                   {
//                      Invalidate();
//                   }
//                }
//                else if (m_rectTracker.Track(this, pt, TRUE))
//                {
//                   Invalidate();
//                }
//             }
//
//             CRect rect;
//             this->GetClientRect(rect);
//
//             pt.x += m_nHScroll;
//             pt.y += m_nVScroll;
//             m_pParentWnd->SendMessage(WM_LBUTTONDOWN, static_cast<WPARAM>(nFlags), MAKELPARAM(pt.x, pt.y));
//         }
      }
      break;
      case WM_LBUTTONUP:
      {
//          int a = 1;
//          return 0;
//          if (m_picture_rect.left < pt.x && m_picture_rect.right > pt.x && m_picture_rect.top < pt.y && m_picture_rect.bottom > pt.y)
//          {
//             if (m_pParentWnd == NULL) return;
//
//             CRect rect;
//             this->GetClientRect(rect);
//
//             pt.x += m_nHScroll;
//             pt.y += m_nVScroll;
//             m_pParentWnd->SendMessage(WM_LBUTTONUP, static_cast<WPARAM>(nFlags), MAKELPARAM(pt.x, pt.y));
//
//             if (GetTrackerRect(m_rtROIRect))
//             {
//                m_sROIInfo.nWidthPixel = m_rtROIRect.Width();
//                m_sROIInfo.nHeightPixel = m_rtROIRect.Height();
//                m_sROIInfo.dDiagonalPixel = sqrt(double(m_sROIInfo.nWidthPixel*m_sROIInfo.nWidthPixel + m_sROIInfo.nHeightPixel*m_sROIInfo.nHeightPixel));
//
//                m_sROIInfo.dWidthRealUM = m_sROIInfo.nWidthPixel * (m_dResolution / m_dWidthScale);
//                m_sROIInfo.dHeightRealUM = m_sROIInfo.nHeightPixel * (m_dResolution / m_dHeightScale);
//                m_sROIInfo.dDiagonalRealUM = sqrt((m_sROIInfo.dWidthRealUM*m_sROIInfo.dWidthRealUM) + (m_sROIInfo.dHeightRealUM*m_sROIInfo.dHeightRealUM));
//
//                Invalidate(TRUE);
//             }
//         }
         //Drow ì •보를 ë³´ë‚¸ë‹¤.
      }
       break;
      case WM_KEYDOWN:
      {
         if (pMsg->wParam == VK_RETURN)
            return TRUE;
         else if (pMsg->wParam == VK_ESCAPE)
            return TRUE;
      }
      break;
   }
   return __super::PreTranslateMessage(pMsg);
}
void CReveiwHistoryDlg::CreateUserDirectory()
{
   CString str;
   str.Format(_T("%s\\Config\\"), GetExePath());
   CreateDirectory(str, NULL);
   str.Format(_T("%s\\Log\\"), GetExePath());
   CreateDirectory(str, NULL);
   LOG(Dbg, _T("[Processe] CreateUserDirectory"));
}
void CReveiwHistoryDlg::CreateUserClass()
{
   CPathSettingDlg::CreateClass();
   CPathSettingDlg::GetMgr()->Create(this);
   CPathSettingDlg::GetMgr()->PathSettingLoad();
   CAlignDlg::CreateClass();
   CAlignDlg::GetMgr()->Create(this);
   akDefectFormation::CreateClass();
   LOG(Dbg, _T("[Processe] CreateUserClass"));
}
void CReveiwHistoryDlg::DestroyUserClass()
{
   CPathSettingDlg::GetMgr()->DestroyWindow();
   CPathSettingDlg::DestroyClass();
   CAlignDlg::GetMgr()->DestroyWindow();
   CAlignDlg::DestroyClass();
   akDefectFormation::DestroyClass();
   LOG(Dbg, _T("[Processe] DestroyUserClass"));
}
void CReveiwHistoryDlg::AddVecFileHeader()
{
   m_vecStrGridReviewHeader.push_back("   NO   ");
   m_vecStrGridReviewHeader.push_back("         Time         ");
   m_vecStrGridReviewHeader.push_back("열기");
   m_vecStrGridReviewHeader.push_back("PPID");
   m_vecStrGridReviewHeader.push_back("GLASS ID");
   m_vecStrGridReviewHeader.push_back("총 ê²°í•¨ ê°¯ìˆ˜");
   m_vecStrGridReviewHeader.push_back("리뷰 ê°¯ìˆ˜");
   m_vecStrGridReviewHeader.push_back("Judge");
   m_vecStrGridReviewHeader.push_back("File Name");
}
void CReveiwHistoryDlg::AddVecGlassHeader()
{
   m_vecStrGridGlassHeader.push_back("No");
   m_vecStrGridGlassHeader.push_back("PPID");
   m_vecStrGridGlassHeader.push_back("Glass ID");
   m_vecStrGridGlassHeader.push_back("총 ê²°í•¨ ê°¯ìˆ˜");
   m_vecStrGridGlassHeader.push_back("리뷰 ê²°í•¨ ê°¯ìˆ˜");
   m_vecStrGridGlassHeader.push_back("Glass Judge");
   m_vecStrGridGlassHeader.push_back("Lot ID");
   m_vecStrGridGlassHeader.push_back("Slot ID");
   m_vecStrGridGlassHeader.push_back("Slot Number");
   m_vecStrGridGlassHeader.push_back("Cell Number");
   m_vecStrGridGlassHeader.push_back("Glass Height");
   m_vecStrGridGlassHeader.push_back("Glass Width");
}
void CReveiwHistoryDlg::AddVecDefectHeader()
{
   m_vecStrGridDefectHeader.push_back("No");
   m_vecStrGridDefectHeader.push_back("Idx");
   m_vecStrGridDefectHeader.push_back("Loc");
   m_vecStrGridDefectHeader.push_back("Classification");
   m_vecStrGridDefectHeader.push_back("Code");
   m_vecStrGridDefectHeader.push_back("Type");
   m_vecStrGridDefectHeader.push_back("SubType");
   m_vecStrGridDefectHeader.push_back("Length");
   m_vecStrGridDefectHeader.push_back("XSize(um)");
   m_vecStrGridDefectHeader.push_back("YSize(um)");
   m_vecStrGridDefectHeader.push_back("Area(um)");
   m_vecStrGridDefectHeader.push_back("Zone");
   m_vecStrGridDefectHeader.push_back("DMax");
   m_vecStrGridDefectHeader.push_back("DMin");
   m_vecStrGridDefectHeader.push_back("DAvg");
   m_vecStrGridDefectHeader.push_back("Peak");
   m_vecStrGridDefectHeader.push_back("Step");
   m_vecStrGridDefectHeader.push_back("Cam");
   m_vecStrGridDefectHeader.push_back("Scan");
   m_vecStrGridDefectHeader.push_back("RMax");
   m_vecStrGridDefectHeader.push_back("RMin");
   m_vecStrGridDefectHeader.push_back("RAvg");
   m_vecStrGridDefectHeader.push_back("Xpos(mm)");
   m_vecStrGridDefectHeader.push_back("Ypos(mm)");
   m_vecStrGridDefectHeader.push_back("CellX(mm)");
   m_vecStrGridDefectHeader.push_back("CellY(mm)");
   m_vecStrGridDefectHeader.push_back("ScrtRatio");
   m_vecStrGridDefectHeader.push_back("Density");
   m_vecStrGridDefectHeader.push_back("MergeState");
}
void CReveiwHistoryDlg::SlideInit()
{
   m_sldImg.SetRange(-1, -1);
   m_sldImg.SetPos(-1);
   m_sldImg.SetLineSize(3);
   m_sldImg.SetPageSize(10);
   int nPos = m_sldImg.GetPos();
   CString strPos;
   strPos.Format(_T("%d"), nPos);
   m_ctrCount.SetWindowText(strPos);
   CString strCount;
   m_ctlFileCount.SetWindowText("100");
   m_ctlFileCount.GetWindowText(strCount);
   m_nFileCount = _ttoi(strCount);
}
void CReveiwHistoryDlg::InitGridReviewLIst(CakGridCtrl* pGrid, UINT nRectCtrlID)
{
   std::vector<CString>* pVecHeader = &m_vecStrGridReviewHeader;
   CRect rectGrid;
   GetDlgItem(nRectCtrlID)->GetWindowRect(&rectGrid);
   ScreenToClient(&rectGrid);
   pGrid->Create(rectGrid, this, nRectCtrlID);
   pGrid->GetDefaultCell(TRUE, FALSE)->SetBackClr(GRID_FIX_COLOR);
   pGrid->GetDefaultCell(FALSE, TRUE)->SetBackClr(GRID_FIX_COLOR);
   pGrid->GetDefaultCell(FALSE, FALSE)->SetBackClr(GRID_COLOR);
    pGrid->SetFixedBkColor(GRID_FIX_COLOR);
    pGrid->SetGridLines(GVL_BOTH);
   pGrid->SetVirtualMode(FALSE);
    pGrid->SetCallbackFunc(NULL, 0);
    pGrid->AllowReorderColumn(FALSE);
    pGrid->EnableDragRowMode(FALSE);
   pGrid->SetColumnCount((int)pVecHeader->size());
   pGrid->SetDoubleBuffering(TRUE);
   pGrid->SetRowCount(2);
    pGrid->SetFixedRowCount(1);
    pGrid->SetFixedColumnCount(0);
    pGrid->SetEditable(FALSE);
    pGrid->EnableSelection(TRUE);
    pGrid->SetFixedRowSelection(TRUE);
    pGrid->SetHeaderSort(FALSE);
   // fill it up with stuff
   pGrid->SetEditable(TRUE);
   pGrid->EnableDragAndDrop(TRUE);
   int nRowIdx, nColIdx, nRows, nCols, nFixRows, nFixCols;
   CString strTemp;
   GV_ITEM Item;
   nRowIdx = 0;
   nColIdx = 0;
   Item.mask = GVIF_TEXT;
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("   No   "));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("         Time         "));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("열기"));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("PPID"));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("GLASS ID"));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("총 ê²°í•¨ ê°¯ìˆ˜"));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("리뷰 ê°¯ìˆ˜"));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx;
   Item.col = nColIdx++;
   strTemp.Format(_T("Judge"));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = nRowIdx++;
   Item.col = nColIdx;
   strTemp.Format(_T("File Name"));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   Item.row = 1;
   Item.col = 0;
   strTemp.Format(_T(" "));
   Item.strText = strTemp;
   pGrid->SetItem(&Item);
   pGrid->SetCellType(1, 0, RUNTIME_CLASS(CGridCellCheck));
    pGrid->AutoSize();
   pGrid->Invalidate();
   m_WndArrange.setParentWnd(this);
   m_WndArrange.addChildWnd(&m_gridReviewList, WA_RESIZE_WIDTH | WA_RESIZE_HEIGHT);
}
void CReveiwHistoryDlg::InitGridGlassLIst(CakGridCtrl* pGrid, UINT nRectCtrlID)
{
   std::vector<CString>* pVecHeader = &m_vecStrGridGlassHeader;
   CRect rectGrid;
   GetDlgItem(nRectCtrlID)->GetWindowRect(&rectGrid);
   ScreenToClient(&rectGrid);
   pGrid->Create(rectGrid, this, nRectCtrlID);
   pGrid->GetDefaultCell(TRUE, FALSE)->SetBackClr(GRID_FIX_COLOR);
   pGrid->GetDefaultCell(FALSE, TRUE)->SetBackClr(GRID_FIX_COLOR);
   pGrid->GetDefaultCell(FALSE, FALSE)->SetBackClr(GRID_COLOR);
   pGrid->SetFixedBkColor(GRID_FIX_COLOR);
   pGrid->SetGridLines(GVL_BOTH);
   pGrid->SetVirtualMode(TRUE);
   pGrid->SetCallbackFunc(NULL, 0);
   pGrid->AllowReorderColumn(FALSE);
   pGrid->EnableDragRowMode(FALSE);
   pGrid->SetColumnCount((int)pVecHeader->size());
   pGrid->SetDoubleBuffering(TRUE);
   pGrid->SetRowCount(2);
   pGrid->SetFixedRowCount(1);
   pGrid->SetFixedColumnCount(0);
   pGrid->SetEditable(FALSE);
   pGrid->EnableSelection(TRUE);
   pGrid->SetFixedRowSelection(TRUE);
   pGrid->SetHeaderSort(FALSE);
   // fill it up with stuff
   pGrid->SetEditable(TRUE);
   pGrid->EnableDragAndDrop(TRUE);
   pGrid->AutoSize();
   pGrid->Invalidate();
   m_WndArrange.setParentWnd(this);
   m_WndArrange.addChildWnd(&m_gridGlassInfo, WA_RESIZE_WIDTH | WA_RESIZE_HEIGHT);
}
void CReveiwHistoryDlg::InitGridDefectLIst(CakGridCtrl* pGrid, UINT nRectCtrlID)
{
   std::vector<CString>* pVecHeader = &m_vecStrGridDefectHeader;
   CRect rectGrid;
   GetDlgItem(nRectCtrlID)->GetWindowRect(&rectGrid);
   ScreenToClient(&rectGrid);
   pGrid->Create(rectGrid, this, nRectCtrlID);
   pGrid->GetDefaultCell(TRUE, FALSE)->SetBackClr(GRID_FIX_COLOR);
   pGrid->GetDefaultCell(FALSE, TRUE)->SetBackClr(GRID_FIX_COLOR);
   pGrid->GetDefaultCell(FALSE, FALSE)->SetBackClr(GRID_COLOR);
   pGrid->SetFixedBkColor(GRID_FIX_COLOR);
   pGrid->SetGridLines(GVL_BOTH);
   pGrid->SetVirtualMode(TRUE);
   pGrid->SetCallbackFunc(NULL, 0);
   pGrid->AllowReorderColumn(FALSE);
   pGrid->EnableDragRowMode(FALSE);
   pGrid->SetColumnCount((int)pVecHeader->size());
   pGrid->SetDoubleBuffering(TRUE);
   pGrid->SetRowCount(2);
   pGrid->SetFixedRowCount(1);
   pGrid->SetFixedColumnCount(0);
   pGrid->SetEditable(FALSE);
   pGrid->EnableSelection(TRUE);
   pGrid->SetFixedRowSelection(TRUE);
   pGrid->SetHeaderSort(FALSE);
   // fill it up with stuff
   pGrid->SetEditable(TRUE);
   pGrid->EnableDragAndDrop(TRUE);
   pGrid->AutoSize();
   pGrid->Invalidate();
   m_WndArrange.setParentWnd(this);
   m_WndArrange.addChildWnd(&m_gridDefectInfo, WA_RESIZE_WIDTH | WA_RESIZE_HEIGHT);
}
BOOL CReveiwHistoryDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
   if (m_gridReviewList.GetSafeHwnd() && wParam == (WPARAM)m_gridReviewList.GetDlgCtrlID())
   {
      *pResult = 1;
      GV_DISPINFO *pDispInfo = (GV_DISPINFO*)lParam;
      if (GVN_GETDISPINFO == pDispInfo->hdr.code)
      {
         getDispInfoGlass(pDispInfo->item.col, pDispInfo->item.row, &pDispInfo->item.strText);
         return TRUE;
      }
      else if (NM_CLICK == pDispInfo->hdr.code || LVN_ITEMCHANGING == pDispInfo->hdr.code)
      {
         if (pDispInfo->item.row == 0)
         {
            m_gridReviewList.Refresh();
         }
         else if (pDispInfo->item.row > 0)
         {
            CGridCellCheck* pCellCheck = NULL;
            pCellCheck = (CGridCellCheck*)m_gridReviewList.GetCell(pDispInfo->item.row, 0);
            BOOL bMultiCheck = pCellCheck->GetCheck();
            if (m_nCount == pDispInfo->item.row)
            {
               if (m_chkSingle.GetCheck())
               {
                  if (pCellCheck != NULL)
                  {
                     pCellCheck->SetCheck(FALSE);
                  }
               }
               else
               {
                  if (pCellCheck != NULL)
                  {
                     pCellCheck->SetCheck(!bMultiCheck);
                  }
               }
               return TRUE;
            }
            m_nCount = pDispInfo->item.row;
            m_nGlassSelect = pDispInfo->item.row;
            CGridCellCheck* pCellCheck2 = NULL;
            pCellCheck2 = (CGridCellCheck*)m_gridReviewList.GetCell(m_nGlassSelect, 0);
            BOOL bMultiCheck2 = pCellCheck->GetCheck();
            if (m_chkSingle.GetCheck())
            {
               if (pCellCheck != NULL)
               {
                  pCellCheck->SetCheck(FALSE);
               }
               GlassInfoRest();
               BinFileOpen(pDispInfo->item.row);
            }
            else if(m_chkMuti.GetCheck())
            {
               if (bMultiCheck2 == TRUE)
               {
//                   if (MultiSelectCheck(pDispInfo->item.row))
//                   {
                  //if(pDispInfo->item.row)
                  bool bCheck = false;
                  for (int i = 0; i < 105; i++)
                  {
                     if (m_nSelectFile[i] == pDispInfo->item.row)
                     {
                        bCheck = true;
                     }
                  }
                  if (!bCheck)
                  {
                     InitSelectGlass(pDispInfo->item.row);
                      BinFileOpen(pDispInfo->item.row);
                  }
/*                  }*/
               }
               else if(bMultiCheck == FALSE)
               {
                  MultiSelectCheck(pDispInfo->item.row);
                  SetScrollSetting();
               }
            }
         }
//          if (!m_chkSingle.GetCheck())
//          {
//             for (int i = 0; i < MAX_COUNT + 1; i++)
//             {
//                for (int iCol = 0; iCol < m_gridReviewList.GetColumnCount(); iCol++)
//                {
//                   m_gridReviewList.SetItemState(m_nSelectFile[i], iCol, LVIS_SELECTED);
//                }
//             }
//             m_gridReviewList.Invalidate();
//          }
         m_nSelectedCol = pDispInfo->item.col;
      }
      else if (GVN_ODCACHEHINT == pDispInfo->hdr.code)
      {
         GV_CACHEHINT *pCacheHint = (GV_CACHEHINT*)pDispInfo;
      }
   }
   else if (m_gridGlassInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridGlassInfo.GetDlgCtrlID())
   {
      *pResult = 1;
      GV_DISPINFO *pDispInfo = (GV_DISPINFO*)lParam;
      if (GVN_GETDISPINFO == pDispInfo->hdr.code)
      {
         getDispInfoGlassInfo(pDispInfo->item.col, pDispInfo->item.row, &pDispInfo->item.strText);
         return TRUE;
      }
      else if (NM_CLICK == pDispInfo->hdr.code)
      {
         //멀티 ëª¨ë“œ ì¼ë•Œ ì„ íƒí•œ ë†ˆì˜ cell ê°’을 ë³´ì—¬ ì¤€ë‹¤
         if (!m_chkSingle.GetCheck())
         {
            SelectCell(pDispInfo->item.row);
         }
      }
      else if (GVN_ODCACHEHINT == pDispInfo->hdr.code)
      {
         GV_CACHEHINT *pCacheHint = (GV_CACHEHINT*)pDispInfo;
      }
   }
   else if (m_gridDefectInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridDefectInfo.GetDlgCtrlID())
   {
      *pResult = 1;
      GV_DISPINFO *pDispInfo = (GV_DISPINFO*)lParam;
      if (GVN_GETDISPINFO == pDispInfo->hdr.code)
      {
         getDispInfoDefect(pDispInfo->item.col, pDispInfo->item.row, &pDispInfo->item.strText);
         return TRUE;
      }
      else if (NM_CLICK == pDispInfo->hdr.code || LVN_ITEMCHANGING == pDispInfo->hdr.code)
      {
         if (pDispInfo->item.row == 0)
         {
            SortListDefect(pDispInfo->item.col);
            m_gridDefectInfo.Refresh();
         }
         else if (pDispInfo->item.row > 0)
         {
            if (pDispInfo->item.row <= m_Formation.m_vecDefects.size())
            {
               _akDefect* pDefectInfo = &m_Formation.m_vecDefects[pDispInfo->item.row - 1];
               m_FormationMap.setSelectDefect(pDefectInfo->m_nDefectID);
               //ImageShow(pDefectInfo->m_nDefectID);
               if (!m_bDefectAll)
               {
                  ImageShow(pDispInfo->item.row - 1);
               }
               else
               {
                  ImageShow(pDefectInfo->m_nDefectID);
               }
               //멀티 ëª¨ë¸ì¼ ë•Œì™€ ì•„닐 ë•Œ êµ¬ë¶„을 í•˜ìž
               //정렬 ìˆœì„œë¥¼ ì‚¬ìš©ìžê°€ ì›í•˜ëŠ” ìˆœìœ¼ë¡œ í•˜ìž
               if (!m_bDefectAll)
               {
                  m_sldImg.SetPos(pDispInfo->item.row - 1);
                  int nPos = m_sldImg.GetPos();
                  CString strPos;
                  strPos.Format(_T("%d"), nPos);
                  m_ctrCount.SetWindowText(strPos);
               }
            }
         }
         m_nSelectedCol = pDispInfo->item.col;
      }
      else if (GVN_ODCACHEHINT == pDispInfo->hdr.code)
      {
         GV_CACHEHINT *pCacheHint = (GV_CACHEHINT*)pDispInfo;
      }
   }
   return CDialog::OnNotify(wParam, lParam, pResult);
}
void CReveiwHistoryDlg::getDispInfoGlass(int nCol, int nRow, CString* pStrData)
{
   if (nRow < 0) return;
   if (nRow == 0)
   {
      *pStrData = m_vecStrGridReviewHeader[nCol];
   }
   else
   {
      CString  strItem;
      int nDataIndex = nRow - 1;
      if (nDataIndex >= m_vecStrGridReviewList.size()) return;
      _akReviewHeader* pDefectInfo = &m_Formation.m_vecHeader[nRow - 1];
      switch (nCol)
      {
      case  0: strItem.Format("%d", nRow); break;
      case  1: strItem.Format("%s", pDefectInfo->m_strFileTime); break;
      case  2: strItem.Format("%s", pDefectInfo->m_strLoading); break;
      case  3: strItem.Format("%s", pDefectInfo->m_strPPID); break;
      case  4: strItem.Format("%s", pDefectInfo->m_strGlassID); break;
      case  5: strItem.Format("%d", pDefectInfo->m_nDefectIdx); break;
      case  6: strItem.Format("%d", pDefectInfo->m_nReviewIdx); break;
      case  7: strItem.Format("%s", pDefectInfo->m_strJudge); break;
      case  8: strItem.Format("%s", pDefectInfo->m_strFileName); break;
      }
      *pStrData = strItem;
   }
}
void CReveiwHistoryDlg::getDispInfoGlassInfo(int nCol, int nRow, CString* pStrData)
{
   if (nRow < 0) return;
   if (nRow == 0) //header
   {
      *pStrData = m_vecStrGridGlassHeader[nCol];
   }
   else
   {
      CString  strItem;
      int nDataIndex = nRow - 1;
      if (nDataIndex >= m_Formation.m_vecGlassInfo.size()) return;
      _akGlassInfo* pGlassInfo = &m_Formation.m_vecGlassInfo[nRow - 1];
      if (pGlassInfo == NULL) return;
      switch (nCol)
      {
      case  0: strItem.Format("%d", pGlassInfo->m_nGlassSelect); break;   //"No");
      case  1: strItem.Format("%s", pGlassInfo->m_strPPID); break;   //"GlassID");
      case  2: strItem.Format("%s", pGlassInfo->m_strGlassID); break;   //PPID
      case  3: strItem.Format("%d", pGlassInfo->m_nDefectNum); break; //LOT ID
      case  4: strItem.Format("%d", pGlassInfo->m_nReviewNum); break; //SLOT ID
      case  5: strItem.Format("%s", pGlassInfo->m_strGlassJudge); break; //Glass Judge
      case  6: strItem.Format("%s", pGlassInfo->m_strLotID); break; //SLOT NUMBER
      case  7: strItem.Format("%s", pGlassInfo->m_strSLotID); break;   //Cell NUmber
      case  8: strItem.Format("%d", pGlassInfo->m_nSlot_No); break; //Defect Count
      case  9: strItem.Format("%d", pGlassInfo->m_nCellNum); break; //Glass size H
      case  10: strItem.Format("%d", pGlassInfo->m_nGlassSizeHeight); break; //Glass Judge
      case  11: strItem.Format("%d", pGlassInfo->m_nGlassSizeWidth); break; //Glass size W
      }
      *pStrData = strItem;
   }
}
void CReveiwHistoryDlg::getDispInfoDefect(int nCol, int nRow, CString* pStrData)
{
   if (nRow < 0) return;
   if (nRow == 0) //header
   {
      *pStrData = m_vecStrGridDefectHeader[nCol];
   }
   else
   {
      int nDataIndex = nRow - 1;
      int iRow = m_nSelectedRow;
      if (nDataIndex >= m_Formation.m_vecDefects.size())
      {
         return;
      }
      _akDefect* pDefectInfo = &m_Formation.m_vecDefects[nRow - 1];
      if (pDefectInfo == NULL)
         return;
      CString  strItem;
      switch (nCol)
      {
      case 0: strItem.Format("%d", nRow); break;
      case 1: strItem.Format("%d", pDefectInfo->m_nDefectID); break;
      case 2:
      {
         strItem = _T("");
         if (pDefectInfo->m_sDefectLoc == DefectLoc_Pattern)
            strItem = "Pat";
         else if (pDefectInfo->m_sDefectLoc == DefectLoc_PAD)
            strItem = "PAD";
         else if (pDefectInfo->m_sDefectLoc == DefectLoc_C2C)
            strItem = "C2C";
         else if (pDefectInfo->m_sDefectLoc == DefectLoc_Crack)
            strItem = "Crk";
         else if (pDefectInfo->m_sDefectLoc == DefectLoc_ASG)
            strItem = "ASG";
         else if (pDefectInfo->m_sDefectLoc == DefectLoc_BM)
            strItem = "BM";
         else
            strItem = "Pat";
      }
      break;
      case 3:   strItem = pDefectInfo->m_strDefectType;   break;
      case 4: strItem.Format("%s", pDefectInfo->m_strDefectCode); break;
      case 5:
      {
         if (pDefectInfo->m_DefectType == DefectType_RBlack)
            strItem.Format("RB");
         else if (pDefectInfo->m_DefectType == DefectType_RWhite)
            strItem.Format("RW");
         else if (pDefectInfo->m_DefectType == DefectType_TBlack)
            strItem.Format("TB");
         else if (pDefectInfo->m_DefectType == DefectType_TWhite)
            strItem.Format("TW");
         else
            strItem = "UN";
      }
      break;
      case 6:
      {
         strItem = _T("");
         if (pDefectInfo->m_DefectSubType == DefectSubType_MC)                  // Common 05 M/N/C/S/K/*
            strItem = "MC";
         else if (pDefectInfo->m_DefectSubType == DefectSubType_Mask)
            strItem = "MD";
         else if (pDefectInfo->m_DefectSubType == DefectSubType_Common)
            strItem = "CD";
         else if (pDefectInfo->m_DefectSubType == DefectSubType_NoDefect)
            strItem = "NO";
         else
            strItem = "N";
      }
      break;
      case 7: strItem.Format("%d", pDefectInfo->m_nDefectRScale); break;
      case 8:
      {
            strItem = _T("");
            strItem.Format("% 7d", pDefectInfo->m_nUMSizeX);
      }
      break;
      case 9:
      {
            strItem = _T("");
            strItem.Format("% 7d", pDefectInfo->m_nUMSizeY);
      }
      break;
      case 10:
            strItem.Format("%d", pDefectInfo->m_nUMSize);
         break;
      case 11:
      {
         int nValue = 0;
         for (int i = 105; i >= 0; i--)
         {
            if (pDefectInfo->m_sZonePixelCount[i] > 0)
               nValue += 1;
            if (i > 0)
               nValue = nValue << 1;
         }
         strItem.Format("%04X", nValue);
      }
      break;
      case 12: strItem.Format("%d", pDefectInfo->m_nLevelSrcMax); break;
      case 13: strItem.Format("%d", pDefectInfo->m_nLevelSrcMin); break;
      case 14: strItem.Format("%d", pDefectInfo->m_nLevelSrcAvg); break;
      case 15: strItem.Format("%d", pDefectInfo->m_sDefectPeak); break;
      case 16:
      {
         strItem.Format("%s", pDefectInfo->m_strStackFirst);
      }
      break;
      case 17:
      {
         strItem = _T("");
         strItem.Format("% 4d", pDefectInfo->m_nCameraID);
      }
      break;
      case 18: strItem.Format("%d", pDefectInfo->m_nScanIdx); break;
      case 19: strItem.Format("%d", pDefectInfo->m_nLevelRefMax); break;
      case 20: strItem.Format("%d", pDefectInfo->m_nLevelRefMin); break;
      case 21: strItem.Format("%d", pDefectInfo->m_nLevelRefAvg); break;
      case 22:
      {
         CString      str;
         strItem = _T("          ");
         str.Format("%5.3f", (double)pDefectInfo->m_nUMCenterAlignX / 1000.0);
         strItem.Insert(9 - str.GetLength(), str);
         strItem.TrimRight(" ");
      }
      break;
      case 23:
      {
         CString      str;
         strItem = _T("          ");
         str.Format("% 5.3f", (double)pDefectInfo->m_nUMCenterAlignY / 1000.0);
         strItem.Insert(9 - str.GetLength(), str);
         strItem.TrimRight(" ");
      }
      break;
      case 24:
      {
         CString      str;
         strItem = _T("          ");
         // Panel x축, y축은 ê¸€ë¼ìŠ¤ì™€ ë°˜ëŒ€ [6/9/2017 bhs]
         if (1)//g_pBasic->GetScanCoordination() == SC_XCoord)
            str.Format("% 5.3f", (double)pDefectInfo->m_nUMCellX / 1000.0);
         else
            str.Format("% 5.3f", (double)pDefectInfo->m_nUMCellY / 1000.0);
         strItem.Insert(9 - str.GetLength(), str);
         strItem.TrimRight(" ");
      }
      break;
      case 25:
      {
         CString      str;
         strItem = _T("          ");
         // Panel x축, y축은 ê¸€ë¼ìŠ¤ì™€ ë°˜ëŒ€ [6/9/2017 bhs]
         if (1)//g_pBasic->GetScanCoordination() == SC_XCoord)
            str.Format("% 5.3f", (double)pDefectInfo->m_nUMCellY / 1000.0);
         else
            str.Format("% 5.3f", (double)pDefectInfo->m_nUMCellX / 1000.0);
         strItem.Insert(9 - str.GetLength(), str);
         strItem.TrimRight(" ");
      }
      break;
      case 26: strItem.Format("%d", pDefectInfo->m_nScratchRatio); break;
      case 27: strItem.Format("%d", pDefectInfo->m_nDensity); break;
      case 28: strItem.Format("%d", pDefectInfo->m_bMergeState); break;
      }
      *pStrData = strItem;
   }
}
LRESULT CReveiwHistoryDlg::OnMapDefectSelected(WPARAM wParam, LPARAM lParam)
{
   int nSelectMode = static_cast<int>(lParam);
   int nSelectDefect = static_cast<int>(wParam);
   if (nSelectMode == 0)
   {
      setDefectShow(nSelectDefect, 1);
      //ImageShow(nSelectDefect);
      if (m_Formation.m_vecImage.size() < 0) return 0;
      for (int i = 0; i < m_Formation.m_vecImage.size(); i++)
      {
         if (m_Formation.m_vecImage[i].m_nDefectID == nSelectDefect)
         {
            ImageShow(i);
            break;
         }
      }
      if (!m_bDefectAll)
      {
         m_sldImg.SetPos(m_nSelectedRow - 1);
         int nPos = m_sldImg.GetPos();
         CString strPos;
         strPos.Format(_T("%d"), nPos);
         m_ctrCount.SetWindowText(strPos);
      }
   }
   else if (nSelectMode == 1)
   {
      CAlignDlg* lpDlg = CAlignDlg::GetMgr();
      m_pDlgAlign->setFormShow(nSelectDefect, 1);
   }
   return 0;
}
LRESULT CReveiwHistoryDlg::OnListDefectSelected(WPARAM wParam, LPARAM lParam)
{
   int nSelectDefect = static_cast<int>(wParam);
   int nMode = static_cast<int>(lParam);
   m_FormationMap.setSelectDefect(nSelectDefect);
   return 0;
}
LRESULT CReveiwHistoryDlg::OnMapDefectMouseOver(WPARAM wParam, LPARAM lParam)
{
   int nSelectDefect = static_cast<int>(wParam);
   int nMode = static_cast<int>(lParam);
   return 0;
}
void CReveiwHistoryDlg::OnBnClickedButtonMapviewFit()
{
   m_FormationMap.SetAutoScale();
}
void CReveiwHistoryDlg::OnSize(UINT nType, int cx, int cy)
{
   CDialogEx::OnSize(nType, cx, cy);
   m_WndArrange.process(cx, cy);
   m_FormationMap.SetAutoScale();
   m_ImageView.SetResize();
}
void CReveiwHistoryDlg::OnOptionPathsetting()
{
   // TODO: ì—¬ê¸°ì— ëª…ë ¹ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   CPathSettingDlg::GetMgr()->PathSettingLoad();
   CPathSettingDlg* lpDlg = CPathSettingDlg::GetMgr();
   lpDlg->ShowWindow(SW_SHOW);
   LOG(Dbg, _T("[Processe] PathSetting Click"));
}
void CReveiwHistoryDlg::OnViewAlldefect()
{
   // TODO: ì—¬ê¸°ì— ëª…ë ¹ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   CMenu *hMenu = GetMenu();
   if (hMenu->GetMenuState(ID_VIEW_ALLDEFECT, MF_BYCOMMAND) != MF_CHECKED)
   {
      hMenu->CheckMenuItem(ID_VIEW_ALLDEFECT, MF_CHECKED);
      hMenu->CheckMenuItem(ID_VIEW_REVIEWDEFECT, MF_UNCHECKED);
      m_bDefectAll = true;
   }
   else
   {
      hMenu->CheckMenuItem(ID_VIEW_REVIEWDEFECT, MF_CHECKED);
      hMenu->CheckMenuItem(ID_VIEW_ALLDEFECT, MF_UNCHECKED);
      m_bDefectAll = false;
   }
   if (m_chkSingle.GetCheck())
   {
      GlassInfoRest();
      BinFileOpen(m_nCount);
   }
   else
   {
      for(int i=0; i< 105; i++)
      {
         int nSelect = m_nSelectFile[i];
         BinFileOpen(nSelect);
      }
   }
}
void CReveiwHistoryDlg::OnViewReviewdefect()
{
   // TODO: ì—¬ê¸°ì— ëª…ë ¹ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   CMenu *hMenu = GetMenu();
   if (hMenu->GetMenuState(ID_VIEW_REVIEWDEFECT, MF_BYCOMMAND) != MF_CHECKED)
   {
      hMenu->CheckMenuItem(ID_VIEW_REVIEWDEFECT, MF_CHECKED);
      hMenu->CheckMenuItem(ID_VIEW_ALLDEFECT, MF_UNCHECKED);
      m_bDefectAll = false;
   }
   else
   {
      hMenu->CheckMenuItem(ID_VIEW_REVIEWDEFECT, MF_UNCHECKED);
      hMenu->CheckMenuItem(ID_VIEW_ALLDEFECT, MF_CHECKED);
      m_bDefectAll = true;
   }
   if (m_chkSingle.GetCheck())
   {
      GlassInfoRest();
      BinFileOpen(m_nCount);
   }
   else
   {
      BinFileOpen(m_nCount);
   }
}
void CReveiwHistoryDlg::OnAlignView()
{
   // TODO: ì—¬ê¸°ì— ëª…ë ¹ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   CRect rectWindow;
   GetClientRect(&rectWindow);
   ClientToScreen(&rectWindow);
   CAlignDlg* lpDlg = CAlignDlg::GetMgr();
   lpDlg->SetWindowPos(NULL, rectWindow.right + 5, rectWindow.top - 50, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
   lpDlg->ShowWindow(SW_SHOW);
   lpDlg->DrawnoImage();
}
void CReveiwHistoryDlg::FileTime(CString strPath)
{
   HANDLE h_File = CreateFile(_T(strPath), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   if (h_File != INVALID_HANDLE_VALUE)
   {
      //** create_time : ìƒì„± ë‚ ì§œ, access_time : ë§ˆì§€ë§‰ ì ‘근날짜, write_time : ë§ˆì§€ë§‰ ìˆ˜ì • ë‚ ì§œ
      FILETIME create_time, access_time, write_time;
      //** System Time ì·¨ë“
      GetFileTime(h_File, &create_time, &access_time, &write_time);
      //** SystemTime은 UTC형식(Universal Time Coordinated)이기 ë•Œë¬¸ì— ê·¸ëƒ¥ ì‚¬ìš© ë¶ˆê°€ëŠ¥
      //** ì§€ì—­ì‹œê°„으로 ë³€ê²½(일반적인 ì‹œê°„ ê³„산법 2015/11/09 21:18:35)
      SYSTEMTIME write_system_time, write_local_time;
      FileTimeToSystemTime(&write_time, &write_system_time);
      //** write_local_time변수에 ë³€í™˜ë˜ì–´ ì €ìž¥ë¨
      //** ì €ìž¥ëœ í˜•태는 WORD형(short)
      //** wYear, wMonth, wDay, wHour, wMinute, wSecond를 í™œìš©í•˜ì—¬ ì‚¬ìš©í•˜ë©´ ë¨
      SystemTimeToTzSpecificLocalTime(NULL, &write_system_time, &write_local_time);
      int nYear, nMonth, nDay, nHour, nMinute, nSecond;
      nYear = write_local_time.wYear;
      nMonth = write_local_time.wMonth;
      nDay = write_local_time.wDay;
      nHour = write_local_time.wHour;
      nMinute = write_local_time.wMinute;
      nSecond = write_local_time.wSecond;
      CString strTime;
      strTime.Format("%04d-%02d-%02d-%02d-%02d-%02d", nYear, nMonth, nDay, nHour, nMinute, nSecond);
      m_vecStrGridTimeList.push_back(strTime);
   }
}
CgrmGlassRawData g_RawData;
void CReveiwHistoryDlg::OpenFileHeader(CString strPath, CString strFullPath)
{
   if (strPath == "") return;
   CgrmGlassRawData* pRawData = &g_RawData;
   if (m_vecStrGridReviewList.size() < 1) return;
   CPathSettingDlg* pReivewSetting = CPathSettingDlg::GetMgr();
   CString strBinPath;
   strBinPath = pReivewSetting->GetBinPath();
   pRawData->ImportGlassRaw(m_Server.GetGlassRawInfo(), NULL);
   strcpy_s(pRawData->GetGlassData()->m_strFileName,64, strPath.GetBuffer());
   strcpy_s(pRawData->GetGlassData()->m_strPath,256, strBinPath.GetBuffer());
   BOOL bRetReadBin = m_pGlassRawMaker->ReadBinFile(pRawData);
   m_Formation.AddDefectHeaderTemp();
   _akReviewHeader* pDefectInfo = &m_Formation.m_vecHeaderTemp[m_Formation.m_vecHeaderTemp.size() - 1];
   pDefectInfo->m_nReviewIdx = 0;
   pDefectInfo->m_strFileTime = m_vecStrGridTimeList[m_Formation.m_vecHeaderTemp.size() - 1];
   pDefectInfo->m_strFileName = m_vecStrGridReviewList[m_Formation.m_vecHeaderTemp.size() - 1];
   pDefectInfo->m_strFilePath = strFullPath;
   if (bRetReadBin == FALSE)
   {
      pDefectInfo->m_nDefectIdx = 0;
      pDefectInfo->m_strGlassID = "";
      pDefectInfo->m_strPPID = "";
      pDefectInfo->m_nReviewIdx = 0;
      pDefectInfo->m_strJudge = "";
      pDefectInfo->m_strLoading = "X";
      return;
   }
   pDefectInfo->m_strLoading = "O";
   //pRawData->ExportGlassRaw(m_Server.GetGlassRawInfo(), (char*)m_Server.GetGlassData());
   int nDataCount = pRawData->GetGlassData()->m_nDefectNum;
   _grmDefectData* pDefect;
   _grmGlassData* pGlass;
   CString strTemp;
   CString strReviewImageName;
   for (int i = 0; i < pRawData->GetGlassData()->m_nDefectNum; i++)
   {
      pDefect = pRawData->GetDefectData(i);//m_Server.GetDefectData(i);
      pGlass = pRawData->GetGlassData(); //m_Server.GetGlassData();
      pDefectInfo->m_nDefectIdx = pGlass->m_nDefectNum;
      pDefectInfo->m_strGlassID = pGlass->m_strGlassID;
      pDefectInfo->m_strPPID = pGlass->m_strPPID;
      pDefectInfo->m_strJudge = pGlass->m_strGlassJudge;
      strReviewImageName = pDefect->m_ReviewDefect.m_strRevImageName;
      if (strReviewImageName == "" || strReviewImageName == "*")
      {
         continue;
      }
      else
      {
         pDefectInfo->m_nReviewIdx = pDefectInfo->m_nReviewIdx + 1;
      }
   }
}
void CReveiwHistoryDlg::BinFileOpen(int nCount)
{
      BOOL bNewFile = TRUE;
   if (nCount < 1) return;
   if (m_vecStrGridReviewPath.size() <= 0) return;
   if (m_vecStrGridReviewPath[nCount-1] == m_strRawFilePath) bNewFile = FALSE;
   if (m_Formation.m_vecHeader.size() < 1) return;
   CString strFileName = m_vecStrGridReviewList[nCount-1];
   CPathSettingDlg* pReivewSetting = CPathSettingDlg::GetMgr();
   CString strBinPath;
   strBinPath = pReivewSetting->GetBinPath();
   CgrmGlassRawData RawData;
   RawData.ImportGlassRaw(m_Server.GetGlassRawInfo(), NULL);
   strcpy(RawData.GetGlassData()->m_strFileName, strFileName.GetBuffer());
   strcpy(RawData.GetGlassData()->m_strPath, strBinPath.GetBuffer());
   BOOL bRetReadBin = m_pGlassRawMaker->ReadBinFile(&RawData);
   CGridCellCheck* pCellCheck = NULL;
   pCellCheck = (CGridCellCheck*)m_gridReviewList.GetCell(nCount, 0);
   if (bRetReadBin == FALSE)
   {
      AfxMessageBox(_T("로드 ì‹¤íŒ¨ í•˜ì˜€ìŠµë‹ˆë‹¤."), MB_OK | MB_ICONERROR);
      m_FormationMap.SetAutoScale();
      LOG(Dbg, _T("[Processe] File Open False"));
      pCellCheck->SetCheck(FALSE);
      Imagenoload();
      return;
   }
   if (bNewFile && m_chkSingle.GetCheck())
   {
      m_FormationMap.m_vecCellRect.clear();
      m_FormationMap.m_vecTempCellRect.clear();
      m_FormationMap.clear();
      m_Formation.Clear();
      m_Formation.m_vecTempDefects.clear();
      m_Formation.m_vecTempImage.clear();
      SetScrollRest();
   }
   else if (bNewFile && !m_chkSingle.GetCheck())
   {
      if (m_bFirst)
      {
         m_bFirst = false;
         m_FormationMap.m_vecCellRect.clear();
      }
      m_FormationMap.clear();
      m_Formation.m_vecFormation.clear();
      SetScrollRest();
   }
   else if (!bNewFile && !m_chkSingle.GetCheck())
   {
      m_FormationMap.clear();
      m_Formation.m_vecFormation.clear();
      SetScrollRest();
   }
   else
   {
      m_FormationMap.clear();
      m_Formation.m_vecDefects.clear();
      m_Formation.m_vecFormation.clear();
      m_Formation.m_vecImage.clear();
      SetScrollRest();
   }
   RawData.ExportGlassRaw(m_Server.GetGlassRawInfo(), (char*)m_Server.GetGlassData());
   int nDataCount = RawData.GetGlassData()->m_nDefectNum;
   int nCellCount = RawData.GetGlassData()->m_nCellNum;
   m_strRawFilePath = m_vecStrGridReviewPath[nCount-1];
   _grmGlassData* pGlass = m_Server.GetGlassData();
   m_FormationMap.m_dGlassSizeWidth = pGlass->m_nGlassSizeWidth / 1000;
   m_FormationMap.m_dGlassSizeHeight = pGlass->m_nGlassSizeHeight / 1000;
   if (m_bDefectAll == false && m_chkSingle.GetCheck())
   {
      AddVecDataDefct(nDataCount);
   }
   else if (m_bDefectAll == false && !m_chkSingle.GetCheck())
   {
      if(m_Formation.m_vecTempDefects.size() > 0)
      {
         int nCount2;
         nCount2 = MultiInsert(nCount, nDataCount);
         if (nCount2 == -1)
         {
            AddVecDataDefct2(nDataCount);
         }
      }
      else
      {
         AddVecDataDefct2(nDataCount);
      }
      /*AddVecDataDefct2(nDataCount, nCount);*/
   }
   else if (m_bDefectAll == true && !m_chkSingle.GetCheck())
   {
      if (m_Formation.m_vecTempDefects.size() > 0)
      {
         int nCount2;
         nCount2 = MultiInsert(nCount, nDataCount);
         if (nCount2 == -1)
         {
            AddVecDataDefectAll2(nDataCount);
         }
      }
      else
      {
         AddVecDataDefectAll2(nDataCount);
      }
      /*AddVecDataDefectAll2(nDataCount, nCount);*/
   }
   else
   {
      AddVecDataDefectAll(nDataCount);
   }
   AddVecDataImage(nDataCount);
   AddVecCellData(nCellCount);
   AddVecGlassData(nCount);
   AddVecDateSorting(nDataCount);
   AddVecImageSorting(nDataCount);
   AddVecCellSorting(nCellCount);
   m_gridDefectInfo.SetRowCount(m_Formation.m_vecDefects.size() + 1);
   m_gridDefectInfo.Invalidate();
   m_gridGlassInfo.SetRowCount(m_Formation.m_vecGlassInfo.size() + 1);
   m_gridGlassInfo.Invalidate();
   int nDefectSize = 0;
   int nImageSize = 0;
   int nCellSize = 0;
   int nNext = MAX_COUNT;
   if (m_chkSingle.GetCheck())
   {
      m_nDefectSize[0] = GetDefectCount();//m_Formation.m_vecDefects.size();
      m_nImageSize[0] = GetImageCount();//m_Formation.m_vecImage.size();
      m_nCellSize[0] = GetCellCount();
      m_nCellSizeTemp[0] = m_nCellSize[0];
      m_nImageCount = 0;
      m_nDefectCount = 0;
      m_nCellCount = 0;
   }
   else
   {
      for (int i = 0; i <= MAX_COUNT; i++)
      {
         nDefectSize = GetDefectCount();
         nImageSize = GetImageCount();
         nCellSize = GetCellCount();
         //1.값을 ìˆœì„œëŒ€ë¡œ ë„£ëŠ”ë‹¤
         if (nDefectSize > 0 || nImageSize > 0 || nCellSize > 0)
         {
            if (m_nDefectSize[i] == 0 && m_nImageSize[i] == 0 && m_nCellSize[i] == 0)
            {
               m_nDefectSize[i] = GetDefectCount();//m_Formation.m_vecDefects.size();
               m_nImageSize[i] = GetImageCount();//m_Formation.m_vecImage.size();
               m_nCellSize[i] = GetCellCount();
               m_nImageCount = 0;
               m_nDefectCount = 0;
               m_nCellCount = 0;
               break;
            }
         }
         //2.마지막 ê°’이면 2번째가 ì²«ë²ˆì§¸ë¡œ ì˜¬ë¦° í›„ ë„£ëŠ”ë‹¤.
         if (nNext == i)
         {
            for (int j = 0; j < MAX_COUNT; j++)
            {
               m_nDefectSize[j] = m_nDefectSize[j + 1];
               m_nImageSize[j] = m_nImageSize[j + 1];
               m_nCellSize[j] = m_nCellSize[j + 1];
               m_nCellSizeTemp[j] = m_nCellSize[j];
            }
            m_nDefectSize[i] = GetDefectCount();//m_Formation.m_vecDefects.size();
            m_nImageSize[i] = GetImageCount();//m_Formation.m_vecImage.size();
            m_nCellSize[i] = GetCellCount();
            m_nCellSizeTemp[i] = m_nCellSize[i];
            m_nImageCount = 0;
            m_nDefectCount = 0;
            m_nCellCount = 0;
         }
         //3.중간에 ê°’이 ë¹ ì§€ë©´ ì¤‘ê°„ ë²ˆì§¸ ê°’을 ì˜¬ë¦° í›„ ë„£ëŠ”ë‹¤.
         //       if (i != 0) //i가 0 ì´ ì•„니면 count를 ë†’인다.
         //       {
         //          nDefectSize += m_nDefectSize[i];
         //          nImageSize += m_nImageSize[i];
         //          nCellSize += m_nCellSize[i];
         //       }
         //       else if (i == 0 && m_nDefectSize[0] > 0) //i가 0인데 ë””펙이 ìžˆìœ¼ë©´ ì¹´ìš´í„°ë¥¼ ë†’인다.
         //       {
         //          nDefectSize += m_nDefectSize[i];
         //          nImageSize += m_nImageSize[i];
         //          nCellSize += m_nCellSize[i];
         //       }
         //       if (m_nDefectSize[0] == 0)
         //       {
         //          m_nDefectSize[i] = GetDefectCount();//m_Formation.m_vecDefects.size();
         //          m_nImageSize[i] = GetImageCount();//m_Formation.m_vecImage.size();
         //          m_nCellSize[i] = GetCellCount();
         //
         //          m_nImageCount = 0;
         //          m_nDefectCount = 0;
         //          m_nCellCount = 0;
         //          break;
         //       }
         //       else if(i != 0 && m_nDefectSize[i] == 0)
         //       {
         //          m_nDefectSize[i] = GetDefectCount(); //m_Formation.m_vecDefects.size() - nDefectSize;
         //          m_nImageSize[i] = GetImageCount(); //m_Formation.m_vecImage.size() - nImageSize;
         //          m_nCellSize[i] = GetCellCount();
         //
         //          m_nImageCount = 0;
         //          m_nDefectCount = 0;
         //          m_nCellCount = 0;
         //          break;
         //       }
      }
   }
   m_FormationMap.m_pDefectFormation = &m_Formation;
   m_DefectDisplayOption.m_nShowLabel = -1;
   m_FormationMap.m_pDefectDisplayOption = &m_DefectDisplayOption;
   CAlignDlg* lpDlg = CAlignDlg::GetMgr();
   lpDlg->m_pDefectFormation = &m_Formation;
   lpDlg->m_pDefectDisplayOption = &m_DefectDisplayOption;
   if(bNewFile) m_FormationMap.SetAutoScale();
   else m_FormationMap.ReDraw(TRUE);
   int nDefectNum = m_Server.GetGlassData()->m_nDefectNum;
   int nNoneGroupDefect = m_Formation.m_vecImage.size();
   if (m_Formation.m_vecImage.size() > 0)
   {
      SetScrollSetting();
   }
}
void CReveiwHistoryDlg::OnCbnSelchangeComboRawtype()
{
   CGlassRawBase* pNewRawMaker = NULL;
   pNewRawMaker = new CGlassRawCPJT;
   if (m_pGlassRawMaker) delete m_pGlassRawMaker;
   m_pGlassRawMaker = pNewRawMaker;
   m_ConfigOption.m_nSelectRawType = 3;
}
void CReveiwHistoryDlg::OnBnClickedBtnFindBin()
{
   // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   m_vecStrGridReviewList.clear();
   m_vecStrGridTimeList.clear();
   m_vecStrGridReviewPath.clear();
   m_Formation.m_vecHeader.clear();
   m_FormationMap.clear();
   m_Formation.Clear();
   GlassInfoRest();
//    m_ProgressFile.ModifyStyle(0, PBS_MARQUEE);
//    m_ProgressFile.ShowWindow(TRUE);
//    pProgressBar->SetMarquee(TRUE, 30);
   CPathSettingDlg* pReivewSetting = CPathSettingDlg::GetMgr();
   CString strBinPath;
   strBinPath = pReivewSetting->GetBinPath();
   if (strBinPath == "")
   {
      return;
   }
   strBinPath += _T("\\*.*");
   CFileFind finder;
   BOOL bWorking = finder.FindFile(strBinPath);
//    CakFileUtil akFile;
//    akFile.FindFile(strBinPath.GetBuffer());
//    VECFINDDATA* pVecFindData = akFile.getFindData();
//
//    for (int i = 0; i < pVecFindData->size(); i++)
//    {
//       _DefectList akDefect;
//       m_vecStrDefectList.push_back(akDefect);
//       _DefectList* pDefectList = &m_vecStrDefectList[i];
//
//
//       TRACE("Craete Time : %d, %s \n", (*pVecFindData)[i].time_create, (*pVecFindData)[i].name);
//       pDefectList->m_nFileTime = (*pVecFindData)[i].time_create;
//       pDefectList->m_strFileName = (*pVecFindData)[i].name;
// //       m_vecStrGridReviewList.push_back((*pVecFindData)[i].name);
// //       m_vecStrGridTimeList.push_back((*pVecFindData)[i].time_create;
//       OpenFileHeader((*pVecFindData)[i].name);
//    }
   CString fileName;
   CString DirName;
   int nCount = 1;
   m_ctlProgress.ShowWindow(TRUE);
   int nPersent = 0;
   while (bWorking)
   {
      m_ctlProgress.SetPos(nPersent);
      nPersent++;
      if (nPersent >= 100)
      {
         nPersent = 0;
      }
      //다음 íŒŒì¼ / í´ë” ê°€ ì¡´ìž¬í•˜ë©´ë‹¤ë©´ TRUE ë°˜í™˜
      bWorking = finder.FindNextFile();
      //파일 ì¼ë•Œ
      if (finder.IsArchived())
      {
         //파일의 ì´ë¦„
         CString _fileName = finder.GetFileName();
         // í˜„재폴더 ìƒìœ„폴더 ì¸ë„¤ì¼íŒŒì¼ì€ ì œì™¸
         if (_fileName == _T(".") ||
            _fileName == _T("..") ||
            _fileName == _T("Thumbs.db")) continue;
         CString strFindName = ".bin";
         CString strFileName, strFileName2;
         strFileName = _fileName.Right(4); //bin íŒŒì¼ë§Œ
         if (strFileName.Compare(strFindName) == 0)
         {
            /*if(nCount > m_nFileCount) break; //count ì—¬ê¸°ì„œ ë§ê³  ì „ì²´ íŒŒì¼ì„ ë‹¤ ì½ì€ í›„에 ë‹¤ì‹œ ì†ŒíŒ…하자*/
            m_vecStrGridReviewList.push_back(_fileName);
            strFileName2 = strBinPath.Left(strBinPath.GetLength() - 3);
            strFileName2 += _fileName;
            m_vecStrGridReviewPath.push_back(strFileName2);
            FileTime(strFileName2);
            OpenFileHeader(_fileName, strFileName2);
            /*nCount++;*/
         }
      }
   }
   //여기에서 ìž¬ ì†ŒíŒ… í›„에 í•„요한 ë§Œí¼ë§Œ ë„£ìž
   {
      //vec를 ì •ë ¬ í•œë‹¤.
      SortFileList(1);
      //갯수만큼만 ë³µì‚¬ë¥¼ í•œë‹¤
      //복사한 ê²ƒì„ ë„£ëŠ”ë‹¤.
   }
    CGridCellCheck* pCellCheck = NULL;
//
//    m_gridReviewList.SetCellType(1, 0, RUNTIME_CLASS(CGridCellCheck));
//
    m_gridReviewList.SetRowCount(m_Formation.m_vecHeader.size() + 1);
   {
      GV_ITEM Item;
      int nRowIdx = 0;
      int nColIdx = 0;
      CString strTemp;
      Item.mask = GVIF_TEXT;
      _akReviewHeader   *pReview = NULL;
      for (int i = 0; i < m_Formation.m_vecHeader.size(); i++)
      {
         m_gridReviewList.SetCellType(i + 1, 0, RUNTIME_CLASS(CGridCellCheck));
//          pCellCheck = (CGridCellCheck*)m_ctrlGridGlassList.GetCell(nRowIdx, nColIdx);
//
//          pCellCheck->SetCheck();
         nColIdx = 0;
         pReview = &m_Formation.m_vecHeader[i];
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%d"), i + 1);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%s"), pReview->m_strFileTime);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%s"), pReview->m_strLoading);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%s"), pReview->m_strPPID);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%s"), pReview->m_strGlassID);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%d"), pReview->m_nDefectIdx);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%d"), pReview->m_nReviewIdx);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%s"), pReview->m_strJudge);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
         Item.row = i + 1;
         Item.col = nColIdx++;
         strTemp.Format(_T("%s"), pReview->m_strFileName);
         Item.strText = strTemp;
         m_gridReviewList.SetItem(&Item);
      }
   }
   m_gridReviewList.Invalidate();
   m_ctlProgress.ShowWindow(FALSE);
}
void CReveiwHistoryDlg::ShowProgressBar()
{
}
void CReveiwHistoryDlg::setDefectShow(int nDefectID, BOOL bEnsureVisible)
{
   const int nDefectCol = 1;
   if (nDefectID >= 0)
   {
      int sajfklwe;
      sajfklwe = m_gridDefectInfo.GetColumnCount();
      if (m_nSelectedRow > m_gridDefectInfo.GetColumnCount())
      {
         m_nSelectedRow = 0;
      }
      if(!m_bDefectAll)
      {
         if (m_nSelectedRow > m_Formation.m_vecImage.size())
         {
            m_nSelectedRow = 0;
         }
      }
      int iRow = m_nSelectedRow;
      for (int iCol = 0; iCol < m_gridDefectInfo.GetColumnCount(); iCol++)
      {
         m_gridDefectInfo.SetItemState(iRow, iCol, m_gridDefectInfo.GetItemState(iRow, iCol) & ~GVIS_SELECTED);
      }
   }
   for (int i = 0; i < m_Formation.m_vecDefects.size(); i++)
   {
      _akDefect* pDefectInfo = &m_Formation.m_vecDefects[i];
      if (pDefectInfo == NULL)
         return;
      if (pDefectInfo->m_nDefectID == nDefectID)
      {
         int iRow = i + 1;
         for (int iCol = 0; iCol < m_gridDefectInfo.GetColumnCount(); iCol++)
         {
            m_gridDefectInfo.SetItemState(iRow, iCol, LVIS_SELECTED);
         }
         m_nSelectedRow = iRow;
         if (bEnsureVisible)
         {
            m_gridDefectInfo.EnsureVisible(iRow, m_nSelectedCol);
         }
         break;
      }
   }
   m_gridDefectInfo.Invalidate();
}
void CReveiwHistoryDlg::ImageShow(int nDefectID)
{
   CPaintDC dc(this);
   if (nDefectID < 0) return;
   m_DefectImage.Destroy();
   m_ReviewImage.Destroy();
   //LYW 20210825 #3486 ADD START
   m_DefectRotateImage.Destroy();
   //LYW 20210825 #3486 ADD END
   m_AlignFirst.Destroy();
   m_AlignSecend.Destroy();
   CString DeftectPath, DeftectPath2, AlignPath, AlignPath2;
   CFileStatus FileOn;
   TCHAR chFilePath[256] = { 0, };
   GetModuleFileName(NULL, chFilePath, 256);
   if (chFilePath == NULL || chFilePath == "") return;
   CString strFolderPath(chFilePath);
   strFolderPath = strFolderPath.Left(strFolderPath.ReverseFind('\\'));
   strFolderPath = strFolderPath + "\\no-image.png";
   //DefectData가 ì§€ê¸ˆ ì„ íƒëœ DefectData를 ê°€ì ¸ ì˜¨ë‹¤. ì´ê±° ìˆ˜ì •...
//    _grmDefectData* pDefect = m_Server.GetDefectData(nDefectID);
//    _grmGlassData* pGlass = m_Server.GetGlassData();
   int nIndex = 0;
   //디펙 ì¸ë±ìŠ¤ì™€ ê°™ì€ ë†ˆì„ ì°¾ì•„라
   for (int i = 0; i < m_Formation.m_vecImage.size(); i++)
   {
      _akReviewList* pImage = NULL;
      pImage = &m_Formation.m_vecImage[i];
      if (!m_bDefectAll)
      {
         nIndex = nDefectID;
         break;
      }
      else
      {
         if (pImage->m_nDefectID == nDefectID)
         {
            nIndex = i;
            break;
         }
      }
   }
   _akReviewList* pImageInfo = &m_Formation.m_vecImage[nIndex];
   //몇 ë²ˆì§¸ ì¸ì§€ ë˜ì§„다.
   CString wekfjlwe = pImageInfo->m_strReviewImageName;
   CString wjkflwe = pImageInfo->m_strAoiImageName;
   CString jkefawlj = pImageInfo->m_strReviewImagePath;
   //해당 count를 í˜¸ì¶œ í•œë‹¤.
   //파일 ì´ë¯¸ì§€ë¥¼ ë¶ˆëŸ¬ ì˜¨ë‹¤
   //표현한다.
/*   if (pGlass == NULL) return;*/
   //_akReviewList* pDfect2 = &m_Formation.m_vecImage[nDefectID];
//    CString wefjklwef;
//    wefjklwef = pDfect2->m_strRevewImageName;
    CString strReviewImageName, strInspectorName, strReviewImagePath, strAlignName, strAlignName2;
//    strReviewImageName = pDefect->m_ReviewDefect.m_strRevImageName;
//    strInspectorName = pDefect->m_strAoiImageName;
//    strReviewImagePath = pDefect->m_ReviewDefect.m_strRevImagePath;
/*   pDefect->m_ReviewDefect.m_strRevImagePath*/
   strReviewImageName = wekfjlwe;
   strInspectorName = wjkflwe;
   strReviewImagePath = jkefawlj;
   strAlignName = pImageInfo->m_strAlignFirst; //Glass ê°’ ê°€ì ¸ì™€ë¼
   strAlignName2 = pImageInfo->m_strAlignSecond;
//    strAlignName.Format(_T("1.jpg"));
//    strAlignName2.Format(_T("2.jpg"));
   CString strReviewPath;
   CString strInspectorPath;
   CString strAlignPath;
   CPathSettingDlg* lpDlg = CPathSettingDlg::GetMgr();
   strInspectorPath = lpDlg->GetInspectorPath();
   strReviewPath = lpDlg->GetReviewPath();
   strAlignPath = lpDlg->GetAlignPath();
   DeftectPath.Format(_T("%s\\%s\\%s"), strReviewPath, strReviewImagePath, strReviewImageName);
   //DeftectPath2.Format(_T("%s\\%s"), strInspectorPath, strInspectorName);
   if (strInspectorName == "*" || strInspectorName == "**" || strInspectorName == "***") strInspectorName = "";
   DeftectPath2.Format(_T("%s\\%s\\%s"), strInspectorPath, pImageInfo->m_strGlassID, strInspectorName);
   AlignPath.Format(_T("%s\\%s\\%s"), strAlignPath, pImageInfo->m_strGlassID, strAlignName);
   AlignPath2.Format(_T("%s\\%s\\%s"), strAlignPath, pImageInfo->m_strGlassID, strAlignName2);
   if (CFile::GetStatus(DeftectPath, FileOn) && strReviewImageName != "") //파일이 ìžˆì„ ë•Œ
   {
      CString strTest;
      strTest = DeftectPath;
      strcpy(m_strConfigFile, strTest.GetBuffer(0));
      m_ImageView.SetImageData(m_strConfigFile);
      m_ImageView.ReDraw();
//       m_ReviewImage.Load(DeftectPath);
//       HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), DeftectPath,
//          IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//
//
//       InvalidateRect(m_picture_rect, FALSE);
//       dc.SetStretchBltMode(COLORONCOLOR);
//       m_ReviewImage.Draw(dc, m_picture_rect);
   }
   else
   {
      CString strTest;
      strTest = strFolderPath;
      strcpy(m_strConfigFile, strTest.GetBuffer(0));
      m_ImageView.SetImageData(m_strConfigFile);
      m_ImageView.ReDraw();
//       m_ReviewImage.Load(strFolderPath);
//       HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strFolderPath,
//          IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//
//       InvalidateRect(m_picture_rect, FALSE);
//       dc.SetStretchBltMode(COLORONCOLOR);
//       m_ReviewImage.Draw(dc, m_picture_rect);
   }
   if (CFile::GetStatus(DeftectPath2, FileOn) && strInspectorName != "") //파일이 ìžˆì„ ë•Œ
   {
      m_DefectImage.Load(DeftectPath2);
      //LYW 20210825 #3486 ADD START
      m_DefectRotateImage.Create(m_DefectImage.GetWidth(), m_DefectImage.GetHeight(), m_DefectImage.GetBPP(), 0);
      ImageRotate(m_DefectImage, m_DefectRotateImage);
      //LYW 20210825 #3486 ADD END
      HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), DeftectPath2,
         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
      InvalidateRect(m_picture_rect2, FALSE);
      dc.SetStretchBltMode(COLORONCOLOR);
      //LYW 20210825 #3486 MOD START
      m_DefectRotateImage.Draw(dc, m_picture_rect2);
      //LYW 20210825 #3486 MOD END
      //original
      //m_DefectImage.Draw(dc, m_picture_rect2);
   }
   else
   {
      m_DefectImage.Load(strFolderPath);
      HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strFolderPath,
         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
      InvalidateRect(m_picture_rect2, FALSE);
      dc.SetStretchBltMode(COLORONCOLOR);
      m_DefectImage.Draw(dc, m_picture_rect2);
   }
   if (CFile::GetStatus(AlignPath, FileOn) && strAlignName != "") //파일이 ìžˆì„ ë•Œ
   {
      m_AlignFirst.Load(AlignPath);
      HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), AlignPath,
         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
      InvalidateRect(m_Align_rect, FALSE);
      dc.SetStretchBltMode(COLORONCOLOR);
      m_AlignFirst.Draw(dc, m_Align_rect);
   }
   else
   {
      m_AlignFirst.Load(strFolderPath);
      HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strFolderPath,
         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
      InvalidateRect(m_Align_rect, FALSE);
      dc.SetStretchBltMode(COLORONCOLOR);
      m_AlignFirst.Draw(dc, m_Align_rect);
   }
   if (CFile::GetStatus(AlignPath2, FileOn) && strAlignName2 != "") //파일이 ìžˆì„ ë•Œ
   {
      m_AlignSecend.Load(AlignPath2);
      HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), AlignPath2,
         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
      InvalidateRect(m_Align_rect2, FALSE);
      dc.SetStretchBltMode(COLORONCOLOR);
      m_AlignSecend.Draw(dc, m_Align_rect2);
   }
   else
   {
      m_AlignSecend.Load(strFolderPath);
      HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strFolderPath,
         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
      InvalidateRect(m_Align_rect2, FALSE);
      dc.SetStretchBltMode(COLORONCOLOR);
      m_AlignSecend.Draw(dc, m_Align_rect2);
   }
}
void CReveiwHistoryDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
   // TODO: ì—¬ê¸°ì— ë©”시지 ì²˜ë¦¬ê¸° ì½”드를 ì¶”ê°€ ë°/또는 ê¸°ë³¸ê°’을 í˜¸ì¶œí•©ë‹ˆë‹¤.
   if (IDC_SLIDER_IMG == pScrollBar->GetDlgCtrlID())
   {
      int nCount = m_sldImg.GetPos();
      CString strPos;
      strPos.Format(_T("%d"), nCount);
      m_ctrCount.SetWindowText(strPos);
      if (nCount > -1)
      {
         if (m_Formation.m_vecImage.size() <= 0)
         {
            SetScrollRest();
            return;
         }
         _akReviewList* pImageInfo = &m_Formation.m_vecImage[nCount];
         m_FormationMap.setSelectDefect(pImageInfo->m_nDefectID);
         //ImageShow(pImageInfo->m_nDefectID);
         setDefectShow(pImageInfo->m_nDefectID, 1);
      }
   }
}
void CReveiwHistoryDlg::OnChangeEditCount()
{
   // TODO:  RICHEDIT ì»¨íŠ¸ë¡¤ì¸ ê²½ìš°, ì´ ì»¨íŠ¸ë¡¤ì€
   // CDialogEx::OnInitDialog() í•¨ìˆ˜ë¥¼ ìž¬ì§€ì •
   //하고 ë§ˆìŠ¤í¬ì— OR ì—°ì‚°í•˜ì—¬ ì„¤ì •된 ENM_CHANGE í”Œëž˜ê·¸ë¥¼ ì§€ì •하여 CRichEditCtrl().SetEventMask()를 í˜¸ì¶œí•˜ì§€ ì•Šìœ¼ë©´
   // ì´ ì•Œë¦¼ ë©”시지를 ë³´ë‚´ì§€ ì•ŠìŠµë‹ˆë‹¤.
   // TODO:  ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   CString strPos;
   m_ctrCount.GetWindowText(strPos);
   if (strPos == "") return;
   int nPos = _ttoi(strPos);
   if (nPos < -1)
   {
      m_ctrCount.SetWindowText(0);
      nPos = 0;
   }
   else if (nPos > m_Formation.m_vecImage.size()-1)
   {
      nPos = m_Formation.m_vecImage.size() - 1;
      CString strCount;
      strCount.Format(_T("%d"),nPos);
      m_ctrCount.SetWindowText(strCount);
   }
   m_sldImg.SetPos(nPos);
   if (nPos > -1)
   {
      if (m_Formation.m_vecImage.size() <= 0)
      {
         SetScrollRest();
         return;
      }
      _akReviewList* pImageInfo = &m_Formation.m_vecImage[nPos];
      m_FormationMap.setSelectDefect(pImageInfo->m_nDefectID);
      //ImageShow(pImageInfo->m_nDefectID/*nPos*/);
      ImageShow(nPos);
      setDefectShow(pImageInfo->m_nDefectID, 1);
   }
}
void CReveiwHistoryDlg::SetScrollSetting()
{
   if (m_Formation.m_vecImage.size() <= 0) return;
   _akReviewList* pImageInfo = &m_Formation.m_vecImage[m_Formation.m_vecImage.size() - 1];
   int nMinRange = m_Formation.m_vecImage.size()*0.03, nMaxRange = m_Formation.m_vecImage.size()*0.1;
   if (nMinRange <= 0) nMinRange = 1;
   if (nMaxRange <= 0) nMaxRange = 1;
   m_sldImg.SetRange(0, m_Formation.m_vecImage.size()-1); //범위 ì„¤ì • ìµœëŒ€ ì´ë¯¸ì§€ ê°¯ìˆ˜
   m_sldImg.SetPos(0); //현재 í¬ì§€ì…˜
   m_sldImg.SetLineSize(nMinRange); //이동할 ë²”위 3%
   m_sldImg.SetPageSize(nMaxRange); //페이지 ì—…다운 ì´ë™ ë²”위 ë²”위 10%
   int nPos = m_sldImg.GetPos();
   CString strPos;
   strPos.Format(_T("%d"), nPos);
   m_ctrCount.SetWindowText(strPos);
}
void CReveiwHistoryDlg::SetScrollRest()
{
   m_sldImg.SetRange(-1, -1);
   m_sldImg.SetPos(-1);
   m_sldImg.SetLineSize(3);
   m_sldImg.SetPageSize(10);
   int nPos = m_sldImg.GetPos();
   CString strPos;
   strPos.Format(_T("%d"), nPos);
   m_ctrCount.SetWindowText(strPos);
}
void CReveiwHistoryDlg::OnBnClickedButton3()
{
//    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
//    CPaintDC dc(this);
//    HDC hMemDC;
//
//    hMemDC = CreateCompatibleDC(dc);
//
//    m_DefectImage.Destroy();
//
//    CString DeftectPath;
//    CFileStatus FileOn;
//    TCHAR chFilePath[256] = { 0, };
//    GetModuleFileName(NULL, chFilePath, 256);
//    CString strFolderPath(chFilePath);
//    strFolderPath = strFolderPath.Left(strFolderPath.ReverseFind('\\'));
//
//    strFolderPath = strFolderPath + "\\no-image.png";
//    m_DefectImage.Load(strFolderPath);
//
//    HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strFolderPath,
//       IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//
//    InvalidateRect(m_picture_rect, FALSE);
//
//    dc.SetStretchBltMode(COLORONCOLOR);
//    //StretchBlt(dc, 500, 400, 300, 200, hMemDC, 105, 105, 120, 123, SRCCOPY);
//    //m_DefectImage.StretchBlt(dc, 0, 0, 100, 100, SRCCOPY);
//    m_DefectImage.StretchBlt(dc, 0, 0, 500, 200, SRCCOPY);
//    m_DefectImage.Draw(dc, m_picture_rect);
}
void CReveiwHistoryDlg::OnClickedChkAllDefect()
{
   // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   if (m_chkAllDefect.GetCheck())
   {
      if (IDYES == AfxMessageBox(_T("정렬한 ê°’이 ëª¨ë‘ ì´ˆê¸°í™” ë©ë‹ˆë‹¤"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkAllDefect.SetCheck(TRUE);
         m_chkReviewDefect.SetCheck(FALSE);
         OnViewAlldefect();
      }
      else
      {
         m_chkAllDefect.SetCheck(FALSE);
         m_chkReviewDefect.SetCheck(TRUE);
      }
   }
   else
   {
      if (IDYES == AfxMessageBox(_T("정렬한 ê°’이 ëª¨ë‘ ì´ˆê¸°í™” ë©ë‹ˆë‹¤"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkAllDefect.SetCheck(FALSE);
         m_chkReviewDefect.SetCheck(TRUE);
         OnViewReviewdefect();
      }
      else
      {
         m_chkAllDefect.SetCheck(TRUE);
         m_chkReviewDefect.SetCheck(FALSE);
      }
   }
}
void CReveiwHistoryDlg::OnClickedChkReviewDefect()
{
   // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   if (m_chkReviewDefect.GetCheck())
   {
      if (IDYES == AfxMessageBox(_T("정렬한 ê°’이 ëª¨ë‘ ì´ˆê¸°í™” ë©ë‹ˆë‹¤"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkAllDefect.SetCheck(FALSE);
         m_chkReviewDefect.SetCheck(TRUE);
         OnViewAlldefect();
      }
      else
      {
         m_chkAllDefect.SetCheck(TRUE);
         m_chkReviewDefect.SetCheck(FALSE);
      }
   }
   else
   {
      if (IDYES == AfxMessageBox(_T("정렬한 ê°’이 ëª¨ë‘ ì´ˆê¸°í™” ë©ë‹ˆë‹¤"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkAllDefect.SetCheck(TRUE);
         m_chkReviewDefect.SetCheck(FALSE);
         OnViewReviewdefect();
      }
      else
      {
         m_chkAllDefect.SetCheck(FALSE);
         m_chkReviewDefect.SetCheck(TRUE);
      }
   }
}
void CReveiwHistoryDlg::OnClickedChkMuti()
{
   // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   if (m_chkMuti.GetCheck())
   {
      if (IDYES == AfxMessageBox(_T("선택한 í•­ëª© ëª¨ë‘ê°€ ì§€ì›Œ ì§‘니다"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkSingle.SetCheck(FALSE);
         m_chkMuti.SetCheck(TRUE);
         GlassInfoRest();
         for (int i = 0; i < 105; i++)
         {
            m_nSelectFile[i] = 0;
            m_nDefectSize[i] = 0;
            m_nCellSize[i] = 0;
            m_nImageSize[i] = 0;
            m_nCellSizeTemp[i] = m_nCellSize[i];
         }
         m_Formation.Clear();
         m_bFirst = true;
      }
      else
      {
         m_chkSingle.SetCheck(TRUE);
         m_chkMuti.SetCheck(FALSE);
      }
   }
   else
   {
      if (IDYES == AfxMessageBox(_T("선택한 í•­ëª© ëª¨ë‘ê°€ ì§€ì›Œ ì§‘니다"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkSingle.SetCheck(TRUE);
         m_chkMuti.SetCheck(FALSE);
         GlassInfoRest();
      }
      else
      {
         m_chkSingle.SetCheck(FALSE);
         m_chkMuti.SetCheck(TRUE);
         GlassInfoRest();
         for (int i = 0; i < 105; i++)
         {
            m_nSelectFile[i] = 0;
            m_nDefectSize[i] = 0;
            m_nCellSize[i] = 0;
            m_nImageSize[i] = 0;
            m_nCellSizeTemp[i] = m_nCellSize[i];
         }
         m_Formation.Clear();
      }
   }
}
void CReveiwHistoryDlg::OnClickedChkSingle()
{
   // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   if (m_chkSingle.GetCheck())
   {
      if (IDYES == AfxMessageBox(_T("선택한 í•­ëª© ëª¨ë‘ê°€ ì§€ì›Œ ì§‘니다"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkMuti.SetCheck(FALSE);
         m_chkSingle.SetCheck(TRUE);
         GlassInfoRest();
         int nRow = 0;
         nRow = m_gridReviewList.GetRowCount();
         for (int i = 1; i < nRow; i++)
         {
            CGridCellCheck* pCellCheck = NULL;
            pCellCheck = (CGridCellCheck*)m_gridReviewList.GetCell(i, 0);
            pCellCheck->SetCheck(FALSE);
         }
         m_gridReviewList.Refresh();
      }
      else
      {
         m_chkSingle.SetCheck(FALSE);
         m_chkMuti.SetCheck(TRUE);
         GlassInfoRest();
         for (int i = 0; i < 105; i++)
         {
            m_nSelectFile[i] = 0;
            m_nDefectSize[i] = 0;
            m_nCellSize[i] = 0;
            m_nImageSize[i] = 0;
            m_nCellSizeTemp[i] = m_nCellSize[i];
         }
      }
   }
   else
   {
      if (IDYES == AfxMessageBox(_T("선택한 í•­ëª© ëª¨ë‘ê°€ ì§€ì›Œ ì§‘니다"), MB_YESNO | MB_ICONWARNING))
      {
         m_chkMuti.SetCheck(TRUE);
         m_chkSingle.SetCheck(FALSE);
         GlassInfoRest();
         for (int i = 0; i < 105; i++)
         {
            m_nSelectFile[i] = 0;
            m_nDefectSize[i] = 0;
            m_nCellSize[i] = 0;
            m_nImageSize[i] = 0;
            m_nCellSizeTemp[i] = m_nCellSize[i];
         }
         m_bFirst = true;
      }
      else
      {
         m_chkMuti.SetCheck(FALSE);
         m_chkSingle.SetCheck(TRUE);
      }
   }
}
void CReveiwHistoryDlg::Imagenoload()
{
   // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   CPaintDC dc(this);
//   m_ReviewImage.Destroy();
   m_DefectImage.Destroy();
   //LYW 20210825 #3486 ADD START
   m_DefectRotateImage.Destroy();
   //LYW 20210825 #3486 ADD END
   m_AlignFirst.Destroy();
   m_AlignSecend.Destroy();
   CString DeftectPath;
   CFileStatus FileOn;
   TCHAR chFilePath[256] = { 0, };
   GetModuleFileName(NULL, chFilePath, 256);
   CString strFolderPath(chFilePath);
   strFolderPath = strFolderPath.Left(strFolderPath.ReverseFind('\\'));
   strFolderPath = strFolderPath + "\\no-image.png";
   strcpy(m_strConfigFile, strFolderPath.GetBuffer(0));
   m_ImageView.SetImageData(m_strConfigFile);
//   m_ReviewImage.Load(strFolderPath);
   m_DefectImage.Load(strFolderPath);
   m_AlignFirst.Load(strFolderPath);
   m_AlignSecend.Load(strFolderPath);
   HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strFolderPath,
      IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
//   InvalidateRect(m_picture_rect, FALSE);
   InvalidateRect(m_picture_rect2, FALSE);
   InvalidateRect(m_Align_rect, FALSE);
   InvalidateRect(m_Align_rect2, FALSE);
   dc.SetStretchBltMode(COLORONCOLOR);
   m_ImageView.ReDraw();
//   m_ReviewImage.Draw(dc, m_picture_rect);
   m_DefectImage.Draw(dc, m_picture_rect2);
   m_AlignFirst.Draw(dc, m_Align_rect);
   m_AlignSecend.Draw(dc, m_Align_rect2);
}
//LYW 20210825 #3486 ADD START
void CReveiwHistoryDlg::ImageRotate(CImage & SrcImage, CImage & DstImage, double degree/* = 180.0 */)
{
   int Height = SrcImage.GetHeight(); // ì„¸ë¡œ ê¸¸ì´ ì €ìž¥
   int Width = SrcImage.GetWidth(); // ê°€ë¡œ ê¸¸ì´ ì €ìž¥
   int new_x, new_y;
   int R, G, B;
   int center_x = (SrcImage.GetWidth() / 2); // íšŒì „ ì¤‘심점
   int center_y = (SrcImage.GetHeight() / 2); // íšŒì „ ì¤‘심점
   double seta = 3.14 / (180.0 / degree); // ë¼ë””안
   double CosSeta = cos(seta);
   double SinSeta = sin(seta);
   for (int y = 0; y < Height; y++)
   {
      for (int x = 0; x < Width; x++)
      {
         new_x = (int)((x - center_x) * CosSeta - (y - center_y) * SinSeta + center_x);
         new_y = (int)((x - center_x) * SinSeta + (y - center_y) * CosSeta + center_y);
         if ((new_x < 0) || (new_x > Width) || (new_y < 0) || (new_y > Height))
            //이미지 ë²”위를 ë²—어나면 0 ê°’
         {
            R = 0;
            G = 0;
            B = 0;
         }
         else
         {
            R = GetRValue(SrcImage.GetPixel(new_x, new_y));
            G = GetGValue(SrcImage.GetPixel(new_x, new_y));
            B = GetBValue(SrcImage.GetPixel(new_x, new_y));
         }
         DstImage.SetPixel((int)x, (int)y, RGB(R, G, B));
         new_x = 0; new_y = 0;
      }
   }
}
//LYW 20210825 #3486 ADD END
void CReveiwHistoryDlg::OnChangeEditFileCount()
{
   // TODO:  RICHEDIT ì»¨íŠ¸ë¡¤ì¸ ê²½ìš°, ì´ ì»¨íŠ¸ë¡¤ì€
   // CDialogEx::OnInitDialog() í•¨ìˆ˜ë¥¼ ìž¬ì§€ì •
   //하고 ë§ˆìŠ¤í¬ì— OR ì—°ì‚°í•˜ì—¬ ì„¤ì •된 ENM_CHANGE í”Œëž˜ê·¸ë¥¼ ì§€ì •하여 CRichEditCtrl().SetEventMask()를 í˜¸ì¶œí•˜ì§€ ì•Šìœ¼ë©´
   // ì´ ì•Œë¦¼ ë©”시지를 ë³´ë‚´ì§€ ì•ŠìŠµë‹ˆë‹¤.
   // TODO:  ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
   CString strCount;
   m_ctlFileCount.GetWindowText(strCount);
   m_nFileCount = _ttoi(strCount);
}
BOOL CReveiwHistoryDlg::GetCheckFileLoad(int nCount)
{
   BOOL bNewFile = TRUE;
   if (nCount == 0) return FALSE;
   if (m_vecStrGridReviewPath.size() <= 0) return FALSE;
   if (m_vecStrGridReviewPath[nCount - 1] == m_strRawFilePath) bNewFile = FALSE;
   if (m_vecStrGridReviewList.size() < 1) return FALSE;
   CString strFileName = m_vecStrGridReviewList[nCount - 1];
   CPathSettingDlg* pReivewSetting = CPathSettingDlg::GetMgr();
   CString strBinPath;
   strBinPath = pReivewSetting->GetBinPath();
   CgrmGlassRawData RawData;
   RawData.ImportGlassRaw(m_Server.GetGlassRawInfo(), NULL);
   strcpy(RawData.GetGlassData()->m_strFileName, strFileName.GetBuffer());
   strcpy(RawData.GetGlassData()->m_strPath, strBinPath.GetBuffer());
   BOOL bRetReadBin = m_pGlassRawMaker->ReadBinFile(&RawData);
   if (bRetReadBin == FALSE)
   {
      m_FormationMap.SetAutoScale();
      LOG(Dbg, _T("[Processe] File Open False"));
      Imagenoload();
      return FALSE;
   }
   return TRUE;
}
void CReveiwHistoryDlg::GlassInfoRest()
{
   m_Formation.m_vecGlassInfo.clear();
   for (int i = 0; i < 105; i++)
   {
      m_nSelectFile[i] = 0;
      m_nDefectSize[i] = 0;
      m_nImageSize[i] = 0;
   }
   m_gridGlassInfo.SetRowCount(2);
   m_gridGlassInfo.Invalidate();
}
BOOL CReveiwHistoryDlg::MultiSelectCheck(int nSelectCount)
{
   if (nSelectCount <= 0) return FALSE;
   //if (m_Formation.m_vecGlassInfo.size() > MAX_COUNT) return FALSE;
   int nDefectSize = 0;
   int nImageSize = 0;
   int nCellSize = 0;
   for (int i = 0; i < MAX_COUNT+1; i++)
   {
      nDefectSize += m_nDefectSize[i];
      nImageSize += m_nImageSize[i];
      nCellSize += m_nCellSize[i];
      if (nSelectCount == m_nSelectFile[i])
      {
         for (int j = 0; j < m_Formation.m_vecGlassInfo.size(); j++)
         {
            _akGlassInfo* pGlassInfo = &m_Formation.m_vecGlassInfo[j];
            if (pGlassInfo->m_nGlassSelect == m_nSelectFile[i])
            {
               m_Formation.m_vecGlassInfo.erase(m_Formation.m_vecGlassInfo.begin() + j);
                if (i == 0)
               {
                  m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin(), m_Formation.m_vecDefects.begin() + m_nDefectSize[i]);
                  m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin(), m_Formation.m_vecImage.begin() + m_nImageSize[i]);
                  m_FormationMap.m_vecCellRect.erase(m_FormationMap.m_vecCellRect.begin(), m_FormationMap.m_vecCellRect.begin() + m_nCellSize[i]);
                  m_nCellSize[i] = 0;
                  m_nDefectSize[i] = 0;
                  m_nImageSize[i] = 0;
               }
               else if (i != 0 && m_nDefectSize[i] == 0)
               {
               }
               else if (i != 0 && m_nDefectSize[i] > 0)
               {
                  if (m_Formation.m_vecDefects.size() == nDefectSize)
                  {
                     m_Formation.m_vecDefects.clear();
                     //m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin(), m_Formation.m_vecDefects.begin() + m_nDefectSize[i]);
                  }
//                   else
//                   {
//                      m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin() + nDefectSize-1, m_Formation.m_vecDefects.begin() + nDefectSize-1 + m_nDefectSize[i]);
//                   }
                  if (m_Formation.m_vecImage.size() == nImageSize)
                  {
                     m_Formation.m_vecImage.clear();
                     //m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin(), m_Formation.m_vecImage.begin() + m_nImageSize[i]);
                  }
//                   else
//                   {
//                      m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin() + nImageSize-1, m_Formation.m_vecImage.begin() + nImageSize-1 + m_nImageSize[i]);
//                   }
                  if (m_FormationMap.m_vecCellRect.size() == nCellSize)
                  {
                     m_FormationMap.m_vecCellRect.clear();
                     //m_FormationMap.m_vecCellRect.erase(m_FormationMap.m_vecCellRect.begin(), m_FormationMap.m_vecCellRect.begin() + m_nCellSize[i]);
                  }
//                   else
//                   {
//                      m_FormationMap.m_vecCellRect.erase(m_FormationMap.m_vecCellRect.begin() + nCellSize, m_FormationMap.m_vecCellRect.begin() + nCellSize + m_nCellSize[i]);
//                   }
                  int nCellCount = 0;
                  int nDefectCount = 0;
                  int nImageCount = 0;
/*                  int nCount = 0;*/
                  int nCellCount2 = m_nCellSize[i];
                  int nDefectCount2 = m_nDefectSize[i];
                  int nImageCount2 = m_nImageSize[i];
                  int nCellCount3 = 0;
                  int nDefectCount3 = 0;
                  int nImageCount3 = 0;
                  m_nCellSize[i] = 0;
                  m_nDefectSize[i] = 0;
                  m_nImageSize[i] = 0;
                  for (int k = 0; k < MAX_COUNT; k++)
                  {
//                      if (m_nCellSize[k] != 0)
//                      {
//                         nCount++;
//                      }
                     nCellCount = m_nCellSize[k];
                     nDefectCount = m_nDefectSize[k];
                     nImageCount = m_nImageSize[k];
                     if (k == 0)
                     {
                        nCellCount3 = 0;
                        nDefectCount3 = 0;
                        nImageCount3 = 0;
                     }
                     else
                     {
                        nCellCount3 += m_nCellSize[k];
                        nDefectCount3 += m_nDefectSize[k];
                        nImageCount3 += m_nImageSize[k];
                     }
                  }
                  m_Formation.m_vecDefects.clear();
                   for (int j = 0; j < nDefectSize - nDefectCount2; j++)
                  {
                     _akDefect *pDefectInfo = &m_Formation.m_vecTempDefects[j];
                     double dDefectPosX = pDefectInfo->m_nUMCenterAlignX / 1000.0;
                     double dDefectPosY = pDefectInfo->m_nUMCenterAlignY / 1000.0;
                     m_Formation.AddDefect(dDefectPosX, dDefectPosY);
                     m_Formation.m_vecDefects[j] = m_Formation.m_vecTempDefects[j];
                     //디펙 ì‹œìž‘ í¬ê¸° ë§Œí¼ë§Œ ë³µì‚¬ í•œë‹¤
                  }
                  if (m_nDefectSize[i + 1] != 0)
                  {
                     int nCount = m_Formation.m_vecDefects.size();
                     for (int j = 0; j < m_Formation.m_vecTempDefects.size() - nDefectSize; j++)
                     {
                        _akDefect *pDefectInfo = &m_Formation.m_vecTempDefects[nDefectSize + j];
                        double dDefectPosX = pDefectInfo->m_nUMCenterAlignX / 1000.0;
                        double dDefectPosY = pDefectInfo->m_nUMCenterAlignY / 1000.0;
                        m_Formation.AddDefect(dDefectPosX, dDefectPosY);
                        m_Formation.m_vecDefects[nCount + j] = m_Formation.m_vecTempDefects[nDefectSize +j];
                     }
                  }
                  m_Formation.m_vecImage.clear();
                  for (int j = 0; j < nImageSize - nImageCount2; j++)
                  {
                     m_Formation.AddDefectImage();
                     m_Formation.m_vecImage[j] = m_Formation.m_vecTempImage[j];
                     //디펙 ì‹œìž‘ í¬ê¸° ë§Œí¼ë§Œ ë³µì‚¬ í•œë‹¤
                  }
                  if (m_nImageSize[i + 1] != 0)
                  {
                     int nCount = m_Formation.m_vecImage.size();
                     for (int j = 0; j < m_Formation.m_vecTempImage.size() - nImageSize; j++)
                     {
                        m_Formation.AddDefectImage();
                        m_Formation.m_vecImage[nCount + j] = m_Formation.m_vecTempImage[nImageSize + j];
                     }
                  }
                  m_FormationMap.m_vecCellRect.clear();
                  for (int j = 0; j < nCellSize - nCellCount2; j++)
                  {
                     m_FormationMap.AddCell();
                     m_FormationMap.m_vecCellRect[j] = m_FormationMap.m_vecTempCellRect[j];
                     //디펙 ì‹œìž‘ í¬ê¸° ë§Œí¼ë§Œ ë³µì‚¬ í•œë‹¤
                  }
                  if (m_nCellSize[i + 1] != 0)
                  {
                     int nCount = m_FormationMap.m_vecCellRect.size();
                     for (int j = 0; j < m_FormationMap.m_vecTempCellRect.size() - nCellSize; j++)
                     {
                        m_FormationMap.AddCell();
                        m_FormationMap.m_vecCellRect[nCount + j] = m_FormationMap.m_vecTempCellRect[nCellSize + j];
                     }
                  }
               }
               m_nSelectFile[i] = 0;
//                for (int i = 0; i < MAX_COUNT + 1; i++)
//                {
//                   for (int iCol = 0; iCol < m_gridReviewList.GetColumnCount(); iCol++)
//                   {
//                      m_gridReviewList.SetItemState(m_nSelectFile[i], iCol, LVIS_SELECTED);
//                   }
//                }
//
//                m_gridReviewList.Invalidate();
//                int nSelect = i;
//                bool bMax = false;
//                for (nSelect; nSelect < MAX_COUNT; nSelect++)
//                {
//                   m_nSelectFile[nSelect] = m_nSelectFile[nSelect + 1];
//                   bMax = true;
//                }
//                if (bMax)
//                {
//                   m_nSelectFile[nSelect] = 0;
//                }
//                m_nDefectSize[i] = 0;
//                m_nImageSize[i] = 0;
/*               m_nCellSize[i] = 0;*/
//                for (j = 0; j < MAX_COUNT; j++)
//                {
//                   if (i <= j)
//                   {
//                      m_nCellSize[j] = m_nCellSize[j + 1];
//                   }
//                }
               AddVecCellSorting(0);
               AddVecDateSorting(0);
               m_gridGlassInfo.SetRowCount(m_Formation.m_vecGlassInfo.size() + 1);
               m_gridDefectInfo.SetRowCount(m_Formation.m_vecDefects.size() + 1);
               m_FormationMap.ReDraw(TRUE);
                return FALSE;
            }
         }
      }
   }
   if (m_Formation.m_vecGlassInfo.size() >= MAX_COUNT + 1) // 1 base
   {
      m_Formation.m_vecGlassInfo.erase(m_Formation.m_vecGlassInfo.begin());
      if (m_nDefectSize[0] != 0)
      {
         m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin(), m_Formation.m_vecDefects.begin() + m_nDefectSize[0]);
      }
      if (m_nImageSize[0] != 0)
      {
         m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin(), m_Formation.m_vecImage.begin() + m_nImageSize[0]);
      }
      if (m_nCellSize[0] != 0)
      {
         m_FormationMap.m_vecCellRect.erase(m_FormationMap.m_vecCellRect.begin(), m_FormationMap.m_vecCellRect.begin() + m_nCellSize[0]);
      }
   }
   return TRUE;
}
int CReveiwHistoryDlg::MultiInsert(int nSelectCount, int nDataCount)
{
   if (nSelectCount <= 0) return FALSE;
   //if (m_Formation.m_vecGlassInfo.size() > MAX_COUNT) return FALSE;
   if (m_Formation.m_vecGlassInfo.size() >= MAX_COUNT+1) //1base
   {
      m_Formation.m_vecGlassInfo.erase(m_Formation.m_vecGlassInfo.begin());
      if (m_nDefectSize[0] != 0)
      {
         m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin(), m_Formation.m_vecDefects.begin() + m_nDefectSize[0]);
      }
      if (m_nImageSize[0] != 0)
      {
         m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin(), m_Formation.m_vecImage.begin() + m_nImageSize[0]);
      }
      if (m_nCellSize[0] != 0)
      {
         m_FormationMap.m_vecCellRect.erase(m_FormationMap.m_vecCellRect.begin(), m_FormationMap.m_vecCellRect.begin() + m_nCellSize[0]);
      }
   }
   int nDefectSize = 0;
   int nImageSize = 0;
   int nCellSize = 0;
   for (int i = 0; i < MAX_COUNT; i++)
   {
      nDefectSize += m_nDefectSize[i];
      nImageSize += m_nImageSize[i];
      nCellSize += m_nCellSize[i];
      if (nSelectCount == m_nSelectFile[i])
      {
         for (int j = 0; j < m_Formation.m_vecGlassInfo.size(); j++)
         {
            _akGlassInfo* pGlassInfo = &m_Formation.m_vecGlassInfo[j];
            if (pGlassInfo->m_nGlassSelect == m_nSelectFile[i])
            {
               m_Formation.m_vecGlassInfo.erase(m_Formation.m_vecGlassInfo.begin() + j);
               if (i == 0)
               {
                  m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin(), m_Formation.m_vecDefects.begin() + m_nDefectSize[i]);
                  m_Formation.m_vecDefects.clear();
                  m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin(), m_Formation.m_vecImage.begin() + m_nImageSize[i]);
                  m_Formation.m_vecImage.clear();
                  m_FormationMap.m_vecCellRect.erase(m_FormationMap.m_vecCellRect.begin(), m_FormationMap.m_vecCellRect.begin() + m_nCellSize[i]);
                  if (m_bDefectAll == false && !m_chkSingle.GetCheck())
                  {
                     AddVecDataDefct2(nDataCount/*, nCount*/);
                  }
                  else if (m_bDefectAll == true && !m_chkSingle.GetCheck())
                  {
                     AddVecDataDefectAll2(nDataCount/*, nCount*/);
                  }
               }
               else if (i != 0 && m_nDefectSize[i] == 0)
               {
                  if (m_bDefectAll == false && !m_chkSingle.GetCheck())
                  {
                     AddVecDataDefct2(nDataCount/*, nCount*/);
                  }
                  else if (m_bDefectAll == true && !m_chkSingle.GetCheck())
                  {
                     AddVecDataDefectAll2(nDataCount/*, nCount*/);
                  }
               }
               else if (i != 0 && m_nDefectSize[i] > 0)
               {
                  if (m_Formation.m_vecDefects.size() == nDefectSize)
                  {
                     m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin(), m_Formation.m_vecDefects.begin() + m_nDefectSize[i]);
                  }
//                   else
//                   {
                  Sleep(1);
                     //n개 ê¹Œì§€ë§Œ ë³µì‚¬ í•œë‹¤. í´ë¦¬ì–´ í›„ ì—
                     m_Formation.m_vecDefects.clear();
                     for (int j = 0; j < nDefectSize-m_nDefectSize[i]; j++)
                     {
                        _akDefect *pDefectInfo = &m_Formation.m_vecTempDefects[j];
                        double dDefectPosX = pDefectInfo->m_nUMCenterAlignX / 1000.0;
                        double dDefectPosY = pDefectInfo->m_nUMCenterAlignY / 1000.0;
                        m_Formation.AddDefect(dDefectPosX, dDefectPosY);
                        m_Formation.m_vecDefects[j] = m_Formation.m_vecTempDefects[j];
                        //디펙 ì‹œìž‘ í¬ê¸° ë§Œí¼ë§Œ ë³µì‚¬ í•œë‹¤
                     }
                     //생성된 ë””펙을 ì¶”ê°€ í•œë‹¤
                     if (m_bDefectAll == false && !m_chkSingle.GetCheck())
                     {
                        AddVecDataDefct2(nDataCount/*, nCount*/);
                     }
                     else if (m_bDefectAll == true && !m_chkSingle.GetCheck())
                     {
                        AddVecDataDefectAll2(nDataCount/*, nCount*/);
                     }
//                      Sleep(1);
//
//                      //추가한 ë””펙 ë’¤ì— ë¶™ì—¬ ë„£ëŠ”ë‹¤
//                      if (m_nDefectSize[i + 1] != 0)
//                      {
//                         for (int j = 0; j < m_nDefectSize[i + 1]; j++)
//                         {
//                            int nCount = m_nDefectSize[i - 1];
//                            _akDefect *pDefectInfo = &m_Formation.m_vecTempDefects[nDefectSize + j];
//                            double dDefectPosX = pDefectInfo->m_nUMCenterAlignX / 1000.0;
//                            double dDefectPosY = pDefectInfo->m_nUMCenterAlignY / 1000.0;
//
//                            m_Formation.AddDefect(dDefectPosX, dDefectPosY);
//                            m_Formation.m_vecDefects[nCount + j] = m_Formation.m_vecTempDefects[nDefectSize + j];
//                         }
//                      }
                     Sleep(1);
                     m_Formation.m_vecImage.clear();
                     for (int j = 0; j < nImageSize - m_nImageSize[i]; j++)
                     {
                        m_Formation.AddDefectImage();
                        m_Formation.m_vecImage[j] = m_Formation.m_vecTempImage[j];
                        //디펙 ì‹œìž‘ í¬ê¸° ë§Œí¼ë§Œ ë³µì‚¬ í•œë‹¤
                     }
                     if (m_nImageSize[i + 1] != 0)
                     {
                        int nSize = m_Formation.m_vecTempImage.size() - m_Formation.m_vecImage.size();
                        //시작 ë¶€í„° ëê¹Œì§€ ë³µì‚¬ë¥¼ í•œë‹¤
                        for (int j = 0; j < nSize; j++)
                        {
                           int nCount = m_nImageSize[i - 1];
                           m_Formation.AddDefectImage();
                           m_Formation.m_vecImage[nCount + j] = m_Formation.m_vecTempImage[nCount + j];
                        }
                     }
                     Sleep(1);
                       m_FormationMap.m_vecCellRect.clear();
                     for (int j = 0; j < nCellSize - m_nCellSize[i]; j++)
                     {
                        m_FormationMap.AddCell();
                        m_FormationMap.m_vecCellRect[j] = m_FormationMap.m_vecTempCellRect[j];
                        //디펙 ì‹œìž‘ í¬ê¸° ë§Œí¼ë§Œ ë³µì‚¬ í•œë‹¤
                     }
                     if (m_nCellSize[i + 1] != 0)
                     {
                        int nSize = m_FormationMap.m_vecTempCellRect.size() - m_FormationMap.m_vecCellRect.size();
                        for (int j = 0; j < nSize; j++)
                        {
                           int nCount = m_nCellSize[i - 1];
                           m_FormationMap.AddCell();
                           m_FormationMap.m_vecCellRect[nCount + j] = m_FormationMap.m_vecTempCellRect[nCount + j];
                           //m_FormationMap.m_vecCellRect[nCount + j] = m_FormationMap.m_vecTempCellRect[nCellSize + j];
                        }
                     }
                      //m_Formation.m_vecDefects.erase(m_Formation.m_vecDefects.begin() + nDefectSize, m_Formation.m_vecDefects.begin() + nDefectSize + m_nDefectSize[i]);
//                   if (m_Formation.m_vecImage.size() == nImageSize)
//                   {
//                      m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin(), m_Formation.m_vecImage.begin() + m_nImageSize[i]);
//                   }
//                   else
//                   {
//                      m_Formation.m_vecImage.erase(m_Formation.m_vecImage.begin() + nImageSize, m_Formation.m_vecImage.begin() + nImageSize + m_nImageSize[i]);
//                   }
               }
               //m_nSelectFile[i] = 0;
               m_nDefectSize[i] = 0;
               m_nImageSize[i] = 0;
               m_nCellSize[i] = 0;
//                for (j = 0; j < MAX_COUNT; j++)
//                {
//                   if (i <= j)
//                   {
//                      m_nCellSize[j] = m_nCellSize[j + 1];
//                   }
//                }
               if (m_Formation.m_vecGlassInfo.size() > 0)
               {
                  m_gridGlassInfo.SetRowCount(m_Formation.m_vecGlassInfo.size() + 1);
                  m_gridDefectInfo.SetRowCount(m_Formation.m_vecDefects.size() + 1);
                  return i;
               }
               else
               {
                  m_gridGlassInfo.SetRowCount(2);
                  m_gridDefectInfo.SetRowCount(2);
                  return i;
               }
               return i;
            }
         }
      }
   }
//    if (m_bDefectAll == false && !m_chkSingle.GetCheck())
//    {
//       AddVecDataDefct2(nDataCount/*, nCount*/);
//    }
//    else if (m_bDefectAll == true && !m_chkSingle.GetCheck())
//    {
//       AddVecDataDefectAll2(nDataCount/*, nCount*/);
//    }
   return -1;
}
void CReveiwHistoryDlg::InitSelectGlass(int nSelectCount)
{
   int nCountMax = MAX_COUNT+1;
   bool bMax = false;
   for (int i = 0; i < MAX_COUNT+1; i++)
   {
      if (nSelectCount != m_nSelectFile[i] && m_nSelectFile[i] == 0)
      {
         if (!GetCheckFileLoad(nSelectCount)) return;
         m_nSelectFile[i] = nSelectCount;
         bMax = true;
         break;
      }
   }
   if (!bMax)
   {
      for (int j = 0; j < MAX_COUNT; j++)
      {
         if (!GetCheckFileLoad(nSelectCount)) return;
         m_nSelectFile[j] = m_nSelectFile[j + 1];
      }
      m_nSelectFile[MAX_COUNT] = nSelectCount;
   }
}
void CReveiwHistoryDlg::AddVecDataImage(int nDataCount)
{
   for (int i = 0; i < nDataCount; i++)
   {
      _grmDefectData* pDefect = m_Server.GetDefectData(i);
      _grmGlassData* pGlass = m_Server.GetGlassData();
      CString strTemp;
      int nInfoCount = 0;
      CString strReviewImageName;
      strReviewImageName = pDefect->m_ReviewDefect.m_strRevImageName;
      if (strReviewImageName == "" || strReviewImageName == "*")
      {
         continue;
      }
      else
      {
         m_Formation.AddDefectImage();
         SetImageCount();
         _akReviewList* pImageInfo = &m_Formation.m_vecImage[m_Formation.m_vecImage.size() - 1];
         pImageInfo->m_nDefectID = pDefect->m_nDefectID;
         strcpy(pImageInfo->m_strAoiImageName, pDefect->m_strAoiImageName);
         pImageInfo->m_nDefectIdx = pDefect->m_nDefectIdx;
         pImageInfo->m_strReviewImageName = strReviewImageName;
         strcpy(pImageInfo->m_strAoiImagePath, pDefect->m_strAoiImagePath);
         strcpy(pImageInfo->m_strReviewImagePath, pDefect->m_ReviewDefect.m_strRevImagePath);
         strcpy(pImageInfo->m_strAlignFirst, pGlass->m_strAlignFirst);
         strcpy(pImageInfo->m_strAlignSecond, pGlass->m_strAlignSecond);
         pImageInfo->m_strGlassID = pGlass->m_strGlassID;
      }
   }
}
void CReveiwHistoryDlg::AddVecDataDefct(int nDataCount)
{
   for (int i = 0; i < nDataCount; i++)
   {
      _grmDefectData* pDefect = m_Server.GetDefectData(i);
      int nInfoCount = 0;
      CString strReviewImageName;
      strReviewImageName = pDefect->m_ReviewDefect.m_strRevImageName;
      if (strReviewImageName == "" || strReviewImageName == "*")
      {
         continue;
      }
      else
      {
         double dDefectPosX = pDefect->m_nUMCenterAlignX / 1000.0;
         double dDefectPosY = pDefect->m_nUMCenterAlignY / 1000.0;
         m_Formation.AddDefect(dDefectPosX, dDefectPosY);
         SetDefectCount();
         _akDefect* pDefectInfo = &m_Formation.m_vecDefects[m_Formation.m_vecDefects.size() - 1];
         pDefectInfo->m_nDefectID = pDefect->m_nDefectID;
         pDefectInfo->m_sDefectLoc = pDefect->m_sDefectLoc;
         strcpy(pDefectInfo->m_strDefectType, pDefect->m_strDefectType);
         strcpy(pDefectInfo->m_strDefectCode, pDefect->m_strDefectCode);
         pDefectInfo->m_DefectType = pDefect->m_DefectType;
         pDefectInfo->m_DefectSubType = pDefect->m_DefectSubType;
         pDefectInfo->m_nDefectRScale = pDefect->m_nDefectRScale;
         pDefectInfo->m_nUMSizeX = pDefect->m_nUMSizeX;
         pDefectInfo->m_nUMSizeY = pDefect->m_nUMSizeY;
         pDefectInfo->m_nUMSize = pDefect->m_nUMSize;
         memcpy(pDefectInfo->m_sZonePixelCount, pDefect->m_sZonePixelCount, sizeof(pDefect->m_sZonePixelCount));
         pDefectInfo->m_nLevelSrcMax = pDefect->m_nLevelSrcMax;
         pDefectInfo->m_nLevelSrcMin = pDefect->m_nLevelSrcMin;
         pDefectInfo->m_nLevelSrcAvg = pDefect->m_nLevelSrcAvg;
         pDefectInfo->m_sDefectPeak = pDefect->m_sDefectPeak;
         strcpy(pDefectInfo->m_strStackFirst, pDefect->m_strStackFirst);
         pDefectInfo->m_nCameraID = pDefect->m_nCameraID;
         pDefectInfo->m_nScanIdx = pDefect->m_nScanIdx;
         pDefectInfo->m_nLevelRefMax = pDefect->m_nLevelRefMax;
         pDefectInfo->m_nLevelRefMin = pDefect->m_nLevelRefMin;
         pDefectInfo->m_nLevelRefAvg = pDefect->m_nLevelRefAvg;
         pDefectInfo->m_nUMCenterAlignX = pDefect->m_nUMCenterAlignX;
         pDefectInfo->m_nUMCenterAlignY = pDefect->m_nUMCenterAlignY;
         pDefectInfo->m_nUMCellX = pDefect->m_nUMCellX;
         pDefectInfo->m_nUMCellY = pDefect->m_nUMCellY;
         pDefectInfo->m_nScratchRatio = pDefect->m_nScratchRatio;
         pDefectInfo->m_nDensity = pDefect->m_nDensity;
         pDefectInfo->m_bMergeState = pDefect->m_bMergeState;
         pDefectInfo->m_nShotIdx = pDefect->m_ReviewDefect.m_nShotIndex;
         pDefectInfo->m_nModelIdx = pDefect->m_ReviewDefect.m_nModuleIndex;
         for (int j = 0; j < nInfoCount; j++) pDefectInfo->m_strInfos[j].Trim();
      }
   }
}
void CReveiwHistoryDlg::AddVecDataDefectAll(int nDataCount)
{
   for (int i = 0; i < nDataCount; i++)
   {
      _grmDefectData* pDefect = m_Server.GetDefectData(i);
      int nInfoCount = 0;
      double dDefectPosX = pDefect->m_nUMCenterAlignX / 1000.0;
      double dDefectPosY = pDefect->m_nUMCenterAlignY / 1000.0;
      m_Formation.AddDefect(dDefectPosX, dDefectPosY);
      SetDefectCount();
      _akDefect* pDefectInfo = &m_Formation.m_vecDefects[m_Formation.m_vecDefects.size() - 1];
      pDefectInfo->m_nDefectID = pDefect->m_nDefectID;
      pDefectInfo->m_sDefectLoc = pDefect->m_sDefectLoc;
      strcpy(pDefectInfo->m_strDefectType, pDefect->m_strDefectType);
      strcpy(pDefectInfo->m_strDefectCode, pDefect->m_strDefectCode);
      pDefectInfo->m_DefectType = pDefect->m_DefectType;
      pDefectInfo->m_DefectSubType = pDefect->m_DefectSubType;
      pDefectInfo->m_nDefectRScale = pDefect->m_nDefectRScale;
      pDefectInfo->m_nUMSizeX = pDefect->m_nUMSizeX;
      pDefectInfo->m_nUMSizeY = pDefect->m_nUMSizeY;
      pDefectInfo->m_nUMSize = pDefect->m_nUMSize;
      memcpy(pDefectInfo->m_sZonePixelCount, pDefect->m_sZonePixelCount, sizeof(pDefect->m_sZonePixelCount));
      pDefectInfo->m_nLevelSrcMax = pDefect->m_nLevelSrcMax;
      pDefectInfo->m_nLevelSrcMin = pDefect->m_nLevelSrcMin;
      pDefectInfo->m_nLevelSrcAvg = pDefect->m_nLevelSrcAvg;
      pDefectInfo->m_sDefectPeak = pDefect->m_sDefectPeak;
      strcpy(pDefectInfo->m_strStackFirst, pDefect->m_strStackFirst);
      pDefectInfo->m_nCameraID = pDefect->m_nCameraID;
      pDefectInfo->m_nScanIdx = pDefect->m_nScanIdx;
      pDefectInfo->m_nLevelRefMax = pDefect->m_nLevelRefMax;
      pDefectInfo->m_nLevelRefMin = pDefect->m_nLevelRefMin;
      pDefectInfo->m_nLevelRefAvg = pDefect->m_nLevelRefAvg;
      pDefectInfo->m_nUMCenterAlignX = pDefect->m_nUMCenterAlignX;
      pDefectInfo->m_nUMCenterAlignY = pDefect->m_nUMCenterAlignY;
      pDefectInfo->m_nUMCellX = pDefect->m_nUMCellX;
      pDefectInfo->m_nUMCellY = pDefect->m_nUMCellY;
      pDefectInfo->m_nScratchRatio = pDefect->m_nScratchRatio;
      pDefectInfo->m_nDensity = pDefect->m_nDensity;
      pDefectInfo->m_bMergeState = pDefect->m_bMergeState;
      CString strReviewImageName;
      strReviewImageName = pDefect->m_ReviewDefect.m_strRevImageName;
      if (strReviewImageName == "" || strReviewImageName == "*")
      {
         pDefectInfo->m_nShotIdx = -1;
         pDefectInfo->m_nModelIdx = -1;
      }
      else
      {
         pDefectInfo->m_nShotIdx = pDefect->m_ReviewDefect.m_nShotIndex;
         pDefectInfo->m_nModelIdx = pDefect->m_ReviewDefect.m_nModuleIndex;
      }
      for (int j = 0; j < nInfoCount; j++) pDefectInfo->m_strInfos[j].Trim();
   }
}
void CReveiwHistoryDlg::AddVecDataDefct2(int nDataCount/*, int nRawCount*/)
{
//   int nCount = MultiInsert(m_nCount, nDataCount);
//    if(nCount < 0) return;
//
   for (int i = 0; i < nDataCount; i++)
   {
      _grmDefectData* pDefect = m_Server.GetDefectData(i);
      int nInfoCount = 0;
      CString strReviewImageName;
      strReviewImageName = pDefect->m_ReviewDefect.m_strRevImageName;
      if (strReviewImageName == "" || strReviewImageName == "*")
      {
         continue;
      }
      else
      {
         double dDefectPosX = pDefect->m_nUMCenterAlignX / 1000.0;
         double dDefectPosY = pDefect->m_nUMCenterAlignY / 1000.0;
         m_Formation.AddDefect(dDefectPosX, dDefectPosY);
         SetDefectCount();
         _akDefect* pDefectInfo = NULL;
//          if (nCount == 0)
//          {
            pDefectInfo = &m_Formation.m_vecDefects[m_Formation.m_vecDefects.size() - 1];
//          }
//          else
//          {
//             //중간에 ê°’ ì‚½ìž…
//             pDefectInfo = &m_Formation.m_vecDefects[m_Formation.m_vecDefects.size() - 1];
//             //pDefectInfo = &m_Formation.m_vecDefects[nCount + i];
//          }
         pDefectInfo->m_nDefectID = pDefect->m_nDefectID;
         pDefectInfo->m_sDefectLoc = pDefect->m_sDefectLoc;
         strcpy(pDefectInfo->m_strDefectType, pDefect->m_strDefectType);
         strcpy(pDefectInfo->m_strDefectCode, pDefect->m_strDefectCode);
         pDefectInfo->m_DefectType = pDefect->m_DefectType;
         pDefectInfo->m_DefectSubType = pDefect->m_DefectSubType;
         pDefectInfo->m_nDefectRScale = pDefect->m_nDefectRScale;
         pDefectInfo->m_nUMSizeX = pDefect->m_nUMSizeX;
         pDefectInfo->m_nUMSizeY = pDefect->m_nUMSizeY;
         pDefectInfo->m_nUMSize = pDefect->m_nUMSize;
         memcpy(pDefectInfo->m_sZonePixelCount, pDefect->m_sZonePixelCount, sizeof(pDefect->m_sZonePixelCount));
         pDefectInfo->m_nLevelSrcMax = pDefect->m_nLevelSrcMax;
         pDefectInfo->m_nLevelSrcMin = pDefect->m_nLevelSrcMin;
         pDefectInfo->m_nLevelSrcAvg = pDefect->m_nLevelSrcAvg;
         pDefectInfo->m_sDefectPeak = pDefect->m_sDefectPeak;
         strcpy(pDefectInfo->m_strStackFirst, pDefect->m_strStackFirst);
         pDefectInfo->m_nCameraID = pDefect->m_nCameraID;
         pDefectInfo->m_nScanIdx = pDefect->m_nScanIdx;
         pDefectInfo->m_nLevelRefMax = pDefect->m_nLevelRefMax;
         pDefectInfo->m_nLevelRefMin = pDefect->m_nLevelRefMin;
         pDefectInfo->m_nLevelRefAvg = pDefect->m_nLevelRefAvg;
         pDefectInfo->m_nUMCenterAlignX = pDefect->m_nUMCenterAlignX;
         pDefectInfo->m_nUMCenterAlignY = pDefect->m_nUMCenterAlignY;
         pDefectInfo->m_nUMCellX = pDefect->m_nUMCellX;
         pDefectInfo->m_nUMCellY = pDefect->m_nUMCellY;
         pDefectInfo->m_nScratchRatio = pDefect->m_nScratchRatio;
         pDefectInfo->m_nDensity = pDefect->m_nDensity;
         pDefectInfo->m_bMergeState = pDefect->m_bMergeState;
         for (int j = 0; j < nInfoCount; j++) pDefectInfo->m_strInfos[j].Trim();
      }
   }
}
void CReveiwHistoryDlg::AddVecDataDefectAll2(int nDataCount/*, int nRawCount*/)
{
   for (int i = 0; i < nDataCount; i++)
   {
      _grmDefectData* pDefect = m_Server.GetDefectData(i);
      int nInfoCount = 0;
      CString strReviewImageName;
      strReviewImageName = pDefect->m_ReviewDefect.m_strRevImageName;
      double dDefectPosX = pDefect->m_nUMCenterAlignX / 1000.0;
      double dDefectPosY = pDefect->m_nUMCenterAlignY / 1000.0;
      m_Formation.AddDefect(dDefectPosX, dDefectPosY);
      SetDefectCount();
      _akDefect* pDefectInfo = NULL;
      pDefectInfo = &m_Formation.m_vecDefects[m_Formation.m_vecDefects.size() - 1];
      pDefectInfo->m_nDefectID = pDefect->m_nDefectID;
      pDefectInfo->m_sDefectLoc = pDefect->m_sDefectLoc;
      strcpy(pDefectInfo->m_strDefectType, pDefect->m_strDefectType);
      strcpy(pDefectInfo->m_strDefectCode, pDefect->m_strDefectCode);
      pDefectInfo->m_DefectType = pDefect->m_DefectType;
      pDefectInfo->m_DefectSubType = pDefect->m_DefectSubType;
      pDefectInfo->m_nDefectRScale = pDefect->m_nDefectRScale;
      pDefectInfo->m_nUMSizeX = pDefect->m_nUMSizeX;
      pDefectInfo->m_nUMSizeY = pDefect->m_nUMSizeY;
      pDefectInfo->m_nUMSize = pDefect->m_nUMSize;
      memcpy(pDefectInfo->m_sZonePixelCount, pDefect->m_sZonePixelCount, sizeof(pDefect->m_sZonePixelCount));
      pDefectInfo->m_nLevelSrcMax = pDefect->m_nLevelSrcMax;
      pDefectInfo->m_nLevelSrcMin = pDefect->m_nLevelSrcMin;
      pDefectInfo->m_nLevelSrcAvg = pDefect->m_nLevelSrcAvg;
      pDefectInfo->m_sDefectPeak = pDefect->m_sDefectPeak;
      strcpy(pDefectInfo->m_strStackFirst, pDefect->m_strStackFirst);
      pDefectInfo->m_nCameraID = pDefect->m_nCameraID;
      pDefectInfo->m_nScanIdx = pDefect->m_nScanIdx;
      pDefectInfo->m_nLevelRefMax = pDefect->m_nLevelRefMax;
      pDefectInfo->m_nLevelRefMin = pDefect->m_nLevelRefMin;
      pDefectInfo->m_nLevelRefAvg = pDefect->m_nLevelRefAvg;
      pDefectInfo->m_nUMCenterAlignX = pDefect->m_nUMCenterAlignX;
      pDefectInfo->m_nUMCenterAlignY = pDefect->m_nUMCenterAlignY;
      pDefectInfo->m_nUMCellX = pDefect->m_nUMCellX;
      pDefectInfo->m_nUMCellY = pDefect->m_nUMCellY;
      pDefectInfo->m_nScratchRatio = pDefect->m_nScratchRatio;
      pDefectInfo->m_nDensity = pDefect->m_nDensity;
      pDefectInfo->m_bMergeState = pDefect->m_bMergeState;
      for (int j = 0; j < nInfoCount; j++) pDefectInfo->m_strInfos[j].Trim();
   }
//    for (int i = 0; i < nDataCount; i++)
//    {
//       _grmDefectData* pDefect = m_Server.GetDefectData(i);
//       int nInfoCount = 0;
//
//       double dDefectPosX = pDefect->m_nUMCenterAlignX / 1000.0;
//       double dDefectPosY = pDefect->m_nUMCenterAlignY / 1000.0;
//
//       m_Formation.AddDefect(dDefectPosX, dDefectPosY);
//       SetDefectCount();
//
//       _akDefect* pDefectInfo = NULL;
//
// //       if (nCount == 0)
// //       {
//          pDefectInfo = &m_Formation.m_vecDefects[m_Formation.m_vecDefects.size() - 1];
// //       }
// //       else
// //       {
// //          pDefectInfo = &m_Formation.m_vecDefects[nCount + i];
// //       }
//
//       //m_Formation.m_vecDefects.insert(m_Formation.m_vecDefects.begin() + 1400, pDefect->m_nDefectID);
//
//       pDefectInfo->m_nDefectID = pDefect->m_nDefectID;
//       pDefectInfo->m_sDefectLoc = pDefect->m_sDefectLoc;
//       strcpy(pDefectInfo->m_strDefectType, pDefect->m_strDefectType);
//       strcpy(pDefectInfo->m_strDefectCode, pDefect->m_strDefectCode);
//       pDefectInfo->m_DefectType = pDefect->m_DefectType;
//       pDefectInfo->m_DefectSubType = pDefect->m_DefectSubType;
//       pDefectInfo->m_nDefectRScale = pDefect->m_nDefectRScale;
//       pDefectInfo->m_nUMSizeX = pDefect->m_nUMSizeX;
//       pDefectInfo->m_nUMSizeY = pDefect->m_nUMSizeY;
//       pDefectInfo->m_nUMSize = pDefect->m_nUMSize;
//       memcpy(pDefectInfo->m_sZonePixelCount, pDefect->m_sZonePixelCount, sizeof(pDefect->m_sZonePixelCount));
//       pDefectInfo->m_nLevelSrcMax = pDefect->m_nLevelSrcMax;
//       pDefectInfo->m_nLevelSrcMin = pDefect->m_nLevelSrcMin;
//       pDefectInfo->m_nLevelSrcAvg = pDefect->m_nLevelSrcAvg;
//       pDefectInfo->m_sDefectPeak = pDefect->m_sDefectPeak;
//       strcpy(pDefectInfo->m_strStackFirst, pDefect->m_strStackFirst);
//       pDefectInfo->m_nCameraID = pDefect->m_nCameraID;
//       pDefectInfo->m_nScanIdx = pDefect->m_nScanIdx;
//       pDefectInfo->m_nLevelRefMax = pDefect->m_nLevelRefMax;
//       pDefectInfo->m_nLevelRefMin = pDefect->m_nLevelRefMin;
//       pDefectInfo->m_nLevelRefAvg = pDefect->m_nLevelRefAvg;
//       pDefectInfo->m_nUMCenterAlignX = pDefect->m_nUMCenterAlignX;
//       pDefectInfo->m_nUMCenterAlignY = pDefect->m_nUMCenterAlignY;
//       pDefectInfo->m_nUMCellX = pDefect->m_nUMCellX;
//       pDefectInfo->m_nUMCellY = pDefect->m_nUMCellY;
//       pDefectInfo->m_nScratchRatio = pDefect->m_nScratchRatio;
//       pDefectInfo->m_nDensity = pDefect->m_nDensity;
//       pDefectInfo->m_bMergeState = pDefect->m_bMergeState;
//
//       for (int j = 0; j < nInfoCount; j++) pDefectInfo->m_strInfos[j].Trim();
//    }
}
void CReveiwHistoryDlg::AddVecGlassData(int nCount)
{
   m_Formation.AddGlassInfo();
   _grmGlassData* pGlass = m_Server.GetGlassData();
   _akGlassInfo* pGlassInfo = &m_Formation.m_vecGlassInfo[m_Formation.m_vecGlassInfo.size() - 1];
   pGlassInfo->m_nGlassSelect = nCount;
   pGlassInfo->m_strPPID = pGlass->m_strPPID;
   pGlassInfo->m_strGlassID = pGlass->m_strGlassID;
   pGlassInfo->m_nDefectNum = pGlass->m_nDefectNum;
   pGlassInfo->m_nReviewNum = GetImageCount();
   pGlassInfo->m_strGlassJudge = pGlass->m_strGlassJudge;
   pGlassInfo->m_strLotID = pGlass->m_strLotID;
   pGlassInfo->m_strSLotID = pGlass->m_strSLotID;
   pGlassInfo->m_nSlot_No = pGlass->m_nSlot_No;
   pGlassInfo->m_nCellNum = pGlass->m_nCellNum;
   pGlassInfo->m_nGlassSizeHeight = pGlass->m_nGlassSizeHeight;
   pGlassInfo->m_nGlassSizeWidth = pGlass->m_nGlassSizeWidth;
}
void CReveiwHistoryDlg::AddVecCellData(int nCellCount)
{
   for (int i = 0; i < nCellCount; i++)
   {
      SetCellCount();
      CakRectd rectCell;
      _grmCellData* pCellData = m_Server.GetCellData(i);
      rectCell.left = pCellData->m_rectCellLeft / 1000.0;
      rectCell.top = pCellData->m_rectCellTop / 1000.0;
      rectCell.right = pCellData->m_rectCellRight / 1000.0;
      rectCell.bottom = pCellData->m_rectCellBottom / 1000.0;
      m_FormationMap.m_vecCellRect.push_back(rectCell);
   }
}
void CReveiwHistoryDlg::SortListDefect(int nCol)
{
   if (nCol == 0)
      return;
/*   if (m_pDefectFormation == NULL) return;*/
    m_bAsending = !m_bAsending;
   _akDefect         *pDefect;
   std::vector< std::pair<CString, _akDefect*> > vecString;
   std::vector< std::pair<double, _akDefect*> > vecValue;
   CString strValue;
   double dValue;
   short sValue[16];
   for (int i = 0; i < m_Formation.m_vecTempDefects.size(); i++)
   {
      pDefect = &m_Formation.m_vecTempDefects[i];
      switch (nCol)
      {
      case 1: dValue = pDefect->m_nDefectID; break;
      case 2:   dValue = pDefect->m_sDefectLoc; break;
      case 3:   strValue = pDefect->m_strDefectType; break;
      case 4: strValue = pDefect->m_strDefectCode; break;
      case 5:   dValue = pDefect->m_DefectType; break;
      case 6:   dValue = pDefect->m_DefectSubType; break;
      case 7:   dValue = pDefect->m_nDefectRScale; break;
      case 8:   dValue = pDefect->m_nUMSizeX; break;
      case 9:   dValue = pDefect->m_nUMSizeY; break;
      case 10:   dValue = pDefect->m_nUMSize; break;
      //case 11:   memcpy(sValue, pDefect->m_sZonePixelCount, sizeof(pDefect->m_sZonePixelCount)); break;
      case 12:   dValue = pDefect->m_nLevelSrcMax; break;
      case 13:   dValue = pDefect->m_nLevelSrcMin; break;
      case 14:   dValue = pDefect->m_nLevelSrcAvg; break;
      case 15:   dValue = pDefect->m_sDefectPeak; break;
      case 16:   strValue = pDefect->m_strStackFirst; break;
      case 17:   dValue = pDefect->m_nCameraID; break;
      case 18:   dValue = pDefect->m_nScanIdx; break;
      case 19:   dValue = pDefect->m_nLevelRefMax; break;
      case 20:   dValue = pDefect->m_nLevelRefMin; break;
      case 21:   dValue = pDefect->m_nLevelRefAvg; break;
      case 22:   dValue = pDefect->m_nUMCenterAlignX; break;
      case 23:   dValue = pDefect->m_nUMCenterAlignY; break;
      case 24:   dValue = pDefect->m_nUMCellX; break;
      case 25:   dValue = pDefect->m_nUMCellY; break;
      case 26:   dValue = pDefect->m_nScratchRatio; break;
      case 27:   dValue = pDefect->m_nDensity; break;
      case 28:   dValue = pDefect->m_bMergeState; break;
      }
      if (strValue.IsEmpty() == FALSE) vecString.push_back(std::make_pair(strValue, pDefect));
      else vecValue.push_back(std::make_pair(dValue, pDefect));
   }
   if (!vecString.empty())
   {
      if (m_bAsending == TRUE) //오름 ì°¨ìˆœ
         std::sort(vecString.begin(), vecString.end(), std::greater< std::pair<CString, _akDefect*> >());
      else //내림 ì°¨ìˆœ
         std::sort(vecString.begin(), vecString.end(), std::less< std::pair<CString, _akDefect*> >());
      m_Formation.m_vecDefects.clear();
      std::vector< std::pair<CString, _akDefect*> >::iterator itVec;
      for (itVec = vecString.begin(); itVec != vecString.end(); ++itVec)
      {
         m_Formation.m_vecDefects.push_back(*itVec->second);
      }
   }
   else//if (!vecString.empty())
   {
      if (m_bAsending == TRUE)
         std::sort(vecValue.begin(), vecValue.end(), std::greater< std::pair<double, _akDefect*> >());
      else
         std::sort(vecValue.begin(), vecValue.end(), std::less< std::pair<double, _akDefect*> >());
      m_Formation.m_vecDefects.clear();
      std::vector< std::pair<double, _akDefect*> >::iterator itVec;
      for (itVec = vecValue.begin(); itVec != vecValue.end(); ++itVec)
      {
         m_Formation.m_vecDefects.push_back(*itVec->second);
      }
   }
}
void CReveiwHistoryDlg::AddVecDateSorting(int nDataCount)
{
   m_Formation.m_vecTempDefects.clear();
   for (int i = 0; i < m_Formation.m_vecDefects.size(); i++)
   {
      _akDefect* pDefect = &m_Formation.m_vecDefects[i];
      double dDefectPosX = pDefect->m_nUMCenterAlignX / 1000.0;
      double dDefectPosY = pDefect->m_nUMCenterAlignY / 1000.0;
      m_Formation.AddDefectTemp(dDefectPosX, dDefectPosY);
      _akDefect* pDefectInfo = &m_Formation.m_vecTempDefects[i];
      pDefectInfo->m_nDefectID = pDefect->m_nDefectID;
      pDefectInfo->m_sDefectLoc = pDefect->m_sDefectLoc;
      strcpy(pDefectInfo->m_strDefectType, pDefect->m_strDefectType);
      strcpy(pDefectInfo->m_strDefectCode, pDefect->m_strDefectCode);
      pDefectInfo->m_DefectType = pDefect->m_DefectType;
      pDefectInfo->m_DefectSubType = pDefect->m_DefectSubType;
      pDefectInfo->m_nDefectRScale = pDefect->m_nDefectRScale;
      pDefectInfo->m_nUMSizeX = pDefect->m_nUMSizeX;
      pDefectInfo->m_nUMSizeY = pDefect->m_nUMSizeY;
      pDefectInfo->m_nUMSize = pDefect->m_nUMSize;
      memcpy(pDefectInfo->m_sZonePixelCount, pDefect->m_sZonePixelCount, sizeof(pDefect->m_sZonePixelCount));
      pDefectInfo->m_nLevelSrcMax = pDefect->m_nLevelSrcMax;
      pDefectInfo->m_nLevelSrcMin = pDefect->m_nLevelSrcMin;
      pDefectInfo->m_nLevelSrcAvg = pDefect->m_nLevelSrcAvg;
      pDefectInfo->m_sDefectPeak = pDefect->m_sDefectPeak;
      strcpy(pDefectInfo->m_strStackFirst, pDefect->m_strStackFirst);
      pDefectInfo->m_nCameraID = pDefect->m_nCameraID;
      pDefectInfo->m_nScanIdx = pDefect->m_nScanIdx;
      pDefectInfo->m_nLevelRefMax = pDefect->m_nLevelRefMax;
      pDefectInfo->m_nLevelRefMin = pDefect->m_nLevelRefMin;
      pDefectInfo->m_nLevelRefAvg = pDefect->m_nLevelRefAvg;
      pDefectInfo->m_nUMCenterAlignX = pDefect->m_nUMCenterAlignX;
      pDefectInfo->m_nUMCenterAlignY = pDefect->m_nUMCenterAlignY;
      pDefectInfo->m_nUMCellX = pDefect->m_nUMCellX;
      pDefectInfo->m_nUMCellY = pDefect->m_nUMCellY;
      pDefectInfo->m_nScratchRatio = pDefect->m_nScratchRatio;
      pDefectInfo->m_nDensity = pDefect->m_nDensity;
      pDefectInfo->m_bMergeState = pDefect->m_bMergeState;
   }
}
void CReveiwHistoryDlg::AddVecImageSorting(int nDataCount)
{
   m_Formation.m_vecTempImage.clear();
   for (int i = 0; i < m_Formation.m_vecImage.size(); i++)
   {
      _akReviewList* pDefect = &m_Formation.m_vecImage[i];
      m_Formation.AddDefectImageTemp();
      _akReviewList* pImageInfo = &m_Formation.m_vecTempImage[i];
      pImageInfo->m_nDefectID = pDefect->m_nDefectID;
      strcpy(pImageInfo->m_strAoiImageName, pDefect->m_strAoiImageName);
      pImageInfo->m_nDefectIdx = pDefect->m_nDefectIdx;
      pImageInfo->m_strReviewImageName = pDefect->m_strReviewImageName;
      strcpy(pImageInfo->m_strAoiImagePath, pDefect->m_strAoiImagePath);
      strcpy(pImageInfo->m_strReviewImagePath, pDefect->m_strReviewImagePath);
      strcpy(pImageInfo->m_strAlignFirst, pDefect->m_strAlignFirst);
      strcpy(pImageInfo->m_strAlignSecond, pDefect->m_strAlignSecond);
   }
}
void CReveiwHistoryDlg::AddVecCellSorting(int nCellCount)
{
   m_FormationMap.m_vecTempCellRect.clear();
   for (int i = 0; i < m_FormationMap.m_vecCellRect.size(); i++)
   {
      m_FormationMap.AddCellData();
      m_FormationMap.m_vecTempCellRect[i] = m_FormationMap.m_vecCellRect[i];
   }
}
void CReveiwHistoryDlg::SelectCell(int nDataCount)
{
   m_FormationMap.m_vecCellRect.clear();
   if (nDataCount < 1) return;
   int nCellCount = 0;
   int nCount = 0;
   int nCount2 = 0;
   int nCount3 = 0;
   if (nCount == nDataCount) return;
   if (m_Formation.m_vecGlassInfo.size() == 0) return;
   _akGlassInfo* pGlass2 = &m_Formation.m_vecGlassInfo[nDataCount-1];
   nCount2 = pGlass2->m_nCellNum;
   for (int i = 0; i < nDataCount; i++)
   {
      if (i == 0)
      {
         nCount3 = 0;
      }
      else
      {
         _akGlassInfo* pGlass = &m_Formation.m_vecGlassInfo[i-1];
         nCount3 += pGlass->m_nCellNum;
      }
   }
   CakRectd rectCell;
   if (m_FormationMap.m_vecTempCellRect.size() - 1 < nCount3) return;
   for (int i = 0; i < nCount2; i++)
   {
      CakRectd* pCellData = &m_FormationMap.m_vecTempCellRect[nCount3 + i];
      rectCell.left = pCellData->left;
      rectCell.top = pCellData->top;
      rectCell.right = pCellData->right;
      rectCell.bottom = pCellData->bottom;
      m_FormationMap.m_vecCellRect.push_back(rectCell);
   }
//    for (int i = 0; i < MAX_COUNT+1; i++)
//    {
//       if (nCount == nDataCount) break;
//
//       if (m_nCellSize[i] != 0)
//       {
//          nCount++;
//       }
//       nCellCount = m_nCellSize[i];
//       nCount2 = i;
//
//       if (i == 0)
//       {
//          nCount3 = 0;
//       }
//       else
//       {
//          nCount3 += m_nCellSize[i-1];
//       }
//    }
      m_FormationMap.ReDraw(TRUE);
}
void CReveiwHistoryDlg::SortFileList(int nCol)
{
   if (nCol == 0)
      return;
   _akReviewHeader   *pReviewHeader;
   std::vector< std::pair<CString, _akReviewHeader*> > vecString;
   std::vector< std::pair<double, _akReviewHeader*> > vecValue;
   CString strValue;
   double dValue;
   short sValue[16];
   for (int i = 0; i < m_Formation.m_vecHeaderTemp.size(); i++)
   {
      pReviewHeader = &m_Formation.m_vecHeaderTemp[i];
      switch (nCol)
      {
      case 1: strValue = pReviewHeader->m_strFileTime; break;
      case 2:   strValue = pReviewHeader->m_strLoading; break;
      case 3:   strValue = pReviewHeader->m_strPPID; break;
      case 4: strValue = pReviewHeader->m_strGlassID; break;
      case 5:   dValue = pReviewHeader->m_nDefectIdx; break;
      case 6:   dValue = pReviewHeader->m_nReviewIdx; break;
      case 7:   strValue = pReviewHeader->m_strJudge; break;
      case 8:   strValue = pReviewHeader->m_strFileName; break;
      }
      if (strValue.IsEmpty() == FALSE) vecString.push_back(std::make_pair(strValue, pReviewHeader));
      else vecValue.push_back(std::make_pair(dValue, pReviewHeader));
   }
   if (!vecString.empty())
   {
      std::sort(vecString.begin(), vecString.end(), std::greater< std::pair<CString, _akReviewHeader*> >());
      m_Formation.m_vecHeader.clear();
      std::vector< std::pair<CString, _akReviewHeader*> >::iterator itVec;
      //   /*if(nCount > m_nFileCount) break; //count ì—¬ê¸°ì„œ ë§ê³  ì „ì²´ íŒŒì¼ì„ ë‹¤ ì½ì€ í›„에 ë‹¤ì‹œ ì†ŒíŒ…하자*/
      int nCount = 1;
      for (itVec = vecString.begin(); itVec != vecString.end(); ++itVec)
      {
         if(nCount > m_nFileCount) break;
         m_Formation.m_vecHeader.push_back(*itVec->second);
         nCount++;
      }
   }
   else
   {
      std::sort(vecValue.begin(), vecValue.end(), std::greater< std::pair<double, _akReviewHeader*> >());
      m_Formation.m_vecHeader.clear();
      std::vector< std::pair<double, _akReviewHeader*> >::iterator itVec;
      int nCount = 1;
      for (itVec = vecValue.begin(); itVec != vecValue.end(); ++itVec)
      {
         if (nCount > m_nFileCount) break;
         m_Formation.m_vecHeader.push_back(*itVec->second);
         nCount++;
      }
   }
   _akReviewHeader   *pReview;
   m_vecStrGridReviewPath.clear();
   m_vecStrGridReviewList.clear();
   GV_ITEM Item;
   int nRowIdx = 0;
   int nColIdx = 0;
   CString strTemp;
   Item.mask = GVIF_TEXT;
   for(int i=0; i< m_Formation.m_vecHeader.size(); i++)
   {
      pReview = &m_Formation.m_vecHeader[i];
      m_vecStrGridReviewPath.push_back(pReview->m_strFilePath);
      m_vecStrGridReviewList.push_back(pReview->m_strFileName);
   }
   m_Formation.m_vecHeaderTemp.clear();
}
void CReveiwHistoryDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   // TODO: ì—¬ê¸°ì— ë©”시지 ì²˜ë¦¬ê¸° ì½”드를 ì¶”ê°€ ë°/또는 ê¸°ë³¸ê°’을 í˜¸ì¶œí•©ë‹ˆë‹¤.
   CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}