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

3171 lines
77 KiB
C++

#include "stdafx.h"
#include "StdArx.h"
#include "JSTZDlg.h"
#include "AecDbObjXDataMap.h"
#include "uiiado.h"
#include "Base64.h"
#include <string>
#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<LPTSTR>(lpszCols[i]);
m_wndObjList.InsertColumn(i,&lvColumn);
}
CList<int,int> listReadOnly;
listReadOnly.AddHead(0);
listReadOnly.AddHead(1);
listReadOnly.AddHead(2);
listReadOnly.AddHead(3);
m_wndObjList.SetReadOnlyList(listReadOnly);
}
void 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<LPTSTR>(lpszCols[i]);
m_wndProperList.InsertColumn(i,&lvColumn);
}
CList<int,int> 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);
}