Files
envi-code/SourceCode/Code2026/Dimension/AecDbSymbNorthThumb.cpp
T
2026-09-28 15:28:50 +08:00

624 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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点
}