273 lines
5.6 KiB
C++
273 lines
5.6 KiB
C++
#include "stdafx.h"
|
|
#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];
|
|
ptGe[1].z += 10;//·À»¬³ß´ç
|
|
arPts.append(ptGe[1]);
|
|
arPts.append(ptGe[0]);
|
|
}
|
|
}
|
|
arPts.append(ptGe[3]);
|
|
arPts.append(ptGe33);
|
|
arPts.append(ptGe00);
|
|
|
|
//²âÊÔ
|
|
//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;
|
|
} |