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

2335 lines
57 KiB
C++

#include "stdafx.h"
#include "filepath.h"
#include <algorithm>
#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<int, CString> g_result;
void refreshSearchResult(CUIISQLiteServer &db
, bool bRefresh
, LPCTSTR pszTablePrefix)
{
if (!bRefresh) return;
if (!pszTablePrefix) return;
g_result.clear();
std::vector<std::vector<CString>> 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<CString> &ss(rr[i]);
if (ss.size() < 3) continue;
g_result.insert(
std::make_pair(TypeConvert::convert<int, LPCTSTR>(ss[0])
, (ss[1] + _T("\\") + ss[2] + _T("\\") + ss[3]).MakeUpper()));
}
}
void search(CUIISQLiteServer &db
, const std::vector<CString> &conditions
, std::map<int, CString> &result
, LPCTSTR pszTablePrefix)
{
if (g_result.empty())
{
refreshSearchResult(db, true, pszTablePrefix);
}
bool bFind(true);
std::map<int, CString>::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<HTREEITEM> &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<CString> v;
HTREEITEM hParent(hItem);
while (isClassItem(tree, hParent))
{
v.push_back(tree.GetItemText(hParent));
hParent = tree.GetParentItem(hParent);
}
CString sClass(_T(""));
for (std::vector<CString>::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<CString> ss;
std::vector<std::vector<CString>> 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<CString> &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<int, LPCTSTR>(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<AcDbDatabase> 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<CString> 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<CString> &fileTypes )
{
if (!pszDir || !pszTablePrefix) return;
if (fileTypes.empty()) return;
if (!hasEquFilesInFolder(pszDir)) return;
CString sql(_T("")), sTbl(pszTablePrefix);
std::vector<CString> v;
std::vector<CString>::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<CString> files;
std::vector<CString> 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<CString, CString> &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<int>& 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<CString> 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<int> files;
getSelectedFiles(files);
if (files.size() != 1) return;
CString path;
m_ctrlLocalFileList.GetText(files[0], path);
std::vector<CString> 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<CString> v;
CoreTools::SplitString(str, _T('\\'), v);
if (v.empty()) return;
std::vector<CString>::iterator it = std::find(v.begin(), v.end(), sItemName);
if (it == v.end()) return;
int dist = std::distance(v.begin(), it);
std::vector<HTREEITEM> items;
items.push_back(hItem);
getAllChildrenItem(m_ctrlLocalDirTree, hItem, items);
std::vector<CString> 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<int, LPCTSTR>(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<HTREEITEM> 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<CString, CString> mm;
std::map<CString, CString>::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<int, LPCTSTR>(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<CString> &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<int> 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<std::vector<CString>> 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<int> 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<int> 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<std::vector<CString>> 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<CString> &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<int, LPCTSTR>(v[0]));
}
}
void CModelLibDlgBase::helper_EnChangeSearch(LPCTSTR pszTablePrefix)
{
UpdateData(TRUE);
CString str;
m_ctrlSearchEdit.GetWindowText(str);
if (str.IsEmpty()) return;
str.MakeUpper();
std::vector<CString> conditions;
CoreTools::SplitString(str, _T(' '), conditions);
if (conditions.empty()) return;
m_ctrlLocalFileList.ResetContent();
int idx;
std::map<int, CString> result;
search(m_sqlDB, conditions, result, pszTablePrefix);
std::map<int, CString>::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<std::vector<CString>> folders, dirs;
std::vector<std::vector<CString>>::const_iterator it_folder, it_dir;
db.GetSelDataEx(CString(_T("select id, folder from ")) + sTbl + _T("_folder"), folders);
std::vector<CString> 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<int, LPCTSTR>(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<int, LPCTSTR>(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<AecDbX3dPartEntity> 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<AecDbXWall> 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<AecDbXOpening> 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