// DlgMotorOffSetTool.cpp: 구현 파일 // #include "stdafx.h" #include "ReviewSystem.h" #include "DlgMotorOffSetTool.h" #include #include "afxdialogex.h" #include "CHCommonClasses/MacroFile.h" BOOL CMotorOffsetData::CalcOffset(_Inout_ double& GlassPosX, _Inout_ double& GlassPosY) { auto Xitem = upper_bound(m_vtXRange.begin(), m_vtXRange.end(), GlassPosX); auto Yitem = upper_bound(m_vtYRange.begin(), m_vtYRange.end(), GlassPosY); double dXpos, dYpos, dRangeX, dRangeY; int nXIndex = 0; int nYIndex = 0; // X 예외처리 if (Xitem == m_vtXRange.begin()) { dRangeX = 0; nXIndex = 0; } else if (Xitem == m_vtXRange.end()) { Xitem = m_vtXRange.end() - 1; dRangeX = *(Xitem - 1); nXIndex = GetRangeCountX() - 1; } else { dRangeX = *(Xitem - 1); nXIndex = (Xitem)-m_vtXRange.begin(); } // Y 예외처리 추가 if (Yitem == m_vtYRange.begin()) { dRangeY = 0; nYIndex = 0; } else if (Yitem == m_vtYRange.end()) { Yitem = m_vtYRange.end() - 1; dRangeY = *(Yitem - 1); nYIndex = GetRangeCountY() - 1; } else { dRangeY = *(Yitem - 1); nYIndex = (Yitem)-m_vtYRange.begin(); } MotorOffSetInfo pOffsetInfo = m_mapOffsetInfo[nXIndex][nYIndex]; dXpos = floor((pOffsetInfo.dXoffSetValue * 1000)) / 1000.0; dYpos = floor((pOffsetInfo.dYoffSetValue * 1000)) / 1000.0; GlassPosX = GlassPosX + dXpos; GlassPosY = GlassPosY + dYpos; // g_pLog->DisplayMessage(_T("Motor 오프셋으로 적용, 행별 오프셋: X = %.3lf, Y = %.3lf Rate : X = %.3lf, Y = %.3lf "), dXpos, dYpos, pOffsetInfo.dXRate, pOffsetInfo.dYRate); return TRUE; } //setter void CMotorOffsetData::SetRangeCountX(_In_ unsigned int nCount) { m_vtXRange.resize(nCount); m_vtXRange; } void CMotorOffsetData::SetRangeCountY(_In_ unsigned int nCount) { m_vtYRange.resize(nCount); } BOOL CMotorOffsetData::SetRangeX(_In_ unsigned int nIdx, _In_ double fX) //exception need { if (m_vtXRange.size() <= nIdx) return FALSE; m_vtXRange[nIdx] = fX; return TRUE; } BOOL CMotorOffsetData::SetRangeY(_In_ unsigned int nIdx, _In_ double fY) { if (m_vtYRange.size() < nIdx) return FALSE; m_vtYRange[nIdx] = fY; return TRUE; } BOOL CMotorOffsetData::SetOffsetValue(_In_ unsigned int nXIndex, _In_ unsigned int nYIndex, _In_ MotorOffSetInfo pOffsetInfo) { m_mapOffsetInfo[(nXIndex)][(nYIndex)] = pOffsetInfo; return TRUE; } //getter int CMotorOffsetData::GetRangeCountX() { return m_vtXRange.size(); } int CMotorOffsetData::GetRangeCountY() { return m_vtYRange.size(); } double CMotorOffsetData::GetRangeX(_In_ unsigned int nIdx) { if (nIdx > m_vtXRange.size()) return 0; return m_vtXRange[nIdx]; } //exception need double CMotorOffsetData::GetRangeY(_In_ unsigned int nIdx) { if (nIdx > m_vtYRange.size()) return 0; return m_vtYRange[nIdx]; } MotorOffSetInfo CMotorOffsetData::GetOffsetValue(_In_ int nXIndex, _In_ int nYIndex) { MotorOffSetInfo pTemp; if (nXIndex > m_vtXRange.size() || nYIndex > m_vtYRange.size()) return pTemp; return m_mapOffsetInfo[nXIndex][nYIndex]; } // File Access BOOL CMotorOffsetData::WriteConfigFile(int nIdx) { BOOL bReturn = FALSE; CMacroFile macroFile; macroFile.Clear(); CString strItem = _T(""); CString strData; double dData = 0; CString strFilePath; strFilePath.Format(_T("%s\\%s_%d.cfg"), _REVIEW_SERVER_CONFIG_PATH_, MOTOR_OFFSET_CONFIGFILE_DEFAULT_NAME, nIdx); int nXRangeIndex = 0; int nYRangeIndex = 0; if (m_vtXRange.empty() && m_vtYRange.empty()) return FALSE; nXRangeIndex = GetRangeCountX(); nYRangeIndex = GetRangeCountY(); strItem.Format(_T("%d_XRANGE_COUNT"), nIdx); macroFile.SetItem(strItem, nXRangeIndex); for (int nIdex = 0; nIdex < nXRangeIndex; nIdex++) { strItem.Format(_T("%d_X_RANGE_%d"), nIdx, nIdex); dData = GetRangeX(nIdex); macroFile.SetItem(strItem, dData); } strItem.Format(_T("%d_YRANGE_COUNT"), nIdx); macroFile.SetItem(strItem, nYRangeIndex); // fot loop for (int nIdex = 0; nIdex < nYRangeIndex; nIdex++) { strItem.Format(_T("%d_Y_RANGE_%d"), nIdx, nIdex); dData = GetRangeY(nIdex); macroFile.SetItem(strItem, dData); } for (int nXposIndex = 0; nXposIndex < nXRangeIndex; nXposIndex++) { for (int nYposIndex = 0; nYposIndex < nYRangeIndex; nYposIndex++) { MotorOffSetInfo pOffsetInfo; pOffsetInfo = GetOffsetValue(nXposIndex, nYposIndex); strItem.Format(_T("[%d][%d][%d]_X"),nIdx, nXposIndex, nYposIndex); dData = pOffsetInfo.dXoffSetValue; macroFile.SetItem(strItem, dData); strItem.Format(_T("[%d][%d][%d]_Y"),nIdx, nXposIndex, nYposIndex); dData = pOffsetInfo.dYoffSetValue; macroFile.SetItem(strItem, dData); } } bReturn = macroFile.Write(strFilePath); return bReturn; } BOOL CMotorOffsetData::ReadConfigFile(int nIdx) { CString strPath = _T(""); strPath.Format(_T("%s\\%s_%d.cfg"), _REVIEW_SERVER_CONFIG_PATH_, MOTOR_OFFSET_CONFIGFILE_DEFAULT_NAME, nIdx); if (LoadInfo(strPath, nIdx) == FALSE) { return FALSE; } return TRUE; } BOOL CMotorOffsetData::LoadInfo(CString strFilePath, int nIdx) { CMacroFile macroFile; if (!macroFile.Read(strFilePath)) return FALSE; CString strItem = _T(""); int nXRangeIndex = 0; int nYRangeIndex = 0; double nXRange = 0; double nYRange = 0; MotorOffSetInfo pOffsetInfo; memset(&pOffsetInfo, 0, sizeof(MotorOffSetInfo)); double dXoffSetValue = 0; double dYoffSetValue = 0; double dXRate = 0; double dYRate = 0; CString strTmp; strTmp.Format(_T("%d_XRANGE_COUNT"), nIdx); macroFile.GetItem(strTmp, nXRangeIndex, 0); strTmp.Format(_T("%d_YRANGE_COUNT"), nIdx); macroFile.GetItem(strTmp, nYRangeIndex, 0); SetRangeCountX(nXRangeIndex); SetRangeCountY(nYRangeIndex); for (int nIdex = 0; nIdex < nXRangeIndex; nIdex++) { strItem.Format(_T("%d_X_RANGE_%d"),nIdx, nIdex); macroFile.GetItem(strItem, nXRange); SetRangeX(nIdex, nXRange); } for (int nIdex = 0; nIdex < nYRangeIndex; nIdex++) { strItem.Format(_T("%d_Y_RANGE_%d"),nIdx, nIdex); macroFile.GetItem(strItem, nYRange); SetRangeY(nIdex, nYRange); } for (int nXposIndex = 0; nXposIndex < nXRangeIndex; nXposIndex++) { for (int nYposIndex = 0; nYposIndex < nYRangeIndex; nYposIndex++) { strItem.Format(_T("[%d][%d][%d]_X"),nIdx, nXposIndex, nYposIndex); macroFile.GetItem(strItem, dXoffSetValue); pOffsetInfo.dXoffSetValue = dXoffSetValue; strItem.Format(_T("[%d][%d][%d]_Y"),nIdx, nXposIndex, nYposIndex); macroFile.GetItem(strItem, dYoffSetValue); pOffsetInfo.dYoffSetValue = dYoffSetValue; SetOffsetValue(nXposIndex, nYposIndex, pOffsetInfo); } } return TRUE; }; // CDlgMotorOffSetTool 대화 상자 IMPLEMENT_DYNAMIC(CDlgMotorOffSetTool, CDialogEx) CDlgMotorOffSetTool::CDlgMotorOffSetTool(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DLG_MOTOR_OFFSET_TOOL, pParent) , m_nEditXposCount(0) , m_nEditYposCount(0) , m_nCurOffsetModuleIdx(0) { InitializeCriticalSection(&m_csMapSafer); } CDlgMotorOffSetTool::~CDlgMotorOffSetTool() { DeleteCriticalSection(&m_csMapSafer); } void CDlgMotorOffSetTool::DoDataExchange(CDataExchange* pDX) { DDX_Control(pDX, IDC_GRID_MOTOR_OFFSET_INFO, m_ctrlGridMotorOffSetInfo); DDX_Text(pDX, IDC_EDIT_MOTOR_OFFSET_COUNTX, m_nEditXposCount); DDX_Text(pDX, IDC_EDIT_MOTOR_OFFSET_COUNTY, m_nEditYposCount); DDX_Control(pDX, IDC_COMBO_MOTOR_OFFSET_MODULEIDX, m_ctrlCmbModuleIdx); CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CDlgMotorOffSetTool, CDialogEx) ON_BN_CLICKED(IDCANCEL, &CDlgMotorOffSetTool::OnBnClickedCancel) ON_BN_CLICKED(IDOK, &CDlgMotorOffSetTool::OnBnClickedOK) ON_EN_KILLFOCUS(IDC_EDIT_MOTOR_OFFSET_COUNTX, &CDlgMotorOffSetTool::OnXCountKillFocus) ON_EN_KILLFOCUS(IDC_EDIT_MOTOR_OFFSET_COUNTY, &CDlgMotorOffSetTool::OnYCountKillFocus) ON_CBN_SELCHANGE(IDC_COMBO_MOTOR_OFFSET_MODULEIDX, &CDlgMotorOffSetTool::OnSelchangeComboMotorOffsetModuleidx) END_MESSAGE_MAP() BOOL CDlgMotorOffSetTool::OnInitDialog() { CDialogEx::OnInitDialog(); InitProcess(); return 0; } void CDlgMotorOffSetTool::OnBnClickedOK() { CDialogEx::OnOK(); UpdateData(TRUE); ApplyOffSetInfo(); UpdateGridcontrol(); int nIdx = 0; for (auto it =m_mapMotorOffsetInfo.begin(); it != m_mapMotorOffsetInfo.end(); it++) { it->second.WriteConfigFile(nIdx++); } // Critical Section Start EnterCriticalSection(&m_csMapSafer); m_mapMotorOffsetInfo_OLD = m_mapMotorOffsetInfo; LeaveCriticalSection(&m_csMapSafer); } void CDlgMotorOffSetTool::OnBnClickedCancel() { // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. CDialogEx::OnCancel(); UpdateData(TRUE); ApplyOffSetInfo(); UpdateGridcontrol(); CString strMessage; // CheckDiff(); if (m_mapMotorOffsetInfo_OLD == m_mapMotorOffsetInfo) { return; } else if (IDYES == AfxMessageBox(_T("변경점이 발견되었습니다 .저장 하시겠습니까?"), MB_YESNO | MB_ICONQUESTION)) { int nIdx = 0; for (auto it = m_mapMotorOffsetInfo.begin(); it != m_mapMotorOffsetInfo.end(); it++) { it->second.WriteConfigFile(nIdx++); } // Critical Section Start EnterCriticalSection(&m_csMapSafer); m_mapMotorOffsetInfo_OLD = m_mapMotorOffsetInfo; LeaveCriticalSection(&m_csMapSafer); // Critical Section End } else { EnterCriticalSection(&m_csMapSafer); m_mapMotorOffsetInfo = m_mapMotorOffsetInfo_OLD; LeaveCriticalSection(&m_csMapSafer); } } void CDlgMotorOffSetTool::OnXCountKillFocus() { UpdateData(TRUE); auto pMotorOffsetData = &m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx]; if (m_nEditYposCount <= 0) m_nEditYposCount = 1; if (m_nEditXposCount <= 0) m_nEditXposCount = 1; if (m_nEditYposCount > 100) m_nEditYposCount = 100; if (m_nEditXposCount > 100) m_nEditXposCount = 100; pMotorOffsetData->SetRangeCountX(m_nEditXposCount); pMotorOffsetData->SetRangeCountY(m_nEditYposCount); m_ctrlGridMotorOffSetInfo.DeleteAllItems(); UpdateData(FALSE); InitOffSetInfoGridControl(); UpdateGridcontrol(); Invalidate(TRUE); } void CDlgMotorOffSetTool::OnYCountKillFocus() { UpdateData(TRUE); auto pMotorOffsetData = &m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx]; if (m_nEditYposCount <= 0) m_nEditYposCount = 1; if (m_nEditXposCount <= 0) m_nEditXposCount = 1; if (m_nEditYposCount > 100) m_nEditYposCount = 100; if (m_nEditXposCount > 100) m_nEditXposCount = 100; pMotorOffsetData->SetRangeCountX(m_nEditXposCount); pMotorOffsetData->SetRangeCountY(m_nEditYposCount); m_ctrlGridMotorOffSetInfo.DeleteAllItems(); UpdateData(FALSE); InitOffSetInfoGridControl(); UpdateGridcontrol(); Invalidate(TRUE); } void CDlgMotorOffSetTool::InitOffSetInfoGridControl() { int nRowIdx, nColIdx, nRows, nCols, nFixRows, nDataColumnWidth, nMargin; CString strTemp; CRect rect; nRows = 0; nCols = 0; nFixRows = 0; nRowIdx = 0; nColIdx = 0; double dGlassXsize = 1500; auto pCurrentOffsetData = &m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx]; bool bDefault = FALSE; { nRows = (pCurrentOffsetData->GetRangeCountY()) + GRID_ROW_START_POINT; } { nCols = (pCurrentOffsetData->GetRangeCountX() * 2) + GRID_COL_START_POINT; } m_ctrlGridMotorOffSetInfo.GetWindowRect(&rect); m_ctrlGridMotorOffSetInfo.GetDefaultCell(FALSE, FALSE)->SetBackClr(RGB(0xFF, 0xFF, 0xE0)); m_ctrlGridMotorOffSetInfo.SetRowCount(nRows); m_ctrlGridMotorOffSetInfo.SetColumnCount(nCols); for (int nIndex = 0; nIndex < nRows; nIndex++) { m_ctrlGridMotorOffSetInfo.SetItemBkColour(nIndex, 0, Color[((nIndex / 2) - 1) % 10]); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nIndex, 1, Color[((nIndex / 2) - 1) % 10]); } for (int nIndex = 0; nIndex < nCols; nIndex++) { m_ctrlGridMotorOffSetInfo.SetItemBkColour(0, nIndex, Color[((nIndex / 2) - 1) % 10]); } nMargin = 5; nDataColumnWidth = 40; GV_ITEM Item; //첫번째 Item.mask = GVIF_TEXT; Item.row = 0; Item.col = 0; //init for (int nRowIdex = 0; nRowIdex < nRows; nRowIdex++) { for (int nColIdex = 0; nColIdex < nCols; nColIdex++) { Item.row = nRowIdex; Item.col = nColIdex; strTemp.Format(_T("")); Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); } } nRowIdx = 0; nColIdx = 0; Item.row = nRowIdx; Item.col = nColIdx; strTemp.Format(_T("0 , 0")); Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRowIdx, nColIdx, NOFIXCELLCOLOR); m_ctrlGridMotorOffSetInfo.SetColumnWidth(nColIdx, nDataColumnWidth + 35); m_ctrlGridMotorOffSetInfo.SetItemState(nRowIdx, nColIdx, m_ctrlGridMotorOffSetInfo.GetItemState(nRowIdx, nColIdx) | GVIS_READONLY); nRowIdx++; Item.row = nRowIdx; Item.col = nColIdx; strTemp.Format(_T("[YRange↓]")); Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRowIdx, nColIdx, NOFIXCELLCOLOR); m_ctrlGridMotorOffSetInfo.SetColumnWidth(nColIdx, nDataColumnWidth + 35); m_ctrlGridMotorOffSetInfo.SetItemState(nRowIdx, nColIdx, m_ctrlGridMotorOffSetInfo.GetItemState(nRowIdx, nColIdx) | GVIS_READONLY); nRowIdx = 0; nColIdx = 1; Item.row = nRowIdx; Item.col = nColIdx; strTemp.Format(_T("[XRange→]")); //Max와 열맞춤 Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRowIdx, nColIdx, NOFIXCELLCOLOR); m_ctrlGridMotorOffSetInfo.SetColumnWidth(nColIdx, nDataColumnWidth + 35); m_ctrlGridMotorOffSetInfo.SetItemState(nRowIdx, nColIdx, m_ctrlGridMotorOffSetInfo.GetItemState(nRowIdx, nColIdx) | GVIS_READONLY); nRowIdx++; Item.row = nRowIdx; Item.col = nColIdx; strTemp.Format(_T("*")); Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRowIdx, nColIdx, NOFIXCELLCOLOR); m_ctrlGridMotorOffSetInfo.SetColumnWidth(nColIdx, nDataColumnWidth + 35); m_ctrlGridMotorOffSetInfo.SetItemState(nRowIdx, nColIdx, m_ctrlGridMotorOffSetInfo.GetItemState(nRowIdx, nColIdx) | GVIS_READONLY); for (int nRowIndex = GRID_ROW_START_POINT; nRowIndex < nRows; nRowIndex++) { nRowIdx = nRowIndex; nColIdx = 1; Item.row = nRowIdx; Item.col = nColIdx; strTemp.Format(_T("Offset")); Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRowIdx, nColIdx, NOFIXCELLCOLOR); m_ctrlGridMotorOffSetInfo.SetColumnWidth(nColIdx, nDataColumnWidth + 35); m_ctrlGridMotorOffSetInfo.SetItemState(nRowIdx, nColIdx, m_ctrlGridMotorOffSetInfo.GetItemState(nRowIdx, nColIdx) | GVIS_READONLY); } for (int nColIndex = GRID_COL_START_POINT; nColIndex < nCols; nColIndex++) { nRowIdx = 1; nColIdx = nColIndex; if (nColIndex % 2 == 0) { Item.row = nRowIdx; Item.col = nColIdx; strTemp.Format(_T("[%d][x]"), nColIdx / 2); Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRowIdx, nColIdx, NOFIXCELLCOLOR); m_ctrlGridMotorOffSetInfo.SetColumnWidth(nColIdx, nDataColumnWidth + 15); m_ctrlGridMotorOffSetInfo.SetItemState(nRowIdx, nColIdx, m_ctrlGridMotorOffSetInfo.GetItemState(nRowIdx, nColIdx) | GVIS_READONLY); } else { Item.row = nRowIdx; Item.col = nColIdx; strTemp.Format(_T("[%d][y]"), nColIdx / 2); Item.strText = strTemp; m_ctrlGridMotorOffSetInfo.SetItem(&Item); m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRowIdx, nColIdx, NOFIXCELLCOLOR); m_ctrlGridMotorOffSetInfo.SetColumnWidth(nColIdx, nDataColumnWidth + 15); m_ctrlGridMotorOffSetInfo.SetItemState(nRowIdx, nColIdx, m_ctrlGridMotorOffSetInfo.GetItemState(nRowIdx, nColIdx) | GVIS_READONLY); } } } void CDlgMotorOffSetTool::SetColorType() { for (int i = 0; i < sizeof(Color); i++) { if (i == 0) { Color[0] = FFA7A7; } else if (i == 1) { Color[1] = FFC19E; } else if (i == 2) { Color[2] = FFE08C; } else if (i == 3) { Color[3] = FAED7D; } else if (i == 4) { Color[4] = FFB2F5; } else if (i == 5) { Color[5] = A566FF; } else if (i == 6) { Color[6] = D9418C; } else if (i == 7) { Color[7] = A00D8FF; } else if (i == 8) { Color[8] = A2F9D27; } else if (i == 9) { Color[9] = A4641D9; } } } void CDlgMotorOffSetTool::InitProcess() { SetColorType(); CString strTmp; for (int i =0; i<2; i++) { strTmp.Format(_T("%d"), i); m_ctrlCmbModuleIdx.AddString(strTmp); } m_ctrlCmbModuleIdx.SetCurSel(m_nCurOffsetModuleIdx); BOOL bRet = FALSE; //공간 만들기 for (int i = 0; i < 2; i++) { CMotorOffsetData pMotorOffsetData; bRet = pMotorOffsetData.ReadConfigFile(i); if (bRet == FALSE) break; m_mapMotorOffsetInfo.insert(std::make_pair(i, pMotorOffsetData)); } if (bRet == FALSE) return; InitOffSetInfoGridControl(); UpdateGridcontrol(); // map -> Grid // CriticalSection Start EnterCriticalSection(&m_csMapSafer); m_mapMotorOffsetInfo_OLD = m_mapMotorOffsetInfo; LeaveCriticalSection(&m_csMapSafer); } void CDlgMotorOffSetTool::UpdateGridcontrol() { //int nModuleidx = 0; int nRow = GRID_ROW_START_POINT; int nCol = GRID_COL_START_POINT; CString strData; m_nEditXposCount = m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeCountX(); m_nEditYposCount = m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeCountY(); CString strTemp = _T(""); strTemp.Format(_T("%d"), m_nEditXposCount); SetDlgItemText(IDC_EDIT_MOTOR_OFFSET_COUNTX, strTemp); strTemp.Format(_T("%d"), m_nEditYposCount); SetDlgItemText(IDC_EDIT_MOTOR_OFFSET_COUNTY, strTemp); for (int nXIndex = 0; nXIndex < m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeCountX(); nXIndex++) { strData.Format(_T("%.03lf"), m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeX(nXIndex)); m_ctrlGridMotorOffSetInfo.SetItemText(0, nCol, strData); //X Range m_ctrlGridMotorOffSetInfo.MergeCells(0, nCol, 0, nCol + 1); nCol += 2; } for (int nYIndex = 0; nYIndex < m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeCountY(); nYIndex++) { strData.Format(_T("%.03lf"), m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeY(nYIndex)); m_ctrlGridMotorOffSetInfo.SetItemText(nRow, 0, strData); nRow ++; } nCol = GRID_COL_START_POINT; nRow = GRID_ROW_START_POINT; for (int nYposIndex = 0; nYposIndex < m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeCountY(); nYposIndex++) { for (int nXposIndex = 0; nXposIndex < m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetRangeCountX(); nXposIndex++) { MotorOffSetInfo pOffset = m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx].GetOffsetValue(nXposIndex, nYposIndex); strData.Format(_T("%.03lf"), pOffset.dXoffSetValue); m_ctrlGridMotorOffSetInfo.SetItemText(nRow, nCol, strData);//X offset m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRow, nCol, RGB(0xF0, 0xF0, 0xD0)); nCol++; strData.Format(_T("%.03lf"), pOffset.dYoffSetValue); m_ctrlGridMotorOffSetInfo.SetItemText(nRow, nCol, strData); //Y Offset m_ctrlGridMotorOffSetInfo.SetItemBkColour(nRow, nCol, RGB(0xF0, 0xF0, 0xD0)); nCol++; } nRow += 1; nCol = GRID_COL_START_POINT; } } BOOL CDlgMotorOffSetTool::CalOffsetInfo(int nModuleIdx, double & XPos, double & YPos) { BOOL nRet = m_mapMotorOffsetInfo_OLD[nModuleIdx].CalcOffset(XPos, YPos); return nRet; } void CDlgMotorOffSetTool::ApplyOffSetInfo() { //int nModuleidx = 0; double dXoffset = 0; double dYoffset = 0; double dXRate = 0; double dYRate = 0; int nRow = GRID_ROW_START_POINT; int nCol = GRID_COL_START_POINT; CString strData; CString strAOIName; double dXRange = 0; double dYRange = 0; double nGlassSize = 2500; auto pMotorOffSetData = &m_mapMotorOffsetInfo[m_nCurOffsetModuleIdx]; MotorOffSetInfo pOffsetInfo; nCol = GRID_COL_START_POINT; for (int nXposIndex = 0; nXposIndex < pMotorOffSetData->GetRangeCountX(); nXposIndex++) { strData = m_ctrlGridMotorOffSetInfo.GetItemText(0, nCol); //X Range dXRange = atof((CStringA)strData); pMotorOffSetData->SetRangeX(nXposIndex, dXRange); // strData = m_ctrlGridReviewOffSetInfo.GetItemText(nRow, 1); //Y Max nCol += 2; } nRow = GRID_ROW_START_POINT; for (int nYposIndex = 0; nYposIndex < pMotorOffSetData->GetRangeCountY(); nYposIndex++) { strData = m_ctrlGridMotorOffSetInfo.GetItemText(nRow, 0); //YRange dYRange = atof((CStringA)strData); pMotorOffSetData->SetRangeY(nYposIndex, dYRange); nRow ++; } nCol = GRID_COL_START_POINT; nRow = GRID_ROW_START_POINT; for (int nYposIndex = 0; nYposIndex < pMotorOffSetData->GetRangeCountY(); nYposIndex++) { for (int nXposIndex = 0; nXposIndex < pMotorOffSetData->GetRangeCountX(); nXposIndex++) { strData = m_ctrlGridMotorOffSetInfo.GetItemText(nRow, nCol); //X offset pOffsetInfo.dXoffSetValue = atof((CStringA)strData); nCol++; strData = m_ctrlGridMotorOffSetInfo.GetItemText(nRow, nCol); //Y Offset pOffsetInfo.dYoffSetValue = atof((CStringA)strData); pMotorOffSetData->SetOffsetValue(nXposIndex, nYposIndex, pOffsetInfo); nCol++; } nRow ++; nCol = GRID_COL_START_POINT; } }; void CDlgMotorOffSetTool::OnSelchangeComboMotorOffsetModuleidx() { ApplyOffSetInfo(); m_nCurOffsetModuleIdx = m_ctrlCmbModuleIdx.GetCurSel(); InitOffSetInfoGridControl(); UpdateGridcontrol(); // map -> Grid // CriticalSection Start EnterCriticalSection(&m_csMapSafer); m_mapMotorOffsetInfo_OLD = m_mapMotorOffsetInfo; LeaveCriticalSection(&m_csMapSafer); }