//-----------------------------------------------------------------------------+ // 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; }