#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; }