Files
2026-09-28 15:28:50 +08:00

197 lines
4.4 KiB
C++

#include "StdAfx.h"
#include <vector>
#include <map>
#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<CString> ss;
while (file.ReadString(s))
{
ss.clear();
CoreTools::SplitString(s, _T(','), ss);
if (ss.size() < 5) continue;
if (CoreTools::isDigitString<int>(ss[0])
|| CoreTools::isDigitString<double>(ss[1])
|| CoreTools::isDigitString<int>(ss[2])
|| CoreTools::isDigitString<int>(ss[3])
|| CoreTools::isDigitString<int>(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();
}