Files
envi-code/SourceCode/Code2026/tg_shs/shs_annotate/FindAndReplaceUtil.cpp
T
2026-09-28 15:28:50 +08:00

899 lines
22 KiB
C++

#include "StdAfx.h"
#include "FindAndReplaceUtil.h"
extern TARCH_IMPEXP BOOL g_bTextStyleEx;
//////////////////////////////////////////////////////////////////////////
// Zyu add on 101019,抽象类,定义不同类型对象对应的查找替换方法
CFAREntity::CFAREntity()
{
}
CFAREntity::~CFAREntity()
{
}
//////////////////////////////////////////////////////////////////////////
// 上华对象的查找替换类
// 搜索文字
TTextPosition CFARTDbEntity::FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
TEntityBase *pText = NULL;
if (pEnt->isKindOf(TDbEntity::desc()))
{
pText = (TEntityBase*)TDbEntity::cast(pEnt);
}
else if (pEnt->isKindOf(TDbCurveEntity::desc()))
{
pText = (TEntityBase*)TDbCurveEntity::cast(pEnt);
}
if (NULL != pText&& pEnt->isReadEnabled())
{
posFind = pText->FindSubText(sSubText, posStart, pRange);
}
return posFind;
}
// 替换文字
TTextPosition CFARTDbEntity::ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
TEntityBase *pText = NULL;
if (pEnt->isKindOf(TDbEntity::desc()))
{
pText = (TEntityBase*)TDbEntity::cast(pEnt);
}
else if (pEnt->isKindOf(TDbCurveEntity::desc()))
{
pText = (TEntityBase*)TDbCurveEntity::cast(pEnt);
}
if(NULL != pText && pEnt->isWriteEnabled())
{
posStart = pText->ReplaceSubText(posFind, szRepText);
}
return posStart;
}
//////////////////////////////////////////////////////////////////////////
// 块参照的查找替换类
CFARInsert::CFARInsert()
{
m_bFindAttrib = true;
m_bFindContent = true;
m_bFindXref = true;
m_bNoHidden = false;
}
// 查找文字
TTextPosition CFARInsert::FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
/*
算法描述:在块参照/外部参照中搜索文字对象的方法(支持查找块属性,支持块嵌套,支持动态块)
首先要明确的是,在块参照中只存在块属性的实体,块参照通过一个坐标系转换矩阵将对应的块表记录中的实体
表现出来,块表记录中存在块属性定义,它与块参照中的块属性对应,但在生成块参照之后,属性定义和属性之间就
不在相关,它们之间唯一的关系在于,当对参照和块表记录进行迭代遍历时,得到它们的顺序是相同的。对于动态块,
处于不可见性状态下的实体,在块表记录中,是以不可见状态(AcDb::kInvisible)保存的。
在CFARUtil类中,聚合了所有支持对象的查找替换方法类,当对一个实体进行查找时,首先被CFARUtil类进行分
析,根据实体类型匹配不同的查找方法,如果是一个块参照/外部参照,将使用如下描述的方法:
首先得到块参照中的 所有块属性的id,然后打开对应的块表记录,得到所有的块属性定义的id,形成块属性和
块属性定义的对应关系。
然后对块表记录进行迭代遍历,在遍历之前,首先要恢复到上一次搜索结束的位置。
最后,在遍历过程中得到的实体,都要根据其状态和查找选项的设置判断是否进一步查找,如果继续搜索,则创
建一个新的CFARUtil类来完成工作。
在这个查找的过程中,如果是嵌套的块,则会出现递归。类成员中的m_arObjId,记录了打开实体的顺序,用于
恢复上一次查找结束时,对应的实体。
*/
// 查找到的位置
TTextPosition posFind;
if (pEnt != NULL && pEnt->isReadEnabled())
{
// 转为块参照的指针
AcDbBlockReference *pRef = AcDbBlockReference::cast(pEnt);
if (NULL != pRef)
{
// 查找块属性文字
if (m_bFindAttrib)
{
// 得到块参照的所有属性ID
GetAttribIds(pRef);
}
// 块参照与块表记录中实体的位置转换矩阵
AcGeMatrix3d matrix = pRef->blockTransform();
// 打开块表记录
OPENOBJ_BEGIN(pRef->blockTableRecord(), AcDb::kForRead, AcDbBlockTableRecord, pBlkRec);
if (pBlkRec != NULL)
{
// 是否继续搜索
bool bContinue = false;
// 是否是外部参照
bool bIsXref = pBlkRec->isFromExternalReference() || pBlkRec->isFromOverlayReference();
// 不是外部参照或者可以查找外部参照,则继续查找
bContinue = !bIsXref || m_bFindXref;
if (bContinue)
{
if (m_bFindAttrib)
{
// 得到块表记录的所有属性定义的ID
GetAttribDefIds(pBlkRec);
}
// 对块表记录进行迭代查看
AcDbBlockTableRecordIterator *pIter = NULL;
if (Acad::eOk == pBlkRec->newIterator(pIter))
{
// 继续从上一次搜索结束的位置开始查找
// 调整迭代器指针,指向m_arObjId中的第一个id代表的实体
AcDbObjectId entId;
pIter->getEntityId(entId);
//wlw del 130708 测试信息应该删掉
SeekBlockRecIter(pIter);
pIter->getEntityId(entId);
for (; !pIter->done(); pIter->step())
{
AcDbEntity *pEntity = NULL;
// 打开块表记录中的实体
if (Acad::eOk == pIter->getEntity(pEntity, AcDb::kForRead))
{
// 判断实体是否满足搜索选项要求
if (ContinueFind(pEntity, bIsXref))
{
bool bIsAttrib = pEntity->isKindOf(AcDbAttributeDefinition::desc());
// 如果pEntity指向的是一个块属性定义,则令指针pEntity指向属性定义在块参照中对应的实体
if (bIsAttrib)
{
AcDbObjectId objIdAttrib;
// 匹配属性和属性定义的ID
int iIndex = -1;
m_arAttribDefId.find(pEntity->id(), iIndex);
if (iIndex > -1 && iIndex < m_arAttribId.length())
{
objIdAttrib = m_arAttribId.at(iIndex);
}
if (objIdAttrib.isValid())
{
AcDbEntity *pTempEnt = NULL;
// 打开对应的属性
if (Acad::eOk == acdbOpenAcDbEntity(pTempEnt, objIdAttrib, AcDb::kForRead))
{
pEntity->close();
pEntity = pTempEnt;
AcDbAttribute *pAttr = (AcDbAttribute*)pTempEnt;
CString strAttr = pAttr->textString();
}
}
}
// 使用查找替换工具类对pEntity进行进一步的查找
CFARUtil farUtil;
farUtil.SetFindOption(true, true, true, m_bNoHidden);
// 传递当前的id数组,以便进一步恢复现场
farUtil.SetEntityIds(m_arObjId);
posFind = farUtil.FindEntText(pEntity, sSubText, posStart, pRange);
// 查找成功
if (!!posFind)
{
AcDbObjectId __id = pEntity->id();
// 更新id数组
ClearObjIdArray(m_arObjId);
m_arObjId.append(farUtil.GetEntityIds());
m_arObjId.insertAt(0, pEntity->id());
// 如果当前的实体不是属性实体,则要将pRang指示框从块表记录
// 的坐标系转到块参照的坐标系
if (!bIsAttrib)
{
TransformRange(pRange, matrix);
}
pEntity->close();
break;
}
}
ClearObjIdArray(m_arObjId);
posStart.m_nCookies = 0;
posStart.m_nTextPos = -1;
pEntity->close();
}
}
if (pIter->done())
{
ClearObjIdArray(m_arAttribId);
ClearObjIdArray(m_arAttribDefId);
}
delete pIter;
}
}
}
OPENOBJ_END();
}
}
return posFind;
}
// 替换文字
TTextPosition CFARInsert::ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
if (m_arObjId.length() != 0 && m_arObjId.last().isValid())
{
// 打开ID对应的实体,调用查找替换工具类的方法进行替换
OPENOBJ_BEGIN(m_arObjId.last(), AcDb::kForWrite, AcDbEntity, pEntity);
CFARUtil farUtil;
posStart = farUtil.ReplaceEntText(pEntity, posFind, szRepText);
OPENOBJ_END();
}
return posStart;
}
// 设置实体数组
void CFARInsert::SetEntityIds(const AcDbObjectIdArray& arObjId)
{
m_arObjId.append(arObjId);
}
// 得到实体数组
const AcDbObjectIdArray& CFARInsert::GetEntityIds() const
{
return m_arObjId;
}
// 设置搜索选项
void CFARInsert::SetFindInsertOption(BOOL bFindAttrib, BOOL bFindContent, BOOL bFindXref, BOOL bNoHidden)
{
m_bFindAttrib = bFindAttrib;
m_bFindContent = bFindContent;
m_bFindXref = bFindXref;
m_bNoHidden = bNoHidden;
}
// 根据给出的矩阵关系,转换指示文本范围的线框位置
void CFARInsert::TransformRange(TTextRange *& pRange, const AcGeMatrix3d &matrix) const
{
if (pRange != NULL)
{
int iLen = pRange->m_lstRanges.Length();
for (int i = 0; i < iLen; i++)
{
pRange->m_lstRanges.GetAt(i)->TransformBy(matrix);
}
}
}
// 得到块参照的所有属性ID
void CFARInsert::GetAttribIds(AcDbBlockReference *pRef)
{
// 如果内容不为空,说明当前是在查找同一实体,不重复进行遍历
if (m_arAttribId.length() != 0)
{
return;
}
AcDbObjectIterator *pObjIter = pRef->attributeIterator();
for (pObjIter->start(); !pObjIter->done(); pObjIter->step())
{
m_arAttribId.append(pObjIter->objectId());
}
delete pObjIter;
}
// 得到块表记录中所有属性定义的ID
void CFARInsert::GetAttribDefIds(AcDbBlockTableRecord *pBlkRec)
{
// 如果内容不为空,说明当前是在查找同一实体,不重复进行遍历
if (m_arAttribDefId.length() != 0)
{
return;
}
AcDbBlockTableRecordIterator *pIter = NULL;
if (Acad::eOk == pBlkRec->newIterator(pIter))
{
AcDbEntity *pEnt = NULL;
for (pIter->start(); !pIter->done(); pIter->step())
{
if (Acad::eOk == pIter->getEntity(pEnt, AcDb::kForRead))
{
// 当前实体是属性定义,则添加到数组中
if (pEnt->isKindOf(AcDbAttributeDefinition::desc()))
{
m_arAttribDefId.append(pEnt->objectId());
}
pEnt->close();
}
}
delete pIter;
pIter = NULL;
}
}
// 调整迭代器指针,指向m_arObjId中的第一个id代表的实体
bool CFARInsert::SeekBlockRecIter(AcDbBlockTableRecordIterator *pIter)
{
Acad::ErrorStatus es = Acad::eOk;
if (m_arObjId.length() != 0)
{
// 取出ID数组中的第一个ID
AcDbObjectId objId = m_arObjId.first();
m_arObjId.removeFirst();
int iIndex = -1;
// 如果在属性id数组中存在该id,说明是一个块属性的id,
// seek迭代器指针到块表记录中对应的属性定义实体
// m_arAttribId.find(m_arObjId.first(), iIndex);
m_arAttribId.find(objId, iIndex);
if (iIndex != -1)
{
objId = m_arAttribDefId.at(iIndex);
}
es = pIter->seek(objId);
if (Acad::eOk != es)
{
for (; !pIter->done(); pIter->step())
{
AcDbObjectId objIdTemp;
if (pIter->getEntityId(objIdTemp) == Acad::eOk)
{
if (objId == objIdTemp)
{
es = Acad::eOk;
break;
}
}
}
}
}
return (Acad::eOk == es);
}
// 判断实体是否满足搜索选项要求,不满足返回false
bool CFARInsert::ContinueFind(AcDbEntity *pEnt, bool bIsXref) const
{
bool bContinue = false;
if (NULL != pEnt && pEnt->isReadEnabled())
{
// 是否是属性定义
bool bIsAttrib = pEnt->isKindOf(AcDbAttributeDefinition::desc());
if (bIsAttrib)
{
bContinue = !!m_bFindAttrib;
}
// 所在块是否是外部参照
else if (bIsXref)
{
bContinue = !!m_bFindXref;
}
// 是否查找块内容
else
{
bContinue = !!m_bFindContent;
}
// 如果实体是隐藏的并且搜索时要忽略隐藏选项,则不继续搜索
if (m_bNoHidden && pEnt->visibility() == AcDb::kInvisible)
{
bContinue = false;
}
}
return bContinue;
}
// 重新开始搜索
void CFARInsert::ResetFind()
{
// 清空数组
ClearObjIdArray(m_arObjId);
ClearObjIdArray(m_arAttribId);
ClearObjIdArray(m_arAttribDefId);
}
// 清空id数组
void CFARInsert::ClearObjIdArray(AcDbObjectIdArray &arObjId)
{
int iLen = arObjId.length();
if (0 != iLen)
{
arObjId.removeSubArray(0, iLen - 1);
}
}
//////////////////////////////////////////////////////////////////////////
// 块属性的查找替换类
CFARInsertAttrib::CFARInsertAttrib()
{
m_bNoHidden = false;
}
TTextPosition CFARInsertAttrib::FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
if (pEnt != NULL && pEnt->isReadEnabled())
{
AcDbAttribute *pAttrib = AcDbAttribute::cast(pEnt);
if (NULL != pAttrib)
{
// 如果忽略隐藏项并且当前的块属性是隐藏的,则返回
if (m_bNoHidden && pAttrib->isInvisible())
{
return posFind;
}
else
{
#if (ADS > 17)
// 是多行的属性,则使用多行文字的查找方法
if (pAttrib->isMTextAttribute())
{
AcDbMText *pMText = pAttrib->getMTextAttribute();
CFARMText farMText;
posFind = farMText.FindText(pMText, sSubText, posStart, pRange);
delete pMText;
}
// 否则使用单行文字的查找方法
else
#endif
{
CFARText farText;
posFind = farText.FindText(pEnt, sSubText, posStart, pRange);
}
}
}
}
return posFind;
}
TTextPosition CFARInsertAttrib::ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
if (pEnt != NULL && pEnt->isWriteEnabled())
{
AcDbAttribute *pAttrib = AcDbAttribute::cast(pEnt);
if (pAttrib != NULL)
{
#if (ADS > 17)
// 是多行的属性,则使用多行文字的替换方法
if (pAttrib->isMTextAttribute())
{
AcDbMText *pMText = pAttrib->getMTextAttribute();
CFARMText farMText;
posStart = farMText.ReplaceText(pMText, posFind, szRepText);
if (!!posFind)
{
pAttrib->setMTextAttribute(pMText);
}
}
// 否则使用单行文字的替换方法
else
#endif
{
CFARText farText;
posStart = farText.ReplaceText(pEnt, posFind, szRepText);
}
}
}
return posStart;
}
// 设置忽略隐藏项
void CFARInsertAttrib::SetNoHidden(BOOL bNoHidden)
{
m_bNoHidden = bNoHidden;
}
// 单行文字的查找替换类
TTextPosition CFARText::FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
CStringArray arString;
CString sSrcText(sSubText);
posStart.m_nCookies = 0;
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
TDbText text;
AcDbText *pText = AcDbText::cast(pEnt);
// 单行文字转成上华单行文字,再做查找
if(text.ConvertFrom(pText))
{
posFind = text.FindSubText(sSrcText, posStart, pRange);
}
return posFind;
}
TTextPosition CFARText::ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
TDbText text;
AcDbText *pText=AcDbText::cast(pEnt);
// 单行文字转成上华单行文字,再做替换
if(text.ConvertFrom(pText))
{
posStart = text.ReplaceSubText(posFind, szRepText);
pText->setTextString((const TCHAR *)text.GetText());
}
return posStart;
}
// 得到单行文字内的字符串
bool CFARText::GetEntityStrings(AcDbEntity *pEnt, CStringArray &arString)
{
AcDbText *pEntity = AcDbText::cast(pEnt);
if (NULL != pEnt && pEnt->isReadEnabled())
{
LPTSTR pszText = pEntity->textString();
arString.Add(pszText);
delete[] pszText;
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////////
// 多行文字的查找替换类
TTextPosition CFARMText::FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
AcDbVoidPtrArray arEnts;
// 将多行文字对象炸开成单行文字,再进行查找
if (Acad::eOk == pEnt->explode(arEnts))
{
CFARText farText;
for (int i = posStart.m_nCookies; i < arEnts.length(); i++)
{
posFind = farText.FindText((AcDbEntity*)arEnts.at(i), sSubText, posStart, pRange);
if (!!posFind)
{
posFind.m_nCookies = i;
posStart.m_nCookies = i;
posStart.m_nTextPos = posFind.m_nTextPos + 1;
break;
}
else
{
posStart.m_nTextPos = -1;
}
}
ReleaseEntSet(arEnts);
}
return posFind;
}
TTextPosition CFARMText::ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
if (!pEnt->isWriteEnabled())
{
return posStart;
}
CStringArray arString;
// 得到多行文字包含的所有字符串
if (GetEntityStrings(pEnt, arString))
{
CString sChange;
CString sContent;
// 取出要替换的字符串
sChange = arString.GetAt(posFind.m_nCookies);
// 替换文字
sChange.Delete(posFind.m_nTextPos, (int)posFind.m_nBufLen);
sChange.Insert(posFind.m_nTextPos, szRepText);
// 放回被替换的字符串
arString.SetAt(posFind.m_nCookies, sChange);
// 重新组合成AcdbMText格式的字符串
INT_PTR iLen = arString.GetSize();
for (int i = 0; i < iLen; i++)
{
if (i + 1 != iLen)
{
sContent += arString.GetAt(i) + _T("\\P");
}
else
{
sContent += arString.GetAt(i) ;
}
}
AcDbMText *pMText = AcDbMText::cast(pEnt);
if (pMText != NULL && pMText->isWriteEnabled())
{
// 更新字符串内容
pMText->setContents(sContent);
// 修改下一个搜索开始的位置
posStart.m_nCookies = posFind.m_nCookies;
posStart.m_nBufLen = _tcslen(szRepText);
posStart.m_nTextPos = posFind.m_nTextPos + (int)posStart.m_nBufLen;
}
}
return posStart;
}
// 得到多行文字内的字符串
bool CFARMText::GetEntityStrings(AcDbEntity *pEnt, CStringArray &arString)
{
if (pEnt != NULL && pEnt->isReadEnabled())
{
AcDbVoidPtrArray arEnts;
if ( Acad::eOk == pEnt->explode(arEnts))
{
int iNum = arEnts.length();
CFARText farText;
for (int i = 0; i < iNum; i++)
{
AcDbEntity *pEntity = (AcDbEntity*)arEnts.at(i);
if (pEntity->isKindOf(AcDbText::desc()))
{
farText.GetEntityStrings(pEntity, arString);
}
}
ReleaseEntSet(arEnts);
return true;
}
}
return false;
}
//////////////////////////////////////////////////////////////////////////
// 标注的查找替换类
TTextPosition CFARDimension::FindText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
AcDbDimension *pDim = AcDbDimension::cast(pEnt);
if (NULL != pDim)
{
AcDbVoidPtrArray arEnts;
// 炸开标注对象,从其中的多行文字对象中进行查找
if (Acad::eOk == pDim->explode(arEnts))
{
CFARMText farMtext;
for(int i = 0; i < arEnts.length(); i++)
{
AcDbEntity *pEntity = (AcDbEntity*)arEnts.at(i);
AcDbMText *pText = AcDbMText::cast(pEntity);
if (NULL != pText)
{
posFind = farMtext.FindText(pText, sSubText, posStart, pRange);
break;
}
}
ReleaseEntSet(arEnts);
}
}
return posFind;
}
TTextPosition CFARDimension::ReplaceText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
AcDbDimension *pDim = AcDbDimension::cast(pEnt);
if (NULL != pDim && pDim->isWriteEnabled())
{
AcDbVoidPtrArray arEnts;
// 炸开标注对象,替换其中的多行文字对象
if (Acad::eOk == pDim->explode(arEnts))
{
CFARMText farMtext;
for(int i = 0; i < arEnts.length(); i++)
{
AcDbEntity *pEntity = (AcDbEntity*)arEnts.at(i);
AcDbMText *pText = AcDbMText::cast(pEntity);
if (NULL != pText)
{
posStart = farMtext.ReplaceText(pText, posFind, szRepText);
if (!!posStart)
{
LPTSTR pszContents = pText->contents();
pDim->setDimensionText(pszContents);
pDim->recomputeDimBlock();
delete[] pszContents;
}
break;
}
}
ReleaseEntSet(arEnts);
}
}
return posStart;
}
//////////////////////////////////////////////////////////////////////////
// 查找替换工具集
// 查找文字
TTextPosition CFARUtil::FindEntText(TEntitySet ent, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
if(sSubText == NULL)
return posFind;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
posFind = FindEntText(pEnt, sSubText, posStart, pRange);
OPENOBJ_END();
return posFind;
}
TTextPosition CFARUtil::FindEntText(AcDbEntity *pEnt, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
if (pEnt != NULL && pEnt->isReadEnabled())
{
// 忽略隐藏层上的实体
if (m_bNoHidden)
{
if (IsHiddenEntity(pEnt))
{
return posFind;
}
}
// 所有上华对象,使用统一的函数
if (pEnt->isKindOf(TDbEntity::desc()) || pEnt->isKindOf(TDbCurveEntity::desc()))
{
posFind = m_TDbEntity.FindText(pEnt, sSubText, posStart, pRange);
}
// 属性定义
else if (pEnt->isKindOf(AcDbAttribute::desc()))
{
posFind = m_InsertAttrib.FindText(pEnt, sSubText, posStart, pRange);
}
// 单行文字
else if (pEnt->isKindOf(AcDbText::desc()))
{
posFind = m_Text.FindText(pEnt, sSubText, posStart, pRange);
}
// 多行文字
else if (pEnt->isKindOf(AcDbMText::desc()))
{
posFind = m_MText.FindText(pEnt, sSubText, posStart, pRange);
}
// 块参照/外部参照
else if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
posFind = m_Insert.FindText(pEnt, sSubText, posStart, pRange);
}
// 标注
else if (pEnt->isKindOf(AcDbDimension::desc()))
{
posFind = m_Dimension.FindText(pEnt, sSubText, posStart, pRange);
}
}
return posFind;
}
// 替换文字
TTextPosition CFARUtil::ReplaceEntText(TEntitySet ent, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt);
if (pEnt != NULL)
{
posStart = ReplaceEntText(pEnt, posFind, szRepText);
}
OPENOBJ_END();
return posStart;
}
TTextPosition CFARUtil::ReplaceEntText(AcDbEntity *pEnt, TTextPosition posFind, const TCHAR *szRepText)
{
TTextPosition posStart;
if (NULL != pEnt && pEnt->isWriteEnabled())
{
// 上华对象
if(pEnt->isKindOf(TDbEntity::desc()) || pEnt->isKindOf(TDbCurveEntity::desc()))
{
posStart = m_TDbEntity.ReplaceText(pEnt, posFind, szRepText);
}
// 块属性
else if (pEnt->isKindOf(AcDbAttribute::desc()))
{
posStart = m_InsertAttrib.ReplaceText(pEnt, posFind, szRepText);
}
// 单行文字
else if(pEnt->isKindOf(AcDbText::desc()))
{
posStart = m_Text.ReplaceText(pEnt, posFind, szRepText);
}
// 多行文字
else if (pEnt->isKindOf(AcDbMText::desc()))
{
posStart = m_MText.ReplaceText(pEnt, posFind, szRepText);
}
// 块参照/外部参照
else if(pEnt->isKindOf(AcDbBlockReference::desc()))
{
posStart = m_Insert.ReplaceText(pEnt, posFind, szRepText);
}
// 标注
else if (pEnt->isKindOf(AcDbDimension::desc()))
{
posStart = m_Dimension.ReplaceText(pEnt, posFind, szRepText);
}
}
return posStart;
}
// 设置id数组
void CFARUtil::SetEntityIds(const AcDbObjectIdArray &arObjId)
{
m_Insert.SetEntityIds(arObjId);
}
// 获得id数组
const AcDbObjectIdArray& CFARUtil::GetEntityIds() const
{
return m_Insert.GetEntityIds();
}
// 设置查找选项
void CFARUtil::SetFindOption(BOOL bFindAttrib, BOOL bFindContent, BOOL bFindXref, BOOL bNoHidden)
{
m_Insert.SetFindInsertOption(bFindAttrib, bFindContent, bFindXref, bNoHidden);
m_InsertAttrib.SetNoHidden(bNoHidden);
m_bNoHidden = bNoHidden;
}
// 重新开始搜索
void CFARUtil::ResetFind()
{
m_Insert.ResetFind();
}
// 判断实体是否是在关闭或者隐藏层上
bool CFARUtil::IsHiddenEntity(AcDbEntity *&pEnt)
{
// 返回值
bool bRet = false;
if (pEnt != NULL && pEnt->isReadEnabled())
{
LPTSTR pszLayerName = pEnt->layer();
// 在记录中查找
if (!m_mapLayer.Lookup(pszLayerName, bRet))
{
// 如果记录中不存在,则打开图层判断,并记录结果
bRet = IsHiddenLayer(pEnt->layerId());
m_mapLayer.SetAt(pszLayerName, bRet);
}
delete[] pszLayerName;
}
return bRet;
}
// 判断id对应的层是否是关闭或者隐藏层
bool CFARUtil::IsHiddenLayer(const AcDbObjectId &objIdLayer) const
{
if (objIdLayer.isValid())
{
OPENOBJ_BEGIN(objIdLayer, AcDb::kForRead, AcDbLayerTableRecord, pLayer);
if (pLayer != NULL)
{
// 判断是否是关闭或者隐藏层
return (pLayer->isOff() || pLayer->isFrozen());
}
OPENOBJ_END();
}
return false;
}