#if !defined(__KTOBJLIFEMGR_H__) #define __KTOBJLIFEMGR_H__ #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif // Description: // 类 CKTObjLifeMgr 用于临时管理AcDbObject数据指针,使用它可以简化一堆数据 // 指针,它析构时自动处理指针的删除或对象删除和关闭,一般在函数中使用 // 如: void CreateSomeEntityAndDrag() // { // CKTObjLifeMgr ObjLifeMgr; // AcDbLine* pLine = new AcDbLine(...); // ObjLifeMgr.Add(pLine); // AcDbCircle* pCircle = new AcDbCircle(...); // ObjLifeMgr.Add(pCircle); // AcDbText* pText = new AcDbText(...); // CKTCadUtility::AddToCurrentSpace(pText); // ObjLifeMgr.Add(pText); // CKTEntityDragMgr drag(AcGePoint3d::kOrigin, ObjLifeMgr, FALSE); // if (!drag.DoDrag()) // 操作失败, 直接返回, 无需处理delete/erase/close // return; // CKTObjLifeMgr自动管理,析构时删除所有数据 // ObjLifeMgr.AddToBlockTableRecord(); // 加入数据库并关闭, 清除管理指针 // } // Company: Kingtouch Software Corporation. Copyright 2002-2005 // Author: WangYongguang // Date: 2002.05.01 #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class DLLIMPEXP CKTObjLifeMgr { public: // 构造函数 CKTObjLifeMgr(BOOL bErase = TRUE); CKTObjLifeMgr(AcDbObject* pObj, BOOL bErase = TRUE); CKTObjLifeMgr(const AcDbVoidPtrArray& arpObj, BOOL bErase = TRUE); CKTObjLifeMgr(AcDbObjectId idObj, BOOL bErase = FALSE); CKTObjLifeMgr(const AcDbObjectIdArray& aridObj, BOOL bErase = FALSE); virtual ~CKTObjLifeMgr(); // 在调用Release()时是否调用erase(对在数据库中的) BOOL IsEraseAtRelease(); void SetEraseAtRelease(BOOL bEnable); // 重载操作符 AcDbVoidPtrArray* operator&(); AcDbVoidPtrArray* operator->(); operator AcDbVoidPtrArray*(); // 判断是否数组为空 BOOL IsEmpty(); // 取得数组中实体的个数 int GetCount(); // 取得指定的实体 AcDbObject* Get(int iObj); AcDbVoidPtrArray* GetAll(); int GetIndex(const AcDbObject* pObj); int GetIndex(const AcDbObjectId& idObj); // 添加数据 BOOL Add(AcDbObject* pObj); BOOL Add(const AcDbVoidPtrArray& arpObj); BOOL Add(const AcDbObjectId& idObj); BOOL Add(const AcDbObjectIdArray& aridObj); // 移除数据, 不处理 BOOL RemoveAt(int iObj); BOOL Remove(const AcDbObject* pObj); BOOL Remove(const AcDbVoidPtrArray& arpObj); BOOL Remove(const AcDbObjectId& idObj); BOOL Remove(const AcDbObjectIdArray& aridObj); BOOL Remove(); // 添加数据 CKTObjLifeMgr& operator+=(AcDbObject* pObj); CKTObjLifeMgr& operator+=(const AcDbVoidPtrArray& arpObj); CKTObjLifeMgr& operator+=(const AcDbObjectId& idObj); CKTObjLifeMgr& operator+=(const AcDbObjectIdArray& aridObj); // 删除数据 CKTObjLifeMgr& operator-=(AcDbObject* pObj); CKTObjLifeMgr& operator-=(const AcDbVoidPtrArray& arpObj); CKTObjLifeMgr& operator-=(const AcDbObjectId& idObj); CKTObjLifeMgr& operator-=(const AcDbObjectIdArray& aridObj); // 移除数据, 处理, 是否调用erase(对在数据库中的) BOOL ReleaseAt(int iObj, BOOL bErase); BOOL Release(const AcDbObject*& pObj, BOOL bErase = FALSE); BOOL Release(const AcDbVoidPtrArray& arpObj, BOOL bErase = FALSE); BOOL Release(const AcDbObjectId& idObj, BOOL bErase = FALSE); BOOL Release(const AcDbObjectIdArray& aridObj, BOOL bErase = FALSE); BOOL Release(BOOL bErase = FALSE); // 获取指针 AcDbObject* Find(const AcDbObject* pObj); AcDbObject* Find(const AcDbObjectId& idObj); // 加入块表记录, 关闭数据并移除, 返回剩余个数 int AddToBlockTableRecord(AcDbBlockTableRecord* pRec); // 块表记录 int AddToBlockTableRecord(AcDbObjectIdArray& arid, // 返回数据id数组 AcDbBlockTableRecord* pRec); // 块表记录 int AddToBlockTableRecord(LPCTSTR pszBlock = NULL, // 块名, 默认为模型空间 AcDbDatabase* pDb = NULL); // 数据库名, 默认为当前数据库 int AddToBlockTableRecord(AcDbObjectIdArray& arid, // 返回数据id数组 LPCTSTR pszBlock = NULL, // 块名, 默认为模型空间 AcDbDatabase* pDb = NULL); // 数据库名, 默认为当前数据库 // 加入到创建的块表记录,关闭数据并移除,返回块表记录id AcDbObjectId AddToNewBlockTableRecord(const AcGePoint3d& ptOrigin, // 块表记录原点 LPCTSTR pszBlk = NULL, // 块名,默认为匿名块 AcDbDatabase* pDb = NULL); // 数据库名, 默认为当前数据库 protected: // 添加,删除,移除消息 virtual void OnObjectAdded(const AcDbObject* pObj); virtual void OnObjectRemoved(const AcDbObject* pObj); virtual void OnObjectRelease(const AcDbObject* pObj, BOOL bErase); // 在调用Release()时是否调用erase(对在数据库中的) BOOL m_bEraseAtRelease; AcDbVoidPtrArray m_arpObject; }; // 在调用Release()时是否调用erase(对在数据库中的) inline BOOL CKTObjLifeMgr::IsEraseAtRelease() { return m_bEraseAtRelease; } inline void CKTObjLifeMgr::SetEraseAtRelease(BOOL bEnable) { m_bEraseAtRelease = bEnable; } inline AcDbVoidPtrArray* CKTObjLifeMgr::operator&() { return &m_arpObject; } inline AcDbVoidPtrArray* CKTObjLifeMgr::operator->() { return &m_arpObject; } inline CKTObjLifeMgr::operator AcDbVoidPtrArray*() { return &m_arpObject; } // 添加数据 inline CKTObjLifeMgr& CKTObjLifeMgr::operator+=(AcDbObject* pObj) { Add(pObj); return (*this); } inline CKTObjLifeMgr& CKTObjLifeMgr::operator+=(const AcDbVoidPtrArray& arpObj) { Add(arpObj); return (*this); } inline CKTObjLifeMgr& CKTObjLifeMgr::operator+=(const AcDbObjectId& idObj) { Add(idObj); return (*this); } inline CKTObjLifeMgr& CKTObjLifeMgr::operator+=(const AcDbObjectIdArray& aridObj) { Add(aridObj); return (*this); } // 删除数据 inline CKTObjLifeMgr& CKTObjLifeMgr::operator-=(AcDbObject* pObj) { Remove(pObj); return (*this); } inline CKTObjLifeMgr& CKTObjLifeMgr::operator-=(const AcDbVoidPtrArray& arpObj) { Remove(arpObj); return (*this); } inline CKTObjLifeMgr& CKTObjLifeMgr::operator-=(const AcDbObjectId& idObj) { Remove(idObj); return (*this); } inline CKTObjLifeMgr& CKTObjLifeMgr::operator-=(const AcDbObjectIdArray& aridObj) { Remove(aridObj); return (*this); } // 添加,删除,移除消息 inline void CKTObjLifeMgr::OnObjectAdded(const AcDbObject* pObj) { } inline void CKTObjLifeMgr::OnObjectRemoved(const AcDbObject* pObj) { } inline void CKTObjLifeMgr::OnObjectRelease(const AcDbObject* pObj, BOOL bErase) { } #endif // !defined(__KTOBJLIFEMGR_H__)