#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(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(&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(); 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(&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(&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(&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(&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(&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; }