#include "stdafx.h" #include "filepath.h" #include #include "KTCadUtility.h" #include "modelLibDlgbase.h" #include "CoreTools.h" #include "aecdbewequipment.h" #include "dbobjptr.h" #include "EquInsDirJig.h" #include "KTSetting.h" #include "CFZSBAddDlg.h" #include "ModelLibCopyTreeDlg.h" #include "aecdbopening.h" #include "aecdbx3dpartentity.h" #include "aecdbwall.h" #include "aecdbcolumn.h" #define SHOWWINDOW(id, sh) if (GetDlgItem(id)) GetDlgItem(id)->ShowWindow(sh); #define EQU_DIR _T("\\equipment") namespace { static std::map g_result; void refreshSearchResult(CUIISQLiteServer &db , bool bRefresh , LPCTSTR pszTablePrefix) { if (!bRefresh) return; if (!pszTablePrefix) return; g_result.clear(); std::vector> rr; CString sTbl(pszTablePrefix) , sql(_T("")); sql.Format(_T("SELECT distinct %s_package.[id], %s_folder.[folder], %s_class.[class], %s_package.[name]") _T("\nFROM %s_package") _T("\nINNER JOIN %s_folder, %s_class") _T("\nON(%s_package.[idclass] = %s_class.[id]") _T("\nAND %s_class.[idfolder] = %s_folder.[id])"), sTbl, sTbl, sTbl, sTbl, sTbl , sTbl, sTbl, sTbl, sTbl, sTbl, sTbl); db.GetSelDataEx(sql, rr); for (size_t i(0); i < rr.size(); ++i) { std::vector &ss(rr[i]); if (ss.size() < 3) continue; g_result.insert( std::make_pair(TypeConvert::convert(ss[0]) , (ss[1] + _T("\\") + ss[2] + _T("\\") + ss[3]).MakeUpper())); } } void search(CUIISQLiteServer &db , const std::vector &conditions , std::map &result , LPCTSTR pszTablePrefix) { if (g_result.empty()) { refreshSearchResult(db, true, pszTablePrefix); } bool bFind(true); std::map::const_iterator it(g_result.begin()); for (it; it != g_result.end(); ++it) { const CString &s(it->second); bFind = true; for (size_t i(0); i < conditions.size(); ++i) { if (s.Find(conditions[i]) == -1) { bFind = false; break; } } if (bFind) { result.insert(*it); } } } HTREEITEM FindTreeItem(CTreeCtrl *pTreeCtrl, HTREEITEM hItem, const CString &strText) { // 如果当前节点的文本匹配,返回该节点 if (pTreeCtrl->GetItemText(hItem) == strText) return hItem; // 获取第一个子节点 HTREEITEM hChildItem = pTreeCtrl->GetChildItem(hItem); while (hChildItem != NULL) { // 递归查找子节点 HTREEITEM hFoundItem = FindTreeItem(pTreeCtrl, hChildItem, strText); if (hFoundItem != NULL) return hFoundItem; // 获取下一个兄弟节点 hChildItem = pTreeCtrl->GetNextSiblingItem(hChildItem); } // 如果没有找到,返回 nullptr return NULL; } HTREEITEM FindItemInTreeCtrl(CTreeCtrl *pTreeCtrl, const CString &strText) { // 从根节点开始查找 HTREEITEM hRootItem = pTreeCtrl->GetRootItem(); while (hRootItem != NULL) { HTREEITEM hFoundItem = FindTreeItem(pTreeCtrl, hRootItem, strText); if (hFoundItem != NULL) return hFoundItem; // 查找下一个兄弟节点 hRootItem = pTreeCtrl->GetNextSiblingItem(hRootItem); } return NULL; // 未找到返回 nullptr } // windows文件命不能含有“/\:*?"<>|”,统一替换为"'" CString checkFileName(LPCTSTR sfile) { if (!sfile) return _T(""); CString s(sfile); s.Replace(_T('/'), _T('\'')); s.Replace(_T('\\'), _T('\'')); s.Replace(_T(':'), _T('\'')); s.Replace(_T('*'), _T('\'')); s.Replace(_T('?'), _T('\'')); s.Replace(_T('\"'), _T('\'')); s.Replace(_T('<'), _T('\'')); s.Replace(_T('>'), _T('\'')); s.Replace(_T('|'), _T('\'')); return s; } CString getLastErrorMsg() { LPVOID lpMsgBuf; ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR)&lpMsgBuf, 0, NULL ); CString sErr = (LPCTSTR)lpMsgBuf; LocalFree(lpMsgBuf); return sErr; } AecDbEwEquipment *makeEqu(LPCTSTR pszEqu, SH_BIM_BLOCK &bims) { if (!pszEqu) return NULL; if (_taccess(pszEqu, 0x0) != 0x0) return NULL; AecDbEwEquipment *pEqu = new AecDbEwEquipment(); if (!pEqu->ReadFromFile(pszEqu)) { DELETE_PTR(pEqu); return NULL; } bims.clear(); CoreTools::getBimDatas(pEqu, bims); return pEqu; } void insertEqu(AecDbEwEquipment *pEqu) { if (!pEqu) return; AecMInterfaces *pMInf = (AecMInterfaces *)pEqu; CFZSBAddDlg dlg; dlg.SetEqu(pEqu, pMInf); if (IDOK == dlg.DoModal()) { pEqu->SetAt(KEY_POSNO, dlg.m_sPosNo); } //设置osnap AcDbObjectId idPipe; double dEl = 0.0; bool bdEl = false; //选择插入点 ads_point ptRes; while (TRUE) { acedInitGet(RSG_OTHER, _T("E R")); int nRes = acedGetPoint(NULL, _T("\n选择插入位置点或[指定标高(E)/参考点(R)]:"), ptRes); switch (nRes) { case RTNORM: { { EQU_INSERT_POS: acdbUcs2Wcs(ptRes, ptRes, false); if (bdEl) ptRes[Z] = dEl; AcGeVector3d vtMove = asPnt3d(ptRes).asVector(); AcGeMatrix3d mat; mat.setToTranslation(vtMove); pEqu->transformBy(mat); struct resbuf rb; acedGetVar(_T("INSUNITS"), &rb); if (rb.resval.rint == AcDb::kUnitsMeters) //当前图是米制 { AcGeMatrix3d scale; scale.setToScaling(.001); pEqu->AddTransform(scale); } //选择方向,插入 CEquInsDirJig jig; jig.SetEqu(pEqu, asPnt3d(ptRes)); if (jig.DoIt()) { AcGeVector3d vtDir = AcGeVector3d::kXAxis; vtDir.rotateBy(jig.m_dAngle, AcGeVector3d::kZAxis); AcGePoint3d ptIns = asPnt3d(ptRes); pEqu->SetInsert(ptIns, vtDir); if (dlg.m_nIndex1 != -1 && dlg.m_bByInf) { //移动接口到ins 位置 AecInterface infT; pEqu->GetInterface(dlg.m_nIndex1, infT); AcGeVector3d vtInfPos = ptIns - infT.ptPos; mat.setToTranslation(vtInfPos); pEqu->transformBy(mat); } AcDbObjectId idLayE, idLayC, idLayD; idLayE = KTSetting::InitLayer(LAY_EQU); idLayC = KTSetting::InitLayer(LAY_EQU_CENTER); idLayD = KTSetting::InitLayer(LAY_EQU_DASH); pEqu->setLayer(idLayE); pEqu->SetCenterLayer(idLayC); pEqu->SetDashLayer(idLayD); //设备内部已经处理了单位 if (rb.resval.rint == AcDb::kUnitsMeters) //当前图是米制 { pEqu->RemoveLastTransform(); } CoreTools::AddToModelSpace(pEqu); return; } else { DELETE_PTR(pEqu); return; } } break; } case RTKWORD: { TCHAR szKey[3]; acedGetInput(szKey); if (_tcsicmp(_T("E"), szKey) == 0) { CString sTip; sTip.Format(_T("\n请输入标高<%.1f>:"), dEl); nRes = acedGetReal(sTip, &dEl); if (nRes == RTNORM || nRes == RTNONE) { bdEl = true; continue; } else { return; } } else if (_tcsicmp(_T("R"), szKey) == 0) { //参考点<退出>: ads_point ptBase, pt22; int nRelt = acedGetPoint(NULL, _T("\n参考点<退出>:"), ptBase); if (nRelt == RTNORM) { //起点<退出>: nRelt = acedGetPoint(ptBase, _T("\n指定相对位置为插入点<退出>:"), pt22); if (nRelt == RTNORM) { ads_point_set(pt22, ptRes); goto EQU_INSERT_POS; } } } break; } default: return; } } } bool checkFileName(LPCTSTR pszName, LPCTSTR pszCondition) { if (!pszName || !pszCondition) return false; CString sName(pszName), sCondition(pszCondition); sName.MakeLower(); sCondition.MakeLower(); int idx = sName.Find(sCondition); if (idx == -1) return false; // 主要解决 在文件名中查找DN100 会得到 DN1000... 等结果 // 只判断 子串 后面第一个字符是否是数字即可 idx = idx + sCondition.GetLength(); if (idx >= sName.GetLength()) return true; if (sName[idx] <= _T('9') && sName[idx] >= _T('0')) return false; return true; } HTREEITEM findSubDir(CTreeCtrl &tree, HTREEITEM hRoot, LPCTSTR pszSubDir) { if (!tree.ItemHasChildren(hRoot) || !pszSubDir) return NULL; CString str(_T("")); HTREEITEM hChildItem = tree.GetChildItem(hRoot); while (hChildItem != NULL) { str = tree.GetItemText(hChildItem); if (str == pszSubDir) return hChildItem; hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT); } return NULL; } void getAllChildrenItem(CTreeCtrl &tree, HTREEITEM hRoot, std::vector &items) { if (!tree.ItemHasChildren(hRoot)) return; HTREEITEM hChildItem = tree.GetChildItem(hRoot); while (hChildItem != NULL) { items.push_back(hChildItem); getAllChildrenItem(tree, hChildItem, items); hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT); } } bool isFolderItem(CTreeCtrl &tree, HTREEITEM hItem) { return tree.GetRootItem() == tree.GetParentItem(hItem); } bool isRootItem(CTreeCtrl &tree, HTREEITEM hItem) { return hItem == tree.GetRootItem(); } bool isClassItem(CTreeCtrl &tree, HTREEITEM hItem) { return (!isRootItem(tree, hItem) && !isFolderItem(tree, hItem)); } HTREEITEM getParentFolder(CTreeCtrl &tree, const HTREEITEM &hItem) { if (hItem == tree.GetRootItem()) return NULL; if (isFolderItem(tree, hItem)) return hItem; HTREEITEM h = tree.GetParentItem(hItem); while (isClassItem(tree, h)) { h = tree.GetParentItem(h);; } return h; } CString getClassName(CTreeCtrl &tree, const HTREEITEM &hItem) { if (!isClassItem(tree, hItem)) return _T(""); CString sItem = tree.GetItemText(hItem); std::vector v; HTREEITEM hParent(hItem); while (isClassItem(tree, hParent)) { v.push_back(tree.GetItemText(hParent)); hParent = tree.GetParentItem(hParent); } CString sClass(_T("")); for (std::vector::reverse_iterator it = v.rbegin(); it != v.rend(); ++it) { sClass += *it; sClass += _T("\\"); } sClass = sClass.Left(sClass.ReverseFind(_T('\\'))); return sClass; } AecDbEwEquipment *makeEqu(CUIISQLiteServer &db, const int &fid) { CString sSQL(_T("")); std::vector ss; std::vector> bims; ss.clear(); sSQL.Format(_T("select id,name,idclass,rem from aec_package where ID='%d'"), fid); if (!db.GetSelData(sSQL, ss)) return NULL; if (ss.size() < 4) return NULL; CString tmpFile(FilePath::getSystemTemporaryFolder() + _T("\\temp_$_$_.equ")); sSQL.Format(_T("select package from aec_package where ID='%d'"), fid); if (!db.GetSelBlob(sSQL, tmpFile)) return NULL; AecDbEwEquipment *pEqu = new AecDbEwEquipment; if (!pEqu->ReadFromFile(tmpFile)) { DELETE_PTR(pEqu); ::DeleteFile(tmpFile); return NULL; } ::DeleteFile(tmpFile); pEqu->GetSpecialtyData()->SetAt(KEY_ID, ss[0]); pEqu->GetSpecialtyData()->SetAt(KEY_NAME, ss[1]); pEqu->GetSpecialtyData()->SetAt(KEY_CLASSID, ss[2]); pEqu->GetSpecialtyData()->SetAt(_T("_KEY_REM_"), ss[3]); pEqu->setLayer(KTSetting::InitLayer(LAY_PIPE_OUTSIDE)); pEqu->SetDashLayer(KTSetting::InitLayer(LAY_FITN_DASH)); pEqu->SetCenterLayer(KTSetting::InitLayer(LAY_FITN_CENTER)); //关闭箭头,通常入库的设备元件箭头是关闭的 AecEqui::XPrimData xdata; pEqu->ModifyPrimData(0, xdata, 10); // BIM数据 sSQL.Format(_T("select name,value from aec_bims where equid='%d'"), fid); if (db.GetSelDataEx(sSQL, bims)) { SH_BIM_BLOCK datas; for (size_t b = 0; b < bims.size(); ++b) { std::vector &s(bims[b]); if (s.size() >= 2) datas.push_back(std::make_pair(s[0], s[1])); } CoreTools::setBimDatas(pEqu, datas); } return pEqu; } bool selectPath(LPCTSTR pszTitle, CString &strPath) { TCHAR szFolderPath[MAX_PATH] = { 0 }; CString strFolderPath = TEXT(""); BROWSEINFO sInfo; ::ZeroMemory(&sInfo, sizeof(BROWSEINFO)); sInfo.pidlRoot = 0; sInfo.lpszTitle = pszTitle; sInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN; sInfo.lpfn = NULL; LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo); if (lpidlBrowse != NULL) { if (::SHGetPathFromIDList(lpidlBrowse, szFolderPath)) { strFolderPath = szFolderPath; } } if (lpidlBrowse != NULL) { ::CoTaskMemFree(lpidlBrowse); } if (!lpidlBrowse) return false; if (_taccess(strFolderPath, 0x0) != 0x0) { AfxMessageBox(_T("请选择一个有效路径!")); return false; } strPath = strFolderPath + _T("\\"); return true; } bool makeDir(CTreeCtrl &tree, HTREEITEM hItem, LPCTSTR pszRootDir) { if (!pszRootDir) return false; // 根目录不存在 if (_taccess(pszRootDir, 0x0) != 0x0) return false; // hItem 所指目录已经存在, 继续新建子目录,如果不存在,新建 CString sDir = pszRootDir + tree.GetItemText(hItem) + _T("\\"); if (!(_taccess(sDir, 0x0) == 0x0)) { if (!CreateDirectory(sDir, NULL)) { #ifndef NDEBUG AfxMessageBox(getLastErrorMsg()); #endif return false; } } if (!tree.ItemHasChildren(hItem)) return true; HTREEITEM hChildItem = tree.GetChildItem(hItem); while (hChildItem != NULL) { makeDir(tree, hChildItem, sDir); hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT); } return true; } int getLastInserId(CUIISQLiteServer &db, LPCTSTR pszTable) { CString sId; if (db.GetSelData(CString(_T("select last_insert_rowid() from")) + pszTable, sId)) return TypeConvert::convert(sId); return -1; } bool putEQUFileToDb(CUIISQLiteServer &db , LPCTSTR pszFile , int idClass) { if (!pszFile) return false; if (_taccess(pszFile, 0x0) != 0x0) return false; CString sName = CoreTools::getEquipmentName(pszFile); if (sName.IsEmpty()) return false; CString sql(_T("")); sql.Format(_T("insert into aec_package ([name],[rem],[idclass],[package]) values ('%s', '', '%d', ?)") , sName , idClass); if (db.InsertBlob(sql, pszFile) != 0) { db.BeginTrans(); int fid = getLastInserId(db, _T("aec_package")); SH_BIM_BLOCK bims; SH_BIM_BLOCK::const_iterator it; AecDbEwEquipment *pEqu = makeEqu(pszFile, bims); DELETE_PTR(pEqu); for (it = bims.begin(); it != bims.end(); ++it) { sql.Format(_T("insert into aec_bims (name, value, equid) values ('%s', '%s', '%d')") , it->first , it->second , fid); db.ExecuteSQL(sql); } db.CommitTrans(); return true; } return false; } bool putR2PFileToDb(CUIISQLiteServer &db , LPCTSTR pszFile , int idClass) { if (!pszFile) return false; if (_taccess(pszFile, 0x0) != 0x0) return false; CString sPath(pszFile); AecDbEwEquipment *pEqu = new AecDbEwEquipment(); if (pEqu->ReadFromFile(sPath)) { sPath = FilePath::getSystemTemporaryFolder() + _T("\\xxx__xx_dd.equ"); pEqu->WriteToFile(sPath); DELETE_PTR(pEqu); return putEQUFileToDb(db, sPath, idClass); } return false; } bool putZHSBFileToDb(CUIISQLiteServer &db , LPCTSTR pszFile , int idClass , LPCTSTR pszBlkName , LPCTSTR pszPrefix) { if (!pszFile || !pszBlkName || !pszPrefix) return false; if (_taccess(pszFile, 0x0) != 0x0) return false; CString sFile(FilePath::getSystemTemporaryFolder() + _T("\\temp&&$$.dwg")); if (_taccess(sFile, 0x0) == 0x0) ::DeleteFile(sFile); if (!::CopyFile(pszFile, sFile, false)) return false; std::shared_ptr pDb(new AcDbDatabase(false)); if (pDb->readDwgFile(sFile, AcDbDatabase::kForReadAndAllShare) != Acad::eOk) return false; AcDbBlockTableRecordPointer pRcd(pszBlkName, pDb.get(), AcDb::kForRead); if (pRcd.openStatus() != Acad::eOk) { CString sErr(_T("")); sErr.Format(_T("文件%s,不是上华组合设备格式!"), pszFile); AfxMessageBox(sErr); return false; } CString sql(_T("")); sql.Format(_T("insert into %s_package ([name],[rem],[idclass],[package]) values ('%s', '', '%d', ?)") , pszPrefix , FilePath(pszFile)._file_name_without_ext , idClass); return db.InsertBlob(sql, sFile) == 0 ? false : true; } bool putEquFileToDb(CUIISQLiteServer &db, LPCTSTR pszFile, int idClass) { if (!pszFile) return false; if (_taccess(pszFile, 0x0) != 0x0) return false; CString sSuffix = FilePath(pszFile)._ext; if (sSuffix == _T(".equ")) { return putEQUFileToDb(db, pszFile, idClass); } else if (sSuffix == _T(".r2p")) { return putR2PFileToDb(db, pszFile, idClass); } else if (sSuffix == _T(".zhequ")) { return putZHSBFileToDb(db, pszFile, idClass, _T("ZH_SB_BLK_NAME"), _T("DWG")); } else if (sSuffix == _T(".shmod")) { return putZHSBFileToDb(db, pszFile, idClass, _T("MODEL_3D_BLK_NAME"), _T("MODEL")); } return false; } bool hasEquFilesInFolder(LPCTSTR pszDir) { std::vector vs; CoreTools::getFilesInFolder(pszDir, _T("*.equ"), vs, false, true); CoreTools::getFilesInFolder(pszDir, _T("*.r2p"), vs, false, true); CoreTools::getFilesInFolder(pszDir, _T("*.zhequ"), vs, false, true); return !vs.empty(); } void importTo(LPCTSTR pszDir , CTreeCtrl &tree , CUIISQLiteServer &db , HTREEITEM hItem , LPCTSTR pszTablePrefix , const std::vector &fileTypes ) { if (!pszDir || !pszTablePrefix) return; if (fileTypes.empty()) return; if (!hasEquFilesInFolder(pszDir)) return; CString sql(_T("")), sTbl(pszTablePrefix); std::vector v; std::vector::const_reverse_iterator rit; CoreTools::SplitString(pszDir, _T('\\'), v); if (v.empty()) return; CString sFolder(*v.rbegin()), sClassPath(_T("")); if (sFolder.IsEmpty()) { for (rit = v.rbegin(); rit != v.rend(); ++rit) { if (!rit->IsEmpty()) { sFolder = *rit; break; } } } int idFolder(-1); std::vector files; std::vector dirs; if (isRootItem(tree, hItem)) { // 如果选择的是根节点,则需要把第一个目录名当做Folder插入到数据库中 HTREEITEM h = findSubDir(tree, hItem, sFolder); if (h) { idFolder = tree.GetItemData(h); } else { sql.Format(_T("insert into %s_folder (folder) values ('%s')"), sTbl, sFolder); if (!db.ExecuteSQL(sql)) { AfxMessageBox(_T("新建Folder失败!")); return; } idFolder = getLastInserId(db, CString(pszTablePrefix) + _T("_folder")); h = tree.InsertItem(sFolder, 0, 2, hItem); tree.SetItemData(h, idFolder); } // Folder 目录下面没有文件操作 dirs.clear(); CoreTools::getSubFolderByPath(pszDir, dirs, false); for (size_t i = 0; i < dirs.size(); ++i) { importTo(dirs[i], tree, db, h, pszTablePrefix, fileTypes); } } else { // 如果不是根目录,则只需要在hItem下面新建节点,并在 class 库内新建记录 HTREEITEM h = findSubDir(tree, hItem, sFolder); if (!h) { h = tree.InsertItem(sFolder, 0, 2, hItem); HTREEITEM hFolder = getParentFolder(tree, h); idFolder = tree.GetItemData(hFolder); sClassPath = getClassName(tree, h); sql.Format(_T("insert into %s_class (class, idfolder) values('%s', '%d')") , sTbl, sClassPath, idFolder); if (!db.ExecuteSQL(sql)) { tree.DeleteItem(h); AfxMessageBox(_T("向aec_class插入数据失败!")); return; } tree.SetItemData(h, getLastInserId(db, sTbl + _T("_class"))); } sFolder = tree.GetItemText(getParentFolder(tree, h)); sClassPath = getClassName(tree, h); int idClass = tree.GetItemData(h); files.clear(); for (size_t i(0); i < fileTypes.size(); ++i) { CoreTools::getFilesInFolder(pszDir, fileTypes[i], files, false, false); } for (size_t f = 0; f < files.size(); ++f) { CString &sPath(files[f]); if (!putEquFileToDb(db, sPath, idClass)) continue; } dirs.clear(); CoreTools::getSubFolderByPath(pszDir, dirs, false); for (size_t i = 0; i < dirs.size(); ++i) { importTo(dirs[i], tree, db, h, pszTablePrefix, fileTypes); } } } bool hasSameFileName(CListBox &list, LPCTSTR name) { CString s; for (int i = 0; i < list.GetCount(); ++i) { list.GetText(i, s); if (s == name) return true; } return false; } extern "C" bool WblockToDgnFile(AcDbVoidPtrArray &, LPCTSTR , const AcGePoint3d &); /*void saveToBentley(AecDbEwEquipment *pEqu, CString &sPath) { FilePath fp(sPath); CString sFile = fp._directory + fp._file_name_without_ext + _T(".dwg"); pEqu->SetInsert(AcGePoint3d::kOrigin, AcGeVector3d::kXAxis); AcGiViewDraw dc(NULL, NULL); pEqu->Draw3d(dc); AcDbVoidPtrArray ar; pEqu->GetDraw3dables(ar, true); WblockToDgnFile(ar, sFile, AcGePoint3d::kOrigin); }*/ } #pragma region CModelLibDlgBase #define _VALVE_ _T("阀") IMPLEMENT_DYNAMIC(CModelLibDlgBase, CDialog) BEGIN_MESSAGE_MAP(CModelLibDlgBase, CDialog) ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CModelLibDlgBase::onAcadKeepFocus) ON_BN_CLICKED(IDC_DIR_ADD, &CModelLibDlgBase::OnBnClickedDirAdd) ON_BN_CLICKED(IDC_DIR_MODI, &CModelLibDlgBase::OnBnClickedDirRename) ON_BN_CLICKED(IDC_DIR_DEL, &CModelLibDlgBase::OnBnClickedDirDel) ON_BN_CLICKED(IDC_DIR_OUT, &CModelLibDlgBase::OnBnClickedDirOut) ON_BN_CLICKED(IDC_DIR_IN, &CModelLibDlgBase::OnBnClickedDirIn) ON_BN_CLICKED(IDC_FILE_NEW, &CModelLibDlgBase::OnBnClickedFileNew) ON_BN_CLICKED(IDC_FILE_IN, &CModelLibDlgBase::OnBnClickedFileIn) ON_BN_CLICKED(IDC_FILE_COPY, &CModelLibDlgBase::OnBnClickedFileCopy) ON_BN_CLICKED(IDC_FILE_RENAME, &CModelLibDlgBase::OnBnClickedFileRename) ON_BN_CLICKED(IDC_FILE_DEL, &CModelLibDlgBase::OnBnClickedFileDel) ON_BN_CLICKED(IDC_FILE_OUT, &CModelLibDlgBase::OnBnClickedFileOut) ON_BN_CLICKED(IDC_BIM_ADD, &CModelLibDlgBase::OnBnClickedBimAdd) ON_BN_CLICKED(IDC_BIM_MODI, &CModelLibDlgBase::OnBnClickedBimModi) ON_BN_CLICKED(IDC_BIM_DEL, &CModelLibDlgBase::OnBnClickedBimDel) ON_BN_CLICKED(IDOK, &CModelLibDlgBase::OnBnClickedOk) ON_BN_CLICKED(IDC_INSERT, &CModelLibDlgBase::OnBnClickedInsert) ON_NOTIFY(TVN_SELCHANGED, IDC_DIR_TREE, &CModelLibDlgBase::OnTvnSelchangedLocalDirTree) ON_LBN_SELCHANGE(IDC_FILE_LIST, &CModelLibDlgBase::OnLbnSelchangeFileList) ON_WM_CONTEXTMENU() ON_BN_CLICKED(IDC_CHECK_SEARCH, &CModelLibDlgBase::OnCheckSearch) ON_EN_CHANGE(IDC_EDIT_SEARCH, &CModelLibDlgBase::OnEnChangeSearch) ON_LBN_DBLCLK(IDC_FILE_LIST, &CModelLibDlgBase::OnLbnDblClkFileList) ON_BN_CLICKED(IDC_BTN_EXPAND_SERVER, &CModelLibDlgBase::OnBnClickedBtnExpandServerDirTree) END_MESSAGE_MAP() CModelLibDlgBase::CModelLibDlgBase(LPCTSTR pszTitle, LPCTSTR pszDir, LPCTSTR pszFile, CWnd* pParent) : CDialog(CModelLibDlgBase::IDD, pParent) , m_hBitmap(NULL) , m_bSearch(FALSE) , m_strDirAnchor(_T("")) , m_strFileAnchor(_T("")) , m_iSelectFileID(-1) , m_sTitle(pszTitle) , m_nDlgExpandedWidth(0) , m_nDlgCollapsedWidth(0) { if (pszDir) m_strDirAnchor = pszDir; if (pszFile) m_strFileAnchor = pszFile; } CModelLibDlgBase::~CModelLibDlgBase() { if (m_hBitmap) ::DeleteObject(m_hBitmap); } void CModelLibDlgBase::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_DIR_TREE, m_ctrlLocalDirTree); DDX_Control(pDX, IDC_FILE_LIST, m_ctrlLocalFileList); DDX_Control(pDX, IDC_BIM_LIST, m_ctrlBimPropertyList); DDX_Control(pDX, IDC_EDIT_SEARCH, m_ctrlSearchEdit); DDX_Control(pDX, IDC_STATIC_SEP_MID, m_ctrlStaticSepMid); DDX_Control(pDX, IDC_STATIC_DIR, m_ctrlStaticDir); DDX_Control(pDX, IDC_STATIC_FILE, m_ctrlStaticFile); DDX_Check(pDX, IDC_CHECK_SEARCH, m_bSearch); DDX_Text(pDX, IDC_EDIT_SEARCH, m_sSearch); DDX_Control(pDX, IDC_STATIC_SEP_LEFT, m_ctrlStaticSepLeft); DDX_Control(pDX, IDC_SERVER_TREE, m_ctrlServerDirTree); DDX_Control(pDX, IDC_BTN_EXPAND_SERVER, m_btnExpandServerDirTree); } BOOL CModelLibDlgBase::OnInitDialog() { CDialog::OnInitDialog(); // 初始化数据库 initSqliteDB(); // 此时还没有隐藏“共享文件”部分,先得到对话框宽度 CRect rt1, rt2; GetWindowRect(&rt1); m_nDlgExpandedWidth = rt1.Width(); m_ctrlStaticSepLeft.GetWindowRect(rt2); m_nDlgCollapsedWidth = m_nDlgExpandedWidth - (rt2.left - rt1.left); // 初始化image list initImageListForLocalDirTree(); initImageListForServerDirTree(); // 初始化目录树 initLocalDirTree(); // 初始化Server目录树 initServerDirTree(); // 初始化 BIM 属性列表 initBimPropertyList(); // 初始化预览控件 initPreviewCtrl(); m_ctrlLocalFileList.ResetContent(); m_ctrlSearchEdit.EnableWindow(m_bSearch); UpdateData(FALSE); // 初始状态,为收起 “共享文件”部分 ExpandServerDirTree(false); SetWindowText(m_sTitle); if (m_bSearch && !m_sSearch.IsEmpty()) { // 开始就进入搜索模式 OnCheckSearch(); OnEnChangeSearch(); } return TRUE; } BOOL CModelLibDlgBase::DestroyWindow() { g_result.clear(); return CDialog::DestroyWindow(); } void CModelLibDlgBase::getBimDatasByList(std::map &bims) { for (int i = 0; i < m_ctrlBimPropertyList.GetItemCount(); ++i) { bims.insert(std::make_pair(m_ctrlBimPropertyList.GetItemText(i, 0), m_ctrlBimPropertyList.GetItemText(i, 1))); } } void CModelLibDlgBase::getSelectedFiles(std::vector& files) { for (int i = 0; i < m_ctrlLocalFileList.GetCount(); ++i) { if (m_ctrlLocalFileList.GetSel(i) > 0) { files.push_back(i); } } } void CModelLibDlgBase::anchorDir() { if (m_strDirAnchor.IsEmpty()) return; m_strDirAnchor.TrimLeft(_T('\\')); std::vector dirs; CoreTools::SplitString(m_strDirAnchor, _T('\\'), dirs); HTREEITEM hRoot = m_ctrlLocalDirTree.GetRootItem(); for (size_t i = 0; i < dirs.size(); ++i) { HTREEITEM h = findSubDir(m_ctrlLocalDirTree, hRoot, dirs[i]); if (!h) break; hRoot = h; m_ctrlLocalDirTree.SelectItem(h); m_ctrlLocalDirTree.Expand(h, TVE_EXPAND); } } void CModelLibDlgBase::moveCtrlX(int ctrlID, int offset) { CWnd *pWnd = GetDlgItem(ctrlID); if (!pWnd) return; CRect rect; ::GetWindowRect(pWnd->m_hWnd, rect); rect.right += offset; rect.left += offset; ScreenToClient(rect); pWnd->MoveWindow(&rect); } void CModelLibDlgBase::moveCtrlX(int nDelta) { moveCtrlX(IDC_STATIC_DIR, nDelta); moveCtrlX(IDC_STATIC_FILE, nDelta); moveCtrlX(IDC_CHECK_SEARCH, nDelta); moveCtrlX(IDC_EDIT_SEARCH, nDelta); moveCtrlX(IDC_DIR_TREE, nDelta); moveCtrlX(IDC_FILE_LIST, nDelta); moveCtrlX(IDC_STATIC_SEP_SEARCH, nDelta); moveCtrlX(IDC_STATIC_PREVIEW, nDelta); moveCtrlX(IDC_PREVIEW_PIC, nDelta); moveCtrlX(IDC_STATIC_SEP_BIM, nDelta); moveCtrlX(IDC_STATIC_BIM, nDelta); moveCtrlX(IDC_BIM_LIST, nDelta); moveCtrlX(IDC_STATIC_SEP_BOTTOM, nDelta); moveCtrlX(IDC_DIR_ADD, nDelta); moveCtrlX(IDC_DIR_MODI, nDelta); moveCtrlX(IDC_DIR_DEL, nDelta); moveCtrlX(IDC_DIR_IN, nDelta); moveCtrlX(IDC_DIR_OUT, nDelta); moveCtrlX(IDC_FILE_IN, nDelta); moveCtrlX(IDC_FILE_OUT, nDelta); moveCtrlX(IDC_FILE_COPY, nDelta); moveCtrlX(IDC_FILE_RENAME, nDelta); moveCtrlX(IDC_FILE_DEL, nDelta); moveCtrlX(IDC_FILE_NEW, nDelta); moveCtrlX(IDC_BIM_ADD, nDelta); moveCtrlX(IDC_BIM_MODI, nDelta); moveCtrlX(IDC_BIM_DEL, nDelta); moveCtrlX(IDC_BTN_EXPAND_SERVER, nDelta); moveCtrlX(IDOK, nDelta); moveCtrlX(IDC_INSERT, nDelta); moveCtrlX(IDC_STATIC_SEP_MID, nDelta); moveCtrlX(IDC_STATIC_SEP_RIGHT, nDelta); } void CModelLibDlgBase::ShowHideWindow(int ctrlID, bool bShow) { CWnd *pWnd = GetDlgItem(ctrlID); if (!pWnd) return; pWnd->ShowWindow(bShow ? SW_SHOW : SW_HIDE); } bool CModelLibDlgBase::isFolderItem(HTREEITEM hItem) { return ::isFolderItem(m_ctrlLocalDirTree, hItem); } bool CModelLibDlgBase::isRootItem(HTREEITEM hItem) { return ::isRootItem(m_ctrlLocalDirTree, hItem); } bool CModelLibDlgBase::isClassItem(HTREEITEM hItem) { return ::isClassItem(m_ctrlLocalDirTree, hItem); } HTREEITEM CModelLibDlgBase::getParentFolder(const HTREEITEM &hItem) { return ::getParentFolder(m_ctrlLocalDirTree, hItem); } CString CModelLibDlgBase::getClassName(const HTREEITEM & hItem) { return ::getClassName(m_ctrlLocalDirTree, hItem); } LONG_PTR CModelLibDlgBase::onAcadKeepFocus(UINT_PTR, LONG_PTR) { POINT pt; ::GetCursorPos(&pt); CRect rect; GetWindowRect(&rect); if (!(rect.PtInRect(pt))) { return FALSE; } return TRUE; } void CModelLibDlgBase::ExpandServerDirTree(bool bExpand) { CRect rect; GetWindowRect(rect); int nDelta(m_nDlgExpandedWidth - m_nDlgCollapsedWidth); if (bExpand) {// 展开 m_ctrlServerDirTree.ShowWindow(SW_SHOW); m_ctrlStaticSepLeft.ShowWindow(SW_SHOW); ShowHideWindow(IDC_DIR_ADD_TO_LOCAL, true); ShowHideWindow(IDC_STATIC_SERVER, true); rect.left = rect.right - m_nDlgExpandedWidth; MoveWindow(rect); moveCtrlX(nDelta); m_btnExpandServerDirTree.SetWindowText(_T("-->")); } else {// 收起 m_ctrlServerDirTree.ShowWindow(SW_HIDE); m_ctrlStaticSepLeft.ShowWindow(SW_HIDE); ShowHideWindow(IDC_DIR_ADD_TO_LOCAL, false); ShowHideWindow(IDC_STATIC_SERVER, false); rect.left = rect.right - m_nDlgCollapsedWidth; MoveWindow(rect); moveCtrlX(-nDelta); m_btnExpandServerDirTree.SetWindowText(_T("<--")); } Invalidate(TRUE); } void CModelLibDlgBase::OnBnClickedDirAdd() { BnClickedDirAdd(); } void CModelLibDlgBase::OnBnClickedDirRename() { BnClickedDirRename(); } void CModelLibDlgBase::OnBnClickedDirDel() { BnClickedDirDel(); } void CModelLibDlgBase::OnBnClickedDirOut() { BnClickedDirOut(); } void CModelLibDlgBase::OnBnClickedDirIn() { BnClickedDirIn(); } void CModelLibDlgBase::OnBnClickedFileIn() { BnClickedFileIn(); } void CModelLibDlgBase::OnBnClickedFileCopy() { BnClickedFileCopy(); } void CModelLibDlgBase::helper_CurrentSelectFilePosition() { std::vector files; getSelectedFiles(files); if (files.size() != 1) return; CString path; m_ctrlLocalFileList.GetText(files[0], path); std::vector items; CoreTools::SplitString(path, _T("\\"), items); if (items.size() < 1) return; HTREEITEM hParent(m_ctrlLocalDirTree.GetRootItem()); for (size_t i(0); i < items.size() - 1; ++i) { hParent = FindTreeItem(&m_ctrlLocalDirTree, hParent, items[i]); } if (!hParent) return; m_bSearch = FALSE; UpdateData(FALSE); OnCheckSearch(); m_ctrlLocalDirTree.Select(hParent, TVGN_CARET); int idx = m_ctrlLocalFileList.FindString(0, *items.rbegin()); if (idx != -1) m_ctrlLocalFileList.SetSel(idx); } void CModelLibDlgBase::OnBnClickedFileRename() { BnClickedFileRename(); } void CModelLibDlgBase::OnBnClickedFileDel() { BnClickedFileDel(); } void CModelLibDlgBase::OnBnClickedFileOut() { BnClickedFileOut(); } void CModelLibDlgBase::OnBnClickedBimAdd() { BnClickedBimAdd(); } void CModelLibDlgBase::OnBnClickedBimModi() { BnClickedBimModi(); } void CModelLibDlgBase::OnBnClickedBimDel() { BnClickedBimDel(); } void CModelLibDlgBase::OnBnClickedOk() { BnClickedOk(); } void CModelLibDlgBase::OnBnClickedInsert() { BnClickedInsert(); } AecDbEwEquipment* CModelLibDlgBase::getEquipment(int fid) { return makeEqu(m_sqlDB, fid); } void CModelLibDlgBase::OnTvnSelchangedLocalDirTree(NMHDR *pNMHDR, LRESULT *pResult) { TvnSelchangedLocalDirTree(pNMHDR, pResult); } void CModelLibDlgBase::OnLbnSelchangeFileList() { LbnSelchangeFileList(); } void CModelLibDlgBase::OnContextMenu(CWnd *pWnd, CPoint pt) { UpdateData(TRUE); UINT uFlags; CPoint ptScreen = pt; ::ScreenToClient(pWnd->GetSafeHwnd(), &ptScreen); if (pWnd->IsKindOf(RUNTIME_CLASS(CTreeCtrl))) { CTreeCtrl *pTreeCtrl = (CTreeCtrl*)CTreeCtrl::FromHandle(pWnd->GetSafeHwnd()); HTREEITEM hItem = pTreeCtrl->HitTest(ptScreen, &uFlags); if ((hItem != NULL) && (TVHT_ONITEM & uFlags)) pTreeCtrl->SelectItem(hItem); } else if (pWnd->IsKindOf(RUNTIME_CLASS(CListBox))) { CListBox *pListBox = (CListBox*)CListBox::FromHandle(pWnd->GetSafeHwnd()); BOOL bOutSide; int nIndex = pListBox->ItemFromPoint(ptScreen, bOutSide); if (nIndex >= 0 && nIndex < pListBox->GetCount()) { CRect rc; pListBox->GetItemRect(nIndex, &rc); if (rc.PtInRect(ptScreen)) pListBox->SetCurSel(nIndex); } } if (pWnd->GetSafeHwnd() == m_ctrlLocalFileList.GetSafeHwnd()) { PopMenuForLocalFileList(pt); } if (pWnd->GetSafeHwnd() == m_ctrlLocalDirTree.GetSafeHwnd()) { PopMenuForLocalDirTree(pt); } if (pWnd->GetSafeHwnd() == m_ctrlServerDirTree.GetSafeHwnd()) { PopMenuForServerDirTree(pt); } g_result.clear(); return; } void CModelLibDlgBase::OnBnClickedFileNew() { BnClickedFileNew(); } void CModelLibDlgBase::OnCheckSearch() { CheckSearch(); } void CModelLibDlgBase::OnEnChangeSearch() { EnChangeSearch(); } void CModelLibDlgBase::OnLbnDblClkFileList() { LbnDblClkFileList(); } void CModelLibDlgBase::OnBnClickedBtnExpandServerDirTree() { // 通过 m_ctrlServerDirTree的显示状态来决定是展开还是收起 bool bExpand = !m_ctrlServerDirTree.IsWindowVisible(); ExpandServerDirTree(bExpand); } #pragma endregion #pragma region override method void CModelLibDlgBase::CheckSearch() { UpdateData(TRUE); CRect reSep, reTree, reList; m_ctrlStaticSepMid.GetWindowRect(reSep); m_ctrlLocalDirTree.GetWindowRect(reTree); if (m_bSearch) { m_ctrlLocalFileList.GetWindowRect(reList); int delta = reList.left - reSep.left; reList.left = reTree.left; ScreenToClient(reList); m_ctrlLocalFileList.MoveWindow(reList); SetWindowText(_T("输入要搜索的文件的特征,多个特征用“空格”分开。")); } else { m_ctrlLocalFileList.GetWindowRect(reList); reList.left = reSep.left + 6; ScreenToClient(reList); m_ctrlLocalFileList.MoveWindow(reList); SetWindowText(m_sTitle); } m_ctrlStaticDir.SetWindowText(m_bSearch ? _T("搜索结果") : _T("文件目录")); m_ctrlSearchEdit.EnableWindow(m_bSearch); ::ShowWindow(m_ctrlStaticSepMid, m_bSearch ? SW_HIDE : SW_SHOW); ::ShowWindow(m_ctrlLocalDirTree, m_bSearch ? SW_HIDE : SW_SHOW); ::ShowWindow(m_ctrlStaticFile, m_bSearch ? SW_HIDE : SW_SHOW); m_ctrlLocalDirTree.SelectItem(m_ctrlLocalDirTree.GetRootItem()); m_ctrlSearchEdit.IsWindowVisible(); SHOWWINDOW(IDC_DIR_ADD, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_DIR_MODI, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_DIR_DEL, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_DIR_OUT, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_DIR_IN, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_FILE_NEW, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_FILE_IN, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_FILE_OUT, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_FILE_DEL, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_FILE_RENAME, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_FILE_IN, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_FILE_COPY, m_bSearch ? SW_HIDE : SW_SHOW); SHOWWINDOW(IDC_BTN_EXPAND_SERVER, m_bSearch ? SW_HIDE : SW_SHOW); m_ctrlLocalFileList.ResetContent(); } #pragma endregion #pragma region helper method void CModelLibDlgBase::helper_initServerDirTree(LPCTSTR pszRoot) { m_ctrlServerDirTree.SetImageList(&m_imageListServerDir, TVSIL_NORMAL); CString sTitle(pszRoot); HTREEITEM hRoot = m_ctrlServerDirTree.InsertItem(sTitle, 0, 2, TVI_ROOT); m_ctrlServerDirTree.SetItemData(hRoot, -1); } void CModelLibDlgBase::helper_initLocalDirTree(LPCTSTR pszRoot, LPCTSTR pszTablePrefix) { helper_initLocalDirTree(m_ctrlLocalDirTree , m_imageListLocalDir , m_sqlDB , pszRoot , pszTablePrefix); anchorDir(); } void CModelLibDlgBase::helper_initImageList(CImageList &imglist,UINT imgListID) { CBitmap bmp; if (!bmp.LoadBitmap(imgListID)) { AfxMessageBox(_T("Can't load bitmap: %x\n"), imgListID); ASSERT(FALSE); return; } BITMAP bmpObj; bmp.GetBitmap(&bmpObj); UINT nFlags = ILC_COLOR24 | ILC_MASK; imglist.Create(16, bmpObj.bmHeight, nFlags, 0, 0); imglist.Add(&bmp, RGB(255, 0, 0)); } void CModelLibDlgBase::helper_initBIMList() { m_ctrlBimPropertyList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SINGLEROW); m_ctrlBimPropertyList.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 150); m_ctrlBimPropertyList.InsertColumn(1, _T("属性"), LVCFMT_LEFT, 150); } void CModelLibDlgBase::helper_ClickedLocalDirAdd(LPCTSTR pszTablePrefix) { if (!pszTablePrefix) return; HTREEITEM hRoot(m_ctrlLocalDirTree.GetRootItem()); HTREEITEM hItem = m_ctrlLocalDirTree.GetSelectedItem(); if (!hItem) { AfxMessageBox(_T("请选中一个目录!")); return; } CString sName(_T("")), sTmp(_T("")); if (!CoreTools::getNameByDialog(_T("输入目录名称"), _T("目录名称"), sTmp)) return; if (sTmp.Find(_T('\\')) != -1) { AfxMessageBox(_T("目录名称中不能存在字符“\\”!")); return; } HTREEITEM h = findSubDir(m_ctrlLocalDirTree, hItem, sTmp); if (h) { AfxMessageBox(_T("目录已经存在!")); return; } CString sTbl(pszTablePrefix), sql(_T("")), sId(_T("")); HTREEITEM hNew(NULL); if (isRootItem(hItem)) // 添加 folder { sql.Format(_T("insert into %s_folder (folder) values ('%s')"), sTbl, sTmp); if (m_sqlDB.ExecuteSQL(sql)) { hNew = m_ctrlLocalDirTree.InsertItem(sTmp, 0, 2, hItem); m_ctrlLocalDirTree.SetItemData(hNew, getLastInserId(m_sqlDB, sTbl + _T("_folder"))); m_ctrlLocalDirTree.Expand(hItem, TVE_EXPAND); } return; } else { CString sClass = getClassName(hItem); if (!sClass.IsEmpty()) sClass += _T("\\"); sClass += sTmp; HTREEITEM hParent = getParentFolder(hItem); int idFolder = m_ctrlLocalDirTree.GetItemData(hParent); sql.Format(_T("insert into %s_class(class, idfolder) values ('%s', '%d')"), sTbl, sClass, idFolder); if (m_sqlDB.ExecuteSQL(sql)) { hNew = m_ctrlLocalDirTree.InsertItem(sTmp, 0, 2, hItem); m_ctrlLocalDirTree.SetItemData(hNew, getLastInserId(m_sqlDB, sTbl + _T("_class"))); m_ctrlLocalDirTree.Expand(hItem, TVE_EXPAND); } return; } } void CModelLibDlgBase::helper_ClickedLocalDirRename(LPCTSTR pszTablePrefix) { if (pszTablePrefix == NULL) return; HTREEITEM hItem = m_ctrlLocalDirTree.GetSelectedItem(); if (!hItem) { AfxMessageBox(_T("请选中一个目录!")); return; } if (isRootItem(hItem)) { AfxMessageBox(_T("不能修改根目录名称!")); return; } if (isFolderItem(hItem)) { CString sItem = m_ctrlLocalDirTree.GetItemText(hItem); if (sItem == _VALVE_) { AfxMessageBox(_T("不能修改“阀”目录名称!")); return; } } CString sTmp(m_ctrlLocalDirTree.GetItemText(hItem)); if (!CoreTools::getNameByDialog(_T("输入目录新名称"), _T("目录新名称"), sTmp)) return; if (sTmp.Find(_T('\\')) != -1) { AfxMessageBox(_T("目录名称中不能存在字符“\\”!")); return; } HTREEITEM hParent = m_ctrlLocalDirTree.GetParentItem(hItem); HTREEITEM h = findSubDir(m_ctrlLocalDirTree, hParent, sTmp); if (h) { AfxMessageBox(_T("目录已经存在!")); return; } int idFolder = m_ctrlLocalDirTree.GetItemData(hItem); CString sql(_T("")), str(_T("")), sItemName(m_ctrlLocalDirTree.GetItemText(hItem)), sTbl(pszTablePrefix); if (isFolderItem(hItem)) { sql.Format(_T("update %s_folder set folder='%s' where id='%d'"), sTbl, sTmp, idFolder); if (m_sqlDB.ExecuteSQL(sql)) { m_ctrlLocalDirTree.SetItemText(hItem, sTmp); m_ctrlLocalDirTree.Invalidate(); return; } return; } else { // 首先把自己的一行记录修改 // 先判断一下自己的目录名称在目录串是第几个位置 sql.Format(_T("select class from %s_class where id='%d'"), sTbl, idFolder); if (!m_sqlDB.GetSelData(sql, str)) return; std::vector v; CoreTools::SplitString(str, _T('\\'), v); if (v.empty()) return; std::vector::iterator it = std::find(v.begin(), v.end(), sItemName); if (it == v.end()) return; int dist = std::distance(v.begin(), it); std::vector items; items.push_back(hItem); getAllChildrenItem(m_ctrlLocalDirTree, hItem, items); std::vector vv; int idSub(-1); BOOL bSuccess(false); for (size_t i = 0; i < items.size(); ++i) { vv.clear(); idSub = m_ctrlLocalDirTree.GetItemData(items[i]); sql.Format(_T("select class from %s_class where id='%d'"), sTbl, idSub); if (!m_sqlDB.GetSelData(sql, str)) continue; CoreTools::SplitString(str, _T('\\'), vv); if (vv.size() <= dist) continue; str.Empty(); vv[dist] = sTmp; for (size_t j = 0; j < vv.size(); ++j) { str += vv[j]; str += _T("\\"); } str = str.Left(str.GetLength() - 1); sql.Format(_T("update %s_class set class = '%s' where id='%d'"), sTbl, str, idSub); bSuccess = m_sqlDB.ExecuteSQL(sql); } if (bSuccess) { m_ctrlLocalDirTree.SetItemText(hItem, sTmp); m_ctrlLocalDirTree.Invalidate(); } return; } } void CModelLibDlgBase::helper_ClickedLocalDirDel(LPCTSTR pszTablePrefix) { if (pszTablePrefix == NULL) return; HTREEITEM hItem = m_ctrlLocalDirTree.GetSelectedItem(); if (!hItem) { AfxMessageBox(_T("请选中一个目录!")); return; } if (isRootItem(hItem)) { AfxMessageBox(_T("不能删除根目录!")); return; } if (m_ctrlLocalDirTree.ItemHasChildren(hItem)) { AfxMessageBox(_T("此目录下还有子目录,请先删除子目录!")); return; } if (isFolderItem(hItem)) { CString sItem = m_ctrlLocalDirTree.GetItemText(hItem); if (sItem == _VALVE_) { AfxMessageBox(_T("不能删除“阀”目录!")); return; } } CString sTbl(pszTablePrefix), sql(_T("")); int idFolder = m_ctrlLocalDirTree.GetItemData(hItem); if (isClassItem(hItem)) { CString sTmp(_T("")); sql.Format(_T("select count(id) from %s_package where idclass='%d'"), sTbl, idFolder); if (m_sqlDB.GetSelData(sql, sTmp)) { if (TypeConvert::convert(sTmp) > 0) { AfxMessageBox(_T("此目录下还有文件,请先删除子目录下的文件!")); return; } } else return; if (AfxMessageBox(_T("是否删除?此操作不可逆!"), MB_YESNO) != IDYES) return; sql.Format(_T("delete from %s_class where id='%d'"), sTbl, idFolder); if (m_sqlDB.ExecuteSQL(sql)) { m_ctrlLocalDirTree.DeleteItem(hItem); m_ctrlLocalDirTree.Invalidate(); } } if (isFolderItem(hItem)) { // 先删除数据库中内容 if (AfxMessageBox(_T("是否删除?此操作不可逆!"), MB_YESNO) != IDYES) return; sql.Format(_T("delete from %s_folder where id='%d'"), sTbl, idFolder); if (m_sqlDB.ExecuteSQL(sql)) { m_ctrlLocalDirTree.DeleteItem(hItem); m_ctrlLocalDirTree.Invalidate(); } return; } } void CModelLibDlgBase::helper_ClickedLocalDirOut(LPCTSTR pszTablePrefix, LPCTSTR pszFileSuffix) { if (pszTablePrefix == NULL || pszFileSuffix == NULL) return; HTREEITEM hRoot = m_ctrlLocalDirTree.GetSelectedItem(); if (!hRoot) { AfxMessageBox(_T("请选中一个目录!")); return; } bool bRootItem(isRootItem(hRoot)); CString sPath(_T("")); if (!selectPath(_T("请选择文件要保存的目录"), sPath)) return; // 先建好目录 makeDir(m_ctrlLocalDirTree, hRoot, sPath); sPath += m_ctrlLocalDirTree.GetItemText(hRoot); std::vector items; items.push_back(hRoot); getAllChildrenItem(m_ctrlLocalDirTree, hRoot, items); CString sRoot(_T("")); if (isClassItem(hRoot)) sRoot = getClassName(hRoot); CString sFullPath(_T("")) , sql(_T("")) , sTmp(_T("")) , sClassPath(_T("")) , sFolderName(_T("")) , sFileSuffix(pszFileSuffix) , sTbl(pszTablePrefix); int classId(-1); static int _idx(0); std::map mm; std::map::const_iterator it; for (size_t i = 0; i < items.size(); ++i) { HTREEITEM h(items[i]); if (!isClassItem(h)) continue; sClassPath = getClassName(h); sClassPath.Replace(sRoot, _T("")); if (bRootItem) { sFolderName = m_ctrlLocalDirTree.GetItemText(getParentFolder(h)); sFullPath.Format(_T("%s\\%s\\%s\\"), sPath, sFolderName, sClassPath); } else { sFullPath.Format(_T("%s\\%s\\"), sPath, sClassPath); } mm.clear(); classId = m_ctrlLocalDirTree.GetItemData(h); sql.Format(_T("select id, name from %s_package where idclass='%d'"), sTbl, classId); m_sqlDB.GetSelData(sql, mm); if (mm.empty()) continue; CString sName(_T("")); for (it = mm.begin(); it != mm.end(); ++it) { _idx = 0; AecDbEwEquipment *pEqu = makeEqu(m_sqlDB, TypeConvert::convert(it->first)); if (pEqu) { sName = checkFileName(it->second); sTmp = sFullPath + sName + sFileSuffix; while (_taccess(sTmp, 0x0) == 0x0) { sTmp.Format(_T("%s%s%d%s"), sFullPath, it->second, ++_idx, sFileSuffix); } CoreTools::equipment2File(pEqu, sTmp, it->second); //saveToBentley(pEqu, sTmp); DELETE_PTR(pEqu); } } } AfxMessageBox(_T("导出完毕。")); } void CModelLibDlgBase::helper_ClickedLocalDirIn(LPCTSTR pszTablePrefix, const std::vector &filetypes) { HTREEITEM hItem = m_ctrlLocalDirTree.GetSelectedItem(); if (!hItem) { AfxMessageBox(_T("请选中一个目录!")); return; } CString sPath(_T("")); if (!selectPath(_T("请选择一个要导入的目录"), sPath)) return; importTo(sPath + _T("\\") , m_ctrlLocalDirTree , m_sqlDB , hItem , pszTablePrefix , filetypes); AfxMessageBox(_T("导入完毕。")); } void CModelLibDlgBase::helper_ClickedFileIn(LPCTSTR pszFileTypeFilter) { if (!pszFileTypeFilter) return; HTREEITEM hItem = m_ctrlLocalDirTree.GetSelectedItem(); if (!hItem) { AfxMessageBox(_T("请选中一个目录!")); return; } if (!isClassItem(hItem)) { AfxMessageBox(_T("不能在根目录或一级目录下保存文件,请选择一个二级目录!")); return; } CFileDialog fileDlg(TRUE , NULL , NULL , OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT , pszFileTypeFilter); fileDlg.m_ofn.nMaxFile = 4096; fileDlg.m_ofn.lpstrFile = new TCHAR[fileDlg.m_ofn.nMaxFile]; ::memset(fileDlg.m_ofn.lpstrFile, 0, sizeof(TCHAR) * fileDlg.m_ofn.nMaxFile); if (fileDlg.DoModal() != IDOK) return; HTREEITEM hFolder = getParentFolder(hItem); if (!hFolder || !isFolderItem(hFolder)) return; CString sPath(_T("")); int idxClass = m_ctrlLocalDirTree.GetItemData(hItem); POSITION pos = fileDlg.GetStartPosition(); while (pos != NULL) { sPath = fileDlg.GetNextPathName(pos); putEquFileToDb(m_sqlDB, sPath, idxClass); } delete[] fileDlg.m_ofn.lpstrFile; refreshLocalFileList(hItem); AfxMessageBox(_T("导入完毕。")); } void CModelLibDlgBase::helper_ClickedFileCopy(LPCTSTR pszRoot, LPCTSTR pszTablePrefix) { if (!pszTablePrefix || !pszRoot) return; HTREEITEM hItem = m_ctrlLocalDirTree.GetSelectedItem(); if (!hItem) { AfxMessageBox(_T("请选中一个目录!")); return; } std::vector files; getSelectedFiles(files); if (files.empty()) { AfxMessageBox(_T("请至少选择一个文件!")); return; } CModelLibCopyTreeDlg dlg(m_imageListLocalDir , m_sqlDB , pszRoot , pszTablePrefix , this); if (dlg.DoModal() != IDOK) return; int newID; int classId = dlg.getClassId(); CString sql(_T("")), str(_T("")), sTbl(pszTablePrefix); std::vector> mm; m_sqlDB.BeginTrans(); for (size_t i = 0; i < files.size(); ++i) { int fileId = m_ctrlLocalFileList.GetItemData(files[i]); sql.Format(_T("insert into %s_package (name, idclass, rem, package) ") _T("select name, idclass, rem, package from %s_package where id = '%d'"), sTbl, sTbl, fileId); if (!m_sqlDB.ExecuteSQL(sql)) continue; newID = getLastInserId(m_sqlDB, sTbl + _T("_package")); sql.Format(_T("update %s_package set idclass = '%d' where id = '%d'") , sTbl , classId , newID); if (!m_sqlDB.ExecuteSQL(sql)) continue; // 如果是组合设备,下面代码不会执行,因为没有 dwg_bims 表 mm.clear(); sql.Format(_T("select Name, Value from %s_Bims where EquID='%d'"), pszTablePrefix, fileId); m_sqlDB.GetSelDataEx(sql, mm); for (int i(0); i != mm.size(); ++i) { if (mm[i].size() < 2) continue; sql.Format(_T("insert into %s_Bims (Name, Value, EquID, ReadOnly) values ('%s','%s','%d','0')") , pszTablePrefix , mm[i][0] , mm[i][1] , newID); m_sqlDB.ExecuteSQL(sql); } } m_sqlDB.CommitTrans(); refreshLocalFileList(hItem); } void CModelLibDlgBase::helper_ClickedFileRename(LPCTSTR pszTablePrefix) { if (!pszTablePrefix) return; HTREEITEM hRoot = m_ctrlLocalDirTree.GetSelectedItem(); if (!hRoot) { AfxMessageBox(_T("请选中一个目录!")); return; } std::vector files; getSelectedFiles(files); if (files.size() != 1) { AfxMessageBox(_T("请选择单个文件!")); return; } int idx = files[0]; CString sTmp(_T("")), sql(_T("")), sTbl(pszTablePrefix); m_ctrlLocalFileList.GetText(idx, sTmp); int fileId = m_ctrlLocalFileList.GetItemData(idx); if (!CoreTools::getNameByDialog(_T("输入文件新名称"), _T("文件新名称"), sTmp)) return; if (hasSameFileName(m_ctrlLocalFileList, sTmp)) { AfxMessageBox(_T("存在相同的文件名称!")); return; } sql.Format(_T("update %s_package set name='%s' where id='%d'"), sTbl, sTmp, fileId); if (m_sqlDB.ExecuteSQL(sql)) refreshLocalFileList(hRoot); } void CModelLibDlgBase::helper_ClickedFileAnchor() { } void CModelLibDlgBase::helper_ClickedFileDel(LPCTSTR pszTablePrefix) { if (AfxMessageBox(_T("是否删除?此操作不可逆!"), MB_YESNO) != IDYES) return; HTREEITEM hRoot = m_ctrlLocalDirTree.GetSelectedItem(); if (!hRoot) { AfxMessageBox(_T("请选中一个目录!")); return; } std::vector files; getSelectedFiles(files); if (files.empty()) { AfxMessageBox(_T("请至少选择一个文件!")); return; } int idx(-1); CString sql(_T("")), sTbl(pszTablePrefix); m_sqlDB.BeginTrans(); for (size_t i = 0; i < files.size(); ++i) { idx = m_ctrlLocalFileList.GetItemData(files[i]); // 如果是组合设备,下面代码不会执行,因为没有 dwg_bims 表 { sql.Format(_T("delete from aec_bims where equid='%d'"), idx); m_sqlDB.ExecuteSQL(sql); } sql.Format(_T("delete from %s_package where id='%d'"), sTbl, idx); m_sqlDB.ExecuteSQL(sql); } m_sqlDB.CommitTrans(); refreshLocalFileList(hRoot); } bool CModelLibDlgBase::helper_hasSameFileName(LPCTSTR name) { return hasSameFileName(m_ctrlLocalFileList, name); } void CModelLibDlgBase::helper_refreshLocalFileList(HTREEITEM hItem, LPCTSTR pszTablePrefix) { m_ctrlLocalFileList.ResetContent(); if (!hItem) return; // 判断点中的是不Class目录 if (isRootItem(hItem)) return; if (isFolderItem(hItem)) return; CString sql(_T("")); std::vector> files; int idFolder = m_ctrlLocalDirTree.GetItemData(hItem); CString sTable(pszTablePrefix); sql.Format(_T("select id, name from %s_package where idclass='%d'"), sTable, idFolder); m_sqlDB.GetSelDataEx(sql, files); int idx(-1); bool bAnchorFile(!m_strFileAnchor.IsEmpty()); for (size_t i = 0; i < files.size(); ++i) { std::vector &v(files[i]); if (v.size() < 2) continue; if (bAnchorFile) { if (!checkFileName(v[1], m_strFileAnchor)) continue; } idx = m_ctrlLocalFileList.AddString(v[1]); if (idx != -1) m_ctrlLocalFileList.SetItemData(idx, TypeConvert::convert(v[0])); } } void CModelLibDlgBase::helper_EnChangeSearch(LPCTSTR pszTablePrefix) { UpdateData(TRUE); CString str; m_ctrlSearchEdit.GetWindowText(str); if (str.IsEmpty()) return; str.MakeUpper(); std::vector conditions; CoreTools::SplitString(str, _T(' '), conditions); if (conditions.empty()) return; m_ctrlLocalFileList.ResetContent(); int idx; std::map result; search(m_sqlDB, conditions, result, pszTablePrefix); std::map::const_iterator it(result.begin()); for (; it != result.end(); ++it) { idx = m_ctrlLocalFileList.AddString(it->second); m_ctrlLocalFileList.SetItemData(idx, it->first); } if (m_ctrlLocalFileList.GetCount() > 0) { m_ctrlLocalFileList.SetSel(0); m_iSelectFileID = m_ctrlLocalFileList.GetItemData(0); } } void CModelLibDlgBase::helper_PopMenuForLocalDirTree(const CPoint &pt) { HTREEITEM hItem = m_ctrlLocalDirTree.GetSelectedItem(); CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EQU_LIB_DIR_ADD, _T("添加目录(&A)")); if (!isRootItem(hItem)) { menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EQU_LIB_DIR_RENAME, _T("修改名称(&M)")); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EQU_LIB_DIR_DEL, _T("删除目录(&D)")); } menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EQU_LIB_DIR_IN, _T("导入目录(&I)")); menu.AppendMenu(MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_EQU_LIB_DIR_OUT, _T("导出目录(&O)")); int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD , pt.x , pt.y , &m_ctrlLocalDirTree); switch (nID) { case ID_EQU_LIB_DIR_ADD: OnBnClickedDirAdd(); break; case ID_EQU_LIB_DIR_RENAME: OnBnClickedDirRename(); break; case ID_EQU_LIB_DIR_DEL: OnBnClickedDirDel(); break; case ID_EQU_LIB_DIR_IN: OnBnClickedDirIn(); break; case ID_EQU_LIB_DIR_OUT: return OnBnClickedDirOut(); default: break; } g_result.clear(); } bool CModelLibDlgBase::helper_selectPath(LPCTSTR pszTitle, CString &strPath) { return selectPath(pszTitle, strPath); } CString CModelLibDlgBase::helper_checkFileName(LPCTSTR sfile) { return checkFileName(sfile); } CString CModelLibDlgBase::helper_getLastErrorMsg() { return getLastErrorMsg(); } void CModelLibDlgBase::helper_insertEqu(AecDbEwEquipment *pEqu) { insertEqu(pEqu); } void CModelLibDlgBase::helper_ShowWindow(UINT id, CWnd *pParent, const bool &bShow) { CWnd *pWnd = pParent->GetDlgItem(id); if (pWnd) pWnd->ShowWindow(bShow ? SW_SHOW : SW_HIDE); } bool CModelLibDlgBase::helper_putEquFileToDb(CUIISQLiteServer & db, LPCTSTR pszFile, int idClass) { return putEquFileToDb(db, pszFile, idClass); } int CModelLibDlgBase::helper_getLastInserId(CUIISQLiteServer &db, LPCTSTR pszTable) { return getLastInserId(db, pszTable); } bool CModelLibDlgBase::helper_CopyTable(LPCTSTR pszDbFrom , LPCTSTR pszDbTo , LPCTSTR pszTableFrom , LPCTSTR pszTableTo ) { CUIISQLiteServer db; if (!db.InitADOServer(pszDbFrom)) { acutPrintf(_T("打开数据库失败!")); return false; } CString sql(_T("")); sql.Format(_T("ATTACH DATABASE '%s' AS db_to"), pszDbTo); if (!db.ExecuteSQL(sql)) return false; sql.Format(_T("INSERT INTO db_to.%s SELECT * FROM main.%s"), pszTableTo, pszTableFrom); return db.ExecuteSQL(sql) ? true : false; } void CModelLibDlgBase::helper_initLocalDirTree(CTreeCtrl &tree , CImageList &imglist , CUIISQLiteServer &db , LPCTSTR pszRoot , LPCTSTR pszTablePrefix) { if (!pszRoot || !pszTablePrefix) return; tree.SetImageList(&imglist, TVSIL_NORMAL); CString sTitle(pszRoot), sTbl(pszTablePrefix); HTREEITEM hRoot = tree.InsertItem(sTitle, 0, 2, TVI_ROOT); tree.SetItemData(hRoot, -1); std::vector> folders, dirs; std::vector>::const_iterator it_folder, it_dir; db.GetSelDataEx(CString(_T("select id, folder from ")) + sTbl + _T("_folder"), folders); std::vector subs; for (it_folder = folders.begin(); it_folder != folders.end(); ++it_folder) { if (it_folder->size() < 2) continue; // 一级目录 对应着 aec_folder 表 HTREEITEM hFolder = findSubDir(tree, hRoot, it_folder->at(1)); hRoot = tree.InsertItem(it_folder->at(1), 0, 2, hRoot); tree.SetItemData(hRoot, TypeConvert::convert(it_folder->at(0))); // 二级目录 对应着 aec_class 表 dirs.clear(); db.GetSelDataEx( CString(_T("select id, class from ")) + sTbl + _T("_class where idfolder = ") + it_folder->at(0), dirs); for (it_dir = dirs.begin(); it_dir != dirs.end(); ++it_dir) { if (it_dir->size() < 2) continue; // 对二级目录进行拆分 subs.clear(); CoreTools::SplitString(it_dir->at(1), _T('\\'), subs); if (subs.empty()) continue; HTREEITEM hSub(NULL); HTREEITEM hParent = hRoot; for (size_t i = 0; i < subs.size(); ++i) { hSub = findSubDir(tree, hParent, subs[i]); if (!hSub) // 没找到,新建 { hParent = tree.InsertItem(subs[i], 0, 2, hParent); tree.SetItemData(hParent, TypeConvert::convert(it_dir->at(0))); } else hParent = hSub; } } hRoot = tree.GetRootItem(); } tree.Expand(hRoot, TVE_EXPAND); return; } void CModelLibDlgBase::filterX3dPartEntity(ads_name ss, AcDbObjectIdArray &ids) { AcDbObjectId EntId; ads_name EntName; Adesk::Int32 nLength = 0; acedSSLength(ss, &nLength); AcDbObjectIdArray arWallids, arOpeingids; CString sName; for (int i(0); i < nLength; ++i) { acedSSName(ss, i, EntName); if (acdbGetObjectId(EntId, EntName) != Acad::eOk) continue; AcRxClass *pClass = EntId.objectClass(); if (!pClass) continue; if (pClass == AecDbXOpening::desc()) { arOpeingids.append(EntId); continue; } if (pClass == AecDbXWall::desc()) arWallids.append(EntId); if (pClass == AecDbX3dPartEntity::desc()) { AcDbObjectPointer ent(EntId, AcDb::kForRead); if (ent.openStatus() != Acad::eOk) continue; sName = ent->GetName(); if (sName.CompareNoCase(_T("洞口")) == 0 || sName.CompareNoCase(_T("开洞")) == 0 || sName.CompareNoCase(_T("套管")) == 0 || sName.Find(_T("井")) != -1 || sName.Find(_T("坑")) != -1) { continue; } else { ids.append(EntId); } } else ids.append(EntId); } // 现在所有选中的洞口、套管、井、坑、门窗实体都被过滤掉了 AcDbObjectId idWall, idParent; AcDbObjectIdArray arErrIds, _ar; for (int i(0); i < arWallids.length(); ++i) { idWall = arWallids[i]; AcDbObjectPointer wall(idWall, AcDb::kForRead); if (wall.openStatus() != Acad::eOk) continue; _ar.removeAll(); wall->GetAssocPartIds(_ar); for (int j(0); j < _ar.length(); ++j) { EntId = _ar[j]; AcRxClass *pClass = EntId.objectClass(); if (!pClass) continue; if (pClass == AecDbColumn::desc()) { // 如果墙实体与柱实体有关联,则删掉关联 if (wall->upgradeOpen() == Acad::eOk) { wall->RemoveAssocPart(EntId); wall->downgradeOpen(); } continue; } if (pClass == AecDbXOpening::desc()) { // 下面处理一种老版本的特殊情况 // 一个门窗实体被多个墙关联,详情查看AecDbXOpening::subTransfromBy() // 正确的情况是一个门窗实体只能关联一个墙实体 // 这种情况必须要清理,否则不同的wall实体的deepclone函数会同时复制同样的门窗实体。 // 方法是,判断墙体关联的门窗,如果墙体的id与门窗记录的所在墙体id不一致,则把这个门窗实体从ids里面剔除掉 arErrIds.removeAll(); AcDbObjectPointer opening(EntId, AcDb::kForRead); if (opening.openStatus() == Acad::eOk) { idParent == AcDbObjectId::kNull; opening->GetAt(KEY_IDCNT1, idParent); if (idWall != idParent) { if (wall->upgradeOpen() == Acad::eOk) { wall->RemoveAssocPart(EntId); wall->downgradeOpen(); } } } continue; } } } return; } bool CModelLibDlgBase::getAlignPoint(AcGePoint3d &ptOrg) { // ptOrg 转 wcs CoreTools::WCS2UCS(ptOrg, ptOrg) ; if (acedGetPoint(asDblArray(ptOrg), _T("\n指定插入点:"), asDblArray(ptOrg)) == RTCAN) return false; CoreTools::UCS2WCS(ptOrg, ptOrg); return true; } #pragma endregion