Files
envi-code/SourceCode/Code2026/CoreCommand/TZJLDlg.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1277 lines
30 KiB
C++

#include "stdafx.h"
#include "StdArx.h"
#include "TZJLDlg.h"
#include "AecDbObjXDataMap.h"
#include "uiiado.h"
#include "Base64.h"
#include <string>
#include "LJCSDlg.h"
#ifndef ID_OBJLIST
#define ID_OBJLIST 341
#endif
#ifndef WM_ITEM_SEL
#define WM_ITEM_SEL (WM_USER+0x105)
#endif
#ifndef WM_REFCOBMSG
#define WM_REFCOBMSG (WM_USER+0x103)
#endif
extern BOOL GetLocalIP(CStringArray& arsIP);
IMPLEMENT_DYNAMIC(CTZJLDlg, CDialog)
CTZJLDlg::CTZJLDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTZJLDlg::IDD, pParent)
{
m_pMySQLDb = NULL;
}
CTZJLDlg::~CTZJLDlg()
{
if (m_pMySQLDb != NULL)
delete m_pMySQLDb;
}
void CTZJLDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_wndMsgList);
DDX_Control(pDX, IDC_STATIC_OBJLIST, m_wndObjFrm);
DDX_Control(pDX, IDC_LIST2, m_wndDXFList);
DDX_Control(pDX, IDOK, m_wndBtClose);
DDX_Control(pDX, IDC_BUTTON3, m_wndBt3);
DDX_Control(pDX, IDC_BUTTON4, m_wndBt4);
}
BEGIN_MESSAGE_MAP(CTZJLDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON2, &CTZJLDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CTZJLDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CTZJLDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDOK, &CTZJLDlg::OnBnClickedOk)
ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CTZJLDlg::onAcadKeepFocus )
ON_MESSAGE(WM_ITEM_SEL,&CTZJLDlg::OnItemSelected)
ON_MESSAGE(WM_REFCOBMSG,&CTZJLDlg::OnRefCobMsg)
ON_WM_SIZE()
ON_WM_SIZING()
END_MESSAGE_MAP()
LONG_PTR CTZJLDlg::onAcadKeepFocus( UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if(!(rect.PtInRect(pt)))
{
return FALSE;
}
return TRUE;
}
BOOL CTZJLDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp;
if (!bmp.LoadBitmap (IDB_BITMAPPRIV))
{
AfxMessageBox(_T("Can't load bitmap: %x\n"), IDB_BITMAPPRIV);
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObj;
bmp.GetBitmap (&bmpObj);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_imageList.Create (16, bmpObj.bmHeight, nFlags, 0, 0);
m_imageList.Add (&bmp, RGB (255, 0, 0));
m_wndDXFList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW);
m_wndDXFList.InsertColumn(0,_T("名称"),LVCFMT_LEFT,120);
m_wndDXFList.InsertColumn(1,_T("DXF"),LVCFMT_LEFT,160);
m_wndDXFList.SetImageList(&m_imageList,LVSIL_SMALL);
m_wndMsgList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW);
m_wndMsgList.InsertColumn(0,_T("发送方"),LVCFMT_LEFT,80);
m_wndMsgList.InsertColumn(1,_T("发送方地址"),LVCFMT_LEFT,120);
m_wndMsgList.InsertColumn(2,_T("发送方专业"),LVCFMT_LEFT,80);
m_wndMsgList.InsertColumn(3,_T("类型"),LVCFMT_LEFT,80);
m_wndMsgList.InsertColumn(4,_T("接收方"),LVCFMT_LEFT,80);
m_wndMsgList.InsertColumn(5,_T("接收方地址"),LVCFMT_LEFT,120);
m_wndMsgList.InsertColumn(6,_T("接收方专业"),LVCFMT_LEFT,80);
m_wndMsgList.InsertColumn(7,_T("说明"),LVCFMT_LEFT,120);
m_wndMsgList.InsertColumn(8,_T("GUID"),LVCFMT_LEFT,0);
m_wndMsgList.InsertColumn(9,_T("时间"),LVCFMT_LEFT,160);
m_wndMsgList.SetImageList(&m_imageList,LVSIL_SMALL);
CRect rcFrameL;
m_wndObjFrm.GetWindowRect(rcFrameL);
ScreenToClient(rcFrameL);
m_wndObjFrm.ShowWindow(SW_HIDE);
m_wndObjList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP,CRect(0,0,0,0),this,ID_OBJLIST);
m_wndObjList.SetImageList(&m_imageList, LVSIL_SMALL);
m_wndObjList.SetImageSize(16,16);
m_wndObjList.SetDragStyle(FALSE);
m_wndObjList.SetEditStyle(FALSE);
m_wndObjList.SetExtendedStyle(0);
m_wndObjList.ModifyStyleEx(0,WS_EX_CLIENTEDGE);
m_wndObjList.SetExtendedStyle(LVS_EX_GRIDLINES);
if(m_wndObjList.GetSafeHwnd() != NULL)
{
m_wndObjList.MoveWindow(rcFrameL);
}
InitObjListColumn();
if ( !InitADOServer() )
{
return TRUE;
}
ShowMsgList();
//测试
ShowDXFList();
GetClientRect(&m_rcMain);
CRect rcBt;
m_wndBtClose.GetWindowRect(&rcBt);
ScreenToClient(&rcBt);
m_nSpaceX = m_rcMain.right - rcBt.right;
m_nSpaceY = m_rcMain.bottom - rcBt.bottom;
m_nSpacePropY = m_rcMain.bottom - rcFrameL.bottom;
CRect rc;
GetWindowRect(rc);
m_szDlgWin.cx = rc.Width();
m_szDlgWin.cy = rc.Height();
return TRUE;
}
LRESULT CTZJLDlg::OnRefCobMsg(WPARAM wp,LPARAM lp)
{
ShowMsgList();
return 0L;
}
BOOL CTZJLDlg::InitADOServer()
{
m_pMySQLDb = CLJCSDlg::GetSHEarthWormConnect();
return m_pMySQLDb != NULL ? TRUE : FALSE;
}
void CTZJLDlg::ShowMsgList()
{
//NameFr,ProFr,IPFr,SendTo,ProTo,IPTo,MsgType,Rem,DwgFile,GUID,MsgTime
/*m_wndMsgList.InsertItem(0,_T("张工"));
m_wndMsgList.SetItemText(0,1,_T("192.168.100.11"));
m_wndMsgList.SetItemText(0,2,_T("给排水工艺"));
m_wndMsgList.SetItemText(0,3,_T("提资"));
m_wndMsgList.SetItemText(0,4,_T("何工"));
m_wndMsgList.SetItemText(0,5,_T("192.168.100.12"));
m_wndMsgList.SetItemText(0,6,_T("结构"));
m_wndMsgList.SetItemText(0,7,_T("备注"));
m_wndMsgList.SetItemText(0,8,_T("GUID"));
m_wndMsgList.SetItemText(0,9,_T("2019-11-11 13:25:45"));
*/
m_wndMsgList.DeleteAllItems();
CStringArray arsIP;
GetLocalIP(arsIP);
BOOL bHasMsg = FALSE;
CString sIP;
//NameFr,ProFr,IPFr,SendTo,ProTo,IPTo,MsgType,Rem,DwgFile,GUID,MsgTime
CString sSQL;
for (int i = 0;i < arsIP.GetSize();i++)
{
sIP = arsIP.GetAt(i);
sSQL.Format(_T("select NameFr from AEC_Co_Msg where IPFr='%s'"),sIP);
if (m_pMySQLDb != NULL)
{
bHasMsg = FALSE;
if (!m_pMySQLDb->IsSelEmpty(sSQL))
{
bHasMsg = TRUE;
sSQL.Format(_T("select NameFr,IPFr,ProFr,MsgType,SendTo,IPTo,ProTo,Rem,GUID,MsgTime from AEC_Co_Msg where IPFr='%s'"),sIP);
if (m_pMySQLDb != NULL)
{
CUIIValueTable table;
m_pMySQLDb->GetSelData(sSQL,table);
CStringArray arVals;
for (int j = 0;j < table.GetTableLogicSize();j++)
{
arVals.RemoveAll();
table.GetValueRecord(j,arVals);
if (arVals.GetSize() >= 10)
{
int nItem = m_wndMsgList.GetItemCount();
nItem = m_wndMsgList.InsertItem(nItem,arVals.GetAt(0));
for (int ii = 1;ii < 10;ii++)
{
m_wndMsgList.SetItemText(nItem,ii,arVals.GetAt(ii));
}
}
}
}
}
}
}
}
void CTZJLDlg::ShowDXFList()
{
//例
m_wndDXFList.InsertItem(0,_T("墙体"),1);
m_wndDXFList.SetItemText(0,1,_T("AEC_DBWALL"));
m_wndDXFList.InsertItem(1,_T("板"),1);
m_wndDXFList.SetItemText(1,1,_T("AEC_DBSLAB"));
m_wndDXFList.InsertItem(2,_T("柱"),1);
m_wndDXFList.SetItemText(2,1,_T("AEC_DBCOLMN"));
m_wndDXFList.InsertItem(3,_T("梁"),1);
m_wndDXFList.SetItemText(3,1,_T("AEC_DBBEAM"));
m_wndDXFList.InsertItem(4,_T("洞口"),1);
m_wndDXFList.SetItemText(4,1,_T("AEC_X3DPART"));
m_wndDXFList.InsertItem(5,_T("基础"),1);
m_wndDXFList.SetItemText(5,1,_T("AEC_X3DPART"));
}
void CTZJLDlg::InitObjListColumn()
{
LPCTSTR lpszCols[] = {_T("名称"),_T("编号"),_T("句柄"),_T("修改"),0};
int lnColumns[] = {140,140,0,140,0};
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 120;
for(int i = 0; lpszCols[i] != NULL;i++)
{
lvColumn.cx = lnColumns[i];
lvColumn.pszText = const_cast<LPTSTR>(lpszCols[i]);
m_wndObjList.InsertColumn(i,&lvColumn);
}
CList<int,int> listReadOnly;
listReadOnly.AddHead(0);
listReadOnly.AddHead(1);
listReadOnly.AddHead(2);
listReadOnly.AddHead(3);
m_wndObjList.SetReadOnlyList(listReadOnly);
}
//下载提资
void CTZJLDlg::OnBnClickedButton2()
{
//从选择的数据库记录提取
CString sDwgFile;
LPCTSTR pszBlockName = _T("结构");
int nMsg = -1;
POSITION ps = m_wndMsgList.GetFirstSelectedItemPosition();
if (ps != NULL)
{
nMsg = m_wndMsgList.GetNextSelectedItem(ps);
}
if (nMsg == -1)
{
AfxMessageBox(_T("请选择一条消息记录下载提资!"));
return;
}
//专业
CString sProName = m_wndMsgList.GetItemText(nMsg, 2);
pszBlockName = (LPCTSTR)sProName;
CString sName, sDxf, sFileName, sLocalFile, sLn;
sFileName.Format(_T("\\CFSTZDlg_%s.lst"), sProName);
sLocalFile = FilePath::GetSysDir() + sFileName;
CStdioFile file2;
if (file2.Open(sLocalFile, CFile::modeRead | CFile::typeText))
{
m_wndDXFList.DeleteAllItems();
int nPos = -1, nItem = -1;
while (file2.ReadString(sLn))
{
sLn.TrimRight(_T('\n'));
nPos = sLn.ReverseFind(_T('@'));
if (nPos != -1)
{
sName = sLn.Mid(0, nPos);
sDxf = sLn.Mid(nPos + 1);
nItem = m_wndDXFList.InsertItem(m_wndDXFList.GetItemCount(), sName);
m_wndDXFList.SetItemText(nItem, 1, sDxf);
}
}
file2.Close();
}
//文件名 GUID作为文件名
CString sDwgFileName = m_wndMsgList.GetItemText(nMsg, 8);
CString sGUID = sDwgFileName;
//下载文件到临时目录
sDwgFile = FilePath::GetSysDir();
sDwgFile.MakeLower();
sDwgFile.Replace(_T("\\sys"), _T("\\temp"));
sDwgFile += _T("\\");
sDwgFile += sDwgFileName;
//下载文件
if (!DownLoadDwgFile(nMsg, sDwgFile))
{
CString sTip;
sTip.Format(_T("下载 %s 协同区失败!"), sProName);
AfxMessageBox(sTip);
return;
}
//
CString sBlockName;
AcDbObjectId id;
AcDbObjectIdArray arIds;
Acad::ErrorStatus es;
AcDbDatabase *pDb = acdbCurDwg();
AcAxDocLock lock;
AcDbDatabase db(Adesk::kFalse);
if (Acad::eOk == (es = db.readDwgFile(sDwgFile)))
{
AcDbObjectId idRec;
AecDbObjXDataMap xDataMap;
const TCHAR *pszRecName = _T("*U");
//1.先找到是否有此协同区
AcDbBlockTable *pTbl = NULL;
AcDbBlockTableRecord *pRec = NULL;
if (Acad::eOk == pDb->getBlockTable(pTbl, AcDb::kForRead))
{
BOOL bFind = FALSE;
AcDbBlockTableIterator *pBIt = NULL;
pTbl->newIterator(pBIt);
if (pBIt != NULL)
{
for (pBIt->start(); !pBIt->done(); pBIt->step())
{
pBIt->getRecordId(idRec);
if (xDataMap.Read(idRec, _T("COB_SH")))
{
xDataMap.GetAt(KEY_NAME, sBlockName);
if (sBlockName.CompareNoCase(pszBlockName) == 0)
{
bFind = TRUE;
if (Acad::eOk == acdbOpenObject((AcDbObject *&)pRec, idRec, AcDb::kForRead))
{
pRec->getName(pszRecName);
pRec->close();
}
break;
}
}
}
delete pBIt;
}
pTbl->close();
}
//2.下载或更新协同区
Adesk::Int16 nVal1 = acdbCurDwg()->useri4();
pDb->setUseri4(KEY_NOPROTECT);
Adesk::Int16 nVal2 = acdbCurDwg()->useri4();
db.setUseri4(KEY_NOPROTECT);
if (Acad::eOk == (es = pDb->insert(idRec, pszRecName, &db)))
{
if (Acad::eOk == acdbOpenObject((AcDbObject *&)pRec, idRec, AcDb::kForWrite))
{
xDataMap.SetAt(KEY_NAME, pszBlockName);
xDataMap.Write(pRec, _T("COB_SH"));//上华协同
AcDbBlockTableRecordIterator *pIt = NULL;
pRec->newIterator(pIt);
if (pIt != NULL)
{
for (pIt->start(); !pIt->done(); pIt->step())
{
pIt->getEntityId(id);
arIds.append(id);
}
delete pIt;
}
pRec->close();
}
}
pDb->setUseri4(nVal1);
db.setUseri4(nVal2);
}
//3.显示协同区内容到列表
Adesk::Int32 nLen = arIds.length();
//fe _T("AEC_EWFIT,AEC_XXXDOGHS")
CString sText, sClasDxf = _T("");
for (int i = 0; i < m_wndDXFList.GetItemCount(); i++)
{
sText = m_wndDXFList.GetItemText(i, 1);
sClasDxf += sText;
sClasDxf += _T(",");
}
sClasDxf.TrimRight(_T(','));
if (!arIds.isEmpty())
{
m_mapNameToRoot.RemoveAll();
m_mapNoToItem.RemoveAll();
m_wndObjList.DeleteAll();
//m_arLastPick.removeAll();
m_sDxfNames = _T("");
CTreeItem *pRoot = NULL;
if (nLen > 0)
{
CItemInfo *lpRoot = new CItemInfo();
lpRoot->SetImage(4);
lpRoot->SetItemText(_T("提资构件"));
lpRoot->AddSubItemText("");
lpRoot->AddSubItemText("");
lpRoot->AddSubItemText("");
pRoot = m_wndObjList.InsertRootItem(lpRoot);
m_mapNameToRoot.SetAt(_T("提资构件"), pRoot);
}
AcDbObjectId id;
AcDbEntity *pEnt = NULL;
LPCTSTR pszDXF = NULL;
TCHAR szHanele[33];
CString sNo, sEntName;
memset(szHanele, 0, sizeof(TCHAR) * 33);
for (int i = 0; i < arIds.length(); i++)
{
id = arIds.at(i);
sNo = _T("");
sEntName = _T("");
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
{
pszDXF = pEnt->isA()->dxfName();
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
if (sNo.IsEmpty())
{
AecDbEwFitting *pFit = AecDbEwFitting::cast(pEntBase);
if (pFit != NULL)
{
sNo = pFit->GetGUID();
}
}
}
AecDbCurveBase *pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
if (sNo.IsEmpty())
{
AecDbEwPipeBase *pPipe = AecDbEwPipeBase::cast(pCurBase);
if (pPipe != NULL)
{
sNo = pPipe->GetGUID();
}
}
}
AecDbX3dPartEntity *pPart = AecDbX3dPartEntity::cast(pEnt);
if (pPart != NULL)
{
sEntName = pPart->GetName();
}
id.handle().getIntoAsciiBuffer(szHanele);
if (sNo.IsEmpty()) sNo = szHanele;
AddObjectList(pszDXF, sNo, szHanele, sEntName);
pEnt->close();
}
}
int nScroll = 0;
m_wndObjList.ExpandAll(pRoot, nScroll);
m_sDxfNames.TrimRight(_T(","));
}
//然后设置pickup状态
//CString sSQL;
//sSQL.Format(_T("update AEC_Co_Msg set pickup=1 where GUID='%s'"), sGUID);
//if (m_pMySQLDb != NULL)
//{
// m_pMySQLDb->ExecuteSQL(sSQL);
//}
CFileFind find;
if (find.FindFile(sDwgFile))
{
::DeleteFile(sDwgFile);
}
}
void CTZJLDlg::AddObjectList(LPCTSTR pszDXF, LPCTSTR pszNo, LPCTSTR pszHanele, LPCTSTR pszEntName)
{
CTreeItem *pRoot = NULL;
m_mapNameToRoot.Lookup(_T("提资构件"), (void *&)pRoot);
CString sDxf, sName = _T("");
for (int i = 0; i < m_wndDXFList.GetItemCount(); i++)
{
sDxf = m_wndDXFList.GetItemText(i, 1);
if (sDxf.CompareNoCase(pszDXF) == 0)
{
sName = m_wndDXFList.GetItemText(i, 0);
if (pszEntName != NULL && _tcslen(pszEntName) > 0)
{
sName = pszEntName;
}
break;
}
}
if (sName.IsEmpty()) //找到
{
sName = pszDXF;
}
if (!sName.IsEmpty()) //找到
{
BOOL bFind = false;
CItemInfo *lpItem = NULL;
CItemInfo *lpParent = NULL;
CTreeItem *pParent = NULL;
//墙体目录
bFind = m_mapNameToRoot.Lookup(sName, (void *&)pParent);
if (!bFind)
{
lpParent = new CItemInfo();
lpParent->SetItemText(sName);
lpParent->SetImage(1);
lpParent->AddSubItemText(_T(""));
lpParent->AddSubItemText(_T(""));
lpParent->AddSubItemText(_T(""));
pParent = m_wndObjList.InsertItem(pRoot, lpParent);
m_mapNameToRoot.SetAt(sName, pParent);
}
//墙体实体
if (pParent != NULL)
{
lpItem = new CItemInfo();
lpItem->SetItemText(sName);
lpItem->AddSubItemText(pszNo);
lpItem->AddSubItemText(pszHanele);
lpItem->AddSubItemText(_T(""));
lpItem->SetImage(2);
CTreeItem *pItem = m_wndObjList.InsertItem(pParent, lpItem);
m_mapNoToItem.SetAt(pszNo, pItem);
if (m_sDxfNames.Find(sDxf) == -1)
{
m_sDxfNames += _T(",");
m_sDxfNames += sDxf;
}
}
}
}
//对比
void CTZJLDlg::OnBnClickedButton3()
{
AcAxDocLock lock;
//从当前库中比对
int nRes = 0, nDiff = 0;
COLORREF crRed = RGB(255, 0, 0);
COLORREF crGreen = RGB(0, 255, 0);
CString sNo;
ads_name ss, ent;
struct resbuf *pRb = acutBuildList(RTDXF0, (const TCHAR *)m_sDxfNames, 0);
if (pRb != NULL)
{
acedSSGet(_T("A"), NULL, NULL, pRb, ss);
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
acedSetStatusBarProgressMeter(_T("正在比较,请稍后..."), 0, nLen);
AcDbObjectId id;
AcDbObjectIdArray arThis;
AcDbObjectIdArray arStandIn;//替身
CStringList lstStandInNo;
AcDbEntity *pEnt = NULL;
for (int i = 0; i < nLen; i++)
{
acedSetStatusBarProgressMeterPos(i);
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
arThis.append(id);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
{
sNo = _T("");
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
}
AecDbCurveBase *pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
}
AecDbX3dPartEntity *pPart = AecDbX3dPartEntity::cast(pEnt);
if (pPart != NULL)
{
pPart->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
}
if (!sNo.IsEmpty())
{
CTreeItem *pItem = NULL;
m_mapNoToItem.Lookup(sNo, (void *&)pItem);
if (pItem != NULL)
{
AcDbObjectId idOther;
CItemInfo *pInf = m_wndObjList.GetData(pItem);
if (pInf != NULL && pInf->GetItemCount() > 1)
{
CString sHandle = pInf->GetSubItem(1);
AcDbHandle hd((const TCHAR *)sHandle);
if (sHandle.CompareNoCase(_T("3528")) == 0)
{
int nnn = 0;
}
if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(idOther, false, hd))
{
if (idOther == id)
{
pEnt->close();
continue;
}
arStandIn.append(idOther);
lstStandInNo.AddTail(sNo);
//打开对象比较
AcDbEntity *pEntT = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEntT, idOther, AcDb::kForRead))
{
nRes = CompareEnt(pEnt, pEntT);
if (nRes == 0)//相同
{
pInf->SetSubItemText(2, _T("相同"), RGB(255, 255, 255));
}
else if (nRes > 0)
{
pInf->SetSubItemText(2, _T("不同"), crRed);
nDiff += 1;
}
else
{
pInf->SetSubItemText(2, _T(""));
}
pEntT->close();
}
}
}
}
}
pEnt->close();
}
}
acedSSFree(ss);
acutRelRb(pRb);
acedRestoreStatusBar();
//新增加的设置为绿色
AcDbObjectId idTmp;
CTreeItem *pItem = NULL;
CMapStringToPtr mapNoToItem;
for (POSITION ps = m_mapNoToItem.GetStartPosition(); ps != NULL;)
{
m_mapNoToItem.GetNextAssoc(ps, sNo, (void *&)pItem);
if (lstStandInNo.Find(sNo) == NULL)//没有找到,为新加入的
{
CItemInfo *pInf = m_wndObjList.GetData(pItem);
if (pInf != NULL && pInf->GetItemCount() > 1)
{
//并且是Aec实体
CString sHandle = pInf->GetSubItem(1);
AcDbHandle hd((const TCHAR *)sHandle);
if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(idTmp, false, hd))
{
AcDbEntity *pEntT = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEntT, idTmp, AcDb::kForRead))
{
AecDbEntityBase *pAecEnt = AecDbEntityBase::cast(pEntT);
AecDbCurveBase *pAecCrv = AecDbCurveBase::cast(pEntT);
if (pAecEnt != NULL || pAecCrv != NULL)
{
pInf->SetSubItemText(2, _T("新增"), crGreen);
}
pEntT->close();
}
}
}
}
}
}
m_wndObjList.Invalidate();
m_wndObjList.RedrawWindow();
if (nDiff > 0)
{
acutPrintf(_T("\n比对完毕!共发现 %d 个构件模型不同!"));
acutPrintf(_T("\n不同的构件在列表中以红色显示!"));
}
}
int CTZJLDlg::CompareEnt(AcDbEntity* pEnt,AcDbEntity* pEntT)
{
int nEqu = -1;
if (pEnt != NULL && pEntT != NULL)
{
if ( _tcscmp( pEnt->isA()->dxfName(),pEntT->isA()->dxfName()) == 0)
{
//详细比较
//墙
AecDbXWall *pWallThis = AecDbXWall::cast(pEnt);
AecDbXWall *pWallThat = AecDbXWall::cast(pEntT);
if (pWallThis != NULL && pWallThat != NULL)
{
nEqu = pWallThis->ComparedTo(pWallThat);
}
//梁
AecDbBeam *pBeamThis = AecDbBeam::cast(pEnt);
AecDbBeam *pBeamThat = AecDbBeam::cast(pEntT);
if (pBeamThis != NULL && pBeamThat != NULL)
{
nEqu = pBeamThis->ComparedTo(pBeamThat);
}
//板
AecDbXSlab *pSlabThis = AecDbXSlab::cast(pEnt);
AecDbXSlab *pSlabThat = AecDbXSlab::cast(pEntT);
if (pSlabThis != NULL && pSlabThat != NULL)
{
nEqu = pSlabThis->ComparedTo(pSlabThat);
}
//柱子
AecDbColumn *pColThis = AecDbColumn::cast(pEnt);
AecDbColumn *pColThat = AecDbColumn::cast(pEntT);
if (pColThis != NULL && pColThat != NULL)
{
nEqu = pColThis->ComparedTo(pColThat);
}
//洞口
AecDbX3dPartEntity *pPartThis = AecDbX3dPartEntity::cast(pEnt);
AecDbX3dPartEntity *pPartThat = AecDbX3dPartEntity::cast(pEntT);
if (pPartThis != NULL && pPartThat != NULL)
{
nEqu = pPartThis->ComparedTo(pPartThat);
}
//管线对管线
AecDbEwPipe *pPipeThis = AecDbEwPipe::cast(pEnt);
AecDbEwPipe *pPipeThat = AecDbEwPipe::cast(pEntT);
if (pPipeThis != NULL && pPipeThat != NULL)
{
nEqu = pPipeThis->ComparedTo(pPipeThat);
}
AecDbEwFitting *pEFitThis = AecDbEwFitting::cast(pEnt);
AecDbEwFitting *pEFitThat = AecDbEwFitting::cast(pEntT);
if (pEFitThis != NULL && pEFitThat != NULL)
{
nEqu = pEFitThis->ComparedTo(pEFitThat);
}
AecDbEwEquipment *pEEquThis = AecDbEwEquipment::cast(pEnt);
AecDbEwEquipment *pEEquThat = AecDbEwEquipment::cast(pEntT);
if (pEEquThis != NULL && pEEquThat != NULL)
{
nEqu = pEEquThis->ComparedTo(pEEquThat);
}
//风管对风管
AecDbHvacDuct *pHPipeThis = AecDbHvacDuct::cast(pEnt);
AecDbHvacDuct *pHPipeThat = AecDbHvacDuct::cast(pEntT);
if (pHPipeThis != NULL && pHPipeThat != NULL)
{
nEqu = pHPipeThis->ComparedTo(pHPipeThat);
}
AecDbHvacFitting *pHFithis = AecDbHvacFitting::cast(pEnt);
AecDbHvacFitting *pHFiThat = AecDbHvacFitting::cast(pEntT);
if (pHFithis != NULL && pHFiThat != NULL)
{
nEqu = pHFithis->ComparedTo(pHFiThat);
}
//桥架对桥架
AecDbECableTray *pECPipeThis = AecDbECableTray::cast(pEnt);
AecDbECableTray *pECPipeThat = AecDbECableTray::cast(pEntT);
if (pECPipeThis != NULL && pECPipeThat != NULL)
{
nEqu = pECPipeThis->ComparedTo(pECPipeThat);
}
AecDbEcFitting *pECFithis = AecDbEcFitting::cast(pEnt);
AecDbEcFitting *pECFiThat = AecDbEcFitting::cast(pEntT);
if (pECFithis != NULL && pECFiThat != NULL)
{
nEqu = pECFithis->ComparedTo(pECFiThat);
}
//素砼??
}
}
return nEqu;
}
//替换
void CTZJLDlg::OnBnClickedButton4()
{
int nRes = AfxMessageBox(_T("确认要替换吗?"), MB_YESNO);
if (nRes == IDNO)
{
return;
}
AcAxDocLock lock;
AcDbObjectId id;
CString sHandle;
CString sDxf, sNo, sNoT;
//先清理上次比对的临时对象
AcDbEntity *pEntLast = NULL;
/*if (m_idZObj != AcDbObjectId::kNull)
{
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEntLast, m_idZObj, AcDb::kForWrite)))
{
pEntLast->erase();
pEntLast->close();
m_idZObj.setNull();
}
else
{
acutPrintf(_T("\nes = %d"), es);
}
}*/
//1.提取协同区id
int nSel = m_wndObjList.GetSelectedItem();
if (nSel != -1)
{
CTreeItem *pItem = m_wndObjList.GetTreeItem(nSel);
if (pItem != NULL)
{
CItemInfo *pInf = m_wndObjList.GetData(pItem);
if (pInf != NULL)
{
sHandle = pInf->GetSubItem(1);
AcDbHandle hd((const TCHAR *)sHandle);
if (Acad::eOk == acdbCurDwg()->getAcDbObjectId(id, false, hd))
{
AcDbEntity *pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
{
sDxf = pEnt->isA()->dxfName();
AecDbEntityBase *pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
}
AecDbCurveBase *pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNo);
}
pEnt->close();
}
//2.找到图中对应的
bool bFind = false;
ads_name ss, ent;
struct resbuf *pRb = acutBuildList(RTDXF0, (const TCHAR *)sDxf, 0);
if (pRb != NULL)
{
nRes = acedSSGet(_T("A"), NULL, NULL, pRb, ss);//
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
AcDbEntity *pEntT = NULL;
AcDbObjectId idT;
for (int i = 0; i < nLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(idT, ent);
if (idT == id)//2.1排除协同区的
{
continue;
}
if (Acad::eOk == acdbOpenAcDbEntity(pEntT, idT, AcDb::kForRead))
{
AecDbEntityBase *pEntBaseT = AecDbEntityBase::cast(pEntT);
if (pEntBaseT != NULL)
{
pEntBaseT->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNoT);
}
AecDbCurveBase *pCurBaseT = AecDbCurveBase::cast(pEntT);
if (pCurBaseT != NULL)
{
pCurBaseT->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO, sNoT);
}
if (sNo.CompareNoCase(sNoT) == 0)//找到
{
//2.2删除图中的目标
pEntT->upgradeOpen();
pEntT->erase();
pEntT->downgradeOpen();
bFind = true;
}
pEntT->close();
if (bFind)
break;
}
}
acedSSFree(ss);
}
//3.添加协同区的对象
AcDbObjectId idMoelSpace;
AcDbBlockTable *pTable = NULL;
if (Acad::eOk == acdbCurDwg()->getBlockTable(pTable, AcDb::kForRead))
{
if (Acad::eOk == pTable->getAt(ACDB_MODEL_SPACE, idMoelSpace))
{
}
pTable->close();
}
if (bFind)
{
AcDbObjectIdArray arIds;
arIds.append(id);
AcDbIdMapping pIdMap;
Adesk::Int16 nVal = acdbCurDwg()->useri4();
acdbCurDwg()->setUseri4(KEY_NOPROTECT);
if (Acad::eOk == acdbCurDwg()->deepCloneObjects(arIds, idMoelSpace, pIdMap))
{
//3.1删除协同区的源对象
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))
{
pEnt->erase();
pEnt->close();
}
//3.2删除协同区的列表记录
m_wndObjList.DeleteItemEx(pItem, nSel);
m_mapNoToItem.RemoveKey(sNo);
}
acdbCurDwg()->setUseri4(nVal);
}
}
}
}
}
}
void CTZJLDlg::OnBnClickedOk()
{
ShowWindow(SW_HIDE);
}
LRESULT CTZJLDlg::OnItemSelected(WPARAM wp,LPARAM lp)
{
CPoint* pptPos = (CPoint*)lp;
int nSel = (int)pptPos->x;
int nSubItem = (int)pptPos->y;
CString sHandle;
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
if (pItem != NULL)
{
CItemInfo* pInf = m_wndObjList.GetData(pItem);
if (pInf != NULL)
{
sHandle = pInf->GetSubItem(1);
if (sHandle.IsEmpty())
{
return 0L;
}
AcAxDocLock lock;
CString sNo,sDxf;
AcDbHandle hd((const TCHAR*)sHandle);
AcDbObjectId id;
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
{
//按照编号找到对应的实体,加亮选择
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
sDxf = pEnt->isA()->dxfName();
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
}
pEnt->close();
}
//选择当前
if ( !sNo.IsEmpty() && !sDxf.IsEmpty() )
{
ads_name ss,ent;
struct resbuf* pRb = acutBuildList(RTDXF0, sDxf, 0);
if (pRb != NULL)
{
acedSSGet(_T("A"),NULL,NULL,pRb,ss);
acutRelRb(pRb);
Adesk::Int32 nLen = 0;
acedSSLength(ss,&nLen);
CString sNo2;
AcDbObjectId idT;
AcDbEntity* pEntT = NULL;
BOOL bFind = FALSE;
for (int i = 0;i < nLen;i++)
{
acedSSName(ss,i,ent);
acdbGetObjectId(idT,ent);
if (idT == id)
{
continue;
}
if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForRead))
{
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo2);
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo2);
}
pEntT->close();
}
if (sNo2.CompareNoCase(sNo) == 0)
{
bFind = TRUE;
break;
}
}
acedSSFree(ss);
if (bFind)
{
//加亮
ads_name ssPick;
acdbGetAdsName(ent, idT);
acedSSAdd(ent, NULL, ssPick);
acedSSSetFirst(ssPick, ssPick);
acedSSFree(ssPick);
acedUpdateDisplay();
}
}
}
}
}
}
return 0L;
}
BOOL CTZJLDlg::DownLoadDwgFile(int nItem,CString& sDwgFile)
{
CString sGUID = m_wndMsgList.GetItemText(nItem,8);
CString sSQL;
sSQL.Format(_T("select DwgFile from AEC_Co_Msg where GUID='%s'"),sGUID);
if ( m_pMySQLDb->GetSelBlob(sSQL,sDwgFile) > 0)
{
return TRUE;
}
return FALSE;
}
void CTZJLDlg::OnSize(UINT nType, int cx, int cy)
{
if (cx < m_rcMain.Width() || cy < m_rcMain.Height())
return;
CDialog::OnSize(nType, cx, cy);
if (nType == -1) return;
CRect rc;
GetClientRect(&rc);
int nH = 0,nW = 0;
CRect rect;
if (::IsWindow(m_wndMsgList.m_hWnd))
{
m_wndMsgList.GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right = rc.right - m_nSpaceX;
m_wndMsgList.MoveWindow(rect);
}
if (::IsWindow(m_wndObjList.m_hWnd))
{
m_wndObjList.GetWindowRect(&rect);
ScreenToClient(&rect);
rect.right = rc.right - m_nSpaceX;
rect.bottom = rc.bottom - m_nSpacePropY;
m_wndObjList.MoveWindow(rect);
}
if (::IsWindow(m_wndBt3.m_hWnd) &&
::IsWindow(m_wndBt4.m_hWnd) &&
::IsWindow(m_wndBtClose.m_hWnd) )
{
m_wndBt3.GetWindowRect(&rect);
ScreenToClient(&rect);
nH = rect.Height();
rect.bottom = rc.bottom - m_nSpaceY;
rect.top = rect.bottom - nH;
m_wndBt3.MoveWindow(rect);
m_wndBt4.GetWindowRect(&rect);
ScreenToClient(&rect);
nH = rect.Height();
rect.bottom = rc.bottom - m_nSpaceY;
rect.top = rect.bottom - nH;
m_wndBt4.MoveWindow(rect);
m_wndBtClose.GetWindowRect(&rect);
ScreenToClient(&rect);
nH = rect.Height();
nW = rect.Width();
rect.bottom = rc.bottom - m_nSpaceY;
rect.top = rect.bottom - nH;
rect.right = rc.right - m_nSpaceX;
rect.left = rect.right - nW;
m_wndBtClose.MoveWindow(rect);
}
}
void CTZJLDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
int nWidth = pRect->right - pRect->left;
int nHeight= pRect->bottom- pRect->top;
if(nWidth < m_rcMain.Width())
{
pRect->right = pRect->left + m_szDlgWin.cx;
}
if(nHeight < m_rcMain.Height())
{
pRect->bottom = pRect->top + m_szDlgWin.cy;
}
CDialog::OnSizing(fwSide, pRect);
}