Files
envi-code/SourceCode/Code2026/Dimension/AecDbSymbNorthThumb.cpp
T

623 lines
16 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
#include "globalDefine.h"
#include "globalFunc.h"
#include "AecDbText.h"
#include "AecDbSymbNorthThumb.h"
#include "PushProperty.h"
#include "DimOptionData.h"
//////////////////////////////////////////////////////////////
// 指北针
// 1-TArch8及以前版本;2-TArch9
// lxb add 111227,根据9.0需求,增加文字部分的内容
// const Adesk::UInt8 AecXDbSymbNorthThumb::g_nVersion = 1;
extern AcDbObjectId GetValidTextStyle(AcDbDatabase *pDb, const TCHAR *pStyle);
extern AcDbObjectId InitTextStyle(TTextStyle ts, AcDbDatabase *pDb = NULL);
extern AcDbObjectId InitLayer(const TCHAR *szLayer, AcDbDatabase *pDb = NULL);
const Adesk::UInt8 AecXDbSymbNorthThumb::g_nVersion = 2;
ACRX_DXF_DEFINE_MEMBERS(AecXDbSymbNorthThumb, AecXDbEntityBaseEx, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
1, AEC_ZHIBEIZHEN, "AEC_ZHIBEIZHEN|缺乏上华解释器, 请下载上华软件|网址: www.shanghuasoft.com");
AecXDbSymbNorthThumb::AecXDbSymbNorthThumb()
{
m_nRadius = 12.0;
m_nRotation = PI / 2.0;
// lxb add 111227,根据9.0需求,增加文字部分的内容
m_idTextStyle = InitTextStyle(TS_NORTHTHUMB);
m_dTextHeight = 5.0;
m_colorText = 7;
m_szText = _T("北");
m_ptText = ADSGePoint3d(0, 0);
}
AecXDbSymbNorthThumb::~AecXDbSymbNorthThumb()
{
}
BOOL AecXDbSymbNorthThumb::IsValid() const
{
//BOOL bRet = TDbEntity::IsValid();
//if (!bRet)
// return bRet;
BOOL bRet = (m_nRadius > 0.0);
return bRet;
}
// 提供对格式刷的支持
void AecXDbSymbNorthThumb::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
{
AssertWriteEnabled();
AecXDbEntityBaseEx::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
AecXDbSymbNorthThumb *pSrc = AecXDbSymbNorthThumb::cast(pSrcEntity);
if (pSrc)
{
m_nRadius = pSrc->m_nRadius;
m_nRotation = pSrc->m_nRotation;
// lxb add 111227,根据9.0需求,增加文字部分的内容
m_idTextStyle = pSrc->m_idTextStyle;
m_colorText = pSrc->m_colorText;
m_dTextHeight = pSrc->m_dTextHeight;
}
}
// 从DWG读入数据:
Acad::ErrorStatus AecXDbSymbNorthThumb::dwgInFields(AcDbDwgFiler* pFiler)
{
AssertWriteEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::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((AcGePoint2d *)&m_ptCenter);
pFiler->readItem(&m_nRadius);
pFiler->readItem(&m_nRotation);
// lxb add 111227,根据9.0需求,增加文字部分的内容
if (nVer > 1) // 2,TArch9版本
{
pFiler->readItem(&m_idTextStyle);
pFiler->readItem(&m_dTextHeight);
pFiler->readItem(&m_colorText);
GlobalFunc::ReadString(pFiler, m_szText);
pFiler->readItem((AcGePoint2d *)&m_ptText);
}
else // 1,TArch8及以前版本
{
if (database() == acdbCurDwg())
{
m_idTextStyle = InitTextStyle(TS_NORTHTHUMB);
}
else
{
m_idTextStyle = GetValidTextStyle(database(), _T("_TCH_NORTHTHUMB"));
}
m_dTextHeight = 5.0;
m_colorText = 7;
m_szText = _T("");
}
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbNorthThumb::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dwgOutFields(pFiler);
if (es != Acad::eOk)
return es;
pFiler->writeItem(g_nVersion);
pFiler->writeItem((const AcGePoint2d &)m_ptCenter);
pFiler->writeItem(m_nRadius);
pFiler->writeItem(m_nRotation);
pFiler->writeItem(m_idTextStyle);
pFiler->writeItem(m_dTextHeight);
pFiler->writeItem(m_colorText);
pFiler->writeItem((const TCHAR *)m_szText);
pFiler->writeItem((const AcGePoint2d &)m_ptText);
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbNorthThumb::dxfInFields(AcDbDxfFiler* pFiler)
{
return AecXDbEntityBaseEx::dxfInFields(pFiler);
}
Acad::ErrorStatus AecXDbSymbNorthThumb::dxfOutFields(AcDbDxfFiler* pFiler) const
{
return AecXDbEntityBaseEx::dxfOutFields(pFiler);
}
// -----------------------------------------------------------------------
// Overriden functions for edit
// to do:
// 允许通过夹点改变边界
Acad::ErrorStatus AecXDbSymbNorthThumb::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
ADSGePoint3d ptTemp;
// sg modify 111228,夹点位置也应该考虑布局转角,保持和绘制的代码一致
// ads_polar(m_ptCenter, m_nRotation, GetRadius(FALSE), ptTemp);
ads_polar(m_ptCenter, m_nLayoutRotation + m_nRotation, GetRadius(FALSE), ptTemp);
gripPoints.append(m_ptCenter); //0
gripPoints.append(ptTemp); //1
// lxb add 111227,根据9.0需求,增加文字位置夹点
ptTemp = GetWcsTextPt();
gripPoints.append(ptTemp);//2
return Acad::eOk;
}
Acad::ErrorStatus AecXDbSymbNorthThumb::subGetGripPoints(AcDbGripDataPtrArray & grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d & curViewDir, const int bitflags) const
{
return Acad::eNotImplementedYet;
}
// stretch points is diffrent from grep points, with no midpoint included
Acad::ErrorStatus
AecXDbSymbNorthThumb::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const
{
assertReadEnabled();
stretchPoints.append(m_ptCenter);
return Acad::eOk;
}
// Active when being rotated, scaled, moved, etc.
// Scale is disabled here
Acad::ErrorStatus AecXDbSymbNorthThumb::subTransformBy(const AcGeMatrix3d& xform)
{
AssertWriteEnabled();
AecXDbEntityBaseEx::subTransformBy(xform);
ads_matrix mat;
GlobalFunc::AsAdsMatrix(xform, mat);
ADSGePoint3d ptTemp;
// sg modify 111228,夹点位置也应该考虑布局转角,保持和绘制的代码一致
// ads_polar(m_ptCenter, m_nRotation, GetRadius(FALSE), ptTemp);
ads_polar(m_ptCenter, m_nLayoutRotation + m_nRotation, GetRadius(FALSE), ptTemp);
m_ptCenter.TransformBy(mat);
ptTemp.TransformBy(mat);
if (!g_Option::instance().g_bLayoutRotate)
{
//m_nRotation = ads_angle(m_ptCenter, ptTemp);
m_nRotation = ads_angle(m_ptCenter, ptTemp) - m_nLayoutRotation;
}
return Acad::eOk;
}
// 功能: 夹点操作
Acad::ErrorStatus AecXDbSymbNorthThumb::subMoveGripPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
AssertWriteEnabled();
ADSGePoint3d vtOffset(offset[0], offset[1]);
for (int i = 0; i < indices.length(); i++)
{
int idx = indices[i];
if (idx == 0) // 移动指北针
{
m_ptCenter += vtOffset;
}
else if (idx == 1) //移动指北针方向
{
ADSGePoint3d ptTemp;
// sg modify 111228,夹点位置也应该考虑布局转角,保持和绘制的代码一致
// ads_polar(m_ptCenter, m_nRotation, GetRadius(FALSE), ptTemp);
ads_polar(m_ptCenter, m_nLayoutRotation + m_nRotation, GetRadius(FALSE), ptTemp);
ptTemp += vtOffset;
// m_nRotation = ads_angle(m_ptCenter, ptTemp);
m_nRotation = ads_angle(m_ptCenter, ptTemp) - m_nLayoutRotation;
}
// lxb add 111227,根据9.0需求,增加文字位置夹点
else if (idx == 2) // 移动文字
{
ADSGePoint3d pt = GetTextPoint(FALSE);
pt += vtOffset;
SetTextPoint(pt);
}
}
return Acad::eOk;
}
// 功能: 夹点操作
Acad::ErrorStatus AecXDbSymbNorthThumb::subMoveStretchPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
AssertWriteEnabled();
m_ptCenter += offset;
return Acad::eOk;
}
// 取得夹点说明
Acad::ErrorStatus AecXDbSymbNorthThumb::GetGripText(int i, CString &cs) const
{
Acad::ErrorStatus es = Acad::eOk;
if (i == 0)
cs = _T("移动指北针");
else if (i == 1)
cs = _T("更改方向");
else if (i == 2) // lxb add 111227,根据9.0需求,增加文字位置夹点
cs = _T("移动文字");
return es;
}
//Acad::ErrorStatus AecXDbSymbNorthThumb::DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase)
//{
// Acad::ErrorStatus es = Acad::eOk;
// if (g_nSaveTArchVer < 7) // 7.0开始才有圆圈文字
// {
// BOOL bHasCircle = FALSE; // 是否存在圆圈文字
// long num = GetSubTextNum();
// if (num == 1)
// {
// SubText* pSubText = GetSubText(0);
// if (pSubText != NULL)
// {
// CString sText = pSubText->GetText();
// delete pSubText;
// if (sText.Find(_T("^C")) != -1)
// bHasCircle = TRUE; // 有圆圈文字,此时还要求完全炸开
// }
// }
//
// if (bHasCircle)
// {
// GlobalFunc::PushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, TRUE); // 完全分解
// GlobalFunc::PushMemVar<BOOL> vTemp2(XExplodeStream::m_bExportTch4, TRUE); // 保证炸开的图层正确,临时设置为全部炸开
// XExplodeStream dc(entSet);
// if (!OnExplodeOrDraw(dc)) // 解决导出后,无遮挡关系的BUG,必须有
// return Acad::eOk;
//
// dc.SetPropertiesFrom(this);
// if (nDrawMode == DRAW_2D)
// es = ExplodeOrDraw2d(dc);
// else
// es = ExplodeOrDraw3d(dc);
//
// if (bErase)
// *bErase = TRUE;
// return es;
// }
// }
//
// if (g_nSaveTArchVer < 9 && g_nSaveTArchVer > 3) // TArch9以前版本,需要分离文字
// {
// AecXDbSymbNorthThumb *pNorthThumb = NULL;
// {
// GlobalFunc::PushMemVar<int> vTemp(g_nSaveTArchVer, _TCH_VERSION);
// pNorthThumb = (AecXDbSymbNorthThumb*)clone();
// }
// entSet.append(pNorthThumb);
//
// AcDbObjectId idLayer = pNorthThumb->layerId();
//
// AecXDbText *pdbText = new AecXDbText;
// pdbText->CopyPropertiesFrom(this, 0);
// pdbText->SetPScale(GetPScale());
// pdbText->SetLocation(GetWcsTextPt());
// pdbText->SetText(m_szText);
// pdbText->SetHeight(m_dTextHeight);
// pdbText->SetStyleId(m_idTextStyle);
//
// // sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理
// if (g_nSymbTextT3Layer == 1) // 文字层
// pdbText->setLayer(::InitLayer(LAY_TEXT, database()));
// else // 符号层,白色
// {
// pdbText->setLayer(idLayer);
// pdbText->setColorIndex(m_colorText);
// }
//
// pdbText->SetAlignment(XExplodeDraw::kMiddleCenter);
// if (g_Option::instance().g_bNorthThumbTextDir == 0) // 半径方向
// {
// pdbText->SetRotation(m_nRotation - 0.5 * PI);
// }
// entSet.append(pdbText);
//
// if (bErase)
// {
// *bErase = TRUE;
// }
// return es;
// }
//
// return TDbEntity::DownGradeSave(nDrawMode, entSet, bErase);
//}
Acad::ErrorStatus
AecXDbSymbNorthThumb::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled();
GlobalFunc::_LoadConfig();
if (Has2DBuffer() && !dc.IsDragging())
{
dc.SetColor(colorIndex());
dc.SetLayer(layerId());
BaseEx::_Draw2DBuffers(dc, true);
return Acad::eOk;
}
if (!IsValid())
return Acad::eInvalidInput;
//dc << GeCircle(m_ptCenter, GetRadius(FALSE));
DrawCircle(dc, GeCircle(m_ptCenter, GetRadius(FALSE)));
ADSGePoint3d pt1, pt2;
ads_polar(m_ptCenter, m_nLayoutRotation + m_nRotation - PI, GetRadius(FALSE), pt1);
ads_polar(m_ptCenter, m_nLayoutRotation + m_nRotation, GetRadius(FALSE), pt2); // 文字近点
AcDbPolyline pline;
pline.setPropertiesFrom(this);
pline.addVertexAt(0, pt1);
pline.addVertexAt(1, pt2);
pline.setWidthsAt(0, GetRadius(FALSE) / 4.0, 0.0);
//dc.Polyline(pline);
DrawPline(dc, pline);
// lxb add 111227,根据9.0需求,增加文字
AecXDbText dbText;
dbText.setPropertiesFrom(this);
dbText.SetHeight(m_dTextHeight);
dbText.SetStyleId(m_idTextStyle);
// sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理
//if (dc.IsExportTch4() && g_nSymbTextT3Layer == 1)
//{
// dbText.setLayer(::InitLayer(LAY_TEXT, database()));
//}
//else
dbText.setColorIndex(m_colorText); // sg add 090608,文字和标注放在同一层,文字的颜色为白色
dbText.SetText(m_szText);
if (g_DimOption::instance().g_bNorthThumbTextDir == 0) // 半径方向
{
dbText.SetRotation(m_nRotation - 0.5 * PI);
}
dbText.SetLayoutRotation(m_nLayoutRotation);
dbText.SetAlignment(AcGiDraw::kMiddleCenter);
ADSGePoint3d ptText = GetWcsTextPt(); // 文字夹点位置,WCS
dbText.SetLocation(ptText);
PushProperty vProp(&dbText, dc);
//if (dc.IsFullExplode())
// dbText.ExplodeOrDraw2d(dc);
//else
//dc.DrawEntity(dbText);
DrawBaseEx(dc, dbText);
return Acad::eOk;
}
// sg add 110301,支持统一标高
bool AecXDbSymbNorthThumb::UnifyElevation(double dElevation)
{
AssertWriteEnabled();
m_ptCenter.z = dElevation;
return true;
}
const TCHAR *AecXDbSymbNorthThumb::GetDefaultLayer() const
{
extern TCHAR* LAY_NORTHTHUMB_DIM;
return LAY_NORTHTHUMB_DIM;
}
DrawModeType
AecXDbSymbNorthThumb::GetDrawType() const
{
return k2DOnly;
}
/* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */
void AecXDbSymbNorthThumb::GetTips(PtrList<ObjInfoUnit> &lstInfo) const
{
lstInfo.Append(new ObjInfoUnit(_T("对象类型"), _T("指北针")));
lstInfo.Append(new ObjInfoUnit(_T("北向角度:"), GlobalFunc::Angle2Str(GetRotation() * 180.0 / PI)));
lstInfo.Append(new ObjInfoUnit(_T("半径"), TCString(_T("%.1fP"), m_nRadius)));
// lxb add 111227,根据9.0需求,增加文字
lstInfo.Append(new ObjInfoUnit(_T("指北针文字"), m_szText));
}
ADSGePoint3d AecXDbSymbNorthThumb::GetNorthPoint() const
{
ADSGePoint3d ptTemp;
ads_polar(m_ptCenter, m_nLayoutRotation + m_nRotation, GetRadius(FALSE), ptTemp);
return ptTemp;
}
double AecXDbSymbNorthThumb::GetRotation() const
{
return m_nRotation;
}
double AecXDbSymbNorthThumb::GetRadius(BOOL bAsPaperUnit) const
{
double val = m_nRadius;
if (!bAsPaperUnit)
val *= GetPScale();
return val;
}
ADSGePoint3d AecXDbSymbNorthThumb::GetCenter() const
{
return m_ptCenter;
}
void AecXDbSymbNorthThumb::SetRotation(double val)
{
AssertWriteEnabled();
m_nRotation = val;
}
void AecXDbSymbNorthThumb::SetRadius(double nLen, BOOL bAsPaperUnit)
{
AssertWriteEnabled();
m_nRadius = nLen;
if (!bAsPaperUnit)
m_nRadius /= GetPScale();
}
void AecXDbSymbNorthThumb::SetCenter(ADSGePoint3d pt)
{
AssertWriteEnabled();
m_ptCenter = pt;
}
// lxb add 111227,根据9.0需求,增加文字
AcDbObjectId AecXDbSymbNorthThumb::GetTextStyleId() const
{
return m_idTextStyle;
}
void AecXDbSymbNorthThumb::SetTextStyleId(AcDbObjectId id)
{
AssertWriteEnabled();
m_idTextStyle = id;
}
double AecXDbSymbNorthThumb::GetTextHeight(BOOL bAsPaperUnit) const
{
double dHeight = m_dTextHeight;
if (!bAsPaperUnit)
{
dHeight *= GetPScale();
}
return dHeight;
}
void AecXDbSymbNorthThumb::SetTextHeight(double nHeight, BOOL bAsPaperUnit)
{
AssertWriteEnabled();
m_dTextHeight = nHeight;
if (!bAsPaperUnit)
{
m_dTextHeight /= GetPScale();
}
}
void AecXDbSymbNorthThumb::SetTextColor(Adesk::UInt16 color)
{
AssertWriteEnabled();
m_colorText = color;
}
Adesk::UInt16 AecXDbSymbNorthThumb::GetTextColor() const
{
return m_colorText;
}
void AecXDbSymbNorthThumb::SetText(const TCHAR *pszText)
{
AssertWriteEnabled();
m_szText = pszText;
}
const TCHAR* AecXDbSymbNorthThumb::GetText() const
{
return (const TCHAR *)m_szText;
}
ADSGePoint3d AecXDbSymbNorthThumb::GetTextPoint(BOOL bEcsPoint) const
{
if (bEcsPoint)
return m_ptText;
return GetWcsTextPt();
}
void AecXDbSymbNorthThumb::SetTextPoint(ADSGePoint3d pt)
{
AssertWriteEnabled();
AcGePoint2d ptOrigin = GetEcsOriginPt();
AcGeVector2d xAxis, yAxis;
GetEcsAxisVector(xAxis, yAxis);
AcGeMatrix2d mat2d;
mat2d = mat2d.alignCoordSys(
ptOrigin,
xAxis,
yAxis,
AcGePoint2d(0, 0),
AcGeVector2d(1, 0),
AcGeVector2d(0, 1));
AcGePoint2d ptResult(pt.x, pt.y);
ptResult.transformBy(mat2d);
m_ptText.x = ptResult.x / GetPScale();
m_ptText.y = ptResult.y / GetPScale();
}
AcGePoint2d AecXDbSymbNorthThumb::GetEcsOriginPt() const
{
ADSGePoint3d ptOrg; // ECS原点
GeLine line(m_ptCenter, GetNorthPoint());
ads_real rAngle = line.Direction();
acutPolar(m_ptCenter, rAngle, (GetRadius(FALSE) + m_dTextHeight * GetPScale()), ptOrg);
return (ptOrg.AsAcGePoint2d());
}
void AecXDbSymbNorthThumb::GetEcsAxisVector(AcGeVector2d &xAxis, AcGeVector2d &yAxis) const
{
yAxis = GetEcsOriginPt() - m_ptCenter.AsAcGePoint2d();
xAxis = yAxis;
xAxis.rotateBy(-0.5 * PI);
xAxis.normalize();
yAxis.normalize();
}
ADSGePoint3d AecXDbSymbNorthThumb::GetWcsTextPt() const
{
AcGePoint2d ptOrigin = GetEcsOriginPt();
AcGePoint2d ptResult(m_ptText.x * GetPScale(), m_ptText.y * GetPScale());
AcGeVector2d xAxis, yAxis;
GetEcsAxisVector(xAxis, yAxis);
AcGeMatrix2d mat2d;
mat2d = mat2d.alignCoordSys(
AcGePoint2d(0, 0),
AcGeVector2d(1, 0),
AcGeVector2d(0, 1),
ptOrigin,
xAxis,
yAxis);
ptResult.transformBy(mat2d);
return ADSGePoint3d(ptResult.x, ptResult.y);
}
ADSGePoint3d AecXDbSymbNorthThumb::GetDefaultTextLocation() const
{
ADSGePoint3d ptText = GetEcsOriginPt();
return ptText; // WCS点
}