398 lines
9.6 KiB
C++
398 lines
9.6 KiB
C++
#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;
|
|
} |