#include "stdafx.h" #include "AecDbArcSegStair.h" #include "coretools.h" #include "AecDbXDrawPointer.h" static const Adesk::UInt16 kRed = 1; static const Adesk::UInt16 kYellow = 2; static const Adesk::UInt16 kGreen = 3; extern AcDb3dPolyline* Format3dPolyline(const AcGePoint3dArray& arPts); extern AcGePoint3d MidPoint(const AcGePoint3d& pt1,const AcGePoint3d& pt2); extern BOOL DLLIMPEXP GetDimGripOff(); extern AcGePoint3d GetArcMidPoint(AcDbArc* pArc); extern void DLLIMPEXP OrthoProjected3DSolid(AcDb3dSolid* pSolidClone,const AcGePlane& plan,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs); static const Adesk::UInt16 kColorByLayer = 256; namespace { AcDb3dSolid* drawSide(AcDbCurve *p, const double &t, const double &W) { AcGeVector3d vt(AcGeVector3d::kIdentity); AcGePoint3d pt0, pt1, pt2, pt3; p->getStartPoint(pt0); p->getFirstDeriv(pt0, vt); vt.z = .0; vt.rotateBy(PI * .5, AcGeVector3d::kZAxis); vt.normalize(); pt1 = pt0 + vt * t; pt2 = pt1 + AcGeVector3d::kZAxis * W; pt3 = pt0 + AcGeVector3d::kZAxis * W; AcDbVoidPtrArray ar; ar.append(new AcDbLine(pt0, pt1)); ar.append(new AcDbLine(pt1, pt2)); ar.append(new AcDbLine(pt2, pt3)); ar.append(new AcDbLine(pt3, pt0)); AcDb3dSolid *pSolid(NULL); AcDbRegion *pReg = CoreTools::createRegion(ar); if (pReg) { pSolid = new AcDb3dSolid(); if (pSolid) { //if (!pSolid->extrudeAlongPath(pReg, p) == Acad::eOk) AcDbSweepOptions op; op.setTwistAngle(CoreTools::A2R(12)); if (!pSolid->createSweptSolid(pReg, p, op) == Acad::eOk) DELETE_PTR(pSolid); } //CoreTools::CloneAndAddToModelSpace(pReg); DELETE_PTR(pReg); } deleteArrayVoidPtrs< AcDbEntity>(ar); return pSolid; } } Adesk::UInt32 AecDbArcSegStair::kCurrentVersionNumber = 1; ACRX_DXF_DEFINE_MEMBERS (AecDbArcSegStair, AecDbBaseStair, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning, AEC_DBASSTAIR, "AecDbArcSegStair" "|Product Desc: shanghua earthworm app obj" "|Company: shanghua inc" "|WEB Address: www.shanghuasoft.com") AecDbArcSegStair::AecDbArcSegStair(void) { m_mapSpecXData.SetAt(KEY_NAME,_T("圆弧梯段")); } AecDbArcSegStair::~AecDbArcSegStair(void) { } Acad::ErrorStatus AecDbArcSegStair::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 > AecDbArcSegStair::kCurrentVersionNumber ) return (Acad::eMakeMeProxy); return pFiler->filerStatus(); } Acad::ErrorStatus AecDbArcSegStair::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 (AecDbArcSegStair::kCurrentVersionNumber)) != Acad::eOk ) return (es) ; return pFiler->filerStatus(); } Acad::ErrorStatus AecDbArcSegStair::dxfInFields(AcDbDxfFiler* pFiler) { return Acad::eOk; } Acad::ErrorStatus AecDbArcSegStair::dxfOutFields(AcDbDxfFiler* pFiler) const { return Acad::eOk; } void AecDbArcSegStair::subList() const { assertReadEnabled(); acutPrintf(_T("\n圆弧楼梯")); AecDbEwPipeBase::subList(); } bool AecDbArcSegStair::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.dSteepH + 0.5),sInfoTip); MAKEFIELD(_T("踏步板宽"),_T("%d"),(int)(data.dSteepW + 0.5),sInfoTip); MAKEFIELD(_T("踏步板厚"),_T("%d"),(int)(data.dSteept + 0.5),sInfoTip); MAKEFIELD(_T("楼梯总宽"),_T("%d"),(int)(data.dW + 0.5),sInfoTip); if (data.bBomSta) { MAKEFIELD(_T("底部标高"),_T("%.1f"),(int)(data.dBomEl + 0.5),sInfoTip); } else { MAKEFIELD(_T("顶部标高"),_T("%.1f"),(int)(data.dTopEl + 0.5),sInfoTip); } MAKEFIELD(_T("材质"),_T("%s"),data.m_sMaterial,sInfoTip); MAKEFIELD(_T("编号"),_T("%s"),data.m_sNo,sInfoTip); MAKEFIELD(_T("厂家"),_T("%s"),data.m_sFactory,sInfoTip); return true; } Acad::ErrorStatus AecDbArcSegStair::Draw2d(AcGiDraw &dc) const { assertReadEnabled(); if ( dc.IsDragging() ) { //return Acad::eOk; } //图层 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 ( Draw2DBuffers(dc)) { dc.SetLayer(idLay); dc.SetColor(nCrBk); return Acad::eOk; } AecDbXDrawPointer aecDbXDraw(this,_T("AecDbArcSegStairDraw")); aecDbXDraw.Draw2d(dc); AcDbVoidPtrArray arEntPtrs; dc.Get2dBuffer(arEntPtrs); Add2DBuffer(arEntPtrs); dc.SetLayer(idLay); dc.SetColor(nCrBk); return Acad::eOk; } Acad::ErrorStatus AecDbArcSegStair::Draw3d(AcGiDraw &dc) const { //样子参照 PDMS 的样子 assertReadEnabled(); if ( dc.IsDragging() ) { //return Acad::eOk; } //图层 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 ( Draw3DBuffers(dc)) { dc.SetLayer(idLay); dc.SetColor(nCrBk); return Acad::eOk; } AecDbXDrawPointer aecDbXDraw(this,_T("AecDbArcSegStairDraw")); aecDbXDraw.Draw3d(dc); AcDbVoidPtrArray arEntPtrs; dc.Get3dBuffer(arEntPtrs); Add3DBuffer(arEntPtrs); dc.SetLayer(idLay); dc.SetColor(nCrBk); return Acad::eOk; } SHJson::WValue &AecDbArcSegStair::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 AecDbArcSegStair::ByJson(const SHJson::WValue &v) { AssertWriteEnabled(); return AecDbEwPipeBase::ByJson(v); } Acad::ErrorStatus AecDbArcSegStair::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 AecDbArcSegStair::SubAddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir) const { if (GetDimGripOff()) return Acad::eOk; LineStair data; GetLineStairData(data); if (m_pBaseCurve != NULL)//路径 { AcGePoint3d ptGe[2],ptMid; AcDbArc* pArc = AcDbArc::cast(m_pBaseCurve); if (pArc != NULL) { //标注半径 AcGePoint3d ptSta; pArc->getStartPoint(ptSta); AcGeVector3d vtL; pArc->getFirstDeriv(ptSta,vtL); vtL.normalize(); vtL.negate(); //半径标注 ptSta.z = data.dBomEl; AcGePoint3d ptEnd = pArc->center(); ptEnd.z = data.dBomEl; AcGePoint3d ptAMid = GetArcMidPoint(pArc); ptAMid.z = data.dBomEl; AcGePoint3d ptMid = MidPoint(ptAMid,ptEnd); AddDimPoints(grips,curViewDir,ptAMid,ptEnd,ptMid,1,pArc->radius()); //标注高度 ptGe[0] = ptSta; ptGe[1] = ptSta; ptGe[0].z = data.dBomEl; ptGe[1].z = data.dTopEl; ptGe[0] += vtL * 10.0; ptGe[1] += vtL * 10.0; ptMid = MidPoint(ptGe[0],ptGe[1]); ptMid += vtL * 10.0 * 100.0;//标注文字位置 AddDimPoints(grips,curViewDir,ptGe[0],ptGe[1],ptMid,0); //宽度 AcGeVector3d vtV = vtL; vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis); ptGe[0] = ptSta; ptGe[0] += 0.5 * data.dW * vtV; ptGe[1] = ptGe[0] - data.dW * vtV; ptMid = MidPoint(ptGe[0],ptGe[1]); ptMid -= vtL * 10.0 * 100.0;//标注文字位置 AddDimPoints(grips,curViewDir,ptGe[0],ptGe[1],ptMid,0); } } return Acad::eOk; }