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

2404 lines
51 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 "StdArx.h"
#include "dbproxy.h"
#include "AecDbEwPipeDim.h"
#include "AcGiExplodeDraw.h"
#include "dbgrip.h"
#include "AecGripCback.h"
#include "coretools.h"
const CString AecDbEwPipeDim::_Custom_No_R_ = L"_Custom_No_R_";
namespace
{
void GetTextAlignment(const AcGiDraw::TextAlignment &align
, AcDb::TextHorzMode &nHMode
, AcDb::TextVertMode &nVMode)
{
// 对齐方式需要进行换算
switch (align)
{
case AcGiDraw::kTopLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextTop;
break;
case AcGiDraw::kTopCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextTop;
break;
case AcGiDraw::kTopRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextTop;
break;
case AcGiDraw::kMiddleLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextVertMid;
break;
case AcGiDraw::kMiddleCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextVertMid;
break;
case AcGiDraw::kMiddleRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextVertMid;
break;
case AcGiDraw::kBottomLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextBottom;
break;
case AcGiDraw::kBottomCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextBottom;
break;
case AcGiDraw::kBottomRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextBottom;
break;
case AcGiDraw::kLeft:
nHMode = AcDb::kTextLeft;
nVMode = AcDb::kTextBase;
break;
case AcGiDraw::kCenter:
nHMode = AcDb::kTextCenter;
nVMode = AcDb::kTextBase;
break;
case AcGiDraw::kRight:
nHMode = AcDb::kTextRight;
nVMode = AcDb::kTextBase;
case AcGiDraw::kMiddle:
nHMode = AcDb::kTextMid;
nVMode = (AcDb::TextVertMode)0;
break;
default:
nHMode = (AcDb::TextHorzMode)0;
nVMode = (AcDb::TextVertMode)0;
break;
}
}
AcGiDraw::TextAlignment GetTextAlignment(const AcDb::TextHorzMode &nHMode, const AcDb::TextVertMode &nVMode)
{
AcGiDraw::TextAlignment nAlign;
// 上
if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextTop)
{
nAlign = AcGiDraw::kTopLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextTop)
{
nAlign = AcGiDraw::kTopCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextTop)
{
nAlign = AcGiDraw::kTopRight;
}
// 中
else if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextVertMid)
{
nAlign = AcGiDraw::kMiddleLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextVertMid)
{
nAlign = AcGiDraw::kMiddleCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextVertMid)
{
nAlign = AcGiDraw::kMiddleRight;
}
// 下
else if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextBottom)
{
nAlign = AcGiDraw::kBottomLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextBottom)
{
nAlign = AcGiDraw::kBottomCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextBottom)
{
nAlign = AcGiDraw::kBottomRight;
}
// 基线
else if (nHMode == AcDb::kTextLeft && nVMode == AcDb::kTextBase)
{
nAlign = AcGiDraw::kLeft;
}
else if (nHMode == AcDb::kTextCenter && nVMode == AcDb::kTextBase)
{
nAlign = AcGiDraw::kCenter;
}
else if (nHMode == AcDb::kTextRight && nVMode == AcDb::kTextBase)
{
nAlign = AcGiDraw::kRight;
}
else if (nHMode == AcDb::kTextMid)
{
nAlign = AcGiDraw::kMiddle;
}
else //kTextAlign, kTextFit
{
nAlign = AcGiDraw::kUnknown;
}
return nAlign;
}
void drawProxyEntity(const AcDbVoidPtrArray *pAr, AcGiWorldDraw *pWd)
{
if (!pAr) return;
Adesk::UInt16 clr = pWd->subEntityTraits().color();
AcDbObjectId layerID = pWd->subEntityTraits().layerId();
for (int i = 0; i < pAr->length(); ++i)
{
AcDbEntity *pEnt((AcDbEntity *)pAr->at(i));
if (pEnt->isKindOf(AcDbBlockReference::desc()))
{
AcDbBlockReference *pRef((AcDbBlockReference *)pEnt);
AcDbBlockTableRecord *pRec(NULL);
AcDbObject *pObj(NULL);
AcDbEntity *pSubEnt(NULL);
if (acdbOpenAcDbObject(pObj, pRef->blockTableRecord(), AcDb::kForRead) == Acad::eOk)
{
pRec = (AcDbBlockTableRecord *)pObj;
AcDbBlockTableRecordIterator *pBlockIterator;
pRec->newIterator(pBlockIterator, Adesk::kTrue, Adesk::kFalse);
for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step())
{
pBlockIterator->getEntity(pSubEnt, AcDb::kForWrite, Adesk::kTrue);
pSubEnt->setColorIndex(pEnt->colorIndex());
pSubEnt->setLayer(pEnt->layerId());
pSubEnt->close();
}
pObj->close();
delete pBlockIterator;
}
}
pWd->subEntityTraits().setColor(pEnt->colorIndex());
pWd->subEntityTraits().setLayer(pEnt->layerId());
if (pEnt)
pEnt->worldDraw(pWd);
}
pWd->subEntityTraits().setColor(clr);
pWd->subEntityTraits().setLayer(layerID);
}
}
//#define VERSION_TDBFITTINGBASE 1
// 增加了 m_mapSpecXData
#define VERSION_TDBFITTINGBASE 2
#define MESH_N 20
#define MESH_M 2
#define DIM_EL _T("\\U+2200")
#define DIM_TOP_EL _T("\\U+2201")
#define DIM_CEN_EL _T("\\U+2202")
#define DIM_BOM_EL _T("\\U+2203")
static const Adesk::UInt16 kBlue = 5;
ACRX_DXF_DEFINE_MEMBERS( AecDbEwPipeDim
, AecDbEntityBase
, AcDb::kDHL_CURRENT
, AcDb::kMReleaseCurrent
, 1
, AEC_EWPIPEDIM
, "AecDbEwPipeDim | 缺乏解释器,图形看不见,请下载插件");
AecDbEwPipeDim::AecDbEwPipeDim(void)
{
m_nStyle = 1; //0: 引出标注 1: 在线标注 //2: 批量标注
m_nDir = 0; //0: 水平标注 1: 垂直标注
m_nDimText = 0; //0: 只标上标 1: 上下标
m_sUpScr = _T(""); //上标脚本
m_sDownScr = _T(""); //下标脚本
m_dTextH = 2.5; //打印纸面字高度 2.5
m_dWScale = 0.75; //打印纸面字宽度 1
m_dD = 100; //上下标的间隙,在线标注用到
m_pGripAppData = new AecGripData[9];
}
AecDbEwPipeDim::~AecDbEwPipeDim(void)
{
}
void AecDbEwPipeDim::AddAecDbWEntity(const AcDbObjectId& idObj)
{
AssertWriteEnabled();
m_aridAttachs.append(idObj);
}
AcDbObjectId AecDbEwPipeDim::GetAecDbWEntity(int nIndex)
{
assertReadEnabled();
if (nIndex > -1 && nIndex < m_aridAttachs.length() )
{
return m_aridAttachs.at(nIndex);
}
return AcDbObjectId::kNull;
}
int AecDbEwPipeDim::GetAecDbWEntityCount()
{
assertReadEnabled();
return m_aridAttachs.length();
}
void AecDbEwPipeDim::SetDimStyle(short nStyle)
{
AssertWriteEnabled();
m_nStyle = nStyle;
}
short AecDbEwPipeDim::GetDimStyle()
{
assertReadEnabled();
return m_nStyle;
}
void AecDbEwPipeDim::SetDimDir(short nDir)
{
AssertWriteEnabled();
m_nDir = nDir;
}
short AecDbEwPipeDim::GetDimDir()
{
assertReadEnabled();
return m_nDir;
}
void AecDbEwPipeDim::SetDimTextUporDownFlag(short nDimText)
{
AssertWriteEnabled();
m_nDimText = nDimText;
}
short AecDbEwPipeDim::GetDimTextUporDownnFlag()
{
assertReadEnabled();
return m_nDimText;
}
void AecDbEwPipeDim::SetISODim(short nIsISO)
{
AssertWriteEnabled();
m_nIsISO = nIsISO;
}
short AecDbEwPipeDim::IsISODim()
{
assertReadEnabled();
return m_nIsISO;
}
void AecDbEwPipeDim::SetTextStyleId(AcDbObjectId& idStyle)
{
AssertWriteEnabled();
m_idTextSty = idStyle;
}
AcDbObjectId AecDbEwPipeDim::GetTextStyleId()
{
assertReadEnabled();
return m_idTextSty;
}
void AecDbEwPipeDim::SetTextLayerId(AcDbObjectId id)
{
AssertWriteEnabled();
m_idTextLayer = id;
}
AcDbObjectId AecDbEwPipeDim::GetTextLayerId()
{
assertReadEnabled();
return m_idTextLayer;
}
void AecDbEwPipeDim::AddDimText(LPCTSTR pszUp,LPCTSTR pszDown)
{
AssertWriteEnabled();
if (pszUp != NULL)
{
m_arsUps.Add(pszUp);
}
if (pszDown != NULL)
{
m_arsDowns.Add(pszDown);
}
}
void AecDbEwPipeDim::RemoveAt(int nPos,int nIndex)
{
AssertWriteEnabled();
if (nPos == -1)
{
if (nIndex > -1 && nIndex < m_arsDowns.GetSize())
{
m_arsDowns.RemoveAt(nIndex);
}
}
else
{
if (nIndex > -1 && nIndex < m_arsUps.GetSize())
{
m_arsUps.RemoveAt(nIndex);
}
}
}
void AecDbEwPipeDim::RemoveAll(int nPos)
{
AssertWriteEnabled();
if (nPos == -1)
{
m_arsDowns.RemoveAll();
}
else
{
m_arsUps.RemoveAll();
}
}
void AecDbEwPipeDim::GetDimText(int nIndex,CString& sUp,CString& sDown)
{
assertReadEnabled();
if (nIndex > -1 && nIndex < m_arsUps.GetSize() )
{
sUp = m_arsUps.GetAt(nIndex);
}
if (nIndex > -1 && nIndex < m_arsDowns.GetSize() )
{
sDown = m_arsDowns.GetAt(nIndex);
}
}
void AecDbEwPipeDim::SetDimupScript(LPCTSTR pszUpScr)
{
AssertWriteEnabled();
m_sUpScr = pszUpScr;
}
void AecDbEwPipeDim::GetDimupScript(CString& sUpScr)
{
assertReadEnabled();
sUpScr = m_sUpScr;
}
void AecDbEwPipeDim::SetDimdownScript(LPCTSTR pszDownScr)
{
AssertWriteEnabled();
m_sDownScr = pszDownScr;
}
void AecDbEwPipeDim::GetDimdownScript(CString& sDownScr)
{
assertReadEnabled();
sDownScr = m_sDownScr;
}
double AecDbEwPipeDim::GetTextHeight()
{
assertReadEnabled();
return m_dTextH;
}
void AecDbEwPipeDim::SetTextHeight(double dH)
{
AssertWriteEnabled();
m_dTextH = dH;
}
double AecDbEwPipeDim::GetTextWidthScale()
{
assertReadEnabled();
return m_dWScale;
}
void AecDbEwPipeDim::SetTextWidthScale(double dScale)
{
AssertWriteEnabled();
m_dWScale = dScale;
}
void AecDbEwPipeDim::AppendPoint(AcGePoint3d& pt)
{
AssertWriteEnabled();
m_arPoints.append(pt);
}
void AecDbEwPipeDim::AppendNoPoint(AcGePoint3d& pt)
{
AssertWriteEnabled();
m_arNoPoints.append(pt);
}
void AecDbEwPipeDim::UpdateFromParam()
{
}
void AecDbEwPipeDim::SetDimupdownSpace(double dD)
{
AssertWriteEnabled();
m_dD = dD;
}
Acad::ErrorStatus AecDbEwPipeDim::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled();
dc.SetTextStyle(m_idTextSty);
dc.SetLayer(m_idTextLayer);
if (Has2DBuffer())
{
const AcDbVoidPtrArray &Ar = Get2DBuffer();
Adesk::UInt16 oldClr = dc.GetColor();
Adesk::UInt16 newClr;
for (int i = 0; i < Ar.length(); ++i)
{
const AcDbEntity *pEnt = (AcDbEntity *)Ar.at(i);
dc.DrawEntity(*pEnt);
}
dc.SetColor(oldClr);
return Acad::eOk;
}
switch (m_nStyle)
{
case 0: //引出标注
{
DrawLeaderDim(dc);
break;
}
case 1: //在线标注
{
DrawOnlineDim(dc);
break;
}
case 2: //批量标注
{
DrawPolylineDim(dc);
break;
}
case 3: //序号标注
{
DrawSNo(dc);
break;
}
case 4: //引出多行带框标注---桥架用
{
DrawMBoxLineLdDim(dc);
break;
}
default:
break;
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawLeaderDim(AcGiDraw &dc) const
{
if (m_arPoints.length() < 2 )
{
return Acad::eInvalidInput;
}
if (m_arsUps.IsEmpty() && m_arsDowns.IsEmpty()) return Acad::eInvalidInput;
double len(.0);
AcGePoint3d ptFr = m_arPoints.first();
AcGePoint3d ptTo = m_arPoints.at(1);
CString sDimUp =_T("");
CString sDimDown = _T("");
dc.SetLayer(layerId());
//dc.DrawLine(AcGeLineSeg3d(ptFr,ptTo));
AcDbLine *pLine(new AcDbLine(ptFr,ptTo));
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(*pLine);
}
//绘制点
MakeWDot(dc, ptFr);
AcGeVector3d vtDir = ptTo - ptFr;
// 得到引线长度
CString sUp(_T("")), sDown(_T(""));
if (!m_arsUps.IsEmpty()) sUp = m_arsUps[0];
if (!m_arsDowns.IsEmpty()) sDown = m_arsDowns[0];
CString sLeft(_T("")), sRight(_T(""));
short elType(-1);
ParseDownString(sDown, elType, sLeft, sRight);
//if (sLeft.IsEmpty())
// sLeft = sDown;
double d1 = UnderLineLength(sUp);
double d2 = UnderLineLength(sLeft + sRight) + m_dTextH * m_dPScale;
if (sLeft.IsEmpty() && sRight.IsEmpty())
d2 = UnderLineLength(sDown);
if (sUp.IsEmpty())
d1 = UnderLineLength(sDown);
double dLenderLen = d1 > d2 ? d1 : d2;
// 得到引线的方向,和文字位置
AcGePoint3d ptPosUp = ptTo;
AcGePoint3d ptPosDw = ptPosUp;
AcGeVector3d vtLeader(AcGeVector3d::kIdentity);
AcGeVector3d vtText(AcGeVector3d::kIdentity);
if (m_nDir == 0)
{
vtText = AcGeVector3d::kXAxis;
if (vtDir.x < 1.e-10)
{
vtLeader = -AcGeVector3d::kXAxis;
ptPosUp = ptTo + vtLeader * dLenderLen;
}
else
{
vtLeader = AcGeVector3d::kXAxis;
}
ptPosUp += AcGeVector3d::kYAxis * .1;
ptPosDw = ptPosUp - AcGeVector3d::kYAxis * .2;
}
else
{
vtText = AcGeVector3d::kYAxis;
if (vtDir.y < 1.e-10)
{
vtLeader = -AcGeVector3d::kYAxis;
ptPosUp = ptTo + vtLeader * dLenderLen;
}
else
{
vtLeader = AcGeVector3d::kYAxis;
}
ptPosUp -= AcGeVector3d::kXAxis * .1;
ptPosDw = ptPosUp + AcGeVector3d::kXAxis * .2;
}
// 绘制引线
//dc.DrawLine(AcGeLineSeg3d(ptTo, ptTo + vtLeader * dLenderLen));
pLine = new AcDbLine(ptTo, ptTo + vtLeader * dLenderLen);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(*pLine);
}
// 绘制上文字
TextEx(dc, AcGiDraw::kBottomLeft, ptPosUp, vtText, sUp, len);
if (/*m_nDimText != 0 &&*/ !sDown.IsEmpty())//允许下标
{
len = 0.0;
if (!sDown.IsEmpty())
TextEx(dc, AcGiDraw::kTopLeft, ptPosDw, vtText, sDown, len,-1);
/*if (elType > -1)//有标高 不用标高字体自画
{
ptPosDw += vtText * len;
DrawEl(dc
, (ptPosDw + (m_nDir == 0 ? -AcGeVector3d::kYAxis : AcGeVector3d::kXAxis) * m_dTextH * m_dPScale)
, m_nDir == 0 ? .0 : (PI * .5)
, elType
, m_dTextH * m_dPScale,-1);
ptPosDw += vtText * m_dTextH * m_dPScale;
TextEx(dc, AcGiDraw::kTopLeft, ptPosDw, vtText, sRight, len,-1);
}*/
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::MakeWDot(AcGiDraw &dc,AcGePoint3d &ptGeCen) const
{
//打印点 0.25
double dPlotDotD = 0.25 * m_dPScale;
double dDotRadius = dPlotDotD * 0.5;
AcGePoint2d ptGeCenDot = ptGeCen.convert2d(AcGePlane::kXYPlane);
AcGePoint2d ptGe[4];
double dBulge = tan(PI / 8.0);
ptGe[0] = ptGeCenDot + dDotRadius * AcGeVector2d::kYAxis;
ptGe[1] = ptGeCenDot + dDotRadius * AcGeVector2d::kXAxis;
ptGe[2] = ptGeCenDot - dDotRadius * AcGeVector2d::kYAxis;
ptGe[3] = ptGeCenDot - dDotRadius * AcGeVector2d::kXAxis;
AcDbPolyline *pDot = new AcDbPolyline;
pDot->addVertexAt(0, ptGe[0], -dBulge);
pDot->addVertexAt(1, ptGe[1], -dBulge);
pDot->addVertexAt(2, ptGe[2], -dBulge);
pDot->addVertexAt(3, ptGe[3], -dBulge);
pDot->addVertexAt(4, ptGe[0], 0.0);
pDot->setConstantWidth(dPlotDotD);
pDot->setClosed(Adesk::kTrue);
pDot->setNormal(AcGeVector3d::kZAxis);
Add2DBuffer(pDot);
dc.DrawEntity(*pDot);
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawMBoxLineLdDim(AcGiDraw& dc) const
{
if (m_arPoints.length() != 3)
{
return Acad::eInvalidInput;
}
if (m_arsUps.IsEmpty()) return Acad::eInvalidInput;
double len(.0);
AcGePoint3d ptFr = m_arPoints.first();
AcGePoint3d ptTo = m_arPoints.at(1);
AcGePoint3d ptDir = m_arPoints.last();
CString sDimUp = _T("");
CString sDimDown = _T("");
dc.SetLayer(layerId());
//dc.DrawLine(AcGeLineSeg3d(ptFr,ptTo));
AcDbLine *pLine(new AcDbLine(ptFr, ptTo));
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(*pLine);
}
//绘制点
MakeWDot(dc,ptFr);
//
AcGeVector3d vtDir = ptDir - ptTo;
double dLenderLen = 0;
AcGePoint3d ptPosUp;
AcGeVector3d vtLeader, vtText,vtV;
AcGePoint2d ptTxtBox;
AcGePoint3d ptGe[4];
// 得到引线长度
CString sUp(_T("")), sDown(_T(""));
for (int i = 0;i < m_arsUps.GetSize();i++)
{
sUp = m_arsUps.GetAt(i);
ptTxtBox = DimTextExtent(sUp);
dLenderLen = ptTxtBox.x;
dLenderLen += (0.5 * m_dTextH * m_dPScale);//加上半个字高
ptPosUp = ptTo;
//得到引线的方向,和文字位置
vtLeader = AcGeVector3d::kIdentity;
vtText = AcGeVector3d::kIdentity;
if (m_nDir == 0)
{
vtText = AcGeVector3d::kXAxis;
if (vtDir.x < 1.e-10)
{
vtLeader = -AcGeVector3d::kXAxis;
ptPosUp = ptTo + vtLeader * dLenderLen;
}
else
{
vtLeader = AcGeVector3d::kXAxis;
}
ptPosUp += AcGeVector3d::kYAxis * .1;
}
else
{
vtText = AcGeVector3d::kYAxis;
if (vtDir.y < 1.e-10)
{
vtLeader = -AcGeVector3d::kYAxis;
ptPosUp = ptTo + vtLeader * dLenderLen;
}
else
{
vtLeader = AcGeVector3d::kYAxis;
}
ptPosUp -= AcGeVector3d::kXAxis * .1;
}
vtV = vtLeader;
vtV.rotateBy(PI / 2.0, AcGeVector3d::kZAxis);
vtV.normalize();
// 绘制引线 U 型线
ptGe[0] = ptTo + vtV * ptTxtBox.y;
ptGe[1] = ptTo;
ptGe[2] = ptTo + vtLeader * dLenderLen;
ptGe[3] = ptGe[2] + vtV * ptTxtBox.y;
ptGe[0] += vtV * 0.5 * m_dTextH * m_dPScale;//文字有0.4空隙
ptGe[3] += vtV * 0.5 * m_dTextH * m_dPScale;//文字有0.4空隙
for (int ii = 0;ii < 3;ii++)
{
pLine = new AcDbLine(ptGe[ii], ptGe[ii+1]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(*pLine);
}
}
// 绘制上文字
TextEx(dc, AcGiDraw::kBottomLeft, ptPosUp, vtText, sUp, len);
//封口
if (i == m_arsUps.GetSize() - 1)
{
pLine = new AcDbLine(ptGe[0], ptGe[3]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(*pLine);
}
}
ptTo += vtV * ptTxtBox.y;
ptTo += vtV * 0.5 * m_dTextH * m_dPScale;//文字有0.4空隙
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawOnlineDim(AcGiDraw & dc) const
{
//在线标注为单个的在线标注
if (m_arPoints.length() != 2 ) return Acad::eInvalidInput;
double txtLen(.0);
AcGePoint3d ptFr(m_arPoints.first()), ptTo(m_arPoints.last());
AcGeVector3d vtDir = ptTo - ptFr;
vtDir.normalize();
AcGeVector3d vtV(vtDir);
vtV.rotateBy(-PI * .5, AcGeVector3d::kZAxis);
vtV.normalize();
CString sDimUp(_T("")), sDimDown(_T(""));
if (!m_arsUps.IsEmpty())
{
sDimUp = m_arsUps.GetAt(0);
TextEx(dc, AcGiDraw::kBottomLeft, ptFr, vtDir, sDimUp, txtLen);
}
if (!m_arsDowns.IsEmpty())
{
sDimDown = m_arsDowns.GetAt(0);
ptFr += (vtV * (m_dD + 20));
short nType(-1);
CString sLeft, sRight;
if (ParseDownString(sDimDown, nType, sLeft, sRight) != Acad::eOk)
return Acad::eInvalidInput;
TextEx(dc, AcGiDraw::kTopLeft, ptFr, vtDir, sDimDown, txtLen,-1);
/*if (nType > -1)//有标高
{
ptFr += (vtDir * txtLen);
double dAngle = AcGeVector3d::kXAxis.angleTo(vtDir, AcGeVector3d::kZAxis);
DrawEl(dc, ptFr + (vtV * m_dTextH * m_dPScale), dAngle, nType, m_dTextH * m_dPScale,-1);
ptFr += (vtDir * (m_dTextH * m_dPScale));
TextEx(dc, AcGiDraw::kTopLeft, ptFr, vtDir, sRight, txtLen,-1);
}*/
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawPolylineDim(AcGiDraw &dc) const
{
if (m_arPoints.length() == 0)
{
return Acad::eInvalidInput;
}
AcGePoint3d ptFr;
AcGePoint3d ptTo;
dc.SetLayer(layerId());
for (int i = 0; i < m_arPoints.length() - 1; i++)
{
ptFr = m_arPoints.at(i);
ptTo = m_arPoints.at(i + 1);
//dc.DrawLine(AcGeLineSeg3d(ptFr, ptTo));
AcDbLine *pL(new AcDbLine(ptFr, ptTo));
if (pL)
{
pL->setLayer(layerId());
Add2DBuffer(pL);
dc.DrawEntity(pL);
}
}
ptTo = m_arPoints.last();
//计算最大的文字需要的下画线长度
double dLen = 0.0;
CString sDimup,sDimDown = _T("");
for (int i = 0;i < m_arsUps.GetSize();i++)
{
sDimup = m_arsUps.GetAt(i);
dLen = __max(dLen, UnderLineLength(sDimup));
}
//文字标注比例
struct resbuf rb;
double dDimScale = 1.0;
acedGetVar(_T("dimscale"),&rb);
dDimScale = rb.resval.rreal;
AcGeVector3d vtH = AcGeVector3d::kYAxis;
vtH *= m_dTextH * 1.2 * GetPScale();//全局比例
ptFr = ptTo;
ptTo += dLen * AcGeVector3d::kXAxis;
for (int i = 0;i < m_arsUps.GetSize();i++)
{
sDimup = m_arsUps.GetAt(i);
DrawText(dc,ptFr,ptTo,sDimup,sDimDown,AcGeVector3d::kXAxis);
ptTo += vtH;
ptFr += vtH;
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawSNo(AcGiDraw &dc) const
{
assertReadEnabled();
if (m_arPoints.length() == 0)
{
return Acad::eInvalidInput;
}
AcDbObjectId idLayOld = dc.GetLayerId();
AcDbObjectId idTextSt = dc.GetTextStyle();
AcGePoint3d ptFr;
AcGePoint3d ptTo;
dc.SetLayer(m_idTextLayer);
dc.SetTextStyle(m_idTextSty);
double dR = m_dTextH *m_dPScale;
AcGeVector3d vt;
ptFr = m_arPoints.last();
ptFr.z = 0.0;
AcGeVector3d vtH = AcGeVector3d::kXAxis;
vtH *= 2.0 * dR;
CString sDimup;
double dRLen = dR;
double dCirR = 1.2 * dR;
m_mapSpecXData.GetAt(_Custom_No_R_, dCirR);
for (int i = 0;i < m_arsUps.GetSize();i++)
{
sDimup = m_arsUps.GetAt(i);
//dc.DrawText(sDimup, ptFr, AcGiDraw::kMiddle, m_dTextH * m_dPScale,1.0, 0.0, NULL);
TextEx(dc, AcGiDraw::kTopCenter, ptFr, AcGeVector3d::kXAxis, sDimup, dRLen);
//dc.DrawCircle(ptFr,1.2 * dR,AcGeVector3d::kZAxis);
AcDbCircle *pC(new AcDbCircle(ptFr, AcGeVector3d::kZAxis, dCirR));
if (pC)
{
Add2DBuffer(pC);
dc.DrawEntity(pC);
}
ptFr += vtH;
}
for (int i = 0;i < m_arPoints.length() - 1;i++)
{
ptFr = m_arPoints.at(i);
ptTo = m_arPoints.at(i+1);
ptFr.z = 0.0;
ptTo.z = 0.0;
vt = ptFr - ptTo;
vt.normalize();
vt *= dCirR;
ptTo += vt;
//dc.DrawLine(AcGeLineSeg3d(ptFr,ptTo));
AcDbLine *pL(new AcDbLine(ptFr,ptTo));
if (pL)
{
pL->setLayer(layerId());
Add2DBuffer(pL);
dc.DrawEntity(pL);
}
}
dc.SetLayer(idLayOld);
dc.SetTextStyle(idTextSt);
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawText(AcGiDraw &dc,AcGePoint3d ptFr,AcGePoint3d ptTo,
LPCTSTR pszDimup,LPCTSTR pszDimDown,
const AcGeVector3d& vtDimType,BOOL bHasUnderline) const
{
//可能含有标高,三角形标注!!!
//1. 在线标注
if (vtDimType.isZeroLength()) //在线标注,方向同管线
{
double dAngle = 0;
AcGeVector3d vtFrTo = ptTo - ptFr;
AcGeVector3d vtV = vtFrTo;
dAngle = AcGeVector3d::kXAxis.angleTo(vtFrTo,AcGeVector3d::kZAxis);
double dDot = vtFrTo.dotProduct(AcGeVector3d::kXAxis);
if (dDot > 0 ) //I,IV 象限 同向绘制文字
{
if (pszDimup != NULL)
{
DrawText(dc,pszDimup,ptFr,dAngle);
}
if (pszDimDown != NULL)
{
vtV.normalize();
vtV.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis);
vtV *= m_dTextH * 1.2 * GetPScale();//间隙0.1
ptFr += vtV;
DrawText(dc,pszDimDown,ptFr,dAngle);
}
}
else if (dDot < 1.e-10)//反方向 II III 象限,或垂直
{
if (dDot > -1.e-10) //如果垂直 Y
{
if (vtFrTo.isCodirectionalTo(AcGeVector3d::kYAxis)) //垂直 和 Y+ 同向绘制文字
{
if (pszDimup != NULL)
{
DrawText(dc,pszDimup,ptFr,PI / 2.0);
}
if (pszDimDown != NULL)
{
ptFr += m_dTextH * 1.1 * GetPScale() * AcGeVector3d::kXAxis;//间隙0.1;
DrawText(dc,pszDimDown,ptFr,PI / 2.0);
}
}
else //反方向绘制文字 -Y 方向
{
if (pszDimup != NULL)
{
double dLen = UnderLineLength(pszDimup);
AcGePoint3d ptPos = ptFr - dLen * AcGeVector3d::kYAxis;
DrawText(dc,pszDimup,ptPos,PI / 2.0);
}
if (pszDimDown != NULL)
{
double dLen = UnderLineLength(pszDimDown);
AcGePoint3d ptPos = ptFr - dLen * AcGeVector3d::kYAxis;
ptPos.x += m_dTextH * 1.1 * GetPScale();//间隙0.1;
DrawText(dc,pszDimDown,ptPos,PI / 2.0);
}
}
}
else // 不垂直 反方向绘制文字
{
dAngle = AcGeVector3d::kXAxis.angleTo(vtFrTo,AcGeVector3d::kZAxis);
if (vtFrTo.x < 1.e-10 && vtFrTo.y > 1.e-10)
{
dAngle += PI;
}
//if (vtFrTo.x < 1.e-10 && vtFrTo.y < 1.e-10)
//{
// dAngle = PI - dAngle;
//}
if (pszDimup != NULL)
{
vtFrTo.normalize();
double dLen = UnderLineLength(pszDimup);
AcGePoint3d ptPos = ptFr + dLen * vtFrTo;
DrawText(dc,pszDimup,ptPos,dAngle);
}
if (pszDimDown != NULL)
{
vtFrTo.normalize();
double dLen = UnderLineLength(pszDimDown);
AcGePoint3d ptPos = ptFr + dLen * vtFrTo;
vtFrTo.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
ptPos += vtFrTo * m_dTextH * 1.1 * GetPScale();
DrawText(dc,pszDimDown,ptPos,dAngle);
}
}
}
}
else //水平或垂直标注
{
AcGeVector3d vtFrTo = ptTo - ptFr;
//2.水平标注
if (vtDimType.isParallelTo(AcGeVector3d::kXAxis)) //水平标注
{
if (pszDimup != NULL)
{
DrawText(dc,pszDimup,ptFr,0.0);
}
if (pszDimDown != NULL)
{
AcGePoint3d ptPos = ptFr;
ptPos.y -= m_dTextH * 1.1 * GetPScale();
DrawText(dc,pszDimDown,ptPos,0.0);
}
}
//3.垂直标注
if (vtDimType.isParallelTo(AcGeVector3d::kYAxis))//垂直标注
{
if (vtFrTo.isCodirectionalTo(AcGeVector3d::kYAxis)) //垂直 和 Y+ 同向绘制文字
{
if (pszDimup != NULL)
{
DrawText(dc,pszDimup,ptFr,PI / 2.0);
}
if (pszDimDown != NULL)
{
ptFr.x += m_dTextH * 1.1 * GetPScale();//间隙0.1;
DrawText(dc,pszDimDown,ptFr,PI / 2.0);
}
}
else //反方向绘制文字 -Y 方向
{
if (pszDimup != NULL)
{
double dLen = UnderLineLength(pszDimup);
AcGePoint3d ptPos = ptFr - dLen * AcGeVector3d::kYAxis;
DrawText(dc,pszDimup,ptPos,PI / 2.0);
}
if (pszDimDown != NULL)
{
double dLen = UnderLineLength(pszDimDown);
AcGePoint3d ptPos = ptFr - dLen * AcGeVector3d::kYAxis;
ptPos.x += m_dTextH * 1.1 * GetPScale();//间隙0.1;
DrawText(dc,pszDimDown,ptPos,PI / 2.0);
}
}
}
}
if (bHasUnderline)
{
AcGeLineSeg3d ln(ptFr,ptTo);
//dc.DrawLine(ln);
AcDbLine *pL(new AcDbLine(ptFr,ptTo));
if (pL)
{
pL->setLayer(layerId());
Add2DBuffer(pL);
dc.DrawEntity(pL);
}
}
return Acad::eOk;
}
/*
#define DIM_EL _T("\\U+2200")
#define DIM_TOP_EL _T("\\U+2201")
#define DIM_CEN_EL _T("\\U+2202")
#define DIM_BOM_EL _T("\\U+2203")
*/
Acad::ErrorStatus AecDbEwPipeDim::ParseDownString(LPCTSTR psz
, short &nElType
, CString &sLeft
, CString &sRight ) const
{
if (!psz) return Acad::eInvalidInput;
CString sDimTxt(psz);
nElType = -1;
if (sDimTxt.Find(DIM_EL) != -1 ||
sDimTxt.Find(DIM_TOP_EL) != -1 ||
sDimTxt.Find(DIM_CEN_EL) != -1 ||
sDimTxt.Find(DIM_BOM_EL) != -1)
{
int nPos = -1, nLen = 0;
if ((nPos = sDimTxt.Find(DIM_EL)) != -1)
{
sLeft = sDimTxt.Mid(0, nPos);
nLen = (int)_tcslen(DIM_EL);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 0;
}
if ((nPos = sDimTxt.Find(DIM_TOP_EL)) != -1)
{
sLeft = sDimTxt.Mid(0, nPos);
nLen = (int)_tcslen(DIM_TOP_EL);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 1;
}
if ((nPos = sDimTxt.Find(DIM_CEN_EL)) != -1)
{
sLeft = sDimTxt.Mid(0, nPos);
nLen = (int)_tcslen(DIM_CEN_EL);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 2;
}
if ((nPos = sDimTxt.Find(DIM_BOM_EL)) != -1)
{
sLeft = sDimTxt.Mid(0, nPos);
nLen = (int)_tcslen(DIM_BOM_EL);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 3;
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawText(AcGiDraw &dc,LPCTSTR pszText,AcGePoint3d& ptFr,double dAngle) const
{
//标高问题
CString sDimTxt = pszText;
if (sDimTxt.IsEmpty())
return Acad::eOk;
if (sDimTxt.Find(DIM_EL) != -1 ||
sDimTxt.Find(DIM_TOP_EL) != -1 ||
sDimTxt.Find(DIM_CEN_EL) != -1 ||
sDimTxt.Find(DIM_BOM_EL) != -1)
{
int nPos = -1,nLen = 0,nElType = 0;
CString sLeft = _T(""),sEl = _T(""),sRight = _T("");
if ( (nPos = sDimTxt.Find(DIM_EL)) != -1)
{
sLeft = sDimTxt.Mid(0,nPos);
nLen = (int)_tcslen(DIM_EL);
sEl = sDimTxt.Mid(nPos,nLen);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 0;
}
if ( (nPos = sDimTxt.Find(DIM_TOP_EL)) != -1)
{
sLeft = sDimTxt.Mid(0,nPos);
nLen = (int)_tcslen(DIM_TOP_EL);
sEl = sDimTxt.Mid(nPos,nLen);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 1;
}
if ( (nPos = sDimTxt.Find(DIM_CEN_EL)) != -1)
{
sLeft = sDimTxt.Mid(0,nPos);
nLen = (int)_tcslen(DIM_CEN_EL);
sEl = sDimTxt.Mid(nPos,nLen);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 2;
}
if ( (nPos = sDimTxt.Find(DIM_BOM_EL) ) != -1)
{
sLeft = sDimTxt.Mid(0,nPos);
nLen = (int)_tcslen(DIM_BOM_EL);
sEl = sDimTxt.Mid(nPos,nLen);
sRight = sDimTxt.Mid(nPos + nLen);
nElType = 3;
}
//标左
sLeft.TrimRight();
DrawText2(dc,sLeft,ptFr,dAngle);
//标中
//AcGeVector3d vtDir = AcGeVector3d::kXAxis;
//vtDir.rotateBy(dAngle,AcGeVector3d::kZAxis);
DrawEl(dc,ptFr,dAngle,nElType,m_dTextH * GetPScale());
//标右
if (!sRight.IsEmpty())
{
DrawText2(dc,sRight,ptFr,dAngle);
}
}
else
{
DrawText2(dc,pszText,ptFr,dAngle);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::TextEx( AcGiDraw & dc
, const AcGiDraw::TextAlignment & ta
, const AcGePoint3d & ptPos
, const AcGeVector3d & vtDir
, LPCTSTR psz
, double &len
, int nUpOrDwn/* = 1*/) const
{
if (!psz || CString(psz).IsEmpty()) return Acad::eInvalidInput;
dc.SetLayer(m_idTextLayer);
dc.SetTextStyle(m_idTextSty);
double dAngle = AcGeVector3d::kXAxis.angleTo(vtDir, AcGeVector3d::kZAxis);
if (dAngle > PI && dAngle < 1.5 * PI)
dAngle -= PI;
if (dAngle > 0.5 * PI && dAngle < PI)
dAngle = 2.0 * PI - (PI - dAngle);
AcGeVector3d vtUD = vtDir;
vtUD.rotateBy(nUpOrDwn * PI / 2.0,AcGeVector3d::kZAxis);
vtUD.normalize();
vtUD *= 0.4 * m_dTextH * m_dPScale;//文字高度0.4空隙
AcGePoint3d ptPos2 = ptPos + vtUD;
dc.DrawText(psz, ptPos2, ta, m_dTextH * m_dPScale, m_dWScale, dAngle, NULL);
AcDbVoidPtrArray arTxt;
AcGiExplodeDraw dc2(arTxt);
dc2.SetLayer(m_idTextLayer);
dc2.SetTextStyle(m_idTextSty);
dc2.DrawText(psz, ptPos2, ta, m_dTextH * m_dPScale, m_dWScale, dAngle, NULL);
if (!arTxt.isEmpty())
{
Add2DBuffer((AcDbEntity*)arTxt.first());
}
////错误,标注方向可能任意方向,内部y 减加不对2023-6-1
// 求 vDir 方向长度
// 不需要设置角度,因为无论什么角度,文字对象长是一样的
/*AcDbText *pDbTxt = new AcDbText;
if (pDbTxt)
{
pDbTxt->setTextString(psz);
pDbTxt->setTextStyle(m_idTextSty);
pDbTxt->setHeight(m_dTextH * m_dPScale);
pDbTxt->setWidthFactor(m_dWScale);
pDbTxt->setRotation(dAngle);
AcDbExtents ext;
pDbTxt->getGeomExtents(ext);
len = ext.maxPoint().distanceTo(ext.minPoint());
AcGePoint3d pt, ptExt(ext.maxPoint().x - ext.minPoint().x
, ext.maxPoint().y
, m_dTextH * m_dPScale);
//错误,标注方向可能任意方向,内部y 减加不对
pt = AcGiDraw::Align2Base(ta, ptPos2, ptExt);
pDbTxt->setPosition(pt);
pDbTxt->setColorIndex(dc.GetColor());
pDbTxt->setLayer(m_idTextLayer);
dc.DrawEntity(*pDbTxt);
Add2DBuffer(pDbTxt);
}*/
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawText2(AcGiDraw &dc,LPCTSTR pszText,AcGePoint3d& ptFr,double dAngle) const
{
dc.SetLayer(m_idTextLayer);
dc.SetTextStyle(m_idTextSty);
//dc.DrawText(pszText, ptFr, AcGiDraw::kBottomLeft, m_dTextH * GetPScale(), 1, dAngle, NULL);
AcDbText *pDbTxt = new AcDbText;
if (pDbTxt)
{
pDbTxt->setTextString(pszText);
pDbTxt->setTextStyle(m_idTextSty);
pDbTxt->setHeight(m_dTextH * GetPScale());
pDbTxt->setWidthFactor(1);
pDbTxt->setRotation(dAngle);
AcDbExtents ext;
pDbTxt->getGeomExtents(ext);
AcGePoint3d pt, ptExt(ext.maxPoint().x - ext.minPoint().x
, ext.maxPoint().y
, m_dTextH * m_dPScale);
pt = AcGiDraw::Align2Base(AcGiDraw::kBottomLeft, ptFr, ptExt);
pDbTxt->setPosition(pt);
pDbTxt->setColorIndex(dc.GetColor());
pDbTxt->setLayer(m_idTextLayer);
dc.DrawEntity(*pDbTxt);
Add2DBuffer(pDbTxt);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::DrawEl(AcGiDraw &dc,AcGePoint3d& ptFr,double dAngle,short nElType,double dH, int nUpOrDwn/* = 1*/) const
{
AcGeVector3d vtDir = AcGeVector3d::kXAxis;
vtDir.rotateBy(dAngle,AcGeVector3d::kZAxis);
AcGeVector3d vtV = vtDir;
vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
dH *= 0.8;
double dL = dH / 0.866;
AcGePoint3d ptGe[8];
AcGeVector3d vtUD = vtV;
vtUD.normalize();
vtUD *= nUpOrDwn;
vtUD *= 0.4 * m_dTextH * m_dPScale;//文字高度0.4空隙
AcGePoint3d ptPos2 = ptFr + vtUD;
ptGe[0] = ptPos2;
ptGe[0] += dL * 0.5 * vtDir;
ptGe[1] = ptGe[0] + dL * 0.5 * vtDir;
ptGe[1] += dH * vtV;
ptGe[2] = ptGe[1] - dL * vtDir;
ptGe[3] = ptGe[0];
ptFr += dL * 1.1 * vtDir;
AcDbLine *pLine(NULL);
AcGeLineSeg3d ln;
switch(nElType)
{
case 0://DIM_EL
{
for (int i = 0;i <= 2;i++)
{
ln.set(ptGe[i], ptGe[i+1]);
//dc.DrawLine(ln);
pLine = new AcDbLine(ptGe[i], ptGe[i+1]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(pLine);
}
}
break;
}
case 1://DIM_TOP_EL
{
for (int i = 0;i <= 2;i++)
{
ln.set(ptGe[i], ptGe[i+1]);
//dc.DrawLine(ln);
pLine = new AcDbLine(ptGe[i], ptGe[i + 1]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(pLine);
}
}
Midpoint(ptGe[0],ptGe[1],ptGe[4]);
Midpoint(ptGe[0],ptGe[2],ptGe[5]);
ln.set(ptGe[4], ptGe[5]);
//dc.DrawLine(ln);
pLine = new AcDbLine(ptGe[4], ptGe[5]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(pLine);
}
break;
}
case 2://DIM_CEN_EL
{
for (int i = 0;i <= 2;i++)
{
ln.set(ptGe[i], ptGe[i+1]);
//dc.DrawLine(ln);
pLine = new AcDbLine(ptGe[i], ptGe[i + 1]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(pLine);
}
}
Midpoint(ptGe[1],ptGe[2],ptGe[4]);
ln.set(ptGe[0], ptGe[4]);
//dc.DrawLine(ln);
pLine = new AcDbLine(ptGe[0], ptGe[4]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(pLine);
}
break;
}
case 3://DIM_BOM_EL
{
for (int i = 0;i <= 2;i++)
{
ln.set(ptGe[i], ptGe[i+1]);
//dc.DrawLine(ln);
pLine = new AcDbLine(ptGe[i], ptGe[i + 1]);
if (pLine)
{
pLine->setLayer(layerId());
Add2DBuffer(pLine);
dc.DrawEntity(pLine);
}
}
Midpoint(ptGe[0],ptGe[1],ptGe[4]);
Midpoint(ptGe[0],ptGe[2],ptGe[5]);
AcGiDraw::AcGiPoly2d pl;
AcGiDraw::Vertex3d vt;
vt.pt = ptGe[0];
vt.dBulge = .0;
pl.append(vt);
vt.pt = ptGe[4];
vt.dBulge = .0;
pl.append(vt);
vt.pt = ptGe[5];
vt.dBulge = .0;
pl.append(vt);
vt.pt = ptGe[0];
vt.dBulge = .0;
pl.append(vt);
//dc.DrawSolid(pl);
AcDbPolyline *pPoly = new AcDbPolyline();
if (pPoly)
{
pPoly->addVertexAt(0, AcGePoint2d(ptGe[0].x, ptGe[0].y));
pPoly->addVertexAt(1, AcGePoint2d(ptGe[4].x, ptGe[4].y));
pPoly->addVertexAt(2, AcGePoint2d(ptGe[5].x, ptGe[5].y));
pPoly->addVertexAt(3, AcGePoint2d(ptGe[0].x, ptGe[0].y));
Add2DBuffer(pPoly);
dc.DrawEntity(*pPoly);
}
break;
}
default:
break;
}
return Acad::eOk;
}
double AecDbEwPipeDim::UnderLineLength(LPCTSTR pszDimup) const
{
AcGiTextStyle giTxtStyle;
fromAcDbTextStyle(giTxtStyle,m_idTextSty);
giTxtStyle.setTextSize(m_dTextH * GetPScale());
giTxtStyle.setXScale(m_dWScale);
//标高脚本按一个'W'字处理
CString sDimup = pszDimup;
sDimup.Replace(DIM_EL,_T("W"));
sDimup.Replace(DIM_TOP_EL,_T("W"));
sDimup.Replace(DIM_CEN_EL,_T("W"));
sDimup.Replace(DIM_BOM_EL,_T("W"));
int nLen = sDimup.GetLength();
AcGePoint2d pt2d = giTxtStyle.extents(sDimup,Adesk::kFalse,nLen,Adesk::kTrue);
return pt2d.x;
}
AcGePoint2d AecDbEwPipeDim::DimTextExtent(LPCTSTR pszDimup) const
{
AcGiTextStyle giTxtStyle;
fromAcDbTextStyle(giTxtStyle, m_idTextSty);
giTxtStyle.setTextSize(m_dTextH * GetPScale());
giTxtStyle.setXScale(m_dWScale);
//标高脚本按一个'W'字处理
CString sDimup = pszDimup;
sDimup.Replace(DIM_EL, _T("W"));
sDimup.Replace(DIM_TOP_EL, _T("W"));
sDimup.Replace(DIM_CEN_EL, _T("W"));
sDimup.Replace(DIM_BOM_EL, _T("W"));
int nLen = sDimup.GetLength();
AcGePoint2d pt2d = giTxtStyle.extents(sDimup, Adesk::kFalse, nLen, Adesk::kTrue);
return pt2d;
}
Acad::ErrorStatus AecDbEwPipeDim::subGetGripPoints (AcDbGripDataPtrArray& grips,
const double curViewUnitSize,
const int gripSize,
const AcGeVector3d& curViewDir,
const int bitflags) const
{
assertReadEnabled();
if (m_arPoints.length() > 0)
{
memset(&m_pGripAppData[0],0,sizeof(AecGripData));
m_pGripAppData[0].nIndex = 0;
m_pGripAppData[0].ePos = eStart;
m_pGripAppData[0].nColor = kBlue;
m_pGripAppData[0].ptGrip = m_arPoints.at(0);
m_pGripAppData[0].pOwner = (AcDbEntity*)this;
AcDbGripData* pGripData = new AcDbGripData;
pGripData->setGripPoint(m_arPoints.at(0));
pGripData->setAppData((void*)&m_pGripAppData[0]);
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
grips.append(pGripData);
if (m_arPoints.length() > 1)
{
memset(&m_pGripAppData[1],0,sizeof(AecGripData));
m_pGripAppData[1].nIndex = 1;
m_pGripAppData[1].ePos = eEnd;
m_pGripAppData[1].nColor = kBlue;
m_pGripAppData[1].ptGrip = m_arPoints.at(1);
m_pGripAppData[1].pOwner = (AcDbEntity*)this;
pGripData = new AcDbGripData;
pGripData->setGripPoint(m_arPoints.at(1));
pGripData->setAppData((void*)&m_pGripAppData[1]);
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
grips.append(pGripData);
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::subMoveGripPointsAt(const AcDbVoidPtrArray& appData,const AcGeVector3d& offset,const int bitflags)
{
AssertWriteEnabled();
AecGripData* pAppData = NULL;
AcDbIntArray arIndex;
if ( !appData.isEmpty() )
{
pAppData = (AecGripData*)appData.first();
arIndex.append(pAppData->nIndex);
}
else
{
return Acad::eOk;
}
int nGripIndex = arIndex.first();
AcGePoint3d ptGe;
switch(nGripIndex)
{
case 0:
{
ptGe = m_arPoints.at(0);
ptGe += offset;
m_arPoints.setAt(0,ptGe);
break;
}
case 1:
{
ptGe = m_arPoints.at(1);
ptGe += offset;
m_arPoints.setAt(1,ptGe);
break;
}
default:
break;
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::copyFrom(const AcRxObject* pSrc)
{
AssertWriteEnabled();
AecDbEwPipeDim* pDimSrc = AecDbEwPipeDim::cast(pSrc);
if (pDimSrc != NULL)
{
m_nStyle = pDimSrc->m_nStyle;
m_nDir = pDimSrc->m_nDir;
m_nDimText = pDimSrc->m_nDimText;
m_nIsISO = pDimSrc->m_nIsISO;
m_arsUps.RemoveAll();
m_arsUps.Append(pDimSrc->m_arsUps);
m_sUpScr = pDimSrc->m_sUpScr;
m_arsDowns.RemoveAll();
m_arsDowns.Append(pDimSrc->m_arsDowns);
m_sDownScr = pDimSrc->m_sDownScr;
m_dTextH = pDimSrc->m_dTextH;
m_dWScale = pDimSrc->m_dWScale;
m_dD = pDimSrc->m_dD;
m_dPScale = pDimSrc->m_dPScale;
m_idTextSty = pDimSrc->m_idTextSty;
m_idTextLayer = pDimSrc->m_idTextLayer;
m_arPoints.removeAll();
m_arPoints.append(pDimSrc->m_arPoints);
m_arNoPoints.removeAll();
m_arNoPoints.append(pDimSrc->m_arNoPoints);
m_aridAttachs.removeAll();
m_aridAttachs.append(pDimSrc->m_aridAttachs);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::subGetOsnapPoints( AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
AcDbPolyline pl;
for (int i = 0;i < m_arPoints.length();i++)
{
pl.addVertexAt(i,m_arPoints.at(i).convert2d(AcGePlane::kXYPlane));
}
return pl.getOsnapPoints(osnapMode,gsSelectionMark,pickPoint,lastPoint,viewXform,snapPoints,geomIds);
}
Acad::ErrorStatus AecDbEwPipeDim::subTransformBy(const AcGeMatrix3d& xform)
{
AssertWriteEnabled();
AcGePoint3d ptGe;
for (int i = 0;i < m_arPoints.length();i++)
{
ptGe = m_arPoints.at(i);
ptGe.transformBy(xform);
m_arPoints.setAt(i,ptGe);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::subExplode(AcDbVoidPtrArray& entitySet) const
{
AcGiExplodeDraw draw(entitySet);
Draw2d(draw);
return Acad::eOk;
}
bool AecDbEwPipeDim::GetSNDimCircle(AcDbCircle& cir) const
{
assertReadEnabled();
if (m_arPoints.isEmpty())
return false;
AcGePoint3d ptFr = m_arPoints.last();
ptFr.z = 0.0;
AcGeVector3d vtH = AcGeVector3d::kXAxis;
double dR = m_dTextH * m_dPScale;
vtH *= 2.0 * dR;
if (m_arsUps.IsEmpty())
return false;
cir.setCenter(ptFr);
cir.setRadius(1.2 * dR);
cir.setNormal(AcGeVector3d::kZAxis);
return true;
}
bool AecDbEwPipeDim::IsSNOverlapping(const AecDbEwPipeDim* pDim) const
{
assertReadEnabled();
AcDbCircle cir1;
if ( GetSNDimCircle(cir1) )
{
AcDbCircle cir2;
if ( pDim->GetSNDimCircle(cir2) )
{
AcGePoint3dArray arPts;
cir2.intersectWith(&cir1,AcDb::kOnBothOperands,arPts);
return !arPts.isEmpty();
}
}
return false;
}
Acad::ErrorStatus AecDbEwPipeDim::dxfOutFields(AcDbDxfFiler* pFiler) const
{
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::dxfInFields(AcDbDxfFiler* pFiler)
{
AssertWriteEnabled();
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::dwgOutFields(AcDbDwgFiler* pFiler) const
{
Acad::ErrorStatus es;
// Call dwgOutFields from TDbInterfacesObj
if ((es = AecDbEntityBase::dwgOutFields(pFiler)) != Acad::eOk)
{
return es;
}
// Write version number.
pFiler->writeItem((Adesk::UInt16) VERSION_TDBFITTINGBASE);
pFiler->writeInt16(m_nStyle);
pFiler->writeInt16(m_nDir);
pFiler->writeInt16(m_nDimText);
pFiler->writeInt16(m_nIsISO);
pFiler->writeInt32((Adesk::Int32)m_arsUps.GetSize());
for (int i = 0;i < m_arsUps.GetSize();i++)
{
pFiler->writeString((const TCHAR *)m_arsUps.GetAt(i));
}
pFiler->writeString((const TCHAR *)m_sUpScr);
Adesk::UInt32 nSize;
nSize = (Adesk::UInt32)m_arsDowns.GetSize();
pFiler->writeUInt32(nSize);
for (int i = 0;i < m_arsDowns.GetSize();i++)
{
pFiler->writeString((const TCHAR *)m_arsDowns.GetAt(i));
}
pFiler->writeString((const TCHAR *)m_sDownScr);
pFiler->writeDouble(m_dTextH);
pFiler->writeDouble(m_dWScale);
pFiler->writeDouble(m_dD);
pFiler->writeDouble(m_dPScale);
pFiler->writeSoftPointerId(m_idTextSty);
pFiler->writeSoftPointerId(m_idTextLayer);
pFiler->writeInt32(m_arPoints.length());
for (int i = 0;i < m_arPoints.length();i++)
{
pFiler->writePoint3d(m_arPoints.at(i));
}
pFiler->writeInt32(m_arNoPoints.length());
for (int i = 0;i < m_arNoPoints.length();i++)
{
pFiler->writePoint3d(m_arNoPoints.at(i));
}
pFiler->writeInt32(m_aridAttachs.length());
for (int i = 0;i < m_aridAttachs.length();i++)
{
pFiler->writeSoftPointerId(m_aridAttachs.at(i));
}
m_mapSpecXData.dwgOutFields(pFiler);
return Acad::eOk;
}
Acad::ErrorStatus AecDbEwPipeDim::dwgInFields(AcDbDwgFiler* pFiler)
{
AssertWriteEnabled();
Acad::ErrorStatus es;
// Call dwgInFields from TDbInterfacesObj
if ((es = AecDbEntityBase::dwgInFields(pFiler)) != Acad::eOk)
{
return es;
}
// Read version number.
Adesk::UInt16 version;
pFiler->readItem(&version);
if (version > VERSION_TDBFITTINGBASE)
return Acad::eMakeMeProxy;
pFiler->readInt16(&m_nStyle);
pFiler->readInt16(&m_nDir);
pFiler->readInt16(&m_nDimText);
pFiler->readInt16(&m_nIsISO);
Adesk::Int32 nUps = 0;
pFiler->readInt32(&nUps);
m_arsUps.RemoveAll();
TCHAR* pszText = NULL;
for (int i = 0;i < nUps;i++)
{
pFiler->readString(&pszText);
m_arsUps.Add(pszText);
}
pFiler->readString(&pszText);
m_sUpScr = pszText;
Adesk::Int32 nDowns = 0;
pFiler->readInt32(&nDowns);
m_arsDowns.RemoveAll();
for (int i = 0;i < nDowns;i++)
{
pFiler->readString(&pszText);
m_arsDowns.Add(pszText);
}
pFiler->readString(&pszText);
m_sDownScr = pszText;
pFiler->readDouble(&m_dTextH);
pFiler->readDouble(&m_dWScale);
pFiler->readDouble(&m_dD);
pFiler->readDouble(&m_dPScale);
AcDbSoftPointerId id;
pFiler->readSoftPointerId(&id);
m_idTextSty = id;
pFiler->readSoftPointerId(&id);
m_idTextLayer = id;
Adesk::Int32 nPts = 0;
pFiler->readInt32(&nPts);
m_arPoints.removeAll();
AcGePoint3d ptGe;
for (int i = 0;i < nPts;i++)
{
pFiler->readPoint3d(&ptGe);
m_arPoints.append(ptGe);
}
nPts = 0;
pFiler->readInt32(&nPts);
m_arNoPoints.removeAll();
for (int i = 0;i < nPts;i++)
{
pFiler->readPoint3d(&ptGe);
m_arNoPoints.append(ptGe);
}
Adesk::Int32 nLen = 0;
pFiler->readInt32(&nLen);
m_aridAttachs.removeAll();
for (int i = 0;i < nLen;i++)
{
pFiler->readSoftPointerId(&id);
m_aridAttachs.append(id);
}
if (version >= 2)
{
m_mapSpecXData.dwgInFields(pFiler);
}
return Acad::eOk;
}
void AecDbEwPipeDim::SetPScale(double dScale)
{
AssertWriteEnabled();
m_dPScale = dScale;
}
double AecDbEwPipeDim::GetPScale() const
{
assertReadEnabled();
return m_dPScale;
}
#define ELE_FLAG _T("标高")
namespace
{
bool isHoleElevDim(AecDbEwPipeDim *pDim)
{
CString sUp, sDw;
pDim->GetDimText(0, sUp, sDw);
if (sUp.Find(ELE_FLAG) != -1)
return true;
if (sDw.Find(ELE_FLAG) != -1)
return true;
return false;
}
bool isPipeElevDim(AecDbEwPipeDim *pDim)
{
CString sUp, sDw;
pDim->GetDimupScript(sUp);
pDim->GetDimdownScript(sDw);
if (sUp.Find(ELE_FLAG) != -1)
return true;
if (sDw.Find(ELE_FLAG) != -1)
return true;
return false;
}
// {}-{}*{}&{}
// 收集-,*,&
void collectSplite(LPCTSTR psz, std::set<CString> &ss)
{
CString str(psz);
int idx1(0), idx2(0);
while (true)
{
idx1 = str.Find(_T("}{"), idx2);
idx2 = str.Find(_T("}{"), idx1 + 1);
if (idx1 == -1 || idx2 == -1) break;
ss.insert(str.Mid(idx1 + 2, idx2 - idx1 - 2));
}
}
bool IsHit(LPCTSTR psz, const std::set<CString> &sps)
{
std::set<CString>::const_iterator it(sps.begin());
for (; it != sps.end(); ++it)
{
const CString &sp(*it);
if (sp == psz)
return true;
}
return false;
}
int getIndexByFilter(LPCTSTR psz, LPCTSTR filter, const std::set<CString> &sps)
{
CString str(psz), sMid;
int idx1(0), idx2(0), idx(0);
while (true)
{
idx1 = str.Find(_T("{"), idx2);
idx2 = str.Find(_T("}"), idx1);
if (idx1 == -1 || idx2 == -1) break;
sMid = str.Mid(idx1 + 1, idx2 - idx1 - 1);
if (IsHit(sMid, sps))
continue;
if (sMid == filter)
break;
++idx;
}
return idx;
}
// 判断 psz 的 start 位置的字符在不在 sps 里面,如果在里面,说明start后面是一个分隔符
// end则是分隔符后的第一个字符位置
bool IsHit(LPCTSTR psz, const std::set<CString> &sps, const int &start, int &end)
{
std::set<CString>::const_iterator it(sps.begin());
CString strSrc(psz), sMid;
int spLen(0), srcLen(strSrc.GetLength());
for (; it != sps.end(); ++it)
{
const CString &sp(*it);
spLen = sp.GetLength();
if (spLen + start >= srcLen) continue;
sMid = strSrc.Mid(start, spLen);
if (sMid == sp) // 击中
{
end = start + spLen;
return true;
}
}
return false;
}
int SplitString(LPCTSTR psz, const std::set<CString> &sps, std::vector<CString> &strs)
{
CString str(psz);
int end(0), prev(0);
for (int i(0); i < str.GetLength(); ++i)
{
if (IsHit(psz, sps, i, end))
{
strs.push_back(str.Mid(prev, i - prev));
prev = end;
i = end;
continue;
}
}
strs.push_back(std::wstring(str).substr(end).c_str());
return (int)strs.size();
}
bool getHoleElev(LPCTSTR psz, double &dElev_mm, int &start, int &end)
{
std::wstring str(psz);
size_t idx(str.find(ELE_FLAG));
if (idx == -1)
return false;
start = idx + CString(ELE_FLAG).GetLength();
str = str.substr(start);
if (CoreTools::IsMeterUnitForHoleElevDim())
{
str = str.substr(0, str.size() - 1);
dElev_mm = TypeConvert::s2f(str.c_str());
dElev_mm *= 1000;
}
else
{
str = str.substr(0, str.size() - 2);
dElev_mm = TypeConvert::s2f(str.c_str());
}
end = start + str.size();
return true;
}
bool getPipeElev(LPCTSTR pszSrc, LPCTSTR pszTxt, double &dEle_mm, int &start, int &end)
{
CString sSrc(pszSrc), sElev;
std::set<CString> sps;
std::vector<CString> ss;
int idxElev(0);
if (sSrc.Find(ELE_FLAG) != -1)
{
collectSplite(sSrc, sps);
idxElev = getIndexByFilter(sSrc, ELE_FLAG, sps);
SplitString(pszTxt, sps, ss);
if (idxElev < ss.size())
sElev = ss[idxElev];
}
else
return false;
std::wstring wTxt(pszTxt);
start = wTxt.find(sElev);
std::wstring s(sElev);
size_t idx(s.find(_T("\\")));
if (idx != -1)
{
sElev = s.substr(idx + 7).c_str();
start += 7;
}
end = start + sElev.GetLength();
dEle_mm = TypeConvert::s2f(sElev);
if (CoreTools::IsMeterUnitForPipeElevDim())
dEle_mm *= 1000;
return true;
}
CString makeNewString(LPCTSTR psz
, const int &start
, const int &end
, const double &dElve_mm
, const bool bPipeElev)
{
std::wstring ws(psz);
std::wstring s1 = ws.substr(0, start);
std::wstring s2 = ws.substr(end);
bool bMeter(false);
int nPrec(0);
if (bPipeElev)
{
bMeter = CoreTools::IsMeterUnitForPipeElevDim();
nPrec = CoreTools::getPrecForPipeElevDim();
}
else
{
bMeter = CoreTools::IsMeterUnitForHoleElevDim();
nPrec = CoreTools::getPrecForHoleElevDim();
}
double d(dElve_mm);
if (bMeter)
d *= .001;
CString format(_T(""));
format.Format(_T("%s%%.%df%s"), s1.c_str(), nPrec, s2.c_str());
CString s;
s.Format(format, d);
return s;
}
}
bool AecDbEwPipeDim::GetElevation(double &dEle_mm)
{
if (!HasElevation()) return false;
CString sUp, sDw;
if (!m_arsUps.IsEmpty())
sUp = m_arsUps[0];
if (!m_arsDowns.IsEmpty())
sDw = m_arsDowns[0];
int start, end;
CString sElev;
if (isHoleElevDim(this))
{
if (sUp.Find(ELE_FLAG) != -1)
{
getHoleElev(sUp, dEle_mm, start, end);
}
if (sDw.Find(ELE_FLAG) != -1)
{
getHoleElev(sDw, dEle_mm, start, end);
}
}
else if (isPipeElevDim(this))
{
if (m_sUpScr.Find(ELE_FLAG) != -1)
{
getPipeElev(m_sUpScr, sUp, dEle_mm, start, end);
}
if (m_sDownScr.Find(ELE_FLAG) != -1)
{
getPipeElev(m_sDownScr, sDw, dEle_mm, start, end);
}
}
sElev.Format(_T("%.2f"), dEle_mm);
dEle_mm = TypeConvert::s2f(sElev);
return true;
}
bool AecDbEwPipeDim::HasElevation()
{
CString sUp, sDw;
if (!m_arsUps.IsEmpty())
sUp = m_arsUps[0];
if (!m_arsDowns.IsEmpty())
sDw = m_arsDowns[0];
if (m_sUpScr.Find(ELE_FLAG) != -1)
return true;
if (m_sDownScr.Find(ELE_FLAG) != -1)
return true;
if (sUp.Find(ELE_FLAG) != -1)
return true;
if (sDw.Find(ELE_FLAG) != -1)
return true;
return false;
}
void AecDbEwPipeDim::ModifyElevation(const double &dDelta_m)
{
AssertWriteEnabled();
CString sUp, sDw;
if (!m_arsUps.IsEmpty())
sUp = m_arsUps[0];
if (!m_arsDowns.IsEmpty())
sDw = m_arsDowns[0];
double dNew(dDelta_m * 1000), dOld;
int start, end;
if (isHoleElevDim(this))
{
if (sUp.Find(ELE_FLAG) != -1)
{
getHoleElev(sUp, dOld, start, end);
dNew += dOld;
sUp = makeNewString(sUp, start, end, dNew, false);
if (!m_arsUps.IsEmpty())
m_arsUps[0] = sUp;
}
if (sDw.Find(ELE_FLAG) != -1)
{
getHoleElev(sDw, dOld, start, end);
dNew += dOld;
sDw = makeNewString(sDw, start, end, dNew, false);
if (!m_arsDowns.IsEmpty())
m_arsDowns[0] = sDw;
}
}
else if (isPipeElevDim(this))
{
if (m_sUpScr.Find(ELE_FLAG) != -1)
{
getPipeElev(m_sUpScr, sUp, dOld, start, end);
dNew += dOld;
sUp = makeNewString(sUp, start, end, dNew, true);
if (!m_arsUps.IsEmpty())
m_arsUps[0] = sUp;
}
if (m_sDownScr.Find(ELE_FLAG) != -1)
{
getPipeElev(m_sDownScr, sDw, dOld, start, end);
dNew += dOld;
sDw = makeNewString(sDw, start, end, dNew, true);
if (!m_arsDowns.IsEmpty())
m_arsDowns[0] = sDw;
}
}
return;
}
int AecDbEwPipeDim::GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray &arEntPtrs) const
{
assertReadEnabled();
AcDbEntity *pEnt = NULL, *pEntT = NULL;
const AcDbVoidPtrArray &ar2D = Get2DBuffer();
for (int i = 0; i < ar2D.length(); i++)
{
pEnt = (AcDbEntity *)ar2D.at(i);
pEntT = (AcDbEntity *)pEnt->clone();
pEntT->setLayer(pEnt->layer());
arEntPtrs.append(pEntT);
}
return arEntPtrs.length();
}
void AecDbEwPipeDim::saveAs(AcGiWorldDraw *pWd, AcDb::SaveType saveType)
{
AcGiRegenType rtype = pWd->regenType();
if (rtype == kAcGiSaveWorldDrawForProxy)
{
drawProxyEntity(&Get2DBuffer(), pWd);
}
else
{
AcDbEntity::saveAs(pWd, saveType);
}
}
const AecDbObjXDataMap* AecDbEwPipeDim::GetSpecialtyData() const
{
assertReadEnabled();
return &m_mapSpecXData;
}
AecDbObjXDataMap* AecDbEwPipeDim::GetSpecialtyData(AcDb::OpenMode bMode)
{
if (bMode == AcDb::kForWrite)
{
if (!isWriteEnabled())
{
upgradeOpen();
}
assertWriteEnabled();
}
else
{
assertReadEnabled();
}
return &m_mapSpecXData;
}
bool AecDbEwPipeDim::SetCustomNoR(const double &v)
{
AssertWriteEnabled();
return m_mapSpecXData.SetAt(_Custom_No_R_, v) == 1 ? true : false;
}
double AecDbEwPipeDim::GetCustomNoR() const
{
assertReadEnabled();
double v;
m_mapSpecXData.GetAt(_Custom_No_R_, v);
return v;
}