350 lines
6.6 KiB
C++
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;
|
|
}
|