#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> rows; search(str, rows); if (rows.empty()) return; int idx(0); for (size_t i = 0; i < rows.size(); ++i) { std::vector &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(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 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::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>& vec) { if (!psz) return; std::vector 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 ar(0); std::vector> equid_ss(0); std::set 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 allIds; for (size_t i = 0; i < equid_ss.size(); ++i) { std::set& s(equid_ss[i]); allIds.insert(s.begin(), s.end()); } std::vector ids; std::set::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 &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); } }