248 lines
6.1 KiB
C++
248 lines
6.1 KiB
C++
#include "stdafx.h"
|
|
#include "TInterfaceSizeReleationManger.h"
|
|
#include "TInterfaceReleationManager.h"
|
|
|
|
TInterfaceSizeReleationManger::TInterfaceSizeReleationManger()
|
|
{
|
|
}
|
|
|
|
TInterfaceSizeReleationManger::~TInterfaceSizeReleationManger()
|
|
{
|
|
}
|
|
|
|
void TInterfaceSizeReleationManger::TranslateSizeModifyMsg(const TInterfaceModifyMsg& msg,AcDbObjectIdArray& idOperOns)
|
|
{
|
|
CTempTolPipe tol(1.e-6);
|
|
AcDbObjectId idOn = msg.GetMsgOperateOn();
|
|
AcDbEntity* pEnt = NULL;
|
|
|
|
if ( idOn.isValid() && Acad::eOk == acdbOpenAcDbEntity(pEnt,idOn,AcDb::kForRead,true))
|
|
{
|
|
BOOL bClose = FALSE;
|
|
TDbInterfacesObj* pIObj = TDbInterfacesObj::cast(pEnt);
|
|
if (pIObj != NULL)
|
|
{
|
|
//执行size的操作
|
|
TransactSizeOperation(msg,idOperOns,pIObj,bClose);
|
|
}
|
|
if (!bClose) pEnt->close();
|
|
}
|
|
}
|
|
|
|
void TInterfaceSizeReleationManger::TransactSizeOperation(const TInterfaceModifyMsg& msg,AcDbObjectIdArray& idOperOns,
|
|
TDbInterfacesObj* pIObj,BOOL& bClose)
|
|
{
|
|
TInterfaces intfs;
|
|
AcDbObjectId idConnect,idFind;
|
|
TInterface pipeInterface;
|
|
AcDbEntity *pEntConnect = NULL;
|
|
|
|
if (pIObj != NULL)
|
|
{
|
|
int nCount = pIObj->GetInterfaceCount();
|
|
for (int i = 0;i < nCount;i++)
|
|
{
|
|
if (pIObj->GetInterface(i,pipeInterface))
|
|
{
|
|
intfs.append(pipeInterface);
|
|
}
|
|
}
|
|
pIObj->close();
|
|
bClose = TRUE;
|
|
}
|
|
|
|
for (int i = 0;i < intfs.length();i++)
|
|
{
|
|
pipeInterface = intfs.at(i);
|
|
idConnect = pipeInterface.GetConnectObject();
|
|
|
|
// 还需要检查接口的有效性
|
|
if (idConnect.isNull() || !Find2(pipeInterface.GetPosition()-msg.GetMoveGripOffset(),pipeInterface.GetOutDir(),idFind,pIObj->objectId()))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( idConnect.isValid() && Acad::eOk == acdbOpenAcDbEntity(pEntConnect,idConnect,AcDb::kForRead,true))
|
|
{
|
|
pEntConnect->close();
|
|
|
|
int nFind = -1;
|
|
//
|
|
if (idOperOns.find(idConnect,nFind))
|
|
{
|
|
//不需要处理
|
|
}
|
|
else
|
|
{
|
|
TInterfaceModifyMsg msgT = msg;
|
|
AcGePoint3d ptT = pipeInterface.GetPosition();
|
|
AcGeVector3d vecT = msg.GetMoveGripOffset();
|
|
ptT -= vecT;
|
|
|
|
msgT.SetMsgPoint(ptT);
|
|
msgT.SetMsgOperateOn(idConnect);
|
|
TransactCycleSizeMsg(msgT,idOperOns);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL TInterfaceSizeReleationManger::TransactCycleSizeMsg(const TInterfaceModifyMsg& msg,AcDbObjectIdArray& idOperOns)
|
|
{
|
|
int nFoundAt = 0;
|
|
if (!idOperOns.find(msg.GetMsgOperateOn(),nFoundAt))
|
|
{
|
|
TInterfaceModifyMsgs idModiNewMsgs;
|
|
TDbInterfacesObj* pIObj2 = NULL;
|
|
AcDbEntity* pEnt2 = NULL;
|
|
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt2,msg.GetMsgOperateOn(),AcDb::kForWrite,true))
|
|
{
|
|
pIObj2 = TDbInterfacesObj::cast(pEnt2);
|
|
if (pIObj2 != NULL)
|
|
{
|
|
//发送通知尺寸更改消息
|
|
pIObj2->NotifyInterfaceToModify(msg,idModiNewMsgs);
|
|
idOperOns.append(msg.GetMsgOperateOn());
|
|
}
|
|
pEnt2->close();
|
|
}
|
|
|
|
//继续传递更改消息,当新的消息对象已经处理过时(在idOperOns内),不传递
|
|
TInterfaceModifyMsg msgT;
|
|
TDb::InterfaceOper eOper;
|
|
TInterfaceReleationManager intfRel;
|
|
|
|
for (int i = 0;i < idModiNewMsgs.length();i++)
|
|
{
|
|
msgT = idModiNewMsgs.at(i);
|
|
|
|
eOper = msgT.GetInterfaceOper();
|
|
if (eOper == TDb::eSize)
|
|
{
|
|
if (!idOperOns.find(msgT.GetMsgOperateOn(),nFoundAt))
|
|
{
|
|
TransactCycleSizeMsg(msgT,idOperOns);
|
|
idOperOns.append(msgT.GetMsgOperateOn());
|
|
}
|
|
}
|
|
else if (eOper == TDb::eMoveGripPoint)
|
|
{
|
|
intfRel.TranslateTransformByMsg(msgT,idOperOns);
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL TInterfaceSizeReleationManger::Find2(const AcGePoint3d& ptCon,const AcGeVector3d& vtDir,AcDbObjectId& idFind,AcDbObjectId& idOwnerThis)
|
|
{
|
|
//到命名对象字典中找;
|
|
BOOL bSuccess = FALSE;
|
|
// add by hh 2011-08-09 接口记录从字典移动到数据库中
|
|
TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB();
|
|
if(NULL != pIntfRec)
|
|
{
|
|
// 通过数组找所有接口,一一查找验证。mcl changed 09.11.10
|
|
TInterfaces tIfArr;
|
|
TInterface pipeInterfaceFind;
|
|
pIntfRec->Find(ptCon, tIfArr);
|
|
int i(0);
|
|
for (i = 0; i < tIfArr.length(); i++)
|
|
{
|
|
pipeInterfaceFind = tIfArr[i];
|
|
idFind = pipeInterfaceFind.GetConnectObject();
|
|
|
|
// 排除空id及自身接口
|
|
if (idFind.isValid() && idFind.asOldId() != idOwnerThis.asOldId())
|
|
{
|
|
bSuccess = TRUE;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
idFind = pipeInterfaceFind.GetOwnerId();
|
|
if (idFind.isValid() && idFind.asOldId() != idOwnerThis.asOldId())
|
|
{
|
|
bSuccess = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
pIntfRec->close();
|
|
return bSuccess;
|
|
}
|
|
// 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::kForRead))
|
|
{
|
|
pDict->close();
|
|
|
|
//修改原因 : 需要得到改点的多个接口
|
|
//修改 : mcl changed 09.11.10
|
|
/*TInterface pipeInterface2;
|
|
bSuccess = pInterfaceRec->Find(ptCon,vtDir,pipeInterface2);
|
|
if (bSuccess)
|
|
{
|
|
//1. 排除此地是自身[如管子端点拉到中点后] 2. 找到连接对象有效
|
|
idFind = pipeInterface2.GetConnectObject();
|
|
if (!idFind.isValid() || idFind.asOldId() == idOwnerThis.asOldId()) bSuccess = FALSE;
|
|
|
|
if (!bSuccess)
|
|
{
|
|
idFind = pipeInterface2.GetOwnerId();
|
|
if (idFind.isValid() && idFind.asOldId() != idOwnerThis.asOldId())
|
|
bSuccess = TRUE;
|
|
}
|
|
}*/
|
|
|
|
// 通过数组找所有接口,一一查找验证。mcl changed 09.11.10
|
|
TInterfaces tIfArr;
|
|
TInterface pipeInterfaceFind;
|
|
pInterfaceRec->Find(ptCon, tIfArr);
|
|
|
|
int i(0);
|
|
for (i = 0; i < tIfArr.length(); i++)
|
|
{
|
|
pipeInterfaceFind = tIfArr[i];
|
|
idFind = pipeInterfaceFind.GetConnectObject();
|
|
|
|
// 排除空id及自身接口
|
|
if (idFind.isValid() && idFind.asOldId() != idOwnerThis.asOldId())
|
|
{
|
|
bSuccess = TRUE;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
idFind = pipeInterfaceFind.GetOwnerId();
|
|
if (idFind.isValid() && idFind.asOldId() != idOwnerThis.asOldId())
|
|
{
|
|
bSuccess = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
pInterfaceRec->close();
|
|
}
|
|
else
|
|
{
|
|
pDict->close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pNamedDict->close();
|
|
}
|
|
}
|
|
return bSuccess;
|
|
} |