| | |
| | | |
| | | // DitGlassRawMessengerDlg.cpp : 구현 파일 |
| | | // DitGlassRawMessengerDlg.cpp : ���� ���� |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | |
| | | #define GRID_TEXT_COLOR RGB(255,255,255) |
| | | #define GRID_ALARM_TEXT_COLOR RGB(255,0,0) |
| | | #define GRID_LINE_COLOR GRID_FIX_COLOR |
| | | // 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다. |
| | | // ���� ���α� ������ ���Ǵ� CAboutDlg ��ȭ �����Դϴ�. |
| | | |
| | | class CAboutDlg : public CDialog |
| | | { |
| | | public: |
| | | CAboutDlg(); |
| | | |
| | | // 대화 상자 데이터입니다. |
| | | // ��ȭ ���� �������Դϴ�. |
| | | enum { IDD = IDD_ABOUTBOX }; |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다. |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV �����Դϴ�. |
| | | |
| | | // 구현입니다. |
| | | // �����Դϴ�. |
| | | protected: |
| | | DECLARE_MESSAGE_MAP() |
| | | }; |
| | |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CDitGlassRawMessengerDlg 대화 상자 |
| | | // CDitGlassRawMessengerDlg ��ȭ ���� |
| | | |
| | | |
| | | |
| | |
| | | m_vecStrGridDefectHeader.push_back("CellY(mm)"); |
| | | m_vecStrGridDefectHeader.push_back("ScrtRatio"); |
| | | m_vecStrGridDefectHeader.push_back("Density"); |
| | | //201207 CJH - Merge 여부 확인 |
| | | //201207 CJH - Merge ���� Ȯ�� |
| | | m_vecStrGridDefectHeader.push_back("MergeState"); |
| | | |
| | | } |
| | |
| | | if (timestruct.tm_mon>11 || timestruct.tm_mon<0 ) |
| | | ASSERT(FALSE); |
| | | } |
| | | // CDitGlassRawMessengerDlg 메시지 처리기 |
| | | // CDitGlassRawMessengerDlg ���� �� |
| | | |
| | | BOOL CDitGlassRawMessengerDlg::OnInitDialog() |
| | | { |
| | | CDialog::OnInitDialog(); |
| | | |
| | | DragAcceptFiles(TRUE); |
| | | // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다. |
| | | // �ý��� ���� "����..." �� ���� �߰��մϴ�. |
| | | |
| | | // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다. |
| | | // IDM_ABOUTBOX�� �ý��� ��� ������ �־�� �մϴ�. |
| | | ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); |
| | | ASSERT(IDM_ABOUTBOX < 0xF000); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는 |
| | | // 프레임워크가 이 작업을 자동으로 수행합니다. |
| | | SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다. |
| | | SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다. |
| | | // �� ��ȭ ������ �������� �����մϴ�. ���� ���α��� �� â�� ��ȭ ���ڰ� �ƴ� ��쿡�� |
| | | // �����ӿ�ũ�� �� �۾��� �ڵ����� �����մϴ�. |
| | | SetIcon(m_hIcon, TRUE); // ū �������� �����մϴ�. |
| | | SetIcon(m_hIcon, FALSE); // ���� �������� �����մϴ�. |
| | | |
| | | //트레이아이콘 구성 |
| | | //Ʈ���̾����� ���� |
| | | m_TrayIcon = FALSE; |
| | | ResTrayIcon(); |
| | | |
| | | //빌드 정보 |
| | | //��� ���� |
| | | { |
| | | CString strBuild; |
| | | tm tmBuild; |
| | |
| | | SetDlgItemText(IDC_BUILDDATE, strBuild); |
| | | } |
| | | |
| | | //설정파일 정보 읽어 오기 [김태현 2018/11/20] |
| | | //�������� ���� �о� ���� [������ 2018/11/20] |
| | | { |
| | | m_strConfigFile; |
| | | { |
| | |
| | | SetDlgItemText(IDC_EDIT_STACK_PARAM2, m_ConfigOption.m_strStackParam2); |
| | | } |
| | | |
| | | //로그 관련 [김태현 2018/11/20] |
| | | //�α� ���� [������ 2018/11/20] |
| | | { |
| | | CakFileUtil fileutil; |
| | | char strPath[256]; |
| | |
| | | |
| | | if(m_Server.CreateServer(m_ConfigOption.m_nMaxDataNumCell, m_ConfigOption.m_nMaxDataNumDefect) == FALSE) |
| | | { |
| | | AfxMessageBox("서버 생성 실패 종료 합니다."); |
| | | AfxMessageBox("���� ���� ���� ���� �մϴ�."); |
| | | exit(0); |
| | | } |
| | | |
| | | //현재값 적용 [김태현 2019/1/12] |
| | | //���簪 ���� [������ 2019/1/12] |
| | | { |
| | | CDitGlassRawServer* pServer = (CDitGlassRawServer*) &m_Server; |
| | | CgrmGlassRawData* pRawDataBuffer = &m_GlassRawDataBuffer; |
| | | pRawDataBuffer->ImportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData()); |
| | | } |
| | | |
| | | //작업 쓰레드 생성 [김태현 2018/11/13] |
| | | //�۾� ������ ���� [������ 2018/11/13] |
| | | { |
| | | _beginthread(threadMain, NULL, this); |
| | | } |
| | | |
| | | PostMessage(UM_GLASSRAW_CLIENTMESSAGE); |
| | | |
| | | return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다. |
| | | return TRUE; // ��Ŀ���� ��Ʈ�ѿ� �������� ������ TRUE�� ��ȯ�մϴ�. |
| | | } |
| | | |
| | | void CDitGlassRawMessengerDlg::OnBnClickedOk() |
| | | { |
| | | // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. |
| | | // TODO: ��� ��Ʈ�� �˸� ó���� �ڵ带 �߰��մϴ�. |
| | | OnOK(); |
| | | } |
| | | |
| | |
| | | { |
| | | NOTIFYICONDATA nid; |
| | | nid.cbSize = sizeof(nid); |
| | | nid.hWnd = m_hWnd; // 메인 윈도우 핸들 |
| | | nid.uID = IDR_MAINFRAME; // 아이콘 리소스 ID |
| | | nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 플래그 설정 |
| | | nid.uCallbackMessage = UM_TRAYICON_MSG; // 콜백메시지 설정 |
| | | nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 아이콘 로드 |
| | | nid.hWnd = m_hWnd; // ���� ������ �ڵ� |
| | | nid.uID = IDR_MAINFRAME; // ������ ���ҽ� ID |
| | | nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // �÷��� ���� |
| | | nid.uCallbackMessage = UM_TRAYICON_MSG; // �ݹ���� ���� |
| | | nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // ������ �ε� |
| | | |
| | | char strTitle[256]; |
| | | GetWindowText(strTitle, sizeof(strTitle)); // 캡션바에 출력된 문자열 얻음 |
| | | GetWindowText(strTitle, sizeof(strTitle)); // ĸ�ǹٿ� ��µ� ���ڿ� ���� |
| | | lstrcpy(nid.szTip, strTitle); |
| | | Shell_NotifyIcon(NIM_ADD, &nid); |
| | | SendMessage(WM_SETICON, (WPARAM)TRUE, (LPARAM)nid.hIcon); |
| | |
| | | GetCursorPos(&pos); |
| | | { |
| | | HMENU hMenu = CreatePopupMenu(); |
| | | AppendMenu(hMenu, MF_STRING, 0, "연구소2파트작품"); |
| | | AppendMenu(hMenu, MF_STRING, 0, "������2��Ʈ��ǰ"); |
| | | AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit"); |
| | | TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, 0, GetSafeHwnd(), NULL); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | // 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면 |
| | | // 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는 |
| | | // 프레임워크에서 이 작업을 자동으로 수행합니다. |
| | | // ��ȭ ���ڿ� �ּ�ȭ ���߸� �߰��� ��� �������� ������ |
| | | // �Ʒ� �ڵ尡 �ʿ��մϴ�. ����/�� ���� ����ϴ� MFC ���� ���α��� ��쿡�� |
| | | // �����ӿ�ũ���� �� �۾��� �ڵ����� �����մϴ�. |
| | | |
| | | void CDitGlassRawMessengerDlg::OnPaint() |
| | | { |
| | | if (IsIconic()) |
| | | { |
| | | CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트 |
| | | CPaintDC dc(this); // ���⸦ ���� ����̽� ���ؽ�Ʈ |
| | | |
| | | SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); |
| | | |
| | | // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다. |
| | | // Ŭ���̾�Ʈ �簢������ �������� ����� ����ϴ�. |
| | | int cxIcon = GetSystemMetrics(SM_CXICON); |
| | | int cyIcon = GetSystemMetrics(SM_CYICON); |
| | | CRect rect; |
| | |
| | | int x = (rect.Width() - cxIcon + 1) / 2; |
| | | int y = (rect.Height() - cyIcon + 1) / 2; |
| | | |
| | | // 아이콘을 그립니다. |
| | | // �������� ���ϴ�. |
| | | dc.DrawIcon(x, y, m_hIcon); |
| | | } |
| | | else |
| | |
| | | } |
| | | } |
| | | |
| | | // 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서 |
| | | // 이 함수를 호출합니다. |
| | | // ����ڰ� �ּ�ȭ�� â�� ��� ���ȿ� Ŀ���� ǥ�õǵ��� �ý��ۿ��� |
| | | // �� �Լ��� ȣ���մϴ�. |
| | | HCURSOR CDitGlassRawMessengerDlg::OnQueryDragIcon() |
| | | { |
| | | return static_cast<HCURSOR>(m_hIcon); |
| | |
| | | void CDitGlassRawMessengerDlg::OnDropFiles(HDROP hDropInfo) |
| | | { |
| | | int nFiles; |
| | | char szPathName[MAX_PATH]; // 파일 경로면이 들어간다. |
| | | char szPathName[MAX_PATH]; // ���� ���� ����. |
| | | CString strFileName; |
| | | |
| | | // 드롭된 파일의 갯수 |
| | | // ��ӵ� ������ ���� |
| | | nFiles = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH ); |
| | | |
| | | for(int i = nFiles-1 ; i >= 0; i--) //드롭된 파일 갯수만큼 루프를 돌면서 파일 경로를 메세지 박스로 출력 |
| | | for(int i = nFiles-1 ; i >= 0; i--) //��ӵ� ���� ������ŭ ������ ���鼭 ���� ��θ� ���� �ڽ��� ��� |
| | | { |
| | | // 파일의 경로 얻어옴 |
| | | // ������ ��� ���� |
| | | ::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH); |
| | | |
| | | SetDlgItemText(IDC_EDIT_RAWFILENAME, szPathName); |
| | |
| | | |
| | | if(pRawInfo->m_nCommandIdxWrite != pRawInfo->m_nCommandIdxRead) |
| | | { |
| | | int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //현재는 읽은 마지막 포인트임으로 하나 증가시켜서 읽는다. [김태현 2018/11/13] |
| | | int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //����� ���� ������ ����Ʈ������ �ϳ� �������Ѽ� �д´�. [������ 2018/11/13] |
| | | _grmDitCommand::_grmCommand* pCommand = &pRawInfo->m_nCommandBuffer[nReadIdx]; |
| | | AKLOG("Recv Command ID:%d(r%d/w%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite); |
| | | pRawInfo->m_nCommandIdxRead = nReadIdx; |
| | | |
| | | if(pCommand->nResult == -1) //명령 수행 전 [김태현 2018/11/13] |
| | | if(pCommand->nResult == -1) //��� ���� �� [������ 2018/11/13] |
| | | { |
| | | pCommand->nResult = ProcessCommand( (emGlassRawCommand)pCommand->nCommand, pCommand->strParam ); |
| | | } |
| | | else |
| | | { |
| | | //이미 처리 된거 [김태현 2018/11/13] |
| | | //�̹� ó�� �Ȱ� [������ 2018/11/13] |
| | | } |
| | | |
| | | AKLOG("Recv Command ID:%d(r%d/w%d) Process End(Result:%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite, pCommand->nResult); |
| | |
| | | { |
| | | nResult = m_pGlassRawMaker->SequenceInspectEnd(pRawDataBuffer); |
| | | pServer->GetGlassRawInfo()->m_ServerProcStep = APS_InspectEnd; |
| | | //Stack 정보를 공유메모리에 반영 하기 위한 Export |
| | | //Stack ������ ������ �ݿ� �ϱ� ���� Export |
| | | //pRawDataBuffer->ExportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData()); |
| | | break; |
| | | } |
| | |
| | | case grcSequenceCustomReviewDataRead: |
| | | { |
| | | nResult = m_pGlassRawMaker->SequenceCustomizeReview(pRawDataBuffer); |
| | | ////Customize Review를 위한 업데이트 |
| | | ////Customize Review�� ���� ������Ʈ |
| | | //{ |
| | | // memcpy(pServer->GetDefectData(0), pRawDataBuffer->GetDefectData(0), sizeof(_grmDefectData)*pServer->GetGlassRawInfo()->m_nDefectMaxDataNum); |
| | | // memcpy(pServer->GetCellData(0), pRawDataBuffer->GetCellData(0), sizeof(_grmCellData)*pServer->GetGlassRawInfo()->m_nCellMaxDataNum); |
| | |
| | | nResult = m_pGlassRawMaker->ReadBinFile(pRawDataBuffer); |
| | | break; |
| | | } |
| | | case grcReviewWriteBIn: |
| | | { |
| | | nResult = m_pGlassRawMaker->ReviewWriteBin(pRawDataBuffer); |
| | | break; |
| | | } |
| | | |
| | | } |
| | | |
| | | PostMessage(UM_GLASSRAW_CLIENTMESSAGE, nCmd); |
| | |
| | | |
| | | if(m_pGlassRawMaker) delete m_pGlassRawMaker; |
| | | |
| | | if(m_TrayIcon) // 현재 트레이 아이콘으로 설정되었는지 확인 |
| | | if(m_TrayIcon) // ���� Ʈ���� ���������� �����Ǿ����� Ȯ�� |
| | | { |
| | | NOTIFYICONDATA nid; |
| | | nid.cbSize = sizeof(nid); |
| | | nid.hWnd = m_hWnd; // 메인 윈도우 핸들 |
| | | nid.hWnd = m_hWnd; // ���� ������ �ڵ� |
| | | nid.uID = IDR_MAINFRAME; |
| | | |
| | | // 작업 표시줄(TaskBar)의 상태 영역에 아이콘을 삭제한다. |
| | | // �۾� ǥ����(TaskBar)�� ���� ������ �������� �����Ѵ�. |
| | | Shell_NotifyIcon(NIM_DELETE, &nid); |
| | | } |
| | | |
| | |
| | | |
| | | BOOL CDitGlassRawMessengerDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) |
| | | { |
| | | // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. |
| | | // TODO: ��� Ư��ȭ�� �ڵ带 �߰� ��/�Ǵ� �⺻ Ŭ������ ȣ���մϴ�. |
| | | if (m_gridCellInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridCellInfo.GetDlgCtrlID()) |
| | | { |
| | | *pResult = 1; |
| | |
| | | CString str; |
| | | strItem = _T(" "); |
| | | |
| | | // Panel x축, y축은 글라스와 반대 [6/9/2017 bhs] |
| | | // Panel x��, y���� �۶� �ݴ� [6/9/2017 bhs] |
| | | if(1)//g_pBasic->GetScanCoordination() == SC_XCoord) |
| | | str.Format("% 5.3f", (double)pDefect->m_nUMCellX / 1000.0); |
| | | else |
| | |
| | | CString str; |
| | | strItem = _T(" "); |
| | | |
| | | // Panel x축, y축은 글라스와 반대 [6/9/2017 bhs] |
| | | // Panel x��, y���� �۶� �ݴ� [6/9/2017 bhs] |
| | | if(1)//g_pBasic->GetScanCoordination() == SC_XCoord) |
| | | str.Format("% 5.3f", (double)pDefect->m_nUMCellY / 1000.0); |
| | | else |
| | |
| | | |
| | | void CDitGlassRawMessengerDlg::OnBnClickedBtnImportRaw() |
| | | { |
| | | AKLOG("이기능은 가급적 필요가 있겠나.. 싶으네..."); |
| | | AKLOG("�̱���� ������ �ʿ䰡 �ְڳ�.. ������..."); |
| | | PostMessage(UM_GLASSRAW_CLIENTMESSAGE); |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | |
| | | CString str = _T("All(*.*)|*.*|"); // 선택할 파일 종류 |
| | | CString str = _T("All(*.*)|*.*|"); // ������ ���� ���� |
| | | CString File; |
| | | CString strFileList; |
| | | |
| | | CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, str, this); |
| | | |
| | | const int c_cMaxFiles = 400 /*선택할 파일 숫자*/ ; // 메모리 부족현상으로 확장 안해주면 몇개 못씀 |
| | | const int c_cMaxFiles = 400 /*������ ���� ����*/ ; // �� ������������ Ȯ�� �����ָ� � ���� |
| | | const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1; |
| | | dlg.GetOFN().lpstrFile = strFileList.GetBuffer(c_cbBuffSize); |
| | | dlg.GetOFN().nMaxFile = c_cbBuffSize; |
| | |
| | | { |
| | | for(POSITION pos=dlg.GetStartPosition(); pos != NULL;) |
| | | { |
| | | // 전체삭제는 ResetContent |
| | | // ��ü������ ResetContent |
| | | File = dlg.GetNextPathName(pos); |
| | | |
| | | |