742 lines
20 KiB
C++
742 lines
20 KiB
C++
#include "StdAfx.h"
|
|
#include "initools.h"
|
|
#include "EquipManaOperator.h"
|
|
#include "UserDataDlg.h"
|
|
#include "ModiRemDlg.h"
|
|
#include "Base64.h"
|
|
#include "AecDbEwEquipment.h"
|
|
#include "coretools.h"
|
|
|
|
#ifndef IMG_FOLDER
|
|
#define IMG_FOLDER 0
|
|
#endif
|
|
|
|
#ifndef IMG_CLASS
|
|
#define IMG_CLASS 1
|
|
#endif
|
|
|
|
#ifndef EQU_COMPANY
|
|
#define EQU_COMPANY "Beijing shanghua equipment design file"
|
|
#endif
|
|
|
|
namespace
|
|
{
|
|
enum TBLType
|
|
{
|
|
eClass = 0,
|
|
eFolder,
|
|
ePackage,
|
|
eBims,
|
|
eNone,
|
|
};
|
|
|
|
CString getTableName(LPCTSTR prefix, const TBLType &tblType)
|
|
{
|
|
CString suffix(_T(""));
|
|
switch (tblType)
|
|
{
|
|
case eClass:
|
|
suffix = _T("Class");
|
|
break;
|
|
case eFolder:
|
|
suffix = _T("Folder");
|
|
break;
|
|
case ePackage:
|
|
suffix = _T("Package");
|
|
break;
|
|
case eBims:
|
|
suffix = _T("Bims");
|
|
break;
|
|
case eNone:
|
|
default:
|
|
return _T("");
|
|
}
|
|
return CString(prefix) + suffix;
|
|
}
|
|
}
|
|
|
|
CEquipManaOperator::CEquipManaOperator(LPCTSTR prefix)
|
|
: m_pEquipTree(NULL)
|
|
, m_pDb(NULL)
|
|
, m_sPrefix(prefix) { }
|
|
|
|
CEquipManaOperator::CEquipManaOperator(LPCTSTR prefix, CUIISQLiteServer * pDb, CTreeCtrl* pTree)
|
|
: m_pEquipTree(pTree)
|
|
, m_pDb(pDb)
|
|
, m_sPrefix(prefix) { }
|
|
|
|
CEquipManaOperator::~CEquipManaOperator(void)
|
|
{
|
|
}
|
|
|
|
void CEquipManaOperator::SetAdoDb(CUIISQLiteServer* pDb)
|
|
{
|
|
m_pDb = pDb;
|
|
}
|
|
|
|
void CEquipManaOperator::SetEquipTree(CTreeCtrl* pTree)
|
|
{
|
|
m_pEquipTree = pTree;
|
|
}
|
|
|
|
//目录分类操作
|
|
void CEquipManaOperator::NewFolder(CMapStringToString& mapItem2Folder)
|
|
{
|
|
CStringList lstFolders;
|
|
CString sSQL(_T(""));
|
|
//sSQL = _T("select folder from Aec_folder");
|
|
sSQL.Format(_T("select folder from %s"), getTableName(m_sPrefix, eFolder));
|
|
m_pDb->GetSelData(sSQL,lstFolders);
|
|
|
|
while(TRUE)
|
|
{
|
|
CString sName(_T(""));
|
|
if (CoreTools::getNameByDialog(_T("请输入名称"), _T("名称:"), sName))
|
|
{
|
|
if (lstFolders.Find(sName) != NULL)
|
|
{
|
|
AfxMessageBox(_T("输入的目录名已经存在!请重新输入!"));
|
|
continue;
|
|
}
|
|
|
|
//sSQL.Format(_T("insert into aec_folder (folder) values ('%s')"),nameDlg.m_sName);
|
|
sSQL.Format(_T("insert into %s (folder) values ('%s')"), getTableName(m_sPrefix, eFolder), sName);
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
|
|
//插入
|
|
HTREEITEM hItem = m_pEquipTree->InsertItem(sName,IMG_FOLDER,IMG_FOLDER);
|
|
|
|
//sSQL.Format(_T("select id from aec_folder where folder='%s'"),nameDlg.m_sName);
|
|
sSQL.Format(_T("select id from %s where folder='%s'"), getTableName(m_sPrefix, eFolder),sName);
|
|
CString sID,sKey;
|
|
m_pDb->GetSelData(sSQL,sID);
|
|
|
|
sKey.Format(_T("%p"),hItem);
|
|
mapItem2Folder.SetAt(sKey,sID);
|
|
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CEquipManaOperator::OnNewclass(HTREEITEM hItem,CMapStringToString& mapItem2Folder)
|
|
{
|
|
CString sFolder = m_pEquipTree->GetItemText(hItem);
|
|
CString sSQL,sFolderID;
|
|
|
|
//sSQL.Format(_T("select ID from aec_folder where folder='%s'"),sFolder);
|
|
sSQL.Format(_T("select ID from %s where folder='%s'"), getTableName(m_sPrefix, eFolder),sFolder);
|
|
m_pDb->GetSelData(sSQL,sFolderID);
|
|
|
|
//sSQL.Format(_T("select class from aec_class where idfolder='%s'"),sFolderID);
|
|
sSQL.Format(_T("select class from %s where idfolder='%s'"), getTableName(m_sPrefix, eClass),sFolderID);
|
|
CStringList lstClass;
|
|
m_pDb->GetSelData(sSQL,lstClass);
|
|
|
|
while(TRUE)
|
|
{
|
|
CString sName(_T(""));
|
|
if (CoreTools::getNameByDialog(_T("请输入名称"), _T("名称:"), sName))
|
|
{
|
|
if (lstClass.Find(sName) != NULL)
|
|
{
|
|
AfxMessageBox(_T("输入的分类名已经存在!请重新输入!"));
|
|
continue;
|
|
}
|
|
|
|
//sSQL.Format(_T("insert into aec_class (class,idfolder) values ('%s','%s')"),nameDlg.m_sName,sFolderID);
|
|
sSQL.Format(_T("insert into %s (class,idfolder) values ('%s','%s')"), getTableName(m_sPrefix, eClass),sName,sFolderID);
|
|
BOOL bSuccess = m_pDb->ExecuteSQL(sSQL);
|
|
if (bSuccess)
|
|
{
|
|
CString sID,sKey;
|
|
//id
|
|
//sSQL.Format(_T("select id from aec_class where class='%s' and idfolder='%s'"),nameDlg.m_sName,sFolderID);
|
|
sSQL.Format(_T("select id from %s where class='%s' and idfolder='%s'"), getTableName(m_sPrefix, eClass),sName,sFolderID);
|
|
m_pDb->GetSelData(sSQL,sID);
|
|
|
|
HTREEITEM hClass = m_pEquipTree->InsertItem(sName,IMG_CLASS,IMG_CLASS,hItem);
|
|
|
|
sKey.Format(_T("%p"),hClass);
|
|
mapItem2Folder.SetAt(sKey,sID);
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CEquipManaOperator::OnRename(HTREEITEM hItem,CString& sID)
|
|
{
|
|
int nImage = 0,nImagSel = 0;
|
|
m_pEquipTree->GetItemImage(hItem,nImage,nImagSel);
|
|
CString sName = m_pEquipTree->GetItemText(hItem);
|
|
CString sSQL;
|
|
|
|
if (CoreTools::getNameByDialog(_T("请输入名称"), _T("名称:"), sName))
|
|
{
|
|
if (nImage == IMG_FOLDER )
|
|
{
|
|
CStringList lstFolders;
|
|
//sSQL = _T("select folder from Aec_folder");
|
|
sSQL.Format(_T("select folder from %s"), getTableName(m_sPrefix, eFolder));
|
|
m_pDb->GetSelData(sSQL,lstFolders);
|
|
|
|
if (lstFolders.Find(sName) != NULL)
|
|
{
|
|
AfxMessageBox(_T("目录名已经存在,不能重名!"));
|
|
return;
|
|
}
|
|
|
|
//sSQL.Format(_T("update Aec_folder set folder='%s' where id=%d"),nameDlg.m_sName,_ttoi(sID));
|
|
sSQL.Format(_T("update %s set folder='%s' where id=%d"), getTableName(m_sPrefix, eFolder),sName,_ttoi(sID));
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
|
|
m_pEquipTree->SetItemText(hItem,sName);
|
|
return;
|
|
}
|
|
|
|
if ( nImage == IMG_CLASS)
|
|
{
|
|
CStringList lstClass;
|
|
//sSQL = _T("select folder from aec_class");
|
|
sSQL.Format(_T("select folder from %s"), getTableName(m_sPrefix, eClass));
|
|
m_pDb->GetSelData(sSQL,lstClass);
|
|
|
|
if (lstClass.Find(sName) != NULL)
|
|
{
|
|
AfxMessageBox(_T("分类名已经存在,不能重名!"));
|
|
return;
|
|
}
|
|
|
|
//sSQL.Format(_T("update aec_class set class='%s' where id=%d"),nameDlg.m_sName,_ttoi(sID));
|
|
sSQL.Format(_T("update %s set class='%s' where id=%d"), getTableName(m_sPrefix, eClass),sName,_ttoi(sID));
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
|
|
m_pEquipTree->SetItemText(hItem,sName);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CEquipManaOperator::OnDelete(HTREEITEM hItem,CString& sID)
|
|
{
|
|
int nImage = 0,nImagSel = 0;
|
|
m_pEquipTree->GetItemImage(hItem,nImage,nImagSel);
|
|
|
|
CString sText,sSQL;
|
|
if (nImage == IMG_FOLDER )
|
|
{
|
|
//判断目录下没有分类
|
|
sText = m_pEquipTree->GetItemText(hItem);
|
|
|
|
//sSQL.Format(_T("select id from aec_class where idfolder='%s'"),sID);
|
|
sSQL.Format(_T("select id from %s where idfolder='%s'"), getTableName(m_sPrefix, eClass),sID);
|
|
if ( !m_pDb->IsSelEmpty(sSQL) )
|
|
{
|
|
AfxMessageBox(_T("选择的目录下含有分类名,不能删除!请先删除其下分类再删除目录!"));
|
|
return;
|
|
}
|
|
|
|
CString sTip;
|
|
sTip.Format(_T("删除为永久性删除!确实要删除目录 [%s]吗?"),sText);
|
|
|
|
if ( IDYES == AfxMessageBox(sTip,MB_YESNO) )
|
|
{
|
|
//sSQL.Format(_T("delete from aec_folder where id=%d"),_ttoi(sID));
|
|
sSQL.Format(_T("delete from %s where id=%d"), getTableName(m_sPrefix, eFolder),_ttoi(sID));
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
m_pEquipTree->DeleteItem(hItem);
|
|
}
|
|
}
|
|
|
|
if ( nImage == IMG_CLASS)
|
|
{
|
|
//判断分类下没有设备元件
|
|
sText = m_pEquipTree->GetItemText(hItem);
|
|
|
|
//sSQL.Format(_T("select id from aec_package where idclass='%s'"),sID);
|
|
sSQL.Format(_T("select id from %s where idclass='%s'"), getTableName(m_sPrefix, ePackage),sID);
|
|
if ( !m_pDb->IsSelEmpty(sSQL) )
|
|
{
|
|
AfxMessageBox(_T("选择的分类下含有设备元件,不能删除!请先删除其下设备元件再删除分类!"));
|
|
return;
|
|
}
|
|
|
|
CString sTip;
|
|
sTip.Format(_T("删除为永久性删除!确实要删除分类 [%s]吗?"),sText);
|
|
|
|
if ( IDYES == AfxMessageBox(sTip,MB_YESNO) )
|
|
{
|
|
//sSQL.Format(_T("delete from aec_class where id=%d"),_ttoi(sID));
|
|
sSQL.Format(_T("delete from %s where id=%d"), getTableName(m_sPrefix, eClass),_ttoi(sID));
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
m_pEquipTree->DeleteItem(hItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
//设备元件操作
|
|
void CEquipManaOperator::OnAddequ(HTREEITEM hItem)
|
|
{
|
|
//目录,分类
|
|
CString sFolder,sCLass;
|
|
sCLass = m_pEquipTree->GetItemText(hItem);
|
|
|
|
HTREEITEM hFolder = m_pEquipTree->GetParentItem(hItem);
|
|
sFolder = m_pEquipTree->GetItemText(hFolder);
|
|
|
|
//选择equ文件
|
|
CString sEquFile;
|
|
CFileDialog dlg( TRUE, NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,
|
|
_T("通用设备元件设计文件(*.equ)|*.equ|All Files (*.*)|*.*||"));
|
|
|
|
int nRes = dlg.DoModal();
|
|
if (nRes != IDOK) return;
|
|
|
|
int inputType = AfxMessageBox(_T("是否通过配置文件来进行BIM数据导入?"), MB_YESNO);
|
|
|
|
CString bimFile(_T(""));
|
|
if (inputType == IDYES)
|
|
{
|
|
CFileDialog dg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("bim配置文件(*.ini)|*.ini||"));
|
|
if (dg.DoModal() == IDOK)
|
|
bimFile = dg.GetPathName();
|
|
else
|
|
inputType = IDNO;
|
|
}
|
|
|
|
int iSuc(0), iAll(0);
|
|
POSITION pos = dlg.GetStartPosition();
|
|
while ( NULL != pos )
|
|
{
|
|
sEquFile = dlg.GetNextPathName(pos);
|
|
iAll++;
|
|
//提取名称
|
|
AecDbEwEquipment* pEqu = new AecDbEwEquipment;
|
|
if (pEqu->ReadFromFile(sEquFile))
|
|
{
|
|
CString sName(_T("")), sRem = _T("");
|
|
sName.Format(_T("NoName%d"), iAll);
|
|
pEqu->GetSpecialtyData()->GetAt(KEY_NAME, sName);
|
|
|
|
SH_BIM_BLOCK bims;
|
|
|
|
if (inputType == IDYES) // 读配置文件
|
|
{
|
|
IniTools::getSectionContent(bimFile, sEquFile, bims);
|
|
}
|
|
else // 读equ文件内的xdata数据
|
|
{
|
|
AecDbObjXDataMap *pXData = pEqu->GetSpecialtyData(AcDb::kForRead);
|
|
if (pXData)
|
|
{
|
|
CoreTools::getBimDatas(*pXData, bims);
|
|
}
|
|
}
|
|
|
|
// 文件内的bim数据,插入时再删除
|
|
|
|
if (PutPackageToDb(sFolder
|
|
, sCLass
|
|
, sName
|
|
, sRem
|
|
, sEquFile
|
|
, NULL
|
|
, bims.empty() ? NULL : &bims))
|
|
{
|
|
iSuc++;
|
|
|
|
}
|
|
else
|
|
AfxMessageBox(sEquFile + _T("入库失败。"));
|
|
|
|
DELETE_PTR(pEqu);
|
|
}
|
|
else
|
|
AfxMessageBox(sEquFile + _T("入库失败。"));
|
|
}
|
|
|
|
CString s(_T(""));
|
|
s.Format(_T("共选择%d个文件,成功入库%d个。"), iAll, iSuc);
|
|
AfxMessageBox(s);
|
|
}
|
|
|
|
void CEquipManaOperator::OnDelequ(LPCTSTR pszID,LPCTSTR pszName)
|
|
{
|
|
CString sTip;
|
|
sTip.Format(_T("删除为永久性删除!确实要删除设备元件 [%s]吗?"),pszName);
|
|
if (IDYES != AfxMessageBox(sTip, MB_YESNO)) return;
|
|
|
|
int equid(_ttoi(pszID));
|
|
CString sSQL;
|
|
sSQL.Format(_T("delete from %s where [id]='%d'"), getTableName(m_sPrefix, ePackage), equid);
|
|
if (m_pDb->ExecuteSQL(sSQL))
|
|
{
|
|
sSQL.Format(_T("DELETE FROM %s WHERE [equid]='%d'"), getTableName(m_sPrefix, eBims), equid);
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
}
|
|
}
|
|
|
|
void CEquipManaOperator::OnProperty(AecDbEwEquipment* pEquSel)
|
|
{
|
|
AecDbObjXDataMap* pXDataMap = pEquSel->GetSpecialtyData();
|
|
|
|
//用户数据USER0~999
|
|
SH_BIM_BLOCK bims;
|
|
CoreTools::getBimDatas(*pXDataMap, bims);
|
|
|
|
//仅仅只读?
|
|
CUserDataDlg userDlg(1);
|
|
userDlg.SetUserData(bims);
|
|
//userDlg.SetReadOnly(TRUE);
|
|
int nRes = userDlg.DoModal();
|
|
if (nRes == IDOK && userDlg.m_bModified)
|
|
{
|
|
bims.clear();
|
|
userDlg.GetUserData(bims);
|
|
CoreTools::setBimDatas(*pXDataMap, bims);
|
|
|
|
//XString sTmplFile = GetTempFileName(_T(".tmp"));
|
|
CString sTmplFile = FilePath::getSystemTemporaryFolder();
|
|
sTmplFile += _T("\\eq_.tmp");
|
|
if (!SaveEquFile(pEquSel,(LPCTSTR)sTmplFile) )
|
|
{
|
|
AfxMessageBox(_T("意外保存中间临时文件失败!请重新执行命令!"));
|
|
return;
|
|
}
|
|
|
|
CString sTmpFile = (LPCTSTR)sTmplFile;
|
|
CString sID,sPackageField;
|
|
pEquSel->GetSpecialtyData()->GetAt(KEY_ID,sID);
|
|
|
|
//update
|
|
CString sSQL;
|
|
//sSQL.Format(_T("update aec_package set package=? where id=%d"),_ttoi(sID));
|
|
sSQL.Format(_T("update %s set package=? where id=%d"), getTableName(m_sPrefix, ePackage),_ttoi(sID));
|
|
if (m_pDb->UpdateBlob(sSQL, sTmplFile))
|
|
{
|
|
AfxMessageBox(_T("更新数据库成功!请选择设备元件查看属性验证!"));
|
|
}
|
|
|
|
// CUIIPackageDbOper packageDb;
|
|
// packageDb.SetDbSrv(m_pDb);
|
|
//
|
|
// sPackageField = _T("Package");
|
|
// if ( packageDb.UpdatePackage(sSQL,sPackageField,sTmpFile) )
|
|
// {
|
|
// AfxMessageBox(_T("更新数据库成功!请选择设备元件查看属性验证!"));
|
|
// }
|
|
}
|
|
}
|
|
|
|
void CEquipManaOperator::OnCloneEqu(LPCTSTR pszID, LPCTSTR pszName)
|
|
{
|
|
if (!pszName || !pszID) return;
|
|
|
|
CString sSQL, sTable(getTableName(m_sPrefix, ePackage));
|
|
sSQL.Format(
|
|
_T("INSERT INTO %s ([name],[idclass],[rem],[package]) SELECT [name],[idclass],[rem],[package] FROM %s WHERE [id]='%s'")
|
|
, sTable
|
|
, sTable
|
|
, pszID);
|
|
if (!m_pDb->ExecuteSQL(sSQL)) return;
|
|
|
|
// 得到clone出的设备的ID
|
|
CString s;
|
|
sSQL.Format(_T("SELECT id FROM %s ORDER BY id DESC LIMIT 1"), sTable);
|
|
if (!m_pDb->GetSelData(sSQL, s)) return;
|
|
|
|
// 为新设备改名
|
|
sSQL.Format(_T("UPDATE %s SET [name]='%s' WHERE [id]='%s'"), sTable, pszName, s);
|
|
if (!m_pDb->ExecuteSQL(sSQL)) return;
|
|
|
|
// clone aec_bims表内数据
|
|
sTable = getTableName(m_sPrefix, eBims);
|
|
sSQL.Format(_T("INSERT INTO %s ([name],[value],[readonly]) SELECT [name],[value],[readonly] FROM %s WHERE [equid]='%s'")
|
|
, sTable, sTable, pszID);
|
|
if (!m_pDb->ExecuteSQL(sSQL)) return;
|
|
|
|
// 将新bim数据的equid指向新设备的ID
|
|
sSQL.Format(_T("UPDATE %s SET [equid]='%s' WHERE [equid]='-1'"), sTable, s);
|
|
if (!m_pDb->ExecuteSQL(sSQL)) return;
|
|
}
|
|
|
|
void CEquipManaOperator::OnModiRem(AecDbEwEquipment* pEquSel)
|
|
{
|
|
CString sID,sRem;
|
|
pEquSel->GetSpecialtyData()->GetAt(KEY_ID,sID);
|
|
|
|
CString sSQL;
|
|
//sSQL.Format(_T("select rem from aec_package where id=%d"),_ttoi(sID));
|
|
sSQL.Format(_T("select rem from %s where id=%d"), getTableName(m_sPrefix, ePackage),_ttoi(sID));
|
|
m_pDb->GetSelData(sSQL,sRem);
|
|
|
|
CModiRemDlg remDlg;
|
|
remDlg.m_sRem = sRem;
|
|
if ( IDOK == remDlg.DoModal())
|
|
{
|
|
//sSQL.Format(_T("update aec_package set rem='%s' where id=%d"),remDlg.m_sRem,_ttoi(sID));
|
|
sSQL.Format(_T("update %s set rem='%s' where id=%d"), getTableName(m_sPrefix, ePackage),remDlg.m_sRem,_ttoi(sID));
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
}
|
|
}
|
|
|
|
void CEquipManaOperator::GetBimDatas(LPCTSTR pszID, std::vector<std::vector<CString>> &bims, bool &bReadOnly)
|
|
{
|
|
if (!pszID) return;
|
|
CString sSql(_T(""));
|
|
sSql.Format(_T("SELECT [readonly] FROM %s WHERE [id]='%s'"), getTableName(m_sPrefix, ePackage), pszID);
|
|
CString readonly(_T("0"));
|
|
m_pDb->GetSelData(sSql, readonly);
|
|
bReadOnly = readonly == _T("0") ? false : true;
|
|
|
|
sSql.Format(_T("SELECT [id],[name],[value] FROM %s WHERE [equid]='%s'"), getTableName(m_sPrefix, eBims), pszID);
|
|
m_pDb->GetSelDataEx(sSql, bims);
|
|
}
|
|
|
|
BOOL CEquipManaOperator::SaveEquFile(AecDbEwEquipment* pWEqu,LPCTSTR pszFile)
|
|
{
|
|
BOOL bSuccess = FALSE;
|
|
CFile file;
|
|
if (file.Open(pszFile,CFile::modeCreate | CFile::modeWrite))
|
|
{
|
|
if (pWEqu != NULL)
|
|
{
|
|
AecDbObjXDataMap* pXDataMap = pWEqu->GetSpecialtyData();
|
|
|
|
//0.写入文件标识
|
|
std::string str1,str2;
|
|
str1.append(EQU_COMPANY);
|
|
str2 = Base64::Encode(str1);
|
|
file.Write(str2.c_str(),sizeof(char)* ( str2.length() ) );
|
|
|
|
//1.写入名称
|
|
char szName[MAX_PATH];
|
|
memset(szName,0,sizeof(szName));
|
|
|
|
CString sText;
|
|
pXDataMap->GetAt(KEY_NAME,sText);
|
|
|
|
_bstr_t bst((LPCTSTR)sText);
|
|
strcpy(szName,(const char*)bst);
|
|
file.Write(szName,MAX_PATH);
|
|
|
|
//2.版本
|
|
int nVer = 1;
|
|
file.Write(&nVer,sizeof(int));
|
|
|
|
//4.写入定义数据
|
|
AcGeMatrix3d xform;
|
|
int nCount = pWEqu->GetSubPrimObjCount();
|
|
|
|
//4.写入数量
|
|
file.Write(&nCount,sizeof(int));
|
|
|
|
int nLen = 0;
|
|
for (int i = 0;i < nCount;i++)
|
|
{
|
|
AecEqui::XPrimData* pData = pWEqu->GetSubPrimObj(i);
|
|
if (pData != NULL)
|
|
{
|
|
//通用数据
|
|
file.Write(&pData->m_eType,sizeof(short));
|
|
file.Write(&pData->m_nActiveInf,sizeof(short));
|
|
file.Write(&pData->m_nID,sizeof(long));
|
|
|
|
file.Write(&pData->m_vtMove.x,sizeof(double));
|
|
file.Write(&pData->m_vtMove.y,sizeof(double));
|
|
file.Write(&pData->m_vtMove.z,sizeof(double));
|
|
|
|
file.Write(&pData->m_ptRotation.x,sizeof(double));
|
|
file.Write(&pData->m_ptRotation.y,sizeof(double));
|
|
file.Write(&pData->m_ptRotation.z,sizeof(double));
|
|
|
|
//矩阵
|
|
nLen = pData->m_arMatrix.length();
|
|
file.Write(&nLen,sizeof(int));
|
|
|
|
int nnn = sizeof(AcGeMatrix3d);
|
|
for (int j = 0;j < pData->m_arMatrix.length();j++)
|
|
{
|
|
xform = pData->m_arMatrix.at(j);
|
|
for (int n = 0;n < 4;n++)
|
|
{
|
|
for (int k = 0;k < 4;k++)
|
|
{
|
|
file.Write(&xform.entry[n][k],sizeof(double));
|
|
}
|
|
}
|
|
}
|
|
|
|
//data
|
|
file.Write(&pData->m_nSize,sizeof(int));
|
|
if (pData->m_nSize > 0)
|
|
{
|
|
file.Write(pData->m_pData,pData->m_nSize);
|
|
}
|
|
}
|
|
bSuccess = TRUE;
|
|
}
|
|
|
|
//5.写入用户数据
|
|
pXDataMap->Write(&file,TRUE); //写出用户数据USER0~999
|
|
}
|
|
file.Close();
|
|
}
|
|
return bSuccess;
|
|
}
|
|
|
|
bool CEquipManaOperator::IsReadOnlyEqu(LPCTSTR pszID)
|
|
{
|
|
if (!pszID) return false;
|
|
CString sSQL, s(_T("0"));
|
|
sSQL.Format(_T("SELECT [readonly] FROM %s WHERE [id]='%s'"), getTableName(m_sPrefix, ePackage), pszID);
|
|
m_pDb->GetSelData(sSQL, s);
|
|
if (s == _T("0")) return false;
|
|
else return true;
|
|
}
|
|
|
|
int CEquipManaOperator::AddBimForEqu(LPCTSTR pszName, LPCTSTR pszValue, LPCTSTR pszEquID)
|
|
{
|
|
if (!pszName || !pszValue || !pszEquID) return -1;
|
|
|
|
CString sSql(_T("")), sTable(getTableName(m_sPrefix, eBims));
|
|
sSql.Format(_T("INSERT INTO %s ([Name],[Value],[EquID],[ReadOnly]) VALUES ('%s','%s','%s','0')")
|
|
, sTable
|
|
, pszName
|
|
, pszValue
|
|
, pszEquID);
|
|
if (!m_pDb->ExecuteSQL(sSql)) return -1;
|
|
|
|
CString s;
|
|
sSql.Format(_T("SELECT id FROM %s ORDER BY id DESC LIMIT 1"), sTable);
|
|
if (!m_pDb->GetSelData(sSql, s)) return -1;
|
|
return _ttoi(s);
|
|
}
|
|
|
|
bool CEquipManaOperator::ModBimForEqu(LPCTSTR pszName, LPCTSTR pszValue, int BimID)
|
|
{
|
|
if (!pszName || !pszValue) return false;
|
|
CString sSql(_T("")), sTable(getTableName(m_sPrefix, eBims));
|
|
sSql.Format(_T("UPDATE %s SET [Name]='%s',[Value]='%s' WHERE [id]='%d'")
|
|
, sTable
|
|
, pszName
|
|
, pszValue
|
|
, BimID);
|
|
if (!m_pDb->ExecuteSQL(sSql)) return false;
|
|
return true;
|
|
}
|
|
|
|
bool CEquipManaOperator::DelBimForEqu(int BimID)
|
|
{
|
|
CString sSql(_T(""));
|
|
sSql.Format(_T("DELETE FROM %s WHERE [id]='%d'"), getTableName(m_sPrefix, eBims), BimID);
|
|
if (!m_pDb->ExecuteSQL(sSql)) return false;
|
|
return true;
|
|
}
|
|
|
|
BOOL CEquipManaOperator::PutPackageToDb(const CString& sFolder
|
|
, const CString& sClass
|
|
, const CString& sName
|
|
, const CString& sRem
|
|
, const CString& sEquTmplFile
|
|
, CString *pIDPackage
|
|
, SH_BIM_BLOCK *pBims)
|
|
{
|
|
CString sSQL;
|
|
//检查 Folder 是否数据库中有
|
|
sSQL.Format(_T("SELECT [id] FROM %s WHERE [folder]='%s'"), getTableName(m_sPrefix, eFolder),sFolder);
|
|
if ( m_pDb->IsSelEmpty(sSQL) ) //数据库中没有
|
|
{
|
|
sSQL.Format(_T("INSERT INTO %s ([folder]) VALUES ('%s')"), getTableName(m_sPrefix, eFolder),sFolder);
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
}
|
|
|
|
CString sID;
|
|
sSQL.Format(_T("SELECT [id] FROM %s WHERE [folder]='%s'"), getTableName(m_sPrefix, eFolder),sFolder);
|
|
m_pDb->GetSelData(sSQL,sID);
|
|
|
|
//检查 Class
|
|
sSQL.Format(_T("SELECT [class] FROM %s WHERE [idfolder]='%s' AND [class]='%s'"), getTableName(m_sPrefix, eClass),sID,sClass);
|
|
if (m_pDb->IsSelEmpty(sSQL))
|
|
{
|
|
sSQL.Format(_T("INSERT INTO %s ([class],[idfolder]) VALUES ('%s','%s')"), getTableName(m_sPrefix, eClass),sClass,sID);
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
}
|
|
sSQL.Format(_T("SELECT [id] FROM %s WHERE [idfolder]='%s' AND [class]='%s'"), getTableName(m_sPrefix, eClass),sID,sClass);
|
|
|
|
CString sClassID;
|
|
m_pDb->GetSelData(sSQL,sClassID);
|
|
|
|
// 在入库前,检查一下有没有同样的设备存在,如果有,则删除
|
|
if (m_sPrefix.CompareNoCase(_T("aec_")) == 0)
|
|
sSQL.Format(_T("SELECT aec_package.[id]")
|
|
_T(" FROM aec_package")
|
|
_T(" INNER JOIN aec_class, aec_folder")
|
|
_T(" ON (aec_class.[idfolder] = aec_folder.[id] AND aec_package.[IDClass] = aec_class.[ID])")
|
|
_T(" WHERE (aec_package.[idclass] = '%s' AND aec_package.[name] = '%s')"), sClassID, sName);
|
|
else
|
|
sSQL.Format(_T("SELECT dwg_package.[id]")
|
|
_T(" FROM dwg_package")
|
|
_T(" INNER JOIN dwg_class, dwg_folder")
|
|
_T(" ON (dwg_class.[idfolder] = dwg_folder.[id] AND dwg_package.[IDClass] = dwg_class.[ID])")
|
|
_T(" WHERE (dwg_package.[idclass] = '%s' AND dwg_package.[name] = '%s')"), sClassID, sName);
|
|
|
|
std::vector<CString> ss;
|
|
m_pDb->GetSelData(sSQL, ss);
|
|
for (size_t i = 0; i < ss.size(); ++i)
|
|
{
|
|
sSQL.Format(_T("DELETE FROM %s WHERE [id]='%s'"), getTableName(m_sPrefix, ePackage), ss[i]);
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
if (m_sPrefix.CompareNoCase(_T("aec_")) == 0)
|
|
{
|
|
sSQL.Format(_T("DELETE FROM aec_bims WHERE [equid]='%s'"), ss[i]);
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
}
|
|
}
|
|
|
|
//压包入库
|
|
sSQL.Format(_T("INSERT INTO %s ([name], [rem], [idclass], [package]) VALUES ('%s', '%s', '%s', ?)")
|
|
, getTableName(m_sPrefix, ePackage)
|
|
, sName
|
|
, sRem
|
|
, sClassID);
|
|
|
|
BOOL bSuccess = m_pDb->InsertBlob(sSQL, sEquTmplFile);
|
|
if (!bSuccess)
|
|
{
|
|
AfxMessageBox(_T("设备元件入库失败!"));
|
|
return FALSE;
|
|
}
|
|
|
|
CString equid(_T(""));
|
|
sSQL.Format(_T("SELECT id FROM %s WHERE [name] = '%s'"), getTableName(m_sPrefix, ePackage), sName);
|
|
m_pDb->GetSelData(sSQL, equid);
|
|
if (pIDPackage) *pIDPackage = equid;
|
|
|
|
// 设备
|
|
if (m_sPrefix.CompareNoCase(_T("Aec_")) == 0 && pBims && !pBims->empty())
|
|
{
|
|
std::vector<std::pair<CString, CString>>::const_iterator it(pBims->begin());
|
|
for (; it != pBims->end(); ++it)
|
|
{
|
|
sSQL.Format(_T("INSERT INTO %s ([name],[value],[equid]) VALUES ('%s','%s','%s')")
|
|
, getTableName(m_sPrefix, eBims)
|
|
, it->first
|
|
, it->second
|
|
, equid);
|
|
m_pDb->ExecuteSQL(sSQL);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|