#if !defined(_FLOORRECT_REACTER_H) #define _FLOORRECT_REACTER_H /*============================================================================* * Copyright(c), 1994-2010, Beijing Tangent Engineering Software Co.Ltd. * 作 者: 宋戈 * 创建时间: 2010-2-9 * 描 述: 与“楼层框”有关的数据库、文档反映器 与“楼层框”有关的处理系统 =============================================================================*/ // 文档反映器 class TFloorRectDocReactor: public AcApDocManagerReactor { public: TFloorRectDocReactor() {} ~TFloorRectDocReactor() {} public: virtual void documentCreated(AcApDocument* pDocCreating); virtual void documentToBeDestroyed(AcApDocument* pDocToDestroy); virtual void documentActivated(AcApDocument* pActivatedDoc); }; // 数据库反映器 class TFloorRectDbReactor: public AcDbDatabaseReactor { public: TFloorRectDbReactor() {} ~TFloorRectDbReactor() {} public: virtual void objectAppended(const AcDbDatabase* dwg, const AcDbObject* dbObj); virtual void objectModified(const AcDbDatabase* dwg, const AcDbObject* dbObj); virtual void objectErased(const AcDbDatabase* dwg, const AcDbObject* dbObj, Adesk::Boolean pErased = true); }; // 连接楼层表行与楼层框对象的数据结构 class TFloorRectItem { public: TFloorRectItem(); public: short m_nRowIndex; // 行号 CString m_csDwgFile; // 图纸名称 AcDbObjectId m_idObj; // 楼层框对象ID private: AcDbIntArray m_aryFloors; // 楼层号 CString m_csPrompt; // 警告提示语 public: // Set、Get函数 // 根据图纸名称,搜索对应行号和工程名称的对象,得到对象ID bool SetObjIdFromDwg(AcApDocument*& pDoc, bool &bIsOpenAlready); // 楼层号数组操作 void SetFloors(const AcDbIntArray &aryFloors); void GetFloors(AcDbIntArray &aryFloors) const; // 获取提示语 CString GetPrompt() const; public: // 与楼层框对象交互 // 设置层高 bool SetHeight(CString csHeight, bool bCloseDoc = true); // 设置层号 bool GetName(CString &csName, bool bCloseDoc = true); bool SetName(CString csName, bool bCloseDoc = true); // 设置行号 bool SetRowIndex(int nRowIndex, bool bCloseDoc = true); // 设置全部数据 bool SetData(CString csHeight, CString csName, int nRowIndex = -1, bool bCloseDoc = true); public: // 检查层高是否合法 bool IsHeightLegal(CString &csHeight); // 检查层号是否合法,同时给m_aryFloors赋值 bool IsNameLegal(CString &csName); }; // 楼层表处理系统 class TFloorRectDealSystem { public: TFloorRectDealSystem(const CString &csName); ~TFloorRectDealSystem(); private: // 数据成员 CString m_csProjectName; // 工程名称 CArray m_aryFloorTable; // 楼层表数组 CString m_csPrompt; // 警告提示语 public: // Set、Get函数 void SetProjectName(const CString &csName); // 工程名称 CString GetProjectName() const; // 获取工程名称 CString GetPrompt() const; // 获取提示语 public: // 处理连动 // 处理对象变化消息,主要处理复制、删除操作,更新楼层表对象 void ObjectAppended(const AcDbObject* dbObj); void ObjectModified(const AcDbObject* dbObj); void ObjectErased(const AcDbObject* dbObj); void ObjectUnerased(const AcDbObject* dbObj); public: // 表格数据和楼层框对象的数据交换,主要处理更新操作 // 根据楼层框对象更新工程数据,如果图纸已经打开,就不再进行楼层框ID的搜索以提高效率 bool UpdatePrjFloorFromObj(TProjectFloor *&pFloor, TFloorRectItem &item, bool IsDWGOpen = false, bool bCloseDoc = true); // 根据表行数据更新楼层框对象 bool UpdateObjFromRow(short nRow); // 更新处理系统 void UpdateDealSystem(); public: // 操作楼层表数组的函数 // 在数组中,查找指定数据的下标,未找到时返回-1 int FindItem(short nRow) const; // 获取一条楼层框数据,未找到时返回false bool GetItem(short nRow, TFloorRectItem &item); // 添加一条楼层框数据 // bReplace:判断是否覆盖已有相同索引的数据,覆盖时将相应楼层框的索引设置为-1 // bNotify:添加实体时是否捕获消息 bool AddItem(TFloorRectItem &item, bool bReplace = true, bool bNotify = false); // 根据item里的行号,更新一条楼层框数据 bool UpdateItem(TFloorRectItem &item); // 根据nRow,替换一条楼层框数据 // 若不存在与nRow相匹配的一条数据,则在添加数据到最后 void ReplaceItem(short nRow, TFloorRectItem &item); // 根据行号删除一条记录 // bDelEnt:是否同时删除实体,删除实体前将索引行号置为-1 // bNotify:删除实体时是否捕获消息 bool RemoveItem(short nRow, bool bDelEnt = true, bool bNotify = false, bool bCloseDoc = true); public: // 在整个工程里,检查是否存在重复楼层号,存在返回false bool CheckFloorNoInProject(const AcDbIntArray &aryFloors, short nIgnoreRow = -1); bool CheckAllFloors(); // 获得整个工程里的楼层号数组 bool GetFloors(AcDbIntArray &aryFloors) const; // 获得整个工程里的最大的楼层号,若工程内无楼层,返回0 int GetMaxFloorNo(); // 获得下一个默认楼层号(在最大楼层号基础上加1,并且已屏蔽掉0层) int GetNextFloorNo(); }; // sg add 100212,初始化楼层表处理系统 void InitFloorRectDealSystem(bool bTrue); #endif