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

331 lines
6.1 KiB
C++

#include "StdAfx.h"
#include "SubText.h"
#include "AecDbMText.h"
#include "AcDbObjectPtr.h"
#include "PickEntSet.h"
SubText::SubText(AcDbObjectId id,AcDbEntity*pTextEnt,long iText,bool bAcadEntity)
: m_idEnt(id),m_pTextEnt(pTextEnt),m_iText(iText),m_iMenuType(0),m_iFlag(0)
{
AcDbEntity*pEnt = NULL;
if (bAcadEntity) //上华对象中的ACAD文字
{
m_iMenuType = 3;
}
else if (m_pTextEnt->isKindOf(AcDbText::desc())
|| m_pTextEnt->isKindOf(AcDbMText::desc()))
{
m_iMenuType = 0;
}
else //上华文字
{
m_iMenuType = 1;
}
SetMultiLine(m_pTextEnt->isKindOf(AecXDbMText::desc())
||_tcsicmp(m_pTextEnt->isA()->name(), _T("AecXDbMText")) == 0
|| m_pTextEnt->isKindOf(AcDbMText::desc()));
if (bAcadEntity)
{
m_iFlag |= ACAD_ENTITY;
}
}
SubText::~SubText()
{
if (m_pTextEnt != NULL)
{
delete m_pTextEnt;
}
}
int SubText::GetMenuType()const
{
return m_iMenuType;
}
void SubText::SetMenuType(int type)
{
m_iMenuType = type;
}
void SubText::SetIndex(long i)
{
m_iText = i;
}
long SubText::GetIndex()const
{
return m_iText;
}
void SubText::SetObjectId(AcDbObjectId id)
{
m_idEnt = id;
}
AcDbObjectId SubText::GetObjectId()const
{
return m_idEnt;
}
void SubText::SetMultiLine(bool bML)
{
if (bML)
{
m_iFlag |= MULTI_LINE;
}
else
{
m_iFlag &= ~MULTI_LINE;
}
}
bool SubText::IsMultiLine()const
{
return (m_iFlag & MULTI_LINE) != 0;
}
bool SubText::IsAcadEntity()const
{
return (m_iFlag & ACAD_ENTITY) != 0;
}
const AcDbEntity* SubText::GetTextEntity()const
{
return m_pTextEnt;
}
CString SubText::GetText()const
{
CString strClassName = m_pTextEnt->isA()->name();
if (_tcsicmp(strClassName, _T("AecXDbText")) == 0
|| _tcsicmp(strClassName, _T("AecXDbMText")) == 0)
{
AecXDbText *pTextEnt = AecXDbText::cast(m_pTextEnt);
return pTextEnt->GetText();
}
else if (m_pTextEnt->isKindOf(AcDbText::desc()))
{
AcDbText*pText = AcDbText::cast(m_pTextEnt);
return pText->textString();
}
else if (m_pTextEnt->isKindOf(AcDbMText::desc()))
{
AcDbMText* pText = AcDbMText::cast(m_pTextEnt);
#if ARX>17
return pText->text();//wlw mod 13.0628
#else
return pText->contents();//wlw mod 13.0628
#endif
}
else
{
return _T("");
}
}
void SubText::SetText(CString sText)
{
CString strClassName = m_pTextEnt->isA()->name();
if (_tcsicmp(strClassName, _T("AecXDbText")) == 0
|| _tcsicmp(strClassName, _T("AecXDbMText")) == 0)
{
AecXDbText *pTextEnt = AecXDbText::cast(m_pTextEnt);
pTextEnt->SetText(sText);
}
else if (m_pTextEnt->isKindOf(AcDbText::desc()))
{
AcDbText*pText = AcDbText::cast(m_pTextEnt);
pText->setTextString(sText);
}
else
{
AcDbMText* pText = AcDbMText::cast(m_pTextEnt);
pText->setContents(sText);
}
}
void SubText::GetExtent2d(ADSGePoint3d &ptMin,ADSGePoint3d&ptMax)const
{
AcDbExtents ext;
m_pTextEnt->getGeomExtents(ext);
ptMin = ext.minPoint();
ptMax = ext.maxPoint();
}
BaseEx* SubText::OpenEntityBase(bool bWrite)const
{
if (m_idEnt.isNull() || !m_idEnt.isValid())
{
return NULL;
}
AcDbEntity*pEnt = NULL;
acdbOpenObject(pEnt, m_idEnt, bWrite ? AcDb::kForWrite : AcDb::kForRead);
BaseEx *pRet = AecXDbEntityBaseEx::cast(pEnt);
if (pRet != NULL)
{
return pRet;
}
else
{
return AecXDbCurveBaseEx::cast(pEnt);
}
}
void SubText::Highlight(bool bHL)const
{
if (m_idEnt.isNull() || !m_idEnt.isValid())
{
return;
}
AcDbEntity*pEnt = NULL;
acdbOpenObject(pEnt,m_idEnt,AcDb::kForRead);
if (pEnt != NULL)
{
//if (!pEnt->isKindOf(TDbSheet::desc()))
if (_tcsicmp(pEnt->isA()->name(), _T("TDbSheet")) != 0)
{
if (bHL)
{
pEnt->highlight();
}
else
{
pEnt->unhighlight();
}
}
else
{
pEnt->draw();
}
pEnt->close();
}
}
SubText* SubText::GetNext(bool bVert,bool bPre)const
{
if (IsAcadEntity())
{
return NULL;
}
OPENOBJ_BEGIN(m_idEnt, AcDb::kForWrite, AecXDbCurveBaseEx, pEnt)
if (pEnt)
{
long iText = pEnt->GetNextSubTextIndex(m_iText, bVert, bPre);
if (m_iText != iText)
{
SubText *pNext = pEnt->GetSubText(iText);
return pNext;
}
return NULL;
}
OPENOBJ_END()
OPENOBJ_BEGIN(m_idEnt, AcDb::kForWrite, AecXDbEntityBaseEx, pEnt)
if (pEnt)
{
long iText = pEnt->GetNextSubTextIndex(m_iText, bVert, bPre);
if (m_iText != iText)
{
SubText *pNext = pEnt->GetSubText(iText);
return pNext;
}
return NULL;
}
OPENOBJ_END()
return NULL;
}
void SubText::Update(CString sText)
{
if (IsAcadEntity())
{
if (m_idEnt.isNull() || !m_idEnt.isValid())
{
return;
}
AcDbEntity*pEnt = NULL;
acdbOpenObject(pEnt,m_idEnt,AcDb::kForWrite);
if (pEnt != NULL)
{
AcDbText*pText1 = AcDbText::cast(pEnt);
if (pText1 != NULL)
{
pText1->setTextString(sText);
}
pEnt->close();
}
}
else
{
//如果是AecXDbText或其它 标注符号 实体 则进行处理
OPENOBJ_BEGIN(m_idEnt, AcDb::kForWrite, AecXDbCurveBaseEx, pEnt)
if (pEnt)
{
pEnt->SetSubText(m_iText, sText);
}
OPENOBJ_END()
OPENOBJ_BEGIN(m_idEnt, AcDb::kForWrite, AecXDbEntityBaseEx, pEnt)
if (pEnt)
{
pEnt->SetSubText(m_iText, sText);
}
OPENOBJ_END()
}
}
SubText* HitTestOnText(PickEntSet& ss,ADSGePoint3d pt)
{
SubText* pSubText = NULL;
long count = ss.Length();
for (long i = 0; i < count && pSubText == NULL; i++)
{
CString sText;
ADSGePoint3d ptMin,ptMax;
OPENOBJ_BEGIN(ss[i], AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt != NULL)
{
// 如果是AecXDbText或其它 标注符号 实体 则进行处理
//TDbEntity*pEnt1 = TDbEntity::cast(pEnt);
//if (pEnt1 != NULL)
//{
// pSubText = pEnt1->HitTestText(pt);
//}
//if (pSubText == NULL)
//{
// TDbCurveEntity*pEnt2 = TDbCurveEntity::cast(pEnt);
// if (pEnt2 != NULL)
// {
// pSubText = pEnt2->HitTestText(pt);
// }
// if (pSubText == NULL)
// {
// AcDbText*pEnt3 = AcDbText::cast(pEnt);
// if (pEnt3 != NULL)
// {
// pSubText = new SubText(pEnt->objectId(),(AcDbEntity*)pEnt->clone(),0,true);
// }
// else
// {//wlw mod 130625
// AcDbMText*pEnt4 = AcDbMText::cast(pEnt);
// if (pEnt4 != NULL)
// {
// pSubText = new SubText(pEnt->objectId(),(AcDbEntity*)pEnt->clone(),0,true);
// }
// }
// }
//}
}
OPENOBJ_END();
}
return pSubText;
}