#include "stdafx.h" #include "StdArx.h" #include "TZJLDlg.h" #include "AecDbObjXDataMap.h" #include "uiiado.h" #include "Base64.h" #include #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(lpszCols[i]); m_wndObjList.InsertColumn(i,&lvColumn); } CList 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); }