From 9020bfb6f86ff853d5d5b3cee882132a244232da Mon Sep 17 00:00:00 2001
From: KEJ <kimeungju@diteam.co.kr>
Date: 금, 24 11월 2023 15:33:29 +0900
Subject: [PATCH] Merge branch 'feature/#4528_CF_AOI_Review_Motor_Offset_기능_추가' into develop

---
 ReviewSystem/ReviewSystem/DlgMotorOffSetTool.cpp |  736 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 736 insertions(+), 0 deletions(-)

diff --git a/ReviewSystem/ReviewSystem/DlgMotorOffSetTool.cpp b/ReviewSystem/ReviewSystem/DlgMotorOffSetTool.cpp
new file mode 100644
index 0000000..d0c343d
--- /dev/null
+++ b/ReviewSystem/ReviewSystem/DlgMotorOffSetTool.cpp
@@ -0,0 +1,736 @@
+癤�// 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);
+}

--
Gitblit v1.9.3