#include "StdAfx.h" #include #include #include "coretools.h" #include "shjson.h" #include "InsertValveDlg.h" #define JSON_PATH _T("\\valveSize.json") namespace { using namespace SHJson; struct _Data_ { double dDN, dPN, dL, dW, dH; }; void parseCSV(LPCTSTR pszCSV, std::vector<_Data_> &datas) { if (!pszCSV) return; CStdioFile file; CFileException e; if (!file.Open(pszCSV, CFile::modeRead | CFile::modeNoTruncate, &e)) { CString ss; e.GetErrorMessage(ss.GetBuffer(1024), 1024); ss.ReleaseBuffer(); AfxMessageBox(ss); return; } _Data_ data; CString s; std::vector ss; while (file.ReadString(s)) { ss.clear(); CoreTools::SplitString(s, _T(','), ss); if (ss.size() < 5) continue; if (CoreTools::isDigitString(ss[0]) || CoreTools::isDigitString(ss[1]) || CoreTools::isDigitString(ss[2]) || CoreTools::isDigitString(ss[3]) || CoreTools::isDigitString(ss[4]) ) { data.dDN = (double)_ttoi(ss[0]); data.dPN = _ttof(ss[1]); data.dL = (double)_ttoi(ss[2]); data.dW = (double)_ttoi(ss[3]); data.dH = (double)_ttoi(ss[4]); datas.push_back(data); } } file.Close(); } void addSize(WValue &wv, const std::vector<_Data_> &datas) { WValue v, ar; v.SetObject(); ar.SetArray(); CString s; for (size_t i = 0; i < datas.size(); ++i) { v.SetObject(); s.Format(_T("%.1f"), datas[i].dPN); addMember(v, _T("DN"), datas[i].dDN); addMember(v, _T("PN"), s); addMember(v, _T("L"), datas[i].dL); addMember(v, _T("W"), datas[i].dW); addMember(v, _T("H"), datas[i].dH); pushBack(ar, v); } addMember(wv, _T("size"), ar); } } IMPLEMENT_DYNAMIC(CInsertValveDlg, CDialog) CInsertValveDlg::CInsertValveDlg(CWnd* pParent) : CDialog(IDD_INSERT_VALVE_DLG, pParent) { } CInsertValveDlg::~CInsertValveDlg() { } void CInsertValveDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_VALVE_TYPE, m_cmbValveType); DDX_CBString(pDX, IDC_COMBO_VALVE_TYPE, m_sValveType); DDX_Text(pDX, IDC_EDIT_SIZE_NAME, m_sSizeName); DDX_Text(pDX, IDC_EDIT_FILE, m_sSizeFilePath); } BOOL CInsertValveDlg::OnInitDialog() { using namespace SHJson; CDialog::OnInitDialog(); // 取出json文件中的阀门类型 WDocument doc; if (!file2Json(FilePath::GetSysDir() + JSON_PATH, doc)) { AfxMessageBox(_T("未找到阀门尺寸文件或尺寸文件格式错误!")); EndDialog(0); return TRUE; } for (MIt it = doc.MemberBegin(); it != doc.MemberEnd(); ++it) { m_cmbValveType.AddString(it->name.GetString()); } if (m_cmbValveType.GetCount() < 0) { EndDialog(0); return TRUE; } m_cmbValveType.SetCurSel(0); UpdateData(FALSE); return TRUE; } BEGIN_MESSAGE_MAP(CInsertValveDlg, CDialog) ON_BN_CLICKED(IDOK, &CInsertValveDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON_SELECT_FILE, &CInsertValveDlg::OnBnClickedSelFile) END_MESSAGE_MAP() void CInsertValveDlg::OnBnClickedOk() { if (!UpdateData(TRUE)) return; if (m_sValveType.IsEmpty() || m_sSizeName.IsEmpty() || m_sSizeFilePath.IsEmpty()) { AfxMessageBox(_T("\"阀门类型\"、\"尺寸名称\"、\"文件路径\" 不能为空!")); return; } using namespace SHJson; WDocument doc; if (!file2Json(FilePath::GetSysDir() + JSON_PATH, doc)) { AfxMessageBox(_T("未找到阀门尺寸文件或尺寸文件格式错误!")); return; } MIt itValve = doc.FindMember(m_sValveType); if (itValve == doc.MemberEnd()) { AfxMessageBox(_T("未找到阀门类型!")); return; } std::vector<_Data_> datas; parseCSV(m_sSizeFilePath, datas); if (datas.empty()) return; MIt itSubObj = itValve->value.FindMember(m_sSizeName); if (itSubObj != itValve->value.MemberEnd()) { // 找到,提示 if (AfxMessageBox(_T("已经存在此尺寸数据,是否覆盖?"), MB_YESNO) != IDYES) return; itValve->value.RemoveMember(itSubObj); } WValue v; v.SetObject(); addSize(v, datas); addMember(itValve->value, m_sSizeName, v); json2File(FilePath::GetSysDir() + JSON_PATH, doc, true); CDialog::OnOK(); } void CInsertValveDlg::OnBnClickedSelFile() { UpdateData(TRUE); CFileDialog dlg(TRUE, _T("*.csv"), NULL, OFN_HIDEREADONLY, _T("阀门尺寸数据 (*.csv)|*.csv||"), acedGetAcadFrame()); dlg.DoModal(); m_sSizeFilePath = dlg.GetPathName(); UpdateData(FALSE); } void CInsertValveDlg::start() { CAcModuleResourceOverride myResources; CInsertValveDlg dlg; dlg.DoModal(); }