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

837 lines
19 KiB
C++

#include "stdafx.h"
#include "AecDbLineStair.h"
#include "AecDbEarthWorm.h"
#include "AcDbX3dSolid.h"
static const Adesk::UInt16 kRed = 1;
static const Adesk::UInt16 kYellow = 2;
static const Adesk::UInt16 kGreen = 3;
extern AcDbPolyline* FormatPolyline(AcGePoint3d* ppPts,int nCount);
extern AcGePoint3d MidPoint(const AcGePoint3d& pt1, const AcGePoint3d& pt2);
extern BOOL DLLIMPEXP GetDimGripOff();
extern void DLLIMPEXP OrthoProjected3DSolid(AcDb3dSolid* pSolidClone,const AcGePlane& plan,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs);
static const Adesk::UInt16 kColorByLayer = 256;
Adesk::UInt32 AecDbLineStair::kCurrentVersionNumber = 1;
ACRX_DXF_DEFINE_MEMBERS (AecDbLineStair, AecDbBaseStair,
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning,
AEC_DBLSTAIR,
"AecDbLineStair"
"|Product Desc: shanghua earthworm app obj"
"|Company: shanghua inc"
"|WEB Address: www.shanghuasoft.com")
AecDbLineStair::AecDbLineStair(void)
{
m_mapSpecXData.SetAt(KEY_NAME,_T("直梯"));
}
AecDbLineStair::~AecDbLineStair(void)
{
}
Acad::ErrorStatus AecDbLineStair::dwgInFields(AcDbDwgFiler* pFiler)
{
AssertWriteEnabled();
//----- Read parent class information first.
Acad::ErrorStatus es = AecDbBaseStair::dwgInFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
//----- Object version number needs to be read first
Adesk::UInt32 version =0 ;
if ( (es =pFiler->readUInt32 (&version)) != Acad::eOk )
return (es) ;
if ( version > AecDbLineStair::kCurrentVersionNumber )
return (Acad::eMakeMeProxy);
return pFiler->filerStatus();
}
Acad::ErrorStatus AecDbLineStair::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
//----- Save parent class information first.
Acad::ErrorStatus es = AecDbBaseStair::dwgOutFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
//----- Object version number needs to be saved first
if ( (es =pFiler->writeUInt32 (AecDbLineStair::kCurrentVersionNumber)) != Acad::eOk )
return (es) ;
return pFiler->filerStatus();
}
Acad::ErrorStatus AecDbLineStair::dxfInFields(AcDbDxfFiler* pFiler)
{
return Acad::eOk;
}
Acad::ErrorStatus AecDbLineStair::dxfOutFields(AcDbDxfFiler* pFiler) const
{
return Acad::eOk;
}
void AecDbLineStair::subList() const
{
assertReadEnabled();
acutPrintf(_T("\n直梯爬梯"));
AecDbBaseStair::subList();
}
Acad::ErrorStatus AecDbLineStair::subTransformBy(const AcGeMatrix3d& xform)
{
AecDbEwPipeBase::subTransformBy(xform);
double dBomEl = 0;
m_mapSpecXData.GetAt(KEY_BOMEL,dBomEl);
AcGePoint3d pt(0,0,dBomEl);
pt.transformBy(xform);
m_mapSpecXData.SetAt(KEY_BOMEL,pt.z);
dBomEl = 0;
m_mapSpecXData.GetAt(KEY_TOPEL,dBomEl);
pt.set(0,0,dBomEl);
pt.transformBy(xform);
m_mapSpecXData.SetAt(KEY_TOPEL,pt.z);
return Acad::eOk;
}
bool AecDbLineStair::GetBimInfoTip(CString& sInfoTip) const
{
assertReadEnabled();
CString sField,sFmt;
sField = _T("直梯爬梯:\n");
sInfoTip += sField;
LineStair data;
memset(&data,0,sizeof(LineStair));
GetLineStairData(data);
MAKEFIELD(_T("护栏高"),_T("%d"),(int)(data.bar.dH+0.5),sInfoTip);
MAKEFIELD(_T("栅格间距"),_T("%d"),(int)(data.bar.dP+0.5),sInfoTip);
MAKEFIELD(_T("高度H1"),_T("%d"),(int)(data.bar.dH1+0.5),sInfoTip);
MAKEFIELD(_T("护栏管径"),_T("%d"),(int)(data.bar.dD+0.5),sInfoTip);
MAKEFIELD(_T("踏步高度"),_T("%d"),(int)(data.dSteepH+0.5),sInfoTip);
MAKEFIELD(_T("踏板厚度"),_T("%d"),(int)(data.dSteept+0.5),sInfoTip);
MAKEFIELD(_T("踏板宽度"),_T("%d"),(int)(data.dSteepW+0.5),sInfoTip);
MAKEFIELD(_T("楼梯总宽"),_T("%d"),(int)(data.dW+0.5),sInfoTip);
MAKEFIELD(_T("侧板宽度"),_T("%d"),(int)(data.dSideW+0.5),sInfoTip);
MAKEFIELD(_T("侧板厚度"),_T("%d"),(int)(data.dSidet+0.5),sInfoTip);
MAKEFIELD(_T("底部标高"),_T("%.2f"),data.dBomEl,sInfoTip);
MAKEFIELD(_T("顶部标高"),_T("%.2f"),data.dTopEl,sInfoTip);
MAKEFIELD(_T("材质"),_T("%s"),data.m_sMaterial,sInfoTip);
MAKEFIELD(_T("生产厂家"),_T("%s"),data.m_sFactory,sInfoTip);
MAKEFIELD(_T("编号"),_T("%s"),data.m_sNo,sInfoTip);
return true;
}
Acad::ErrorStatus AecDbLineStair::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled();
AcDbObjectId idCurLay = dc.GetLayerId();
AcDbObjectId idCurLty = dc.GetLineTypeId();
Adesk::UInt16 nCrBk = colorIndex();
int nColor = nCrBk;
if ( m_mapSpecXData.GetAt(_T("COLOR"),nColor) )
{
dc.SetColor(nColor);
}
//二维缓存,未知出错!
if (Has2DBuffer())
{
AcDbEntity* pEnt = NULL;
const AcDbVoidPtrArray &ar2D = Get2DBuffer();
for (int i = 0;i < ar2D.length();i++)
{
pEnt = (AcDbEntity*)ar2D.at(i);
dc.DrawEntity(*pEnt);
}
dc.SetColor(nCrBk);
dc.SetLayer(idCurLay);
dc.SetLineType(idCurLty);
return Acad::eOk;
}
LineStair data;
GetLineStairData(data);
if (m_pBaseCurve != NULL)//路径
{
AcDbLine* pLn = AcDbLine::cast(m_pBaseCurve);
if (pLn != NULL)
{
AcGePoint3d ptSta,ptEnd;
ptSta = pLn->startPoint();
ptEnd = pLn->endPoint();
ptSta.z = ptEnd.z = 0.0;
AcGeVector3d vtV = ptEnd - ptSta;
AcGeVector3d vtL = vtV;
vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
vtV.normalize();
//左线
AcGePoint3d ptGe[5];
ptGe[0] = ptSta;
ptGe[0] += vtV * 0.5 * data.dW;
ptGe[1] = ptEnd;
ptGe[1] += vtV * 0.5 * data.dW;
ptGe[2] = ptGe[1];
ptGe[2] -= vtV * data.dSidet;
ptGe[3] = ptGe[0];
ptGe[3] -= vtV * data.dSidet;
ptGe[4] = ptGe[0];
//1.两侧边
AcDbPolyline* pPl = FormatPolyline(ptGe,5);
if (pPl != NULL)
{
dc.DrawEntity(pPl);
Add2DBuffer(pPl);
}
for (int i = 0;i < 5;i++)
{
ptGe[i] -= vtV * (data.dW - data.dSidet);
}
pPl = FormatPolyline(ptGe,5);
if (pPl != NULL)
{
dc.DrawEntity(pPl);
Add2DBuffer(pPl);
}
//2.内部踏板投影
//水平长
double dLen = ptEnd.distanceTo(ptSta);
//垂直高
double dH = data.dTopEl - data.dBomEl;
//踏步数
int nCount = (int)(dLen / data.dSteepW);
ptGe[0] = ptSta;
ptGe[0] += vtV * 0.5 * (data.dW - 2 * data.dSidet);
ptGe[1] = ptSta;
ptGe[1] -= vtV * 0.5 * (data.dW - 2 * data.dSidet);
AcDbLine* pLn = NULL;
vtL.normalize();
for (int i = 0;i < nCount;i++)
{
ptGe[0] += vtL * data.dSteepW;
ptGe[1] += vtL * data.dSteepW;
pLn = new AcDbLine;
pLn->setStartPoint(ptGe[0]);
pLn->setEndPoint(ptGe[1]);
dc.DrawEntity(pLn);
Add2DBuffer(pLn);
}
//绘制增高方向线 ----->
pLn = new AcDbLine;
pLn->setStartPoint(ptSta);
pLn->setEndPoint(ptEnd);
pLn->setColorIndex(kRed);
dc.DrawEntity(pLn);
Add2DBuffer(pLn);
ptSta = ptEnd;
vtL.normalize();
ptSta -= vtL * 0.25 * data.dSteepW;
ptSta += vtV * 0.25 * data.dSteepW;
pLn = new AcDbLine;
pLn->setStartPoint(ptSta);
pLn->setEndPoint(ptEnd);
pLn->setColorIndex(kRed);
dc.DrawEntity(pLn);
Add2DBuffer(pLn);
ptSta = ptEnd;
vtV.normalize();
ptSta -= vtL * 0.25 * data.dSteepW;
ptSta -= vtV * 0.25 * data.dSteepW;
pLn = new AcDbLine;
pLn->setStartPoint(ptSta);
pLn->setEndPoint(ptEnd);
pLn->setColorIndex(kRed);
dc.DrawEntity(pLn);
Add2DBuffer(pLn);
}
dc.SetColor(nCrBk);
dc.SetLayer(idCurLay);
dc.SetLineType(idCurLty);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbLineStair::Draw3d(AcGiDraw &dc) const
{
//样子参照 PDMS 的样子
assertReadEnabled();
//管线系统屏蔽掉
if ( dc.IsDragging() )
{
//return Acad::eOk;
}
if (m_pBaseCurve == NULL)
return Acad::eInvalidInput;
//图层
AcDbObjectId idLay = dc.GetLayerId();
dc.SetLayer(layerId());
int nCrBk = dc.GetColor();
int nColor = nCrBk;
if ( m_mapSpecXData.GetAt(_T("COLOR"),nColor) )
{
dc.SetColor(nColor);
}
if (Has3DBuffer())
{
//Clean3DBuffer();
AcDbEntity* pEnt = NULL;
const AcDbVoidPtrArray &ar3D = Get3DBuffer();
for (int i = 0;i < ar3D.length();i++)
{
pEnt = (AcDbEntity*)ar3D.at(i);
pEnt->setColorIndex(nColor);
dc.DrawEntity(*pEnt);
}
dc.SetLayer(idLay);
dc.SetColor(nCrBk);
return Acad::eOk;
}
LineStair data;
GetLineStairData(data);
if (m_pBaseCurve != NULL)//路径
{
AcDbLine* pLn = AcDbLine::cast(m_pBaseCurve);
if (pLn != NULL)
{
AcGePoint3d ptSta,ptEnd;
ptSta = pLn->startPoint();
ptEnd = pLn->endPoint();
ptSta.z = data.dBomEl;
ptEnd.z = data.dTopEl;
DrawSide3d(dc,ptSta,ptEnd,data);
DrawSteep3d(dc,ptSta,ptEnd,data);
DrawGuardBar3d(dc,ptSta,ptEnd,data);
}
}
dc.SetLayer(idLay);
dc.SetColor(nCrBk);
return Acad::eOk;
}
Acad::ErrorStatus AecDbLineStair::DrawSide3d(AcGiDraw &dc,const AcGePoint3d& ptSta,const AcGePoint3d& ptEnd,const LineStair& data) const
{
assertReadEnabled();
AcGePoint3d ptGe[5];
AcGeVector3d vtL = ptEnd - ptSta;
double dAngle = asin(fabs(vtL.z) /vtL.length());
vtL.z = 0.0;
vtL.normalize();
AcGeVector3d vtW = vtL;
vtW.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
ptGe[0] = ptSta;
ptGe[0] -= vtW * 0.5 * data.dW;
ptGe[1] = ptGe[0];
ptGe[1] += AcGeVector3d::kZAxis * data.dSideW / cos(dAngle);
ptGe[3] = ptEnd;
ptGe[3] -= vtW * 0.5 * data.dW;
ptGe[2] = ptGe[3];
ptGe[2] += AcGeVector3d::kZAxis * data.dSideW / cos(dAngle);
ptGe[4] = ptGe[0];
AcDbLine ln;
ln.setStartPoint(ptGe[0]);
ln.setEndPoint(ptGe[0] + vtW * data.dSidet);
AcDbRegion* pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe,5);
if (pReg != NULL)
{
AcDbX3dSolid xSolid;
if ( xSolid.CreateExtrude(pReg,ln) )
{
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
if (pSolid != NULL)
{
pSolid->setTransparency(transparency());
dc.DrawEntity(pSolid);
Add3DBuffer(pSolid);
AcGeMatrix3d xform;
vtW *= (data.dW - data.dSidet);
xform.setTranslation(vtW);
AcDb3dSolid* pOtherSide = (AcDb3dSolid*)pSolid->clone();
if (pOtherSide != NULL)
{
pOtherSide->setTransparency(transparency());
pOtherSide->transformBy(xform);
dc.DrawEntity(pOtherSide);
Add3DBuffer(pOtherSide);
}
}
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbLineStair::DrawSteep3d(AcGiDraw &dc,const AcGePoint3d& ptSta,const AcGePoint3d& ptEnd,const LineStair& data) const
{
assertReadEnabled();
AcGeVector3d vtL = ptEnd - ptSta;
double dAngle = asin(fabs(vtL.z) /vtL.length());
double dL = vtL.length();
AcGeVector3d vtLXY = vtL;
vtLXY.z = 0.0;
//一共多少步
int nCount = (int)( (data.dTopEl - data.dBomEl) / data.dSteepH);
vtL.normalize();
vtLXY.normalize();
AcGeVector3d vtW = vtLXY;
vtW.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
vtW.normalize();
//踏步斜边步长
double dLSteep = data.dSteepH / sin(dAngle);
//踏步左右总长
double dSteepL = (data.dW - 2.0 * data.dSidet);
AcGePoint3d ptGe[5];
AcGePoint3d ptFr = ptSta;
ptGe[0] = ptFr;
ptGe[0].z -= data.dSteept;//以板顶部为基准
ptGe[0] -= vtLXY * data.dSteept / tan(dAngle);
ptGe[0] -= vtLXY * data.dSteepW;
ptGe[0] -= vtW * 0.5 * dSteepL;
ptGe[1] = ptGe[0];
ptGe[1] += vtLXY * data.dSteepW;
ptGe[2] = ptGe[1];
ptGe[2] += vtW * dSteepL;
ptGe[3] = ptGe[0];;
ptGe[3] += vtW * dSteepL;
ptGe[4] = ptGe[0];
AcDbLine ln;
for(int i = 0;i < nCount;i++)
{
for(int j = 0;j < 5;j++)
{
ptGe[j] += vtL * dLSteep;
}
ln.setStartPoint(ptGe[0]);
ln.setEndPoint(ptGe[0] + AcGeVector3d::kZAxis * data.dSteept);
AcDbRegion* pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe,5);
if (pReg != NULL)
{
AcDbX3dSolid xSolid;
if ( xSolid.CreateExtrude(pReg,ln) )
{
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
if (pSolid != NULL)
{
pSolid->setTransparency(transparency());
dc.DrawEntity(pSolid);
Add3DBuffer(pSolid);
}
}
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbLineStair::DrawGuardBar3d(AcGiDraw &dc,const AcGePoint3d& ptSta,const AcGePoint3d& ptEnd,const LineStair& data) const
{
assertReadEnabled();
AcCmTransparency tr = transparency();
AcCmTransparency oldTr = dc.SetTransparency(tr);
int nCrBk = dc.GetColor();
int nColor = nCrBk;
if ( m_mapSpecXData.GetAt(_T("COLOR"),nColor) )
{
}
AcGeVector3d vtLN(0,0,0);
AcGeVector3d vtL = ptEnd - ptSta;
double dAngle = asin(fabs(vtL.z) /vtL.length());
double dL = vtL.length();
vtL.normalize();
AcGeVector3d vtLXY = vtL;
vtLXY.z = 0.0;
vtLXY.normalize();
AcGeVector3d vtW = vtLXY;
vtW.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
vtW.normalize();
double dH = data.bar.dH;
double dH1 = data.bar.dH1;
int nCols = (int)( dL / data.bar.dP + 0.5);
AcGePoint3d ptGe[3];
ptGe[0] = ptSta;
ptGe[0] -= vtW * 0.5 * (data.dW - data.dSidet);
ptGe[1] = ptGe[0] + AcGeVector3d::kZAxis * dH1;
ptGe[2] = ptGe[0] + AcGeVector3d::kZAxis * dH;
AcGePoint3d ptGeFrL[3],ptGeFrR[3],ptGeR[3];
memcpy(ptGeFrL,ptGe,sizeof(AcGePoint3d) * 3);
memcpy(ptGeFrR,ptGe,sizeof(AcGePoint3d) * 3);
for (int k = 0;k < 3;k++)
{
ptGeFrR[k] += vtW * (data.dW - data.dSidet);
}
AcDbLine ln;
AcDbEntity* pEnt3d = NULL;
AcDbRegion* pRegCln = NULL;
AcGePoint3d ptGe0T;
for(int i = 0;i <= nCols;i++)
{
pRegCln = GetSection();
if (pRegCln != NULL)
{
ln.setStartPoint(ptGe[0]);
ln.setEndPoint(ptGe[2]);
pEnt3d = dc.DrawPipe(&ln,pRegCln,AcGePoint3d::kOrigin);
if (pEnt3d != NULL)
{
pEnt3d->setColorIndex(nColor);
Add3DBuffer(pEnt3d);
}
delete pRegCln;
pRegCln = NULL;
}
//右边
memcpy(ptGeR,ptGe,sizeof(AcGePoint3d) * 3);
for (int k = 0;k < 3;k++)
{
ptGeR[k] += vtW * (data.dW - data.dSidet);
}
pRegCln = GetSection();
if (pRegCln != NULL)
{
ln.setStartPoint(ptGeR[0]);
ln.setEndPoint(ptGeR[2]);
pEnt3d = dc.DrawPipe(&ln,pRegCln,AcGePoint3d::kOrigin);
if (pEnt3d != NULL)
{
pEnt3d->setColorIndex(nColor);
Add3DBuffer(pEnt3d);
}
delete pRegCln;
pRegCln = NULL;
}
ptGe[0] += vtL * data.bar.dP;
ptGe[1] += vtL * data.bar.dP;
ptGe[2] += vtL * data.bar.dP;
if ( (ptGe[0].z - ptEnd.z) > 1.e-3)
{
ptGe[0] = ptEnd;
ptGe[0] -= vtW * 0.5 * (data.dW - data.dSidet);
ptGe[1] = ptGe[0] + AcGeVector3d::kZAxis * dH1;
ptGe[2] = ptGe[0] + AcGeVector3d::kZAxis * dH;
}
}
//斜边 左侧
pRegCln = GetSection();
if (pRegCln != NULL)
{
ln.setStartPoint(ptGeFrL[1]);
ln.setEndPoint(ptGe[1]);
pEnt3d = dc.DrawPipe(&ln,pRegCln,AcGePoint3d::kOrigin);
if (pEnt3d != NULL)
{
pEnt3d->setColorIndex(nColor);
Add3DBuffer(pEnt3d);
}
delete pRegCln;
pRegCln = NULL;
}
pRegCln = GetSection();
if (pRegCln != NULL)
{
ln.setStartPoint(ptGeFrL[2]);
ln.setEndPoint(ptGe[2]);
pEnt3d = dc.DrawPipe(&ln,pRegCln,AcGePoint3d::kOrigin);
if (pEnt3d != NULL)
{
pEnt3d->setColorIndex(nColor);
Add3DBuffer(pEnt3d);
}
delete pRegCln;
pRegCln = NULL;
}
//斜边右侧
memcpy(ptGeR,ptGe,sizeof(AcGePoint3d) * 3);
for (int k = 0;k < 3;k++)
{
ptGeR[k] += vtW * (data.dW - data.dSidet);
}
pRegCln = GetSection();
if (pRegCln != NULL)
{
ln.setStartPoint(ptGeFrR[1]);
ln.setEndPoint(ptGeR[1]);
pEnt3d = dc.DrawPipe(&ln,pRegCln,AcGePoint3d::kOrigin);
if (pEnt3d != NULL)
{
pEnt3d->setColorIndex(nColor);
Add3DBuffer(pEnt3d);
}
delete pRegCln;
pRegCln = NULL;
}
pRegCln = GetSection();
if (pRegCln != NULL)
{
ln.setStartPoint(ptGeFrR[2]);
ln.setEndPoint(ptGeR[2]);
pEnt3d = dc.DrawPipe(&ln,pRegCln,AcGePoint3d::kOrigin);
if (pEnt3d != NULL)
{
pEnt3d->setColorIndex(nColor);
Add3DBuffer(pEnt3d);
}
delete pRegCln;
pRegCln = NULL;
}
dc.SetTransparency(oldTr);
return Acad::eOk;
}
SHJson::WValue &AecDbLineStair::ToJson(bool bExprotGeo) const
{
assertReadEnabled();
using namespace SHJson;
WValue &v = AecDbEwPipeBase::ToJson(bExprotGeo);
/*
GuardBar bar;//扶手
double dSteepH;//踏步高度
double dSteept;//踏步板厚
double dSteepW;//踏步板宽
double dSidet;//底侧板厚>扶手直径
double dSideW;//底侧板宽
double dW; //总宽
double dBomEl;//底部标高
double dTopEl;//顶部标高
BOOL bBomSta;//对于圆弧,是否是开始位置为底标高
TCHAR m_sMaterial[256];
TCHAR m_sFactory[256];//厂家
TCHAR m_sNo[256];
*/
LineStair data;
::memset(&data, 0, sizeof(LINESTAIR));
GetLineStairData(data);
WValue vBar;
addMember(vBar, _T("__dD__"), data.bar.dD);
addMember(vBar, _T("__dt__"), data.bar.dt);
addMember(vBar, _T("__dBomEl__"), data.bar.dBomEl);
addMember(vBar, _T("__dH1__"), data.bar.dH1);
addMember(vBar, _T("__dH__"), data.bar.dH);
addMember(vBar, _T("__dP__"), data.bar.dP);
addMember(vBar, _T("__bNoBomLever__"), data.bar.bNoBomLever == FALSE ? false : true);
addMember(vBar, _T("__bIsRectLever__"), data.bar.bIsRectLever == FALSE ? false : true);
addMember(vBar, _T("__sMaterial__"), data.bar.m_sMaterial);
addMember(vBar, _T("__sFactory__"), data.bar.m_sFactory);
addMember(vBar, _T("__sNo__"), data.bar.m_sNo);
addMember(v, _T("__bar__"), vBar);
addMember(v, _T("__dSteepH__"), data.dSteepH);
addMember(v, _T("__dSteept__"), data.dSteept);
addMember(v, _T("__dSteepW__"), data.dSteepW);
addMember(v, _T("__dSidet__"), data.dSidet);
addMember(v, _T("__dSideW__"), data.dSideW);
addMember(v, _T("__dW__"), data.dW);
addMember(v, _T("__dBomEl__"), data.dBomEl);
addMember(v, _T("__dTopEl__"), data.dTopEl);
addMember(v, _T("__bBomSta__"), data.bBomSta);
addMember(v, _T("__sMaterial__"), data.m_sMaterial);
addMember(v, _T("__sFactory__"), data.m_sFactory);
addMember(v, _T("__sNo__"), data.m_sNo);
return v;
}
bool AecDbLineStair::ByJson(const SHJson::WValue &v)
{
AssertWriteEnabled();
return AecDbEwPipeBase::ByJson(v);
}
Acad::ErrorStatus AecDbLineStair::subGetGripPoints(AcDbGripDataPtrArray& grips,
const double curViewUnitSize,
const int gripSize,
const AcGeVector3d& curViewDir,
const int bitflags) const
{
AecDbEwPipeBase::subGetGripPoints(grips,curViewUnitSize,gripSize,curViewDir,bitflags);
//动态标注
//直线,半径 标注风格
if (!grips.isEmpty())
{
SubAddDimPoints(grips,curViewDir);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbLineStair::SubAddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir) const
{
if (GetDimGripOff())
return Acad::eOk;
LineStair data;
GetLineStairData(data);
if (m_pBaseCurve != NULL)//路径
{
AcGePoint3d ptGe[2],ptMid;
AcDbLine* pLn = AcDbLine::cast(m_pBaseCurve);
if (pLn != NULL)
{
ptGe[0] = pLn->startPoint();
ptGe[1] = pLn->endPoint();
AcGeVector3d vtDir = ptGe[1] - ptGe[0];
vtDir.z = 0.0;
vtDir.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
vtDir.normalize();
ptGe[0].z = data.dBomEl;
ptGe[1].z = data.dTopEl;
//长度
ptGe[0] += vtDir * 10.0;
ptGe[1] += vtDir * 10.0;
ptMid = MidPoint(ptGe[0],ptGe[1]);
ptMid += vtDir * 10.0 * 100.0;//标注文字位置
AddDimPoints(grips,curViewDir,ptGe[0],ptGe[1],ptMid,0);
//高度
ptGe[0] = ptGe[1];
ptGe[0].z = data.dBomEl;
ptGe[0] -= vtDir * 10.0;
ptGe[1] -= vtDir * 10.0;
ptMid = MidPoint(ptGe[0],ptGe[1]);
ptMid -= vtDir * 10.0 * 100.0;//标注文字位置
AddDimPoints(grips,curViewDir,ptGe[0],ptGe[1],ptMid,0);
//宽度
ptGe[0] = pLn->startPoint();
ptGe[0] += 0.5 * data.dW * vtDir;
ptGe[1] = ptGe[0] - data.dW * vtDir;
vtDir = pLn->endPoint() - pLn->startPoint();
vtDir.z = 0.0;
vtDir.normalize();
ptMid = MidPoint(ptGe[0],ptGe[1]);
ptMid -= vtDir * 10.0 * 100.0;//标注文字位置
AddDimPoints(grips,curViewDir,ptGe[0],ptGe[1],ptMid,0);
}
}
return Acad::eOk;
}