202 lines
4.9 KiB
C++
202 lines
4.9 KiB
C++
#include "stdafx.h"
|
|
#include "TDbInterfaceMsgWrite.h"
|
|
#include "TDbInterfaceMsgObj.h"
|
|
#include "TDbMakeObjAssocReactor.h"
|
|
#include "TInterfaceModifyMsgContext.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
extern TDbMakeObjAssocReactor* g_pObjAssocReactor;
|
|
extern TInterfaceModifyMsgContext g_iMsgContext;
|
|
extern TDbXDataMap g_mapClass2Cmd;
|
|
|
|
TDbInterfaceMsgWrite::TDbInterfaceMsgWrite()
|
|
{
|
|
if (g_pObjAssocReactor != NULL)
|
|
acdbCurDwg()->removeReactor(g_pObjAssocReactor);
|
|
}
|
|
|
|
|
|
TDbInterfaceMsgWrite::~TDbInterfaceMsgWrite()
|
|
{
|
|
if (g_pObjAssocReactor != NULL)
|
|
acdbCurDwg()->addReactor(g_pObjAssocReactor);
|
|
}
|
|
|
|
BOOL TDbInterfaceMsgWrite::WriteInterfaceMsg(const TInterfaceModifyMsg& iModifyMsg)
|
|
{
|
|
/*
|
|
在有对象更改时,写入消息到全局数据对象; 启动一个命令开始时清空数据
|
|
*/
|
|
//对大数量的试题操作处理优化标记,不需要写入消息
|
|
int nMaxSetForOp = 0;
|
|
g_mapClass2Cmd.GetAt(KEY_MAX_SET_FOROP,nMaxSetForOp);
|
|
if (nMaxSetForOp == 2) //优化批量处理interfacerecord 的 update消息
|
|
{
|
|
AcDbObjectIdArray arSet;
|
|
acedGetCurrentSelectionSet(arSet);
|
|
|
|
// mcl changed. 优化处理时,要更新遮挡
|
|
// if (arSet.length() > MAX_SET_FOROP)
|
|
|
|
if (arSet.length() > MAX_SET_FOROP && iModifyMsg.GetInterfaceOper() != TDb::eUpdateCover)
|
|
return FALSE;
|
|
else
|
|
g_mapClass2Cmd.SetAt(KEY_MAX_SET_FOROP, 0);
|
|
}
|
|
|
|
CPtrArray* pArray = NULL;
|
|
if (g_iMsgContext.m_mapDb2TIMsgs.Lookup(acdbCurDwg(),(void*&)pArray))
|
|
{
|
|
TDbInterfaceMsgObj* pMsgObj = new TDbInterfaceMsgObj;
|
|
pMsgObj->SetModifyMsg(iModifyMsg);
|
|
pArray->Add(pMsgObj);
|
|
}
|
|
else
|
|
{
|
|
pArray = new CPtrArray;
|
|
TDbInterfaceMsgObj* pMsgObj = new TDbInterfaceMsgObj;
|
|
pMsgObj->SetModifyMsg(iModifyMsg);
|
|
pArray->Add(pMsgObj);
|
|
g_iMsgContext.m_mapDb2TIMsgs.SetAt(acdbCurDwg(),pArray);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL TDbInterfaceMsgWrite::ReadInterfaceMsgs(TInterfaceModifyMsgs& msgs)
|
|
{
|
|
/*
|
|
命令反应器,等需要从数据库的命名字典读取消息更改集
|
|
*/
|
|
CPtrArray* pArray = NULL;
|
|
if (g_iMsgContext.m_mapDb2TIMsgs.Lookup(acdbCurDwg(),(void*&)pArray))
|
|
{
|
|
TDbInterfaceMsgObj* pMsgObj = NULL;
|
|
TInterfaceModifyMsg msg;
|
|
|
|
for (int i = 0;i < pArray->GetSize();i++)
|
|
{
|
|
pMsgObj = (TDbInterfaceMsgObj*)pArray->GetAt(i);
|
|
pMsgObj->GetModifyMsg(msg);
|
|
msgs.append(msg);
|
|
delete pMsgObj;
|
|
}
|
|
pArray->RemoveAll();
|
|
}
|
|
return msgs.length() > 0;
|
|
}
|
|
|
|
BOOL TDbInterfaceMsgWrite::WriteUpdateIntfMsg(const TInterfaceModifyMsg& iModifyMsg)
|
|
{
|
|
/*
|
|
在有对象更改时,写入消息到全局数据对象; 启动一个命令开始时清空数据
|
|
*/
|
|
//对大数量的试题操作处理优化标记,不需要写入消息
|
|
int nMaxSetForOp = 0;
|
|
g_mapClass2Cmd.GetAt(KEY_MAX_SET_FOROP,nMaxSetForOp);
|
|
if (nMaxSetForOp == 2) //优化批量处理interfacerecord 的 update消息
|
|
{
|
|
AcDbObjectIdArray arSet;
|
|
acedGetCurrentSelectionSet(arSet);
|
|
if (arSet.length() > MAX_SET_FOROP)
|
|
return FALSE;
|
|
else
|
|
g_mapClass2Cmd.SetAt(KEY_MAX_SET_FOROP, 0);
|
|
}
|
|
|
|
CPtrArray* pArray = NULL;
|
|
if (g_iMsgContext.m_mapDb2TUMsgs.Lookup(acdbCurDwg(),(void*&)pArray))
|
|
{
|
|
TDbInterfaceMsgObj* pMsgObj = new TDbInterfaceMsgObj;
|
|
pMsgObj->SetModifyMsg(iModifyMsg);
|
|
pArray->Add(pMsgObj);
|
|
}
|
|
else
|
|
{
|
|
pArray = new CPtrArray;
|
|
TDbInterfaceMsgObj* pMsgObj = new TDbInterfaceMsgObj;
|
|
pMsgObj->SetModifyMsg(iModifyMsg);
|
|
pArray->Add(pMsgObj);
|
|
g_iMsgContext.m_mapDb2TUMsgs.SetAt(acdbCurDwg(),pArray);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL TDbInterfaceMsgWrite::ReadUpdateIntfMsgs(TInterfaceModifyMsgs& msgs)
|
|
{
|
|
/*
|
|
命令反应器,等需要从数据库的命名字典读取消息更改集
|
|
*/
|
|
CPtrArray* pArray = NULL;
|
|
if (g_iMsgContext.m_mapDb2TUMsgs.Lookup(acdbCurDwg(),(void*&)pArray))
|
|
{
|
|
TDbInterfaceMsgObj* pMsgObj = NULL;
|
|
TInterfaceModifyMsg msg;
|
|
|
|
for (int i = 0;i < pArray->GetSize();i++)
|
|
{
|
|
pMsgObj = (TDbInterfaceMsgObj*)pArray->GetAt(i);
|
|
if (pMsgObj != NULL)
|
|
{
|
|
pMsgObj->GetModifyMsg(msg);
|
|
msgs.append(msg);
|
|
delete pMsgObj;
|
|
}
|
|
}
|
|
pArray->RemoveAll();
|
|
}
|
|
return msgs.length() > 0;
|
|
}
|
|
|
|
BOOL TDbInterfaceMsgWrite::WriteAssocMsg(const TMakeObjAssocMsg& iModifyMsg)
|
|
{
|
|
/*
|
|
在有对象更改时,写入消息到全局数据对象; 启动一个命令开始时清空数据
|
|
*/
|
|
CPtrArray* pArray = NULL;
|
|
if (g_iMsgContext.m_mapDb2TAMsgs.Lookup(acdbCurDwg(),(void*&)pArray))
|
|
{
|
|
TDbInterfaceMsgObj* pMsgObj = new TDbInterfaceMsgObj;
|
|
pMsgObj->SetAssocMsg(iModifyMsg);
|
|
pArray->Add(pMsgObj);
|
|
}
|
|
else
|
|
{
|
|
pArray = new CPtrArray;
|
|
TDbInterfaceMsgObj* pMsgObj = new TDbInterfaceMsgObj;
|
|
pMsgObj->SetAssocMsg(iModifyMsg);
|
|
pArray->Add(pMsgObj);
|
|
g_iMsgContext.m_mapDb2TAMsgs.SetAt(acdbCurDwg(),pArray);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL TDbInterfaceMsgWrite::ReadAssocMsgs(TMakeObjAssocMsgs& msgs)
|
|
{
|
|
/*
|
|
命令反应器,等需要从数据库的命名字典读取消息更改集
|
|
*/
|
|
CPtrArray* pArray = NULL;
|
|
if (g_iMsgContext.m_mapDb2TAMsgs.Lookup(acdbCurDwg(),(void*&)pArray))
|
|
{
|
|
TDbInterfaceMsgObj* pMsgObj = NULL;
|
|
TMakeObjAssocMsg msg;
|
|
|
|
for (int i = 0;i < pArray->GetSize();i++)
|
|
{
|
|
pMsgObj = (TDbInterfaceMsgObj*)pArray->GetAt(i);
|
|
if (pMsgObj != NULL)
|
|
{
|
|
pMsgObj->GetAssocMsg(msg);
|
|
msgs.append(msg);
|
|
delete pMsgObj;
|
|
}
|
|
}
|
|
pArray->RemoveAll();
|
|
}
|
|
return msgs.length() > 0;
|
|
} |