| SourceCode/Bond/BondEq/BondEq.rc | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/BondEq.vcxproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/RegexEdit.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/RegexEdit.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/Resource.h | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/View/AxisSettingsDlg.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
SourceCode/Bond/BondEq/BondEq.rcBinary files differ
SourceCode/Bond/BondEq/BondEq.vcxproj
@@ -244,6 +244,7 @@ <ClInclude Include="Model.h" /> <ClInclude Include="CPageAlarm.h" /> <ClInclude Include="Recipe.h" /> <ClInclude Include="RegexEdit.h" /> <ClInclude Include="Resource.h" /> <ClInclude Include="SetPage1.h" /> <ClInclude Include="SetPage2.h" /> @@ -317,6 +318,7 @@ <ClCompile Include="Model.cpp" /> <ClCompile Include="CPageAlarm.cpp" /> <ClCompile Include="Recipe.cpp" /> <ClCompile Include="RegexEdit.cpp" /> <ClCompile Include="SetPage1.cpp" /> <ClCompile Include="SetPage2.cpp" /> <ClCompile Include="SettingsDlg.cpp" /> SourceCode/Bond/BondEq/RegexEdit.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,115 @@ #include "stdafx.h" #include "RegexEdit.h" #include <stdexcept> IMPLEMENT_DYNAMIC(CRegexEdit, CEdit) CRegexEdit::CRegexEdit() { m_enRegexType = RegexType::Alphanumeric; m_dMinValue = LDBL_MIN; m_dMaxValue = LDBL_MAX; } CRegexEdit::~CRegexEdit() { } void CRegexEdit::SetRegexType(RegexType enType) { m_enRegexType = enType; } void CRegexEdit::SetCustomRegex(const std::string& strCustomRegex) { m_strCustomRegex = strCustomRegex; } void CRegexEdit::SetValueRange(long double dMinValue, long double dMaxValue) { m_dMinValue = dMinValue; m_dMaxValue = dMaxValue; } void CRegexEdit::SetCustomComparator(std::function<bool(const std::string&)> comparator) { m_customComparator = comparator; } void CRegexEdit::SetInvalidInputCallback(std::function<void()> callback) { m_invalidInputCallback = callback; } std::regex CRegexEdit::GetCurrentRegex() const { switch (m_enRegexType) { case RegexType::Alphanumeric: return std::regex("^[a-zA-Z0-9]*$"); // 忝忰å case RegexType::Letters: return std::regex("^[a-zA-Z]*$"); // åªå è®¸åæ¯ case RegexType::Digits: return std::regex("^\\d*$"); // åªå 许æ°å case RegexType::Decimal: return std::regex("^[-+]?\\d+(\\.\\d+)?$"); // å è®¸å°æ°åæ´æ° case RegexType::Custom: return std::regex(m_strCustomRegex); // èªå®ä¹æ£å default: return std::regex(".*"); // é»è®¤å 许è¾å ¥ä»»ä½å 容 } } bool CRegexEdit::IsValueInRange(const std::string& strText) { try { if (m_enRegexType == RegexType::Digits || m_enRegexType == RegexType::Decimal) { if (strText.find('.') == std::string::npos) { int nValue = std::stoi(strText); return nValue >= static_cast<int>(m_dMinValue) && nValue <= static_cast<int>(m_dMaxValue); } else { double dValue = std::stod(strText); return dValue >= m_dMinValue && dValue <= m_dMaxValue; } } } catch (const std::invalid_argument&) { return false; } return true; } BEGIN_MESSAGE_MAP(CRegexEdit, CEdit) ON_WM_CHAR() END_MESSAGE_MAP() void CRegexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // å¤çå é¤é®åéæ ¼é® if (nChar == VK_BACK || nChar == VK_DELETE) { CEdit::OnChar(nChar, nRepCnt, nFlags); return; } CString strCurrent; GetWindowText(strCurrent); // è·åå æ å½åä½ç½® int nStartChar, nEndChar; GetSel(nStartChar, nEndChar); // è·åå½åéåºçèµ·å§åç»æä½ç½® std::string strText(CT2A(strCurrent.GetBuffer())); strText.insert(strText.begin() + nStartChar, (char)nChar); bool bValid = m_customComparator ? m_customComparator(strText) : IsValueInRange(strText); if (std::regex_match(strText, GetCurrentRegex()) && bValid) { CEdit::OnChar(nChar, nRepCnt, nFlags); } else { if (m_invalidInputCallback) { m_invalidInputCallback(); } } } SourceCode/Bond/BondEq/RegexEdit.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,68 @@ #if !defined(AFX_REGEXEDIT_H__A4EABEC5_2E8C_11D1_B79F_00805F9ECE10__INCLUDED_) #define AFX_REGEXEDIT_H__A4EABEC5_2E8C_11D1_B79F_00805F9ECE10__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include <afxwin.h> #include <regex> #include <functional> #include <limits> // æä¸¾ç±»åï¼æ£å表达å¼ç±»å enum class RegexType { Alphanumeric, // å è®¸åæ¯åæ°å Letters, // åªå è®¸åæ¯ Digits, // åªå 许æ°å Decimal, // å è®¸å°æ°åæ´æ° Custom // èªå®ä¹æ£å }; class CRegexEdit : public CEdit { DECLARE_DYNAMIC(CRegexEdit) public: // æé 䏿æ CRegexEdit(); virtual ~CRegexEdit(); // 设置æ£åç±»å void SetRegexType(RegexType enType); // 设置èªå®ä¹æ£åè¡¨è¾¾å¼ void SetCustomRegex(const std::string& strCustomRegex); // 设置æ°å¼èå´ï¼æ´æ°ææµ®ç¹ï¼ void SetValueRange(long double dMinValue, long double dMaxValue); // 设置èªå®ä¹æ¯è¾å½æ° void SetCustomComparator(std::function<bool(const std::string&)> comparator); // 设置è¾å ¥ä¸åæ³å½æ° void SetInvalidInputCallback(std::function<void()> callback); protected: // æ ¹æ®æä¸¾å¼è¿å对åºçæ£åè¡¨è¾¾å¼ std::regex GetCurrentRegex() const; // æ ¡éªè¾å ¥æ¯å¦å¨æå®èå´å bool IsValueInRange(const std::string& strText); protected: RegexType m_enRegexType; // å½åéä¸çæ£åç±»å std::string m_strCustomRegex; // èªå®ä¹æ£åè¡¨è¾¾å¼ long double m_dMinValue; // æå°å¼ long double m_dMaxValue; // æå¤§å¼ std::function<bool(const std::string&)> m_customComparator; // èªå®ä¹æ¯è¾å½æ° std::function<void()> m_invalidInputCallback; // ä¸åæ³è¾å ¥çåè°å½æ° protected: void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); DECLARE_MESSAGE_MAP() }; #endif // !defined(AFX_REGEXEDIT_H__A4EABEC5_2E8C_11D1_B79F_00805F9ECE10__INCLUDED_) SourceCode/Bond/BondEq/Resource.hBinary files differ
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp
@@ -44,8 +44,13 @@ m_bReady = FALSE; m_bBusy = FALSE; m_bErr = FALSE; for (int i = 0; i < BTN_MAX; i++) { m_pBlBtns[i] = new CBlButton(); } for (int i = 0; i < EDIT_MAX; i++) { m_pRegexEdit[i] = new CRegexEdit(); } for (int i = 0; i < LABEL_MAX; i++) { @@ -68,6 +73,10 @@ for (int i = 0; i < BTN_MAX; i++) { delete m_pBlBtns[i]; } for (int i = 0; i < EDIT_MAX; i++) { delete m_pRegexEdit[i]; } for (int i = 0; i < LABEL_MAX; i++) { @@ -93,11 +102,6 @@ DDX_Control(pDX, IDC_STATIC_AXIS_NUMBER, m_staticAxisNO); DDX_Control(pDX, IDC_STATIC_AXIS_DESCRIP, m_staticAxisDescription); DDX_Control(pDX, IDC_STATIC_START_ADDRESS, m_staticStartAddress); DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_POS, m_editManualSpeed); DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_AUTO_SPEED, m_editAutoSpeed); DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_ACCE_TIME, m_editAccelerationTime); DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_DECE_TIME, m_editDecelerationTime); DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_MICROMENTUM, m_editJogDistance); } UINT CAxisSettingsDlg::FindIDByName(const CString& strControlID) @@ -238,6 +242,24 @@ SetLabelColorBasedOnState(*m_pBlLabels[LABEL_ERR], m_bErr, COLOR_RED, COLOR_GREEN_OFF); } void CAxisSettingsDlg::UpdateRegexEdit(CRegexEdit* pRegexEdit, const ValueRange& range, const CString& title) { auto formatDouble = [](double value) -> CString { CString str; str.Format(_T("%.3f"), value); return str; }; pRegexEdit->SetWindowText(formatDouble(range.currentValue)); pRegexEdit->SetRegexType(RegexType::Decimal); pRegexEdit->SetValueRange(range.minValue, range.maxValue); pRegexEdit->SetInvalidInputCallback([title, range]() { CString strError; strError.Format(_T("%sçå¼å¿ é¡»å¨ %.3f å %.3f ä¹é´ï¼"), title, range.minValue, range.maxValue); AfxMessageBox(strError); }); } void CAxisSettingsDlg::updatePageButtonStates() { for (int i = 0; i < AXIS_PAGE_SIZE; ++i) { @@ -316,11 +338,12 @@ m_staticAxisNO.SetWindowText(CString(axisDetails.number.c_str())); // è½´ç¼å· m_staticAxisDescription.SetWindowText(CString(axisDetails.description.c_str())); // è½´æè¿° m_staticStartAddress.SetWindowText(CString(axisDetails.startAddress.c_str())); // èµ·å§å°å m_editJogDistance.SetWindowText(formatDouble(axisDetails.jogDistance.currentValue)); // å¾®å¨é m_editManualSpeed.SetWindowText(formatDouble(axisDetails.manualSpeed.currentValue)); // æå¨é度 m_editAutoSpeed.SetWindowText(formatDouble(axisDetails.autoSpeed.currentValue)); // èªå¨é度 m_editAccelerationTime.SetWindowText(formatDouble(axisDetails.accelerationTime.currentValue)); // å éæ¶é´ m_editDecelerationTime.SetWindowText(formatDouble(axisDetails.decelerationTime.currentValue)); // åéæ¶é´ UpdateRegexEdit(m_pRegexEdit[EDIT_MICROMENTUM], axisDetails.jogDistance, _T("å¾®å¨é")); UpdateRegexEdit(m_pRegexEdit[EDIT_MANUAL_SPEED], axisDetails.manualSpeed, _T("æå¨é度")); UpdateRegexEdit(m_pRegexEdit[EDIT_AUTO_SPEED], axisDetails.autoSpeed, _T("èªå¨é度")); UpdateRegexEdit(m_pRegexEdit[EDIT_ACCE_TIME], axisDetails.accelerationTime, _T("å éæ¶é´")); UpdateRegexEdit(m_pRegexEdit[EDIT_DECE_TIME], axisDetails.decelerationTime, _T("åéæ¶é´")); } void CAxisSettingsDlg::refreshPositionDetails(int nAxisId, int pageNumber) @@ -357,6 +380,12 @@ if (pPositionCtrl) { pPositionCtrl->SetWindowText(value); pPositionCtrl->EnableWindow(position.isEnable); if (position.isEnable) { CString strError; strError.Format(_T("å®ä½ç¹%d"), i + 1); UpdateRegexEdit((CRegexEdit*)pPositionCtrl, position.range, strError); } } } else { @@ -445,19 +474,19 @@ // è·åçé¢ä¸çä¿®æ¹åæ° CString text; m_editManualSpeed.GetWindowText(text); m_pRegexEdit[EDIT_MANUAL_SPEED]->GetWindowText(text); axisData.manualSpeed.currentValue = _ttof(text); m_editAutoSpeed.GetWindowText(text); m_pRegexEdit[EDIT_AUTO_SPEED]->GetWindowText(text); axisData.autoSpeed.currentValue = _ttof(text); m_editAccelerationTime.GetWindowText(text); m_pRegexEdit[EDIT_ACCE_TIME]->GetWindowText(text); axisData.accelerationTime.currentValue = _ttof(text); m_editDecelerationTime.GetWindowText(text); m_pRegexEdit[EDIT_DECE_TIME]->GetWindowText(text); axisData.decelerationTime.currentValue = _ttof(text); m_editJogDistance.GetWindowText(text); m_pRegexEdit[EDIT_MICROMENTUM]->GetWindowText(text); axisData.jogDistance.currentValue = _ttof(text); // æ´æ°å®ä½ç¹æ°æ® @@ -866,6 +895,18 @@ pLabel->SetDynamicFont(TRUE); } // åå§åç¼è¾æ¡ m_pRegexEdit[EDIT_MANUAL_SPEED]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_MANUAL_SPEED, this); m_pRegexEdit[EDIT_AUTO_SPEED]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_AUTO_SPEED, this); m_pRegexEdit[EDIT_ACCE_TIME]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_ACCE_TIME, this); m_pRegexEdit[EDIT_DECE_TIME]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_DECE_TIME, this); m_pRegexEdit[EDIT_MICROMENTUM]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_MICROMENTUM, this); m_pRegexEdit[EDIT_ANCHOR_POINT1]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT1, this); m_pRegexEdit[EDIT_ANCHOR_POINT2]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT2, this); m_pRegexEdit[EDIT_ANCHOR_POINT3]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT3, this); m_pRegexEdit[EDIT_ANCHOR_POINT4]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT4, this); m_pRegexEdit[EDIT_ANCHOR_POINT5]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT5, this); // æé®åå§å m_pBlBtns[BTN_PAGE1]->SubclassDlgItem(IDC_BUTTON_AXIS_ANCHOR_POINT_GROUP1, this); m_pBlBtns[BTN_PAGE2]->SubclassDlgItem(IDC_BUTTON_AXIS_ANCHOR_POINT_GROUP2, this); @@ -980,6 +1021,11 @@ CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd); if (pWnd) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { // 黿¢å车é®é»è®¤å¤çï¼é²æ¢å¯¹è¯æ¡å ³é return TRUE; } // å¤æé¼ æ æ¯å¦è¿å ¥æå®æ§ä»¶åºå if (pWnd->GetSafeHwnd() == GetDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP1)->m_hWnd || pWnd->GetSafeHwnd() == GetDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP2)->m_hWnd || SourceCode/Bond/BondEq/View/AxisSettingsDlg.h
@@ -2,12 +2,13 @@ #include "afxdialogex.h" #include "BlButton.h" #include "BLLabel.h" #include "RegexEdit.h" #include "CPLC.h" // æ¯é¡µå®ä½ç¹æ¾ç¤ºä¸ªæ° #define AXIS_PAGE_SIZE 5 // LABELæ§ä»¶ // Labelæ§ä»¶ #define LABEL_MAX 6 #define LABEL_FLS 0 #define LABEL_DOG 1 @@ -15,6 +16,19 @@ #define LABEL_READY 3 #define LABEL_BUSY 4 #define LABEL_ERR 5 // RegexEditæ§ä»¶ #define EDIT_MAX 10 #define EDIT_MANUAL_SPEED 0 #define EDIT_AUTO_SPEED 1 #define EDIT_ACCE_TIME 2 #define EDIT_DECE_TIME 3 #define EDIT_MICROMENTUM 4 #define EDIT_ANCHOR_POINT1 5 #define EDIT_ANCHOR_POINT2 6 #define EDIT_ANCHOR_POINT3 7 #define EDIT_ANCHOR_POINT4 8 #define EDIT_ANCHOR_POINT5 9 // BUTTONæ§ä»¶ #define BTN_MAX 15 @@ -76,6 +90,7 @@ void SetLabelColor(CBLLabel& label, COLORREF color); void SetLabelColorBasedOnState(CBLLabel& label, BOOL bState, COLORREF colorTrue, COLORREF colorFalse); void UpdateLabels(); void UpdateRegexEdit(CRegexEdit* pRegexEdit, const ValueRange& range, const CString& title); void updatePageButtonStates(); void HideEditCursor(int nCtrlID); int getCurrentSelectedAxisID(); @@ -105,9 +120,10 @@ // æ§ä»¶ CBlButton* m_pBlBtns[BTN_MAX]; CBLLabel* m_pBlLabels[LABEL_MAX]; CRegexEdit* m_pRegexEdit[EDIT_MAX]; CComboBox m_comboAxisNO; CStatic m_staticAxisNO, m_staticAxisDescription, m_staticStartAddress; CEdit m_editManualSpeed, m_editAutoSpeed, m_editAccelerationTime, m_editDecelerationTime, m_editJogDistance; //CEdit m_editManualSpeed, m_editAutoSpeed, m_editAccelerationTime, m_editDecelerationTime, m_editJogDistance; std::map<int, CRect> m_mapCtrlLayouts; std::map<int, CFont*> m_mapFonts;