// DlgMotorOffSetTool.cpp: 구현 파일
|
//
|
|
#include "stdafx.h"
|
#include "ReviewSystem.h"
|
#include "DlgMotorOffSetTool.h"
|
#include <algorithm>
|
#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);
|
}
|