Files

273 lines
5.6 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 "AecDbAscent.h"
#include "AecDbAscentDraw.h"
#include "AecDbEarthWorm.h"
#include "AcDbX3dSolid.h"
#ifndef AS_INT
#define AS_INT(f) (f < 0.0 ? int((f) - 0.5) : int((f) + 0.5))
#endif
DLLIMPEXP AcDbPolyline* FormatPolyline(AcGePoint3d* ppPts,int nCount);
ACRX_CONS_DEFINE_MEMBERS(AecDbAscentDraw,AecDbXDraw,0);
AecDbAscentDraw::AecDbAscentDraw(void)
{
}
AecDbAscentDraw::~AecDbAscentDraw(void)
{
}
static void TrimLine(AcDbLine* pLnUp,AcDbLine* pLnL,int nSorE)
{
AcGePoint3dArray pts;
pLnUp->intersectWith(pLnL,AcDb::kOnBothOperands,pts);
if (pts.length() == 1)
{
if (nSorE == 0)
pLnUp->setStartPoint(pts.first());
else
pLnUp->setEndPoint(pts.first());
}
}
Acad::ErrorStatus AecDbAscentDraw::Draw2d(AcGiDraw &dc) const
{
AcDbEntity* pEntReal = GetAttach();
if (pEntReal == NULL)
return Acad::eOk;
AecDbAscent* pAscent = AecDbAscent::cast(pEntReal);
if (pAscent == NULL)
return Acad::eOk;
AscentData data;
pAscent->GetAscentData(data);
AcDbCurve* pBaseCrv = pAscent->GetBaseCurve();
if (pBaseCrv != NULL)
{
AcDbLine* pLn = AcDbLine::cast(pBaseCrv);
if (pLn != NULL)
{
AcGePoint3d ptE = pLn->startPoint();
AcGePoint3d ptS = pLn->endPoint();
ptS.z = ptE.z = 0.0;
AcGeVector3d vtDir = ptE - ptS;
AcGeVector3d vtW = vtDir;
vtW.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
vtW.normalize();
vtDir.normalize();
AcGePoint3d ptGe[6],ptT;
ptGe[0] = ptS;
ptGe[0] -= vtW * 0.5 * data.dW;
ptGe[1] = ptGe[0] + vtW * data.dW;
ptGe[2] = ptGe[1] + vtDir * data.dLx;
ptGe[3] = ptGe[0] + vtDir * data.dLx;
ptGe[4] = ptGe[0];
AcDbPolyline* pPl = FormatPolyline(ptGe,5);
if (pPl != NULL)
{
dc.DrawPolyline(*pPl);
dc.Add2dBuffer(pPl);
}
AcDbLine* pLnL = NULL;
AcDbLine* pLnR = NULL;
if (!data.bAlignL)
{
ptGe[3] += vtW * data.dSideW;
pLnL = new AcDbLine(ptGe[0],ptGe[3]);
dc.DrawEntity(pLnL);
dc.Add2dBuffer(pLnL);
}
else
{
pLnL = new AcDbLine(ptGe[0],ptGe[3]);
}
if (!data.bAlignR)
{
ptGe[2] -= vtW * data.dSideW;
pLnR = new AcDbLine(ptGe[1],ptGe[2]);
dc.DrawEntity(pLnR);
dc.Add2dBuffer(pLnR);
}
else
{
pLnR = new AcDbLine(ptGe[1],ptGe[2]);
}
if (data.bNonslip)
{
int nRow = AS_INT(data.dLx / 100.0);
double dSp = data.dLx / nRow;
AcDbLine* pLnUp = NULL;
vtDir.normalize();
vtDir *= dSp;
for(int i=1; i < nRow; i++)
{
ptGe[0] += vtDir;
ptGe[1] += vtDir;
pLnUp = new AcDbLine;
pLnUp->setStartPoint(ptGe[0]);
pLnUp->setEndPoint(ptGe[1]);
TrimLine(pLnUp,pLnL,0);
TrimLine(pLnUp,pLnR,1);
dc.DrawEntity(pLnUp);
dc.Add2dBuffer(pLnUp);
}
}
if (data.bAlignL)
delete pLnL;
if (data.bAlignR)
delete pLnR;
}
delete pBaseCrv;
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbAscentDraw::Draw3d(AcGiDraw &dc) const
{
AcDbEntity* pEntReal = GetAttach();
if (pEntReal == NULL)
return Acad::eOk;
AecDbAscent* pAscent = AecDbAscent::cast(pEntReal);
if (pAscent == NULL)
return Acad::eOk;
AscentData data;
pAscent->GetAscentData(data);
AcDbCurve* pBaseCrv = pAscent->GetBaseCurve();
if (pBaseCrv != NULL)
{
AcDbLine* pLn = AcDbLine::cast(pBaseCrv);
if (pLn != NULL)
{
AcGePoint3d ptE = pLn->startPoint();
AcGePoint3d ptS = pLn->endPoint();
ptS.z = ptE.z = 0.0;
AcGeVector3d vtDir = ptE - ptS;
AcGeVector3d vtW = vtDir;
vtW.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
vtW.normalize();
vtDir.normalize();
AcGePoint3d ptGe[6],ptT;
ptGe[0] = ptS;
ptGe[0] -= vtW * 0.5 * data.dW;
ptGe[1] = ptGe[0] + vtW * data.dW;
ptGe[2] = ptGe[1] + vtDir * data.dLx;
ptGe[3] = ptGe[0] + vtDir * data.dLx;
ptGe[4] = ptGe[0];
AcGePoint3d ptGe22 = ptGe[2];
AcGePoint3d ptGe33 = ptGe[3];
ptGe[2].z = data.dTopEl;
ptGe[3].z = data.dTopEl;
AcGePoint3d ptGe00 = ptGe[0];
AcGePoint3d ptGe11 = ptGe[1];
ptGe[0].z = data.dTopEl - data.dLy;
ptGe[1].z = ptGe[0].z;
ptGe00.z = ptGe[0].z;
ptGe11.z = ptGe[1].z;
ptGe22.z = ptGe[1].z;
ptGe33.z = ptGe[0].z;
vtDir = ptGe[3] - ptGe[0];
vtDir.normalize();
AcDbLine lnEx;
lnEx.setStartPoint(ptGe[2]);
lnEx.setEndPoint(ptGe[3]);
AcGePoint3dArray arPts;
arPts.append(ptGe[0]);
if (data.bNonslip)
{
double dL = sqrt(data.dLx*data.dLx+data.dLy*data.dLy);
int nRow = AS_INT(data.dLx / 100.0);
double dSp = dL / nRow;
vtDir *= dSp;
for(int i=1; i < nRow; i++)
{
ptGe[0] += vtDir;
ptGe[1] = ptGe[0];
2026-10-04 00:04:20 +08:00
ptGe[1].z += 10;//防滑尺寸
2026-09-28 15:28:50 +08:00
arPts.append(ptGe[1]);
arPts.append(ptGe[0]);
}
}
arPts.append(ptGe[3]);
arPts.append(ptGe33);
arPts.append(ptGe00);
2026-10-04 00:04:20 +08:00
//测试
2026-09-28 15:28:50 +08:00
//AcDbPolyline* pPl = FormatPolyline(arPts.asArrayPtr(),arPts.length());
//pPl->setColorIndex(3);
//CoreTools::AddToModelSpace(pPl);
AcDbRegion* pReg = AecDbEarthWorm::CreatePolygonRegionOnly(arPts.asArrayPtr(),arPts.length());
if (pReg != NULL)
{
AcDbX3dSolid xSolid;
if ( xSolid.CreateExtrude(pReg, lnEx))
{
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
if (pSolid != NULL)
{
AcDb3dSolid* pNegSolid = NULL;
if (!data.bAlignL)
{
ptGe[3] += vtW * data.dSideW;
AcGePlane plan1;
plan1.set(ptGe00,ptGe33,ptGe[3]);
pSolid->getSlice(plan1,false,pNegSolid);
}
if (!data.bAlignR)
{
ptGe[2] -= vtW * data.dSideW;
AcGePlane plan2;
plan2.set(ptGe11,ptGe[2],ptGe22);
pSolid->getSlice(plan2,false,pNegSolid);
}
dc.DrawEntity(pSolid);
dc.Add3dBuffer(pSolid);
delete pBaseCrv;
return Acad::eOk;
}
}
}
}
delete pBaseCrv;
}
return Acad::eOk;
}