847 lines
22 KiB
C++
847 lines
22 KiB
C++
#include "StdAfx.h"
|
||||
|
|
#include "AecDbSymbCoord.h"
|
|||
|
|
#include "AecDbText.h"
|
|||
|
|
|
|||
|
|
const Adesk::UInt8 AecXDbSymbCoord::g_nVersion = 5;
|
|||
|
|
|
|||
|
|
ACRX_DXF_DEFINE_MEMBERS(AecXDbSymbCoord, AecXDbSymbWithText, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
|
|||
|
|
1, AEC_ZUOBIAOBIAOZHU, "AEC_ZUOBIAOBIAOZHU|缺乏上华解释器, 请下载上华软件|网址: www.shanghuasoft.com");
|
|||
|
|
|
|||
|
|
AecXDbSymbCoord::AecXDbSymbCoord()
|
|||
|
|
{
|
|||
|
|
m_nFlag = 0;
|
|||
|
|
m_nQuadrant = 0;
|
|||
|
|
|
|||
|
|
// if (g_Option::instance().g_bCoordPrec2) // modified by whl on 04/06/15
|
|||
|
|
// m_nFlag |= SCF_PREC2;
|
|||
|
|
if (g_Option::instance().g_bCoordPrec2)
|
|||
|
|
SetPrecNum(2);
|
|||
|
|
else
|
|||
|
|
SetPrecNum(3);
|
|||
|
|
|
|||
|
|
m_nStyle = AecXDbSymbMultiLeader::kNone;
|
|||
|
|
m_dText2BaseRatio = -1000; // 使用GlobalFunc::DocGetText2BaseRatio,sg add 081113
|
|||
|
|
|
|||
|
|
m_dTextBaseLen = 100000; // lxb add 120104,文字基线长度,用100000表示使用默认长度
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
AecXDbSymbCoord::~AecXDbSymbCoord()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const TCHAR* AecXDbSymbCoord::GetDefaultLayer()const
|
|||
|
|
{
|
|||
|
|
extern TCHAR* LAY_COORD_DIM;
|
|||
|
|
return LAY_COORD_DIM;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//Acad::ErrorStatus
|
|||
|
|
//AecXDbSymbCoord::subGetClassID(CLSID* pClsid) const
|
|||
|
|
//{
|
|||
|
|
// *pClsid = CLSID_ComSymbCoord;
|
|||
|
|
// return Acad::eOk;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
// 提供对格式刷的支持
|
|||
|
|
void AecXDbSymbCoord::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
AecXDbSymbWithText::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
|
|||
|
|
AecXDbSymbCoord *pSrc = AecXDbSymbCoord::cast(pSrcEntity);
|
|||
|
|
if (pSrc != NULL)
|
|||
|
|
{
|
|||
|
|
m_nFlag = pSrc->m_nFlag; // 控制标记
|
|||
|
|
m_nStyle = pSrc->m_nStyle;
|
|||
|
|
m_dText2BaseRatio = pSrc->m_dText2BaseRatio; // 文字距基线系数,sg add 081113
|
|||
|
|
|
|||
|
|
m_dTextBaseLen = pSrc->m_dTextBaseLen; // 文字基线长度,add by lxb on 120104
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 从DWG读入数据:
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::dwgInFields(AcDbDwgFiler* pFiler)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
Acad::ErrorStatus es = AecXDbSymbWithText::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_nFlag);
|
|||
|
|
pFiler->readItem(&m_nQuadrant);
|
|||
|
|
pFiler->readItem((AcGePoint2d *)&m_ptLocation);
|
|||
|
|
pFiler->readItem((AcGePoint2d *)&m_ptValue);
|
|||
|
|
|
|||
|
|
if (nVer < 2) {
|
|||
|
|
m_ptTurn = _GetTurnPoint();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pFiler->readItem((AcGePoint2d *)&m_ptTurn);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (nVer > 2)
|
|||
|
|
{
|
|||
|
|
Adesk::UInt8 nTemp;
|
|||
|
|
pFiler->readItem(&nTemp);
|
|||
|
|
m_nStyle = (AecXDbSymbMultiLeader::TArrowStyle)nTemp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (nVer > 3) // sg add 081113,8.0版本为4
|
|||
|
|
pFiler->readItem(&m_dText2BaseRatio);
|
|||
|
|
else
|
|||
|
|
m_dText2BaseRatio = -1000;
|
|||
|
|
|
|||
|
|
// 文字基线长度,add by lxb on 120104
|
|||
|
|
if (nVer > 4) // TArch9为5
|
|||
|
|
pFiler->readItem(&m_dTextBaseLen);
|
|||
|
|
else
|
|||
|
|
m_dTextBaseLen = 100000;
|
|||
|
|
|
|||
|
|
return pFiler->filerStatus();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::dwgOutFields(AcDbDwgFiler* pFiler) const
|
|||
|
|
{
|
|||
|
|
assertReadEnabled();
|
|||
|
|
Acad::ErrorStatus es = AecXDbSymbWithText::dwgOutFields(pFiler);
|
|||
|
|
if (es != Acad::eOk)
|
|||
|
|
return es;
|
|||
|
|
|
|||
|
|
pFiler->writeItem(g_nVersion);
|
|||
|
|
|
|||
|
|
pFiler->writeItem(m_nFlag);
|
|||
|
|
pFiler->writeItem(m_nQuadrant);
|
|||
|
|
pFiler->writeItem((const AcGePoint2d &)m_ptLocation);
|
|||
|
|
pFiler->writeItem((const AcGePoint2d &)m_ptValue);
|
|||
|
|
|
|||
|
|
pFiler->writeItem((const AcGePoint2d &)m_ptTurn);
|
|||
|
|
pFiler->writeItem((Adesk::UInt8)m_nStyle);
|
|||
|
|
pFiler->writeItem(m_dText2BaseRatio);
|
|||
|
|
pFiler->writeItem(m_dTextBaseLen);
|
|||
|
|
|
|||
|
|
return pFiler->filerStatus();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::dxfInFields(AcDbDxfFiler* pFiler)
|
|||
|
|
{
|
|||
|
|
return AecXDbSymbWithText::dxfInFields(pFiler);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::dxfOutFields(AcDbDxfFiler* pFiler) const
|
|||
|
|
{
|
|||
|
|
return AecXDbSymbWithText::dxfOutFields(pFiler);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// -----------------------------------------------------------------------
|
|||
|
|
// Active when being rotated, scaled, moved, etc.
|
|||
|
|
// Scale is disabled here
|
|||
|
|
// Modified on 2002/2/5 by ZJQ
|
|||
|
|
// 原先没有按米制单位进行标注
|
|||
|
|
Acad::ErrorStatus
|
|||
|
|
AecXDbSymbCoord::subTransformBy(const AcGeMatrix3d& xform)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
AecXDbSymbWithText::subTransformBy(xform);
|
|||
|
|
|
|||
|
|
ads_matrix mat;
|
|||
|
|
GlobalFunc::AsAdsMatrix(xform, mat);
|
|||
|
|
m_ptLocation.TransformBy(mat);
|
|||
|
|
m_ptLocation.z = 0;
|
|||
|
|
m_ptTurn.TransformBy(mat);
|
|||
|
|
m_ptTurn.z = 0;
|
|||
|
|
|
|||
|
|
if (g_Option::instance().g_bDynamicCoord)
|
|||
|
|
{
|
|||
|
|
m_ptValue = m_ptLocation;
|
|||
|
|
// sg add 120413,转换坐标的时候,需要考虑当前坐标系,转换为当前坐标系下的点,进行标注
|
|||
|
|
GlobalFunc::WCS2UCS(m_ptValue);
|
|||
|
|
if (!GlobalFunc::DocGetMeterUnitDraw())
|
|||
|
|
m_ptValue /= 1000.0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
//Vector3D vt=m_ptTurn-m_ptLocation;
|
|||
|
|
double nAngle = ads_angle(m_ptLocation, m_ptTurn);
|
|||
|
|
nAngle = Wcs2Layout(nAngle);
|
|||
|
|
if (nAngle >= 0.0 && nAngle < PI / 2)
|
|||
|
|
m_nQuadrant = 0;
|
|||
|
|
else if (nAngle >= PI / 2 && nAngle < PI)
|
|||
|
|
m_nQuadrant = 1;
|
|||
|
|
else if (nAngle >= PI && nAngle < PI * 1.5)
|
|||
|
|
m_nQuadrant = 2;
|
|||
|
|
else
|
|||
|
|
m_nQuadrant = 3;
|
|||
|
|
}
|
|||
|
|
return Acad::eOk;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Overriden functions for edit
|
|||
|
|
// to do:
|
|||
|
|
// 允许通过夹点改变边界
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::subGetGripPoints(AcGePoint3dArray& gripPoints,
|
|||
|
|
AcDbIntArray& osnapModes,
|
|||
|
|
AcDbIntArray& geomIds) const
|
|||
|
|
{
|
|||
|
|
assertReadEnabled();
|
|||
|
|
gripPoints.append(m_ptLocation);
|
|||
|
|
gripPoints.append((AcGePoint3d &)GetTurnPoint());
|
|||
|
|
|
|||
|
|
// lxb add 120104,文字基线长度夹点
|
|||
|
|
ADSGePoint3d ptTextBaseLen;
|
|||
|
|
ads_polar(m_ptTurn, m_nLayoutRotation, GetTrueTextBaseLen(FALSE), ptTextBaseLen);
|
|||
|
|
gripPoints.append(ptTextBaseLen);
|
|||
|
|
|
|||
|
|
return Acad::eOk;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::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
|
|||
|
|
AecXDbSymbCoord::subGetStretchPoints(AcGePoint3dArray & gripPoints) const
|
|||
|
|
{
|
|||
|
|
AcDbIntArray ar;
|
|||
|
|
return subGetGripPoints(gripPoints, ar, ar);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 功能: 夹点操作
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::subMoveGripPointsAt(
|
|||
|
|
const AcDbIntArray& indices,
|
|||
|
|
const AcGeVector3d& offset)
|
|||
|
|
{
|
|||
|
|
// sg modify 120104,修改判断条件,当同时选中前2个夹点的时候,认为是整体MOVE
|
|||
|
|
// if(indices.length()>1) {
|
|||
|
|
if (indices.contains(0) && indices.contains(1)) {
|
|||
|
|
AcGeMatrix3d mat;
|
|||
|
|
mat.setToTranslation(offset);
|
|||
|
|
return subTransformBy(mat);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// sg add 120104,同时选中文字基线的2个夹点时,不修改文字基线长度
|
|||
|
|
BOOL bSkipTextBaseLen = FALSE;
|
|||
|
|
if (indices.contains(1) && indices.contains(2))
|
|||
|
|
bSkipTextBaseLen = TRUE;
|
|||
|
|
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
ADSGePoint3d vtOffset(offset[0], offset[1]);
|
|||
|
|
for (int i = 0; i < indices.length(); i++) {
|
|||
|
|
int idx = indices[i];
|
|||
|
|
if (idx == 0)
|
|||
|
|
{ //整体移动
|
|||
|
|
m_ptLocation += vtOffset;
|
|||
|
|
|
|||
|
|
if (g_Option::instance().g_bDynamicCoord)
|
|||
|
|
{
|
|||
|
|
m_ptValue = m_ptLocation;
|
|||
|
|
// sg add 120413,转换坐标的时候,需要考虑当前坐标系,转换为当前坐标系下的点,进行标注
|
|||
|
|
GlobalFunc::WCS2UCS(m_ptValue);
|
|||
|
|
if (!GlobalFunc::DocGetMeterUnitDraw())
|
|||
|
|
m_ptValue /= 1000.0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (idx == 1)
|
|||
|
|
{ //改方向
|
|||
|
|
ADSGePoint3d ptTurn = GetTurnPoint();
|
|||
|
|
ptTurn += vtOffset;
|
|||
|
|
Vector3D vt = ptTurn - m_ptLocation;
|
|||
|
|
double nAngle = ads_angle(ADSGePoint3d(), vt);
|
|||
|
|
nAngle = GlobalFunc::AngleRangeTo2PI(nAngle - m_nLayoutRotation);
|
|||
|
|
if (nAngle >= 0.0 && nAngle < PI / 2)
|
|||
|
|
m_nQuadrant = 0;
|
|||
|
|
else if (nAngle >= PI / 2 && nAngle < PI)
|
|||
|
|
m_nQuadrant = 1;
|
|||
|
|
else if (nAngle >= PI && nAngle < PI * 1.5)
|
|||
|
|
m_nQuadrant = 2;
|
|||
|
|
else
|
|||
|
|
m_nQuadrant = 3;
|
|||
|
|
SetTurnPoint(ptTurn);
|
|||
|
|
} // end if
|
|||
|
|
else if (idx == 2) // 移动文字基线 add by lxb on 120104
|
|||
|
|
{
|
|||
|
|
if (bSkipTextBaseLen) // 同时选中文字基线的2个夹点时,不修改文字基线长度
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
ADSGePoint3d vtOffset1 = vtOffset;
|
|||
|
|
vtOffset1.Rotate(-GetLayoutRotation());
|
|||
|
|
double dLen = GetTrueTextBaseLen(FALSE);
|
|||
|
|
dLen += vtOffset1.x;
|
|||
|
|
|
|||
|
|
double nFactor = (m_nQuadrant == 0 || m_nQuadrant == 3) ? 1 : -1;
|
|||
|
|
SetTextBaseLen(nFactor * dLen, FALSE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return Acad::eOk;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 功能: 夹点操作
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::subMoveStretchPointsAt(
|
|||
|
|
const AcDbIntArray& indices,
|
|||
|
|
const AcGeVector3d& offset)
|
|||
|
|
{
|
|||
|
|
return subMoveGripPointsAt(indices, offset);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 取得夹点说明
|
|||
|
|
Acad::ErrorStatus AecXDbSymbCoord::GetGripText(int idx, CString &cs) const
|
|||
|
|
{
|
|||
|
|
Acad::ErrorStatus es = Acad::eOk;
|
|||
|
|
if (idx == 0)
|
|||
|
|
{
|
|||
|
|
cs = _T("移动位置");
|
|||
|
|
//cs += IsDynamic()? _T("-更新坐标") : _T("不更新坐标");
|
|||
|
|
}
|
|||
|
|
else if (idx == 1)
|
|||
|
|
cs = _T("翻转、移动文字");
|
|||
|
|
else if (idx == 2) // 移动文字基线 add by lxb on 120104
|
|||
|
|
{
|
|||
|
|
cs = _T("移动文字基线");
|
|||
|
|
}
|
|||
|
|
return es;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ADSGePoint3d AecXDbSymbCoord::GetTurnPoint() const
|
|||
|
|
{
|
|||
|
|
return m_ptTurn;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 只用于TArch5->TArch6的升级
|
|||
|
|
ADSGePoint3d AecXDbSymbCoord::_GetTurnPoint() const
|
|||
|
|
{
|
|||
|
|
double nDir = PI / 4;
|
|||
|
|
switch (m_nQuadrant) {
|
|||
|
|
case 0:
|
|||
|
|
nDir = PI / 4;
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
nDir = PI * 0.75;
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
nDir = PI * 1.25;
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
nDir = PI * 1.75;
|
|||
|
|
}
|
|||
|
|
double nDist = 10.0 * GetPScale();
|
|||
|
|
ADSGePoint3d ptTurn;
|
|||
|
|
ads_polar(m_ptLocation, nDir, nDist, ptTurn);
|
|||
|
|
return ptTurn;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
BOOL AecXDbSymbCoord::IsPrec2() const
|
|||
|
|
{
|
|||
|
|
//modified by whl on 04/06/15
|
|||
|
|
//return ((m_nFlag&SCF_PREC2)!=0);
|
|||
|
|
return GetPrecNum() == 2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetPrec2(BOOL bTrue)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
|
|||
|
|
//modified by whl on 04/06/15
|
|||
|
|
//if(bTrue)
|
|||
|
|
// m_nFlag |= SCF_PREC2;
|
|||
|
|
//else
|
|||
|
|
// m_nFlag &= ~SCF_PREC2;
|
|||
|
|
if (bTrue)
|
|||
|
|
SetPrecNum(2);
|
|||
|
|
else
|
|||
|
|
SetPrecNum(3);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// sg add 090629,解决需求平台问题613,支持查找替换操作
|
|||
|
|
BOOL AecXDbSymbCoord::GetText(Adesk::UInt32 cookies, AecXDbText &text) const
|
|||
|
|
{
|
|||
|
|
if (cookies > 1)
|
|||
|
|
return FALSE;
|
|||
|
|
|
|||
|
|
TCString szFormat1, szFormat2;
|
|||
|
|
int iPrec = GetPrecNum();
|
|||
|
|
szFormat1 << _T("%.") << iPrec << _T("f"); // 查找替换格式
|
|||
|
|
szFormat2 << _T("%s=%.") << iPrec << _T("f"); // 绘制格式
|
|||
|
|
|
|||
|
|
AecXDbSymbMultiLeader leader;
|
|||
|
|
leader.SetPScale(GetPScale());
|
|||
|
|
leader.setPropertiesFrom(this);
|
|||
|
|
leader.SetSymbMultiLeader(FALSE); // sg add 090723,设置是否为引出标注
|
|||
|
|
leader.SetTextStyleId(GetTextStyleId());
|
|||
|
|
// sg add 120106,增加文字字高的设置
|
|||
|
|
leader.SetTextHeight(GetTextHeight());
|
|||
|
|
leader.SetArrow(GetStyle());
|
|||
|
|
leader.SetArrowSize(2.0);
|
|||
|
|
leader.SetText2BaseRatio(GetText2BaseRatio(TRUE, FALSE), TRUE);
|
|||
|
|
|
|||
|
|
ADSGePointList vertexes;
|
|||
|
|
vertexes.Append(new ADSGePoint3d(m_ptLocation));
|
|||
|
|
leader.SetLeaderVertexes(vertexes);
|
|||
|
|
leader.SetLeaderPoint(GetTurnPoint());
|
|||
|
|
|
|||
|
|
leader.SetText1(TCString(szFormat2, (IsAB() ? _T("A") : _T("X")), m_ptValue.y));
|
|||
|
|
leader.SetText2(TCString(szFormat2, (IsAB() ? _T("B") : _T("Y")), m_ptValue.x));
|
|||
|
|
double nFactor = (m_nQuadrant == 0 || m_nQuadrant == 3) ? 1.1 : -1.1,
|
|||
|
|
// lxb modify 120104,文字基线长度全部由GetTrueTextBaseLen函数返回
|
|||
|
|
// dBaseLen = leader.GetDefaultTextBaseLen()*nFactor;
|
|||
|
|
dBaseLen = GetTrueTextBaseLen();
|
|||
|
|
leader.SetText1(TCString(szFormat1, m_ptValue.y));
|
|||
|
|
leader.SetText2(TCString(szFormat1, m_ptValue.x));
|
|||
|
|
leader.SetTextBaseLen(dBaseLen);
|
|||
|
|
if (nFactor < 0)
|
|||
|
|
leader.SetTextAlign(AecXDbSymbMultiLeader::kAtStart);
|
|||
|
|
leader.GetText(cookies, text);
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TextPosition AecXDbSymbCoord::FindSubText(const TCHAR *sSubText, TextPosition &posStart,
|
|||
|
|
TextRange *pRange) const
|
|||
|
|
{
|
|||
|
|
assertReadEnabled();
|
|||
|
|
TextPosition pos;
|
|||
|
|
if (!sSubText || !sSubText[0])
|
|||
|
|
return pos;
|
|||
|
|
|
|||
|
|
TextPosition posNext = posStart;
|
|||
|
|
while (1)
|
|||
|
|
{
|
|||
|
|
AecXDbText text;
|
|||
|
|
text.SetPScale(GetPScale());
|
|||
|
|
if (!GetText(posNext.m_nCookies, text))
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
TextPosition posFind = text.FindSubText(sSubText, posNext, pRange);
|
|||
|
|
if (!posFind)
|
|||
|
|
{
|
|||
|
|
posNext.m_nCookies++;
|
|||
|
|
posNext.m_nTextPos = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
posStart = posNext;
|
|||
|
|
if (!posStart)
|
|||
|
|
{
|
|||
|
|
posStart.m_nCookies++;
|
|||
|
|
posStart.m_nTextPos = 0;
|
|||
|
|
}
|
|||
|
|
posFind.m_nCookies = posNext.m_nCookies;
|
|||
|
|
pos = posFind;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return pos;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TextPosition AecXDbSymbCoord::ReplaceSubText(const TextPosition &posRep,
|
|||
|
|
const TCHAR *sRepText, TextRange *pRange)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
AecXDbText text;
|
|||
|
|
text.SetPScale(GetPScale());
|
|||
|
|
TextPosition posNext;
|
|||
|
|
if (!sRepText || !GetText(posRep.m_nCookies, text))
|
|||
|
|
return posNext;
|
|||
|
|
|
|||
|
|
posNext = text.ReplaceSubText(posRep, sRepText, pRange);
|
|||
|
|
int cookies = posRep.m_nCookies;
|
|||
|
|
if (cookies == 0)
|
|||
|
|
{
|
|||
|
|
m_ptValue.y = _tstof(text.GetText());
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_ptValue.x = _tstof(text.GetText());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!posNext)
|
|||
|
|
{
|
|||
|
|
posNext.m_nCookies = posRep.m_nCookies + 1;
|
|||
|
|
posNext.m_nTextPos = 0;
|
|||
|
|
}
|
|||
|
|
return posNext;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetSubText(long i, CString sText)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
if (i == 0)
|
|||
|
|
m_ptValue.y = _tstof(sText);
|
|||
|
|
else
|
|||
|
|
m_ptValue.x = _tstof(sText);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SubText* AecXDbSymbCoord::HitTestText(ADSGePoint3d pt)const
|
|||
|
|
{
|
|||
|
|
int iPrec = GetPrecNum();
|
|||
|
|
TCString szFormat;
|
|||
|
|
szFormat << _T("%s=%.") << iPrec << _T("f");
|
|||
|
|
|
|||
|
|
//const TCHAR *szFormat=IsPrec2()? _T("%s=%.2f") : _T("%s=%.3f");
|
|||
|
|
AecXDbSymbMultiLeader leader;
|
|||
|
|
leader.SetPScale(GetPScale());
|
|||
|
|
leader.setPropertiesFrom(this);
|
|||
|
|
leader.SetSymbMultiLeader(FALSE); // sg add 090723,设置是否为引出标注
|
|||
|
|
leader.SetTextStyleId(GetTextStyleId());
|
|||
|
|
// sg add 120106,增加文字字高的设置
|
|||
|
|
leader.SetTextHeight(GetTextHeight());
|
|||
|
|
ADSGePointList vertexes;
|
|||
|
|
vertexes.Append(new ADSGePoint3d(m_ptLocation));
|
|||
|
|
leader.SetLeaderVertexes(vertexes);
|
|||
|
|
|
|||
|
|
leader.SetLeaderPoint(GetTurnPoint());
|
|||
|
|
leader.SetText1(TCString(szFormat, (IsAB() ? _T("A") : _T("X")), m_ptValue.y));
|
|||
|
|
leader.SetText2(TCString(szFormat, (IsAB() ? _T("B") : _T("Y")), m_ptValue.x));
|
|||
|
|
//leader.SetArrow(AecXDbSymbMultiLeader::kCrossing);
|
|||
|
|
leader.SetArrow(AecXDbSymbMultiLeader::kNone);//modified by whl
|
|||
|
|
leader.SetArrowSize(2.0);
|
|||
|
|
|
|||
|
|
double nFactor = (m_nQuadrant == 0 || m_nQuadrant == 3) ? 1.1 : -1.1;
|
|||
|
|
// lxb modify 120104,文字基线长度全部由GetTrueTextBaseLen函数返回
|
|||
|
|
//leader.SetTextBaseLen(leader.GetDefaultTextBaseLen()*nFactor);
|
|||
|
|
leader.SetTextBaseLen(GetTrueTextBaseLen());
|
|||
|
|
leader.SetText2BaseRatio(GetText2BaseRatio(TRUE, FALSE), TRUE); // sg add 081113
|
|||
|
|
|
|||
|
|
AcGiViewDraw dc;
|
|||
|
|
leader.DrawBaseEx(dc, leader);
|
|||
|
|
|
|||
|
|
SubText* pSubText = leader.HitTestText(pt);
|
|||
|
|
if (pSubText != NULL)
|
|||
|
|
{
|
|||
|
|
pSubText->SetObjectId(objectId());
|
|||
|
|
CString sText = pSubText->GetText();
|
|||
|
|
long s = sText.Find(_T('='));
|
|||
|
|
pSubText->SetText(sText.Right(sText.GetLength() - s - 1));
|
|||
|
|
}
|
|||
|
|
return pSubText;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SubText* AecXDbSymbCoord::GetSubText(long iText)const
|
|||
|
|
{
|
|||
|
|
int iPrec = GetPrecNum();
|
|||
|
|
TCString szFormat;
|
|||
|
|
szFormat << _T("%s=%.") << iPrec << _T("f");
|
|||
|
|
|
|||
|
|
//const TCHAR *szFormat=IsPrec2()? _T("%s=%.2f") : _T("%s=%.3f");
|
|||
|
|
AecXDbSymbMultiLeader leader;
|
|||
|
|
leader.SetPScale(GetPScale());
|
|||
|
|
leader.setPropertiesFrom(this);
|
|||
|
|
leader.SetSymbMultiLeader(FALSE); // sg add 090723,设置是否为引出标注
|
|||
|
|
leader.SetTextStyleId(GetTextStyleId());
|
|||
|
|
// sg add 120106,增加文字字高的设置
|
|||
|
|
leader.SetTextHeight(GetTextHeight());
|
|||
|
|
ADSGePointList vertexes;
|
|||
|
|
vertexes.Append(new ADSGePoint3d(m_ptLocation));
|
|||
|
|
leader.SetLeaderVertexes(vertexes);
|
|||
|
|
|
|||
|
|
leader.SetLeaderPoint(GetTurnPoint());
|
|||
|
|
leader.SetText1(TCString(szFormat, (IsAB() ? _T("A") : _T("X")), m_ptValue.y));
|
|||
|
|
leader.SetText2(TCString(szFormat, (IsAB() ? _T("B") : _T("Y")), m_ptValue.x));
|
|||
|
|
//leader.SetArrow(AecXDbSymbMultiLeader::kCrossing);
|
|||
|
|
leader.SetArrow(AecXDbSymbMultiLeader::kNone);//modified by whl
|
|||
|
|
leader.SetArrowSize(2.0);
|
|||
|
|
|
|||
|
|
double nFactor = (m_nQuadrant == 0 || m_nQuadrant == 3) ? 1.1 : -1.1;
|
|||
|
|
// lxb modify 120104,文字基线长度全部由GetTrueTextBaseLen函数返回
|
|||
|
|
// leader.SetTextBaseLen(leader.GetDefaultTextBaseLen()*nFactor);
|
|||
|
|
leader.SetTextBaseLen(GetTrueTextBaseLen());
|
|||
|
|
leader.SetText2BaseRatio(GetText2BaseRatio(TRUE, FALSE), TRUE); // sg add 081113
|
|||
|
|
|
|||
|
|
SubText* pSubText = leader.GetSubText(iText);
|
|||
|
|
if (pSubText != NULL)
|
|||
|
|
{
|
|||
|
|
pSubText->SetObjectId(objectId());
|
|||
|
|
CString sText = pSubText->GetText();
|
|||
|
|
long s = sText.Find(_T('='));
|
|||
|
|
pSubText->SetText(sText.Right(sText.GetLength() - s - 1));
|
|||
|
|
}
|
|||
|
|
return pSubText;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// sg add 110301,支持统一标高
|
|||
|
|
bool AecXDbSymbCoord::UnifyElevation(double dElevation)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
m_ptLocation.z = dElevation;
|
|||
|
|
m_ptValue.z = dElevation;
|
|||
|
|
m_ptTurn.z = dElevation;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Acad::ErrorStatus
|
|||
|
|
AecXDbSymbCoord::Draw2d(AcGiDraw &dc) const
|
|||
|
|
{
|
|||
|
|
assertReadEnabled();
|
|||
|
|
//if (!IsValid())
|
|||
|
|
// return Acad::eInvalidInput;
|
|||
|
|
|
|||
|
|
GlobalFunc::_LoadConfig();
|
|||
|
|
|
|||
|
|
if (Has2DBuffer() && !m_bInJig)
|
|||
|
|
{
|
|||
|
|
dc.SetColor(colorIndex());
|
|||
|
|
dc.SetLayer(layerId());
|
|||
|
|
BaseEx::_Draw2DBuffers(dc, true);
|
|||
|
|
return Acad::eOk;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!m_bInJig)
|
|||
|
|
int a = 0;
|
|||
|
|
|
|||
|
|
BOOL bDynamic = FALSE;
|
|||
|
|
if (g_Option::instance().g_bDynamicCoord/* && _tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor()) == 0*/)
|
|||
|
|
{
|
|||
|
|
AcGiCommonDraw *pDraw = dc.GetCommonDraw();
|
|||
|
|
pDraw->context()->disableFastMoveDrag();
|
|||
|
|
bDynamic = TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int iPrec = GetPrecNum();
|
|||
|
|
TCString szFormat;
|
|||
|
|
szFormat << _T("%s=%.") << iPrec << _T("f");
|
|||
|
|
// const TCHAR *szFormat=IsPrec2()? _T("%s=%.2f") : _T("%s=%.3f");
|
|||
|
|
|
|||
|
|
AecXDbSymbMultiLeader leader;
|
|||
|
|
//leader.m_bInJig = m_bInJig;
|
|||
|
|
leader.SetPScale(GetPScale());
|
|||
|
|
leader.setPropertiesFrom(this);
|
|||
|
|
leader.SetSymbMultiLeader(FALSE); // sg add 090723,设置是否为引出标注
|
|||
|
|
if (bDynamic && !objectId().isValid())
|
|||
|
|
{
|
|||
|
|
leader.setColorIndex(1);
|
|||
|
|
leader.SetTextColor(1); // sg add 090608,设置文字颜色为红色
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
leader.SetTextColor(m_colorText); // sg add 090608,设置文字颜色
|
|||
|
|
}
|
|||
|
|
leader.SetTextStyleId(GetTextStyleId());
|
|||
|
|
// sg add 120106,增加文字字高的设置
|
|||
|
|
leader.SetTextHeight(GetTextHeight());
|
|||
|
|
|
|||
|
|
ADSGePointList vertexes;
|
|||
|
|
vertexes.Append(new ADSGePoint3d(m_ptLocation));
|
|||
|
|
leader.SetLeaderVertexes(vertexes);
|
|||
|
|
|
|||
|
|
leader.SetLeaderPoint(GetTurnPoint());
|
|||
|
|
leader.SetText1(TCString(szFormat, (IsAB() ? _T("A") : _T("X")), m_ptValue.y));
|
|||
|
|
leader.SetText2(TCString(szFormat, (IsAB() ? _T("B") : _T("Y")), m_ptValue.x));
|
|||
|
|
// leader.SetArrow(AecXDbSymbMultiLeader::kCrossing);
|
|||
|
|
leader.SetArrow(GetStyle()); // modified by whl
|
|||
|
|
leader.SetArrowSize(2.0);
|
|||
|
|
|
|||
|
|
double nFactor = (m_nQuadrant == 0 || m_nQuadrant == 3) ? 1.1 : -1.1;
|
|||
|
|
// lxb modify 120104,文字基线长度全部由GetTrueTextBaseLen函数返回
|
|||
|
|
// leader.SetTextBaseLen(leader.GetDefaultTextBaseLen()*nFactor);
|
|||
|
|
leader.SetTextBaseLen(GetTrueTextBaseLen());
|
|||
|
|
|
|||
|
|
leader.SetText2BaseRatio(GetText2BaseRatio(TRUE, FALSE), TRUE); // sg add 081113
|
|||
|
|
//leader.ExplodeOrDraw2d(dc);
|
|||
|
|
DrawBaseEx(dc, leader);
|
|||
|
|
return Acad::eOk;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */
|
|||
|
|
void AecXDbSymbCoord::GetTips(PtrList<ObjInfoUnit> &lstInfo) const
|
|||
|
|
{
|
|||
|
|
lstInfo.Append(new ObjInfoUnit(_T("对象类型"), _T("坐标标注")));
|
|||
|
|
TCString sTextStyle = GlobalFunc::GetSymbolName(m_idTextStyle);
|
|||
|
|
lstInfo.Append(new ObjInfoUnit(_T("文字样式"), sTextStyle));
|
|||
|
|
TCString sHeight;
|
|||
|
|
GlobalFunc::ftoa(m_nTextHeight, 1, sHeight);
|
|||
|
|
sHeight << _T("P");
|
|||
|
|
lstInfo.Append(new ObjInfoUnit(_T("文字高度"), sHeight));
|
|||
|
|
//lstInfo.Append(new ObjInfoUnit(_T("文字转角"), Angle2Str(m_nTextRotation*180/PI)));
|
|||
|
|
lstInfo.Append(new ObjInfoUnit(TCString(_T("坐标%s"), IsAB() ? _T("A") : _T("X")), TCString(_T("%.3f"), m_ptValue.y)));
|
|||
|
|
lstInfo.Append(new ObjInfoUnit(TCString(_T("坐标%s"), IsAB() ? _T("B") : _T("Y")), TCString(_T("%.3f"), m_ptValue.x)));
|
|||
|
|
|
|||
|
|
TCString sLocation(256);
|
|||
|
|
sLocation << _T("(") << GlobalFunc::Dist2Str(m_ptLocation.x) << _T(", ") << GlobalFunc::Dist2Str(m_ptLocation.y) << _T(")");
|
|||
|
|
lstInfo.Append(new ObjInfoUnit(_T("位置"), sLocation));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
BOOL AecXDbSymbCoord::IsAB() const
|
|||
|
|
{
|
|||
|
|
return ((m_nFlag & SCF_AB) != 0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ADSGePoint3d AecXDbSymbCoord::GetLocation() const
|
|||
|
|
{
|
|||
|
|
return m_ptLocation;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ADSGePoint3d AecXDbSymbCoord::GetValue() const
|
|||
|
|
{
|
|||
|
|
return m_ptValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Adesk::UInt8 AecXDbSymbCoord::GetQuadrant() const
|
|||
|
|
{
|
|||
|
|
return m_nQuadrant;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Adesk::UInt8 AecXDbSymbCoord::GetPrecNum() const
|
|||
|
|
{
|
|||
|
|
Adesk::UInt8 num = (m_nFlag >> 4);
|
|||
|
|
//removed by whl on 04/06/15
|
|||
|
|
//if(num==01111) {
|
|||
|
|
// num=IsPrec2()? 2 : 3;
|
|||
|
|
//}
|
|||
|
|
return num;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetPrecNum(Adesk::UInt8 iNum)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
//removed by whl on 04/06/15
|
|||
|
|
// if(iNum==2)
|
|||
|
|
// SetPrec2(TRUE);
|
|||
|
|
//else if(iNum==3)
|
|||
|
|
// SetPrec2(FALSE);
|
|||
|
|
|
|||
|
|
Adesk::UInt8 iHi4 = (iNum << 4);
|
|||
|
|
Adesk::UInt8 iTemp = (m_nFlag << 4);
|
|||
|
|
Adesk::UInt8 iLo4 = (iTemp >> 4);
|
|||
|
|
m_nFlag = (iHi4 | iLo4);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetQuadrant(Adesk::UInt8 nQuadrant)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
m_nQuadrant = nQuadrant;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetValue(ADSGePoint3d ptValue)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
m_ptValue = ptValue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetAB(BOOL bTrue)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
if (bTrue) {
|
|||
|
|
m_nFlag |= SCF_AB;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
m_nFlag &= ~SCF_AB;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetTurnPoint(ADSGePoint3d pt)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
m_ptTurn = ADSGePoint3d(pt.x, pt.y);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetLocation(ADSGePoint3d pt)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
m_ptLocation = pt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
double AecXDbSymbCoord::GetText2BaseRatio(BOOL bAsPaperUnit, BOOL bRealDist) const
|
|||
|
|
{
|
|||
|
|
double dVal = m_dText2BaseRatio; // 系数
|
|||
|
|
if (fabs(dVal + 1000) < 1.0E-5)
|
|||
|
|
{
|
|||
|
|
dVal = GlobalFunc::DocGetText2BaseRatio(); // 使用全局变量GlobalFunc::DocGetText2BaseRatio的值
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (bRealDist)
|
|||
|
|
{
|
|||
|
|
dVal *= m_nTextHeight; // 将“系数”转为“实际值”
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!bAsPaperUnit) // 处理出图比例
|
|||
|
|
{
|
|||
|
|
dVal *= GetPScale();
|
|||
|
|
}
|
|||
|
|
return dVal;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void AecXDbSymbCoord::SetText2BaseRatio(double dVal, BOOL bAsPaperUnit)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
m_dText2BaseRatio = dVal; // 系数
|
|||
|
|
if (!bAsPaperUnit)
|
|||
|
|
{
|
|||
|
|
m_dText2BaseRatio /= GetPScale();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// lxb add 120104,文字基线长度
|
|||
|
|
void AecXDbSymbCoord::SetTextBaseLen(double dVal, BOOL bAsPaperUnit)
|
|||
|
|
{
|
|||
|
|
AssertWriteEnabled();
|
|||
|
|
if (fabs(dVal) < 1E-6)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_dTextBaseLen = dVal;
|
|||
|
|
if (!bAsPaperUnit)
|
|||
|
|
{
|
|||
|
|
m_dTextBaseLen /= GetPScale();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
double AecXDbSymbCoord::GetTextBaseLen(BOOL bAsPaperUnit) const
|
|||
|
|
{
|
|||
|
|
double val = m_dTextBaseLen;
|
|||
|
|
if (!bAsPaperUnit)
|
|||
|
|
{
|
|||
|
|
val *= GetPScale();
|
|||
|
|
}
|
|||
|
|
return val;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// lxb add 120104,文字基线默认长度
|
|||
|
|
double AecXDbSymbCoord::GetDefaultTextBaseLen(BOOL bAsPaperUnit) const
|
|||
|
|
{
|
|||
|
|
double dVal = 0;
|
|||
|
|
|
|||
|
|
AecXDbSymbMultiLeader leader;;
|
|||
|
|
leader.SetPScale(GetPScale());
|
|||
|
|
leader.setPropertiesFrom(this);
|
|||
|
|
leader.SetSymbMultiLeader(FALSE);
|
|||
|
|
leader.SetTextStyleId(GetTextStyleId());
|
|||
|
|
// sg add 120106,增加文字字高的设置
|
|||
|
|
leader.SetTextHeight(GetTextHeight());
|
|||
|
|
|
|||
|
|
TCString szFormat;
|
|||
|
|
int iPrec = GetPrecNum();
|
|||
|
|
szFormat << _T("%s=%.") << iPrec << _T("f");
|
|||
|
|
leader.SetText1(TCString(szFormat, (IsAB() ? _T("A") : _T("X")), m_ptValue.y));
|
|||
|
|
leader.SetText2(TCString(szFormat, (IsAB() ? _T("B") : _T("Y")), m_ptValue.x));
|
|||
|
|
|
|||
|
|
dVal = leader.GetDefaultTextBaseLen(bAsPaperUnit);
|
|||
|
|
|
|||
|
|
double dFactor = (m_nQuadrant == 0 || m_nQuadrant == 3) ? 1.1 : -1.1;
|
|||
|
|
dVal *= dFactor;
|
|||
|
|
return dVal;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// lxb add 120104,文字基线的真实长度
|
|||
|
|
double AecXDbSymbCoord::GetTrueTextBaseLen(BOOL bAsPaperUnit) const
|
|||
|
|
{
|
|||
|
|
double dVal = 10.0;
|
|||
|
|
if (fabs(m_dTextBaseLen - 100000) < 1.0E-6)
|
|||
|
|
{
|
|||
|
|
dVal = GetDefaultTextBaseLen(bAsPaperUnit); // 已经考虑了1.1问题以及m_nQuadrant问题
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
dVal = GetTextBaseLen(bAsPaperUnit);
|
|||
|
|
|
|||
|
|
// 考虑象限对坐标的引线正负的影响
|
|||
|
|
double dFactor = (m_nQuadrant == 0 || m_nQuadrant == 3) ? 1.0 : -1.0;
|
|||
|
|
dVal *= dFactor;
|
|||
|
|
}
|
|||
|
|
return dVal;
|
|||
|
|
}
|