#ifndef _FINDANDREPLACE_H_ #define _FINDANDREPLACE_H_ #include "StdAfx.h" ////////////////////////////////////////////////////////////////////////// // Zyu add on 101019,抽象类,定义不同类型对象对应的查找替换方法 class CFAREntity { public: CFAREntity(); virtual ~CFAREntity(); // 搜索文字 virtual TTextPosition FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) = 0; // 替换文字 virtual TTextPosition ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText) = 0; }; ////////////////////////////////////////////////////////////////////////// // 上华对象的查找替换类 class CFARTDbEntity : CFAREntity { public: // 搜索文字 virtual TTextPosition FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); // 替换文字 virtual TTextPosition ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText); }; ////////////////////////////////////////////////////////////////////////// // 块参照的查找替换类 class CFARInsert : CFAREntity { public: CFARInsert(); // 查找文字 virtual TTextPosition FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); // 替换文字 virtual TTextPosition ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText); // 设置实体数组 void SetEntityIds(const AcDbObjectIdArray& arObjId); // 得到实体数组 const AcDbObjectIdArray& GetEntityIds() const; // 设置搜索选项 void SetFindInsertOption(BOOL bFindAttrib, BOOL bFindContent, BOOL bFindXref, BOOL bNoHidden); // 重新开始搜索 void ResetFind(); protected: // 根据给出的矩阵关系,转换指示文本范围的线框位置 void TransformRange(TTextRange *& pRange, const AcGeMatrix3d &matrix) const; // 得到块参照的所有属性ID void GetAttribIds(AcDbBlockReference *pRef); // 得到块表记录中所有属性定义的ID void GetAttribDefIds(AcDbBlockTableRecord *pBlkRec); // 调整迭代器指针,指向m_arObjId中的第一个id代表的实体 bool SeekBlockRecIter(AcDbBlockTableRecordIterator *pIter); // 判断实体是否满足搜索选项要求,不满足返回false bool ContinueFind(AcDbEntity *pEnt, bool bIsXref) const; // 清空id数组 void ClearObjIdArray(AcDbObjectIdArray &arObjId); private: AcDbObjectIdArray m_arObjId; // 记录打开实体的顺序 AcDbObjectIdArray m_arAttribId; // 块参照的所有属性ID AcDbObjectIdArray m_arAttribDefId; // 块表记录的所有属性定义的ID BOOL m_bFindAttrib; // 搜索块属性 BOOL m_bFindContent; // 搜索块内容 BOOL m_bFindXref; // 搜索外部参照 BOOL m_bNoHidden; // 忽略不可见块属性 }; ////////////////////////////////////////////////////////////////////////// // 块属性的查找替换类 class CFARInsertAttrib : CFAREntity { public: CFARInsertAttrib(); virtual TTextPosition FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); virtual TTextPosition ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText); // 设置忽略隐藏项 void SetNoHidden(BOOL bNoHidden); private: BOOL m_bNoHidden; // 忽略不可见块属性 }; ////////////////////////////////////////////////////////////////////////// // 单行文字的查找替换类 class CFARText : CFAREntity { public: virtual TTextPosition FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); virtual TTextPosition ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText); // 得到单行文字内的字符串 virtual bool GetEntityStrings(AcDbEntity *pEnt, CStringArray &arString); }; ////////////////////////////////////////////////////////////////////////// // 多行文字的查找替换类 class CFARMText : CFAREntity { public: virtual TTextPosition FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); virtual TTextPosition ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText); // 得到多行文字内的字符串 bool GetEntityStrings(AcDbEntity *pEnt, CStringArray &arString); }; ////////////////////////////////////////////////////////////////////////// // 标注的查找替换类 class CFARDimension : CFAREntity { public: virtual TTextPosition FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); virtual TTextPosition ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText); }; ////////////////////////////////////////////////////////////////////////// typedef CMap CMapLayer; // 图层名称和是否关闭或者冻结的关系映射类 // 查找替换工具集 class CFARUtil { public: // 查找文字 TTextPosition FindEntText(TEntitySet ent, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); TTextPosition FindEntText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange); // 替换文字 TTextPosition ReplaceEntText(TEntitySet ent, TTextPosition posFind, const TCHAR *szRepText); TTextPosition ReplaceEntText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText); // id数组的Set/Get函数 void SetEntityIds(const AcDbObjectIdArray &arObjId); const AcDbObjectIdArray& GetEntityIds() const; // 设置查找选项 void SetFindOption(BOOL bFindAttrib, BOOL bFindContent, BOOL bFindXref, BOOL bNoHidden); // 重新开始搜索 void ResetFind(); protected: // 判断实体是否是在关闭或者隐藏层上 bool IsHiddenEntity(AcDbEntity *&pEnt); // 判断id对应的层是否是关闭或者隐藏层 bool IsHiddenLayer(const AcDbObjectId &objIdLayer) const; private: CFARTDbEntity m_TDbEntity; // 上华对象的查找替换方法 CFARInsertAttrib m_InsertAttrib; // 块属性的查找替换方法 CFARInsert m_Insert; // 块参照/外部参照的查找替换方法 CFARText m_Text; // 单行文字的查找替换方法 CFARMText m_MText; // 多行文字的查找替换方法 CFARDimension m_Dimension; // 标注的查找替换方法 BOOL m_bNoHidden; // 标记是否忽略隐藏项 CMapLayer m_mapLayer; // 记录图层的隐藏信息 }; ////////////////////////////////////////////////////////////////////////// #endif