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

350 lines
6.6 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : TSubText.cpp
// = Version : ver2.0
// = Author : xlc
// = CreateDate : 2002-09-09
// = Description: 上华字段类的定义
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#include "StdAfx.h"
#include "TSubText.h"
#include "TEntityBase.h"
#include "TDbCurveEntity.h"
#include "TDbEntity.h"
#include "TAcDbObjectPtr.h"
#include "TPickEntSet.h"
TSubText::TSubText(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(TDbMText::desc())
_tcsicmp(m_pTextEnt->isA()->name(), _T("TDbMText")) == 0
|| m_pTextEnt->isKindOf(AcDbMText::desc()));
if (bAcadEntity)
{
m_iFlag |= ACAD_ENTITY;
}
}
TSubText::~TSubText()
{
if (m_pTextEnt != NULL)
{
delete m_pTextEnt;
}
}
int TSubText::GetMenuType()const
{
return m_iMenuType;
}
void TSubText::SetMenuType(int type)
{
m_iMenuType = type;
}
void TSubText::SetIndex(long i)
{
m_iText = i;
}
long TSubText::GetIndex()const
{
return m_iText;
}
void TSubText::SetObjectId(AcDbObjectId id)
{
m_idEnt = id;
}
AcDbObjectId TSubText::GetObjectId()const
{
return m_idEnt;
}
void TSubText::SetMultiLine(bool bML)
{
if (bML)
{
m_iFlag |= MULTI_LINE;
}
else
{
m_iFlag &= ~MULTI_LINE;
}
}
bool TSubText::IsMultiLine()const
{
return (m_iFlag & MULTI_LINE) != 0;
}
bool TSubText::IsAcadEntity()const
{
return (m_iFlag & ACAD_ENTITY) != 0;
}
const AcDbEntity* TSubText::GetTextEntity()const
{
return m_pTextEnt;
}
CString TSubText::GetText()const
{
//modify by xlc on 100303 调整TDbtext关联
/*if (m_pTextEnt->isKindOf(TDbText::desc()))
{
TDbText* pText = TDbText::cast(m_pTextEnt);
return (const TCHAR*)pText->GetText();
}
else if (m_pTextEnt->isKindOf(TDbMText::desc()))
{
TDbMText* pText = TDbMText::cast(m_pTextEnt);
return (const TCHAR*)pText->GetText();
}*/
CString strClassName = m_pTextEnt->isA()->name();
if (_tcsicmp(strClassName, _T("TDbText")) == 0
|| _tcsicmp(strClassName, _T("TDbMText")) == 0)
{
TDbEntity *pTextEnt = TDbEntity::cast(m_pTextEnt);
return pTextEnt->TBaseGetText();
}
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 ADS>17
return pText->text();//wlw mod 13.0628
#else
return pText->contents();//wlw mod 13.0628
#endif
}
else
{
return _T("");
}
}
void TSubText::SetText(CString sText)
{
//modify by xlc on 100303 调整TDbtext关联
/*if (m_pTextEnt->isKindOf(TDbText::desc()))
{
TDbText* pText = TDbText::cast(m_pTextEnt);
pText->SetText(sText);
}
else if (m_pTextEnt->isKindOf(TDbMText::desc()))
{
TDbMText* pText = TDbMText::cast(m_pTextEnt);
pText->SetText(sText);
}*/
CString strClassName = m_pTextEnt->isA()->name();
if (_tcsicmp(strClassName, _T("TDbText")) == 0
|| _tcsicmp(strClassName, _T("TDbMText")) == 0)
{
TDbEntity *pTextEnt = TDbEntity::cast(m_pTextEnt);
pTextEnt->TBaseSetText(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 TSubText::GetExtent2d(TADSGePoint3d &ptMin,TADSGePoint3d&ptMax)const
{
AcDbExtents ext;
m_pTextEnt->getGeomExtents(ext);
ptMin = ext.minPoint();
ptMax = ext.maxPoint();
}
TEntityBase* TSubText::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);
TEntityBase *pRet = TDbEntity::cast(pEnt);
if (pRet != NULL)
{
return pRet;
}
else
{
return TDbCurveEntity::cast(pEnt);
}
}
void TSubText::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();
}
}
TSubText* TSubText::GetNext(bool bVert,bool bPre)const
{
if (IsAcadEntity())
{
return NULL;
}
TEntityBase* pEntBase = OpenEntityBase();
if (pEntBase == NULL)
{
return NULL;
}
long iText = pEntBase->GetNextSubTextIndex(m_iText,bVert,bPre);
if (m_iText == iText)
{
pEntBase->Close();
return NULL;
}
TSubText*pNext = pEntBase->GetSubText(iText);
pEntBase->Close();
return pNext;
}
void TSubText::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
{
TEntityBase* pEntBase = OpenEntityBase(true);
if (pEntBase == NULL)
{
return;
}
pEntBase->SetSubText(m_iText,sText);
pEntBase->Close();
}
}
GEOAPI TSubText* HitTestOnText(TPickEntSet& ss,TADSGePoint3d pt)
{
TSubText* pSubText = NULL;
long count = ss.Length();
for (long i = 0; i < count && pSubText == NULL; i++)
{
CString sText;
TADSGePoint3d ptMin,ptMax;
OPENOBJ_BEGIN(ss[i], AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt != NULL)
{
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 TSubText(pEnt->objectId(),(AcDbEntity*)pEnt->clone(),0,true);
}
else
{//wlw mod 130625
AcDbMText*pEnt4 = AcDbMText::cast(pEnt);
if (pEnt4 != NULL)
{
pSubText = new TSubText(pEnt->objectId(),(AcDbEntity*)pEnt->clone(),0,true);
}
}
}
}
}
OPENOBJ_END();
}
return pSubText;
}