Files
envi-code/SourceCode/Code2026/PipelineCmd/SearchEquDlg.cpp
T
2026-09-28 15:28:50 +08:00

282 lines
7.3 KiB
C++

#include "stdafx.h"
#include "SearchEquDlg.h"
#include "AecDbEwEquipment.h"
#include "coretools.h"
IMPLEMENT_DYNAMIC(CSearchEquDlg, CDialog)
CSearchEquDlg::CSearchEquDlg(CWnd* pParent /*=nullptr*/)
: CDialog(IDD_SEARCH_EQU_DLG, pParent)
, m_iSelEqu(-1)
, m_sEquName(_T(""))
, m_iIdClass(-1)
{
}
CSearchEquDlg::~CSearchEquDlg()
{
}
void CSearchEquDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDT_SEARCH, m_edtSearch);
DDX_Control(pDX, IDC_LST_REL, m_lstResult);
DDX_Control(pDX, IDC_LST_BIM, m_lstBims);
DDX_Control(pDX, IDC_STA_REM, m_staRem);
}
BOOL CSearchEquDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (!m_wndViewCtrl.SubclassDlgItem(IDC_STA_VIEW, this))
{
// 错误时,结束对话框
EndDialog(IDCANCEL);
return FALSE;
}
m_wndViewCtrl.init(true);
m_lstResult.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SINGLEROW);
m_lstResult.InsertColumn(0, _T("文件夹"), LVCFMT_CENTER, 95);
m_lstResult.InsertColumn(1, _T("类型"), LVCFMT_CENTER, 95);
m_lstResult.InsertColumn(2, _T("设备名称"), LVCFMT_CENTER, 95);
m_lstBims.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SINGLEROW);
m_lstBims.InsertColumn(0, _T("名称"), LVCFMT_CENTER, 100);
m_lstBims.InsertColumn(1, _T("数值"), LVCFMT_CENTER, 100);
CString path = FilePath::GetSysDir() + _T("\\Aec3DMep.db");
if (!m_dbServer.InitADOServer(path))
{
AfxMessageBox(CString(_T("数据库初始化失败,请检查 sys")) + _T("\\Aec3DMep.db") + _T("文件是否存在."));
}
return TRUE;
}
BEGIN_MESSAGE_MAP(CSearchEquDlg, CDialog)
ON_BN_CLICKED(IDC_BTN_SEARCH, &CSearchEquDlg::OnBnClickedBtnSearch)
ON_BN_CLICKED(IDOK, &CSearchEquDlg::OnBnClickedOk)
ON_EN_CHANGE(IDC_EDT_SEARCH, &CSearchEquDlg::OnEnChangeEdtSearch)
ON_NOTIFY(NM_CLICK, IDC_LST_REL, &CSearchEquDlg::OnNMClickLstRel)
END_MESSAGE_MAP()
void CSearchEquDlg::OnBnClickedBtnSearch()
{
OnEnChangeEdtSearch();
}
void CSearchEquDlg::OnBnClickedOk()
{
int idx = m_lstResult.GetSelectionMark();
if (idx < 0)
{
AfxMessageBox(_T("请选择一个设备。"));
return;
}
CDialog::OnOK();
}
void CSearchEquDlg::OnEnChangeEdtSearch()
{
m_lstResult.DeleteAllItems();
m_lstBims.DeleteAllItems();
m_staRem.SetWindowText(_T(""));
m_wndViewCtrl.clearAll();
m_wndViewCtrl.init();
m_wndViewCtrl.RefreshView();
CString str(_T(""));
m_edtSearch.GetWindowText(str);
if (str.IsEmpty()) return;
std::vector<std::vector<CString>> rows;
search(str, rows);
if (rows.empty()) return;
int idx(0);
for (size_t i = 0; i < rows.size(); ++i)
{
std::vector<CString> &v(rows[i]);
if (v.size() < 4) continue;
m_lstResult.InsertItem(idx, v[1]);
m_lstResult.SetItemText(idx, 1, v[2]);
m_lstResult.SetItemText(idx, 2, v[3]);
m_lstResult.SetItemData(idx, TypeConvert::s2i(v[0]));
++idx;
}
}
void CSearchEquDlg::OnNMClickLstRel(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
int nItem = pNMItemActivate->iItem;
if (nItem < 0 || nItem >= m_lstResult.GetItemCount()) return;
m_sEquName = m_lstResult.GetItemText(nItem, 2);
// aec_package表内的ID
m_iSelEqu = m_lstResult.GetItemData(nItem);
CString tmpFile(FilePath::getSystemTemporaryFolder() + _T("\\temp_$_$_.equ"));
CString sSql(_T(""));
sSql.Format(_T("SELECT [package] FROM aec_package WHERE [ID]='%d'"), m_iSelEqu);
if (!m_dbServer.GetSelBlob(sSql, tmpFile)) return;
AecDbEwEquipment* pEqu = new AecDbEwEquipment;
if (!pEqu->ReadFromFile(tmpFile)) return;
AcDbExtents ext;
pEqu->getGeomExtents(ext);
m_wndViewCtrl.clearAll();
m_wndViewCtrl.init();
m_wndViewCtrl.InitFromCurrentView3D(ext);
m_wndViewCtrl.Add(pEqu);
m_wndViewCtrl.RefreshView();
std::map<CString, CString> ar;
sSql.Format(_T("SELECT [name], [value] FROM aec_bims WHERE [equid]='%d'"), m_iSelEqu);
m_dbServer.GetSelData(sSql, ar);
m_lstBims.DeleteAllItems();
std::map<CString, CString>::const_iterator it(ar.begin());
for (int idx = 0; it != ar.end(); ++it, ++idx)
{
m_lstBims.InsertItem(idx, it->first);
m_lstBims.SetItemText(idx, 1, it->second);
}
CString sRem(_T(""));
sSql.Format(_T("SELECT [rem] FROM aec_package WHERE [id]='%d'"), m_iSelEqu);
m_dbServer.GetSelData(sSql, sRem);
m_staRem.SetWindowText(sRem);
}
void CSearchEquDlg::search(LPCTSTR psz, std::vector<std::vector<CString>>& vec)
{
if (!psz) return;
std::vector<CString> v(0);
CoreTools::SplitString(psz, _T(' '), v);
if (v.empty()) return;
/*
主要考虑
aec_folder.folder
, aec_class.class
, aec_package.name
, aec_package.rem
, aec_bims.value
这几个字段
搜索每一个相关表中的相关字段,如果有,则将结果去掉重复,显示出来
*/
std::vector<CString> ar(0);
std::vector<std::set<CString>> equid_ss(0);
std::set<CString> equIds;
CString sFolder(_T("")), sClass(_T("")), sPackage1(_T("")), sPackage2(_T("")), sBims(_T(""));
for (size_t i = 0; i < v.size(); ++i)
{
sFolder.Format(_T("SELECT aec_package.[id]")
_T(" FROM aec_package ")
_T("INNER JOIN aec_folder, aec_class ")
_T("ON (aec_package.[idclass] = aec_class.[id] AND aec_class.[idfolder] = aec_folder.[id]) ")
_T("WHERE aec_folder.[folder] LIKE '%%%s%%'"), v[i]);
ar.clear();
m_dbServer.GetSelData(sFolder, ar);
equIds.insert(ar.begin(), ar.end());
sClass.Format(_T("SELECT aec_package.[id]")
_T(" FROM aec_package ")
_T("INNER JOIN aec_class ")
_T("ON aec_package.[idclass] = aec_class.[id] ")
_T("WHERE aec_class.[class] LIKE '%%%s%%'"), v[i]);
ar.clear();
m_dbServer.GetSelData(sClass, ar);
equIds.insert(ar.begin(), ar.end());
sBims.Format(_T("SELECT aec_package.[id]")
_T(" FROM aec_package ")
_T("INNER JOIN aec_bims ")
_T("ON aec_package.[id] = aec_bims.[equid] ")
_T("WHERE aec_bims.[value] LIKE '%%%s%%'"), v[i]);
ar.clear();
m_dbServer.GetSelData(sBims, ar);
equIds.insert(ar.begin(), ar.end());
sPackage1.Format(_T("SELECT aec_package.[id]")
_T(" FROM aec_package ")
_T("WHERE [name] LIKE '%%%s%%'"), v[i]);
ar.clear();
m_dbServer.GetSelData(sPackage1, ar);
equIds.insert(ar.begin(), ar.end());
sPackage2.Format(_T("SELECT aec_package.[id]")
_T(" FROM aec_package ")
_T("WHERE [rem] LIKE '%%%s%%'"), v[i]);
ar.clear();
m_dbServer.GetSelData(sPackage2, ar);
equIds.insert(ar.begin(), ar.end());
if (!equIds.empty())
{
equid_ss.push_back(equIds);
equIds.clear();
}
}
// 找到 equid_ss 每一个数组中都存在的 id
std::set<CString> allIds;
for (size_t i = 0; i < equid_ss.size(); ++i)
{
std::set<CString>& s(equid_ss[i]);
allIds.insert(s.begin(), s.end());
}
std::vector<CString> ids;
std::set<CString>::const_iterator it(allIds.begin()), _it;
for (; it != allIds.end(); ++it)
{
const CString &id(*it);
bool suc(true);
for (size_t j = 0; j < equid_ss.size(); ++j)
{
std::set<CString> &s(equid_ss[j]);
_it = s.find(id);
if (_it == s.end())
{
suc = false;
break;
}
}
if (suc)
ids.push_back(id);
}
CString sSql;
for (size_t i = 0; i < ids.size(); ++i)
{
sSql.Format(_T("SELECT ")
_T("aec_package.[id]")
_T(", aec_folder.[folder]")
_T(", aec_class.[class]")
_T(", aec_package.[name] ")
_T("FROM aec_package ")
_T("INNER JOIN aec_folder, aec_class ")
_T("ON (")
_T("aec_folder.[id] = aec_class.[idfolder] ")
_T("AND aec_package.[idclass] = aec_class.[id] ")
_T(") ")
_T("WHERE aec_package.[id]='%s'"), ids[i]);
ar.clear();
m_dbServer.GetSelData(sSql, ar);
if (!ar.empty())
vec.push_back(ar);
}
}