Files
envi-code/SourceCode/Code2026/ArchCmd/AecDbDoubleMulStairDraw.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

2780 lines
82 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}