443 lines
8.1 KiB
C++
443 lines
8.1 KiB
C++
#include "stdafx.h"
|
|
#include "KTObjLifeMgr.h"
|
|
#include "KTCadUtility.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
// 构造函数
|
|
CKTObjLifeMgr::CKTObjLifeMgr(BOOL bErase)
|
|
{
|
|
m_bEraseAtRelease = bErase;
|
|
}
|
|
|
|
CKTObjLifeMgr::CKTObjLifeMgr(AcDbObject* pObj, BOOL bErase)
|
|
{
|
|
Add(pObj);
|
|
m_bEraseAtRelease = bErase;
|
|
}
|
|
|
|
CKTObjLifeMgr::CKTObjLifeMgr(const AcDbVoidPtrArray& arpObj, BOOL bErase)
|
|
{
|
|
Add(arpObj);
|
|
m_bEraseAtRelease = bErase;
|
|
}
|
|
|
|
CKTObjLifeMgr::CKTObjLifeMgr(AcDbObjectId idObj, BOOL bErase)
|
|
{
|
|
Add(idObj);
|
|
m_bEraseAtRelease = bErase;
|
|
}
|
|
|
|
CKTObjLifeMgr::CKTObjLifeMgr(const AcDbObjectIdArray& aridObj, BOOL bErase)
|
|
{
|
|
Add(aridObj);
|
|
m_bEraseAtRelease = bErase;
|
|
}
|
|
|
|
CKTObjLifeMgr::~CKTObjLifeMgr()
|
|
{
|
|
Release(m_bEraseAtRelease);
|
|
}
|
|
|
|
// 判断是否数组为空
|
|
BOOL CKTObjLifeMgr::IsEmpty()
|
|
{
|
|
return (m_arpObject.length() == 0);
|
|
}
|
|
|
|
// 取得数组中实体的个数
|
|
int CKTObjLifeMgr::GetCount()
|
|
{
|
|
return m_arpObject.length();
|
|
}
|
|
|
|
// 取得指定的实体
|
|
AcDbObject* CKTObjLifeMgr::Get(int iObj)
|
|
{
|
|
if (iObj < 0 || iObj >= m_arpObject.length())
|
|
return NULL;
|
|
|
|
return ((AcDbObject*)m_arpObject[iObj]);
|
|
}
|
|
|
|
AcDbVoidPtrArray* CKTObjLifeMgr::GetAll()
|
|
{
|
|
return &m_arpObject;
|
|
}
|
|
|
|
int CKTObjLifeMgr::GetIndex(const AcDbObject* pObj)
|
|
{
|
|
assert(pObj != NULL);
|
|
|
|
int iIndex = -1;
|
|
m_arpObject.find((void*)pObj, iIndex);
|
|
|
|
return iIndex;
|
|
}
|
|
|
|
int CKTObjLifeMgr::GetIndex(const AcDbObjectId& idObj)
|
|
{
|
|
assert(idObj.isValid());
|
|
|
|
AcDbObject* pObj;
|
|
int iLen = m_arpObject.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
pObj = (AcDbObject*)m_arpObject[i];
|
|
assert(pObj != NULL);
|
|
|
|
if (pObj->objectId() == idObj)
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
// 添加数据
|
|
BOOL CKTObjLifeMgr::Add(AcDbObject* pObj)
|
|
{
|
|
assert(pObj != NULL && pObj->isKindOf(AcDbObject::desc()));
|
|
|
|
Remove(pObj); // 保证唯一性
|
|
m_arpObject.append(pObj);
|
|
OnObjectAdded(pObj);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Add(const AcDbVoidPtrArray& arpObj)
|
|
{
|
|
int iLen = arpObj.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
Add((AcDbObject*)arpObj[i]);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Add(const AcDbObjectId& idObj)
|
|
{
|
|
assert(idObj.isValid());
|
|
|
|
AcDbObject* pObj;
|
|
if (acdbOpenObject(pObj, idObj, AcDb::kForRead) == Acad::eOk)
|
|
{
|
|
Release(idObj, FALSE);
|
|
m_arpObject.append(pObj);
|
|
OnObjectAdded(pObj);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Add(const AcDbObjectIdArray& aridObj)
|
|
{
|
|
int iLen = aridObj.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
Add(aridObj[i]);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// 移除数据, 不处理
|
|
BOOL CKTObjLifeMgr::RemoveAt(int iObj)
|
|
{
|
|
if (iObj < 0 || iObj >= m_arpObject.length())
|
|
return FALSE;
|
|
|
|
AcDbObject* pObj = (AcDbObject*)m_arpObject[iObj];
|
|
m_arpObject.removeAt(iObj);
|
|
OnObjectRemoved(pObj);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Remove(const AcDbObject* pObj)
|
|
{
|
|
assert(pObj != NULL);
|
|
|
|
BOOL bRet = m_arpObject.remove((void*)pObj);
|
|
if (bRet)
|
|
{
|
|
OnObjectRemoved(pObj);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Remove(const AcDbVoidPtrArray& arpObj)
|
|
{
|
|
int iLen = arpObj.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
Remove((AcDbObject*)arpObj[i]);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Remove(const AcDbObjectId& idObj)
|
|
{
|
|
assert(idObj.isValid());
|
|
|
|
AcDbObject* pObj;
|
|
int iLen = m_arpObject.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
pObj = (AcDbObject*)m_arpObject[i];
|
|
assert(pObj != NULL);
|
|
|
|
if (pObj->objectId() == idObj)
|
|
{
|
|
m_arpObject.removeAt(i);
|
|
OnObjectRemoved(pObj);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Remove(const AcDbObjectIdArray& aridObj)
|
|
{
|
|
int iLen = aridObj.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
Remove(aridObj[i]);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Remove()
|
|
{
|
|
AcDbObject* pObj;
|
|
int iLen = m_arpObject.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
pObj = (AcDbObject*)m_arpObject.last();
|
|
m_arpObject.removeLast();
|
|
OnObjectRemoved(pObj);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// 移除数据, 处理, 是否调用erase(对在数据库中的)
|
|
BOOL CKTObjLifeMgr::ReleaseAt(int iObj, BOOL bErase)
|
|
{
|
|
if (iObj < 0 || iObj >= m_arpObject.length())
|
|
return FALSE;
|
|
|
|
AcDbObject* pObj = (AcDbObject*)m_arpObject[iObj];
|
|
assert(pObj != NULL);
|
|
|
|
RemoveAt(iObj);
|
|
OnObjectRelease(pObj, bErase);
|
|
if (pObj->objectId().isValid())
|
|
{
|
|
if (bErase)
|
|
{
|
|
if (pObj->isWriteEnabled() || pObj->upgradeOpen() == Acad::eOk)
|
|
pObj->erase();
|
|
}
|
|
pObj->close();
|
|
}
|
|
else
|
|
delete pObj;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Release(const AcDbObject*& pObj, BOOL bErase)
|
|
{
|
|
assert(pObj != NULL);
|
|
|
|
if (Remove(pObj))
|
|
{
|
|
OnObjectRelease(pObj, bErase);
|
|
if (pObj->objectId().isValid())
|
|
{
|
|
if (bErase)
|
|
{
|
|
if (pObj->isWriteEnabled() || ((AcDbObject*)pObj)->upgradeOpen() == Acad::eOk)
|
|
((AcDbObject*)pObj)->erase();
|
|
}
|
|
((AcDbObject*)pObj)->close();
|
|
}
|
|
else
|
|
delete pObj;
|
|
|
|
pObj = NULL;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Release(const AcDbVoidPtrArray& arpObj, BOOL bErase)
|
|
{
|
|
const AcDbObject* pObj;
|
|
int iLen = arpObj.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
pObj = (const AcDbObject*)arpObj[i];
|
|
Release(pObj, bErase);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Release(const AcDbObjectId& idObj, BOOL bErase)
|
|
{
|
|
assert(idObj.isValid());
|
|
|
|
int iIndex = GetIndex(idObj);
|
|
if (iIndex < 0)
|
|
return FALSE;
|
|
|
|
AcDbObject* pObj = (AcDbObject*)m_arpObject[iIndex];
|
|
assert(pObj != NULL);
|
|
|
|
RemoveAt(iIndex);
|
|
OnObjectRelease(pObj, bErase);
|
|
if (bErase)
|
|
{
|
|
if (pObj->isWriteEnabled() || pObj->upgradeOpen() == Acad::eOk)
|
|
pObj->erase();
|
|
}
|
|
pObj->close();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Release(const AcDbObjectIdArray& aridObj, BOOL bErase)
|
|
{
|
|
int iLen = aridObj.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
Release(aridObj[i], bErase);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CKTObjLifeMgr::Release(BOOL bErase)
|
|
{
|
|
AcDbObject* pObj;
|
|
int iLen = m_arpObject.length();
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
pObj = (AcDbObject*)m_arpObject.last();
|
|
m_arpObject.removeLast();
|
|
assert(pObj != NULL);
|
|
OnObjectRelease(pObj, bErase);
|
|
if (pObj->objectId().isValid())
|
|
{
|
|
if (bErase)
|
|
{
|
|
if (pObj->isWriteEnabled() || pObj->upgradeOpen() == Acad::eOk)
|
|
pObj->erase();
|
|
}
|
|
pObj->close();
|
|
}
|
|
else
|
|
delete pObj;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
// 获取指针
|
|
AcDbObject* CKTObjLifeMgr::Find(const AcDbObject* pObj)
|
|
{
|
|
if (GetIndex(pObj) < 0)
|
|
return NULL;
|
|
return ((AcDbObject*)pObj);
|
|
}
|
|
|
|
AcDbObject* CKTObjLifeMgr::Find(const AcDbObjectId& idObj)
|
|
{
|
|
int iIndex = GetIndex(idObj);
|
|
if (iIndex < 0)
|
|
return NULL;
|
|
return (AcDbObject*)m_arpObject[iIndex];
|
|
}
|
|
|
|
// 加入块表记录, 关闭数据并移除, 返回剩余个数
|
|
int CKTObjLifeMgr::AddToBlockTableRecord(AcDbBlockTableRecord* pRec)
|
|
{
|
|
AcDbObjectIdArray arid;
|
|
return AddToBlockTableRecord(arid, pRec);
|
|
}
|
|
|
|
int CKTObjLifeMgr::AddToBlockTableRecord(AcDbObjectIdArray& arid, AcDbBlockTableRecord* pRec)
|
|
{
|
|
AcDbEntity* pEnt;
|
|
int iLen = m_arpObject.length();
|
|
for (int i = iLen - 1; i >= 0; i--)
|
|
{
|
|
assert(m_arpObject.at(i) != NULL);
|
|
pEnt = AcDbEntity::cast((AcDbObject*)m_arpObject.at(i));
|
|
if (pEnt == NULL)
|
|
continue;
|
|
|
|
if (!pEnt->objectId().isValid() && pRec->appendAcDbEntity(pEnt) != Acad::eOk)
|
|
continue;
|
|
|
|
m_arpObject.removeAt(i);
|
|
arid.append(pEnt->objectId());
|
|
pEnt->close();
|
|
}
|
|
|
|
return m_arpObject.length();
|
|
}
|
|
|
|
int CKTObjLifeMgr::AddToBlockTableRecord(LPCTSTR pszBlock, AcDbDatabase* pDb)
|
|
{
|
|
AcDbObjectIdArray arid;
|
|
return AddToBlockTableRecord(arid, pszBlock, pDb);
|
|
}
|
|
|
|
int CKTObjLifeMgr::AddToBlockTableRecord(AcDbObjectIdArray& arid, LPCTSTR pszBlock, AcDbDatabase* pDb)
|
|
{
|
|
AcDbEntity* pEnt;
|
|
int iLen = m_arpObject.length();
|
|
for (int i = iLen - 1; i >= 0; i--)
|
|
{
|
|
assert(m_arpObject.at(i) != NULL);
|
|
pEnt = AcDbEntity::cast((AcDbObject*)m_arpObject.at(i));
|
|
if (pEnt == NULL)
|
|
continue;
|
|
|
|
if (!pEnt->objectId().isValid() && CKTCadUtility::AddToBlockTableRecord(pEnt, pszBlock, pDb) != Acad::eOk)
|
|
continue;
|
|
|
|
m_arpObject.removeAt(i);
|
|
arid.append(pEnt->objectId());
|
|
pEnt->close();
|
|
}
|
|
|
|
return m_arpObject.length();
|
|
}
|
|
|
|
AcDbObjectId CKTObjLifeMgr::AddToNewBlockTableRecord(const AcGePoint3d& ptOrigin, LPCTSTR pszBlk, AcDbDatabase* pDb)
|
|
{
|
|
AcDbObjectId id;
|
|
|
|
id = CKTCadUtility::CreateBlockTableRecord(m_arpObject, ptOrigin, pszBlk, pDb, TRUE);
|
|
|
|
Release(FALSE);
|
|
|
|
return id;
|
|
}
|