SDC C-Project CF Review 프로그램
ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.cpp
@@ -12,6 +12,7 @@
#include "akGridCtrl/GridCellCheck.h"
#include "akImageView.h"
#include <algorithm>
#include "MacroFile.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -54,6 +55,11 @@
CReveiwHistoryDlg::CReveiwHistoryDlg(CWnd* pParent /*=nullptr*/)
   : CDialogEx(IDD_DLG_REVIEWHISTORY, pParent)
   , m_nFileCount(0)
   , m_nEditCamIdx(0)
   , m_nEditScanIdx(0)
   , m_dEditOffsetX(0)
   , m_dEditOffsetY(0)
   , m_strGantryIdx(_T(""))
{
   m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
@@ -73,6 +79,10 @@
   m_nImageCount = 0;
   m_nCellCount = 0;
   m_bAsending = FALSE;
   /*< LYW 20211018 - #3684 ADD Start >*/
   m_dCurDefectIdx = 0;
   m_dCurDefectID = 0;
   /*< LYW 20211018 - #3684 ADD End >*/
   for (int i = 0; i < 105; i++)
   {
@@ -97,6 +107,11 @@
   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);
   DDX_Text(pDX, IDC_EDIT_OFFSET_CAM_IDX, m_nEditCamIdx);
   DDX_Text(pDX, IDC_EDIT_OFFSET_SCAN_IDX, m_nEditScanIdx);
   DDX_Text(pDX, IDC_EDIT_OFFSET_X, m_dEditOffsetX);
   DDX_Text(pDX, IDC_EDIT_OFFSET_Y, m_dEditOffsetY);
   DDX_Text(pDX, IDC_EDIT_DFFSET_GANTRY_IDX, m_strGantryIdx);
}
BEGIN_MESSAGE_MAP(CReveiwHistoryDlg, CDialogEx)
@@ -109,6 +124,7 @@
   ON_BN_CLICKED(IDC_BUTTON_MAPVIEW_FIT, &CReveiwHistoryDlg::OnBnClickedButtonMapviewFit)
   ON_MESSAGE(UM_FORMMAP_DEFECTSELECT, OnMapDefectSelected)
   ON_MESSAGE(UM_FORMMAP_DEFECTMOUSEOVER, OnMapDefectMouseOver)
   ON_MESSAGE(UM_FORMMAP_IMAGEMOUSECLICK, OnImageClick)
   ON_COMMAND(ID_OPTION_PATHSETTING, &CReveiwHistoryDlg::OnOptionPathsetting)
   ON_COMMAND(ID_VIEW_ALLDEFECT, &CReveiwHistoryDlg::OnViewAlldefect)
   ON_COMMAND(ID_VIEW_REVIEWDEFECT, &CReveiwHistoryDlg::OnViewReviewdefect)
@@ -121,6 +137,9 @@
   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()
   ON_BN_CLICKED(IDC_BUTTON_OFFSET_APPLY, &CReveiwHistoryDlg::OnBnClickedButtonOffsetApply)
   ON_BN_CLICKED(IDC_BUTTON_OFFSET_SAVE, &CReveiwHistoryDlg::OnBnClickedButtonOffsetSave)
END_MESSAGE_MAP()
// CReveiwHistoryDlg 메시지 처리기
@@ -193,6 +212,13 @@
   InitGridReviewLIst(&m_gridReviewList, IDC_STATIC_GRID_GLASS);
   InitGridDefectLIst(&m_gridDefectInfo, IDC_STATIC_GRID_DEFECT);
   InitGridGlassLIst(&m_gridGlassInfo, IDC_STATIC_GRID_GLASS_INFO);
   /*< LYW 20211025 - #3684 ADD Start >*/
   CString strPath = _T("");
   InitDataInfo();
   strPath.Format(_T("%s%s"), REVIEW_OFFSET_CONFIGFILE_PATH, REVIEW_OFFSET_CONFIGFILE_NAME);
   LoadOffset(strPath);
   /*< LYW 20211025 - #3684 ADD End >*/
   OnViewReviewdefect();
@@ -738,7 +764,7 @@
         return TRUE;
      }
      else if (NM_CLICK == pDispInfo->hdr.code)
      else if (NM_CLICK == pDispInfo->hdr.code || LVN_ITEMCHANGING == pDispInfo->hdr.code)
      {
         if (pDispInfo->item.row == 0)
         {
@@ -864,7 +890,7 @@
         return TRUE;
      }
      else if (NM_CLICK == pDispInfo->hdr.code)
      else if (NM_CLICK == pDispInfo->hdr.code || LVN_ITEMCHANGING == pDispInfo->hdr.code)
      {
         if (pDispInfo->item.row == 0)
         {
@@ -878,6 +904,7 @@
               _akDefect* pDefectInfo = &m_Formation.m_vecDefects[pDispInfo->item.row - 1];
               m_FormationMap.setSelectDefect(pDefectInfo->m_nDefectID);
               //ImageShow(pDefectInfo->m_nDefectID);
               if (!m_bDefectAll)
               {
@@ -1218,6 +1245,62 @@
   return 0;
}
/*< LYW 20211018 - #3684 ADD Start >*/
LRESULT CReveiwHistoryDlg::OnImageClick(WPARAM wParam, LPARAM lParam)
{
   CPathSettingDlg* lpDlg = CPathSettingDlg::GetMgr();
   if (lpDlg == NULL) return 0;
   _akDefect         *pDefect;
    pDefect = &m_Formation.m_vecDefects[m_dCurDefectIdx];
   if (pDefect == NULL) return 0;
   CPoint Point;
   Point.x = GET_X_LPARAM(lParam);
   Point.y = GET_Y_LPARAM(lParam);
   int dOffsetDrectionX;
   int dOffsetDrectionY;
   if (lpDlg->m_comboDirectionX.GetCurSel() == 1) dOffsetDrectionX = -1;
   else dOffsetDrectionX = 1;
   if (lpDlg->m_comboDirectionY.GetCurSel() == 1) dOffsetDrectionY = -1;
   else dOffsetDrectionY = 1;
   if (pDefect->m_nDefectID == m_dCurDefectID)
   {
      m_nEditCamIdx = pDefect->m_nCameraID;
      m_nEditScanIdx = pDefect->m_nScanIdx;
      m_nCurModelIdx = pDefect->m_nModelIdx;
      if (m_nCurModelIdx == 0)
      {
         m_strGantryIdx = _T("Left");
         m_dEditOffsetX = (double)(dOffsetDrectionX * (Point.x / 5)) / 1000;
         m_dEditOffsetY = (double)-(dOffsetDrectionY * (Point.y / 5)) / 1000;
      }
      else if (m_nCurModelIdx == 1)
      {
         m_strGantryIdx = _T("Right");
         m_dEditOffsetX = (double)-(dOffsetDrectionX * (Point.x / 5)) / 1000;
         m_dEditOffsetY = (double)-(dOffsetDrectionY * (Point.y / 5)) / 1000;
      }
      else AfxMessageBox(_T("겐트리 인덱스가 비정상 입니다."), MB_OK | MB_ICONWARNING);
   }
   else
   {
      if (IDOK == AfxMessageBox(_T("이미지 인덱스가 일치하지 않습니다."), MB_OK | MB_ICONWARNING))
      {
         return 0;
      }
   }
   UpdateData(FALSE);
   return 0;
}
/*< LYW 20211018 - #3684 ADD End >*/
LRESULT CReveiwHistoryDlg::OnMapDefectMouseOver(WPARAM wParam, LPARAM lParam)
{
@@ -2021,6 +2104,13 @@
      }
   }
   _akReviewList* pImageInfo = &m_Formation.m_vecImage[nIndex];
   m_dCurDefectID = pImageInfo->m_nDefectID;
    m_dCurDefectIdx = nIndex;
//    _akDefect         *pDefect;
//    pDefect = &m_Formation.m_vecDefects[nIndex];
//    m_dCurDefectCam = pDefect->m_nCameraID;
//    m_dCurDefectModuleIdx = pDefect->m_nModelIdx;
//    m_dCurDefectScan = pDefect->m_nScanIdx;
   //몇 번째 인지 던진다.
   CString wekfjlwe = pImageInfo->m_strReviewImageName;
@@ -3828,3 +3918,344 @@
   }
   m_Formation.m_vecHeaderTemp.clear();
}
void CReveiwHistoryDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
   CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
/*< LYW 20211025 - #3684 ADD Start >*/
void CReveiwHistoryDlg::OnBnClickedButtonOffsetApply()
{
   // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
   ApplyOffset(m_nCurModelIdx, m_nEditCamIdx, m_nEditScanIdx, m_dEditOffsetX, m_dEditOffsetY);
}
void CReveiwHistoryDlg::OnBnClickedButtonOffsetSave()
{
   // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
   SaveOffset();
}
BOOL CReveiwHistoryDlg::LoadOffset(CString strFilePath)
{
   //dBarValue = 0;
   CMacroFile macroFile;
   if (!macroFile.Read(strFilePath))
      return FALSE;
   macroFile.GetItem(_T("CAMERA_COUNT"), m_nCameraCount, 0);
   macroFile.GetItem(_T("SCAN_COUNT"), m_nScanCount, 0);
   macroFile.GetItem(_T("XPOS_COUNT"), m_XposCount, 0);
   CString strItem = _T("");
   double dXoffset = 0;
   double dYoffset = 0;
   double dXMin = 0;
   double dXMAX = 0;
   double dValue = 0;
   dValue = 2 * CAM_MAX_COUNT*SCAN_MAX_COUNT;
   dValue = 1600 / dValue;
   for (int nModuleidx = 0; nModuleidx < 2; nModuleidx++)
   {
      for (int nCamidx = 0; nCamidx < CAM_MAX_COUNT; nCamidx++)
      {
         for (int nScanidx = 0; nScanidx < SCAN_MAX_COUNT; nScanidx++)
         {
            for (int nXposIndex = 0; nXposIndex < XPOS_MAX_COUNT; nXposIndex++)
            {
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_OFFSET_X"), nModuleidx, nCamidx, nScanidx, nXposIndex);
               macroFile.GetItem(strItem, dXoffset);
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_OFFSET_Y"), nModuleidx, nCamidx, nScanidx, nXposIndex);
               macroFile.GetItem(strItem, dYoffset);
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_XPOS_X_MIN"), nModuleidx, nCamidx, nScanidx, nXposIndex);
               macroFile.GetItem(strItem, dXMin);
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_XPOS_X_MAN"), nModuleidx, nCamidx, nScanidx, nXposIndex);
               macroFile.GetItem(strItem, dXMAX);
               SetInputOffSet(nModuleidx, nCamidx, nScanidx, nXposIndex, dXoffset, dYoffset, dXMin, dXMAX);
            }
            //IncressProcessBar(dValue);
         }
      }
   }
   return TRUE;
}
BOOL CReveiwHistoryDlg::SaveOffset()
{
   //dBarValue = 0;
   CString strForderPath;
   CString strFileName;
   CTime time = CTime::GetCurrentTime();
   strFileName.Format(_T("ReviewOffSet_%04d%02d%02d%02d%02d%02d.cfg"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
   strForderPath.Format(_T("%s%s"), REVIEW_OFFSET_BACKUP_FORDER_PATH, strFileName);
   CopyFile(REVIEW_OFFSET_CONFIGFILE_FULL_PATHNAME, strForderPath, FALSE);
   BOOL bReturn = FALSE;
   CString strTemp;
   int nTemp;
   double dTemp;
   CMacroFile macroFile;
   macroFile.Clear();
   CString strItem = _T("");
   strItem.Format(_T("CAMERA_COUNT"));
   macroFile.SetItem(strItem, m_nCameraCount);
   strItem.Format(_T("SCAN_COUNT"));
   macroFile.SetItem(strItem, m_nScanCount);
   strItem.Format(_T("XPOS_COUNT"));
   macroFile.SetItem(strItem, m_XposCount);
   CString strData;
   double dData = 0;
   for (int nModuleidx = 0; nModuleidx < 2; nModuleidx++)
   {
      for (int nCamidx = 0; nCamidx < CAM_MAX_COUNT; nCamidx++)
      {
         for (int nScanidx = 0; nScanidx < SCAN_MAX_COUNT; nScanidx++)
         {
            for (int nXposIndex = 0; nXposIndex < XPOS_MAX_COUNT; nXposIndex++)
            {
               OffSetInfo pOffSet = GetOffSetInfo(nModuleidx, nCamidx, nScanidx, nXposIndex);
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_OFFSET_X"), nModuleidx, nCamidx, nScanidx);
               dData = pOffSet.dXoffSetValue;
               macroFile.SetItem(strItem, dData);
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_OFFSET_Y"), nModuleidx, nCamidx, nScanidx);
               dData = pOffSet.dYoffSetValue;
               macroFile.SetItem(strItem, dData);
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_XPOS_X_MIN"), nModuleidx, nCamidx, nScanidx);
               dData = pOffSet.dXposMin;
               macroFile.SetItem(strItem, dData);
               strItem.Format(_T("MODULE[%d]_CAM[%d]_SCAN[%d]_IDX[%d]_XPOS_X_MAN"), nModuleidx, nCamidx, nScanidx);
               dData = pOffSet.dXposMax;
               macroFile.SetItem(strItem, dData);
            }
            //IncressProcessBar(5);
         }
      }
   }
   CString strFilePath;
   strFilePath.Format(_T("%s%s"), REVIEW_OFFSET_CONFIGFILE_PATH, REVIEW_OFFSET_CONFIGFILE_NAME);
   bReturn = macroFile.Write(strFilePath);
   if (bReturn) AfxMessageBox(_T("OFFSET SAVE SUCCESS"), MB_OK | MB_ICONASTERISK);
   else AfxMessageBox(_T("OFFSET SAVE FAIL"), MB_OK | MB_ICONASTERISK);
   return bReturn;
}
BOOL CReveiwHistoryDlg::ApplyOffset(int nModuleidx, int nCamIndex, int ScanIndex, double dXOffsetValue, double dYOffsetValue)
{
   if (nCamIndex > CAM_MAX_COUNT || nCamIndex < 0)
   {
      return FALSE;
   }
   if (ScanIndex > SCAN_MAX_COUNT || ScanIndex < 0)
   {
      return FALSE;
   }
   if (nModuleidx == 0)
   {
      VecOffSetScanData* pScandata = &m_vecOffSetCameraInfo[nCamIndex];
      VecOffSetData* pData = &pScandata->at(ScanIndex);
      OffSetInfo* pOffSetData = &pData->at(0);
      if (pOffSetData->bCheckSave == TRUE)
      {
         AfxMessageBox(_T("이미 저장한 OFFSET 입니다. 다시 셋팅을 원하시면 프로그램을 재시작 해주세요"), MB_OK | MB_ICONWARNING);
         return FALSE;
      }
      else
      {
         pOffSetData->dXoffSetValue += dXOffsetValue;
         pOffSetData->dYoffSetValue += dYOffsetValue;
         pOffSetData->bCheckSave = TRUE;
      }
   }
   else if (nModuleidx == 1)
   {
      VecOffSetScanData* pScandata = &m_vecOffSetCameraInfo2[nCamIndex];
      VecOffSetData* pData = &pScandata->at(ScanIndex);
      OffSetInfo* pOffSetData = &pData->at(0);
      if (pOffSetData->bCheckSave == TRUE)
      {
         AfxMessageBox(_T("이미 저장한 OFFSET 입니다. 다시 셋팅을 원하시면 프로그램을 재시작 해주세요"), MB_OK | MB_ICONWARNING);
         return FALSE;
      }
      else
      {
         pOffSetData->dXoffSetValue += dXOffsetValue;
         pOffSetData->dYoffSetValue += dYOffsetValue;
         pOffSetData->bCheckSave = TRUE;
      }
   }
   else
   {
      return FALSE;
   }
}
BOOL CReveiwHistoryDlg::SetInputOffSet(int nModuleidx, int nCamIndex, int ScanIndex, int nXposIndex, double dXOffsetValue, double dYOffsetValue, double dXposMin, double dXposMax, BOOL bCheckSave/* = 0*/)
{
   if (nCamIndex > CAM_MAX_COUNT || nCamIndex < 0)
   {
      return FALSE;
   }
   if (ScanIndex > SCAN_MAX_COUNT || ScanIndex < 0)
   {
      return FALSE;
   }
   if (nModuleidx == 0)
   {
      VecOffSetScanData* pScandata = &m_vecOffSetCameraInfo[nCamIndex];
      VecOffSetData* pData = &pScandata->at(ScanIndex);
      OffSetInfo* pOffSetData = &pData->at(nXposIndex);
      pOffSetData->dXoffSetValue = dXOffsetValue;
      pOffSetData->dYoffSetValue = dYOffsetValue;
      pOffSetData->dXposMin = dXposMin;
      pOffSetData->dXposMax = dXposMax;
      pOffSetData->bCheckSave = bCheckSave;
   }
   else if (nModuleidx == 1)
   {
      VecOffSetScanData* pScandata = &m_vecOffSetCameraInfo2[nCamIndex];
      VecOffSetData* pData = &pScandata->at(ScanIndex);
      OffSetInfo* pOffSetData = &pData->at(nXposIndex);
      pOffSetData->dXoffSetValue = dXOffsetValue;
      pOffSetData->dYoffSetValue = dYOffsetValue;
      pOffSetData->dXposMin = dXposMin;
      pOffSetData->dXposMax = dXposMax;
      pOffSetData->bCheckSave = bCheckSave;
   }
   else
   {
      return FALSE;
   }
}
void CReveiwHistoryDlg::InitDataInfo()
{
   //미리 공간 할당
   for (int nCamidx = 0; nCamidx < CAM_MAX_COUNT; nCamidx++)
   {
      VecOffSetScanData pVecScanData;
      for (int nScanidx = 0; nScanidx < SCAN_MAX_COUNT; nScanidx++)
      {
         VecOffSetData     pVecData;
         for (int nXposIndex = 0; nXposIndex < XPOS_MAX_COUNT; nXposIndex++)
         {
            OffSetInfo pInfo;
            pInfo.nXposIndex = nXposIndex;
            pInfo.nScanIndex = nScanidx;
            pInfo.nCamIndex = nCamidx;
            pVecData.push_back(pInfo);
         }
         pVecScanData.push_back(pVecData);
      }
      m_vecOffSetCameraInfo.push_back(pVecScanData);
   }
   for (int nCamidx = 0; nCamidx < CAM_MAX_COUNT; nCamidx++)
   {
      VecOffSetScanData pVecScanData;
      for (int nScanidx = 0; nScanidx < SCAN_MAX_COUNT; nScanidx++)
      {
         VecOffSetData     pVecData;
         for (int nXposIndex = 0; nXposIndex < XPOS_MAX_COUNT; nXposIndex++)
         {
            OffSetInfo pInfo;
            pInfo.nXposIndex = nXposIndex;
            pInfo.nScanIndex = nScanidx;
            pInfo.nCamIndex = nCamidx;
            pVecData.push_back(pInfo);
         }
         pVecScanData.push_back(pVecData);
      }
      m_vecOffSetCameraInfo2.push_back(pVecScanData);
   }
}
OffSetInfo CReveiwHistoryDlg::GetOffSetInfo(int nModuleidx, int nCamIndex, int ScanIndex, int nXposIndex)
{
   OffSetInfo pOFF;
   if (nCamIndex > CAM_MAX_COUNT || nCamIndex < 0)
   {
      return pOFF;
   }
   if (ScanIndex > SCAN_MAX_COUNT || ScanIndex < 0)
   {
      return pOFF;
   }
   if (nModuleidx == 0)
   {
      VecOffSetScanData* pScandata = &m_vecOffSetCameraInfo[nCamIndex];
      VecOffSetData* pData = &pScandata->at(ScanIndex);
      OffSetInfo* pOffSetData = &pData->at(nXposIndex);
      return *pOffSetData;
   }
   else if (nModuleidx == 1)
   {
      VecOffSetScanData* pScandata = &m_vecOffSetCameraInfo2[nCamIndex];
      VecOffSetData* pData = &pScandata->at(ScanIndex);
      OffSetInfo* pOffSetData = &pData->at(nXposIndex);
      return *pOffSetData;
   }
   else
   {
      return pOFF;
   }
}
/*< LYW 20211025 - #3684 ADD End >*/