168 lines
4.8 KiB
C++
168 lines
4.8 KiB
C++
#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<TFloorRectItem, TFloorRectItem> 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 |