//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, SH Software Co. Ltd. // = FileName : SubText.cpp // = Version : ver2.0 // = Author : zjq // = CreateDate : 2002-09-09 // = Description: $字段类的定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "SubText.h" #include "AEntityBase.h" #include "AecCurveEntity.h" #include "AecEntity.h" #include "XDbObject.h" #include "PickSet.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(AecDbMText::desc()) _tcsicmp(m_pTextEnt->isA()->name(), _T("AecMText")) == 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 { //modify by zjq on 100303 调整AecDbtext关联 /*if (m_pTextEnt->isKindOf(AecDbText::desc())) { AecDbText* pText = AecDbText::cast(m_pTextEnt); return (const TCHAR*)pText->GetText(); } else if (m_pTextEnt->isKindOf(AecDbMText::desc())) { AecDbMText* pText = AecDbMText::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 ||_tcsicmp(strClassName,_T("TDbMTextNew")) == 0) { AecEntity *pTextEnt = AecEntity::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); return pText->contents(); } else { return _T(""); } } void SubText::SetText(CString sText) { //modify by zjq on 100303 调整AecDbtext关联 /*if (m_pTextEnt->isKindOf(AecDbText::desc())) { AecDbText* pText = AecDbText::cast(m_pTextEnt); pText->SetText(sText); } else if (m_pTextEnt->isKindOf(AecDbMText::desc())) { AEcDbMText* pText = AecDbMText::cast(m_pTextEnt); pText->SetText(sText); }*/ CString strClassName = m_pTextEnt->isA()->name(); if (_tcsicmp(strClassName, _T("TDbText")) == 0 || _tcsicmp(strClassName, _T("TDbMText")) == 0 || _tcsicmp(strClassName, _T("0TDbMTextNew")) ==0 ) { AecEntity *pTextEnt = AecEntity::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); if(NULL != pText) pText->setContents(sText); } } void SubText::GetExtent2d(XPoint &ptMin,XPoint&ptMax)const { AcDbExtents ext; m_pTextEnt->getGeomExtents(ext); ptMin = ext.minPoint(); ptMax = ext.maxPoint(); } AEntityBase* 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); AEntityBase *pRet = AecEntity::cast(pEnt); if (pRet != NULL) { return pRet; } else { return AecCurveEntity::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(AecDbSheet::desc())) if (_tcsicmp(pEnt->isA()->name(), _T("AecDbSheet")) != 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; } AEntityBase* pEntBase = OpenEntityBase(); if (pEntBase == NULL) { return NULL; } long iText = pEntBase->GetNexSubTextIndex(m_iText,bVert,bPre); if (m_iText == iText) { pEntBase->Close(); return NULL; } SubText*pNext = pEntBase->GetSubText(iText); pEntBase->Close(); return pNext; } 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 { AEntityBase* pEntBase = OpenEntityBase(true); if (pEntBase == NULL) { return; } pEntBase->SetSubText(m_iText,sText); pEntBase->Close(); } } GEOAPI SubText* HitTestOnText(PickSet& ss,XPoint pt) { SubText* pSubText = NULL; long count = ss.Length(); for (long i = 0; i < count && pSubText == NULL; i++) { CString sText; XPoint ptMin,ptMax; OPENOBJ_BEGIN(ss[i], AcDb::kForRead, AcDbEntity, pEnt); if (pEnt != NULL) { AecEntity*pEnt1 = AecEntity::cast(pEnt); if (pEnt1 != NULL) { pSubText = pEnt1->HitTestText(pt); } if (pSubText == NULL) { AecCurveEntity*pEnt2 = AecCurveEntity::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); } } } } OPENOBJ_END(); } return pSubText; }