Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

278 lines
7.3 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());
}
}