#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; }