#include "stdafx.h" #include "StdArx.h" #include "JSTZDlg.h" #include "AecDbObjXDataMap.h" #include "uiiado.h" #include "Base64.h" #include #include "LJCSDlg.h" #include "AecDbEwFitting.h" #include "AecDbEwPipeBase.h" #ifndef ID_OBJLIST #define ID_OBJLIST 341 #endif #ifndef ID_TIMEQUERY #define ID_TIMEQUERY 2368 #endif #ifndef WM_ITEM_SEL #define WM_ITEM_SEL (WM_USER+0x105) #endif #ifndef WM_REFCOBMSG #define WM_REFCOBMSG (WM_USER+0x103) #endif static const Adesk::UInt16 kRed = 1; static const Adesk::UInt16 kYellow = 2; static const Adesk::UInt16 kGreen = 3; extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb = NULL,bool bClose = true); IMPLEMENT_DYNAMIC(CJSTZDlg, CDialog) CJSTZDlg::CJSTZDlg(CWnd* pParent /*=NULL*/) : CDialog(CJSTZDlg::IDD, pParent) , m_bZObj(FALSE) , m_bTObj(FALSE) { m_pMySQLDb = NULL; } CJSTZDlg::~CJSTZDlg() { if (m_pMySQLDb != NULL) delete m_pMySQLDb; } void CJSTZDlg::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, IDC_STATIC_OBJLIST2, m_wndProperSta); DDX_Check(pDX, IDC_CHECK2, m_bZObj); DDX_Check(pDX, IDC_CHECK3, m_bTObj); DDX_Control(pDX, IDC_STATIC_SPLIT, m_wndStaicYSplit); DDX_Control(pDX, IDOK, m_wndBtClose); DDX_Control(pDX, IDC_BUTTON5, m_wndBt5); DDX_Control(pDX, IDC_BUTTON6, m_wndBt6); DDX_Control(pDX, IDC_BUTTON4, m_wndBt4); DDX_Control(pDX, IDC_BUTTON3, m_wndBt3); DDX_Control(pDX, IDC_STATIC_NEWT, m_wndStaNewT); DDX_Control(pDX, IDC_STATIC_NEW, m_wndStaNew); DDX_Control(pDX, IDC_STATIC_DIFT, m_wndStaDif); DDX_Control(pDX, IDC_STATIC_DIFF, m_wndStaDifT); } BEGIN_MESSAGE_MAP(CJSTZDlg, CDialog) ON_BN_CLICKED(IDOK, &CJSTZDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON2, &CJSTZDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3, &CJSTZDlg::OnBnClickedButton3) ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CJSTZDlg::onAcadKeepFocus ) ON_BN_CLICKED(IDC_BUTTON5, &CJSTZDlg::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON4, &CJSTZDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON6, &CJSTZDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON7, &CJSTZDlg::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON1, &CJSTZDlg::OnBnClickedButton1) ON_MESSAGE(WM_ITEM_SEL,&CJSTZDlg::OnItemSelected) ON_MESSAGE(WM_REFCOBMSG,&CJSTZDlg::OnRefCobMsg) ON_WM_DESTROY() ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON8, &CJSTZDlg::OnBnClickedButton8) ON_BN_CLICKED(IDC_CHECK2, &CJSTZDlg::OnBnClickedCheck2) ON_BN_CLICKED(IDC_CHECK3, &CJSTZDlg::OnBnClickedCheck3) ON_WM_CTLCOLOR() ON_WM_SIZE() ON_WM_SIZING() END_MESSAGE_MAP() LONG_PTR CJSTZDlg::onAcadKeepFocus( UINT_PTR, LONG_PTR) { POINT pt; ::GetCursorPos(&pt); CRect rect; GetWindowRect(&rect); if(!(rect.PtInRect(pt))) { return FALSE; } return TRUE; } BOOL CJSTZDlg::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); //obj list 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); } //proper m_wndProperSta.GetWindowRect(rcFrameL); ScreenToClient(rcFrameL); m_wndProperSta.ShowWindow(SW_HIDE); m_wndProperList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP,CRect(0,0,0,0),this,ID_OBJLIST); m_wndProperList.SetImageList(&m_imageList, LVSIL_SMALL); m_wndProperList.SetImageSize(16,16); m_wndProperList.SetDragStyle(FALSE); m_wndProperList.SetEditStyle(FALSE); m_wndProperList.SetExtendedStyle(0); m_wndProperList.ModifyStyleEx(0,WS_EX_CLIENTEDGE); m_wndProperList.SetExtendedStyle(LVS_EX_GRIDLINES); if(m_wndProperList.GetSafeHwnd() != NULL) { m_wndProperList.MoveWindow(rcFrameL); } // InitObjListColumn(); InitProperListColumn(); if ( !InitADOServer() ) { return FALSE; } ShowMsgList(); //测试 ShowDXFList(); //1分钟查询一次 SetTimer(ID_TIMEQUERY,60000,NULL); 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 CJSTZDlg::OnRefCobMsg(WPARAM wp,LPARAM lp) { ShowMsgList(); return 0L; } BOOL CJSTZDlg::InitADOServer() { m_pMySQLDb = CLJCSDlg::GetSHEarthWormConnect(); return m_pMySQLDb != NULL ? TRUE : FALSE; } BOOL GetLocalIP(CStringArray& arsIPs) { WORD sockVersion = MAKEWORD(1,1); WSADATA wsaData; WSAStartup(sockVersion, &wsaData); //先发送一个请求更新的本地ip char szIpThis[65]; memset(szIpThis,0,65); char szHost[64]; gethostname(szHost,64); CString sAlias,sIP; struct hostent *phe = gethostbyname(szHost); if (phe != NULL) { if (phe->h_addrtype == AF_INET) { int i(0); struct in_addr addr; while (phe->h_addr_list[i] != 0) { addr.s_addr = *(u_long *)phe->h_addr_list[i++]; sIP = inet_ntoa(addr); arsIPs.Add(sIP); } } else if (phe->h_addrtype == AF_INET6) acutPrintf(_T("\tRemotehost is an IPv6 address\n")); } WSACleanup(); return !arsIPs.IsEmpty(); } void CJSTZDlg::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; //NameFr,nProFr,IPFr,SendTo,ProTo,IPTo,MsgType,Rem,DwgFile,GUID,MsgTime CString sSQL,sIP; for (int i = 0;i < arsIP.GetSize();i++) { sIP = arsIP.GetAt(i); sSQL.Format(_T("select NameFr from AEC_Co_Msg where IPTo='%s' order by msgtime DESC"),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 IPTo='%s' order by msgtime DESC"),sIP); if (bHasMsg && 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)); } } } } } } } } BOOL CJSTZDlg::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 CJSTZDlg::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")); m_wndDXFList.InsertItem(6,_T("基础"),1); m_wndDXFList.SetItemText(6,1,_T("AEC_X3DPART")); } void CJSTZDlg::OnBnClickedOk() { UnColorLightThisPick(); AcDbEntity* pEntT = NULL; if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,m_idZObj,AcDb::kForWrite)) { pEntT->erase(); pEntT->close(); } ShowWindow(SW_HIDE); } void CJSTZDlg::InitObjListColumn() { LPCTSTR lpszCols[] = {_T("名称"),_T("编号"),_T("句柄"),_T("修改状态"),0}; int lnColumns[] = {120,100,0,80,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 CJSTZDlg::InitProperListColumn() { LPCTSTR lpszCols[] = {_T("构件"),_T("属性名"),_T("数值"),_T("属性名"),_T("数值"),0}; int lnColumns[] = {80,120,120,120,120,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_wndProperList.InsertColumn(i,&lvColumn); } CList listReadOnly; listReadOnly.AddHead(0); listReadOnly.AddHead(1); listReadOnly.AddHead(2); listReadOnly.AddHead(3); listReadOnly.AddHead(4); m_wndProperList.SetReadOnlyList(listReadOnly); } //接收提资 void CJSTZDlg::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,6); 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; Adesk::Int16 nVal1 = acdbCurDwg()->useri4(); pDb->setUseri4(KEY_NOPROTECT); Adesk::Int16 nVal2 = acdbCurDwg()->useri4(); AcDbDatabase db(Adesk::kFalse); db.setUseri4(KEY_NOPROTECT); if ( Acad::eOk == (es = db.readDwgFile(sDwgFile))) { AcDbObjectId idRec; idRec.setNull(); 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.下载或更新协同区 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(); } } else { //走 wblockCloneObjects 路线 AcDbBlockTableRecord *pRec = new AcDbBlockTableRecord; pRec->setName(pszRecName); idRec.setNull(); AcDbBlockTable *pTbl = NULL; if (Acad::eOk == (es = pDb->getBlockTable(pTbl, AcDb::kForWrite))) { pTbl->add(idRec, pRec); pRec->close(); pTbl->close(); } pTbl = NULL; AcDbObjectIdArray arIdSrc; if (Acad::eOk == (es = db.getBlockTable(pTbl, AcDb::kForRead))) { AcDbBlockTableRecord *pModRc = NULL; if (Acad::eOk == (es = pTbl->getAt(ACDB_MODEL_SPACE, pModRc, AcDb::kForRead))) { AcDbBlockTableRecordIterator *pIter = NULL; pModRc->newIterator(pIter); AcDbObjectId objId; for (pIter->start(); !pIter->done(); pIter->step()) { pIter->getEntityId(objId); arIdSrc.append(objId); } delete pIter; } pModRc->close(); pTbl->close(); } if (idRec.isValid()) { AcDbIdMapping idMap; if (Acad::eOk == (es = db.wblockCloneObjects(arIdSrc, idRec, idMap, AcDb::kDrcIgnore))) { if (Acad::eOk == (es = 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)) { #ifndef NDEBUG ::DeleteFile(sDwgFile); #endif } } void CJSTZDlg::OnBnClickedButton1() { //从选择的数据库记录提取 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,6); AcAxDocLock lock; AcDbObjectId id; AcDbObjectIdArray arIds; //1.找协同区 AcDbDatabase* pDb = acdbCurDwg(); AcDbBlockTable* pTbl = NULL; if ( Acad::eOk == pDb->getBlockTable(pTbl,AcDb::kForRead)) { AcDbBlockTableIterator* pIt = NULL; pTbl->newIterator(pIt); bool bFind = false; CString sName; AcDbObjectId idRec; AcDbBlockTableRecord* pRec = NULL; if (pIt != NULL) { AecDbObjXDataMap xDataMap; for (pIt->start();!pIt->done();pIt->step()) { pIt->getRecordId(idRec); if ( xDataMap.Read(idRec,_T("CO_SH")) ) { xDataMap.GetAt(KEY_NAME,sName); if (sName.CompareNoCase(pszBlockName) == 0) { bFind = true; break; } } } delete pIt; } pTbl->close(); if (bFind)//发现协同区 { if ( Acad::eOk == acdbOpenObject( (AcDbObject*&)pRec,idRec,AcDb::kForRead) ) { 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(); } } else { AfxMessageBox(_T("没有发现协同区!")); return; } } Adesk::Int32 nLen = arIds.length(); if (nLen == 0) { AfxMessageBox(_T("协同区中没有构件!")); return; } //2. 例如 _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(""); 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); 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); } AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt); if (pCurBase != NULL) { pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo); } AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEnt); if (pPart != NULL) { sEntName = pPart->GetName(); } id.handle().getIntoAsciiBuffer(szHanele); AddObjectList(pszDXF,sNo,szHanele,sEntName); pEnt->close(); } } int nScroll = 0; m_wndObjList.ExpandAll(pRoot,nScroll); m_sDxfNames.TrimRight(_T(",")); } } void CJSTZDlg::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; } } } } bool CJSTZDlg::GetChildIds(CTreeItem* pChild,AcDbObjectIdArray& arIds) { AcDbObjectId id; CString sHandle; POSITION ps = NULL; int nCount = 0; ps = m_wndObjList.GetHeadPosition(pChild); CTreeItem* pEntItem = NULL; while( ps != NULL) { pEntItem = m_wndObjList.GetNextChild(pChild,ps); //墙体 //{_T("名称"),_T("编号"),_T("句柄"),0}; CItemInfo* pInf = m_wndObjList.GetData(pEntItem); if (pInf != NULL) { sHandle = pInf->GetSubItem(1); AcDbHandle hd((const TCHAR*)sHandle); if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) ) { arIds.append(id); nCount++; } } } return nCount > 0 ? true : false; } //全部添加到图中 void CJSTZDlg::OnBnClickedButton5() { int nRes = AfxMessageBox(_T("警告:确认是第一次全部添加,多次全部添加会导致叠加重复!\n确认要全部添加到图中吗?"),MB_YESNO); if (nRes != IDYES) return; AcDbObjectIdArray arIds; CTreeItem * pRoot = NULL; m_mapNameToRoot.Lookup(_T("提资构件"),(void*&)pRoot); if (pRoot == NULL) return; POSITION ps = m_wndObjList.GetHeadPosition(pRoot); CTreeItem* pChild = NULL; while( ps != NULL) { pChild = m_wndObjList.GetNextChild(pRoot,ps); //获取墙体目录下的对象 GetChildIds(pChild,arIds); } AcAxDocLock lock; //先清理上次比对的临时对象 Acad::ErrorStatus es; 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); } } AcDbObjectId idMoelSpace; AcDbBlockTable* pTable = NULL; if ( Acad::eOk == acdbCurDwg()->getBlockTable(pTable,AcDb::kForRead) ) { if (Acad::eOk == pTable->getAt(ACDB_MODEL_SPACE,idMoelSpace)) { } pTable->close(); } AcDbEntity* pEnt = NULL; AcDbIdMapping pIdMap; Adesk::Int16 nVal = acdbCurDwg()->useri4(); acdbCurDwg()->setUseri4(KEY_NOPROTECT); if(Acad::eOk == acdbCurDwg()->deepCloneObjects(arIds,idMoelSpace,pIdMap)) { //不需要删除已经添加的,保留 /*for (int i = 0;i < arIds.length();i++) { if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,arIds.at(i),AcDb::kForWrite)) { pEnt->erase(); pEnt->close(); } } //m_wndObjList.DeleteAll(); //m_mapNoToItem.RemoveAll();*/ } acdbCurDwg()->setUseri4(nVal); //SHacedCommand(RTSTR, _T("ZOOM"), RTSTR, _T("E"), RTNONE); acedPostCommand(_T("zoom e ")); } int CJSTZDlg::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); } //门窗 AecDbXOpening *pOpening1 = AecDbXOpening::cast(pEnt); AecDbXOpening *pOpening2 = AecDbXOpening::cast(pEntT); if (pOpening1 != NULL && pOpening2 != NULL) { nEqu = pOpening1->ComparedTo(pOpening2); } //梁 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 CJSTZDlg::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 ( 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不同的构件在列表中以红色显示!")); } } //替换图中构件 void CJSTZDlg::OnBnClickedButton4() { int nRes = AfxMessageBox(_T("确认要替换吗?"),MB_YESNO); if (nRes == IDNO) { return; } bool bNeedCompare = false; AcAxDocLock lock; AcDbObjectId id; CString sHandle; CString sDxf,sNo,sNoT; //先清理上次比对的临时对象 Acad::ErrorStatus es; 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); AcDbObjectIdArray arAssIds; 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); } AecDbBDPipeBase *pBDP = AecDbBDPipeBase::cast(pEnt); if (pBDP != NULL) { pBDP->GetAssocHandleObjs(arAssIds); } pEnt->close(); } //2.找到图中对应的 bool bFind = false; AcDbEntity *pEntT = NULL; AcDbObjectId idT; 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); 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 idMap; idMap.setDestDb(acdbCurDwg()); Adesk::Int16 nVal = acdbCurDwg()->useri4(); acdbCurDwg()->setUseri4(KEY_NOPROTECT);//NO编码保护唯一 if(Acad::eOk == acdbCurDwg()->deepCloneObjects(arIds,idMoelSpace, idMap)) { bNeedCompare = true; //3.1删除协同区的源对象 不用删除2023-6-1 bool bEraseCob = false; /*if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite)) { pEnt->erase(); pEnt->close(); bEraseCob = true; }*/ //2.2删除图中的目标 if (Acad::eOk == acdbOpenAcDbEntity(pEntT, idT, AcDb::kForWrite)) { pEntT->erase(); pEntT->close(); } //3.2删除协同区的列表记录 if (bEraseCob) { m_wndObjList.DeleteItemEx(pItem,nSel); m_mapNoToItem.RemoveKey(sNo); } } acdbCurDwg()->setUseri4(nVal); } } } } } if (bNeedCompare) { OnBnClickedButton3(); } } //新增到图中 void CJSTZDlg::OnBnClickedButton6() { AcAxDocLock lock; AcDbObjectId id; CString sHandle; 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)) { pEnt->close(); } AcDbObjectId idMoelSpace; AcDbBlockTable* pTable = NULL; if ( Acad::eOk == acdbCurDwg()->getBlockTable(pTable,AcDb::kForRead) ) { if (Acad::eOk == pTable->getAt(ACDB_MODEL_SPACE,idMoelSpace)) { } pTable->close(); } AcDbObjectIdArray arIds; arIds.append(id); AcDbIdMapping pIdMap; Adesk::Int16 nVal = acdbCurDwg()->useri4(); acdbCurDwg()->setUseri4(KEY_NOPROTECT); if(Acad::eOk == acdbCurDwg()->deepCloneObjects(arIds,idMoelSpace,pIdMap)) { /*不需要删除协同区的新增 if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)) { pEnt->erase(); pEnt->close(); }*/ //m_wndObjList.DeleteItemEx(pItem,nSel); } //添加后,新增颜色消除 pInf->SetSubItemText(2,_T("相同"),RGB(255,255,255)); m_wndObjList.Invalidate(); m_wndObjList.RedrawWindow(); acdbCurDwg()->setUseri4(nVal); } } } } //SHacedCommand(RTSTR, _T("ZOOM"), RTSTR, _T("E"), RTNONE); acedPostCommand(_T("zoom e ")); } void CJSTZDlg::OnBnClickedButton7() { POSITION ps = m_wndMsgList.GetFirstSelectedItemPosition(); if (ps != NULL) { int nItem = m_wndMsgList.GetNextSelectedItem(ps); if (nItem != -1) { CString sGUID = m_wndMsgList.GetItemText(nItem,8); CString sSQL; sSQL.Format(_T("delete from AEC_Co_Msg where guid='%s'"),sGUID); if ( m_pMySQLDb != NULL) { if ( m_pMySQLDb->ExecuteSQL(sSQL) ) { m_wndMsgList.DeleteItem(nItem); nItem -= 1; if (nItem < m_wndMsgList.GetItemCount()) { m_wndMsgList.SetItemState(nItem,LVIS_SELECTED,LVIS_SELECTED); } } } } } } LRESULT CJSTZDlg::OnItemSelected(WPARAM wp,LPARAM lp) { HWND hWnd = (HWND)wp; if (hWnd != m_wndObjList.m_hWnd) return 0L; CPoint* pptPos = (CPoint*)lp; int nSel = (int)pptPos->x; int nSubItem = (int)pptPos->y; CString sHandle; COLORREF crRed = RGB(255,0,0); 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; } COLORREF crColor = pInf->GetBkColor(2); AcAxDocLock lock; CString sNo,sDxf; AcDbHandle hd((const TCHAR*)sHandle); AcDbObjectId id; Acad::ErrorStatus es; Adesk::Int16 nVal1 = acdbCurDwg()->useri4(); acdbCurDwg()->setUseri4(KEY_NOPROTECT); Adesk::Int16 nVal2 = acdbCurDwg()->useri4(); if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) ) { //按照编号找到对应的实体,加亮选择 AcDbEntity* pEnt = NULL; if ( Acad::eOk == (es = 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); } AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEnt); if (pPart != NULL) { pPart->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); } AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEntT); if (pPart != NULL) { pPart->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo2); } pEntT->close(); } if (sNo2.CompareNoCase(sNo) == 0) { bFind = TRUE; break; } } acedSSFree(ss); UnColorLightThisPick(); m_bZObj = FALSE; m_bTObj = FALSE; m_idZObjSrc.setNull(); if (bFind) { //加入选择集 ads_name ssPick; acdbGetAdsName(ent, idT); acedSSAdd(ent, NULL, ssPick); acedSSSetFirst(ssPick, ssPick); acedSSFree(ssPick); //如果不同 //if (crColor == RGB(255,0,0)) { //同时显示不同的构件 m_idZObjSrc = id; } m_arLastPick.append(idT); ColorLightThisPick(); acedUpdateDisplay(); acedPostCommand(_T("regen ")); } //TCHAR szT[17]; //idT.handle().getIntoAsciiBuffer(szT); //acutPrintf(_T("\nThis%s Cob:%s"), szT,sHandle); ShowCompareWnd(bFind,id,idT); m_bZObj = FALSE; m_bTObj = TRUE; UpdateData(FALSE); } } } acdbCurDwg()->setUseri4(nVal1); } } return 0L; } CString GetBeamShap(int nShape) { switch(nShape) { case 0://矩形 { return _T("矩形"); break; } case 1://圆形 { return _T("圆形"); break; } case 2://正六边形 { return _T("正六边形"); break; } case 3://工字形 { return _T("工字形"); break; } case 4://槽钢 { return _T("槽钢"); break; } case 5://梯形 { return _T("梯形"); break; } default: break; } return _T(""); } void CJSTZDlg::ShowCompareWnd(BOOL bFind,AcDbObjectId& idCob,AcDbObjectId& idDoc) { m_wndProperList.DeleteAll(); if (bFind) { AcDbEntity* pEntCob = NULL; AcDbEntity* pEntDoc = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEntCob,idCob,AcDb::kForRead)) { if ( Acad::eOk == acdbOpenAcDbEntity(pEntDoc,idDoc,AcDb::kForRead)) { AecDbXWall* pWallCob = AecDbXWall::cast(pEntCob); AecDbXWall* pWallDoc = AecDbXWall::cast(pEntDoc); //比较墙体 if (pWallCob != NULL && pWallDoc != NULL) { WallData dataCob,dataDoc; pWallCob->GetWallData(dataCob); pWallDoc->GetWallData(dataDoc); AecDbObjXDataMap map1,map2; map1.SetAt(_T("墙厚"),dataCob.dThick); map2.SetAt(_T("墙厚"),dataDoc.dThick); map1.SetAt(_T("墙高"),dataCob.dH); map2.SetAt(_T("墙高"),dataDoc.dH); map1.SetAt(_T("底标高"),dataCob.dBomEl); map2.SetAt(_T("底标高"),dataDoc.dBomEl); if (dataCob.nSecShape == eWw && dataDoc.nSecShape == eWw) { map1.SetAt(_T("墩墙厚"),dataCob.dThick2); map2.SetAt(_T("墩墙厚"),dataDoc.dThick2); map1.SetAt(_T("墩墙高"),dataCob.dH2); map2.SetAt(_T("墩墙高"),dataDoc.dH2); } AcDbLine* pLn1 = AcDbLine::cast(pWallCob->GetNativeCurve()); AcDbLine* pLn2 = AcDbLine::cast(pWallDoc->GetNativeCurve()); if (pLn1 != NULL && pLn2 != NULL) { AcGePoint3d pt1,pt2; pWallCob->getStartPoint(pt1); pWallDoc->getStartPoint(pt2); map1.SetAt(_T("起点"),pt1); map2.SetAt(_T("起点"),pt2); pWallCob->getEndPoint(pt1); pWallDoc->getEndPoint(pt2); map1.SetAt(_T("终点"),pt1); map2.SetAt(_T("终点"),pt2); } AcDbArc* pArc1 = AcDbArc::cast(pWallCob->GetNativeCurve()); AcDbArc* pArc2 = AcDbArc::cast(pWallDoc->GetNativeCurve()); if (pArc1 != NULL && pArc2 != NULL) { AcGePoint3d pt1,pt2; pt1 = pArc1->center(); pt2 = pArc2->center(); map1.SetAt(_T("圆心"),pt1); map2.SetAt(_T("圆心"),pt2); double dVal1 = 0.0,dVal2 = 0.0; dVal1 = pArc1->radius(); dVal2 = pArc2->radius(); map1.SetAt(_T("半径"),dVal1); map2.SetAt(_T("半径"),dVal2); dVal1 = pArc1->startAngle(); dVal2 = pArc2->startAngle(); map1.SetAt(_T("起始角度"),dVal1); map2.SetAt(_T("起始角度"),dVal2); dVal1 = pArc1->endAngle(); dVal2 = pArc2->endAngle(); map1.SetAt(_T("终止角度"),dVal1); map2.SetAt(_T("终止角度"),dVal2); } AcDbCircle* pCir1 = AcDbCircle::cast(pWallCob->GetNativeCurve()); AcDbCircle* pCir2 = AcDbCircle::cast(pWallDoc->GetNativeCurve()); if (pCir1 != NULL && pCir2 != NULL) { AcGePoint3d pt1,pt2; pt1 = pCir1->center(); pt2 = pCir2->center(); map1.SetAt(_T("圆心"),pt1); map2.SetAt(_T("圆心"),pt2); double dVal1 = 0.0,dVal2 = 0.0; dVal1 = pCir1->radius(); dVal2 = pCir2->radius(); map1.SetAt(_T("半径"),dVal1); map2.SetAt(_T("半径"),dVal2); } AcDbPolyline* pPl1 = AcDbPolyline::cast(pWallCob->GetNativeCurve()); AcDbPolyline* pPl2 = AcDbPolyline::cast(pWallDoc->GetNativeCurve()); if (pPl1 != NULL && pPl2 != NULL) { //... } //长度 double dLen1 = pWallCob->GetLength(); double dLen2 = pWallDoc->GetLength(); map1.SetAt(_T("长度(米)"),dLen1/1000.0); map2.SetAt(_T("长度(米)"),dLen2/1000.0); //体积 //dLen1 = pWallCob->GetVolume(); //dLen2 = pWallDoc->GetVolume(); //map1.SetAt(_T("体积(cm3)"),dLen1 / 1.e6); //map2.SetAt(_T("体积(cm3)"),dLen2 / 1.e6); //材质 CString sMat1,sMat2; pWallCob->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat1); pWallDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat2); map1.SetAt(_T("材质"),sMat1); map2.SetAt(_T("材质"),sMat2); ShowToCompareList(_T("墙体"),map1,map2); } AecDbXOpening *pOpenCob = AecDbXOpening::cast(pEntCob); AecDbXOpening *pOpenDoc = AecDbXOpening::cast(pEntDoc); if (pOpenCob != NULL && pOpenDoc != NULL) { OpeningData dataCo, dataDo; pOpenCob->GetOpeningData(dataCo); pOpenDoc->GetOpeningData(dataDo); AecDbObjXDataMap map1, map2; map1.SetAt(_T("门窗宽"), dataCo.dWidth); map2.SetAt(_T("门窗宽"), dataDo.dWidth); map1.SetAt(_T("门窗高"), dataCo.dHeight); map2.SetAt(_T("门窗高"), dataDo.dHeight); map1.SetAt(_T("门窗厚度"), dataCo.dThick); map2.SetAt(_T("门窗厚度"), dataDo.dThick); map1.SetAt(_T("相对标高"), dataCo.dBomEl); map2.SetAt(_T("相对标高"), dataDo.dBomEl); map1.SetAt(_T("二维图块"), dataCo.szBlockName2d); map2.SetAt(_T("二维图块"), dataDo.szBlockName2d); map1.SetAt(_T("三维选型"), dataCo.szBlockName3d); map2.SetAt(_T("三维选型"), dataDo.szBlockName3d); map1.SetAt(_T("名称"), dataCo.szName); map2.SetAt(_T("名称"), dataDo.szName); ShowToCompareList(_T("门窗"), map1, map2); } //比较梁 AecDbBeam* pBeamCob = AecDbBeam::cast(pEntCob); AecDbBeam* pBeamDoc = AecDbBeam::cast(pEntDoc); if (pBeamCob != NULL && pBeamDoc != NULL) { ColumnParam data1,data2; pBeamCob->GetBeamData(data1); pBeamDoc->GetBeamData(data2); AecDbObjXDataMap map1,map2; map1.SetAt(_T("长度"),data1.m_dH); map2.SetAt(_T("长度"),data2.m_dH); map1.SetAt(_T("底标高"),data1.m_dBomEl); map2.SetAt(_T("底标高"),data2.m_dBomEl); map1.SetAt(_T("偏心X"),data1.m_dXExtend); map2.SetAt(_T("偏心X"),data2.m_dXExtend); map1.SetAt(_T("偏心Y"),data1.m_dYExtend); map2.SetAt(_T("偏心Y"),data2.m_dYExtend); map1.SetAt(_T("形状"),GetBeamShap(data1.m_nShape)); map2.SetAt(_T("形状"),GetBeamShap(data2.m_nShape)); //认为shape相同 switch(data1.m_nShape) { case 0://矩形 { map1.SetAt(_T("横向"),data1.m_dXScale); map2.SetAt(_T("横向"),data2.m_dXScale); map1.SetAt(_T("纵向"),data1.m_dYScale); map2.SetAt(_T("纵向"),data2.m_dYScale); break; } case 1://圆形 { map1.SetAt(_T("直径"),data1.m_dXScale); map2.SetAt(_T("直径"),data2.m_dXScale); break; } case 2://正六边形 { map1.SetAt(_T("边长"),data1.m_dXScale); map2.SetAt(_T("边长"),data2.m_dXScale); break; } case 3://工字形 { map1.SetAt(_T("A"),data1.m_dSizes[0]); map2.SetAt(_T("A"),data2.m_dSizes[0]); map1.SetAt(_T("B"),data1.m_dSizes[1]); map2.SetAt(_T("B"),data2.m_dSizes[1]); map1.SetAt(_T("C"),data1.m_dSizes[2]); map2.SetAt(_T("C"),data2.m_dSizes[2]); map1.SetAt(_T("D"),data1.m_dSizes[3]); map2.SetAt(_T("D"),data2.m_dSizes[3]); break; } case 4://槽钢 { map1.SetAt(_T("A"),data1.m_dSizes[0]); map2.SetAt(_T("A"),data2.m_dSizes[0]); map1.SetAt(_T("B"),data1.m_dSizes[1]); map2.SetAt(_T("B"),data2.m_dSizes[1]); map1.SetAt(_T("C"),data1.m_dSizes[2]); map2.SetAt(_T("C"),data2.m_dSizes[2]); map1.SetAt(_T("D"),data1.m_dSizes[3]); map2.SetAt(_T("D"),data2.m_dSizes[3]); break; } case 5://梯形 { map1.SetAt(_T("顶宽"),data1.m_dXScale); map2.SetAt(_T("顶宽"),data2.m_dXScale); map1.SetAt(_T("底宽"),data1.m_dYScale); map2.SetAt(_T("底宽"),data2.m_dYScale); map1.SetAt(_T("高"),data1.m_dH); map2.SetAt(_T("高"),data2.m_dH); break; } default: break; } AcGePoint3d pt1,pt2; pBeamCob->getStartPoint(pt1); pBeamDoc->getStartPoint(pt2); map1.SetAt(_T("起点"),pt1); map2.SetAt(_T("起点"),pt2); pBeamCob->getEndPoint(pt1); pBeamDoc->getEndPoint(pt2); map1.SetAt(_T("终点"),pt1); map2.SetAt(_T("终点"),pt2); //长度 double dLen1 = pBeamCob->GetLength(); double dLen2 = pBeamDoc->GetLength(); map1.SetAt(_T("长度(米)"),dLen1/1000.0); map2.SetAt(_T("长度(米)"),dLen2/1000.0); //体积 //dLen1 = pBeamCob->GetVolume(); //dLen2 = pBeamDoc->GetVolume(); //map1.SetAt(_T("体积(cm3)"),dLen1 / 1.e6); //map2.SetAt(_T("体积(cm3)"),dLen2 / 1.e6); //材质 CString sMat1,sMat2; pBeamCob->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat1); pBeamDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat2); map1.SetAt(_T("材质"),sMat1); map2.SetAt(_T("材质"),sMat2); ShowToCompareList(_T("梁"),map1,map2); } //比较板 AecDbXSlab* pSlabCob = AecDbXSlab::cast(pEntCob); AecDbXSlab* pSlabDoc = AecDbXSlab::cast(pEntDoc); if (pSlabCob != NULL && pSlabDoc != NULL) { PoolData data1,data2; pSlabCob->GetBasinSlabData(data1); pSlabDoc->GetBasinSlabData(data2); AecDbObjXDataMap map1,map2; map1.SetAt(_T("厚度"),data1.m_dBomThick); map2.SetAt(_T("厚度"),data2.m_dBomThick); map1.SetAt(_T("底标高"),data1.m_dBomEl); map2.SetAt(_T("底标高"),data2.m_dBomEl); switch(data1.m_nShape) { case eRect: { map1.SetAt(_T("长度"),data1.m_dData[0]); map2.SetAt(_T("长度"),data2.m_dData[0]); map1.SetAt(_T("宽度"),data1.m_dData[1]); map2.SetAt(_T("宽度"),data2.m_dData[1]); break; } case eCircle: { map1.SetAt(_T("半径"),data1.m_dData[2]); map2.SetAt(_T("半径"),data2.m_dData[2]); break; } default: break; } //体积 //double dLen1 = pSlabCob->GetVolume(); //double dLen2 = pSlabDoc->GetVolume(); //map1.SetAt(_T("体积(cm3)"),dLen1 / 1.e6); //map2.SetAt(_T("体积(cm3)"),dLen2 / 1.e6); //材质 CString sMat1,sMat2; pSlabCob->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat1); pSlabDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat2); map1.SetAt(_T("材质"),sMat1); map2.SetAt(_T("材质"),sMat2); ShowToCompareList(_T("板"),map1,map2); } //比较柱 AecDbColumn* pColCob = AecDbColumn::cast(pEntCob); AecDbColumn* pColDoc = AecDbColumn::cast(pEntDoc); if (pColCob != NULL && pColDoc != NULL) { ColumnParam data1,data2; pColCob->GetColumnData(data1); pColDoc->GetColumnData(data2); AecDbObjXDataMap map1,map2; map1.SetAt(_T("长度"),data1.m_dH); map2.SetAt(_T("长度"),data2.m_dH); map1.SetAt(_T("底标高"),data1.m_dBomEl); map2.SetAt(_T("底标高"),data2.m_dBomEl); map1.SetAt(_T("偏心X"),data1.m_dXExtend); map2.SetAt(_T("偏心X"),data2.m_dXExtend); map1.SetAt(_T("偏心Y"),data1.m_dYExtend); map2.SetAt(_T("偏心Y"),data2.m_dYExtend); map1.SetAt(_T("形状"),GetBeamShap(data1.m_nShape)); map2.SetAt(_T("形状"),GetBeamShap(data2.m_nShape)); //认为shape相同 switch(data1.m_nShape) { case 0://矩形 { map1.SetAt(_T("横向"),data1.m_dXScale); map2.SetAt(_T("横向"),data2.m_dXScale); map1.SetAt(_T("纵向"),data1.m_dYScale); map2.SetAt(_T("纵向"),data2.m_dYScale); break; } case 1://圆形 { map1.SetAt(_T("直径"),data1.m_dXScale); map2.SetAt(_T("直径"),data2.m_dXScale); break; } case 2://正六边形 { map1.SetAt(_T("边长"),data1.m_dXScale); map2.SetAt(_T("边长"),data2.m_dXScale); break; } case 3://工字形 { map1.SetAt(_T("A"),data1.m_dSizes[0]); map2.SetAt(_T("A"),data2.m_dSizes[0]); map1.SetAt(_T("B"),data1.m_dSizes[1]); map2.SetAt(_T("B"),data2.m_dSizes[1]); map1.SetAt(_T("C"),data1.m_dSizes[2]); map2.SetAt(_T("C"),data2.m_dSizes[2]); map1.SetAt(_T("D"),data1.m_dSizes[3]); map2.SetAt(_T("D"),data2.m_dSizes[3]); break; } case 4://槽钢 { map1.SetAt(_T("A"),data1.m_dSizes[0]); map2.SetAt(_T("A"),data2.m_dSizes[0]); map1.SetAt(_T("B"),data1.m_dSizes[1]); map2.SetAt(_T("B"),data2.m_dSizes[1]); map1.SetAt(_T("C"),data1.m_dSizes[2]); map2.SetAt(_T("C"),data2.m_dSizes[2]); map1.SetAt(_T("D"),data1.m_dSizes[3]); map2.SetAt(_T("D"),data2.m_dSizes[3]); break; } case 5://梯形 { map1.SetAt(_T("顶宽"),data1.m_dXScale); map2.SetAt(_T("顶宽"),data2.m_dXScale); map1.SetAt(_T("底宽"),data1.m_dYScale); map2.SetAt(_T("底宽"),data2.m_dYScale); map1.SetAt(_T("高"),data1.m_dH); map2.SetAt(_T("高"),data2.m_dH); break; } default: break; } AcGePoint3d pt1,pt2; pColCob->getStartPoint(pt1); pColDoc->getStartPoint(pt2); map1.SetAt(_T("起点"),pt1); map2.SetAt(_T("起点"),pt2); pColCob->getEndPoint(pt1); pColDoc->getEndPoint(pt2); map1.SetAt(_T("终点"),pt1); map2.SetAt(_T("终点"),pt2); //长度 double dLen1 = pColCob->GetLength(); double dLen2 = pColDoc->GetLength(); map1.SetAt(_T("长度(米)"),dLen1/1000.0); map2.SetAt(_T("长度(米)"),dLen2/1000.0); //体积 //dLen1 = pColCob->GetVolume(); //dLen2 = pColDoc->GetVolume(); //map1.SetAt(_T("体积(cm3)"),dLen1 / 1.e6); //map2.SetAt(_T("体积(cm3)"),dLen2 / 1.e6); //材质 CString sMat1,sMat2; pColCob->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat1); pColDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat2); map1.SetAt(_T("材质"),sMat1); map2.SetAt(_T("材质"),sMat2); ShowToCompareList(_T("柱"),map1,map2); } //比较洞 AecDbX3dPartEntity* pPartCob = AecDbX3dPartEntity::cast(pEntCob); AecDbX3dPartEntity* pPartDoc = AecDbX3dPartEntity::cast(pEntDoc); if (pPartCob != NULL && pPartDoc != NULL) { CString sName = pPartCob->GetName(); if (sName.CompareNoCase(_T("开洞")) == 0) { int nShpae1 = 0; pPartCob->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("nShape"),nShpae1); int nShpae2 = 0; pPartDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("nShape"),nShpae2); AecDbObjXDataMap map1,map2; if (nShpae1 == eRect) { map1.SetAt(_T("形状"),_T("矩形")); map2.SetAt(_T("形状"),_T("矩形")); double dVal1 = 0.0,dVal2 = 0.0; pPartCob->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dL"),dVal1); pPartDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dL"),dVal2); map1.SetAt(_T("长度"),dVal1); map2.SetAt(_T("长度"),dVal2); pPartCob->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dW"),dVal1); pPartDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dW"),dVal2); map1.SetAt(_T("宽度"),dVal1); map2.SetAt(_T("宽度"),dVal2); } else if (nShpae1 == eCircle) { map1.SetAt(_T("形状"),_T("圆形")); map2.SetAt(_T("形状"),_T("圆形")); double dVal1 = 0.0,dVal2 = 0.0; pPartCob->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dRad"),dVal1); pPartDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dRad"),dVal2); map1.SetAt(_T("半径"),dVal1); map2.SetAt(_T("半径"),dVal2); } else { map1.SetAt(_T("形状"),_T("异形")); map2.SetAt(_T("形状"),_T("异形")); } AcGePoint3d ptOrg1 = pPartCob->GetOrgPoint(true); AcGePoint3d ptOrg2 = pPartDoc->GetOrgPoint(true); map1.SetAt(_T("位置"),ptOrg1); map2.SetAt(_T("位置"),ptOrg2); ShowToCompareList(_T("洞口"),map1,map2); } } //比较管线 其他专业 AecDbEwPipe* pPipeCob = AecDbEwPipe::cast(pEntCob); AecDbEwPipe* pPipeDoc = AecDbEwPipe::cast(pEntDoc); if (pPipeCob != NULL && pPipeDoc != NULL) { AecDbObjXDataMap map1,map2; double dVal1 = 0.0,dVal2 = 0.0; pPipeCob->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_DN,dVal1); pPipeDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_DN,dVal2); map1.SetAt(_T("公称直径"),dVal1); map2.SetAt(_T("公称直径"),dVal2); pPipeCob->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_OD,dVal1); pPipeDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_OD,dVal2); map1.SetAt(_T("外径"),dVal1); map2.SetAt(_T("外径"),dVal2); pPipeCob->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_THICK,dVal1); pPipeDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_THICK,dVal2); map1.SetAt(_T("壁厚"),dVal1); map2.SetAt(_T("壁厚"),dVal2); AcGePoint3d pt1,pt2; pPipeCob->getStartPoint(pt1); pPipeDoc->getStartPoint(pt2); map1.SetAt(_T("起点"),pt1); map2.SetAt(_T("起点"),pt2); map1.SetAt(_T("起点标高"),pt1.z); map2.SetAt(_T("起点标高"),pt2.z); pPipeCob->getEndPoint(pt1); pPipeDoc->getEndPoint(pt2); map1.SetAt(_T("终点"),pt1); map2.SetAt(_T("终点"),pt2); map1.SetAt(_T("终点标高"),pt1.z); map2.SetAt(_T("终点标高"),pt2.z); dVal1 = pPipeCob->GetLength(); dVal2 = pPipeDoc->GetLength(); map1.SetAt(_T("长度(米)"),dVal1/1000.0); map2.SetAt(_T("长度(米)"),dVal2/1000.0); //材质 CString sMat1,sMat2; pPipeCob->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat1); pPipeDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat2); map1.SetAt(_T("材质"),sMat1); map2.SetAt(_T("材质"),sMat2); ShowToCompareList(_T("管子"),map1,map2); } AecDbEwFitting* pEWFitCob = AecDbEwFitting::cast(pEntCob); AecDbEwFitting* pEWFitDoc = AecDbEwFitting::cast(pEntDoc); if (pEWFitCob != NULL && pEWFitDoc != NULL) { AecDbObjXDataMap map1,map2; double dVal1 = 0.0,dVal2 = 0.0; pEWFitCob->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_DN,dVal1); pEWFitDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_DN,dVal2); map1.SetAt(_T("公称直径"),dVal1); map2.SetAt(_T("公称直径"),dVal2); pEWFitCob->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_OD,dVal1); pEWFitDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_OD,dVal2); map1.SetAt(_T("外径"),dVal1); map2.SetAt(_T("外径"),dVal2); pEWFitCob->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_THICK,dVal1); pEWFitDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(PIPE_THICK,dVal2); map1.SetAt(_T("壁厚"),dVal1); map2.SetAt(_T("壁厚"),dVal2); //材质 CString sMat1,sMat2; pEWFitCob->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat1); pEWFitDoc->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_MATERIAL,sMat2); map1.SetAt(_T("材质"),sMat1); map2.SetAt(_T("材质"),sMat2); ShowToCompareList(_T("管件"),map1,map2); } //风管 AecDbHvacDuct* pHPipeCob = AecDbHvacDuct::cast(pEntCob); AecDbHvacDuct* pHPipeDoc = AecDbHvacDuct::cast(pEntDoc); if (pHPipeCob != NULL && pHPipeDoc != NULL) { AecDbObjXDataMap map1,map2; AecHvac::DuctParam dp1; pHPipeCob->GetDuctParam(dp1); AecHvac::DuctParam dp2; pHPipeCob->GetDuctParam(dp2); map1.SetAt(_T("宽或直径"),dp1.dSize[0]); map2.SetAt(_T("宽或直径"),dp2.dSize[0]); map1.SetAt(_T("高或直径"),dp1.dSize[1]); map2.SetAt(_T("高或直径"),dp2.dSize[1]); map1.SetAt(_T("厚度"),dp1.dSize[2]); map2.SetAt(_T("厚度"),dp2.dSize[2]); map1.SetAt(_T("标高"),dp1.m_dEl); map2.SetAt(_T("标高"),dp2.m_dEl); ShowToCompareList(_T("风管"),map1,map2); } AecDbHvacFitting* pHFitCob = AecDbHvacFitting::cast(pEntCob); AecDbHvacFitting* pHFitDoc = AecDbHvacFitting::cast(pEntDoc); if (pHFitCob != NULL && pHFitDoc != NULL) { AecDbObjXDataMap map1,map2; AecHvac::DuctParam dp1; pHFitCob->GetDuctParam(dp1); AecHvac::DuctParam dp2; pHFitDoc->GetDuctParam(dp2); map1.SetAt(_T("宽或直径"),dp1.dSize[0]); map2.SetAt(_T("宽或直径"),dp2.dSize[0]); map1.SetAt(_T("高或直径"),dp1.dSize[1]); map2.SetAt(_T("高或直径"),dp2.dSize[1]); map1.SetAt(_T("厚度"),dp1.dSize[2]); map2.SetAt(_T("厚度"),dp2.dSize[2]); map1.SetAt(_T("标高"),dp1.m_dEl); map2.SetAt(_T("标高"),dp2.m_dEl); ShowToCompareList(_T("风管件"),map1,map2); } //桥架 AecDbECableTray* pECCob = AecDbECableTray::cast(pEntCob); AecDbECableTray* pECDoc = AecDbECableTray::cast(pEntDoc); if (pECCob != NULL && pECDoc != NULL) { AecDbObjXDataMap map1,map2; AecHvac::DuctParam dp1; pECCob->GetDuctParam(dp1); AecHvac::DuctParam dp2; pECDoc->GetDuctParam(dp2); map1.SetAt(_T("宽"),dp1.dSize[0]); map2.SetAt(_T("宽"),dp2.dSize[0]); map1.SetAt(_T("高"),dp1.dSize[1]); map2.SetAt(_T("高"),dp2.dSize[1]); map1.SetAt(_T("厚度"),dp1.dSize[2]); map2.SetAt(_T("厚度"),dp2.dSize[2]); map1.SetAt(_T("标高"),dp1.m_dEl); map2.SetAt(_T("标高"),dp2.m_dEl); ShowToCompareList(_T("桥架"),map1,map2); } AecDbEcFitting* pECFitCob = AecDbEcFitting::cast(pEntCob); AecDbEcFitting* pECFitDoc = AecDbEcFitting::cast(pEntDoc); if (pECFitCob != NULL && pECFitDoc != NULL) { AecDbObjXDataMap map1,map2; AecHvac::DuctParam dp1; pECFitCob->GetDuctParam(dp1); AecHvac::DuctParam dp2; pECFitDoc->GetDuctParam(dp2); map1.SetAt(_T("宽"),dp1.dSize[0]); map2.SetAt(_T("宽"),dp2.dSize[0]); map1.SetAt(_T("高"),dp1.dSize[1]); map2.SetAt(_T("高"),dp2.dSize[1]); map1.SetAt(_T("厚度"),dp1.dSize[2]); map2.SetAt(_T("厚度"),dp2.dSize[2]); map1.SetAt(_T("标高"),dp1.m_dEl); map2.SetAt(_T("标高"),dp2.m_dEl); ShowToCompareList(_T("桥架件"),map1,map2); } //... pEntDoc->close(); } pEntCob->close(); } } } void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObjXDataMap& map2) { m_mapPNameToRoot.RemoveAll(); m_wndProperList.DeleteAll(); CItemInfo* lpRoot = new CItemInfo(); lpRoot->SetImage(1); lpRoot->SetItemText(pszName); lpRoot->AddSubItemText(""); lpRoot->AddSubItemText(""); lpRoot->AddSubItemText(""); lpRoot->AddSubItemText(""); CTreeItem * pRoot = m_wndProperList.InsertRootItem(lpRoot); m_mapPNameToRoot.SetAt(pszName,pRoot); int nVt = 0; CString sVal1,sVal2,sKey; AecXData xdata1,xdata2; for (AecDbObjXDataMap::It it = map1.Begin();it != map1.End(); ) { LPCTSTR pszKey = (const TCHAR *)((*it).first); if ( !map1.GetNext(it,sKey,xdata1) ) { break; } map2.GetAt(pszKey,xdata2); nVt = xdata1.nVt; switch (nVt) { case VT_I4: // 整型 sVal1.Format(_T("%d"),(int)xdata1.nVal); sVal2.Format(_T("%d"),(int)xdata2.nVal); break; case VT_UI4: //s id #ifndef _WIN64 sVal1.Format(_T("%ld"),xdata1.nVal); sVal2.Format(_T("%ld"),xdata2.nVal); #else sVal1.Format(_T("%d"),xdata1.nVal); sVal2.Format(_T("%d"),xdata2.nVal); #endif break; case VT_UI8: //h id #ifndef _WIN64 sVal1.Format(_T("%ld"),xdata1.nVal); sVal2.Format(_T("%ld"),xdata2.nVal); #else sVal1.Format(_T("%d"),xdata1.nVal); sVal2.Format(_T("%d"),xdata2.nVal); #endif break; case VT_R8: // 浮点 sVal1.Format(_T("%.3f"),xdata1.dVal[0]); sVal2.Format(_T("%.3f"),xdata2.dVal[0]); break; case (VT_BYREF | VT_R8): // 点 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; case (VT_BYREF | VT_R8 + 1): // cad变化点 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; case (VT_BYREF | VT_R8 + 2): // 向量 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; case (VT_BYREF | VT_R8 + 3): // 变化向量 sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]); sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]); break; case (VT_BYREF | VT_R8 + 4): // 矩阵 sVal1.Format(_T("%s"),xdata1.pszVal); sVal2.Format(_T("%s"),xdata2.pszVal); break; case (VT_BYREF | VT_R8 + 5): // binarydata break; case VT_BSTR: // 字符串 sVal1.Format(_T("%s"),xdata1.pszVal); sVal2.Format(_T("%s"),xdata2.pszVal); break; default: break; } if (pszKey != NULL) { COLORREF crColor = RGB(255,255,255); if (sVal1.CompareNoCase(sVal2) != 0) { crColor = RGB(255,0,0); } CItemInfo* lpParent = new CItemInfo(); lpParent->SetItemText(_T("")); lpParent->AddSubItemText(pszKey); if (sVal1.CompareNoCase(sVal2) != 0) { lpParent->AddSubItemText(sVal1,crColor); } else { lpParent->AddSubItemText(sVal1); } lpParent->AddSubItemText(pszKey); if (sVal1.CompareNoCase(sVal2) != 0) { lpParent->AddSubItemText(sVal2,crColor); } else { lpParent->AddSubItemText(sVal2); } CTreeItem * pParent = m_wndProperList.InsertItem(pRoot,lpParent); } } int nScroll = 0; m_wndProperList.ExpandAll(pRoot,nScroll); } void CJSTZDlg::UnColorLightThisPick() { AcDbObjectId idT; AcDbEntity* pEntT = NULL; for (int i = 0;i < m_arLastPick.length();i++) { idT = m_arLastPick.at(i); if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForWrite)) { AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT); if (pEntBase != NULL) { pEntBase->SetActive(false); } AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT); if (pCurBase != NULL) { pCurBase->SetActive(false); } pEntT->close(); } } m_idZObjSrc.setNull(); m_arLastPick.removeAll(); } void CJSTZDlg::ColorLightThisPick() { AcDbObjectId idT; AcDbEntity* pEntT = NULL; for (int i = 0;i < m_arLastPick.length();i++) { idT = m_arLastPick.at(i); if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForWrite)) { AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT); if (pEntBase != NULL) { pEntBase->SetActive(true); } AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT); if (pCurBase != NULL) { pCurBase->SetActive(true); } pEntT->close(); } } } void CJSTZDlg::OnDestroy() { CDialog::OnDestroy(); } void CJSTZDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == ID_TIMEQUERY) { CStringArray arIPs,arVals; GetLocalIP(arIPs); CString sSQL,sIP,sRem,sMsg,sName; for (int i = 0;i < arIPs.GetSize();i++) { sIP = arIPs.GetAt(i); sSQL.Format(_T("select NameFr,IPTo,Rem from AEC_Co_Msg where pickup=0 and IPTo='%s'"),sIP); if (m_pMySQLDb != NULL) { arVals.RemoveAll(); m_pMySQLDb->GetSelData(sSQL,arVals); if (arVals.GetSize() >= 3) { sName = arVals.GetAt(0); sRem = arVals.GetAt(2); sMsg.Format(_T("您有新的[%s]发送的提资消息!\n提资说明:\n%s"),sName,sRem); ShowWindow(SW_SHOW); KillTimer(ID_TIMEQUERY); AfxMessageBox(sMsg); ShowMsgList(); //然后设置pickup状态 CString sSQL; sSQL.Format(_T("update AEC_Co_Msg set pickup=1 where IPTo='%s'"),sIP); m_pMySQLDb->ExecuteSQL(sSQL); SetTimer(ID_TIMEQUERY,60000,NULL); break; } } } } CDialog::OnTimer(nIDEvent); } void CJSTZDlg::OnBnClickedButton8() { ShowMsgList(); } //区中构件 void CJSTZDlg::OnBnClickedCheck2() { UpdateData(TRUE); bool bRef = false; AcAxDocLock lock; AcDbEntity* pEntTCln = NULL; AcDbEntity* pEntT = NULL; Acad::ErrorStatus es; if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,m_idZObjSrc,AcDb::kForRead)) { pEntTCln = (AcDbEntity*)pEntT->clone(); pEntT->close(); AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntTCln); if (pEntBase != NULL) { pEntBase->SetActive(true); pEntBase->GetSpecialtyData(AcDb::kForWrite)->SetAt(KEY_NO,_T("*")); pEntBase->GetSpecialtyData(AcDb::kForWrite)->SetAt(KEY_ACTIVECR,kRed); } AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntTCln); if (pCurBase != NULL) { pCurBase->SetActive(true); pCurBase->GetSpecialtyData(AcDb::kForWrite)->SetAt(KEY_NO,_T("*")); pCurBase->GetSpecialtyData(AcDb::kForWrite)->SetAt(KEY_ACTIVECR,kRed); } if (m_bZObj) { 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); } } AddToModelSpace(pEntTCln,NULL,false); m_idZObj = pEntTCln->objectId(); pEntTCln->close(); } else { delete pEntTCln; } bRef = true; } if (!m_bZObj) { if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,m_idZObj,AcDb::kForWrite)) { pEntT->erase(); pEntT->close(); bRef = true; m_idZObj.setNull(); } } if (bRef) { acedUpdateDisplay(); acedPostCommand(_T("regen ")); } } void CJSTZDlg::OnBnClickedCheck3() { UpdateData(TRUE); bool bRef = false; if (!m_arLastPick.isEmpty()) { AcAxDocLock lock; AcDbEntity* pEntT = NULL; for (int i = 0;i < m_arLastPick.length();i++) { if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,m_arLastPick.at(i),AcDb::kForWrite)) { pEntT->setVisibility(m_bTObj ? AcDb::kVisible : AcDb::kInvisible); pEntT->close(); bRef = true; } } } if (bRef) { acedUpdateDisplay(); acedPostCommand(_T("regen ")); } } HBRUSH CJSTZDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_NEW) { CRect rc; pWnd->GetClientRect(rc); pDC->FillSolidRect(rc,RGB(0,255,0)); } if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_STATIC_DIFF) { CRect rc; pWnd->GetClientRect(rc); pDC->FillSolidRect(rc,RGB(255,0,0)); } } return hbr; } void CJSTZDlg::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_wndStaicYSplit.m_hWnd)) { m_wndStaicYSplit.GetWindowRect(&rect); ScreenToClient(&rect); rect.right = rc.right - m_nSpaceX; m_wndStaicYSplit.MoveWindow(rect); } if (::IsWindow(m_wndProperList.m_hWnd)) { m_wndProperList.GetWindowRect(&rect); ScreenToClient(&rect); rect.right = rc.right - m_nSpaceX; rect.bottom = rc.bottom - m_nSpacePropY; m_wndProperList.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_wndBt5.m_hWnd) && ::IsWindow(m_wndBt6.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_wndBt5.GetWindowRect(&rect); ScreenToClient(&rect); nH = rect.Height(); rect.bottom = rc.bottom - m_nSpaceY; rect.top = rect.bottom - nH; m_wndBt5.MoveWindow(rect); m_wndBt6.GetWindowRect(&rect); ScreenToClient(&rect); nH = rect.Height(); rect.bottom = rc.bottom - m_nSpaceY; rect.top = rect.bottom - nH; m_wndBt6.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); } if ( ::IsWindow(m_wndStaDif.m_hWnd) && ::IsWindow(m_wndStaDifT.m_hWnd) && ::IsWindow(m_wndStaNew.m_hWnd) && ::IsWindow(m_wndStaNewT.m_hWnd) ) { m_wndStaDif.GetWindowRect(&rect); ScreenToClient(&rect); nH = rect.Height(); rect.bottom = rc.bottom - m_nSpaceY; rect.top = rect.bottom - nH; m_wndStaDif.MoveWindow(rect); m_wndStaDifT.GetWindowRect(&rect); ScreenToClient(&rect); nH = rect.Height(); rect.bottom = rc.bottom - m_nSpaceY; rect.top = rect.bottom - nH; m_wndStaDifT.MoveWindow(rect); m_wndStaNew.GetWindowRect(&rect); ScreenToClient(&rect); nH = rect.Height(); rect.bottom = rc.bottom - m_nSpaceY; rect.top = rect.bottom - nH; m_wndStaNew.MoveWindow(rect); m_wndStaNewT.GetWindowRect(&rect); ScreenToClient(&rect); nH = rect.Height(); rect.bottom = rc.bottom - m_nSpaceY; rect.top = rect.bottom - nH; m_wndStaNewT.MoveWindow(rect); } if (::IsWindow(m_wndStaicYSplit.m_hWnd)) { m_wndStaicYSplit.GetWindowRect(&rect); ScreenToClient(&rect); nH = rect.Height(); nW = rect.Width(); rect.right = rc.right - m_nSpaceX; rect.left = rect.right - nW; rect.bottom = rc.bottom - m_nSpacePropY; rect.top = rect.bottom - nH; m_wndStaicYSplit.MoveWindow(rect); } } void CJSTZDlg::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); }