Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/FloorRectReacter.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

168 lines
5.4 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