2780 lines
82 KiB
C++
2780 lines
82 KiB
C++
#include "stdafx.h"
|
||
#include "AecDbDoubleMulStair.h"
|
||
#include "AecDbDoubleMulStairDraw.h"
|
||
#include "AecDbEarthWorm.h"
|
||
#include "AcDbX3dSolid.h"
|
||
#include "CoreTools.h"
|
||
|
||
static const Adesk::UInt16 kColorByBlock = 0;
|
||
static const Adesk::UInt16 kRed = 1;
|
||
static const Adesk::UInt16 kYellow = 2;
|
||
static const Adesk::UInt16 kGreen = 3;
|
||
static const Adesk::UInt16 kCyan = 4;
|
||
static const Adesk::UInt16 kBlue = 5;
|
||
static const Adesk::UInt16 kMagenta = 6;
|
||
static const Adesk::UInt16 kWhite = 7;
|
||
static const Adesk::UInt16 kColorByLayer = 256;
|
||
|
||
DLLIMPEXP AcDbPolyline *FormatPolyline(AcGePoint3d *ppPts, int nCount);
|
||
DLLIMPEXP AcDb3dPolyline *Format3dPolyline(const AcGePoint3dArray &arPts);
|
||
|
||
ACRX_CONS_DEFINE_MEMBERS(AecDbDoubleMulStairDraw, AecDbXDraw, 0);
|
||
|
||
namespace
|
||
{
|
||
AcDbRegion* makeRectRegion(const AcGePoint3d& ptOrg
|
||
, const double& dL
|
||
, const double& dW
|
||
, const AcGeVector3d& vecL
|
||
, const AcGeVector3d& vecW
|
||
)
|
||
{
|
||
AcGePoint3d ptGe[5];
|
||
ptGe[0] = ptOrg + vecW * dW * .5;
|
||
ptGe[0] += vecL * dL * .5;
|
||
ptGe[1] = ptGe[0] - vecW * dW;
|
||
ptGe[2] = ptGe[1] - vecL * dL;
|
||
ptGe[3] = ptGe[2] + vecW * dW;
|
||
ptGe[4] = ptGe[0];
|
||
|
||
return AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5);
|
||
}
|
||
|
||
AcDbRegion* makeCircleRegion(const AcGePoint3d& ptOrg
|
||
, const AcGeVector3d& vtZ
|
||
, const double& dR)
|
||
{
|
||
AcDbCircle* pCir(new AcDbCircle(ptOrg, vtZ, dR));
|
||
if (!pCir) return NULL;
|
||
|
||
return CoreTools::createRegion(pCir);
|
||
}
|
||
|
||
AcDbPolyline* DrawRect2d(const AcGePoint3d& ptFr
|
||
, const double& dL
|
||
, const double& dW
|
||
, const AcGeVector3d& vecL
|
||
, const AcGeVector3d& vecW)
|
||
{
|
||
AcGePoint3d ptGe[5];
|
||
ptGe[0] = ptFr;
|
||
ptGe[1] = ptGe[0] - vecL * dL;
|
||
ptGe[2] = ptGe[1] + vecW * dW;
|
||
ptGe[3] = ptGe[2] + vecL * dL;
|
||
ptGe[4] = ptGe[0];
|
||
|
||
return FormatPolyline(ptGe, 5);
|
||
}
|
||
|
||
AcDbPolyline* drawInHandRail(AcGePoint3d* ppPts
|
||
, int nCount
|
||
, const double& dOffset
|
||
, const AcGeVector3d& vt)
|
||
{
|
||
AcDbPolyline* pPoly = FormatPolyline(ppPts, nCount);
|
||
if (!pPoly) return NULL;
|
||
int len(pPoly->numVerts());
|
||
if (len < 2) return NULL;
|
||
|
||
AcDbVoidPtrArray ar;
|
||
pPoly->getOffsetCurves(dOffset, ar);
|
||
if (ar.isEmpty()) return NULL;
|
||
|
||
AcDbPolyline* pOffPoly = (AcDbPolyline*)(((AcDbEntity*)ar.first())->clone());
|
||
deleteArrayVoidPtrs<AcDbEntity>(ar);
|
||
|
||
AcGePoint3d pt;
|
||
AcGePoint3dArray ptAr;
|
||
ptAr.removeAll();
|
||
int i(0);
|
||
for (i = 0; i < len; ++i)
|
||
{
|
||
pPoly->getPointAt(i, pt);
|
||
ptAr.append(pt);
|
||
}
|
||
|
||
len = pOffPoly->numVerts();
|
||
for (i = len - 1; i >= 0; --i)
|
||
{
|
||
pOffPoly->getPointAt(i, pt);
|
||
ptAr.append(pt);
|
||
}
|
||
|
||
pPoly->getStartPoint(pt);
|
||
ptAr.append(pt);
|
||
|
||
DELETE_PTR(pOffPoly);
|
||
return FormatPolyline(ptAr.asArrayPtr(), ptAr.length());
|
||
}
|
||
|
||
void drawText(AcGiDraw& dc
|
||
, const ACHAR* text
|
||
, const double& dTextH
|
||
, const AcGePoint3d& ptAlign
|
||
, const double& dAngle
|
||
, const AcGeVector3d& vtTrans
|
||
, AcDb::TextHorzMode nHorMode
|
||
, AcDb::TextVertMode nVerMode
|
||
, AcGiDraw::TextAlignment nAlign)
|
||
{
|
||
int nOldClr = dc.GetColor();
|
||
dc.SetColor(5);
|
||
|
||
AcDbText *pText = new AcDbText();
|
||
if (pText == NULL) return;
|
||
|
||
pText->setColorIndex(5);
|
||
|
||
pText->setTextString(text);
|
||
pText->setHeight(dTextH);
|
||
|
||
AcDbExtents ext;
|
||
pText->getGeomExtents(ext);
|
||
pText->setHorizontalMode(nHorMode);
|
||
pText->setVerticalMode(nVerMode);
|
||
pText->setAlignmentPoint(ptAlign);
|
||
AcGeMatrix3d mat;
|
||
mat.setToRotation(dAngle, vtTrans, ptAlign);
|
||
pText->setPosition(dc.Align2Base(nAlign, ptAlign, ext.maxPoint()));
|
||
pText->transformBy(mat);
|
||
|
||
dc.DrawEntity(pText);
|
||
dc.Add2dBuffer(pText);
|
||
|
||
dc.SetColor(nOldClr);
|
||
}
|
||
}
|
||
|
||
AecDbDoubleMulStairDraw::AecDbDoubleMulStairDraw(void)
|
||
{
|
||
}
|
||
|
||
AecDbDoubleMulStairDraw::~AecDbDoubleMulStairDraw(void)
|
||
{
|
||
}
|
||
void AecDbDoubleMulStairDraw::drawSolid(AcGiDraw& dc
|
||
, const AcDbRegion* pReg
|
||
, const double& dThick
|
||
, const double& dH
|
||
, const AcGeVector3d& vtThick
|
||
, const AcGeVector3d& vtH) const
|
||
{
|
||
if (!pReg) return;
|
||
|
||
AcDbExtents ext;
|
||
pReg->getGeomExtents(ext);
|
||
AcGePoint3d ptCen(CoreTools::MidPt(ext.maxPoint(), ext.minPoint()));
|
||
AcDbLine ln(ptCen, ptCen + vtThick * -dThick);
|
||
|
||
AcDbX3dSolid xSolid;
|
||
AcGeMatrix3d mat;
|
||
if (xSolid.CreateExtrude(pReg, ln) == FALSE) return;
|
||
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
|
||
if (!pSolid) return;
|
||
mat.setTranslation(vtH * dH);
|
||
pSolid->transformBy(mat);
|
||
dc.DrawEntity(pSolid);
|
||
dc.Add3dBuffer(pSolid);
|
||
|
||
{
|
||
xSolid.TransformBy(mat);
|
||
add3DCache<AecDbDoubleMulStair>(&xSolid);
|
||
}
|
||
}
|
||
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::Draw2d(AcGiDraw &dc) const
|
||
{
|
||
AcDbObjectId idCurLay = dc.GetLayerId();
|
||
AcDbObjectId idCurLty = dc.GetLineTypeId();
|
||
AcDbEntity *pEntReal = GetAttach();
|
||
if (pEntReal == NULL)
|
||
return Acad::eOk;
|
||
|
||
AecDbDoubleMulStair *pStair = AecDbDoubleMulStair::cast(pEntReal);
|
||
if (pStair == NULL)
|
||
return Acad::eOk;
|
||
|
||
Adesk::UInt16 nCrBk = 256;
|
||
nCrBk = pEntReal->colorIndex();
|
||
dc.SetLayer(pEntReal->layerId());
|
||
|
||
int nColor = nCrBk;
|
||
if (GetSpecialtyData()->GetAt(_T("COLOR"), nColor))
|
||
{
|
||
dc.SetColor(nColor);
|
||
}
|
||
|
||
SFSPStair data;
|
||
memset(&data, 0, sizeof(SFSPStair));
|
||
pStair->GetSFPXStair(data);
|
||
|
||
//.....
|
||
AcDbVoidPtrArray arEntPtrs;
|
||
AcDbCurve* pBaseCurve = pStair->GetBaseCurve();//路径
|
||
if (pBaseCurve == NULL) return Acad::eOk;
|
||
AcDbLine* pLn = AcDbLine::cast(pBaseCurve);
|
||
if (pLn == NULL) return Acad::eOk;
|
||
|
||
AcGePoint3d ptS, ptE;
|
||
ptS = pLn->startPoint();
|
||
ptE = pLn->endPoint();
|
||
|
||
AcGeVector3d vtSE, vtSEDir, Z(AcGeVector3d::kZAxis);
|
||
|
||
ptS += Z * data.dBomEl;
|
||
ptE += Z * data.dBomEl;
|
||
|
||
vtSEDir = (ptS - ptE).normalize();
|
||
vtSE = vtSEDir;
|
||
vtSE.rotateBy(-PI / 2.0, Z);
|
||
vtSE.normalize();
|
||
|
||
ptE = ptS - vtSE * (data.dRestPtW * 2 + (data.nSteep2s - 1) * data.dSteepW * 2 + data.dRestPtMW);
|
||
DrawUpStairs2d(dc, ptS, ptE, vtSE, vtSEDir, data);
|
||
|
||
//
|
||
|
||
|
||
dc.SetColor(nCrBk);
|
||
dc.SetLayer(idCurLay);
|
||
dc.SetLineType(idCurLty);
|
||
dc.Add2dBuffer(arEntPtrs);
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::Draw3d(AcGiDraw &dc) const
|
||
{
|
||
del3DCache<AecDbDoubleMulStair>();
|
||
AcDbObjectId idCurLay = dc.GetLayerId();
|
||
AcDbObjectId idCurLty = dc.GetLineTypeId();
|
||
AcDbEntity *pEntReal = GetAttach();
|
||
if (pEntReal == NULL)
|
||
return Acad::eOk;
|
||
|
||
AecDbDoubleMulStair *pStair = AecDbDoubleMulStair::cast(pEntReal);
|
||
if (pStair == NULL)
|
||
return Acad::eOk;
|
||
|
||
Adesk::UInt16 nCrBk = pEntReal->colorIndex();
|
||
dc.SetLayer(pEntReal->layerId());
|
||
|
||
int nColor = nCrBk;
|
||
if (GetSpecialtyData()->GetAt(_T("COLOR"), nColor))
|
||
{
|
||
dc.SetColor(nColor);
|
||
}
|
||
|
||
SFSPStair data;
|
||
memset(&data, 0, sizeof(SFSPStair));
|
||
pStair->GetSFPXStair(data);
|
||
|
||
|
||
//.....
|
||
AcDbCurve* pBaseCurve = pStair->GetBaseCurve();//路径
|
||
if (pBaseCurve == NULL) return Acad::eOk;
|
||
AcDbLine* pLn = AcDbLine::cast(pBaseCurve);
|
||
if (pLn == NULL) return Acad::eOk;
|
||
|
||
AcGePoint3d ptS, ptE;
|
||
ptS = pLn->startPoint();
|
||
ptE = pLn->endPoint();
|
||
|
||
AcGeVector3d vtSE, vtSEDir, Z(AcGeVector3d::kZAxis);
|
||
|
||
ptS += Z * data.dBomEl;
|
||
ptE += Z * data.dBomEl;
|
||
|
||
vtSEDir = (ptS - ptE).normalize();
|
||
vtSE = vtSEDir;
|
||
vtSE.rotateBy(-PI / 2.0, Z);
|
||
vtSE.normalize();
|
||
|
||
if (data.dRestPtW < data.dStairSW)
|
||
{
|
||
AfxMessageBox(_T("边平台宽不能小于边梯的宽度!"));
|
||
return Acad::eOk;
|
||
}
|
||
if (data.dRestPtL < data.dStairTW)
|
||
{
|
||
AfxMessageBox(_T("边平台长不能小于梯间楼梯的宽度!"));
|
||
return Acad::eOk;
|
||
}
|
||
if (data.dRestPtMW < data.dStairMW)
|
||
{
|
||
AfxMessageBox(_T("中平台宽不能小于中间楼梯的宽度!"));
|
||
return Acad::eOk;
|
||
}
|
||
if (data.dRestPtML < data.dStairTW)
|
||
{
|
||
AfxMessageBox(_T("中平台长不能小于梯间楼梯的宽度!"));
|
||
return Acad::eOk;
|
||
}
|
||
|
||
ptE = ptS - vtSE * (data.dRestPtW * 2 + (data.nSteep2s - 1) * data.dSteepW * 2 + data.dRestPtMW);
|
||
if (data.nUpSide == 0)
|
||
{
|
||
DrawCenterUpStairs3d(dc, ptS, ptE, vtSE, vtSEDir, data);
|
||
}
|
||
else
|
||
{
|
||
DrawSideUpStairs3d(dc, ptS, ptE, vtSE, vtSEDir, data);
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawUpStairsDir2d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptSta
|
||
, const AcGePoint3d& ptEnd
|
||
, const AcGeVector3d& vt
|
||
, const AcGeVector3d& vtDir
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d pt(AcGePoint3d::kOrigin);
|
||
AcGeVector3d Z(AcGeVector3d::kZAxis);
|
||
AcDbPolyline* pPoly(NULL);
|
||
AcDbText* pText(NULL);
|
||
AcGePoint3d ptGe[5];
|
||
int nOldClr = dc.GetColor();
|
||
dc.SetColor(3);
|
||
|
||
//绘制增高方向线 ----->
|
||
double dScale = CoreTools::getPScaleForSymb();
|
||
double dW(dScale * .8);
|
||
double dH(dScale * 3);
|
||
double dTextH(dScale * 3.5);
|
||
|
||
double angle = vtDir.angleTo(AcGeVector3d::kXAxis) - PI * .5;
|
||
if (data.nUpSide == 0)
|
||
{
|
||
// Center
|
||
ptGe[0] = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtMW * .5);
|
||
ptGe[0] -= vtDir * (data.dRestPtML + (data.nSteepMs - 1) * data.dSteepW + data.dSteepW);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dSteepW + (data.nSSteeps - 1) * data.dSteepW);
|
||
ptGe[2] = ptGe[1] - vtDir * dH;
|
||
pPoly = FormatPolyline(ptGe, 3);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
pPoly->setWidthsAt(1, 0, dW);
|
||
pPoly->setColorIndex(3);
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter);
|
||
|
||
// Left
|
||
ptGe[0] = ptSta - vt * data.dStairSW * .5;
|
||
ptGe[0] -= vtDir * (data.dRestPtL + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dSteepW + (data.nSteepsS - 1) * data.dSteepW + data.dRestPtL - data.dStairTW * .5);
|
||
ptGe[2] = ptGe[1] - vt * (data.dRestPtW - data.dStairSW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtMW * .5);
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dRestPtML - data.dStairTW * .5 + (data.nSteepMs - 1 - data.nSSteeps) * data.dSteepW);
|
||
ptGe[4] = ptGe[3] + vtDir * dH;
|
||
pPoly = FormatPolyline(ptGe, 5);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
pPoly->setWidthsAt(3, 0, dW);
|
||
pPoly->setColorIndex(3);
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter);
|
||
|
||
// Right
|
||
ptGe[0] = ptEnd + vt * data.dStairSW * .5;
|
||
ptGe[0] -= vtDir * (data.dRestPtL + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dSteepW + (data.nSteepsS - 1) * data.dSteepW + data.dRestPtL - data.dStairTW * .5);
|
||
ptGe[2] = ptGe[1] + vt * (data.dRestPtW - data.dStairSW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtMW * .5);
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dRestPtML - data.dStairTW * .5 + (data.nSteepMs - 1 - data.nSSteeps) * data.dSteepW);
|
||
ptGe[4] = ptGe[3] + vtDir * dH;
|
||
pPoly = FormatPolyline(ptGe, 5);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
pPoly->setWidthsAt(3, 0, dW);
|
||
pPoly->setColorIndex(3);
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter);
|
||
}
|
||
else
|
||
{
|
||
// Left
|
||
ptGe[0] = ptSta - vt * data.dStairSW * .5;
|
||
ptGe[0] -= vtDir * (data.dRestPtL + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dSteepW + (data.nSSteeps - 1) * data.dSteepW);
|
||
ptGe[2] = ptGe[1] - vtDir * dH;
|
||
pPoly = FormatPolyline(ptGe, 3);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
pPoly->setWidthsAt(1, 0, dW);
|
||
pPoly->setColorIndex(3);
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter);
|
||
|
||
// Left + Center
|
||
ptGe[0] = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtMW * .5);
|
||
ptGe[0] -= vtDir * (data.dRestPtML + (data.nSteepMs - 1) * data.dSteepW + data.dSteepW);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dSteepW + (data.nSteepMs - 1) * data.dSteepW + data.dRestPtML - data.dStairTW * .5);
|
||
ptGe[2] = ptGe[1] + vt * (data.dRestPtMW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtW - data.dStairSW * .5);
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dRestPtL - data.dStairTW * .5 + (data.nSteepsS - 1 - data.nSSteeps) * data.dSteepW);
|
||
ptGe[4] = ptGe[3] + vtDir * dH;
|
||
pPoly = FormatPolyline(ptGe, 5);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
pPoly->setWidthsAt(3, 0, dW);
|
||
pPoly->setColorIndex(3);
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter);
|
||
|
||
// Right
|
||
ptGe[0] = ptEnd + vt * data.dStairSW * .5;
|
||
ptGe[0] -= vtDir * (data.dRestPtL + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dSteepW + (data.nSSteeps - 1) * data.dSteepW);
|
||
ptGe[2] = ptGe[1] - vtDir * dH;
|
||
pPoly = FormatPolyline(ptGe, 3);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
pPoly->setWidthsAt(1, 0, dW);
|
||
pPoly->setColorIndex(3);
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter);
|
||
|
||
// Right + Center
|
||
ptGe[0] = ptEnd + vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtMW * .5);
|
||
ptGe[0] -= vtDir * (data.dRestPtML + (data.nSteepMs - 1) * data.dSteepW + data.dSteepW);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dSteepW + (data.nSteepMs - 1) * data.dSteepW + data.dRestPtML - data.dStairTW * .5);
|
||
ptGe[2] = ptGe[1] - vt * (data.dRestPtMW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtW - data.dStairSW * .5);
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dRestPtL - data.dStairTW * .5 + (data.nSteepsS - 1 - data.nSSteeps) * data.dSteepW);
|
||
ptGe[4] = ptGe[3] + vtDir * dH;
|
||
pPoly = FormatPolyline(ptGe, 5);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
pPoly->setWidthsAt(3, 0, dW);
|
||
pPoly->setColorIndex(3);
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
|
||
dc.SetColor(nOldClr);
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawUpStairs2d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptSta
|
||
, const AcGePoint3d& ptEnd
|
||
, const AcGeVector3d& vt
|
||
, const AcGeVector3d& vtDir
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d pt;
|
||
AcGeVector3d Z(AcGeVector3d::kZAxis);
|
||
AcGePoint3d ptGe[9];
|
||
AcDbPolyline *pPoly(NULL);
|
||
double dSidet(120);
|
||
|
||
// 边平台 Left
|
||
ptGe[0] = ptSta;
|
||
ptGe[1] = ptGe[0] - vtDir * data.dRestPtL;
|
||
ptGe[2] = ptGe[1] - vt * data.dStairSW;
|
||
ptGe[3] = ptGe[2] + vtDir * (data.dRestPtL - data.dStairTW);
|
||
ptGe[4] = ptGe[3] - vt * (data.dRestPtW - data.dStairSW);
|
||
ptGe[5] = ptGe[4] + vtDir * data.dStairTW;
|
||
ptGe[6] = ptGe[0];
|
||
pPoly = FormatPolyline(ptGe, 7);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 边平台 right
|
||
ptGe[0] = ptEnd;
|
||
ptGe[1] = ptGe[0] - vtDir * data.dRestPtL;
|
||
ptGe[2] = ptGe[1] + vt * data.dStairSW;
|
||
ptGe[3] = ptGe[2] + vtDir * (data.dRestPtL - data.dStairTW);
|
||
ptGe[4] = ptGe[3] + vt * (data.dRestPtW - data.dStairSW);
|
||
ptGe[5] = ptGe[4] + vtDir * data.dStairTW;
|
||
ptGe[6] = ptGe[0];
|
||
pPoly = FormatPolyline(ptGe, 7);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 二跑
|
||
for (int i(0); i < data.nSteep2s - 1; ++i)
|
||
{
|
||
// Left
|
||
pt = ptSta - vt * (data.dRestPtW + data.dSteepW * i);
|
||
pPoly = DrawRect2d(pt, data.dSteepW, data.dStairTW, vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// right
|
||
pt = ptEnd + vt * (data.dRestPtW + data.dSteepW * i);
|
||
pPoly = DrawRect2d(pt, data.dSteepW, data.dStairTW, -vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
|
||
// 中平台
|
||
ptGe[0] = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW);
|
||
ptGe[1] = ptGe[0] - vtDir * data.dStairTW;
|
||
ptGe[2] = ptGe[1] - vt * (data.dRestPtMW - data.dStairMW) * .5;
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dRestPtML - data.dStairTW);
|
||
ptGe[4] = ptGe[3] - vt * data.dStairMW;
|
||
ptGe[5] = ptGe[4] + vtDir * (data.dRestPtML - data.dStairTW);
|
||
ptGe[6] = ptGe[5] - vt * (data.dRestPtMW - data.dStairMW) * .5;
|
||
ptGe[7] = ptGe[6] + vtDir * data.dStairTW;
|
||
ptGe[8] = ptGe[0];
|
||
pPoly = FormatPolyline(ptGe, 9);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 中梯
|
||
for (int i(0); i < data.nSteepMs - 1; ++i)
|
||
{
|
||
pt = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + (data.dRestPtMW - data.dStairMW) * .5);
|
||
pt -= vtDir * (data.dRestPtML + data.dSteepW * i);
|
||
pPoly = DrawRect2d(pt, data.dStairMW, data.dSteepW, vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
|
||
// 边梯
|
||
for (int i(0); i < data.nSteepsS - 1; ++i)
|
||
{
|
||
// Left
|
||
pt = ptSta - vtDir * (data.dRestPtL + data.dSteepW * i);
|
||
pPoly = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// right
|
||
pt = ptEnd;
|
||
pt -= vtDir * (data.dRestPtL + data.dSteepW * i);
|
||
pPoly = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
|
||
// 内边梁
|
||
if (data.bLBeam)
|
||
{
|
||
// left
|
||
{
|
||
// 中梯
|
||
pt = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + (data.dRestPtMW - data.dStairMW) * .5);
|
||
pt -= vtDir * data.dRestPtML;
|
||
pPoly = DrawRect2d(pt, dSidet, (data.nSteepMs - 1) * data.dSteepW, vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 二跑
|
||
pt = ptSta - vt * data.dRestPtW;
|
||
pt -= vtDir * data.dStairTW;
|
||
pPoly = DrawRect2d(pt, (data.nSteep2s - 1) * data.dSteepW, dSidet, vt, vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 边梯
|
||
pt = ptSta - vt * (data.dStairSW - dSidet);
|
||
pt -= vtDir * data.dRestPtL;
|
||
pPoly = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
|
||
// right
|
||
{
|
||
// 中梯
|
||
pt = ptEnd + vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + (data.dRestPtMW - data.dStairMW) * .5);
|
||
pt -= vtDir * data.dRestPtML;
|
||
pPoly = DrawRect2d(pt, dSidet, (data.nSteepMs - 1) * data.dSteepW, -vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 二跑
|
||
pt = ptEnd + vt * data.dRestPtW;
|
||
pt -= vtDir * data.dStairTW;
|
||
pPoly = DrawRect2d(pt, (data.nSteep2s - 1) * data.dSteepW, dSidet, -vt, vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 边梯
|
||
pt = ptEnd + vt * (data.dStairSW - dSidet);
|
||
pt -= vtDir * data.dRestPtL;
|
||
pPoly = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, -vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
}
|
||
|
||
// 外边梁
|
||
if (data.bRBeam)
|
||
{
|
||
// left
|
||
{
|
||
// 二跑
|
||
pt = ptSta - vt * data.dRestPtW;
|
||
pPoly = DrawRect2d(pt, (data.nSteep2s - 1) * data.dSteepW, dSidet, vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 边梯
|
||
pt = ptSta - vtDir * data.dRestPtL;
|
||
pPoly = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
|
||
// right
|
||
{
|
||
// 二跑
|
||
pt = ptEnd + vt * data.dRestPtW;
|
||
pPoly = DrawRect2d(pt, (data.nSteep2s - 1) * data.dSteepW, dSidet, -vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 边梯
|
||
pt = ptEnd - vtDir * data.dRestPtL;
|
||
pPoly = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, -vt, -vtDir);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
}
|
||
|
||
// 内侧扶手 Left
|
||
ptGe[0] = ptSta - vtDir * (data.dRestPtL + (data.nSteepsS - 1) * data.dSteepW + data.dGarExt);
|
||
ptGe[0] -= vt * (data.dStairSW - data.dBarSide);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dGarExt + (data.nSteepsS - 1) * data.dSteepW + data.dRestPtL - data.dStairTW + data.dBarSide);
|
||
ptGe[2] = ptGe[1] - vt * (data.dBarSide + data.dRestPtW - data.dStairSW + (data.nSteep2s - 1) * data.dSteepW + (data.dRestPtMW - data.dStairMW) * .5 + data.dBarSide);
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dBarSide + data.dRestPtML - data.dStairTW + (data.nSteepMs - 1) * data.dSteepW + data.dZGarExt);
|
||
pPoly = drawInHandRail(ptGe, 4, -data.dGarSize[0], vt);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 内侧扶手 Right
|
||
ptGe[0] = ptEnd - vtDir * (data.dRestPtL + (data.nSteepsS - 1) * data.dSteepW + data.dGarExt);
|
||
ptGe[0] += vt * (data.dStairSW - data.dBarSide);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dGarExt + (data.nSteepsS - 1) * data.dSteepW + data.dRestPtL - data.dStairTW + data.dBarSide);
|
||
ptGe[2] = ptGe[1] + vt * (data.dBarSide + data.dRestPtW - data.dStairSW + (data.nSteep2s - 1) * data.dSteepW + (data.dRestPtMW - data.dStairMW) * .5 + data.dBarSide);
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dBarSide + data.dRestPtML - data.dStairTW + (data.nSteepMs - 1) * data.dSteepW + data.dZGarExt);
|
||
pPoly = drawInHandRail(ptGe, 4, data.dGarSize[0], vt);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
|
||
// 外侧扶手
|
||
if (data.bOutSideHRail)
|
||
{
|
||
ptGe[0] = ptSta - vtDir * (data.dRestPtL + (data.nSteepsS - 1) * data.dSteepW + data.dGarExt);
|
||
ptGe[0] -= vt * (data.dBarSide + data.dGarSize[0]);
|
||
ptGe[1] = ptGe[0] + vtDir * (data.dGarExt + (data.nSteepsS - 1) * data.dSteepW + data.dRestPtL - data.dBarSide - data.dGarSize[0]);
|
||
ptGe[2] = ptGe[1] - vt * (data.dRestPtW * 2 + (data.nSteep2s - 1) * data.dSteepW * 2 + data.dRestPtMW - (data.dBarSide + data.dGarSize[0]) * 2);
|
||
ptGe[3] = ptGe[2] - vtDir * (data.dRestPtL - data.dBarSide - data.dGarSize[0] + (data.nSteepsS - 1) * data.dSteepW + data.dGarExt);
|
||
pPoly = drawInHandRail(ptGe, 4, -data.dGarSize[0], vt);
|
||
if (pPoly == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pPoly);
|
||
dc.Add2dBuffer(pPoly);
|
||
}
|
||
|
||
// 上楼方向
|
||
if (data.bDimUpstair)
|
||
{
|
||
DrawUpStairsDir2d(dc, ptSta, ptEnd, vt, vtDir, data);
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawSteep3d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptFr
|
||
, const AcGePoint3d& ptTo
|
||
, const int& nStairsNum
|
||
, const double& dStairsWidth
|
||
, const BOOL& bLeft
|
||
, const BOOL& bRight
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d ptSta(ptFr);
|
||
AcGeVector3d vtL(ptTo - ptFr);
|
||
vtL.normalize();
|
||
|
||
double dLx = nStairsNum * data.dSteepW;
|
||
double dLh = nStairsNum * data.dSteepH + (data.dSteepW - data.dSteepH);
|
||
double dL = sqrt(dLx * dLx + dLh * dLh);
|
||
|
||
AcGePoint3d ptEnd = ptSta + vtL * dL;
|
||
|
||
AcGeVector3d vtLXY = vtL;
|
||
vtLXY.z = 0.0;
|
||
|
||
//一共多少步
|
||
int nCount = nStairsNum;
|
||
|
||
vtL.normalize();
|
||
vtLXY.normalize();
|
||
|
||
AcGeVector3d vtW = vtLXY;
|
||
vtW.rotateBy(-PI / 2.0, AcGeVector3d::kZAxis);
|
||
vtW.normalize();
|
||
|
||
//踏步左右总宽
|
||
double dSteepL = dStairsWidth;
|
||
|
||
AcGePoint3d ptV, ptV0;
|
||
AcGePoint3dArray arSecPts;
|
||
|
||
ptV = ptSta;
|
||
ptV -= vtW * 0.5 * dSteepL;
|
||
|
||
if (bLeft)
|
||
ptV += vtW * 120.0;//变量宽,国家标准120
|
||
|
||
//插入楼板的点 [AAA]
|
||
ptV.z -= (data.dSteepW - data.dSteepH);
|
||
|
||
ptV0 = ptV;
|
||
arSecPts.append(ptV);
|
||
|
||
ptV.z += data.dSteepW;//第一层等边直角
|
||
arSecPts.append(ptV);
|
||
|
||
for (int i = 0; i < nCount - 1; i++)
|
||
{
|
||
ptV += vtLXY * data.dSteepW;
|
||
arSecPts.append(ptV);
|
||
|
||
ptV.z += data.dSteepH;
|
||
arSecPts.append(ptV);
|
||
}
|
||
|
||
AcGeVector3d vtUp = arSecPts.last() - arSecPts.at(1);
|
||
AcGeLine3d ln3d;
|
||
ln3d.set(ptV0, vtUp);
|
||
|
||
AcGePoint3d ptV1 = ptV + vtLXY * data.dSteepW;
|
||
int nLast = arSecPts.append(ptV1);
|
||
|
||
AcGeLine3d lnEnd;
|
||
lnEnd.set(ptV1, AcGeVector3d::kZAxis);
|
||
|
||
AcGePoint3d ptInt;
|
||
if (ln3d.intersectWith(lnEnd, ptInt))
|
||
{
|
||
arSecPts.append(ptInt);
|
||
|
||
AcGePoint3d& ptT = arSecPts.first();
|
||
//闭合
|
||
arSecPts.append(ptT);
|
||
|
||
AcDbRegion* pReg = AecDbEarthWorm::CreatePolygonRegionOnly(arSecPts.asArrayPtr(), arSecPts.length());
|
||
if (!pReg) return Acad::eOk;
|
||
|
||
AcDbLine lnPath;
|
||
lnPath.setStartPoint(ptV0);
|
||
|
||
if (bLeft)
|
||
ptV = ptV0 + vtW * (dSteepL - 120.0);
|
||
else
|
||
ptV = ptV0 + vtW * dSteepL;
|
||
|
||
if (bRight)
|
||
ptV -= vtW * 120.0;//变梁宽,国标120
|
||
|
||
lnPath.setEndPoint(ptV);
|
||
|
||
AcDbX3dSolid xSolid;
|
||
if (xSolid.CreateExtrude(pReg, lnPath))
|
||
{
|
||
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
|
||
if (!pSolid)
|
||
{
|
||
DELETE_PTR(pReg);
|
||
return Acad::eOk;
|
||
}
|
||
|
||
dc.DrawEntity(pSolid);
|
||
dc.Add3dBuffer(pSolid);
|
||
add3DCache<AecDbDoubleMulStair>(&xSolid);
|
||
return Acad::eOk;
|
||
}
|
||
}
|
||
|
||
return Acad::eInvalidInput;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawSide3d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptFr
|
||
, const AcGePoint3d& ptTo
|
||
, const int& nStairsNum
|
||
, const double& dStairsWidth
|
||
, const BOOL& bLeft
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d ptSta = ptFr;
|
||
AcGeVector3d vtL = ptTo - ptFr;
|
||
vtL.normalize();
|
||
|
||
double dLx = nStairsNum * data.dSteepW;
|
||
double dLh = nStairsNum * data.dSteepH + (data.dSteepW - data.dSteepH);
|
||
double dL = sqrt(dLx * dLx + dLh * dLh);
|
||
|
||
AcGePoint3d ptEnd = ptSta + vtL * dL;
|
||
|
||
AcGeVector3d vtLXY = vtL;
|
||
vtLXY.z = 0.0;
|
||
|
||
//一共多少步
|
||
int nCount = nStairsNum;
|
||
|
||
vtL.normalize();
|
||
vtLXY.normalize();
|
||
|
||
AcGeVector3d vtW = vtLXY;
|
||
vtW.rotateBy(-PI / 2.0, AcGeVector3d::kZAxis);
|
||
vtW.normalize();
|
||
|
||
//踏步左右总长
|
||
double dSteepL = (dStairsWidth/* - 2.0 * data.dSidet*/);//无论左右有无梁
|
||
|
||
AcGePoint3d ptV, ptV0;
|
||
AcGePoint3dArray arSecPts;
|
||
|
||
ptV = ptSta;
|
||
ptV -= vtW * 0.5 * dSteepL;
|
||
|
||
//插入楼板的点 [AAA]
|
||
ptV.z -= (data.dSteepW - data.dSteepH);
|
||
ptV0 = ptV;
|
||
arSecPts.append(ptV);
|
||
|
||
ptV.z += data.dSteepW;//第一层等边直角
|
||
arSecPts.append(ptV);
|
||
|
||
for (int i = 0; i < nCount - 1; i++)
|
||
{
|
||
ptV += vtLXY * data.dSteepW;
|
||
ptV.z += data.dSteepH;
|
||
|
||
if (i == (nCount - 2))//只需最后踏步上位点
|
||
arSecPts.append(ptV);
|
||
}
|
||
|
||
AcGeVector3d vtUp = arSecPts.last() - arSecPts.at(1);
|
||
AcGeLine3d ln3d;
|
||
ln3d.set(ptV0, vtUp);
|
||
|
||
AcGePoint3d ptV1 = ptV + vtLXY * data.dSteepW;
|
||
arSecPts.append(ptV1);
|
||
|
||
AcGeLine3d lnEnd;
|
||
lnEnd.set(ptV1, AcGeVector3d::kZAxis);
|
||
|
||
AcGePoint3d ptInt;
|
||
if (ln3d.intersectWith(lnEnd, ptInt))
|
||
{
|
||
arSecPts.append(ptInt);
|
||
|
||
//闭合
|
||
arSecPts.append(arSecPts.first());
|
||
|
||
AcGePoint3d ptGe[5];
|
||
ptGe[0] = arSecPts.at(0);
|
||
ptGe[1] = arSecPts.at(1);
|
||
|
||
vtUp = ptGe[1] - ptGe[0];
|
||
ptGe[2] = ptInt + vtUp;
|
||
ptGe[3] = ptInt;
|
||
ptGe[4] = ptGe[0];
|
||
|
||
AcDbLine ln;
|
||
ln.setStartPoint(ptGe[1]);
|
||
ln.setEndPoint(ptGe[1] + vtW * 120);
|
||
|
||
AcDbRegion* pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5);
|
||
if (!pReg) return Acad::eOk;
|
||
AcDbX3dSolid xSolid;
|
||
if (xSolid.CreateExtrude(pReg, ln))
|
||
{
|
||
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
|
||
if (!pSolid)
|
||
{
|
||
DELETE_PTR(pReg);
|
||
return Acad::eOk;
|
||
}
|
||
|
||
if (bLeft)
|
||
{
|
||
dc.DrawEntity(pSolid);
|
||
dc.Add3dBuffer(pSolid);
|
||
add3DCache<AecDbDoubleMulStair>(&xSolid);
|
||
}
|
||
|
||
AcGeMatrix3d xform;
|
||
vtW *= (dStairsWidth - 120);
|
||
xform.setTranslation(vtW);
|
||
|
||
if (!bLeft)
|
||
{
|
||
AcDb3dSolid* pOtherSide = (AcDb3dSolid*)pSolid->clone();
|
||
if (!pOtherSide)
|
||
{
|
||
DELETE_PTR(pReg);
|
||
DELETE_PTR(pSolid);
|
||
return Acad::eOk;
|
||
}
|
||
|
||
pOtherSide->transformBy(xform);
|
||
dc.DrawEntity(pOtherSide);
|
||
dc.Add3dBuffer(pOtherSide);
|
||
{
|
||
xSolid.TransformBy(xform);
|
||
add3DCache<AecDbDoubleMulStair>(&xSolid);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawRestPlatform3d(AcGiDraw& dc
|
||
, const int& nType
|
||
, const AcGePoint3d& ptSta
|
||
, const double& dL
|
||
, const double& dW
|
||
, const AcGeVector3d& vecL
|
||
, const AcGeVector3d& vecW
|
||
, const double& dH
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d pt(AcGePoint3d::kOrigin);
|
||
AcGePoint3dArray ptAr;
|
||
ptAr.removeAll();
|
||
int nOldClr = dc.GetColor();
|
||
dc.SetColor(3);
|
||
|
||
switch (nType)
|
||
{
|
||
case 0:// left
|
||
|
||
ptAr.append(ptSta);
|
||
pt = ptSta - vecL * dL;
|
||
ptAr.append(pt);
|
||
pt -= vecW * data.dStairSW;
|
||
ptAr.append(pt);
|
||
pt += vecL * (dL - data.dStairTW);
|
||
ptAr.append(pt);
|
||
pt -= vecW * (dW - data.dStairSW);
|
||
ptAr.append(pt);
|
||
pt += vecL * data.dStairTW;
|
||
ptAr.append(pt);
|
||
ptAr.append(ptSta);
|
||
|
||
break;
|
||
case 1:// center
|
||
|
||
ptAr.append(ptSta);
|
||
pt = ptSta - vecL * data.dStairTW;
|
||
ptAr.append(pt);
|
||
pt -= vecW * (dW - data.dStairMW) * .5;
|
||
ptAr.append(pt);
|
||
pt -= vecL * (dL - data.dStairTW);
|
||
ptAr.append(pt);
|
||
pt -= vecW * data.dStairMW;
|
||
ptAr.append(pt);
|
||
pt += vecL * (dL - data.dStairTW);
|
||
ptAr.append(pt);
|
||
pt -= vecW * (dW - data.dStairMW) * .5;
|
||
ptAr.append(pt);
|
||
pt += vecL * data.dStairTW;
|
||
ptAr.append(pt);
|
||
ptAr.append(ptSta);
|
||
|
||
break;
|
||
case 2:// right
|
||
|
||
ptAr.append(ptSta);
|
||
pt = ptSta - vecL * dL;
|
||
ptAr.append(pt);
|
||
pt += vecW * data.dStairSW;
|
||
ptAr.append(pt);
|
||
pt += vecL * (dL - data.dStairTW);
|
||
ptAr.append(pt);
|
||
pt += vecW * (dW - data.dStairSW);
|
||
ptAr.append(pt);
|
||
pt += vecL * data.dStairTW;
|
||
ptAr.append(pt);
|
||
ptAr.append(ptSta);
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
AcDbRegion* pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptAr.asArrayPtr(), ptAr.length());
|
||
if (!pReg) return Acad::eOk;
|
||
drawSolid(dc, pReg, data.dSbThick, dH, AcGeVector3d::kZAxis, AcGeVector3d::kZAxis);
|
||
|
||
dc.SetColor(nOldClr);
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawCenterUpStairs3d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptSta
|
||
, const AcGePoint3d& ptEnd
|
||
, const AcGeVector3d& vt
|
||
, const AcGeVector3d& vtDir
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d ptS, ptE, pt;
|
||
AcGeVector3d Z(AcGeVector3d::kZAxis);
|
||
AcGePoint3d ptGeInL[6];
|
||
AcGePoint3d ptGeInR[6];
|
||
AcGePoint3d ptGeOut[8];
|
||
|
||
// 中梯
|
||
ptS = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtMW * .5);
|
||
ptS -= vtDir * (data.dRestPtML - data.dSteepW);
|
||
ptE = ptS - vtDir * data.nSteepMs * data.dSteepW;
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteepMs - 1, data.dStairMW, FALSE, data);
|
||
DrawSide3d(dc, ptE, ptS, data.nSteepMs - 1, data.dStairMW, TRUE, data);
|
||
DrawSteep3d(dc, ptE, ptS, data.nSteepMs, data.dStairMW, TRUE, TRUE, data);
|
||
}
|
||
else
|
||
{
|
||
DrawSteep3d(dc, ptE, ptS, data.nSteepMs, data.dStairMW, FALSE, FALSE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteepMs - 1, data.dStairMW, 0, data);
|
||
DrawRail3d(dc, ptE, ptS, data.nSteepMs - 1, data.dStairMW, 1, data);
|
||
}
|
||
|
||
ptGeInR[0] = ptE;
|
||
ptGeInR[1] = ptS;
|
||
|
||
ptGeInL[0] = ptE;
|
||
ptGeInL[1] = ptS;
|
||
|
||
// 中平台
|
||
ptS = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW);
|
||
DrawRestPlatform3d(dc, 1, ptS, data.dRestPtML, data.dRestPtMW, vtDir, vt, (data.nSteepMs - 1) * data.dSteepH + data.dSteepH, data);
|
||
|
||
// 二跑 left
|
||
ptS = ptSta - vt * (data.dRestPtW - data.dSteepW);
|
||
ptS -= vtDir * data.dStairTW * .5;
|
||
ptS += Z * ((data.nSteepMs - 1) * data.dSteepH + data.dSteepW - data.dSbThick);
|
||
ptE = ptS - vt * data.nSteep2s * data.dSteepW;
|
||
DrawSteep3d(dc, ptE, ptS, data.nSteep2s, data.dStairTW, data.bRBeam, data.bLBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, TRUE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, 1, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, 0, data);
|
||
}
|
||
|
||
ptGeInR[2] = ptE;
|
||
ptGeInR[3] = ptS;
|
||
|
||
ptGeOut[2] = ptE;
|
||
ptGeOut[3] = ptS;
|
||
|
||
// 边平台 left
|
||
DrawRestPlatform3d(dc, 0, ptSta, data.dRestPtL, data.dRestPtW, vtDir, vt, (data.nSteepMs - 1 + data.nSteep2s) * data.dSteepH + data.dSteepW - data.dSbThick, data);
|
||
|
||
// 二跑 right
|
||
ptS = ptEnd + vt * (data.dRestPtW - data.dSteepW);
|
||
ptS -= vtDir * data.dStairTW * .5;
|
||
ptS += Z * ((data.nSteepMs - 1) * data.dSteepH + data.dSteepW - data.dSbThick);
|
||
ptE = ptS + vt * data.nSteep2s * data.dSteepW;
|
||
DrawSteep3d(dc, ptE, ptS, data.nSteep2s, data.dStairTW, data.bLBeam, data.bRBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, TRUE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, 0, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteep2s - 1, data.dStairTW, 1, data);
|
||
}
|
||
|
||
ptGeInL[2] = ptE;
|
||
ptGeInL[3] = ptS;
|
||
|
||
ptGeOut[4] = ptE;
|
||
ptGeOut[5] = ptS;
|
||
|
||
// 边平台 right
|
||
DrawRestPlatform3d(dc, 2, ptEnd, data.dRestPtL, data.dRestPtW, vtDir, vt, (data.nSteepMs - 1 + data.nSteep2s) * data.dSteepH + data.dSteepW - data.dSbThick, data);
|
||
|
||
// 边梯 left
|
||
ptS = ptSta - vt * data.dStairSW * .5;
|
||
ptS -= vtDir * data.dRestPtL;
|
||
ptS += Z * ((data.nSteepMs - 1 + data.nSteep2s - 1) * data.dSteepH + data.dSteepW * 2 - data.dSbThick * 2);
|
||
ptE = ptS - vtDir * data.nSteepsS * data.dSteepW;
|
||
DrawSteep3d(dc, ptS, ptE, data.nSteepsS, data.dStairSW, data.bRBeam, data.bLBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, TRUE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, 1, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, 0, data);
|
||
}
|
||
|
||
ptGeInR[4] = ptS;
|
||
ptGeInR[5] = ptE;
|
||
|
||
ptGeOut[0] = ptS;
|
||
ptGeOut[1] = ptE;
|
||
|
||
// 边梯 right
|
||
ptS = ptEnd + vt * data.dStairSW * .5;
|
||
ptS -= vtDir * data.dRestPtL;
|
||
ptS += Z * ((data.nSteepMs - 1 + data.nSteep2s - 1) * data.dSteepH + data.dSteepW * 2 - data.dSbThick * 2);
|
||
ptE = ptS - vtDir * data.nSteepsS * data.dSteepW;
|
||
DrawSteep3d(dc, ptS, ptE, data.nSteepsS, data.dStairSW, data.bLBeam, data.bRBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, TRUE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, 0, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, 1, data);
|
||
}
|
||
|
||
ptGeInL[4] = ptS;
|
||
ptGeInL[5] = ptE;
|
||
|
||
ptGeOut[6] = ptS;
|
||
ptGeOut[7] = ptE;
|
||
|
||
DrawHandRail3d(dc, ptGeInL, ptGeInR, ptGeOut, vt, vtDir, data);
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawSideUpStairs3d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptSta
|
||
, const AcGePoint3d& ptEnd
|
||
, const AcGeVector3d& vt
|
||
, const AcGeVector3d& vtDir
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d ptS, ptE, pt;
|
||
AcGeVector3d Z(AcGeVector3d::kZAxis);
|
||
AcGePoint3d ptGeInL[6];
|
||
AcGePoint3d ptGeInR[6];
|
||
AcGePoint3d ptGeOut[8];
|
||
|
||
// 边梯 left
|
||
ptS = ptSta - vt * data.dStairSW * .5;
|
||
ptS -= vtDir * (data.dRestPtL - data.dSteepW);
|
||
ptE = ptS - vtDir * data.nSteepsS * data.dSteepW;
|
||
DrawSteep3d(dc, ptE, ptS, data.nSteepsS, data.dStairSW, data.bLBeam, data.bRBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, TRUE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, 1, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, 0, data);
|
||
}
|
||
|
||
ptGeInR[0] = ptE;
|
||
ptGeInR[1] = ptS;
|
||
|
||
ptGeOut[0] = ptE;
|
||
ptGeOut[1] = ptS;
|
||
|
||
// 边平台 left
|
||
DrawRestPlatform3d(dc, 0, ptSta, data.dRestPtL, data.dRestPtW, vtDir, vt, data.nSteepsS * data.dSteepH, data);
|
||
|
||
// 二跑 left
|
||
ptS = ptSta - vt * data.dRestPtW;
|
||
ptS -= vtDir * data.dStairTW * .5;
|
||
ptS += Z * ((data.nSteepsS - 1) * data.dSteepH + data.dSteepW - data.dSbThick);
|
||
ptE = ptS - vt * data.nSteep2s * data.dSteepW;
|
||
DrawSteep3d(dc, ptS, ptE, data.nSteep2s, data.dStairTW, data.bLBeam, data.bRBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, TRUE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, 1, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, 0, data);
|
||
}
|
||
|
||
ptGeInR[2] = ptS;
|
||
ptGeInR[3] = ptE;
|
||
|
||
ptGeOut[2] = ptS;
|
||
ptGeOut[3] = ptE;
|
||
|
||
// 中平台
|
||
ptS = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW);
|
||
DrawRestPlatform3d(dc, 1, ptS, data.dRestPtML, data.dRestPtMW, vtDir, vt, (data.nSteepsS - 1 + data.nSteep2s) * data.dSteepH + data.dSteepW - data.dSbThick, data);
|
||
|
||
// 中梯
|
||
ptS = ptSta - vt * (data.dRestPtW + (data.nSteep2s - 1) * data.dSteepW + data.dRestPtMW * .5);
|
||
ptS -= vtDir * data.dRestPtML;
|
||
ptS += Z * ((data.nSteepsS - 1 + data.nSteep2s - 1) * data.dSteepH + data.dSteepW * 2 - data.dSbThick * 2);
|
||
ptE = ptS - vtDir * data.nSteepMs * data.dSteepW;
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteepMs - 1, data.dStairMW, TRUE, data);
|
||
DrawSide3d(dc, ptS, ptE, data.nSteepMs - 1, data.dStairMW, FALSE, data);
|
||
DrawSteep3d(dc, ptS, ptE, data.nSteepMs, data.dStairMW, TRUE, TRUE, data);
|
||
}
|
||
else
|
||
{
|
||
DrawSteep3d(dc, ptS, ptE, data.nSteepMs, data.dStairMW, FALSE, FALSE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteepMs - 1, data.dStairMW, 0, data);
|
||
DrawRail3d(dc, ptS, ptE, data.nSteepMs - 1, data.dStairMW, 1, data);
|
||
}
|
||
|
||
ptGeInL[4] = ptS;
|
||
ptGeInL[5] = ptE;
|
||
|
||
ptGeInR[4] = ptS;
|
||
ptGeInR[5] = ptE;
|
||
|
||
// 二跑 right
|
||
ptS = ptEnd + vt * data.dRestPtW;
|
||
ptS -= vtDir * data.dStairTW * .5;
|
||
ptS += Z * ((data.nSteepsS - 1) * data.dSteepH + data.dSteepW - data.dSbThick);
|
||
ptE = ptS + vt * data.nSteep2s * data.dSteepW;
|
||
DrawSteep3d(dc, ptS, ptE, data.nSteep2s, data.dStairTW, data.bRBeam, data.bLBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, TRUE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, 0, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, 1, data);
|
||
}
|
||
|
||
ptGeInL[2] = ptS;
|
||
ptGeInL[3] = ptE;
|
||
|
||
ptGeOut[4] = ptS;
|
||
ptGeOut[5] = ptE;
|
||
|
||
// 边平台 right
|
||
DrawRestPlatform3d(dc, 2, ptEnd, data.dRestPtL, data.dRestPtW, vtDir, vt, data.nSteepsS * data.dSteepH, data);
|
||
|
||
// 边梯 right
|
||
ptS = ptEnd + vt * data.dStairSW * .5;
|
||
ptS -= vtDir * (data.dRestPtL - data.dSteepW);
|
||
ptE = ptS - vtDir * data.nSteepsS * data.dSteepW;
|
||
DrawSteep3d(dc, ptE, ptS, data.nSteepsS, data.dStairSW, data.bRBeam, data.bLBeam, data);
|
||
if (data.bLBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
}
|
||
if (data.bRBeam)
|
||
{
|
||
DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, TRUE, data);
|
||
}
|
||
|
||
if (data.bInsideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, 0, data);
|
||
}
|
||
if (data.bOutSideHRail && data.bOutSideRail)
|
||
{
|
||
DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, data.dStairSW, 1, data);
|
||
}
|
||
|
||
ptGeInL[0] = ptE;
|
||
ptGeInL[1] = ptS;
|
||
|
||
ptGeOut[6] = ptE;
|
||
ptGeOut[7] = ptS;
|
||
|
||
DrawHandRail3d(dc, ptGeInL, ptGeInR, ptGeOut, vt, vtDir, data);
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
// 栏杆
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawRail3d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptFr
|
||
, const AcGePoint3d& ptTo
|
||
, const int& nStairsNum
|
||
, const double& dStairsWidth
|
||
, const int& num
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d ptSta(ptFr);
|
||
AcGeVector3d vtL = (ptFr - ptTo).normalize();
|
||
vtL.z = 0.0;
|
||
|
||
AcGeVector3d vtLDir(vtL);
|
||
vtLDir.rotateBy(-PI / 2.0, AcGeVector3d::kZAxis);
|
||
vtLDir.normalize();
|
||
|
||
//一共多少步
|
||
int nCount = nStairsNum;
|
||
|
||
AcGePoint3dArray arSecPts;
|
||
|
||
if (data.nUpSide == 0)
|
||
{
|
||
ptSta += vtLDir * ((dStairsWidth - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptSta -= vtLDir * ((dStairsWidth - data.dGarSize[0]) * .5 - data.dBarSide) * 2 * num;
|
||
}
|
||
else
|
||
{
|
||
ptSta -= vtLDir * ((dStairsWidth - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptSta += vtLDir * ((dStairsWidth - data.dGarSize[0]) * .5 - data.dBarSide) * 2 * num;
|
||
}
|
||
|
||
//插入楼板的点 [AAA]
|
||
ptSta.z -= (data.dSteepW - data.dSteepH);
|
||
ptSta.z += data.dSteepW;//第一层等边直角
|
||
|
||
arSecPts.removeAll();
|
||
for (int i = 0; i < nCount; i++)
|
||
{
|
||
ptSta -= vtL * data.dSteepW * .5;
|
||
arSecPts.append(ptSta);
|
||
|
||
ptSta -= vtL * data.dSteepW * .5;
|
||
ptSta.z += data.dSteepH;
|
||
}
|
||
|
||
AcDbX3dSolid xSolid;
|
||
AcDbRegion* pReg(NULL);
|
||
for (int i = 0; i < arSecPts.length(); i++)
|
||
{
|
||
if (!data.nBShape)
|
||
{
|
||
pReg = makeRectRegion(arSecPts.at(i), data.dGarSize[0], data.dGarSize[0], vtL, vtLDir);
|
||
}
|
||
else
|
||
{
|
||
pReg = makeCircleRegion(arSecPts.at(i), AcGeVector3d::kZAxis, data.dGarSize[0] * .5);
|
||
}
|
||
if (pReg == NULL) return Acad::eOk;
|
||
AcDbLine line(arSecPts.at(i), arSecPts.at(i) + AcGeVector3d::kZAxis * data.dBarH);
|
||
if (xSolid.CreateExtrude(pReg, line))
|
||
{
|
||
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
|
||
if (pSolid == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pSolid);
|
||
dc.Add3dBuffer(pSolid);
|
||
add3DCache<AecDbDoubleMulStair>(&xSolid);
|
||
}
|
||
}
|
||
|
||
return Acad::eOk;
|
||
}
|
||
|
||
// 扶手
|
||
AcDbLine* AecDbDoubleMulStairDraw::DrawStairsPath3d(AcGiDraw& dc
|
||
, const AcGePoint3d& ptFr
|
||
, const AcGePoint3d& ptTo
|
||
, const int& nStairsNum
|
||
, const double& dStairsWidth
|
||
, const BOOL& bIn
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d ptSta(ptFr);
|
||
AcGeVector3d vtL = (ptFr - ptTo).normalize();
|
||
vtL.z = 0.0;
|
||
|
||
AcGeVector3d vtLDir(vtL), Z(AcGeVector3d::kZAxis);
|
||
vtLDir.rotateBy(-PI / 2.0, AcGeVector3d::kZAxis);
|
||
vtLDir.normalize();
|
||
|
||
//一共多少步
|
||
int nCount = nStairsNum;
|
||
|
||
//踏步左右总长
|
||
double dSteepL = (dStairsWidth/* - 2.0 * data.dSidet*/);//无论左右有无梁
|
||
|
||
AcGePoint3dArray arSecPts;
|
||
arSecPts.removeAll();
|
||
|
||
int i(1);
|
||
if (!bIn)
|
||
{
|
||
// 外侧扶手
|
||
i = 0;
|
||
}
|
||
|
||
arSecPts.append(ptSta);
|
||
for (i; i < nCount; i++)
|
||
{
|
||
ptSta -= vtL * data.dSteepW;
|
||
ptSta += Z * data.dSteepH;
|
||
arSecPts.append(ptSta);
|
||
}
|
||
|
||
AcDbLine* pLine = new AcDbLine(arSecPts.first(), arSecPts.last());
|
||
if (!pLine) return NULL;
|
||
return pLine;
|
||
}
|
||
|
||
namespace
|
||
{
|
||
|
||
void getCoordSystem(const AcGePoint3d &ptOrg
|
||
, const AcGeVector3d &vtNormal
|
||
, AcGeVector3d &vtX
|
||
, AcGeVector3d &vtY
|
||
, AcGeVector3d &vtZ)
|
||
{
|
||
AcGePlane pln(ptOrg, vtNormal);
|
||
AcGeMatrix3d matReg = AcGeMatrix3d::planeToWorld(pln);
|
||
AcGePoint3d ptOrgReg;
|
||
matReg.getCoordSystem(ptOrgReg, vtX, vtY, vtZ);
|
||
}
|
||
|
||
AcGeMatrix3d GetConverRegionMat(const AcDbRegion *pReg, const AcDbLine &line)
|
||
{
|
||
if (!pReg) return AcGeMatrix3d::kIdentity;
|
||
|
||
// 得到region的基本信息
|
||
AcDbExtents ext;
|
||
pReg->getGeomExtents(ext);
|
||
AcGePoint3d ptRegCen(CoreTools::MidPt(ext.maxPoint(), ext.minPoint())), ptLineCen(line.startPoint());
|
||
AcGeVector3d vtNormal, vtRegX, vtRegY, vtRegZ, vtLineX, vtLineY, vtLineZ;
|
||
pReg->getNormal(vtNormal);
|
||
getCoordSystem(ptRegCen, vtNormal, vtRegX, vtRegY, vtRegZ);
|
||
getCoordSystem(ptLineCen, line.endPoint() - line.startPoint(), vtLineX, vtLineY, vtLineZ);
|
||
|
||
return AcGeMatrix3d::alignCoordSys(ptRegCen, vtRegX, vtRegY, vtRegZ
|
||
, ptLineCen, vtLineX, vtLineY, vtLineZ);
|
||
}
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawHandRailPath3d(AcGiDraw& dc
|
||
, const AcGePoint3dArray& arPts
|
||
, const AcGeVector3d& vt
|
||
, const AcGeVector3d& vtDir
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcDbRegion* pReg(NULL);
|
||
AcGeVector3d vec = (arPts.at(0) - arPts.at(1)).normalize();
|
||
if (!data.nBShape)
|
||
{
|
||
vec.rotateBy(-PI / 2.0, AcGeVector3d::kZAxis);
|
||
vec.normalize();
|
||
pReg = makeRectRegion(arPts.at(0), data.dGarSize[0], data.dGarSize[0], vec, AcGeVector3d::kZAxis);
|
||
}
|
||
else
|
||
{
|
||
pReg = makeCircleRegion(arPts.at(0), vec, data.dGarSize[0] * .5);
|
||
}
|
||
if (!pReg) return Acad::eOk;
|
||
|
||
AcDbX3dSolid xSolid;
|
||
AcDb3dPolyline* p3dPoly = Format3dPolyline(arPts);
|
||
if (!p3dPoly)
|
||
{
|
||
DELETE_PTR(pReg);
|
||
return Acad::eOk;
|
||
}
|
||
if (xSolid.CreateSweep(pReg, (AcDbPolyline*)p3dPoly))
|
||
{
|
||
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
|
||
if (!pSolid)
|
||
{
|
||
DELETE_PTR(pReg);
|
||
return Acad::eOk;
|
||
}
|
||
dc.DrawEntity(pSolid);
|
||
dc.Add3dBuffer(pSolid);
|
||
add3DCache<AecDbDoubleMulStair>(&xSolid);
|
||
}
|
||
|
||
/*AcGeMatrix3d mat;
|
||
AcDbLine _line;
|
||
for (int i(0); i < arPts.length() - 1; ++i)
|
||
{
|
||
|
||
_line.setStartPoint(arPts[i]);
|
||
_line.setEndPoint(arPts[i + 1]);
|
||
|
||
mat = GetConverRegionMat(pReg, _line);
|
||
|
||
pReg->transformBy(mat);
|
||
if (xSolid.CreateExtrude(pReg, _line))
|
||
{
|
||
AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid();
|
||
if (pSolid == NULL) return Acad::eOk;
|
||
dc.DrawEntity(pSolid);
|
||
dc.Add3dBuffer(pSolid);
|
||
}
|
||
}*/
|
||
|
||
DELETE_PTR(pReg);
|
||
return Acad::eOk;
|
||
}
|
||
|
||
Acad::ErrorStatus AecDbDoubleMulStairDraw::DrawHandRail3d(AcGiDraw& dc
|
||
, const AcGePoint3d* ptArInL
|
||
, const AcGePoint3d* ptArInR
|
||
, const AcGePoint3d* ptArOut
|
||
, const AcGeVector3d& vt
|
||
, const AcGeVector3d& vtDir
|
||
, const SFSPStair& data) const
|
||
{
|
||
AcGePoint3d ptS, ptE, pt;
|
||
AcDbLine* pLine(NULL), *pLineS(NULL), *pLineE(NULL);
|
||
AcGeVector3d Z(AcGeVector3d::kZAxis), vec;
|
||
AcGePoint3d ptGe[15];
|
||
AcGePoint3d ptGeSE[4];
|
||
AcGePoint3dArray ptGeAr, pts;
|
||
double dDist(.0), dLY(.0), dLX(.0);
|
||
|
||
if (DOWN_ZERO(data.dZGarExt))
|
||
{
|
||
AfxMessageBox(_T("层间伸出不能小于0!"));
|
||
return Acad::eOk;
|
||
}
|
||
if (DOWN_ZERO(data.dGarExt))
|
||
{
|
||
AfxMessageBox(_T("转角扶手伸出不能小于0!"));
|
||
return Acad::eOk;
|
||
}
|
||
if (DOWN_ZERO(data.dBarSide))
|
||
{
|
||
AfxMessageBox(_T("扶手距边不能小于0!"));
|
||
return Acad::eOk;
|
||
}
|
||
|
||
double dTanAngle = data.dSteepH / data.dSteepW;
|
||
double dLen = sqrt(data.dSteepH * data.dSteepH + data.dSteepW * data.dSteepW);
|
||
double dSinAngle = data.dSteepH / dLen;
|
||
double dCosAngle = data.dSteepW / dLen;
|
||
|
||
if (data.nUpSide == 0)
|
||
{
|
||
// 内侧扶手 left
|
||
{
|
||
ptS = ptArInL[0] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInL[1] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 中梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepMs, data.dStairMW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[0] = ptS;
|
||
ptGe[1] = ptE;
|
||
|
||
ptS = ptArInL[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInL[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s, data.dStairTW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[2] = ptS;
|
||
ptGe[3] = ptE;
|
||
|
||
ptS = ptArInL[4] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInL[5] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[4] = ptS;
|
||
ptGe[5] = ptE;
|
||
|
||
ptGeAr.removeAll();
|
||
ptGeAr.append(ptGe[0]);
|
||
ptGeAr.append(ptGe[1]);
|
||
|
||
ptGeSE[0] = ptArInL[0] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInL[1] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] -= vtDir * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInL[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInL[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vtDir * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[3] - ptGe[2]).normalize();
|
||
pt = ptGe[2] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[2]);
|
||
ptGeAr.append(ptGe[3]);
|
||
|
||
ptGeSE[0] = ptArInL[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInL[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] += vt * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInL[4] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInL[5] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt -= vt * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[5] - ptGe[4]).normalize();
|
||
pt = ptGe[4] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[4]);
|
||
ptGeAr.append(ptGe[5]);
|
||
|
||
if (UP_ZERO(data.dZGarExt))
|
||
{
|
||
pt = ptGeAr.at(0) - vtDir * data.dZGarExt;
|
||
ptGeAr.insertAt(0, pt);
|
||
}
|
||
if (UP_ZERO(data.dGarExt))
|
||
{
|
||
pt = ptGeAr.last() - vtDir * data.dGarExt;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data);
|
||
}
|
||
|
||
// 内侧扶手 right
|
||
{
|
||
ptS = ptArInR[0] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInR[1] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 中梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepMs, data.dStairMW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[0] = ptS;
|
||
ptGe[1] = ptE;
|
||
|
||
ptS = ptArInR[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInR[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s, data.dStairTW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[2] = ptS;
|
||
ptGe[3] = ptE;
|
||
|
||
ptS = ptArInR[4] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInR[5] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[4] = ptS;
|
||
ptGe[5] = ptE;
|
||
|
||
ptGeAr.removeAll();
|
||
ptGeAr.append(ptGe[0]);
|
||
ptGeAr.append(ptGe[1]);
|
||
|
||
ptGeSE[0] = ptArInR[0] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInR[1] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] -= vtDir * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInR[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInR[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vtDir * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[3] - ptGe[2]).normalize();
|
||
pt = ptGe[2] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[2]);
|
||
ptGeAr.append(ptGe[3]);
|
||
|
||
ptGeSE[0] = ptArInR[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInR[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] -= vt * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInR[4] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInR[5] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vt * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[5] - ptGe[4]).normalize();
|
||
pt = ptGe[4] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[4]);
|
||
ptGeAr.append(ptGe[5]);
|
||
|
||
if (UP_ZERO(data.dZGarExt))
|
||
{
|
||
pt = ptGeAr.at(0) - vtDir * data.dZGarExt;
|
||
ptGeAr.insertAt(0, pt);
|
||
}
|
||
if (UP_ZERO(data.dGarExt))
|
||
{
|
||
pt = ptGeAr.last() - vtDir * data.dGarExt;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data);
|
||
}
|
||
|
||
// 外侧扶手
|
||
if (data.bOutSideHRail)
|
||
{
|
||
ptS = ptArOut[0] + vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[1] + vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯 Left
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[0] = ptE;
|
||
ptGe[1] = ptS;
|
||
|
||
ptS = ptArOut[2] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[3] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑 Left
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[2] = ptE;
|
||
ptGe[3] = ptS;
|
||
|
||
ptS = ptArOut[4] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[5] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑 Right
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[4] = ptS;
|
||
ptGe[5] = ptE;
|
||
|
||
ptS = ptArOut[6] - vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[7] - vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯 Right
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[6] = ptS;
|
||
ptGe[7] = ptE;
|
||
|
||
ptGeAr.removeAll();
|
||
ptGeAr.append(ptGe[0]);
|
||
ptGeAr.append(ptGe[1]);
|
||
|
||
/*pt = ptGe[1] + vtDir * (data.dRestPtL - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeAr.append(pt);*/
|
||
ptGeSE[0] = ptArOut[1] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArOut[0] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArOut[3] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[2] -= vt * data.dSteepW;
|
||
ptGeSE[3] = ptArOut[2] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vtDir * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[3] - ptGe[2]).normalize();
|
||
pt = ptGe[2] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[2]);
|
||
ptGeAr.append(ptGe[3]);
|
||
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
vec = (ptGe[5] - ptGe[4]).normalize();
|
||
pt = ptGe[4] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
ptGeAr.append(ptGe[4]);
|
||
ptGeAr.append(ptGe[5]);
|
||
|
||
/*pt = ptGe[5] - vt * (data.dRestPtW - data.dSteepW -data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeAr.append(pt);*/
|
||
ptGeSE[0] = ptArOut[4] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArOut[5] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] += vt * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArOut[6] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArOut[7] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[4] - ptGe[5]).normalize();
|
||
pt = ptGe[5] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[4] - ptGe[5]).normalize();
|
||
pt = ptGe[5] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt -= vt * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[7] - ptGe[6]).normalize();
|
||
pt = ptGe[6] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[6]);
|
||
ptGeAr.append(ptGe[7]);
|
||
|
||
if (UP_ZERO(data.dGarExt))
|
||
{
|
||
pt = ptGeAr.at(0) - vtDir * data.dGarExt;
|
||
ptGeAr.insertAt(0, pt);
|
||
pt = ptGeAr.last() - vtDir * data.dGarExt;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 内侧扶手 left
|
||
{
|
||
ptS = ptArInL[0] + vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInL[1] + vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS, data.dStairSW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[0] = ptS;
|
||
ptGe[1] = ptE;
|
||
|
||
ptS = ptArInL[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInL[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s, data.dStairTW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[2] = ptS;
|
||
ptGe[3] = ptE;
|
||
|
||
ptS = ptArInL[4] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInL[5] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 中梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepMs, data.dStairMW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[4] = ptS;
|
||
ptGe[5] = ptE;
|
||
|
||
ptGeAr.removeAll();
|
||
ptGeAr.append(ptGe[0]);
|
||
ptGeAr.append(ptGe[1]);
|
||
|
||
ptGeSE[0] = ptArInL[0] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInL[1] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] -= vtDir * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInL[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInL[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vtDir * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[3] - ptGe[2]).normalize();
|
||
pt = ptGe[2] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[2]);
|
||
ptGeAr.append(ptGe[3]);
|
||
|
||
ptGeSE[0] = ptArInL[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInL[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] -= vt * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInL[4] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInL[5] - vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vt * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[5] - ptGe[4]).normalize();
|
||
pt = ptGe[4] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[4]);
|
||
ptGeAr.append(ptGe[5]);
|
||
|
||
if (UP_ZERO(data.dGarExt))
|
||
{
|
||
pt = ptGeAr.at(0) - vtDir * data.dGarExt;
|
||
ptGeAr.insertAt(0, pt);
|
||
}
|
||
if (UP_ZERO(data.dZGarExt))
|
||
{
|
||
pt = ptGeAr.last() - vtDir * data.dZGarExt;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data);
|
||
}
|
||
|
||
// 内侧扶手 right
|
||
{
|
||
ptS = ptArInR[0] - vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInR[1] - vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS, data.dStairSW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[0] = ptS;
|
||
ptGe[1] = ptE;
|
||
|
||
ptS = ptArInR[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInR[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s, data.dStairTW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[2] = ptS;
|
||
ptGe[3] = ptE;
|
||
|
||
ptS = ptArInR[4] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArInR[5] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 中梯
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepMs - 1, data.dStairMW, TRUE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[4] = ptS;
|
||
ptGe[5] = ptE;
|
||
|
||
ptGeAr.removeAll();
|
||
ptGeAr.append(ptGe[0]);
|
||
ptGeAr.append(ptGe[1]);
|
||
|
||
ptGeSE[0] = ptArInR[0] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInR[1] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] -= vtDir * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInR[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInR[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vtDir * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[3] - ptGe[2]).normalize();
|
||
pt = ptGe[2] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[2]);
|
||
ptGeAr.append(ptGe[3]);
|
||
|
||
ptGeSE[0] = ptArInR[2] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArInR[3] - vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] += vt * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArInR[4] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArInR[5] + vt * (data.dStairMW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt -= vt * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[5] - ptGe[4]).normalize();
|
||
pt = ptGe[4] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[4]);
|
||
ptGeAr.append(ptGe[5]);
|
||
|
||
if (UP_ZERO(data.dGarExt))
|
||
{
|
||
pt = ptGeAr.at(0) - vtDir * data.dGarExt;
|
||
ptGeAr.insertAt(0, pt);
|
||
}
|
||
if (UP_ZERO(data.dZGarExt))
|
||
{
|
||
pt = ptGeAr.last() - vtDir * data.dZGarExt;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data);
|
||
}
|
||
|
||
// 外侧扶手
|
||
if (data.bOutSideHRail)
|
||
{
|
||
ptS = ptArOut[0] + vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[1] + vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯 Left
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[0] = ptS;
|
||
ptGe[1] = ptE;
|
||
|
||
ptS = ptArOut[2] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[3] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑 Left
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[2] = ptS;
|
||
ptGe[3] = ptE;
|
||
|
||
ptS = ptArOut[4] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[5] + vtDir * ((data.dStairTW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 二跑 Right
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s - 1, data.dStairTW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[4] = ptE;
|
||
ptGe[5] = ptS;
|
||
|
||
ptS = ptArOut[6] - vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptS += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
ptE = ptArOut[7] - vt * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide);
|
||
ptE += Z * (data.dSteepH + data.dBarH - data.dGarSize[0]);
|
||
// 边梯 Right
|
||
pLine = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data.dStairSW, FALSE, data);
|
||
pLine->getStartPoint(ptS);
|
||
pLine->getEndPoint(ptE);
|
||
DELETE_PTR(pLine);
|
||
ptGe[6] = ptE;
|
||
ptGe[7] = ptS;
|
||
|
||
ptGeAr.removeAll();
|
||
ptGeAr.append(ptGe[0]);
|
||
ptGeAr.append(ptGe[1]);
|
||
|
||
/*pt = ptGe[1] + vtDir * (data.dRestPtL - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeAr.append(pt);*/
|
||
ptGeSE[0] = ptArOut[0] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArOut[1] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
ptGeSE[1] -= vtDir * data.dSteepW;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArOut[2] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[3] = ptArOut[3] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[0] - ptGe[1]).normalize();
|
||
pt = ptGe[1] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt += vtDir * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[3] - ptGe[2]).normalize();
|
||
pt = ptGe[2] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[2]);
|
||
ptGeAr.append(ptGe[3]);
|
||
|
||
vec = (ptGe[2] - ptGe[3]).normalize();
|
||
pt = ptGe[3] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
vec = (ptGe[5] - ptGe[4]).normalize();
|
||
pt = ptGe[4] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
ptGeAr.append(ptGe[4]);
|
||
ptGeAr.append(ptGe[5]);
|
||
|
||
/*pt = ptGe[5] - vt * (data.dRestPtW - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeAr.append(pt);*/
|
||
ptGeSE[0] = ptArOut[5] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[0].z = 0;
|
||
ptGeSE[1] = ptArOut[4] + vtDir * (data.dStairTW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[1].z = 0;
|
||
pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]);
|
||
if (!pLineS)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineS);
|
||
ptGeSE[2] = ptArOut[7] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[2].z = 0;
|
||
ptGeSE[2] -= vtDir * data.dSteepW;
|
||
ptGeSE[3] = ptArOut[6] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5);
|
||
ptGeSE[3].z = 0;
|
||
pLineE = new AcDbLine(ptGeSE[3], ptGeSE[2]);
|
||
if (!pLineE)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
//CoreTools::CloneAndAddToModelSpace(pLineE);
|
||
pts.removeAll();
|
||
pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts);
|
||
if (pts.length() == 1)
|
||
{
|
||
/*AcDbCircle* pCir1 = new AcDbCircle(pts.first(), AcGeVector3d::kZAxis, 25);
|
||
pCir1->setColorIndex(6);
|
||
CoreTools::AddToModelSpace(pCir1);
|
||
AcDbCircle* pCir2 = new AcDbCircle(ptGeSE[1], AcGeVector3d::kZAxis, 25);
|
||
pCir2->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir2);
|
||
AcDbCircle* pCir3 = new AcDbCircle(ptGeSE[2], AcGeVector3d::kZAxis, 25);
|
||
pCir3->setColorIndex(3);
|
||
CoreTools::AddToModelSpace(pCir3);*/
|
||
dLX = ptGeSE[1].distanceTo(pts.first());
|
||
dLY = ptGeSE[2].distanceTo(pts.first());
|
||
}
|
||
if (dLX <= data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[4] - ptGe[5]).normalize();
|
||
pt = ptGe[5] - vec * dLX / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
else
|
||
{
|
||
vec = (ptGe[4] - ptGe[5]).normalize();
|
||
pt = ptGe[5] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
|
||
pt -= vt * (dLX - data.dSteepW * .5);;
|
||
ptGeAr.append(pt);
|
||
}
|
||
if (dLY > data.dSteepW * .5)
|
||
{
|
||
vec = (ptGe[7] - ptGe[6]).normalize();
|
||
pt = ptGe[6] - vec * (data.dSteepW * .5) / dCosAngle;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
ptGeAr.append(ptGe[6]);
|
||
ptGeAr.append(ptGe[7]);
|
||
|
||
if (UP_ZERO(data.dGarExt))
|
||
{
|
||
pt = ptGeAr.at(0) - vtDir * data.dGarExt;
|
||
ptGeAr.insertAt(0, pt);
|
||
pt = ptGeAr.last() - vtDir * data.dGarExt;
|
||
ptGeAr.append(pt);
|
||
}
|
||
|
||
DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data);
|
||
}
|
||
|
||
}
|
||
|
||
return Acad::eOk;
|
||
} |