1626 lines
42 KiB
C++
1626 lines
42 KiB
C++
#include "stdafx.h"
|
||
|
||
#include "TDbRelInterfaceReactor.h"
|
||
#include "TReactorUnlockSwitch.h"
|
||
#include "TDbMakeObjAssocReactor.h"
|
||
#include "TInterfaceReleationManager.h"
|
||
#include "TInterfaceModifyManager.h"
|
||
#include "TInterfaceTransformByManager.h"
|
||
#include "TInterfaceSizeReleationManger.h"
|
||
#include "TCoverReleationManager.h"
|
||
#include "TInterfaceModifyMsgContext.h"
|
||
#include "TDbPipeMatchPropertiesReactor.h"
|
||
#include "TToolKitBase.h"
|
||
#include "TDbInterfaceMsgWrite.h"
|
||
|
||
#include "actrans.h"
|
||
Adesk::Boolean acedPostCommand( const TCHAR * );
|
||
|
||
#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;
|
||
extern PickSet g_ssLastSel;
|
||
extern CString g_csLastCmd;
|
||
|
||
// #define SECTION_IGORE 80
|
||
|
||
// 常规、删除情况下:忽略更新遮挡的实体数量
|
||
#define IGOREHIDE_NORMAL 500
|
||
#define IGOREHIDE_DEL 100
|
||
|
||
TDbRelInterfaceReactor::TDbRelInterfaceReactor()
|
||
{
|
||
m_pToolKit = NULL;
|
||
m_bNestedUpdate = FALSE;
|
||
m_pMatchPropertiesReactor = new TDbPipeMatchPropertiesReactor;
|
||
|
||
//add by dyw
|
||
m_pDuctStretchReactor = new TDbDuctStretchRactor;
|
||
}
|
||
|
||
TDbRelInterfaceReactor::~TDbRelInterfaceReactor()
|
||
{
|
||
if (m_pMatchPropertiesReactor != NULL)
|
||
{
|
||
delete m_pMatchPropertiesReactor;
|
||
m_pMatchPropertiesReactor = NULL;
|
||
}
|
||
|
||
//add by dyw
|
||
if(m_pDuctStretchReactor != NULL)
|
||
{
|
||
delete m_pDuctStretchReactor;
|
||
m_pDuctStretchReactor = NULL;
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::AddToolKit(TToolKitBase* pToolKit)
|
||
{
|
||
if (m_lstToolKitPtrs.Find(pToolKit) == NULL)
|
||
{
|
||
m_lstToolKitPtrs.AddTail(pToolKit);
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::RemoveToolKit(TToolKitBase* pToolKit)
|
||
{
|
||
POSITION ps = m_lstToolKitPtrs.Find(pToolKit);
|
||
if (ps != NULL)
|
||
{
|
||
m_lstToolKitPtrs.RemoveAt(ps);
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::commandWillStart(const TCHAR* cmdStr)
|
||
{
|
||
g_mapClass2Cmd.SetAt(KEY_MAX_SET_FOROP,0);
|
||
if(_tcsicmp(cmdStr, _T("matchprop"))==0 && curDoc() != NULL)
|
||
{
|
||
m_pMatchPropertiesReactor->ResetMatchProperties();
|
||
Acad::ErrorStatus es = curDoc()->inputPointManager()->addInputContextReactor(m_pMatchPropertiesReactor);
|
||
}
|
||
|
||
if( _tcsicmp(cmdStr, _T("move"))==0 ||
|
||
_tcsicmp(cmdStr, _T("mirror")) == 0||
|
||
_tcsicmp(cmdStr, _T("copy")) == 0 ||
|
||
_tcsicmp(cmdStr, _T("copybase")) == 0 ||
|
||
_tcsicmp(cmdStr, _T("copyclip")) == 0 ||
|
||
_tcsicmp(cmdStr, _T("pasteclip")) == 0 ||
|
||
_tcsicmp(cmdStr, _T("pasteblock")) == 0 ||
|
||
_tcsicmp(cmdStr, _T("array")) == 0
|
||
)
|
||
{
|
||
g_mapClass2Cmd.SetAt(KEY_MAX_SET_FOROP,2);
|
||
}
|
||
if(0 == _tcsicmp(cmdStr, _T("tzkb")))
|
||
{
|
||
// tzkb中嵌套COPY命令 标识一下 不进行关系更新
|
||
m_bNestedUpdate = TRUE;
|
||
}
|
||
|
||
//add by dyw 2014-7-16 解决风管备注拉伸位置不正确的问题
|
||
if(0 == _tcsicmp(cmdStr, _T("STRETCH")) && curDoc() != NULL)
|
||
{
|
||
curDoc()->inputPointManager()->addInputContextReactor(m_pDuctStretchReactor);
|
||
}
|
||
//add end
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::beginDwgOpen(TCHAR* filename)
|
||
{
|
||
}
|
||
|
||
#if ADS < 17
|
||
void TDbRelInterfaceReactor::endDwgOpen(const TCHAR* filename)
|
||
{
|
||
// R15 16平台 该函数中无AcDbDatabase参数,需要查找一次
|
||
AcDbDatabase* pDb = NULL;
|
||
AcDbVoidPtrArray* pArDbs = acdbActiveDatabaseArray();
|
||
if(NULL != pArDbs)
|
||
{
|
||
TCHAR* pFileName = NULL;
|
||
// 刚打开的图纸总是在最后 反向查找比较快
|
||
for(int i = pArDbs->length() - 1; i >= 0; i--)
|
||
{
|
||
pDb = (AcDbDatabase*)pArDbs->at(i);
|
||
if(NULL != pDb)
|
||
{
|
||
if(Acad::eOk == pDb->getFilename(pFileName))
|
||
{
|
||
if(0 == _tcsicmp(filename, pFileName))
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
pDb = NULL;
|
||
}
|
||
}
|
||
}
|
||
if(NULL == pDb)
|
||
return;
|
||
#else
|
||
void TDbRelInterfaceReactor::endDwgOpen(const TCHAR* filename, AcDbDatabase* pDb)
|
||
{
|
||
#endif
|
||
//1.从数据库中读取接口记录对象
|
||
TDbInterfaceRecord* pIRec = NULL;
|
||
if (!m_mapDbToIRecPtr.Lookup(pDb,(void*&)pIRec))
|
||
{
|
||
pIRec = new TDbInterfaceRecord;
|
||
m_mapDbToIRecPtr.SetAt(pDb,pIRec);
|
||
}
|
||
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == pDb->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
TDbInterfaceRecord* pInterfaceRec2 = NULL;
|
||
if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec2,AcDb::kForRead))
|
||
{
|
||
pIRec->CopyFrom(*pInterfaceRec2);
|
||
pInterfaceRec2->close();
|
||
}
|
||
pDict->close();
|
||
}
|
||
pNamedDict->close();
|
||
}
|
||
|
||
if (g_pObjAssocReactor != NULL)
|
||
{
|
||
pDb->removeReactor(g_pObjAssocReactor);
|
||
pDb->addReactor(g_pObjAssocReactor);
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::beginSave(AcDbDatabase* pDb, const TCHAR* pIntendedName)
|
||
{
|
||
//1.把接口记录保存到数据库中
|
||
TDbInterfaceRecord* pIRec = NULL;
|
||
if (m_mapDbToIRecPtr.Lookup(pDb,(void*&)pIRec))
|
||
{
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == pDb->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
TDbInterfaceRecord* pInterfaceRec2 = NULL;
|
||
if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec2,AcDb::kForWrite))
|
||
{
|
||
pInterfaceRec2->RemoveAll();
|
||
pInterfaceRec2->CopyFrom(*pIRec);
|
||
pInterfaceRec2->close();
|
||
}
|
||
pDict->close();
|
||
}
|
||
pNamedDict->close();
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::databaseToBeDestroyed(AcDbDatabase* pDb)
|
||
{
|
||
//1.从数据库中读取接口记录对象
|
||
TDbInterfaceRecord* pIRec = NULL;
|
||
if (m_mapDbToIRecPtr.Lookup(pDb,(void*&)pIRec))
|
||
{
|
||
delete pIRec;
|
||
m_mapDbToIRecPtr.RemoveKey(pDb);
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::databaseConstructed(AcDbDatabase* pDb)
|
||
{
|
||
//1.从数据库中读取接口记录对象
|
||
TDbInterfaceRecord* pIRec = NULL;
|
||
if (!m_mapDbToIRecPtr.Lookup(pDb,(void*&)pIRec))
|
||
{
|
||
pIRec = new TDbInterfaceRecord;
|
||
m_mapDbToIRecPtr.SetAt(pDb,pIRec);
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::beginWblock(AcDbDatabase* pTo, AcDbDatabase* pFrom)
|
||
{
|
||
//1.从数据库中读取接口记录对象
|
||
// TDbInterfaceRecord* pIRec = NULL;
|
||
// if (!m_mapDbToIRecPtr.Lookup(pTo,(void*&)pIRec))
|
||
// {
|
||
// pIRec = new TDbInterfaceRecord;
|
||
// m_mapDbToIRecPtr.SetAt(pTo,pIRec);
|
||
// }
|
||
//
|
||
// if (g_pObjAssocReactor != NULL)
|
||
// {
|
||
// pTo->removeReactor(g_pObjAssocReactor);
|
||
// pTo->addReactor(g_pObjAssocReactor);
|
||
// }
|
||
|
||
//1.把接口记录保存到数据库中
|
||
TDbInterfaceRecord* pIRec = NULL;
|
||
if (m_mapDbToIRecPtr.Lookup(pFrom,(void*&)pIRec))
|
||
{
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == pFrom->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
TDbInterfaceRecord* pInterfaceRec2 = NULL;
|
||
if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec2,AcDb::kForWrite))
|
||
{
|
||
pInterfaceRec2->RemoveAll();
|
||
pInterfaceRec2->CopyFrom(*pIRec);
|
||
pInterfaceRec2->close();
|
||
}
|
||
pDict->close();
|
||
}
|
||
pNamedDict->close();
|
||
}
|
||
}
|
||
|
||
//1.从数据库中读取接口记录对象
|
||
if (!m_mapDbToIRecPtr.Lookup(pTo,(void*&)pIRec))
|
||
{
|
||
pIRec = new TDbInterfaceRecord;
|
||
m_mapDbToIRecPtr.SetAt(pTo,pIRec);
|
||
}
|
||
|
||
if (g_pObjAssocReactor != NULL)
|
||
{
|
||
pTo->removeReactor(g_pObjAssocReactor);
|
||
//这个地方注释掉,否则保存低版本出错
|
||
//acdbSaveAs2000
|
||
//pTo->addReactor(g_pObjAssocReactor);
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::endWblock(AcDbDatabase* pDb)
|
||
{
|
||
//1. 清空上下文信息
|
||
// CPtrArray* pArray = NULL;
|
||
// if (g_iMsgContext.m_mapDb2TIMsgs.Lookup((AcDbDatabase*)pDb,(void*&)pArray))
|
||
// {
|
||
// TDbInterfaceMsgObj* pMsgObj = NULL;
|
||
// TInterfaceModifyMsg msg;
|
||
//
|
||
// for (int i = 0;i < pArray->GetSize();i++)
|
||
// {
|
||
// pMsgObj = (TDbInterfaceMsgObj*)pArray->GetAt(i);
|
||
// delete pMsgObj;
|
||
// }
|
||
// pArray->RemoveAll();
|
||
// delete pArray;
|
||
// g_iMsgContext.m_mapDb2TIMsgs.RemoveKey((AcDbDatabase*)pDb);
|
||
// }
|
||
|
||
if (g_pObjAssocReactor != NULL)
|
||
{
|
||
pDb->removeReactor(g_pObjAssocReactor);
|
||
pDb->addReactor(g_pObjAssocReactor);
|
||
}
|
||
|
||
//1. 清空上下文信息
|
||
CPtrArray* pArray = NULL;
|
||
if (g_iMsgContext.m_mapDb2TIMsgs.Lookup((AcDbDatabase*)pDb,(void*&)pArray))
|
||
{
|
||
TDbInterfaceMsgObj* pMsgObj = NULL;
|
||
TInterfaceModifyMsg msg;
|
||
|
||
for (int i = 0;i < pArray->GetSize();i++)
|
||
{
|
||
pMsgObj = (TDbInterfaceMsgObj*)pArray->GetAt(i);
|
||
delete pMsgObj;
|
||
}
|
||
pArray->RemoveAll();
|
||
delete pArray;
|
||
g_iMsgContext.m_mapDb2TIMsgs.RemoveKey((AcDbDatabase*)pDb);
|
||
}
|
||
}
|
||
void TDbRelInterfaceReactor::commandEndedUser(const TCHAR* cmdStr)
|
||
{
|
||
//锁定文档
|
||
acDocManager->lockDocument(acDocManager->curDocument());
|
||
|
||
//1. 取出消息更改对象记录后清空,对象命名字典中的接口消息更改记录
|
||
TReactorUnlockSwitch<AcDbDatabase,AcDbDatabaseReactor> reactorUnlockSwitch(acdbCurDwg(),g_pObjAssocReactor);
|
||
|
||
//1.3 再处理接口更改传递消息
|
||
TInterfaceModifyMsgs msgs;
|
||
PickInterfaceModifyMsgs(msgs);
|
||
if (msgs.length() == 0)
|
||
{
|
||
acDocManager->unlockDocument(acDocManager->curDocument());
|
||
curDoc()->inputPointManager()->removeInputContextReactor(m_pMatchPropertiesReactor);
|
||
return;
|
||
}
|
||
|
||
TInterfaceTransformByManager transformByMgr;
|
||
TInterfaceReleationManager releationMgr;
|
||
TInterfaceSizeReleationManger szReleationMgr;
|
||
|
||
releationMgr.m_pToolKit = m_pToolKit;
|
||
TToolKitBase* pToolKit = NULL;
|
||
|
||
//2.通过分析消息,进入不同的消息处理
|
||
TInterfaceModifyMsg msg;
|
||
AcDbObjectIdArray ids;
|
||
|
||
//3.取出所有操作对象的实体,对于非grip 消息,当实体对于一个接口操作关联时
|
||
//3.1 关联接口如果在 ids 中,就可以不需要向关联对象发接口通知消息;
|
||
int i = 0, nFoundAt = -1, nAutoWorkOn = 0;
|
||
int nMsgLen = msgs.length();
|
||
AcDbObjectId idOperate;
|
||
for (i = 0; i < nMsgLen; i++)
|
||
{
|
||
msg = msgs.at(i);
|
||
idOperate = AcDbObjectId::kNull;
|
||
idOperate = msg.GetMsgOperateOn();
|
||
if (idOperate.isValid() && !ids.find(idOperate, nFoundAt))
|
||
{
|
||
ids.append(idOperate);
|
||
}
|
||
if (msg.GetInterfaceOper() == TDb::eAutoWorkOn)
|
||
{
|
||
nAutoWorkOn += 1;
|
||
}
|
||
}
|
||
|
||
//4.关系
|
||
int nUpdateDisp = 0,nUpdateRel = 0;
|
||
TDb::InterfaceOper iOper;
|
||
for (i = 0;i < msgs.length();i++)
|
||
{
|
||
msg = msgs.at(i);
|
||
iOper = msg.GetInterfaceOper();
|
||
switch(iOper)
|
||
{
|
||
case TDb::eMoveGripPoint: //夹点关系传递
|
||
{
|
||
releationMgr.TranslateMoveGripPointMsg(msg,ids);
|
||
break;
|
||
}
|
||
case TDb::eTransformBy: //变换关系传递
|
||
{
|
||
// 注:上华的几个特例命令内部调用copy等有问题,本处特列处理
|
||
struct resbuf rb;
|
||
acedGetVar(_T("users5"),&rb);
|
||
CString sSpecLock = rb.resval.rstring;
|
||
sSpecLock.MakeLower();
|
||
if (sSpecLock.CompareNoCase(KEY_IGNORETGCPCMD) == 0)
|
||
{
|
||
}
|
||
else
|
||
{
|
||
transformByMgr.TranslateTransformByMsg(msg,ids);
|
||
}
|
||
if (rb.restype == RTSTR && rb.resval.rstring != NULL)
|
||
acutDelString(rb.resval.rstring);
|
||
break;
|
||
}
|
||
case TDb::eSize: //尺寸关系传递
|
||
{
|
||
szReleationMgr.TranslateSizeModifyMsg(msg,ids);
|
||
break;
|
||
}
|
||
case TDb::eUpdateCover: //更新遮挡关系
|
||
{
|
||
break;
|
||
}
|
||
case TDb::eUpdateDisp: //刷新图形
|
||
{
|
||
nUpdateDisp = 1;
|
||
break;
|
||
}
|
||
case TDb::eUpdateRel: //更新关系
|
||
{
|
||
nUpdateRel += 1;
|
||
break;
|
||
}
|
||
case TDb::eAutoWorkOn:
|
||
{
|
||
// if (nAutoWorkOn <= 5) // 有同时删除多个阀门时候,所以不限制数量了
|
||
{
|
||
// 恢复操作不处理
|
||
// 竖向对齐,竖向调整的时候,关闭联动,不处理Lixl add 2012-4-13
|
||
if (_tcsicmp(cmdStr, _T("UNDO")) != 0
|
||
&& _tcsicmp(cmdStr, _T("U")) != 0
|
||
&& _tcsicmp(cmdStr, _T("SXDQ")) != 0
|
||
&& _tcsicmp(cmdStr, _T("SXTZ")) != 0
|
||
&& _tcsicmp(cmdStr, _T("SBLG")) != 0 //add by dyw 20140929 添加屏蔽设备连管命令, ucs下自动调整接口关系不正确
|
||
&& _tcsicmp(cmdStr, _T("FGHZ")) != 0) //add by dyw 20141112 添加屏蔽风管绘制命令, ucs下自动调整接口关系不正确
|
||
{
|
||
for (POSITION ps = m_lstToolKitPtrs.GetHeadPosition();ps!= NULL;)
|
||
{
|
||
pToolKit = (TToolKitBase*)m_lstToolKitPtrs.GetNext(ps);
|
||
if (pToolKit != NULL)
|
||
{
|
||
pToolKit->DispatchInterfaceMsgOut(msg);
|
||
}
|
||
}
|
||
|
||
//清空Toolkit 操作后产生的新消息
|
||
TInterfaceModifyMsgs msgs2;
|
||
PickInterfaceModifyMsgs(msgs2);
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
//5.遮挡关系更新
|
||
// mcl changed by below 。删除SECTION_IGORE(500)个以下时更新遮挡
|
||
// TCoverReleationManager coverRel;
|
||
// if (ids.length() < SECTION_IGORE)//如果选择集合太多,忽略遮挡运算
|
||
// coverRel.UpdateCoverDisplay(ids);
|
||
|
||
|
||
BOOL bSaveLastPickset(FALSE); // 是否记忆上次用户选择集
|
||
|
||
//5.遮挡关系更新
|
||
int nNum = ids.length();
|
||
if (nNum > 0)
|
||
{
|
||
// 先记录更新前所选择的实体,更新后再选择一下,为了可以不影响 选择实体时,按“P”, 获取上次选择集
|
||
AcDbObjectIdArray arOirgSelId;
|
||
acedGetCurrentSelectionSet(arOirgSelId);
|
||
|
||
if (_tcsicmp(cmdStr, _T("e")) == 0 || _tcsicmp(cmdStr, _T("erase")) == 0)
|
||
{
|
||
if (nNum < IGOREHIDE_DEL)
|
||
{
|
||
TCoverReleationManager coverRel;
|
||
coverRel.UpdateCoverDisplay(ids);
|
||
}
|
||
}
|
||
// 撤销、重做时无需更新遮挡
|
||
else if (_tcsicmp(cmdStr, _T("UNDO")) != 0 && _tcsicmp(cmdStr, _T("U")) != 0
|
||
&& _tcsicmp(cmdStr, _T("redo")) != 0 && _tcsicmp(cmdStr, _T("mredo")) != 0)
|
||
{
|
||
if (nNum < IGOREHIDE_NORMAL || _tcsicmp(cmdStr, _T("rcov")) == 0) // rcov:专门更新关系命令不限个数
|
||
{
|
||
TCoverReleationManager coverRel;
|
||
coverRel.UpdateCoverDisplay(ids);
|
||
bSaveLastPickset = TRUE;
|
||
}
|
||
}
|
||
|
||
// “自由复制”中嵌套调用copy命令,故copy不允许支持P操作,否则将导致“自由复制”出现死循环
|
||
if (_tcsicmp(cmdStr, _T("move")) != 0)
|
||
{
|
||
bSaveLastPickset = FALSE;
|
||
}
|
||
|
||
if (bSaveLastPickset)
|
||
{
|
||
g_ssLastSel.Free();
|
||
for (i = 0; i < arOirgSelId.length(); i++)
|
||
{
|
||
g_ssLastSel += arOirgSelId[i];
|
||
}
|
||
}
|
||
}
|
||
|
||
// 6. 更新关联关系,
|
||
// mcl changed by below 重做时,无须更新,否则反删除类的重做会导致新增额外接口
|
||
// if (nUpdateRel > 0)
|
||
// {
|
||
// UpdateRelInterface(ids);
|
||
// }
|
||
|
||
if (_tcsicmp(cmdStr, _T("redo")) != 0 && _tcsicmp(cmdStr, _T("mredo")) != 0 && nUpdateRel > 0)
|
||
{
|
||
UpdateRelInterface(ids);
|
||
}
|
||
|
||
// add by hh 2014.8.8 撤销时 需要更新被风管遮挡的水管
|
||
if (_tcsicmp(cmdStr, _T("UNDO")) == 0 || _tcsicmp(cmdStr, _T("U")) == 0)
|
||
{
|
||
TArchPerDocData* pData = GetCurDocData();
|
||
if(NULL != pData)
|
||
{
|
||
BOOL bUpdate = FALSE;
|
||
AcDbObjectIdArray arPipeNeedUpdate;
|
||
for(int i = 0; i < nNum; i++)
|
||
{
|
||
OPENOBJ_BEGIN(ids[i], AcDb::kForRead, TDbInterfacesObj, pPipe);
|
||
if(NULL != pPipe)
|
||
{
|
||
pPipe->GetIdsCoverByMe(arPipeNeedUpdate);
|
||
}
|
||
OPENOBJ_END();
|
||
if(!bUpdate && 0 != arPipeNeedUpdate.length())
|
||
bUpdate = TRUE;
|
||
|
||
for(int j = 0; j < arPipeNeedUpdate.length(); j++)
|
||
{
|
||
pData->AddModifiedClipped(arPipeNeedUpdate[j]);
|
||
}
|
||
arPipeNeedUpdate.setLogicalLength(0);
|
||
}
|
||
if(bUpdate)
|
||
pData->UpdateClip();
|
||
}
|
||
}
|
||
|
||
//7. 用户定义的更新关系操作,来自其他调用,修补上华复制产生的关系丢失错误
|
||
// 把需要更新的id通过写入USERS5通知tch_pipebase,处理完了后会自动清除;
|
||
struct resbuf rbUr;
|
||
acedGetVar(_T("users5"),&rbUr);
|
||
|
||
CString sUr = rbUr.resval.rstring;
|
||
sUr.MakeUpper();
|
||
if (sUr.Find(_T("UR:"),0) != -1)
|
||
{
|
||
_tcscpy(rbUr.resval.rstring,_T(""));
|
||
acedSetVar(_T("users5"),&rbUr);
|
||
|
||
//ur:123,345,567,768
|
||
ids.setLogicalLength(0);
|
||
ParasUrObjectIds(sUr,ids);
|
||
UpdateRelInterface(ids);
|
||
}
|
||
|
||
//可能的图形刷新
|
||
acTransactionManagerPtr()->enableGraphicsFlush(true);
|
||
|
||
//修改原因:
|
||
//在Acad08 平台,当实体处于 shade 命令模式时,执行explode 命令,调用 acedUpdateDisplay 出错
|
||
//lfy 2010.2.2
|
||
#if ADS>=17
|
||
if(_tcsicmp(cmdStr, _T("explode")) != 0)
|
||
{
|
||
|
||
acedUpdateDisplay();
|
||
}
|
||
#else
|
||
acedUpdateDisplay();
|
||
#endif
|
||
acTransactionManagerPtr()->flushGraphics();
|
||
acDocManager->unlockDocument(acDocManager->curDocument());
|
||
|
||
if(_tcsicmp(cmdStr, _T("matchprop"))==0 && curDoc() != NULL)
|
||
{
|
||
curDoc()->inputPointManager()->removeInputContextReactor(m_pMatchPropertiesReactor);
|
||
}
|
||
|
||
// mcl add 2011.2.12. 保证用户上次选择集没有变化
|
||
if (bSaveLastPickset)
|
||
{
|
||
g_csLastCmd = cmdStr;
|
||
PostCommand(_T("ReSelOrig\n"));
|
||
}
|
||
}
|
||
void TDbRelInterfaceReactor::commandEnded(const TCHAR* cmdStr)
|
||
{
|
||
//add by dyw 2014-7-16 清空风管拉伸命令中的选择集,卸载反应器
|
||
if(0 == _tcsicmp(cmdStr, _T("stretch")) && curDoc() != NULL)
|
||
{
|
||
m_pDuctStretchReactor->m_arrId.setLogicalLength(0);
|
||
curDoc()->inputPointManager()->removeInputContextReactor(m_pDuctStretchReactor);
|
||
}
|
||
//add end
|
||
|
||
g_csLastCmd.Empty();
|
||
|
||
// mcl add.2010.05.21 删除时优化处理接口关系
|
||
if (_tcsicmp(cmdStr, _T("e")) == 0 || _tcsicmp(cmdStr, _T("erase")) == 0)
|
||
OptimizeEraseRelInterface();
|
||
|
||
int nMaxSetForOp = 0;
|
||
g_mapClass2Cmd.GetAt(KEY_MAX_SET_FOROP,nMaxSetForOp);
|
||
if (nMaxSetForOp == 2) //优化批量处理interfacerecord 的 update消息
|
||
{
|
||
if(!m_bNestedUpdate)
|
||
OptimizeUpdateRelInterface();
|
||
g_mapClass2Cmd.SetAt(KEY_MAX_SET_FOROP,0);
|
||
}
|
||
|
||
// “上华拷贝”命令结束时 更新一下关系
|
||
if(0 == _tcsicmp(cmdStr, _T("tzkb")))
|
||
{
|
||
m_bNestedUpdate = FALSE;
|
||
OptimizeUpdateRelInterface();
|
||
}
|
||
|
||
//如果是命令的内部acedcommand 调用undo做标记,则直接返回
|
||
int nWithinUndoMark = 0;
|
||
GetGlobalContext(_T("undo"),nWithinUndoMark);
|
||
if (nWithinUndoMark)
|
||
{
|
||
curDoc()->inputPointManager()->removeInputContextReactor(m_pMatchPropertiesReactor);
|
||
return;
|
||
}
|
||
//mod liaoy 170704 此后代码放到了commandEndedUser()中
|
||
commandEndedUser(cmdStr);
|
||
//mod end
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::ParasUrObjectIds(CString& sUr,AcDbObjectIdArray& ids)
|
||
{
|
||
sUr.MakeLower();
|
||
sUr.TrimLeft();
|
||
sUr.TrimRight();
|
||
sUr.TrimLeft(_T("ur:"));
|
||
sUr.TrimRight(_T(","));
|
||
if (sUr.IsEmpty()) return;
|
||
|
||
//123,345,567,768
|
||
AcDbObjectId id;
|
||
CString sTemp;
|
||
|
||
int nIndex = -1,nStart = 0;
|
||
while(TRUE)
|
||
{
|
||
nIndex = sUr.Find(_T(","),nStart);
|
||
if (nIndex == -1)
|
||
{
|
||
if (sUr.GetLength() > 0)
|
||
{
|
||
id.setFromOldId((INT_PTR)_ttoi(sUr));
|
||
ids.append(id);
|
||
}
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
sTemp = sUr.Mid(nStart,nIndex);
|
||
id.setFromOldId((INT_PTR)_ttoi(sTemp));
|
||
ids.append(id);
|
||
|
||
sTemp = sUr.Mid(nIndex + 1);
|
||
sUr = sTemp;
|
||
}
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::UpdateRelInterface(const AcDbObjectIdArray& arIds)
|
||
{
|
||
//打开接口记录
|
||
TDbInterfaceRecord* pInterfaceRec = NULL;
|
||
|
||
// change by hh 2011-08-09 接口记录从字典移动到数据库中
|
||
BOOL bDowngrade = FALSE;
|
||
pInterfaceRec = TAuxTools::GetIntfPtrFromDB();
|
||
if(NULL == pInterfaceRec)
|
||
{
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
pNamedDict->close();
|
||
pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForWrite);
|
||
pDict->close();
|
||
}
|
||
else
|
||
{
|
||
pNamedDict->close();
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(Acad::eOk == pInterfaceRec->upgradeOpen())
|
||
{
|
||
bDowngrade = TRUE;
|
||
}
|
||
}
|
||
|
||
// 关系更新
|
||
int nRefCount = 0;
|
||
AcDbEntity* pEnt = NULL;
|
||
|
||
// mcl add.2010.05.25 加进度条
|
||
int nLen = arIds.length();
|
||
acedSetStatusBarProgressMeter(_T("管线关系处理中..."), 0, nLen);
|
||
for (int j = 0;j < nLen;j++)
|
||
{
|
||
acedSetStatusBarProgressMeterPos(j);
|
||
|
||
// 已删除的id
|
||
if (MakesureIsErased(arIds[j]))
|
||
continue;
|
||
|
||
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,arIds.at(j),AcDb::kForRead,true))
|
||
{
|
||
TDbInterfacesObj* pIObj = TDbInterfacesObj::cast(pEnt);
|
||
if (pIObj != NULL)
|
||
{
|
||
TInterface pipeInterface,pipeInterface2;
|
||
int nCount = pIObj->GetInterfaceCount();
|
||
|
||
// revert by hh 2011-05-05 修复字典中的错误接口记录
|
||
if (pInterfaceRec)
|
||
{
|
||
nRefCount = pInterfaceRec->GetObjInterfaceCount(arIds.at(j));
|
||
if (nCount != nRefCount)//实体本身的关系记录和接口记录中数量不一致
|
||
{
|
||
//删除原来的错误关系,重新注册新的关系
|
||
pInterfaceRec->Remove(arIds.at(j));
|
||
|
||
if ( !pIObj->isErased())
|
||
{
|
||
for (int i = 0;i < nCount;i++)
|
||
{
|
||
if (pIObj->GetInterface(i,pipeInterface))
|
||
{
|
||
RegisterInterface(pInterfaceRec,pipeInterface);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
for (int i = 0;i < nCount;i++)
|
||
{
|
||
pipeInterface.SetCompareRule(0);
|
||
if (pIObj->GetInterface(i,pipeInterface))
|
||
{
|
||
if ( Find(pInterfaceRec,pipeInterface) )
|
||
{
|
||
if ( MakesureIsErased(pipeInterface.GetConnectObject()) )
|
||
{
|
||
pipeInterface.SetConnectObject(AcDbObjectId::kNull);
|
||
}
|
||
else
|
||
{
|
||
//建立关联关系e
|
||
if (Acad::eOk == pIObj->upgradeOpen())
|
||
{
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
pIObj->downgradeOpen();
|
||
}
|
||
|
||
//反向关系建立
|
||
pipeInterface2.SetOwnerId(pipeInterface.GetConnectObject());
|
||
pipeInterface2.SetPosition(pipeInterface.GetPosition());
|
||
pipeInterface2.SetOutDir(-pipeInterface.GetOutDir());
|
||
pipeInterface2.SetConnectObject(pIObj->objectId());
|
||
SetInterfaceRelation(pInterfaceRec,pipeInterface2);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//没有,关系置空
|
||
pipeInterface.SetConnectObject(AcDbObjectId::kNull);
|
||
}
|
||
|
||
//1.1 没有接口则 注册接口信息
|
||
pipeInterface.SetOwnerId(pIObj->objectId());
|
||
if ( !Has(pInterfaceRec,pipeInterface))
|
||
{
|
||
//注册接口
|
||
if ( !pIObj->isErased())
|
||
{
|
||
RegisterInterface(pInterfaceRec,pipeInterface);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
acedRestoreStatusBar();
|
||
|
||
if(bDowngrade && NULL != pInterfaceRec)
|
||
pInterfaceRec->downgradeOpen();
|
||
|
||
//关闭接口记录
|
||
if (pInterfaceRec != NULL)
|
||
pInterfaceRec->close();
|
||
}
|
||
|
||
BOOL TDbRelInterfaceReactor::UpdateInterfaceRelation(TDbInterfaceRecord* pInterfaceRec,TInterface& pipeInterface,
|
||
AcGePoint3dArray& arPtsOk,int& nCount,TDbInterfacesObj* pIObj)
|
||
{
|
||
if (pInterfaceRec != NULL)
|
||
{
|
||
if (arPtsOk.length() < nCount) //有效的注册的接口,比实际的少, 说明缺接口
|
||
{
|
||
//去掉有效的接口, 从剩下的无效接口中更正
|
||
int nFoundAt = -1;
|
||
TInterfaces interfaces;
|
||
pInterfaceRec->Find(pipeInterface.GetOwnerId(),interfaces);
|
||
|
||
// 注册的接口比实体上的少,则注册一下接口
|
||
if (interfaces.length() < nCount)
|
||
{
|
||
RegisterInterface(pInterfaceRec,pipeInterface);
|
||
|
||
//注册后,寻找新的可建立的关系
|
||
if ( Find(pInterfaceRec,pipeInterface))
|
||
{
|
||
//建立关联关系
|
||
if (pIObj->isWriteEnabled())
|
||
{
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
}
|
||
else if (Acad::eOk == pIObj->upgradeOpen())
|
||
{
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
pIObj->downgradeOpen();
|
||
}
|
||
|
||
//反向关系建立
|
||
TInterface pipeInterface2;
|
||
pipeInterface2.SetOwnerId(pipeInterface.GetConnectObject());
|
||
pipeInterface2.SetPosition(pipeInterface.GetPosition());
|
||
pipeInterface2.SetOutDir(-pipeInterface.GetOutDir());
|
||
pipeInterface2.SetConnectObject(pIObj->objectId());
|
||
SetInterfaceRelation(pInterfaceRec,pipeInterface2);
|
||
}
|
||
|
||
//本次接口处理完毕,记录下
|
||
arPtsOk.append(pipeInterface.GetPosition());
|
||
return TRUE;
|
||
}
|
||
|
||
for (int j = 0;j < interfaces.length();j++)
|
||
{
|
||
if ( !arPtsOk.find(interfaces[j].GetPosition(),nFoundAt)) //该接口不在有效的范围内
|
||
{
|
||
//更新该无效的接口
|
||
pInterfaceRec->Update(pipeInterface.GetOwnerId(),interfaces[j].GetPosition(),pipeInterface.GetPosition());
|
||
arPtsOk.append(pipeInterface.GetPosition());
|
||
|
||
//更新后,寻找新的可建立的关系
|
||
if ( Find(pInterfaceRec,pipeInterface))
|
||
{
|
||
//建立关联关系
|
||
if (pIObj->isWriteEnabled())
|
||
{
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
}
|
||
else if (Acad::eOk == pIObj->upgradeOpen())
|
||
{
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
pIObj->downgradeOpen();
|
||
}
|
||
|
||
//反向关系建立
|
||
TInterface pipeInterface2;
|
||
pipeInterface2.SetOwnerId(pipeInterface.GetConnectObject());
|
||
pipeInterface2.SetPosition(pipeInterface.GetPosition());
|
||
pipeInterface2.SetOutDir(-pipeInterface.GetOutDir());
|
||
pipeInterface2.SetConnectObject(pIObj->objectId());
|
||
SetInterfaceRelation(pInterfaceRec,pipeInterface2);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL TDbRelInterfaceReactor::UpdateInterfacePoint(TInterfaceModifyMsg& msg)
|
||
{
|
||
// add by hh 2011-08-09 接口记录从字典移动到数据库中
|
||
TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB();
|
||
if(NULL != pIntfRec)
|
||
{
|
||
if(Acad::eOk == pIntfRec->upgradeOpen())
|
||
{
|
||
pIntfRec->Update(msg.GetMsgOperateOn(),msg.GetMsgPoint(),msg.GetMsgPoint().transformBy(msg.GetTransform()));
|
||
pIntfRec->downgradeOpen();
|
||
}
|
||
pIntfRec->close();
|
||
return TRUE;
|
||
}
|
||
// add end
|
||
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
pNamedDict->close();
|
||
TDbInterfaceRecord* pInterfaceRec = NULL;
|
||
if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForWrite))
|
||
{
|
||
pDict->close();
|
||
pInterfaceRec->Update(msg.GetMsgOperateOn(),msg.GetMsgPoint(),msg.GetMsgPoint().transformBy(msg.GetTransform()));
|
||
pInterfaceRec->close();
|
||
}
|
||
else
|
||
{
|
||
pDict->close();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pNamedDict->close();
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL TDbRelInterfaceReactor::SetInterfaceRelation(TDbInterfaceRecord* pInterfaceRec,const TInterface& pipeInterface)
|
||
{
|
||
AcDbObjectId idOwner = pipeInterface.GetOwnerId();
|
||
AcDbEntity* pEnt = NULL;
|
||
if (idOwner.isValid() && Acad::eOk == acdbOpenAcDbEntity(pEnt,idOwner,AcDb::kForWrite,true))
|
||
{
|
||
TDbInterfacesObj* pIObj = TDbInterfacesObj::cast(pEnt);
|
||
if (pIObj != NULL)
|
||
{
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
}
|
||
pEnt->close();
|
||
}
|
||
|
||
pInterfaceRec->Update(pipeInterface.GetOwnerId(),pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
pInterfaceRec->Update(pipeInterface.GetConnectObject(),pipeInterface.GetPosition(),pipeInterface.GetOwnerId());
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL TDbRelInterfaceReactor::Find(TDbInterfaceRecord* pInterfaceRec,TInterface& pipeInterface)
|
||
{
|
||
//到命名对象字典中找;
|
||
BOOL bSuccess = FALSE;
|
||
if (pInterfaceRec != NULL)
|
||
{
|
||
bSuccess = pInterfaceRec->FindOtherSide(pipeInterface.GetPosition(),pipeInterface.GetOutDir(),
|
||
pipeInterface,pipeInterface.GetOwnerId());
|
||
}
|
||
return bSuccess;
|
||
}
|
||
|
||
BOOL TDbRelInterfaceReactor::Has(TDbInterfaceRecord* pInterfaceRec,TInterface& pipeInterface)
|
||
{
|
||
//到命名对象字典中找;
|
||
BOOL bSuccess = FALSE;
|
||
if (pInterfaceRec != NULL)
|
||
{
|
||
bSuccess = pInterfaceRec->Find(pipeInterface.GetPosition(),pipeInterface.GetOutDir(),pipeInterface.GetOwnerId(),pipeInterface);
|
||
}
|
||
return bSuccess;
|
||
}
|
||
|
||
BOOL TDbRelInterfaceReactor::RegisterInterface(TDbInterfaceRecord* pInterfaceRec,TInterface& pipeInterface)
|
||
{
|
||
if (pInterfaceRec != NULL)
|
||
{
|
||
pInterfaceRec->Add(pipeInterface);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::PickMakeObjAssocMsgs(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();
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::PickInterfaceUpdateMsgs(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();
|
||
}
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::commandCancelled( const TCHAR* cmdStr )
|
||
{
|
||
if (_tcsicmp(cmdStr, _T("copy")) == 0) // mcl add 2011.3.8 cad的复制后即使按escape取消也要更新关系
|
||
commandEnded(cmdStr);
|
||
|
||
DeleteOptimizeArr();
|
||
g_mapClass2Cmd.SetAt(KEY_MAX_SET_FOROP,0);
|
||
// commandEnded(cmdStr);
|
||
|
||
if(_tcsicmp(cmdStr, _T("matchprop"))==0 && curDoc() != NULL)
|
||
{
|
||
curDoc()->inputPointManager()->removeInputContextReactor(m_pMatchPropertiesReactor);
|
||
}
|
||
|
||
//add by dyw 2014-7-16 清空风管拉伸命令中的选择集,卸载反应器
|
||
if(0 == _tcsicmp(cmdStr, _T("stretch")) && curDoc() != NULL)
|
||
{
|
||
m_pDuctStretchReactor->m_arrId.setLogicalLength(0);
|
||
curDoc()->inputPointManager()->removeInputContextReactor(m_pDuctStretchReactor);
|
||
}
|
||
//add end
|
||
}
|
||
|
||
void TDbRelInterfaceReactor::commandFailed(const TCHAR* cmdStr)
|
||
{
|
||
DeleteOptimizeArr();
|
||
g_mapClass2Cmd.SetAt(KEY_MAX_SET_FOROP,0);
|
||
commandEnded(cmdStr);
|
||
}
|
||
|
||
|
||
// 判断id是否被删除
|
||
BOOL TDbRelInterfaceReactor::MakesureIsErased(const AcDbObjectId& id)
|
||
{
|
||
BOOL bEr = TRUE;
|
||
|
||
if (id.isValid())
|
||
{
|
||
AcDbEntity* pEnt = NULL;
|
||
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
||
{
|
||
if (Adesk::kFalse == pEnt->isErased())
|
||
{
|
||
bEr = FALSE;
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
|
||
return bEr;
|
||
}
|
||
|
||
BOOL TDbRelInterfaceReactor::OptimizeUpdateRelInterface()
|
||
{
|
||
// 打开TDbInterfaceRecord,进行接口注册
|
||
AcDbObjectIdArray* pIdArr = NULL;
|
||
g_iMsgContext.m_mapDb2InfAppended.Lookup((void*)acdbCurDwg(), (void*&)pIdArr);
|
||
if (pIdArr != NULL)
|
||
{
|
||
// add by hh 2011-08-09 接口记录从字典移动到数据库中
|
||
TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB();
|
||
if(NULL != pIntfRec)
|
||
{
|
||
if(Acad::eOk == pIntfRec->upgradeOpen())
|
||
{
|
||
//1. 建立关系
|
||
AcDbObjectId idT;
|
||
int nArrIndex(0), nIfIndex(0), nCount(0);
|
||
int nDepClnFlag(0);
|
||
TInterface pipeInterface,pipeInterface2;
|
||
TDbInterfacesObj* pIObj = NULL;
|
||
AcDbEntity* pEnt = NULL;
|
||
for (nArrIndex = 0; nArrIndex < pIdArr->length(); nArrIndex++)
|
||
{
|
||
pEnt = NULL;
|
||
idT = (*pIdArr)[nArrIndex];
|
||
acdbOpenAcDbEntity(pEnt, idT, AcDb::kForWrite);
|
||
if (pEnt == NULL)
|
||
continue;
|
||
|
||
pIObj = TDbInterfacesObj::cast(pEnt);
|
||
if (pIObj == NULL)
|
||
{
|
||
pEnt->close();
|
||
continue;
|
||
}
|
||
//排除重合
|
||
pIObj->GetSpecialtyData()->GetAt(KEY_DEEPCLONEFLAG, nDepClnFlag);
|
||
if (nDepClnFlag)
|
||
{
|
||
pIObj->close();
|
||
continue;
|
||
}
|
||
pipeInterface.Reset();
|
||
pipeInterface2.Reset();
|
||
|
||
nCount = pIObj->GetInterfaceCount();
|
||
for (nIfIndex = 0; nIfIndex < nCount; nIfIndex++)
|
||
{
|
||
pipeInterface.SetCompareRule(0);
|
||
if (pIObj->GetInterface(nIfIndex,pipeInterface))
|
||
{
|
||
if (Find(pIntfRec, pipeInterface))
|
||
{
|
||
//建立关联关系
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
pipeInterface2.SetOwnerId(pipeInterface.GetConnectObject());
|
||
pipeInterface2.SetPosition(pipeInterface.GetPosition());
|
||
pipeInterface2.SetOutDir(-pipeInterface.GetOutDir());
|
||
pipeInterface2.SetConnectObject(pIObj->objectId());
|
||
SetInterfaceRelation(pIntfRec, pipeInterface2);
|
||
}
|
||
else
|
||
{
|
||
pipeInterface.SetConnectObject(AcDbObjectId::kNull);
|
||
}
|
||
// 注册接口信息
|
||
pipeInterface.SetOwnerId(idT);
|
||
RegisterInterface(pIntfRec, pipeInterface);
|
||
}
|
||
}
|
||
pIObj->UpdateCoverDisplay();
|
||
pIObj->close();
|
||
}
|
||
pIntfRec->downgradeOpen();
|
||
}
|
||
pIntfRec->close();
|
||
}
|
||
else
|
||
{
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
pNamedDict->close();
|
||
TDbInterfaceRecord* pInterfaceRec = NULL;
|
||
if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForWrite))
|
||
{
|
||
pDict->close();
|
||
|
||
//1. 建立关系
|
||
AcDbObjectId idT;
|
||
int nArrIndex(0), nIfIndex(0), nCount(0);
|
||
int nDepClnFlag(0);
|
||
TInterface pipeInterface,pipeInterface2;
|
||
TDbInterfacesObj* pIObj = NULL;
|
||
AcDbEntity* pEnt = NULL;
|
||
for (nArrIndex = 0; nArrIndex < pIdArr->length(); nArrIndex++)
|
||
{
|
||
pEnt = NULL;
|
||
// idT.setFromOldId((INT_PTR)pIdArr->GetAt(nArrIndex));
|
||
idT = (*pIdArr)[nArrIndex];
|
||
acdbOpenAcDbEntity(pEnt, idT, AcDb::kForWrite);
|
||
if (pEnt == NULL)
|
||
continue;
|
||
|
||
pIObj = TDbInterfacesObj::cast(pEnt);
|
||
if (pIObj == NULL)
|
||
{
|
||
pEnt->close();
|
||
continue;
|
||
}
|
||
|
||
//排除重合
|
||
pIObj->GetSpecialtyData()->GetAt(KEY_DEEPCLONEFLAG, nDepClnFlag);
|
||
if (nDepClnFlag)
|
||
{
|
||
pIObj->close();
|
||
continue;
|
||
}
|
||
|
||
pipeInterface.Reset();
|
||
pipeInterface2.Reset();
|
||
|
||
nCount = pIObj->GetInterfaceCount();
|
||
for (nIfIndex = 0; nIfIndex < nCount; nIfIndex++)
|
||
{
|
||
pipeInterface.SetCompareRule(0);
|
||
if (pIObj->GetInterface(nIfIndex,pipeInterface))
|
||
{
|
||
if (Find(pInterfaceRec, pipeInterface))
|
||
{
|
||
//建立关联关系
|
||
// if (Acad::eOk == pIObj->upgradeOpen()) 本来就可写
|
||
{
|
||
pIObj->SetInterfaceRelation(pipeInterface.GetPosition(),pipeInterface.GetConnectObject());
|
||
// pIObj->downgradeOpen();
|
||
}
|
||
pipeInterface2.SetOwnerId(pipeInterface.GetConnectObject());
|
||
pipeInterface2.SetPosition(pipeInterface.GetPosition());
|
||
pipeInterface2.SetOutDir(-pipeInterface.GetOutDir());
|
||
pipeInterface2.SetConnectObject(pIObj->objectId());
|
||
SetInterfaceRelation(pInterfaceRec, pipeInterface2);
|
||
}
|
||
else
|
||
{
|
||
pipeInterface.SetConnectObject(AcDbObjectId::kNull);
|
||
}
|
||
|
||
// 注册接口信息
|
||
pipeInterface.SetOwnerId(idT);
|
||
RegisterInterface(pInterfaceRec, pipeInterface);
|
||
}
|
||
}
|
||
|
||
pIObj->UpdateCoverDisplay();
|
||
pIObj->close();
|
||
}
|
||
pInterfaceRec->close();
|
||
}
|
||
else
|
||
{
|
||
pDict->close();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pNamedDict->close();
|
||
}
|
||
}
|
||
}
|
||
g_iMsgContext.m_mapDb2InfAppended.RemoveKey((void*)acdbCurDwg());
|
||
delete pIdArr;
|
||
|
||
// 批量复制操作,也做更新接口关系,提前返回
|
||
// 也会产生m_mapDbTInfRecMsgs,所以返回前清空g_iMsgContext.m_mapDbTInfRecMsgs
|
||
CPtrArray* pArray = NULL;
|
||
g_iMsgContext.m_mapDbTInfRecMsgs.Lookup((void*)acdbCurDwg(),(void*&)pArray);
|
||
if (NULL != pArray)
|
||
{
|
||
delete pArray;
|
||
pArray = NULL;
|
||
g_iMsgContext.m_mapDbTInfRecMsgs.RemoveKey((void*)acdbCurDwg());
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
CPtrArray* pArray = NULL;
|
||
g_iMsgContext.m_mapDbTInfRecMsgs.Lookup((void*)acdbCurDwg(),(void*&)pArray);
|
||
if (pArray != NULL)
|
||
{
|
||
// add by hh 2011-08-09 接口记录从字典移动到数据库中
|
||
TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB();
|
||
if(NULL != pIntfRec)
|
||
{
|
||
if(Acad::eOk == pIntfRec->upgradeOpen())
|
||
{
|
||
TInfUpdate* pInfUpdate = NULL;
|
||
TInterface pipeInterface;
|
||
TDbInterfacesObj* pObj = NULL;
|
||
AcDbEntity* pEnt = NULL;
|
||
int nIfIndex(0);
|
||
for (int i = 0;i < pArray->GetSize();i++)
|
||
{
|
||
pInfUpdate = (TInfUpdate*)pArray->GetAt(i);
|
||
if (pInfUpdate->nIntf == TDb::eTransformBy)
|
||
{
|
||
//如果没有注册接口,注册接口
|
||
if (!pIntfRec->Find(pInfUpdate->idOwner))
|
||
{
|
||
pEnt = NULL;
|
||
acdbOpenAcDbEntity(pEnt, pInfUpdate->idOwner, AcDb::kForWrite);
|
||
if (NULL == pEnt)
|
||
continue;
|
||
|
||
pObj = TDbInterfacesObj::cast(pEnt);
|
||
if (NULL == pObj)
|
||
{
|
||
pEnt->close();
|
||
continue;
|
||
}
|
||
|
||
for (nIfIndex = 0; nIfIndex < pObj->GetInterfaceCount(); nIfIndex++)
|
||
{
|
||
pipeInterface.Reset();
|
||
if (pObj->GetInterface(nIfIndex, pipeInterface))
|
||
{
|
||
pIntfRec->Add(pipeInterface);
|
||
}
|
||
}
|
||
pObj->UpdateCoverDisplay();
|
||
pObj->close();
|
||
}
|
||
else
|
||
{
|
||
if (pInfUpdate->bInfAll)
|
||
{
|
||
pIntfRec->TransformBy(pInfUpdate->idOwner,pInfUpdate->xForm);
|
||
}
|
||
else
|
||
{
|
||
pIntfRec->TransformBy(pInfUpdate->idOwner,pInfUpdate->ptOld,pInfUpdate->xForm);
|
||
}
|
||
|
||
// mcl add.更新时,也写遮挡消息
|
||
pEnt = NULL;
|
||
acdbOpenAcDbEntity(pEnt, pInfUpdate->idOwner, AcDb::kForWrite);
|
||
if (NULL == pEnt)
|
||
continue;
|
||
|
||
pObj = TDbInterfacesObj::cast(pEnt);
|
||
if (NULL == pObj)
|
||
{
|
||
pEnt->close();
|
||
continue;
|
||
}
|
||
|
||
pObj->UpdateCoverDisplay();
|
||
pObj->close();
|
||
}
|
||
}
|
||
else if (pInfUpdate->nIntf == TDb::eUpdateIntf)
|
||
{
|
||
AcGePoint3d ptGeNew = pInfUpdate->ptOld;
|
||
ptGeNew.transformBy(pInfUpdate->xForm);
|
||
pIntfRec->Update(pInfUpdate->idOwner,pInfUpdate->ptOld,ptGeNew);
|
||
}
|
||
}
|
||
pIntfRec->downgradeOpen();
|
||
}
|
||
|
||
pIntfRec->close();
|
||
}
|
||
else
|
||
{
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
pNamedDict->close();
|
||
TDbInterfaceRecord* pInterfaceRec = NULL;
|
||
if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForWrite))
|
||
{
|
||
pDict->close();
|
||
|
||
TInfUpdate* pInfUpdate = NULL;
|
||
TInterface pipeInterface;
|
||
TDbInterfacesObj* pObj = NULL;
|
||
AcDbEntity* pEnt = NULL;
|
||
int nIfIndex(0);
|
||
for (int i = 0;i < pArray->GetSize();i++)
|
||
{
|
||
pInfUpdate = (TInfUpdate*)pArray->GetAt(i);
|
||
|
||
if (pInfUpdate->nIntf == TDb::eTransformBy)
|
||
{
|
||
//如果没有注册接口,注册接口
|
||
if (!pInterfaceRec->Find(pInfUpdate->idOwner))
|
||
{
|
||
pEnt = NULL;
|
||
acdbOpenAcDbEntity(pEnt, pInfUpdate->idOwner, AcDb::kForWrite);
|
||
if (NULL == pEnt)
|
||
continue;
|
||
|
||
pObj = TDbInterfacesObj::cast(pEnt);
|
||
if (NULL == pObj)
|
||
{
|
||
pEnt->close();
|
||
continue;
|
||
}
|
||
|
||
for (nIfIndex = 0; nIfIndex < pObj->GetInterfaceCount(); nIfIndex++)
|
||
{
|
||
pipeInterface.Reset();
|
||
if (pObj->GetInterface(nIfIndex, pipeInterface))
|
||
{
|
||
pInterfaceRec->Add(pipeInterface);
|
||
}
|
||
}
|
||
pObj->UpdateCoverDisplay();
|
||
pObj->close();
|
||
}
|
||
else
|
||
{
|
||
if (pInfUpdate->bInfAll)
|
||
{
|
||
pInterfaceRec->TransformBy(pInfUpdate->idOwner,pInfUpdate->xForm);
|
||
}
|
||
else
|
||
{
|
||
pInterfaceRec->TransformBy(pInfUpdate->idOwner,pInfUpdate->ptOld,pInfUpdate->xForm);
|
||
}
|
||
|
||
// mcl add.更新时,也写遮挡消息
|
||
pEnt = NULL;
|
||
acdbOpenAcDbEntity(pEnt, pInfUpdate->idOwner, AcDb::kForWrite);
|
||
if (NULL == pEnt)
|
||
continue;
|
||
|
||
pObj = TDbInterfacesObj::cast(pEnt);
|
||
if (NULL == pObj)
|
||
{
|
||
pEnt->close();
|
||
continue;
|
||
}
|
||
|
||
pObj->UpdateCoverDisplay();
|
||
pObj->close();
|
||
}
|
||
}
|
||
else if (pInfUpdate->nIntf == TDb::eUpdateIntf)
|
||
{
|
||
AcGePoint3d ptGeNew = pInfUpdate->ptOld;
|
||
ptGeNew.transformBy(pInfUpdate->xForm);
|
||
pInterfaceRec->Update(pInfUpdate->idOwner,pInfUpdate->ptOld,ptGeNew);
|
||
}
|
||
}
|
||
pInterfaceRec->close();
|
||
}
|
||
else
|
||
{
|
||
pDict->close();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pNamedDict->close();
|
||
}
|
||
}
|
||
}
|
||
|
||
TInfUpdate* pInfUpdate = NULL;
|
||
for (int i = 0;i < pArray->GetSize();i++)
|
||
{
|
||
pInfUpdate = (TInfUpdate*)pArray->GetAt(i);
|
||
if (pInfUpdate != NULL) delete pInfUpdate;
|
||
}
|
||
delete pArray;
|
||
|
||
g_iMsgContext.m_mapDbTInfRecMsgs.RemoveKey((void*)acdbCurDwg());
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
// 优化处理删除后接口处理
|
||
void TDbRelInterfaceReactor::OptimizeEraseRelInterface()
|
||
{
|
||
// 先批量处理删除后,更新接口记录 mcl add 2010.05.19
|
||
// CUIntArray* pIdArr = NULL;
|
||
AcDbObjectIdArray* pIdArr = NULL;
|
||
g_iMsgContext.m_mapDb2InfErase.Lookup((void*)acdbCurDwg(), (void*&)pIdArr);
|
||
if (pIdArr != NULL)
|
||
{
|
||
// add by hh 2011-08-09 接口记录从字典移动到数据库中
|
||
TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB();
|
||
if(NULL != pIntfRec)
|
||
{
|
||
if(Acad::eOk == pIntfRec->upgradeOpen())
|
||
{
|
||
AcDbObjectId idT;
|
||
int nArrIndex(0);
|
||
AcDbEntity* pEnt = NULL;
|
||
for (nArrIndex = 0; nArrIndex < pIdArr->length(); nArrIndex++)
|
||
{
|
||
pEnt = NULL;
|
||
idT = (*pIdArr)[nArrIndex];
|
||
|
||
pIntfRec->Remove(idT);
|
||
pIntfRec->ResetConnect(idT);
|
||
}
|
||
pIntfRec->downgradeOpen();
|
||
}
|
||
pIntfRec->close();
|
||
|
||
g_iMsgContext.m_mapDb2InfErase.RemoveKey((void*)acdbCurDwg());
|
||
delete pIdArr;
|
||
pIdArr = NULL;
|
||
return;
|
||
}
|
||
// add end
|
||
|
||
AcDbDictionary* pNamedDict = NULL;
|
||
if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
{
|
||
AcDbDictionary* pDict = NULL;
|
||
if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
{
|
||
pNamedDict->close();
|
||
TDbInterfaceRecord* pInterfaceRec = NULL;
|
||
if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForWrite))
|
||
{
|
||
pDict->close();
|
||
|
||
AcDbObjectId idT;
|
||
int nArrIndex(0);
|
||
AcDbEntity* pEnt = NULL;
|
||
for (nArrIndex = 0; nArrIndex < pIdArr->length(); nArrIndex++)
|
||
{
|
||
pEnt = NULL;
|
||
idT = (*pIdArr)[nArrIndex];
|
||
|
||
pInterfaceRec->Remove(idT);
|
||
pInterfaceRec->ResetConnect(idT);
|
||
}
|
||
pInterfaceRec->close();
|
||
}
|
||
else
|
||
{
|
||
pDict->close();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pNamedDict->close();
|
||
}
|
||
}
|
||
g_iMsgContext.m_mapDb2InfErase.RemoveKey((void*)acdbCurDwg());
|
||
delete pIdArr;
|
||
pIdArr = NULL;
|
||
}
|
||
}
|
||
|
||
// mcl add 2010.05.24 开关接口记录是否记忆撤销操作
|
||
// void TDbRelInterfaceReactor::TagRecordUndo(Adesk::Boolean bOpen)
|
||
// {
|
||
// AcDbDictionary* pNamedDict = NULL;
|
||
// if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead))
|
||
// {
|
||
// AcDbDictionary* pDict = NULL;
|
||
// if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead))
|
||
// {
|
||
// TDbInterfaceRecord* pInterfaceRec = NULL;
|
||
// if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForWrite))
|
||
// {
|
||
// pInterfaceRec->disableUndoRecording(!bOpen);
|
||
// pInterfaceRec->close();
|
||
// }
|
||
// pDict->close();
|
||
// }
|
||
// pNamedDict->close();
|
||
// }
|
||
// }
|
||
|
||
void TDbRelInterfaceReactor::DeleteOptimizeArr()
|
||
{
|
||
int nMaxSetForOp = 0;
|
||
g_mapClass2Cmd.GetAt(KEY_MAX_SET_FOROP,nMaxSetForOp);
|
||
if (nMaxSetForOp != 2) //优化批量处理标志
|
||
return;
|
||
|
||
// 依次删除各个优化数组
|
||
|
||
AcDbObjectIdArray* pIdArr = NULL;
|
||
g_iMsgContext.m_mapDb2InfAppended.Lookup((void*)acdbCurDwg(), (void*&)pIdArr);
|
||
if (pIdArr != NULL)
|
||
{
|
||
g_iMsgContext.m_mapDb2InfAppended.RemoveKey((void*)acdbCurDwg());
|
||
delete pIdArr;
|
||
}
|
||
|
||
CPtrArray* pArray = NULL;
|
||
g_iMsgContext.m_mapDbTInfRecMsgs.Lookup((void*)acdbCurDwg(),(void*&)pArray);
|
||
if (pArray != NULL)
|
||
{
|
||
TInfUpdate* pInfUpdate = NULL;
|
||
for (int i = 0;i < pArray->GetSize();i++)
|
||
{
|
||
pInfUpdate = (TInfUpdate*)pArray->GetAt(i);
|
||
if (pInfUpdate != NULL)
|
||
delete pInfUpdate;
|
||
}
|
||
|
||
g_iMsgContext.m_mapDbTInfRecMsgs.RemoveKey((void*)acdbCurDwg());
|
||
delete pArray;
|
||
}
|
||
|
||
pIdArr = NULL;
|
||
g_iMsgContext.m_mapDb2InfErase.Lookup((void*)acdbCurDwg(), (void*&)pIdArr);
|
||
if (pIdArr != NULL)
|
||
{
|
||
g_iMsgContext.m_mapDb2InfErase.RemoveKey((void*)acdbCurDwg());
|
||
delete pIdArr;
|
||
}
|
||
} |