278 lines
7.1 KiB
C++
278 lines
7.1 KiB
C++
// TDbCircleText.cpp: implementation of the TDbCircleText class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include <dbtext.h>
|
|
#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<TObjInfoUnit> &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());
|
|
}
|
|
} |