#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; }