Files

398 lines
9.8 KiB
C++
Raw Permalink Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#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)
{
2026-10-04 00:04:20 +08:00
m_mapSpecXData.SetAt(KEY_NAME,_T("圆弧梯段"));
2026-09-28 15:28:50 +08:00
}
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();
2026-10-04 00:04:20 +08:00
acutPrintf(_T("\n圆弧楼梯"));
2026-09-28 15:28:50 +08:00
AecDbEwPipeBase::subList();
}
bool AecDbArcSegStair::GetBimInfoTip(CString& sInfoTip) const
{
assertReadEnabled();
CString sField,sFmt;
2026-10-04 00:04:20 +08:00
sField = _T("圆弧楼梯:\n");
2026-09-28 15:28:50 +08:00
sInfoTip += sField;
LineStair data;
memset(&data,0,sizeof(LineStair));
GetLineStairData(data);
2026-10-04 00:04:20 +08:00
MAKEFIELD(_T("踏步高度"),_T("%d"),(int)(data.dSteepH + 0.5),sInfoTip);
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
MAKEFIELD(_T("踏步板宽"),_T("%d"),(int)(data.dSteepW + 0.5),sInfoTip);
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
MAKEFIELD(_T("踏步板厚"),_T("%d"),(int)(data.dSteept + 0.5),sInfoTip);
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
MAKEFIELD(_T("楼梯总宽"),_T("%d"),(int)(data.dW + 0.5),sInfoTip);
2026-09-28 15:28:50 +08:00
if (data.bBomSta)
{
2026-10-04 00:04:20 +08:00
MAKEFIELD(_T("底部标高"),_T("%.1f"),(int)(data.dBomEl + 0.5),sInfoTip);
2026-09-28 15:28:50 +08:00
}
else
{
2026-10-04 00:04:20 +08:00
MAKEFIELD(_T("顶部标高"),_T("%.1f"),(int)(data.dTopEl + 0.5),sInfoTip);
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
MAKEFIELD(_T("材质"),_T("%s"),data.m_sMaterial,sInfoTip);
MAKEFIELD(_T("编号"),_T("%s"),data.m_sNo,sInfoTip);
MAKEFIELD(_T("厂家"),_T("%s"),data.m_sFactory,sInfoTip);
2026-09-28 15:28:50 +08:00
return true;
}
Acad::ErrorStatus AecDbArcSegStair::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled();
if ( dc.IsDragging() )
{
//return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
//图层
2026-09-28 15:28:50 +08:00
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
{
2026-10-04 00:04:20 +08:00
//样子参照 PDMS 的样子
2026-09-28 15:28:50 +08:00
assertReadEnabled();
if ( dc.IsDragging() )
{
//return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
//图层
2026-09-28 15:28:50 +08:00
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);
/*
2026-10-04 00:04:20 +08:00
GuardBar bar;//扶手
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
double dSteepH;//踏步高度
double dSteept;//踏步板厚
double dSteepW;//踏步板宽
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
double dSidet;//底侧板厚>扶手直径
double dSideW;//底侧板宽
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
double dW; //总宽
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
double dBomEl;//底部标高
double dTopEl;//顶部标高
BOOL bBomSta;//对于圆弧,是否是开始位置为底标高
2026-09-28 15:28:50 +08:00
TCHAR m_sMaterial[256];
2026-10-04 00:04:20 +08:00
TCHAR m_sFactory[256];//厂家
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
//动态标注
//直线,半径 标注风格
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
if (m_pBaseCurve != NULL)//路径
2026-09-28 15:28:50 +08:00
{
AcGePoint3d ptGe[2],ptMid;
AcDbArc* pArc = AcDbArc::cast(m_pBaseCurve);
if (pArc != NULL)
{
2026-10-04 00:04:20 +08:00
//标注半径
2026-09-28 15:28:50 +08:00
AcGePoint3d ptSta;
pArc->getStartPoint(ptSta);
AcGeVector3d vtL;
pArc->getFirstDeriv(ptSta,vtL);
vtL.normalize();
vtL.negate();
2026-10-04 00:04:20 +08:00
//半径标注
2026-09-28 15:28:50 +08:00
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());
2026-10-04 00:04:20 +08:00
//标注高度
2026-09-28 15:28:50 +08:00
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]);
2026-10-04 00:04:20 +08:00
ptMid += vtL * 10.0 * 100.0;//标注文字位置
2026-09-28 15:28:50 +08:00
AddDimPoints(grips,curViewDir,ptGe[0],ptGe[1],ptMid,0);
2026-10-04 00:04:20 +08:00
//宽度
2026-09-28 15:28:50 +08:00
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]);
2026-10-04 00:04:20 +08:00
ptMid -= vtL * 10.0 * 100.0;//标注文字位置
2026-09-28 15:28:50 +08:00
AddDimPoints(grips,curViewDir,ptGe[0],ptGe[1],ptMid,0);
}
}
return Acad::eOk;
}