Files
envi-code/SourceCode/Code2026/CoreLibrary/KTObjLifeMgr.cpp
T
2026-09-28 15:28:50 +08:00

443 lines
8.0 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;
}