#include "stdafx.h" #include "PushMemVar.h" #include "AcDbObjectPtr.h" #include "globalFunc.h" #include "globalDefine.h" #include "XText.h" namespace { Acad::ErrorStatus PostToDb(AcDbEntity* ent, BOOL bClose) { Adesk::Boolean flag; if (bClose) flag = Adesk::kTrue; else flag = Adesk::kFalse; AcDbObjectId objId = GlobalFunc::AddToCurrentSpace(ent, flag); return Acad::eOk; } } AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE); XText::XText() { } XText::XText(const TCHAR* szText, XPoint ptPosition, double nHeight, double nScale, CString csTextStyle, CString csLayer) { xg_setvar(_T("TEXTSTYLE"), (const TCHAR*)csTextStyle); AcDbObjectId idTextStyle = GlobalFunc::GetTextStyleId(csTextStyle); m_ptInsert = ptPosition; m_pText = new AcDbText; m_pText->setPosition(ptPosition); m_pText->setHeight(nHeight); m_pText->setRotation(0); m_pText->setTextString(szText); m_pText->setTextStyle(idTextStyle); m_pText->setWidthFactor(nScale); m_pTgText = new AecXDbText; m_pTgText->SetStyleId(idTextStyle); m_pTgText->SetHeight(nHeight/GlobalFunc::DocGetPScale()); m_pTgText->SetText(szText); m_pTgText->SetLocation(ptPosition); m_csLayer = csLayer; m_nScale = nScale; m_nTextLength = 0.0; m_nRotate = 0.0; } XText::XText(Entity ent, BOOL bNew) { m_pTgText = NULL; m_pText = NULL; if(ent.Is(_T("TEXT"))){ OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbText, pEnt); if(pEnt){ m_idStyle = pEnt->textStyle(); m_nScale = pEnt->widthFactor(); m_nRotate = pEnt->rotation(); m_nHeight = pEnt->height(); m_vertMode = pEnt->verticalMode(); m_horzMode = pEnt->horizontalMode(); m_ptInsert = pEnt->position(); TCHAR *chlayer = pEnt->layer(); m_csLayer = chlayer; delete [] chlayer; TCHAR* pval = pEnt->textString(); m_csText = (const TCHAR*)pval; delete[] pval; } OPENOBJ_END(); if(bNew){ m_pText = new AcDbText; m_pText->setVerticalMode(m_vertMode); m_pText->setHorizontalMode(m_horzMode); m_pText->setLayer(m_csLayer); m_pText->setPosition(m_ptInsert); m_pText->setHeight(m_nHeight); m_pText->setRotation(m_nRotate); m_pText->setTextString(m_csText); m_pText->setTextStyle(m_idStyle); } } else if(ent.Is(_T("AEC_DANHTEXT"))){ OPENOBJ_BEGIN(ent, AcDb::kForRead, AecXDbText, pEnt); if(pEnt){ m_idStyle = pEnt->GetStyleId(); m_nRotate = pEnt->GetRotation(); m_nHeight = pEnt->GetHeight(); m_Align = pEnt->GetAlignment(); m_csText = (const TCHAR*)pEnt->GetText(); m_ptInsert = pEnt->GetLocation(); m_csLayer = (const TCHAR*)pEnt->layer(); TCHAR *chlayer = pEnt->layer(); m_csLayer = chlayer; delete [] chlayer; } OPENOBJ_END(); if(bNew){ m_pTgText = new AecXDbText; m_pTgText->setLayer(m_csLayer); m_pTgText->SetStyleId(m_idStyle); m_pTgText->SetHeight(m_nHeight); m_pTgText->SetAlignment(m_Align); m_pTgText->SetRotation(m_nRotate); m_pTgText->SetText(m_csText); m_pTgText->SetLocation(m_ptInsert); } } } XText::~XText() { if(m_pText) m_pText->close(); if(m_pTgText) m_pTgText->close(); } void XText::Draw(AcDb::TextVertMode vVerMode, AcDb::TextHorzMode nHorzMode) { InitLayer(m_csLayer); GlobalFunc::PushVarStr clayer(_T("LAYER"), m_csLayer); m_pText->setVerticalMode(vVerMode); m_pText->setHorizontalMode(nHorzMode); m_pText->setPosition(m_ptInsert); if(!m_ptAlign)//2007。9。20 对ACAD文字递增不支持“正中” m_pText->setAlignmentPoint(m_ptInsert); else m_pText->setAlignmentPoint(m_ptAlign); m_pText->setLayer(m_csLayer); PostToDb(m_pText, TRUE); m_pText = NULL; Entity ent; ent.GetLast(); XPoint ptLow, ptUp; ent.GetExtend(ptLow, ptUp); m_nTextLength = fabs(ptLow[0] - ptUp[0]); } void XText::TgDraw(AcGiDraw::TextAlignment Align) { InitLayer(m_csLayer); m_pTgText->SetAlignment(Align); m_pTgText->setLayer(m_csLayer); GlobalFunc::AddToModelSpace(m_pTgText, Adesk::kTrue); m_pTgText = NULL; } double XText::GetEntTextLength() { AcDbExtents extents; if(m_pText){ m_pText->getGeomExtents(extents); AcGePoint3d pMax = extents.maxPoint(); AcGePoint3d pMin = extents.minPoint(); double nTextLength = fabs(pMax[0] - pMin[0]); return nTextLength * m_nScale; } return 0; } void XText::SetInsertPoint(XPoint ptIns) { m_ptInsert = ptIns; if(m_pText){ m_pText->setPosition(ptIns); m_pText->setAlignmentPoint(ptIns); } if(m_pTgText) m_pTgText->SetLocation(ptIns); } void XText::SetText(const TCHAR* szText) { m_csText = szText; if(m_pText) m_pText->setTextString(m_csText); if(m_pTgText) m_pTgText->SetText(m_csText); } void XText::SetHeight(double nHeight) { m_nHeight = nHeight; if(m_pText) m_pText->setHeight(m_nHeight); if(m_pTgText) m_pTgText->SetHeight(m_nHeight/GlobalFunc::DocGetPScale()); } void XText::SetRotate(double nRotate) { m_nRotate = nRotate; if(m_pText) m_pText->setRotation(m_nRotate); if(m_pTgText) m_pTgText->SetRotation(m_nRotate); }