// TDbCircleText.cpp: implementation of the TDbCircleText class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include "TDbCircleText.h" const Adesk::UInt8 TDbCircleText::g_nVersion = 1; ACRX_DXF_DEFINE_MEMBERS(ATSCircleText, ATSSymbWithText, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_CIRCLETEXT, "ATS_CIRCLETEXT图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbCircleText); ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// TDbCircleText::TDbCircleText() { m_csText = _T("空"); m_nRadius = 4; m_nLineWidth = 0.2; //m_bHasLeader = FALSE; } TDbCircleText::~TDbCircleText() { } Acad::ErrorStatus TDbCircleText::subGetClassID(CLSID* pClsid) const { // sg modify return Acad::eOk; } // 提供对格式刷的支持 void TDbCircleText::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { assertWriteEnabled(); TDbSymbWithText::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbCircleText *pSrc = TDbCircleText::cast(pSrcEntity); if (pSrc != NULL) { m_nLineWidth = pSrc->m_nLineWidth; m_nRadius = pSrc->m_nRadius; } } // 从DWG读入数据: Acad::ErrorStatus TDbCircleText::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbSymbWithText::dwgInFields(pFiler); if (es != Acad::eOk) return es; Adesk::UInt8 nVer; pFiler->readItem(&nVer); if (nVer>g_nVersion) { // Version is too new return Acad::eMakeMeProxy; } //////////////////////////////// pFiler->readItem(&m_idOwner); pFiler->readItem(&m_nRadius); pFiler->readItem(&m_nLineWidth); pFiler->readItem((AcGePoint2d *)&m_ptCenter); pFiler->readItem((AcGePoint2d *)&m_ptFrom); XString csTmp; ReadString(pFiler, csTmp); m_csText = (const TCHAR*)csTmp; return pFiler->filerStatus(); } Acad::ErrorStatus TDbCircleText::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = TDbSymbWithText::dwgOutFields(pFiler); if (es != Acad::eOk) return es; pFiler->writeItem(g_nVersion); pFiler->writeItem(m_idOwner); pFiler->writeItem(m_nRadius); pFiler->writeItem(m_nLineWidth); pFiler->writeItem((const AcGePoint2d &)m_ptCenter); pFiler->writeItem((const AcGePoint2d &)m_ptFrom); pFiler->writeItem((const TCHAR *)m_csText); return pFiler->filerStatus(); } Acad::ErrorStatus TDbCircleText::dxfInFields(AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es=TDbSymbWithText::dxfInFields(pFiler); return es; } Acad::ErrorStatus TDbCircleText::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es=Acad::eOk; es=TDbSymbWithText::dxfOutFields(pFiler); return es; } Acad::ErrorStatus TDbCircleText::subTransformBy(const AcGeMatrix3d &xform) { assertWriteEnabled(); Acad::ErrorStatus es = TDbSymbWithText::subTransformBy(xform); ads_matrix mat; AsAdsMatrix(xform, mat); m_ptCenter.TransformBy(mat); if (!!m_ptFrom) m_ptFrom.TransformBy(mat); return es; } Acad::ErrorStatus TDbCircleText::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); return subGetStretchPoints(gripPoints); } Acad::ErrorStatus TDbCircleText::subGetStretchPoints(AcGePoint3dArray & gripPoints) const { assertReadEnabled(); gripPoints.append(m_ptCenter); // gripPoints.append(m_ptFrom); return Acad::eOk; } // 功能: 夹点操作 Acad::ErrorStatus TDbCircleText::subMoveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); XPoint vtOffset(offset[0], offset[1]); for (int i = 0; i < indices.length(); i++) { int idx = indices[i]; if(idx==0) { // Move vertex m_ptCenter += vtOffset; } else if(idx==1) { m_ptFrom += vtOffset; } } return Acad::eOk; } // 功能: 夹点操作 Acad::ErrorStatus TDbCircleText::subMoveStretchPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); return subMoveGripPointsAt(indices, offset); } // 取得夹点说明 Acad::ErrorStatus TDbCircleText::GetGripText(int idx, CString &cs) const { if (idx == 0) cs = _T("移动标注点"); else if (idx == 1) cs = _T("移动引出点"); return Acad::eOk; } Acad::ErrorStatus TDbCircleText::ExplodeOrDraw2d(XExplodeDraw &dc) const { // cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制) AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead); if (player.openStatus() == Acad::eOk && player->isOff()) { return Acad::eOk; } assertReadEnabled(); double radius = m_nRadius*GetPScale(); double dThick = m_nLineWidth*GetPScale(); XCurveSegment seg; seg = XCircle(m_ptCenter, radius); if (dThick > _distSnap) { // 圆圈 AcDbPolyline pline; pline.addVertexAt(0, seg.StartPoint(), 1.0); pline.addVertexAt(1, seg.EndPoint(), 1.0); pline.setConstantWidth(dThick); pline.setClosed(Adesk::kTrue); dc.Polyline(pline); } else if (dThick < 0) { // 双圆 dc << XCircle(m_ptCenter, radius); radius -= 20; dc << XCircle(m_ptCenter, radius); } else { dc << XCircle(m_ptCenter, radius); } // ywb 2009-6-1 添加引线 Adesk::Boolean bHasLeader = GetDimHasLeader(); if (bHasLeader) { AcGeVector3d vt = m_ptCenter - m_ptFrom; vt.normalize(); XPoint ptOnCircle = m_ptCenter - vt * radius; XLine line(m_ptFrom, ptOnCircle); dc << line; } /* // sg modify if (!!m_ptFrom) { XPoint ptTrun; double angle = ads_angle(m_ptCenter, m_ptFrom); ads_polar(m_ptCenter, angle, m_nRadius*GetPScale(), ptTrun); XLine line(m_ptFrom, ptTrun, LS_FINITE); dc << line; } */ TDbText text; text.setPropertiesFrom(this); text.SetText(m_csText); text.SetStyleId(m_idTextStyle); if (!!m_idTextLayer) text.setLayer(m_idTextLayer); text.SetHeight(m_nTextHeight); text.SetLocation(m_ptCenter); text.SetAlignment(XExplodeDraw::kMiddleCenter); { TPushProperty vProp(&text, dc); if(dc.IsFullExplode()) text.ExplodeOrDraw2d(dc); else dc.DrawEntity(text); } return Acad::eOk; } // 取动态属性显示数据的函数 void TDbCircleText::GetTips(DList &lstInfo) const { lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("立管标注"))); lstInfo.Append(new TObjInfoUnit(_T("文字"), (const TCHAR*)m_csText)); lstInfo.Append(new TObjInfoUnit(_T("文字高度"), XString(_T("%.1fP"), m_nTextHeight))); XString sTextStyle = GetSymbolName(m_idTextStyle); lstInfo.Append(new TObjInfoUnit(_T("文字样式"), sTextStyle)); } // sg add void TDbCircleText::SetSubText(long i, CString sText) { assertWriteEnabled(); SetText(sText); } void InitDbCircleText(BOOL bTrue) { if (bTrue) { TDbCircleText::rxInit(); TDbCircleText::InitMatchProtocol(TRUE); } else { TDbCircleText::InitMatchProtocol(FALSE); deleteAcRxClass(TDbCircleText::desc()); } }