SDC C-Project CF Review 프로그램
KEJ
2024-06-26 0c66940a8e2cf64c9890519901f433b3668216b6
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -19,10 +19,12 @@
#define LOCAL_RAWPATH_INFO_INI_PATH   "D:\\ResultData\\"
#define RAWINFO_FILE_NAME         "RESULT_INFO.ini"
#define LOCAL_AOI_DEFECT_INFO_FILE_PATH      _T("D:\\DIT_ResultData\\DefectInfo") // 결함 상세 정보 파일 생성 경로
#define LOCAL_AOIRAWDFS_PATH      "D:\\DIT_ResultData\\Raw"
#define LOCAL_AOIRAWBIN_PATH      "D:\\DIT_ResultData\\RawBin"
#define NETWORK_AOIRAWDFS_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Raw"
#define NETWORK_AOIRAWBIN_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"
#define LOCAL_ReviewRAWBIN_PATH      "D:\\DIT_ResultData\\RawBin"
#define NETWORK_AOIRAWFILE_SUB_PATH "\\\\126.100.100.1\\d\\Raw_im\\"
#define NETWORK_AOI_IMAGE_PATH      "\\\\126.100.100.1\\d\\Image\\Defect\\" 
@@ -30,6 +32,14 @@
#define NETWORK_MURARAW_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\RAW" //0405nwh
#define NETWORK_MURA_IMAGE_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\IMG" //0405nwh
//KYH Stack Local 경로 추가
#define NETWORK_AOISTACKLOCAL_PATH  "\\\\126.100.100.1\\d\\DIT_ResultData\\Stack"
   /* <LJC 20211122 : #3820 ADD Start> */
#define NETWORK_AOIRAWMERGELOCAL_PATH  "D:\\DIT_ResultData\\RawMerge"
   /* <LJC 20211122 : #3820 ADD End> */
/* <KMH 20220407 : #4053 ADD Start> */
#define  LOCAL_LOGDATA_PATH            "D:\\DIT_LogData"
/* <KMH 20220407 : #4053 ADD End> */
char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
void _TimeDelay(int delay)
@@ -37,9 +47,9 @@
   MSG      msg;
   BOOL   fRst = FALSE;
   clock_t lBlockTime = delay + clock();
   ULONGLONG lBlockTime = delay + GetTickCount64();
   while (lBlockTime > clock())
   while (lBlockTime > GetTickCount64())
   {
      fRst = (BOOL)PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
      if (fRst)
@@ -50,6 +60,30 @@
      Sleep(10);
   }
}
/* < KJG 20221110 - #4373 ADD Start >*/
auto CellIDSortFunc = [](const _grmCellData* lhs, const _grmCellData* rhs) {
   // '0A' = 0, '0B' = 1, ..., '0Z' = 25, '00' = 26, ..., '09' = 35, '1A' = 36, ...
   const int nAlphaSet = 'Z' - 'A' + 1;
   const int nNumSet = '9' - '0' + 1;
   const int nAlphaNumSet = nAlphaSet + nNumSet;
   CString str = lhs->m_strCellName;
   char lhs_1st = str.Mid(str.GetLength() - 2, 1).GetAt(0);
   char lhs_2st = str.Mid(str.GetLength() - 1, 1).GetAt(0);
   str = rhs->m_strCellName;
   char rhs_1st = str.Mid(str.GetLength() - 2, 1).GetAt(0);
   char rhs_2st = str.Mid(str.GetLength() - 1, 1).GetAt(0);
   auto GetCellValueFrom2stCellID = [&](char c) -> int {
      if (c >= 'A' && c < 'Z') // 'A' 는 0부터
         return c - 'A';
      else if (c >= '0' && c <= '9') // '0' 은 26 부터
         return (c - '0') + nAlphaSet;
   };
   return (lhs_1st - '0') * nAlphaNumSet + GetCellValueFrom2stCellID(lhs_2st) < (rhs_1st - '0') * nAlphaNumSet + GetCellValueFrom2stCellID(rhs_2st);
};
/* < KJG 20221110 - #4373 ADD End >*/
CGlassRawCPJT::CGlassRawCPJT(void)
{
@@ -57,6 +91,21 @@
   CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL);
   CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL);
   CreateDirectory("D:\\Raw_im", NULL);
   CreateDirectory(LOCAL_AOI_DEFECT_INFO_FILE_PATH, NULL); /* < KJG 20240620 - #4942 ADD >*/
   /* <KMH 20220407 : #4053 ADD Start> */
   CFileFind FileFinder;
   SYSTEMTIME st;
   GetLocalTime(&st);
   char strLogFolderPath [256];
   sprintf(strLogFolderPath, "%s\\%02d%02d%02d", LOCAL_LOGDATA_PATH,st.wYear, st.wMonth, st.wDay);
   BOOL bFind = FileFinder.FindFile(strLogFolderPath);
   if (!bFind)
   {
      CreateDirectory(strLogFolderPath, NULL);
   }
   /* <KMH 20220407 : #4053 ADD End> */
   m_MuraResultFile.readOptionFile("C:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg");
   m_GlassRawRTMS.SetMuraResult(&m_MuraResultFile);
@@ -70,52 +119,117 @@
BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData )
{
   //스택기능
   AKLOG("Sequence :  Glass Loading Signal Start ");/* <KMH 20220407 : #4053 ADD > */
    SetEnableFtpAck(FALSE);
    m_nRawMergeIdx = 0;
   if(m_StackResult.getStackUse())
   {
      CString strStackFileLocalPath;
      strStackFileLocalPath.Format("%s\\%s", NETWORK_AOISTACKLOCAL_PATH, pData->GetGlassData()->m_strGlassID);
      CFileFind File;
      if (File.FindFile(strStackFileLocalPath))
      {
         File.FindNextFile();
         strStackFileLocalPath = File.GetFilePath();
         /* <KMH 20220407 : #4053 MOD Start> */
         if (DeleteFile(strStackFileLocalPath))
            /*< SWK 20220413 - #4053 MOD Start >*/
//          {
//             AKLOG(" Fucntion : Delete Stack File Sucess[%s] ", strStackFileLocalPath);
//          }
//          /* <KMH 20220407 : #4053 MOD End> */
//          Sleep(10);
//      }
//       else
//       {
//          AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);/* <KMH 20220407 : #4053 MOD > */
//       }
            AKLOG(" Function : Delete Stack File Sucess[%s] ", strStackFileLocalPath);
         else
            AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);
      }
            /*< SWK 20220413 - #4053 MOD End >*/
      //201218 CJH - Stack Download 시도
      SendMessageFTPDownloadStack(pData->GetGlassData());
      m_StackResult.StackFileReadStart(pData->GetGlassData()->m_strGlassID);
   }
   if (m_RawMergeResult.getRawMergeUse())
   /* <LJC 20211122 : #3820 ADD Start> */
   if (pData->GetGlassData()->m_bRawMergeUse)
   {
      SendMessageFTPDownloadDataFile(pData->GetGlassData());
      m_RawMergeResult.RawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
      CString strRawFileLocalPath;
      strRawFileLocalPath.Format("%s\\%s", NETWORK_AOIRAWMERGELOCAL_PATH, pData->GetGlassData()->m_strGlassID);
      CFileFind File;
      if (File.FindFile(strRawFileLocalPath))
      {
         File.FindNextFile();
         strRawFileLocalPath = File.GetFilePath();
         /* <KMH 20220407 : #4053 MOD Start> */
         if (DeleteFile(strRawFileLocalPath))
            /*< SWK 20220413 - #4053 MOD Start >*/
//          {
//             AKLOG(" Fucntion : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath);
//          }
//          /* <KMH 20220407 : #4053 MOD End> */
//          Sleep(10);
//       }
//       else
//       {
//          AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath); /* <KMH 20220407 : #4053 ADD > */
//       }
            AKLOG(" Function : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath);
         else
            AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath);
      }
            /*< SWK 20220413 - #4053 MOD End >*/
      SetEnableFtpAck(TRUE);
      DownLoadMergeFile(pData);
   }
   /* <LJC 20211122 : #3820 ADD End> */
   /*< KJG 20211024 - #3487 ADD End >*/
   AKLOG("Sequence :  Glass Loading Signal End ");
   return TRUE;
}
BOOL CGlassRawCPJT::SequenceInspectEnd( CgrmGlassRawData* pData )
{
   AKLOG(" Sequence : InspectionEnd Signal Start"); /* <KMH 20220407 : #4053 ADD > */
   m_bReviewEndCheck = FALSE;
   //210128
   m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
   pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd;      // Insp End 시 Raw 업로드로, E_TIME, LD_TIME 입력 [ 21-03-18 KJG ]
   pData->GetGlassData()->m_tmInspectionEND = m_tmReviewEnd;      // 실제 Insp End 시 Raw 업로드로, E_TIME, LD_TIME 입력   //< KEJ 20240408 - #4808 ADD >
   m_tmFileCreateTime = CTime::GetCurrentTime();
   //여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   {
      _grmGlassData* pGlassData = pData->GetGlassData();
      CTime CurrTime = pGlassData->m_tmGlassLoading;
      CString strTime=_T(""), strFileName=_T("");
      strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
         CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
      strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
      strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
   }
   strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   //=> 서버에서 써준 그대로 생성하도록 변경
   /* < KJG 20240620 - #4942 DEL Start >*/
//    pData->GetGlassData()->m_strFileName;
//    {
//       _grmGlassData* pGlassData = pData->GetGlassData();
//       CTime CurrTime = pGlassData->m_tmGlassLoading;
//       CString strTime=_T(""), strFileName=_T("");
//       strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
//
//          CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
//       strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
//
//       strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
//    }
//   strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   /* < KJG 20240620 - #4942 DEL End >*/
   
   if(!WriteBinFile(pData))
      return FALSE;
   
   if (1) ReadMuraFile(pData);
   //if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
   
   if (WriteAOIFile(pData) == FALSE)
@@ -126,14 +240,65 @@
   //210218 CJH - 검사 종료시 결과파일 및 CCD Image 업로드
   SendMessageFTPUploadRaw(pData->GetGlassData());
   /* <KYH 211129 : #3806 ADD Start> */
   char pServerPath[256] = {};
   char pServerFile[256] = {};
   CString strGlassID = pData->GetGlassData()->m_strGlassID;
   CString strGlassIDLevel6th = strGlassID.Left(6);
   CString strStepID = pData->GetGlassData()->m_strStepID;
   CString strProcessID = pData->GetGlassData()->m_strProcessID;
   CString strFileName;
   strcpy(pServerFile, "*.*");
   strFileName.Format("%s", strGlassID);
   strFileName.MakeLower();
   sprintf(pServerFile, "%s", strFileName.GetBuffer(0));
   strStepID.MakeLower();
   strGlassID.MakeLower();
   strGlassIDLevel6th.MakeLower();
   strProcessID.MakeLower();
//   if (strGlassID.GetLength() > 6)
//      sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
//   else
      sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
   /* <KYH 211129 : #3806 ADD End> */
   BOOL bIsBDI = strcmp((pData->GetGlassData()->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;
   if (bIsBDI)
   {
      SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
   }
   SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh
      /* <KYH 211129 : #3806 ADD Start> */
      CString strRawFilePathName = NULL;
      CString strLine = NULL;
      strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
      strRawFilePathName += RAWINFO_FILE_NAME;
      FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "w");
      if (pf != NULL)
      {
         strLine = pServerPath + strFileName;
         fprintf(pf, "[RESULT_PATH]\n");
         fprintf(pf, "RAWPATH= X:\%s\n", strLine.GetBuffer(0));
         SetRawFilePath(strLine.GetBuffer(0));
         fprintf(pf, "SUMPATH= \n");
         fprintf(pf, "IMGPATH= Z:\%s\n", strLine.GetBuffer(0));
         fprintf(pf, "DISK=FILESERVER\n");
         fclose(pf);
      }
   }
   else
   {
      SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);/* <KMH 20220407 : #4053 ADD > */
   }
    /* <KYH 211129 : #3806 ADD End> */
   AKLOG(" Sequence : InspectionEnd Signal End"); /* <KMH 20220407 : #4053 ADD > */
   return TRUE;
}
@@ -144,69 +309,72 @@
   //여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
   //strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
   strcpy(pData->GetGlassData()->m_strPath, LOCAL_ReviewRAWBIN_PATH);      //< KEJ 20240621 - #4942 MOD >
   
   //strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   /* < KEJ 20240621 - #4942 MOD Start > */
//    CString strFindFile;
//    int nCloseTime = 600*100000;//sec
//    int nReTryTime = 30;
//    {
//       CTime tmReviewLoading = CTime::GetCurrentTime();
//       CString strWild;
//
//       strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
//       CakFileUtil akFileFinder;
//       while(nReTryTime--)
//       {
//          akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
//          VECFINDDATA* pFindData = akFileFinder.getFindData();
//          int nFileNamePos = strlen(akFileFinder.getProcessPath());
//          std::map<LONGLONG, CString> mapSpanFileName;
//          for(int i=0; i<pFindData->size(); i++)
//          {
//             char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
//             {
//                CakParser parser;
//                parser.process(pFileName, "_.");
//                if(parser.getTokNum() < 4) continue;
//
//                int nDataTime[8]={};
//                {
//                   int nTokIndex=0;
//                   const char* pGlassId = parser.getTokStr(nTokIndex++);
//                   const char* pStepId = parser.getTokStr(nTokIndex++);
//                   char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
//                   char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
//
//                   nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
//                   nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
//                   nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
//                   nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
//                   nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
//                   nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
//                }
//
//                CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
//                CTimeSpan tmSpan = tmReviewLoading-tmTemp;
//                mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
//             }
//          }
//
//          if(mapSpanFileName.empty() == FALSE)
//          {
//             if(mapSpanFileName.begin()->first < nCloseTime)
//             {
//                //가장 최근 결과파일 찾기 성공 [김태현 2019/7/17]
//                strFindFile = mapSpanFileName.begin()->second;
//                break;
//             }
//          }
//          akFileFinder.clear();
//          Sleep(100);
//       }
//    }
   CString strFindFile;
   int nCloseTime = 600*100000;//sec
   int nReTryTime = 30;
   {
      CTime tmReviewLoading = CTime::GetCurrentTime();
      CString strWild;
      strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
      CakFileUtil akFileFinder;
      while(nReTryTime--)
      {
         akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
         VECFINDDATA* pFindData = akFileFinder.getFindData();
         int nFileNamePos = strlen(akFileFinder.getProcessPath());
         std::map<LONGLONG, CString> mapSpanFileName;
         for(int i=0; i<pFindData->size(); i++)
         {
            char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
            {
               CakParser parser;
               parser.process(pFileName, "_.");
               if(parser.getTokNum() < 4) continue;
               int nDataTime[8]={};
               {
                  int nTokIndex=0;
                  const char* pGlassId = parser.getTokStr(nTokIndex++);
                  const char* pStepId = parser.getTokStr(nTokIndex++);
                  char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
                  char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
                  nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
                  nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
                  nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
                  nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
                  nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
                  nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
               }
               CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
               CTimeSpan tmSpan = tmReviewLoading-tmTemp;
               mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
            }
         }
         if(mapSpanFileName.empty() == FALSE)
         {
            if(mapSpanFileName.begin()->first < nCloseTime)
            {
               //가장 최근 결과파일 찾기 성공 [김태현 2019/7/17]
               strFindFile = mapSpanFileName.begin()->second;
               break;
            }
         }
         akFileFinder.clear();
         Sleep(100);
      }
   }
   strFindFile.Format("%s_%s.bin", pData->GetGlassData()->m_strGlassID, pData->GetGlassData()->m_strStepID);
   /* < KEJ 20240621 - #4942 MOD End > */
   if(strFindFile.IsEmpty()) return FALSE;
   strcpy(pData->GetGlassData()->m_strFileName, strFindFile.GetBuffer(0));
@@ -234,7 +402,7 @@
   pData->GetGlassData()->m_strFileName;
   strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWDFS_PATH);
   if(1) ReadMuraFile(pData);
   //if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
     if(WriteAOIFile(pData) == FALSE)
        return FALSE;
@@ -262,6 +430,7 @@
BOOL CGlassRawCPJT::SequenceFtpUpload(char* pRawFilePathName)
{
   AKLOG(" Sequence : FTP Upload Signal Start ");
   // Manual Upload 기능 [21-02-05 KJG]
   CTime tmFileCreate;
   _grmGlassData GlassData;
@@ -334,7 +503,7 @@
   
   fclose(pf);
   AKLOG(" Sequence : FTP Upload Signal End ");
   return TRUE;
}
@@ -345,7 +514,10 @@
   
   bResult &= MakeAOIFile(pData);
   
   m_GlassRawAna.MakeAnaFile(pData);
   /* < KJG 20240620 - #4942 MOD Start >*/
   //m_GlassRawAna.MakeAnaFile(pData);
   m_GlassRawAna.MakeAnaFile(pData, LOCAL_AOI_DEFECT_INFO_FILE_PATH);
   /* < KJG 20240620 - #4942 MOD End > */
   //m_GlassRawRTMS.WriteAOIFile(pData);
   AKLOG("WriteAOIFile Complete");
@@ -370,7 +542,7 @@
   }
   
   strFilePathName.Format("%s\\%s", pGlass->m_strPath, strFileName);//pGlass->m_strFileName);
   //strFilePathName.Format("C:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
   //strFilePathName.Format("D:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
   
   // 글라스 ID만 존재하여 재검사 시 파일 생성 실패. 삭제한다
   DeleteFile(strFilePathName);
@@ -398,26 +570,41 @@
   //////////////////////////////////////////////////////////////////////////
   //GLASSDATA
   {
      makeDataGlass(strLine, pGlass);
      /*< KJG 20211229 - #3846 MOD Start >*/
      //makeDataGlass(strLine, pGlass);
      makeDataGlass(strLine, pData, pGlass);
      /*< KJG 20211229 - #3846 MOD End >*/
      fprintf(pf, "%s\n", strLine.GetBuffer(0));
   }
   
   //////////////////////////////////////////////////////////////////////////
   //CELL & DEFECT DATA
   /* < KJG 20221110 - #4373 ADD Start >*/
   vector<_grmCellData*> vtSortCellData;
   for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
      vtSortCellData.push_back(pData->GetCellData(iCell));
   sort(vtSortCellData.begin(), vtSortCellData.end(), CellIDSortFunc);
   /* < KJG 20221110 - #4373 ADD End >*/
   {
      //make
      {
         for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
         {
            _grmCellData* pCell = pData->GetCellData(iCell);
            /* < KJG 20221110 - #4373 MOD Start >*/
            //_grmCellData* pCell = pData->GetCellData(iCell);
            _grmCellData* pCell = vtSortCellData[iCell];
            /* < KJG 20221110 - #4373 MOD End >*/
            makeDataCell(strLine, pData, pCell);
            fprintf(pf, "%s\n", strLine);
            for (int iDefect = 0; iDefect < pData->GetGlassData()->m_nDefectNum; iDefect++)
            {
               _grmDefectData* pDefect = pData->GetDefectData(iDefect);
               if (pDefect->m_nCellIdx != iCell) continue;
               /* < KJG 20221110 - #4373 MOD Start >*/
               //if (pDefect->m_nCellIdx != iCell) continue;
               if (pDefect->m_nCellIdx != pCell->m_nCellID) continue;
               /* < KJG 20221110 - #4373 MOD End >*/
               //210203 CJH - CutOff 대상 결과파일 작성 제외
               if (pDefect->m_bDefectCutoff == TRUE) continue;
@@ -444,21 +631,47 @@
{
   strLine.Empty();
   CString strValue;
   strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR TB TW RB RW T_STACK MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT BR_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT"; //53ea
   /*< KJG 20211229 - #3846 MOD Start >*/
   //strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT";
/* < KMH 20220613 : #3957 MOD Start > */
   /* <LJC 20220425 : #3957 MOD Start> */
   // strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea
   strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; //56ea
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      CString strDefectCode = pGlassData->m_strRawDefectCode[i];
      if (strDefectCode == "") { strDefectCode = "*"; }
      strValue += " " + strDefectCode;
   }
   /* <LJC 20220425 : #3957 MOD End> */
/* < KMH 20220613 : #3957 MOD End > */
   /*< KJG 20211229 - #3846 MOD End >*/
   strValue += _T(" B_DEFECT"); /* < KJG 20240620 - #4942 ADD >*/
   strLine += strValue; strLine += "\n";
   strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT PRO_IMAGE AVG_GRAY_0 PORTION_0 CORNER_GRAY_0 AVG_AMP_0 FFT_VAR_0 FFT_VAH_0 FFT_VAQ_0 FFT_PK_0 AVG_GRAY_1 PORTION_1 CORNER_GRAY_1 AVG_AMP_1 FFT_VAR_1 FFT_VAH_1 FFT_VAQ_1 FFT_PK_1 AVG_GRAY_2 PORTION_2 CORNER_GRAY_2 AVG_AMP_2 FFT_VAR_2 FFT_VAH_2 FFT_VAQ_2 FFT_PK_2 AVG_GRAY_3 PORTION_3 CORNER_GRAY_3 AVG_AMP_3 FFT_VAR_3 FFT_VAH_3 FFT_VAQ_3 FFT_PK_3"; //54ea 21-06-21 Mura Data 추가
/* < KMH 20220614 : #3957 MOD Start > */
   /* <LJC 20220425 : #3957 MOD Start> */
   //strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */
   strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //56ea
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      CString strDefectCode = pGlassData->m_strRawDefectCode[i];
      if (strDefectCode == "") { strDefectCode = "*"; }
      strValue += " " + strDefectCode;
   }
   /* <LJC 20220425 : #3957 MOD End> */
/* < KMH 20220614 : #3957 MOD End > */
   strLine += strValue; strLine += "\n";
   //210405
   //ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE DSC_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG SCAN_AI REVIEW_AI INS_MODE INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK
   strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE DSC_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea
   strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE LINE_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea
   strLine += strValue;
}
#define SPRINTRAWSTART char strItemValue[1024];int nItemValueLen, nItemValuePos = 0;memset(strItemValue, ' ', sizeof(char)*1024)
#define SPRINTRAW(ITEMSIZE, fmt, ...) nItemValueLen = sprintf(strItemValue+nItemValuePos, fmt,##__VA_ARGS__); strItemValue[nItemValuePos+ nItemValueLen] = ' ';nItemValuePos+=ITEMSIZE+1
#define SPRINTRAWEND strItemValue[nItemValuePos - 1] = 0; strLine = strItemValue
void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
/*< KJG 20211229 - #3846 MOD Start >*/
//void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
void CGlassRawCPJT::makeDataGlass( CString& strLine, CgrmGlassRawData* pData, _grmGlassData* pGlassData )
/*< KJG 20211229 - #3846 MOD End >*/
{
   SPRINTRAWSTART;
@@ -513,7 +726,7 @@
   46   12   PAD_DATA      // PAD Data 불량 수
   47   12   M_DEFECT      // MASK 불량 수
   48   12   C_DEFECT      // COMMON 불량
   49   12   BR_DEFECT      // SCRATCH 불량 수
   49   12   BR_DEFECT      // SCRATCH 불량 수 => LN_DEFECT // 라인성 불량 수
   50   12   CRACK         // Crack 불량 수 - Image 촬상 갯수
   51   12   P_SHIFT         // Pattern Shift 불량 수 - 레시피 이름
   */
@@ -690,13 +903,22 @@
      , pGlassData->m_tmInspectionStart.GetSecond());
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 23   14  E_TIME      // Stage에서 검사/계측 종료된 시각
   /* < KEJ 20240408 - #4808 MOD Start > */
//    strValue.Format("%04d%02d%02d%02d%02d%02d"         // E_TIME
//       , pGlassData->m_tmReviewEnd.GetYear()
//       , pGlassData->m_tmReviewEnd.GetMonth()
//       , pGlassData->m_tmReviewEnd.GetDay()
//       , pGlassData->m_tmReviewEnd.GetHour()
//       , pGlassData->m_tmReviewEnd.GetMinute()
//       , pGlassData->m_tmReviewEnd.GetSecond());
   strValue.Format("%04d%02d%02d%02d%02d%02d"         // E_TIME
      , pGlassData->m_tmReviewEnd.GetYear()
      , pGlassData->m_tmReviewEnd.GetMonth()
      , pGlassData->m_tmReviewEnd.GetDay()
      , pGlassData->m_tmReviewEnd.GetHour()
      , pGlassData->m_tmReviewEnd.GetMinute()
      , pGlassData->m_tmReviewEnd.GetSecond());
      , pGlassData->m_tmInspectionEND.GetYear()
      , pGlassData->m_tmInspectionEND.GetMonth()
      , pGlassData->m_tmInspectionEND.GetDay()
      , pGlassData->m_tmInspectionEND.GetHour()
      , pGlassData->m_tmInspectionEND.GetMinute()
      , pGlassData->m_tmInspectionEND.GetSecond());
   /* < KEJ 20240408 - #4808 MOD End > */
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 24   6   T_DEFECT      // Common Item 1 - Total Defect Count   
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNum - pGlassData->m_nCutOffDefectNum); //210203 CJH - Cutoff 결함은 전체개수에서 제외해준다.
@@ -704,26 +926,39 @@
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeTR);
   // 26   6   PR      // Panel 정보 03   
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgePR);
   // 27   6   TB      // Panel 정보 04
   // 27   6   NG      // Panel 정보 04
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeNG); /* <KYH 211129 : #3796 ADD Start> */
   // 28   6   TB      // Panel 정보 04
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTB);
   // 28   6   TW      // Panel 정보 05
   // 29   6   TW      // Panel 정보 05
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTW);
   // 29   6   RB      // Panel 정보 06
   // 30   6   RB      // Panel 정보 06
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRB);
   // 30   6   RW      // Panel 정보 07
   // 31   6   RW      // Panel 정보 07
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRW);
   // 31   6   T_STACK      // Panel 정보 08   SD+SP 수 입력
   // 32   6   T_STACK      // Panel 정보 08   SD+SP 수 입력
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSD + pGlassData->m_nDefectNumStackSP);
   //32   6   BMDF       // Panel 정보 09 -> 변경 MAX_AVG_GRAY 04/12 nwh
   if (strlen(pGlassData->m_strMaxAvgGray) == 0)
   // 33   6   NO_DEFECT   // Panel 정보 09
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeND); /* <KYH 211129 : #3796 ADD Start> */
   //34   6   BMDF       // Panel 정보 10 -> 변경 MAX_AVG_GRAY 04/12 nwh
   /*< KJG 20211229 - #3846 MOD Start >*/
   //if (strlen(pGlassData->m_strMaxAvgGray) == 0)
   //{
   //   SPRINTRAW(12, "*");
   //}
   //else
   //{
   //   SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
   //}
   int nMaxCellNG = 0;
   for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
   {
      SPRINTRAW(12, "*");
      _grmCellData* pCell = pData->GetCellData(iCell);
      nMaxCellNG = max(nMaxCellNG, pCell->m_nDefectNumJudgeNG);
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
   }
   // 33   6   CJ         // Panel 정보 10 -> 변경 MAX_PORTION  04/12 nwh
   SPRINTRAW(12, "%d", nMaxCellNG);
   /*< KJG 20211229 - #3846 MOD End >*/
   // 35   6   CJ         // Panel 정보 11 -> 변경 MAX_PORTION  04/12 nwh
   if (strlen(pGlassData->m_strMaxPortion) == 0)
   {
      SPRINTRAW(12, "*");
@@ -732,15 +967,15 @@
   {
      SPRINTRAW(12, "%s", pGlassData->m_strMaxPortion);
   }
   // 34   6   OK_CELL      // OK Cell Count
   // 36   6   OK_CELL      // OK Cell Count
   SPRINTRAW(12, "*");
   // 35   6   RJ_CELL      // RJ Cell Count
   // 37   6   RJ_CELL      // RJ Cell Count
   SPRINTRAW(12, "*");
   // 36   6   RW_CELL      // RW Cell Count
   // 38   6   RW_CELL      // RW Cell Count
   SPRINTRAW(12, "*");
   // 37   6   NR_CELL      // NR Cell Count
   // 39   6   NR_CELL      // NR Cell Count
   SPRINTRAW(12, "*");
   // 38   6   MASK_CELL      // MASK Cell Count   //201215 CJH - CSTID로 변경
   // 40   6   MASK_CELL      // MASK Cell Count   //201215 CJH - CSTID로 변경
   if (strlen(pGlassData->m_strCSTID) == 0)
   {
      SPRINTRAW(12, "*");
@@ -770,8 +1005,12 @@
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeMD);
   // 48   6   C_DEFECT      // COMMON 불량   
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeCD);
   /*< LHS 20211029 - #3783 MOD Start >*/
   // 49   6   S_DEFECT      // SCRATCH 불량 수   
   SPRINTRAW(12, "*");
   //SPRINTRAW(12, "*");
   // 49   6   LN_DEFECT      // Line 불량 수
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeLine);
   /*< LHS 20211029 - #3783 MOD End >*/
   // 50   6   CRACK      // Crack 불량 수   //201217 CJH - Image 촬상 개수로 변경
   //SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
   SPRINTRAW(12, "%d", pGlassData->m_nReviewNum);
@@ -810,6 +1049,31 @@
      SPRINTRAW(12, "UNUSE");
   }
   if (pGlassData->m_bEdgeCrackUse)
   {
      SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
   }
   else
   {
      SPRINTRAW(12, "UNUSE");
   }
   /* <LJC 20220425 : #3957 ADD Start> */
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      if (pGlassData->m_nDefectCode[i] >= 0)
      {
         SPRINTRAW(12, "%d", pGlassData->m_nDefectCode[i]);
      }
      else
      {
         SPRINTRAW(12, "*");
      }
   }
   /* <LJC 20220425 : #3957 ADD End> */
   // B_DEFECT(Before T_DEFECT) 필터링 전 결함 수량
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNum); /* < KJG 20240620 - #4942 ADD >*/
   SPRINTRAWEND;   //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
}
@@ -839,7 +1103,7 @@
   19 12  PAD_DATA         // PAD Data Defect Count
   20 12  M_DEFECT         // MASK Defect Count
   21 12  C_DEFECT         // COMMON Defect Count
   22 12  S_DEFECT         // SCRATCH Defect Count
   22 12  S_DEFECT         // SCRATCH Defect Count   ==> LN_DEFECT
   23 12  CRACK            // CRACK Defect Count
   24 12  P_SHIFT         // Pattern Shift Defect Count
   */
@@ -850,7 +1114,10 @@
   SPRINTRAW(8, "SUBPANEL");
   // 03 12 SUBPANELID         // Subpanel ID
   //SPRINTRAW(12, "%d", pCellData->m_nCellID);
   SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]);
   /* < KMH 20220609 : #4183 MOD Start > */
   //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]);
   SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pCellData->m_strCellName);
   /* < KMH 20220609 : #4183 MOD End > */
   
   // 글라스 원점 기준 Y좌표 반대 
   // 코너컷 기준으로 결과파일 좌표가 생성되는데 고객사에 명확한 확인 필요
@@ -912,337 +1179,42 @@
   // 21 6  C_DEFECT         // COMMON Defect Count
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeCD);
   // 22 6  S_DEFECT  -> 22 6  PRO_IMAGE 변경    nwh0404
   if (strlen(pCellData->m_strProImage))
   {
      SPRINTRAW(12, "%s", pCellData->m_strProImage);
   }
   else
   {
      SPRINTRAW(12,"*");
   }
   /* <KYH 211129 : #3796 MOD Start> */
   // 23 12  AVG_GRAY_0
   if (strlen(pCellData->m_strAvgGray_0))
   // 22 6  PRO_IMAGE  -> LN_DEFECT 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeLine);
   // 23 6  AVG_GRAY  -> TR 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeTR);
   // 24 6  PORTION  -> PR 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgePR);
   // 25 6  CORNER_GRAY  -> NG 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeNG);
   // 26 6  AVG_AMP  -> RB 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRB);
   // 27 6  FFT_VAR  -> RW 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRW);
   // 28 6  TB 추가
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTB); //KYH TB 데이터 추가
   // 29 6  TW 추가
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTW); //KYH TW 데이터 추가
   // 30 6  FFT_VEH  -> T_STACK 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectSDCount + pCellData->m_nDefectSPCount);
   // 31 6  NO_DEFECT 추가
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeND); //KYH ND 데이터 추가
   /* <KYH 211129 : #3796 MOD End> */
   /* <LJC 20220425 : #3957 ADD Start> */
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_0);
      if (pCellData->m_nDefectCode[i] >= 0)
      {
         SPRINTRAW(12, "%d", pCellData->m_nDefectCode[i]);
      }
      else
      {
         SPRINTRAW(12, "*");
      }
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 24 12 PORTION_0
   if (strlen(pCellData->m_strPortion_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 25 12 CORNER_GRAY_0
   if (strlen(pCellData->m_strCorner_Gray_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 26 12 AVG_AMP_0
   if (strlen(pCellData->m_strAvgAmp_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 27 12 FFT_VAR_0
   if (strlen(pCellData->m_strFFTVar_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 28 12 FFT_VAH_0
   if (strlen(pCellData->m_strFFTVah_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 29 12 FFT_VAQ_0
   if (strlen(pCellData->m_strFFTVaq_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 30 12 FFT_PK_0
   if (strlen(pCellData->m_strFFTPK_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 31 12  AVG_GRAY_1
   if (strlen(pCellData->m_strAvgGray_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 32 12 PORTION_1
   if (strlen(pCellData->m_strPortion_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 33 12 CORNER_GRAY_1
   if (strlen(pCellData->m_strCorner_Gray_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 34 12 AVG_AMP_1
   if (strlen(pCellData->m_strAvgAmp_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 35 12 FFT_VAR_1
   if (strlen(pCellData->m_strFFTVar_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 36 12 FFT_VAH_1
   if (strlen(pCellData->m_strFFTVah_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 37 12 FFT_VAQ_1
   if (strlen(pCellData->m_strFFTVaq_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 38 12 FFT_PK_1
   if (strlen(pCellData->m_strFFTPK_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 39 12  AVG_GRAY_2
   if (strlen(pCellData->m_strAvgGray_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 40 12 PORTION_2
   if (strlen(pCellData->m_strPortion_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 41 12 CORNER_GRAY_2
   if (strlen(pCellData->m_strCorner_Gray_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 42 12 AVG_AMP_2
   if (strlen(pCellData->m_strAvgAmp_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 43 12 FFT_VAR_2
   if (strlen(pCellData->m_strFFTVar_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 44 12 FFT_VAH_2
   if (strlen(pCellData->m_strFFTVah_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 45 12 FFT_VAQ_2
   if (strlen(pCellData->m_strFFTVaq_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 46 12 FFT_PK_2
   if (strlen(pCellData->m_strFFTPK_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 47 12  AVG_GRAY_3
   if (strlen(pCellData->m_strAvgGray_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 48 12 PORTION_3
   if (strlen(pCellData->m_strPortion_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   //kyh 0622
   // 49 12 CORNER_GRAY_3
   if (strlen(pCellData->m_strCorner_Gray_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 50 12 AVG_AMP_3
   if (strlen(pCellData->m_strAvgAmp_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 51 12 FFT_VAR_3
   if (strlen(pCellData->m_strFFTVar_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVar_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 52 12 FFT_VAH_3
   if (strlen(pCellData->m_strFFTVah_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVah_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 53 12 FFT_VAQ_3
   if (strlen(pCellData->m_strFFTVaq_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 54 12 FFT_PK_3
   if (strlen(pCellData->m_strFFTPK_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strFFTPK_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   /* <LJC 20220425 : #3957 ADD End> */
   SPRINTRAWEND;   //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
}
@@ -1269,7 +1241,7 @@
      // 16   2    STACK_COUNT   // Count of Defect detected step
      // 17   60   STACK_STEP      // Flow(Step) of defect detection
      // 18   16   IMAGE_FILE      // Image file Name
      // 19   12   DSC Code
      // 19   12   DSC Code      ==> LINE_CODE
      // 20   12   Image 분류 Code
      // 21   12   불량이 위치한 Zone No 입력
      // 22   12   불량 크기 (L,H,M,S)
@@ -1300,7 +1272,10 @@
   // 02   6    DEFECT         // DEFECT
   SPRINTRAW(6, "DEFECT");
   // 03   12   ID            // Subpanel ID
   SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]);
   /* < KMH 20220609 : #4183 MOD Start > */
   //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]);
   SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pDefectData->m_strCellName);
   /* < KMH 20220609 : #4183 MOD End > */
   // 04   5    DEF_NO         // Defect Number of Panel
   // RAW 파일용 Defect Index 
   //SPRINTRAW(5, "%d", pDefectData->m_nDefectIdx);
@@ -1392,10 +1367,13 @@
   }
   // 16   2    STACK_COUNT   // Count of Defect detected step
   SPRINTRAW(2, "%2d", pDefectData->m_nStackStepCount);
   // 17   60   STACK_STEP      // Flow(Step) of defect detection
   // 17   60 -> 400   STACK_STEP      // Flow(Step) of defect detection
   if (strlen(pDefectData->m_strStackFirst))
   {
      SPRINTRAW(60, "%s", pDefectData->m_strStackFirst);
      /* < KMH 20220712 : #4230 MOD Start > */
      //SPRINTRAW(60, "%s", pDefectData->m_strStackFirst);
      SPRINTRAW(400, "%s", pDefectData->m_strStackFirst);
      /* < KMH 20220712 : #4230 MOD End > */
   }
   else
   {
@@ -1411,8 +1389,18 @@
   {
      SPRINTRAW(16, "*");
   }
   // 19   12    DSC_CODE      // Common 01 DSC Code
   /*< LHS 20211029 - #3783 MOD Start >*/
   // 19   12    DSC_CODE      // Common 01 DSC Code  ==> LINE_CODE
   if (strlen(pDefectData->m_strLNDefectCode))
   {
      SPRINTRAW(12, "%s", pDefectData->m_strLNDefectCode);
   }
   else
   {
   SPRINTRAW(12, "*");
   }
   //SPRINTRAW(12, "*");
   /*< LHS 20211029 - #3783 MOD End >*/
   // 20   12    VC_CODE      // Common 02 Image 분류 Code
   SPRINTRAW(12, "*");
   // 21   12    ZONE_NO      // Common 03 불량이 위치한 Zone No 입력
@@ -1530,13 +1518,13 @@
      SPRINTRAW(12, "*");
   }
   // 32 NO USE -> CCD Image 유무
   if (strlen(pDefectData->m_strAoiImageName))
   if (strrchr(pDefectData->m_strAoiImageName, '*') != NULL || strlen(pDefectData->m_strAoiImageName) < 4) // KYH 210826 CCD 이미지 문자열에서 *이 있을경우 X 머지할것
   {
      SPRINTRAW(12, "O");
      SPRINTRAW(12, "X");
   }
   else
   {
      SPRINTRAW(12, "X");
      SPRINTRAW(12, "O");
   }
   // 33   12    CAM_POSITION   // Common 15 Scan 번호
   SPRINTRAW(12, "%d", pDefectData->m_nScanIdx);
@@ -1760,10 +1748,10 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 30000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      AKLOG(" FunCtion FTP :  RAW File Upload Signal Fail[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */
   else
      AKLOG(" FunCtion FTP :  RAW File Upload Signal Sucess[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */
}
void CGlassRawCPJT::SendMessageFTPDownloadStack( _grmGlassData* pGlassData )
@@ -1802,9 +1790,19 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP :  Stack File Download Signal Fail[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP :  Stack File Download Signal Sucess[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP :  Stack File Download Signal Fail[%d]", FTPCMD_STACK);
   else
      AKLOG(" Function FTP :  Stack File Download Signal Success[%d]", FTPCMD_STACK);
      /*< SWK 20220413 - #4053 MOD End >*/
}
void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData )
@@ -1820,7 +1818,7 @@
   char strRTMSFile[32] = {};
   char strServerRawFileSubPath[256] = {};
   char strServer_SubFileName[256] = {};
   /*< KJG 20211024 - #3487 ADD Start >*/
   GetFormatDescription(FTPCMD_RAWMERGE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
   CFTPCopyDataParam upParam;
@@ -1842,9 +1840,20 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP :  RawMerge File Download Signal Sucess[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP :  RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP :  RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);
   else
      AKLOG(" Function FTP :  RawMerge File Download Signal Success[%d]", FTPCMD_RAWMERGE);
      /*< SWK 20220413 - #4053 MOD End >*/
   /*< KJG 20211024 - #3487 ADD End >*/
}
void CGlassRawCPJT::SendMessageFTPUploadImage( _grmGlassData* pGlassData, emFTPCommand sort)
@@ -1883,9 +1892,19 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP : Image Upload Signla Sucess[%d]", sort);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP : Image Upload Signla Fail[%d]", sort);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP : Image Upload Signal Fail[%d]", sort);
   else
      AKLOG(" Function FTP : Image Upload Signal Success[%d]", sort);
      /*< SWK 20220413 - #4053 MOD End >*/
}
  
@@ -1939,9 +1958,20 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP : Index File Upload Signla Sucess[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP : Index File Upload Signla Fail[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP : Index File Upload Signal Fail[%d]", FTPCMD_INDEX);
   else
      AKLOG(" Function FTP : Index File Upload Signal Success[%d]", FTPCMD_INDEX);
      /*< SWK 20220413 - #4053 MOD End >*/
   return TRUE;
}
@@ -2077,12 +2107,13 @@
         sprintf(pServerFile, "%s", strFileName.GetBuffer(0)); 
         sprintf(pLocalFile, "%s", strFileName.GetBuffer(0)); 
         CString strTime;
         CString strServerSubRawFilePath= NULL;
         CString strServerSubRawFileName = NULL;
         {
            strServerSubRawFilePath += NETWORK_AOIRAWFILE_SUB_PATH;
            CString strTime;
            CTime CurrTime = m_tmFileCreateTime;
            strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
               CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
@@ -2118,6 +2149,16 @@
            fprintf(pf, "SUMPATH= \n");
            fclose(pf);
         } 
         /* < KJG 20230220 - #4403 ADD Start >*/
         // BLUE 설비 D_COLL 미보고 원인 분석을 위한 Result_info.ini 파일 백업 생성
         CString strPathBackUpDir, strPathBackUpFile;
         strPathBackUpDir.Format(_T("%s%s"), LOCAL_RAWPATH_INFO_INI_PATH, _T("ResultInfoBackUpFile"));
         strPathBackUpFile.Format(_T("%s_%s.ini"), strGlassID, strTime);
         CreateDirectory(strPathBackUpDir, NULL);
         strPathBackUpFile.Format("%s\\%s", strPathBackUpDir, strPathBackUpFile);
         CopyFile(strRawFilePathName, strPathBackUpFile, FALSE);
         /* < KJG 20230220 - #4403 ADD End >*/
      }
      break;
   case FTPCMD_STACK:
@@ -2134,15 +2175,25 @@
         sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0)); 
      }
      break;
      /*< KJG 20211024 - #3487 ADD Start >*/
   case FTPCMD_RAWMERGE:
   {
      sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strStepID,strGlassIDLevel6th.GetBuffer(0)); // 서버 경로 확인후 수정 kjg
   /* <LJC 20211122 : #3820 ADD Start> */
      char cMergeList[10][12];
      CString strMergeList[10] = {};
      for (int i = 0; i < 10; i++)
   {
         strcpy(cMergeList[i], pGlassData->m_StrMergeList[i]);
         strMergeList[i] = cMergeList[i];
      }
      sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strMergeList[m_nRawMergeIdx],strGlassIDLevel6th.GetBuffer(0)); // 서버 경로 확인후 수정 kjg
      sprintf(pServerFile, "%s",strGlassID);
      /* <LJC 20211122 : #3820 ADD End> */
      sprintf(pLocalPath, "%s", m_RawMergeResult.getRawMergeLocalPath());
      sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
   }
      break;   
      /*< KJG 20211024 - #3487 ADD End >*/
   case FTPCMD_MURA_IMAGE: //0404nwh
   {   //
      /*CTime time = m_tmFileCreateTime;
@@ -2226,6 +2277,10 @@
            break;
         case Judge_PR:         sStr.Format("PR");
            break;
         /* <KYH 220117 : #3796 ADD Start>*/
         case Judge_ND:         sStr.Format("ND");
            break;
         /* <KYH 220117 : #3796 ADD End>*/
         case Judge_PT:         sStr.Format("PT");
            break;
         case Judge_Review:      sStr.Format("RV");
@@ -2238,7 +2293,13 @@
            break;
         case Judge_Rework:      sStr.Format("RW");
            break;
      /* < KMH 20220311 : #3954 ADD Start > */
         case Judge_LN:         sStr.Format("LN");
            break;
      /* < KMH 20220311 : #3954 ADD End > */
         case Judge_Unknown:      sStr.Format("OK");//sStr.Format("Unknown");   //Unknown도 일단 OK
            break;
         case Judge_SR:         sStr.Format("SR"); /* < KJG 20221107 - #4360 ADD >*/
            break;
         default:            sStr.Format("OK");//sStr.Format("Ets");      
            break;
@@ -2270,6 +2331,20 @@
   }
   return sStr;
}
/* <LJC 20211122 : #3820 ADD Start> */
void CGlassRawCPJT::DownLoadMergeFile(CgrmGlassRawData * pData)
{
      SendMessageFTPDownloadDataFile(pData->GetGlassData());
      m_nRawMergeIdx++;
   return;
}
void CGlassRawCPJT::SearchFIle(CgrmGlassRawData * pData)
{
   m_RawMergeResult.ProcessRawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
}
/* <LJC 20211122 : #3820 ADD End> */
CString CGlassRawCPJT::GetWsiDefectType(int nType)
{