#include "stdafx.h" #include "AecDbScissorsStair.h" #include "AecDbScissorsStairDraw.h" #include "AecDbEarthWorm.h" #include "AcDbX3dSolid.h" #include "CoreTools.h" #include #include #include 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(AecDbScissorsStairDraw, 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); } 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->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); } } AecDbScissorsStairDraw::AecDbScissorsStairDraw(void) { } AecDbScissorsStairDraw::~AecDbScissorsStairDraw(void) { } Acad::ErrorStatus AecDbScissorsStairDraw::Draw2d(AcGiDraw &dc) const { AcDbObjectId idCurLay = dc.GetLayerId(); AcDbObjectId idCurLty = dc.GetLineTypeId(); /*const AecDbObjXDataMap* pXDataMap = GetSpecialtyData(); if (pXDataMap == NULL) { return Acad::eOk; }*/ AcDbEntity *pEntReal = GetAttach(); if (pEntReal == NULL) return Acad::eOk; AecDbScissorsStair *pStair = AecDbScissorsStair::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 ptSta, ptEnd; ptSta = pLn->startPoint(); ptEnd = pLn->endPoint(); ptSta.z = ptEnd.z = 0.0; AcGeVector3d vtSE, vtSEDir, Z(AcGeVector3d::kZAxis); ptSta += Z * data.dBomEl; ptEnd += Z * data.dBomEl; vtSEDir = (ptEnd - ptSta).normalize(); vtSE = vtSEDir; vtSE.rotateBy(-PI / 2.0, Z); vtSE.normalize(); ptEnd = ptSta - vtSE * data.dStairTW; if (data.nUpSide == 1) { if (data.nSteepsS == data.nSteep2s) { DrawAlignPlatform2d(dc, ptSta, vtSE, vtSEDir, data); } else { if (data.nSteepAlign == 0) { DrawAlignPlatform2d(dc, ptSta, vtSE, vtSEDir, data); } else if (data.nSteepAlign == 1) { DrawAlignCen2d(dc, ptSta, vtSE, vtSEDir, data); } else if (data.nSteepAlign == 2) { DrawAlignFloor2d(dc, ptSta, vtSE, vtSEDir, data); } } } else { if (data.nSteepsS == data.nSteep2s) { DrawAlignPlatform2d(dc, ptEnd, -vtSE, vtSEDir, data); } else { if (data.nSteepAlign == 0) { DrawAlignPlatform2d(dc, ptEnd, -vtSE, vtSEDir, data); } else if (data.nSteepAlign == 1) { DrawAlignCen2d(dc, ptEnd, -vtSE, vtSEDir, data); } else if (data.nSteepAlign == 2) { DrawAlignFloor2d(dc, ptEnd, -vtSE, vtSEDir, data); } } } dc.SetColor(nCrBk); dc.SetLayer(idCurLay); dc.SetLineType(idCurLty); return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::Draw3d(AcGiDraw &dc) const { del3DCache(); AcDbObjectId idCurLay = dc.GetLayerId(); AcDbObjectId idCurLty = dc.GetLineTypeId(); AcDbEntity *pEntReal = GetAttach(); if (pEntReal == NULL) return Acad::eOk; AecDbScissorsStair *pStair = AecDbScissorsStair::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 ptSta, ptEnd; ptSta = pLn->startPoint(); ptEnd = pLn->endPoint(); AcGeVector3d vtSE, vtSEDir, Z(AcGeVector3d::kZAxis); ptSta += Z * data.dBomEl; ptEnd += Z * data.dBomEl; vtSEDir = (ptEnd - ptSta).normalize(); vtSE = vtSEDir; vtSE.rotateBy(-PI / 2.0, Z); vtSE.normalize(); ptEnd = ptSta - vtSE * data.dStairTW; if (data.nUpSide == 1) { if (data.nSteepsS == data.nSteep2s) { DrawAlignPlatform3d(dc, ptSta, vtSE, vtSEDir, data); DrawAlignPlatform3d(dc, ptEnd, -vtSE, -vtSEDir, data); } else { if (data.nSteepAlign == 0) { DrawAlignPlatform3d(dc, ptSta, vtSE, vtSEDir, data); DrawAlignPlatform3d(dc, ptEnd, -vtSE, -vtSEDir, data); } else if (data.nSteepAlign == 1) { DrawAlignCen3d(dc, ptSta, vtSE, vtSEDir, data); DrawAlignCen3d(dc, ptEnd, -vtSE, -vtSEDir, data); } else if (data.nSteepAlign == 2) { DrawAlignFloor3d(dc, ptSta, vtSE, vtSEDir, data); DrawAlignFloor3d(dc, ptEnd, -vtSE, -vtSEDir, data); } } } else { if (data.nSteepsS == data.nSteep2s) { DrawAlignPlatform3d(dc, ptEnd, -vtSE, vtSEDir, data); DrawAlignPlatform3d(dc, ptSta, vtSE, -vtSEDir, data); } else { if (data.nSteepAlign == 0) { DrawAlignPlatform3d(dc, ptEnd, -vtSE, vtSEDir, data); DrawAlignPlatform3d(dc, ptSta, vtSE, -vtSEDir, data); } else if (data.nSteepAlign == 1) { DrawAlignCen3d(dc, ptEnd, -vtSE, vtSEDir, data); DrawAlignCen3d(dc, ptSta, vtSE, -vtSEDir, data); } else if (data.nSteepAlign == 2) { DrawAlignFloor3d(dc, ptEnd, -vtSE, vtSEDir, data); DrawAlignFloor3d(dc, ptSta, vtSE, -vtSEDir, data); } } } DrawRestPlatform3d(dc, ptSta, ptEnd, vtSE, vtSEDir, data);// 楼梯平台 dc.SetColor(nCrBk); dc.SetLayer(idCurLay); dc.SetLineType(idCurLty); return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawUpStairDir2d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const BOOL& bBottom , const SFSPStair& data) const { AcGePoint3d pt; AcGeVector3d Z(AcGeVector3d::kZAxis); AcDbPolyline* pPl(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); double angle = vtDir.angleTo(AcGeVector3d::kXAxis) - PI * .5; if (data.nSteepsS == data.nSteep2s) { ptGe[0] = ptFr - vt * (data.dStairTW - data.dStairSW * .5); ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW); ptGe[1] = ptGe[0] + vtDir * (data.nSSteeps * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vtDir * dH; pPl = FormatPolyline(ptGe, 3); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(1, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } ptGe[0] = ptFr - vt * data.dStairSW * .5; ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[1] = ptGe[0] + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW * .5 * 2); ptGe[3] = ptGe[2] - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - data.nSSteeps - 1) * data.dSteepW); ptGe[4] = ptGe[3] + vtDir * dH; pPl = FormatPolyline(ptGe, 5); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(3, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } } else { if (data.nSteepAlign == 0) { ptGe[0] = ptFr - vt * (data.dStairTW - data.dStairSW * .5); ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW); ptGe[1] = ptGe[0] + vtDir * (data.nSSteeps * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vtDir * dH; pPl = FormatPolyline(ptGe, 3); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(1, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } ptGe[0] = ptFr - vt * data.dStairSW * .5; ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[1] = ptGe[0] + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW * .5 * 2); ptGe[3] = ptGe[2] - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - data.nSSteeps - 1) * data.dSteepW); ptGe[4] = ptGe[3] + vtDir * dH; pPl = FormatPolyline(ptGe, 5); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(3, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } } else if (data.nSteepAlign == 1) { ptGe[0] = ptFr - vt * (data.dStairTW - data.dStairSW * .5); ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW); if (data.nSteepsS < data.nSteep2s) { ptGe[0] -= vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5; } ptGe[1] = ptGe[0] + vtDir * (data.nSSteeps * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vtDir * dH; pPl = FormatPolyline(ptGe, 3); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(1, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } ptGe[0] = ptFr - vt * data.dStairSW * .5; ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); if (data.nSteepsS > data.nSteep2s) { ptGe[0] -= vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5; ptGe[1] = ptGe[0] + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[1] += vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5; ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW * .5 * 2); ptGe[3] = ptGe[2] - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - data.nSSteeps - 1) * data.dSteepW); ptGe[4] = ptGe[3] + vtDir * dH; } else { ptGe[1] = ptGe[0] + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW * .5 * 2); ptGe[3] = ptGe[2] - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - data.nSSteeps - 1) * data.dSteepW); ptGe[3] -= vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5; ptGe[4] = ptGe[3] + vtDir * dH; } pPl = FormatPolyline(ptGe, 5); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(3, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } } else if (data.nSteepAlign == 2) { ptGe[0] = ptFr - vt * (data.dStairTW - data.dStairSW * .5); ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1) * data.dSteepW + data.dSteepW); if (data.nSteepsS < data.nSteep2s) { ptGe[0] -= vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW; } ptGe[1] = ptGe[0] + vtDir * (data.nSSteeps * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vtDir * dH; pPl = FormatPolyline(ptGe, 3); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(1, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("上"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } ptGe[0] = ptFr - vt * data.dStairSW * .5; ptGe[0] -= vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); if (data.nSteepsS > data.nSteep2s) { ptGe[0] -= vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW; ptGe[1] = ptGe[0] + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[1] += vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW; ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW * .5 * 2); ptGe[3] = ptGe[2] - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - data.nSSteeps - 1) * data.dSteepW); ptGe[4] = ptGe[3] + vtDir * dH; } else { ptGe[1] = ptGe[0] + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dSteepW); ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW * .5 * 2); ptGe[3] = ptGe[2] - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - data.nSSteeps - 1) * data.dSteepW); ptGe[3] -= vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW; ptGe[4] = ptGe[3] + vtDir * dH; } pPl = FormatPolyline(ptGe, 5); if (pPl == NULL) return Acad::eOk; pPl->setWidthsAt(3, 0, dW); dc.DrawEntity(pPl); dc.Add2dBuffer(pPl); if (bBottom) { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextTop, AcGiDraw::kTopCenter); } else { drawText(dc, _T("下"), dTextH, ptGe[0], angle, Z, AcDb::kTextCenter, AcDb::kTextBottom, AcGiDraw::kCenter); } } } dc.SetColor(nOldClr); return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawInHandRail2d(AcGiDraw& dc , const AcGePoint3d& ptFr , const double& dL , const double& dW , const double& dOffset , const AcGeVector3d& vecL , const AcGeVector3d& vecW , const SFSPStair& data) const { AcDbVoidPtrArray ar; AcDbPolyline* pPoly = DrawRect2d(ptFr, dL, dW, vecL, vecW); if (pPoly == NULL) return Acad::eOk; pPoly->getOffsetCurves(dOffset, ar); if (ar.isEmpty()) { DELETE_PTR(pPoly); return Acad::eOk; } AcDbPolyline* pNewPoly = (AcDbPolyline*)(((AcDbEntity*)ar.first())->clone()); if (pNewPoly == NULL) { DELETE_PTR(pPoly); return Acad::eOk; } deleteArrayVoidPtrs(ar); dc.DrawEntity(pPoly); dc.Add2dBuffer(pPoly); dc.DrawEntity(pNewPoly); dc.Add2dBuffer(pNewPoly); return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawAlignPlatform2d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGePoint3d ptS(ptFr), ptE(ptFr), pt(AcGePoint3d::kOrigin); AcDbPolyline* pPolySubj(NULL), *pPolyClip(NULL), *pPoly(NULL); double dSidet(120); ptE -= vt * data.dStairTW; // Stairs for (int i(0); i < (data.nSteep2s - 1); ++i) { // bottom pt = ptS - vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptE + vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } for (int i(0); i < (data.nSteepsS - 1); ++i) { // bottom pt = ptE - vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptS + vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //内边梁 if (data.bLBeam) { pt = ptS - vtDir * data.dRestPtW * .5; pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * data.dRestPtW * .5; pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * data.dRestPtW * .5; pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * data.dRestPtW * .5; pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //外边梁 if (data.bRBeam) { pt = ptS - vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } // RestPlatform pt = ptS - vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, data.dStairTW, data.dRestPtW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // stairs center + InHandRail for (int i(0); i < 2; ++i) { // stairs center pt = ptS - vtDir * (data.dRestPtW * .5 + (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW); pt -= vt * data.dStairSW; pt += vtDir * ((max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dRestPtW) * i; pPolySubj = DrawRect2d(pt, data.dStairTW - data.dStairSW * 2, (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // InHandRail pt = ptS - vtDir * (data.dRestPtW * .5 - data.dGarExt); pt -= vt * (data.dStairSW - data.dBarSide - data.dGarSize[0]); pt += vtDir * ((max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dZGarExt + data.dGarExt + data.dRestPtW - data.dGarExt * 2) * i; DrawInHandRail2d(dc, pt , data.dStairTW - data.dStairSW * 2 + data.dGarSize[0] * 2 + data.dBarSide * 2 , (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dZGarExt + data.dGarExt , data.dGarSize[0], vt, -vtDir, data); } // OutHandRail if (data.bOutSideHRail) { pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dZGarExt); pt -= vt * data.dBarSide; pPolyClip = DrawRect2d(pt, data.dGarSize[0] , ((data.nSteepsS - 1 + data.nSteep2s - 1) * data.dSteepW + data.dRestPtW + data.dZGarExt * 2) , vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1) * data.dSteepW + data.dZGarExt); pt += vt * data.dBarSide; pPolyClip = DrawRect2d(pt, data.dGarSize[0] , ((data.nSteepsS - 1 + data.nSteep2s - 1) * data.dSteepW + data.dRestPtW + data.dZGarExt * 2) , -vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); } // UpStairsDirection if (data.bDimUpstair) { DrawUpStairDir2d(dc, ptS, vt, vtDir, 1, data); pt = ptS - vt * data.dStairTW; DrawUpStairDir2d(dc, pt, -vt, -vtDir, 0, data); } return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawAlignCen2d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGePoint3d ptS(ptFr), ptE(ptFr), pt; AcGePoint3d ptGe[20]; AcDbPolyline* pPolySubj(NULL), * pPolyClip(NULL), * pPoly(NULL); double dSidet(120); ptE -= vt * data.dStairTW; if (data.nSteepsS > data.nSteep2s) { // Stairs for (int i(0); i < (data.nSteep2s - 1); ++i) { // bottom pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); pt -= vtDir * data.dSteepW * i; pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptE + vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); pt += vtDir * data.dSteepW * i; pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } for (int i(0); i < (data.nSteepsS - 1); ++i) { // bottom pt = ptE - vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptS + vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } // RestPlatform ptGe[0] = ptS + vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vtDir * (data.dRestPtW + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); ptGe[2] = ptGe[1] - vt * data.dStairSW; ptGe[3] = ptGe[2] + vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5; ptGe[4] = ptGe[3] - vt * (data.dStairTW - data.dStairSW); ptGe[5] = ptGe[4] + vtDir * (data.dRestPtW + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); ptGe[6] = ptGe[5] + vt * data.dStairSW; ptGe[7] = ptGe[6] - vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5; ptGe[8] = ptGe[0]; pPolySubj = FormatPolyline(ptGe, 9); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // OutHandRail if (data.bOutSideHRail) { pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dZGarExt); pt -= vt * data.dBarSide; pPolyClip = DrawRect2d(pt , data.dGarSize[0] , (data.nSteep2s - 1 + data.nSteepsS - 1) * data.dSteepW + data.dRestPtW + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5 + data.dZGarExt * 2 , vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1) * data.dSteepW + data.dZGarExt); pt += vt * data.dBarSide; pPolyClip = DrawRect2d(pt , data.dGarSize[0] , (data.nSteep2s - 1 + data.nSteepsS - 1) * data.dSteepW + data.dRestPtW + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5 + data.dZGarExt * 2 , -vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); } //内边梁 if (data.bLBeam) { pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * data.dRestPtW * .5; pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * data.dRestPtW * .5; pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //外边梁 if (data.bRBeam) { pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW * .5); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } } else { // Stairs for (int i(0); i < (data.nSteep2s - 1); ++i) { // bottom pt = ptS - vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptE + vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } for (int i(0); i < (data.nSteepsS - 1); ++i) { // bottom pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptS + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } // RestPlatform ptGe[0] = ptS + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5); ptGe[1] = ptGe[0] - vtDir * (data.dRestPtW + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5); ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW); ptGe[3] = ptGe[2] - vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5; ptGe[4] = ptGe[3] - vt * data.dStairSW; ptGe[5] = ptGe[4] + vtDir * (data.dRestPtW + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5); ptGe[6] = ptGe[5] + vt * (data.dStairTW - data.dStairSW); ptGe[7] = ptGe[6] + vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5; ptGe[8] = ptGe[0]; pPolySubj = FormatPolyline(ptGe, 9); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // OutHandRail if (data.bOutSideHRail) { pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1) * data.dSteepW + data.dZGarExt); pt -= vt * data.dBarSide; pPolyClip = DrawRect2d(pt , data.dGarSize[0] , (data.nSteep2s - 1 + data.nSteepsS - 1) * data.dSteepW + data.dRestPtW + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5 + data.dZGarExt * 2 , vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5 + (data.nSteepsS - 1) * data.dSteepW + data.dZGarExt); pt += vt * data.dBarSide; pPolyClip = DrawRect2d(pt , data.dGarSize[0] , (data.nSteep2s - 1 + data.nSteepsS - 1) * data.dSteepW + data.dRestPtW + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5 + data.dZGarExt * 2 , -vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); } //内边梁 if (data.bLBeam) { pt = ptS - vtDir * data.dRestPtW * .5; pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5); pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5); pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * data.dRestPtW * .5; pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //外边梁 if (data.bRBeam) { pt = ptS - vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW * .5); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } } // stairs center + InHandRail for (int i(0); i < 2; ++i) { // stairs center pt = ptS - vtDir * (data.dRestPtW * .5 + (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW); pt -= vt * data.dStairSW; pt += vtDir * (data.dRestPtW + (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW) * i; pPolySubj = DrawRect2d(pt, data.dStairTW - data.dStairSW * 2, (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // InHandRail pt = ptS - vtDir * (data.dRestPtW * .5 - data.dGarExt); pt -= vt * (data.dStairSW - data.dBarSide - data.dGarSize[0]); pt += vtDir * ((max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dZGarExt + data.dGarExt + data.dRestPtW - data.dGarExt * 2) * i; DrawInHandRail2d(dc, pt , data.dStairTW - data.dStairSW * 2 + data.dGarSize[0] * 2 + data.dBarSide * 2 , (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dZGarExt + data.dGarExt , data.dGarSize[0], vt, -vtDir, data); } // UpStairsDirection if (data.bDimUpstair) { DrawUpStairDir2d(dc, ptS, vt, vtDir, 1, data); pt = ptS - vt * data.dStairTW; DrawUpStairDir2d(dc, pt, -vt, -vtDir, 0, data); } return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawAlignFloor2d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGePoint3d ptS(ptFr), ptE(ptFr), pt; AcGePoint3d ptGe[10]; AcDbPolyline* pPolySubj(NULL), * pPolyClip(NULL), * pPoly(NULL); double dSidet(120); ptE -= vt * data.dStairTW; if (data.nSteepsS > data.nSteep2s) { // RestPlatform ptGe[0] = ptS + vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vtDir * (data.dRestPtW + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW); ptGe[2] = ptGe[1] - vt * data.dStairSW; ptGe[3] = ptGe[2] + vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW; ptGe[4] = ptGe[3] - vt * (data.dStairTW - data.dStairSW); ptGe[5] = ptGe[4] + vtDir * (data.dRestPtW + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW); ptGe[6] = ptGe[5] + vt * data.dStairSW; ptGe[7] = ptGe[6] - vtDir * (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW; ptGe[8] = ptGe[0]; pPolySubj = FormatPolyline(ptGe, 9); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // Stairs for (int i(0); i < (data.nSteep2s - 1); ++i) { // bottom pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptE + vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } for (int i(0); i < (data.nSteepsS - 1); ++i) { // bottom pt = ptE - vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptS + vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //内边梁 if (data.bLBeam) { pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW); pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * data.dRestPtW * .5; pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * data.dRestPtW * .5; pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW); pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //外边梁 if (data.bRBeam) { pt = ptS - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * (data.dRestPtW * .5 + (data.nSteepsS - 1 - (data.nSteep2s - 1)) * data.dSteepW); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } } else { // RestPlatform ptGe[0] = ptS + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW); ptGe[1] = ptGe[0] - vtDir * (data.dRestPtW + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW); ptGe[2] = ptGe[1] - vt * (data.dStairTW - data.dStairSW); ptGe[3] = ptGe[2] - vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW; ptGe[4] = ptGe[3] - vt * data.dStairSW; ptGe[5] = ptGe[4] + vtDir * (data.dRestPtW + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW); ptGe[6] = ptGe[5] + vt * (data.dStairTW - data.dStairSW); ptGe[7] = ptGe[6] + vtDir * (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW; ptGe[8] = ptGe[0]; pPolySubj = FormatPolyline(ptGe, 9); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // Stairs for (int i(0); i < (data.nSteep2s - 1); ++i) { // bottom pt = ptS - vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptE + vtDir * (data.dRestPtW * .5 + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } for (int i(0); i < (data.nSteepsS - 1); ++i) { // bottom pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // top pt = ptS + vtDir * (data.dRestPtW * .5 + +(data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW + data.dSteepW * i); pPolySubj = DrawRect2d(pt, data.dStairSW, data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //内边梁 if (data.bLBeam) { pt = ptS - vtDir * data.dRestPtW * .5; pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW); pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW); pt -= vt * (data.dStairSW - dSidet); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * data.dRestPtW * .5; pt += vt * data.dStairSW; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } //外边梁 if (data.bRBeam) { pt = ptS - vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, -vt, -vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptS + vtDir * (data.dRestPtW * .5 + (data.nSteep2s - 1 - (data.nSteepsS - 1)) * data.dSteepW); pPolySubj = DrawRect2d(pt, dSidet, (data.nSteepsS - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); pt = ptE + vtDir * data.dRestPtW * .5; pPolySubj = DrawRect2d(pt, dSidet, (data.nSteep2s - 1) * data.dSteepW, -vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); } } // stairs center + InHandRail for (int i(0); i < 2; ++i) { // stairs center pt = ptS - vtDir * (data.dRestPtW * .5 + (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW); pt -= vt * data.dStairSW; pt += vtDir * (data.dRestPtW + (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW) * i; pPolySubj = DrawRect2d(pt, data.dStairTW - data.dStairSW * 2, (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW, vt, vtDir); if (pPolySubj == NULL) return Acad::eOk; dc.DrawEntity(pPolySubj); dc.Add2dBuffer(pPolySubj); // InHandRail pt = ptS - vtDir * (data.dRestPtW * .5 - data.dGarExt); pt -= vt * (data.dStairSW - data.dBarSide - data.dGarSize[0]); pt += vtDir * ((max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dZGarExt + data.dGarExt + data.dRestPtW - data.dGarExt * 2) * i; DrawInHandRail2d(dc, pt , data.dStairTW - data.dStairSW * 2 + data.dGarSize[0] * 2 + data.dBarSide * 2 , (max(data.nSteepsS, data.nSteep2s) - 1)* data.dSteepW + data.dZGarExt + data.dGarExt , data.dGarSize[0], vt, -vtDir, data); } // OutHandRail if (data.bOutSideHRail) { pt = ptS - vt * data.dBarSide; pt -= vtDir * (data.dRestPtW * .5 + (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dZGarExt); pPolyClip = DrawRect2d(pt, data.dGarSize[0], (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW * 2 + data.dRestPtW + data.dZGarExt * 2, vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); pt = ptE + vt * data.dBarSide; pt -= vtDir * (data.dRestPtW * .5 + (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW + data.dZGarExt); pPolyClip = DrawRect2d(pt, data.dGarSize[0], (max(data.nSteepsS, data.nSteep2s) - 1) * data.dSteepW * 2 + data.dRestPtW + data.dZGarExt * 2, vt, vtDir); if (pPolyClip == NULL) return Acad::eOk; dc.DrawEntity(pPolyClip); dc.Add2dBuffer(pPolyClip); } // UpStairsDirection if (data.bDimUpstair) { DrawUpStairDir2d(dc, ptS, vt, vtDir, 1, data); pt = ptS - vt * data.dStairTW; DrawUpStairDir2d(dc, pt, -vt, -vtDir, 0, data); } return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawSide3d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGePoint3d& ptTo , const int& nStairsNum , const SFSPStair& data) const { if (!data.bLBeam && !data.bRBeam) return Acad::eOk; AcGePoint3d ptSta = ptFr; AcGeVector3d vtL = ptTo - ptFr; vtL.normalize(); double dLx = data.nSteepS * data.dSteepW; double dLh = data.nSteepS * 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 = (data.dStairSW/* - 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 (data.bLBeam) { dc.DrawEntity(pSolid); dc.Add3dBuffer(pSolid); add3DCache(&xSolid); } AcGeMatrix3d xform; vtW *= (data.dStairSW - 120); xform.setTranslation(vtW); if (data.bRBeam) { AcDb3dSolid* pOtherSide = (AcDb3dSolid*)pSolid->clone(); if (!pOtherSide) { DELETE_PTR(pSolid); DELETE_PTR(pReg); return Acad::eOk; } pOtherSide->transformBy(xform); dc.DrawEntity(pOtherSide); dc.Add3dBuffer(pOtherSide); xSolid.TransformBy(xform); add3DCache(&xSolid); } } } return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawSteep3d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGePoint3d& ptTo , const int& nStairsNum , const SFSPStair& data) const { AcGePoint3d ptSta = ptFr; AcGeVector3d vtL = ptTo - ptFr; vtL.normalize(); double dLx = data.nSteepS * data.dSteepW; double dLh = data.nSteepS * 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 = data.dStairSW; AcGePoint3d ptV, ptV0; AcGePoint3dArray arSecPts; ptV = ptSta; ptV -= vtW * 0.5 * dSteepL; if (data.bLBeam) 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 (data.bLBeam) ptV = ptV0 + vtW * (dSteepL - 120.0); else ptV = ptV0 + vtW * dSteepL; if (data.bRBeam) ptV -= vtW * 120.0;//变梁宽,国标120 lnPath.setEndPoint(ptV); AcDbX3dSolid xSolid; if (xSolid.CreateExtrude(pReg, lnPath)) { DELETE_PTR(pReg); AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid(); if (!pSolid) { return Acad::eOk; } dc.DrawEntity(pSolid); dc.Add3dBuffer(pSolid); add3DCache(&xSolid); return Acad::eOk; } } return Acad::eInvalidInput; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawRestPlatform3d(AcGiDraw& dc , const AcGePoint3d& ptSta , const AcGePoint3d& ptEnd , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGeVector3d Z(AcGeVector3d::kZAxis); AcDbRegion* pReg(NULL); AcGePoint3d ptGe[10]; if (data.nUpSide == 0) { if (data.nSteepAlign == 0) { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * data.dStairTW; ptGe[2] = ptGe[1] + vtDir * data.dRestPtW; ptGe[3] = ptGe[2] + vt * data.dStairTW; ptGe[4] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5); } else if (data.nSteepAlign == 1) { if (data.nSteepsS > data.nSteep2s) { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * (data.dStairTW - data.dStairSW); ptGe[2] = ptGe[1] - vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * data.dStairSW; ptGe[4] = ptGe[3] + vtDir * ((data.nSteepsS - data.nSteep2s) * data.dSteepW * .5 + data.dRestPtW); ptGe[5] = ptGe[4] + vt * (data.dStairTW - data.dStairSW); ptGe[6] = ptGe[5] + vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * data.dStairSW; ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else if (data.nSteepsS < data.nSteep2s) { ptGe[0] = ptSta - vtDir * (data.dRestPtW * .5 + (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5); ptGe[1] = ptGe[0] - vt * data.dStairSW; ptGe[2] = ptGe[1] + vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * (data.dStairTW - data.dStairSW); ptGe[4] = ptGe[3] + vtDir * (data.dRestPtW + (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5); ptGe[5] = ptGe[4] + vt * data.dStairSW; ptGe[6] = ptGe[5] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * (data.dStairTW - data.dStairSW); ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * data.dStairTW; ptGe[2] = ptGe[1] + vtDir * data.dRestPtW; ptGe[3] = ptGe[2] + vt * data.dStairTW; ptGe[4] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5); } } else if (data.nSteepAlign == 2) { if (data.nSteepsS > data.nSteep2s) { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * (data.dStairTW - data.dStairSW); ptGe[2] = ptGe[1] - vtDir * (data.nSteepsS + data.nSteep2s) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * data.dStairSW; ptGe[4] = ptGe[3] + vtDir * ((data.nSteepsS + data.nSteep2s) * data.dSteepW * .5 + data.dRestPtW); ptGe[5] = ptGe[4] + vt * (data.dStairTW - data.dStairSW); ptGe[6] = ptGe[5] + vtDir * (data.nSteepsS + data.nSteep2s) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * data.dStairSW; ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else if (data.nSteepsS < data.nSteep2s) { ptGe[0] = ptSta - vtDir * (data.dRestPtW * .5 + (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5); ptGe[1] = ptGe[0] - vt * data.dStairSW; ptGe[2] = ptGe[1] + vtDir * (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * (data.dStairTW - data.dStairSW); ptGe[4] = ptGe[3] + vtDir * (data.dRestPtW + (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5); ptGe[5] = ptGe[4] + vt * data.dStairSW; ptGe[6] = ptGe[5] - vtDir * (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * (data.dStairTW - data.dStairSW); ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * data.dStairTW; ptGe[2] = ptGe[1] + vtDir * data.dRestPtW; ptGe[3] = ptGe[2] + vt * data.dStairTW; ptGe[4] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5); } } } else { if (data.nSteepAlign == 0) { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * data.dStairTW; ptGe[2] = ptGe[1] + vtDir * data.dRestPtW; ptGe[3] = ptGe[2] + vt * data.dStairTW; ptGe[4] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5); } else if (data.nSteepAlign == 1) { if (data.nSteepsS < data.nSteep2s) { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * (data.dStairTW - data.dStairSW); ptGe[2] = ptGe[1] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * data.dStairSW; ptGe[4] = ptGe[3] + vtDir * ((data.nSteep2s - data.nSteepsS) * data.dSteepW * .5 + data.dRestPtW); ptGe[5] = ptGe[4] + vt * (data.dStairTW - data.dStairSW); ptGe[6] = ptGe[5] + vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * data.dStairSW; ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else if (data.nSteepsS > data.nSteep2s) { ptGe[0] = ptSta - vtDir * (data.dRestPtW * .5 + (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5); ptGe[1] = ptGe[0] - vt * data.dStairSW; ptGe[2] = ptGe[1] + vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * (data.dStairTW - data.dStairSW); ptGe[4] = ptGe[3] + vtDir * (data.dRestPtW + (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5); ptGe[5] = ptGe[4] + vt * data.dStairSW; ptGe[6] = ptGe[5] - vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * (data.dStairTW - data.dStairSW); ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * data.dStairTW; ptGe[2] = ptGe[1] + vtDir * data.dRestPtW; ptGe[3] = ptGe[2] + vt * data.dStairTW; ptGe[4] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5); } } else if (data.nSteepAlign == 2) { if (data.nSteepsS < data.nSteep2s) { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * (data.dStairTW - data.dStairSW); ptGe[2] = ptGe[1] - vtDir * (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * data.dStairSW; ptGe[4] = ptGe[3] + vtDir * ((data.nSteep2s + data.nSteepsS) * data.dSteepW * .5 + data.dRestPtW); ptGe[5] = ptGe[4] + vt * (data.dStairTW - data.dStairSW); ptGe[6] = ptGe[5] + vtDir * (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * data.dStairSW; ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else if (data.nSteepsS > data.nSteep2s) { ptGe[0] = ptSta - vtDir * (data.dRestPtW * .5 + (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5); ptGe[1] = ptGe[0] - vt * data.dStairSW; ptGe[2] = ptGe[1] + vtDir * (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5; ptGe[3] = ptGe[2] - vt * (data.dStairTW - data.dStairSW); ptGe[4] = ptGe[3] + vtDir * (data.dRestPtW + (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5); ptGe[5] = ptGe[4] + vt * data.dStairSW; ptGe[6] = ptGe[5] - vtDir * (data.nSteep2s + data.nSteepsS) * data.dSteepW * .5; ptGe[7] = ptGe[6] + vt * (data.dStairTW - data.dStairSW); ptGe[8] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 9); } else { ptGe[0] = ptSta - vtDir * data.dRestPtW * .5; ptGe[1] = ptGe[0] - vt * data.dStairTW; ptGe[2] = ptGe[1] + vtDir * data.dRestPtW; ptGe[3] = ptGe[2] + vt * data.dStairTW; ptGe[4] = ptGe[0]; pReg = AecDbEarthWorm::CreatePolygonRegionOnly(ptGe, 5); } } } if (!pReg) return Acad::eOk; AcDbExtents ext; pReg->getGeomExtents(ext); AcGePoint3d ptCen(CoreTools::MidPt(ext.maxPoint(), ext.minPoint())); AcDbLine ln(ptCen, ptCen - Z * data.dSbThick); AcDbX3dSolid xSolid; AcGeMatrix3d mat; if (xSolid.CreateExtrude(pReg, ln)) { DELETE_PTR(pReg); AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid(); if (!pSolid) { return Acad::eOk; } mat.setTranslation(Z * data.nSteepsS * data.dSteepH); pSolid->transformBy(mat); dc.DrawEntity(pSolid); dc.Add3dBuffer(pSolid); xSolid.TransformBy(mat); add3DCache(&xSolid); } return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawAlignPlatform3d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGeVector3d Z(AcGeVector3d::kZAxis); AcGePoint3d ptS(ptFr), ptE; AcGePoint3d ptGe[4] ; ptS -= vt * data.dStairSW * .5; ptS += vtDir * data.dRestPtW * .5; ptE = ptS + vtDir * (data.nSteepsS - 1) * data.dSteepW; DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data); DrawSteep3d(dc, ptE, ptS + vtDir * data.dSteepW, data.nSteepsS, data); if (data.bInsideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 1, data); } ptGe[0] = ptE; ptGe[1] = ptS; ptS += Z * ((data.nSteepsS - 1) * data.dSteepH + data.dSteepW - data.dSbThick); ptS -= vt * (data.dStairTW - data.dStairSW * .5 * 2); ptE = ptS + vtDir * (data.nSteep2s - 1) * data.dSteepW; DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data); DrawSteep3d(dc, ptS, ptE + vtDir * data.dSteepW, data.nSteep2s, data); if (data.bInsideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 1, data); } ptGe[2] = ptS; ptGe[3] = ptE; DrawHandRail3d(dc, ptGe, 0, vt, vtDir, data); return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawAlignCen3d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGeVector3d Z(AcGeVector3d::kZAxis); AcGePoint3d ptS(ptFr), ptE; AcGePoint3d ptGe[4]; if (data.nSteepsS < data.nSteep2s) { ptS -= vt * data.dStairSW * .5; ptS += vtDir * data.dRestPtW * .5; ptS += vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptE = ptS + vtDir * (data.nSteepsS - 1) * data.dSteepW; DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data); DrawSteep3d(dc, ptE, ptS + vtDir * data.dSteepW, data.nSteepsS, data); if (data.bInsideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 1, data); } ptGe[0] = ptE; ptGe[1] = ptS; ptS -= vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptS += Z * ((data.nSteepsS - 1) * data.dSteepH + data.dSteepW - data.dSbThick); ptS -= vt * (data.dStairTW - data.dStairSW * .5 * 2); ptE = ptS + vtDir * (data.nSteep2s - 1) * data.dSteepW; DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data); DrawSteep3d(dc, ptS, ptE + vtDir * data.dSteepW, data.nSteep2s, data); if (data.bInsideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 1, data); } ptGe[2] = ptS; ptGe[3] = ptE; DrawHandRail3d(dc, ptGe, (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5, vt, vtDir, data); } else if (data.nSteepsS > data.nSteep2s) { ptS -= vt * data.dStairSW * .5; ptS += vtDir * data.dRestPtW * .5; ptE = ptS + vtDir * (data.nSteepsS - 1) * data.dSteepW; DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data); DrawSteep3d(dc, ptE, ptS + vtDir * data.dSteepW, data.nSteepsS, data); if (data.bInsideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 1, data); } ptGe[0] = ptE; ptGe[1] = ptS; ptS += Z * ((data.nSteepsS - 1) * data.dSteepH + data.dSteepW - data.dSbThick); ptS -= vt * (data.dStairTW - data.dStairSW * .5 * 2); ptS += vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptE = ptS + vtDir * (data.nSteep2s - 1) * data.dSteepW; DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data); DrawSteep3d(dc, ptS, ptE + vtDir * data.dSteepW, data.nSteep2s, data); if (data.bInsideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 1, data); } ptGe[2] = ptS; ptGe[3] = ptE; DrawHandRail3d(dc, ptGe, (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5, vt, vtDir, data); } return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawAlignFloor3d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGeVector3d Z(AcGeVector3d::kZAxis); AcGePoint3d ptS(ptFr), ptE; AcGePoint3d ptGe[4]; if (data.nSteepsS < data.nSteep2s) { ptS -= vt * data.dStairSW * .5; ptS += vtDir * data.dRestPtW * .5; ptS += vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW ; ptE = ptS + vtDir * (data.nSteepsS - 1) * data.dSteepW; DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data); DrawSteep3d(dc, ptE, ptS + vtDir * data.dSteepW, data.nSteepsS, data); if (data.bInsideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 1, data); } ptGe[0] = ptE; ptGe[1] = ptS; ptS -= vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; ptS += Z * ((data.nSteepsS - 1) * data.dSteepH + data.dSteepW - data.dSbThick); ptS -= vt * (data.dStairTW - data.dStairSW * .5 * 2); ptE = ptS + vtDir * (data.nSteep2s - 1) * data.dSteepW; DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data); DrawSteep3d(dc, ptS, ptE + vtDir * data.dSteepW, data.nSteep2s, data); if (data.bInsideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 1, data); } ptGe[2] = ptS; ptGe[3] = ptE; DrawHandRail3d(dc, ptGe, (data.nSteep2s - data.nSteepsS) * data.dSteepW, vt, vtDir, data); } else if (data.nSteepsS > data.nSteep2s) { ptS -= vt * data.dStairSW * .5; ptS += vtDir * data.dRestPtW * .5; ptE = ptS + vtDir * (data.nSteepsS - 1) * data.dSteepW; DrawSide3d(dc, ptE, ptS, data.nSteepsS - 1, data); DrawSteep3d(dc, ptE, ptS, data.nSteepsS, data); if (data.bInsideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptE, ptS, data.nSteepsS - 1, 1, data); } ptGe[0] = ptE; ptGe[1] = ptS; ptS += Z * ((data.nSteepsS - 1) * data.dSteepH + data.dSteepW - data.dSbThick); ptS -= vt * (data.dStairTW - data.dStairSW * .5 * 2); ptS += vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW; ptE = ptS + vtDir * (data.nSteep2s - 1) * data.dSteepW; DrawSide3d(dc, ptS, ptE, data.nSteep2s - 1, data); DrawSteep3d(dc, ptS, ptE + vtDir * data.dSteepW, data.nSteep2s, data); if (data.bInsideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 0, data); } if (data.bOutSideRail) { DrawRail3d(dc, ptS, ptE, data.nSteep2s - 1, 1, data); } ptGe[2] = ptS; ptGe[3] = ptE; DrawHandRail3d(dc, ptGe, (data.nSteep2s - data.nSteepsS) * data.dSteepW, vt, vtDir, data); } return Acad::eOk; } // 栏杆 Acad::ErrorStatus AecDbScissorsStairDraw::DrawRail3d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGePoint3d& ptTo , const int& nStairsNum , 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 * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide); ptSta -= vtLDir * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide) * 2 * num; } else { ptSta -= vtLDir * ((data.dStairSW - data.dGarSize[0]) * .5 - data.dBarSide); ptSta += vtLDir * ((data.dStairSW - 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) 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) return Acad::eOk; dc.DrawEntity(pSolid); dc.Add3dBuffer(pSolid); add3DCache(&xSolid); } } return Acad::eOk; } // 扶手 AcDbLine* AecDbScissorsStairDraw::DrawStairsPath3d(AcGiDraw& dc , const AcGePoint3d& ptFr , const AcGePoint3d& ptTo , const int& nStairsNum , const SFSPStair& data) const { AcGePoint3d ptSta(ptFr), ptEnd(ptFr); AcGeVector3d vtL = (ptFr - ptTo).normalize(); vtL.z = 0.0; AcGeVector3d vtLDir(vtL), Z(AcGeVector3d::kZAxis); vtLDir.rotateBy(-PI / 2.0, Z); vtLDir.normalize(); double dTanAngle = data.dSteepH / data.dSteepW; //一共多少步 int nCount = nStairsNum; //踏步左右总长 double dSteepL = (data.dStairSW/* - 2.0 * data.dSidet*/);//无论左右有无梁 AcGePoint3dArray arSecPts; arSecPts.removeAll(); arSecPts.append(ptSta); for (int i = 0; i < nCount; i++) { ptSta -= vtL * data.dSteepW; ptSta += Z * data.dSteepH; arSecPts.append(ptSta); } /*ptEnd -= vtL * data.dSteepW * .5; ptEnd += Z * data.dSteepW * .5 * dTanAngle; arSecPts.append(ptEnd); for (int i = 1; i < nCount; i++) { ptSta -= vtL * data.dSteepW; ptSta += Z * data.dSteepH; arSecPts.append(ptSta); } ptSta -= vtL * data.dSteepW * .5; ptSta += Z * data.dSteepW * .5 * dTanAngle; arSecPts.append(ptSta);*/ AcDbLine* pLine = new AcDbLine(arSecPts.first(), arSecPts.last()); if (!pLine) return NULL; return pLine; } Acad::ErrorStatus AecDbScissorsStairDraw::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; AcDbPolyline* pPoly = (AcDbPolyline*)Format3dPolyline(arPts); if (!pPoly) { DELETE_PTR(pPoly); return Acad::eOk; } //CoreTools::CloneAndAddToModelSpace(pPoly); AcDbX3dSolid xSolid; if (xSolid.CreateSweep(pReg, pPoly)) { DELETE_PTR(pReg); DELETE_PTR(pPoly); AcDb3dSolid* pSolid = xSolid.GetDraw3dSolid(); if (!pSolid) return Acad::eOk; dc.DrawEntity(pSolid); dc.Add3dBuffer(pSolid); add3DCache(&xSolid); } return Acad::eOk; } Acad::ErrorStatus AecDbScissorsStairDraw::DrawHandRail3d(AcGiDraw& dc , const AcGePoint3d* ptAr , const double& dRestL , const AcGeVector3d& vt , const AcGeVector3d& vtDir , const SFSPStair& data) const { AcGePoint3d ptS, ptE, pt; AcDbLine* pLine1(NULL); AcGeVector3d Z(AcGeVector3d::kZAxis), vec; AcGePoint3dArray ptGeAr; AcGePoint3d ptGe[15]; 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 (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; } ptS = ptAr[0] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptS += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); ptE = ptAr[1] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptE += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); pLine1 = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data); pLine1->getStartPoint(ptS); pLine1->getEndPoint(ptE); DELETE_PTR(pLine1); ptGe[0] = ptS; ptGe[1] = ptE; ptS = ptAr[2] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptS += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); ptE = ptAr[3] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptE += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); pLine1 = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s - 1, data); pLine1->getStartPoint(ptS); pLine1->getEndPoint(ptE); ptGe[2] = ptS; ptGe[3] = ptE; ptGeAr.removeAll(); ptGeAr.append(ptGe[0]); ptGeAr.append(ptGe[1]); AcGePoint3d ptGeSE[4] = { AcGePoint3d::kOrigin }; AcDbLine* pLineS(NULL), *pLineE(NULL); if (data.nSteepsS < data.nSteep2s) { if (data.nSteepAlign == 1) { ptGeSE[0] = ptGe[0] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGeSE[1] = ptGe[1] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; } else if (data.nSteepAlign == 2) { ptGeSE[0] = ptGe[0] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; ptGeSE[1] = ptGe[1] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; } else { ptGeSE[0] = ptGe[0]; ptGeSE[1] = ptGe[1]; } ptGeSE[2] = ptGe[2] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeSE[3] = ptGe[3] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); } else if (data.nSteepsS > data.nSteep2s) { ptGeSE[0] = ptGe[0]; ptGeSE[1] = ptGe[1]; ptGeSE[2] = ptGe[2] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeSE[3] = ptGe[3] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); if (data.nSteepAlign == 1) { ptGeSE[2] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGeSE[3] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; } else if (data.nSteepAlign == 2) { ptGeSE[2] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW; ptGeSE[3] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW; } } else { ptGeSE[0] = ptGe[0]; ptGeSE[1] = ptGe[1]; ptGeSE[2] = ptGe[2] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeSE[3] = ptGe[3] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); } pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]); //CoreTools::CloneAndAddToModelSpace(pLineS); pLineE = new AcDbLine(ptGeSE[2], ptGeSE[3]); //CoreTools::CloneAndAddToModelSpace(pLineE); double dLXY(.0), dLX(.0); AcGePoint3dArray pts; pts.removeAll(); pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts); if (pts.length() == 1) { dLXY = ptGeSE[1].distanceTo(pts.first()); dLX = dLXY * dCosAngle; } if (data.dGarExt <= dLX) { vec = (ptGe[0] - ptGe[1]).normalize(); pt = ptGe[1] - vec * data.dGarExt / dCosAngle; ptGeAr.append(pt); if (data.nSteepsS < data.nSteep2s) { if (data.nSteepAlign == 1) { pt -= vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGeAr.append(pt); } else if (data.nSteepAlign == 2) { pt -= vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; ptGeAr.append(pt); } vec = (ptGe[2] - ptGe[3]).normalize(); pt = ptGe[2] + vec * data.dGarExt / dCosAngle; ptGeAr.append(pt); } if (data.nSteepsS > data.nSteep2s) { if (data.nSteepAlign == 1) { pt = ptGe[2] - vtDir * ((data.nSteepsS - data.nSteep2s) * data.dSteepW * .5 + data.dGarExt); ptGeAr.append(pt); pt += vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGeAr.append(pt); } else if (data.nSteepAlign == 2) { pt = ptGe[2] - vtDir * ((data.nSteepsS - data.nSteep2s) * data.dSteepW + data.dGarExt); ptGeAr.append(pt); pt += vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW; ptGeAr.append(pt); } else { vec = (ptGe[2] - ptGe[3]).normalize(); pt = ptGe[2] + vec * data.dGarExt / dCosAngle; ptGeAr.append(pt); } } else { vec = (ptGe[2] - ptGe[3]).normalize(); pt = ptGe[2] + vec * data.dGarExt / dCosAngle; ptGeAr.append(pt); } } else { vec = (ptGe[0] - ptGe[1]).normalize(); pt = ptGe[1] - vec * dLXY; ptGeAr.append(pt); if ((data.dGarExt - dLX) < data.dGarSize[0] * .5) { pt -= vtDir * data.dGarSize[0] * .5; ptGeAr.append(pt); } else { pt -= vtDir * (data.dGarExt - dLX); ptGeAr.append(pt); } if (data.nSteepsS < data.nSteep2s) { if (data.nSteepAlign == 1) { pt -= vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGeAr.append(pt); } else if (data.nSteepAlign == 2) { pt -= vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; ptGeAr.append(pt); } pt -= vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeAr.append(pt); vec = (ptGe[2] - ptGe[3]).normalize(); pt = ptGe[2] + vec * dLXY; ptGeAr.append(pt); } else if (data.nSteepsS > data.nSteep2s) { pt -= vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeAr.append(pt); if ((data.dGarExt - dLX) < data.dGarSize[0] * .5) { pt += vtDir * data.dGarSize[0] * .5; ptGeAr.append(pt); } else { pt += vtDir * (data.dGarExt - dLX); ptGeAr.append(pt); } if (data.nSteepAlign == 1 || data.nSteepAlign == 2) { vec = (ptGe[2] - ptGe[3]).normalize(); pt = ptGe[2] + vec * dLXY; ptGeAr.append(pt); } } else { pt -= vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeAr.append(pt); vec = (ptGe[2] - ptGe[3]).normalize(); pt = ptGe[2] + vec * dLXY; ptGeAr.append(pt); } } ptGeAr.append(ptGe[2]); ptGeAr.append(ptGe[3]); pt = ptGe[3] + vtDir * data.dZGarExt; ptGeAr.append(pt); if (data.nSteepsS < data.nSteep2s) { if (data.nSteepAlign == 0) { pt = ptGeAr.at(0) + vtDir * data.dZGarExt; ptGeAr.insertAt(0, pt); pt += vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; ptGeAr.insertAt(0, pt); pt -= vt * (data.dStairTW - data.dStairSW * 2 + data.dGarSize[0]); ptGeAr.insertAt(0, pt); } else if (data.nSteepAlign == 1) { pt = ptGeAr.at(0) + vtDir * data.dZGarExt; ptGeAr.insertAt(0, pt); pt += vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGeAr.insertAt(0, pt); pt -= vt * (data.dStairTW - data.dStairSW * 2 + data.dGarSize[0]); ptGeAr.insertAt(0, pt); } else if (data.nSteepAlign == 2) { pt = ptGeAr.at(0) + vtDir * data.dZGarExt; ptGeAr.insertAt(0, pt); pt -= vt * (data.dStairTW - data.dStairSW * 2 + data.dGarSize[0]); ptGeAr.insertAt(0, pt); } } else if (data.nSteepsS > data.nSteep2s) { pt = ptGeAr.at(0) + vtDir * data.dZGarExt; ptGeAr.insertAt(0, pt); pt -= vt * (data.dStairTW - data.dStairSW * 2 + data.dGarSize[0]); ptGeAr.insertAt(0, pt); if (data.nSteepAlign == 0) { pt -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW; ptGeAr.insertAt(0, pt); } else if (data.nSteepAlign == 1) { pt -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGeAr.insertAt(0, pt); } } else if (data.nSteepsS == data.nSteep2s) { pt = ptGeAr.at(0) + vtDir * data.dZGarExt; ptGeAr.insertAt(0, pt); pt -= vt * (data.dStairTW - data.dStairSW * 2 + data.dGarSize[0]); ptGeAr.insertAt(0, pt); } DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data); if (data.bOutSideHRail) { ptS = ptAr[0] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptS += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); ptE = ptAr[1] - vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptE += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); pLine1 = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data); pLine1->getStartPoint(ptS); pLine1->getEndPoint(ptE); //CoreTools::CloneAndAddToModelSpace(pLine1); DELETE_PTR(pLine1); ptGe[0] = ptS; ptGe[1] = ptE; ptS = ptAr[2] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptS += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); ptE = ptAr[3] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptE += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); pLine1 = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s - 1, data); pLine1->getStartPoint(ptS); pLine1->getEndPoint(ptE); //CoreTools::CloneAndAddToModelSpace(pLine1); ptGe[2] = ptS; ptGe[3] = ptE; AcGePoint3d ptGeSE[4]; AcDbLine* pLineS(NULL), * pLineE(NULL); if (data.nSteepsS < data.nSteep2s) { if (data.nSteepAlign == 1) { ptGeSE[0] = ptGe[0] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; ptGeSE[1] = ptGe[1] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW * .5; } else if (data.nSteepAlign == 2) { ptGeSE[0] = ptGe[0] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; ptGeSE[1] = ptGe[1] - vtDir * (data.nSteep2s - data.nSteepsS) * data.dSteepW; } else { ptGeSE[0] = ptGe[0]; ptGeSE[1] = ptGe[1]; } ptGeSE[2] = ptGe[2] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeSE[3] = ptGe[3] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); } else if (data.nSteepsS > data.nSteep2s) { ptGeSE[0] = ptGe[0]; ptGeSE[1] = ptGe[1]; ptGeSE[2] = ptGe[2] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeSE[3] = ptGe[3] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); if (data.nSteepAlign == 1) { ptGeSE[2] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; ptGeSE[3] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW * .5; } else if (data.nSteepAlign == 2) { ptGeSE[2] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW; ptGeSE[3] -= vtDir * (data.nSteepsS - data.nSteep2s) * data.dSteepW; } } else { ptGeSE[0] = ptGe[0]; ptGeSE[1] = ptGe[1]; ptGeSE[2] = ptGe[2] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); ptGeSE[3] = ptGe[3] + vt * ((data.dBarSide + data.dGarSize[0] * .5) * 2 + data.dStairTW - data.dStairSW * 2); } pLineS = new AcDbLine(ptGeSE[0], ptGeSE[1]); //CoreTools::CloneAndAddToModelSpace(pLineS); pLineE = new AcDbLine(ptGeSE[2], ptGeSE[3]); //CoreTools::CloneAndAddToModelSpace(pLineE); double dLXY(.0), dLX(.0); AcGePoint3dArray pts; pts.removeAll(); pLineS->intersectWith(pLineE, AcDb::kExtendBoth, pts); if (pts.length() == 1) { dLXY = ptGeSE[1].distanceTo(pts.first()); dLX = dLXY * dCosAngle; } ptS = ptAr[0] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptS += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); ptE = ptAr[1] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptE += Z * (data.dBarH - data.dGarSize[0] + data.dSteepH); pLine1 = DrawStairsPath3d(dc, ptS, ptE, data.nSteepsS - 1, data); pLine1->getStartPoint(ptS); pLine1->getEndPoint(ptE); //CoreTools::CloneAndAddToModelSpace(pLine1); DELETE_PTR(pLine1); ptGe[4] = ptS; ptGe[5] = ptE; ptS = ptAr[0] + vt * (data.dStairSW * .5 - data.dBarSide - data.dGarSize[0] * .5); ptS += Z * (data.nSteepsS * data.dSteepH + data.dSteepW - data.dSbThick + data.dBarH - data.dGarSize[0]); ptS -= vtDir * ((data.nSteepsS - 1) * data.dSteepW + data.dRestPtW); if (data.nSteepsS < data.nSteep2s) { ptS -= vtDir * dRestL; } else if (data.nSteepsS > data.nSteep2s) { if (data.nSteepAlign == 2) { ptS += vtDir * dRestL; } else { ptS -= vtDir * dRestL; } } ptE = ptS - vtDir * data.nSteep2s * data.dSteepW; pLine1 = DrawStairsPath3d(dc, ptS, ptE, data.nSteep2s - 1, data); pLine1->getStartPoint(ptS); pLine1->getEndPoint(ptE); DELETE_PTR(pLine1); ptGe[6] = ptS; ptGe[7] = ptE; ptGeAr.removeAll(); ptGeAr.append(ptGe[4]); ptGeAr.append(ptGe[5]); vec = (ptGe[4] - ptGe[5]).normalize(); pt = ptGe[5] - vec * dLXY; ptGeAr.append(pt); vec = (ptGe[7] - ptGe[6]).normalize(); pt = ptGe[6] - vec * dLXY; ptGeAr.append(pt); ptGeAr.append(ptGe[6]); ptGeAr.append(ptGe[7]); if (UP_ZERO(data.dZGarExt)) { ptE -= vtDir * data.dZGarExt; ptGeAr.append(ptE); ptS = ptGeAr.at(0) + vtDir * data.dZGarExt; ptGeAr.insertAt(0, ptS); } DrawHandRailPath3d(dc, ptGeAr, vt, vtDir, data); } return Acad::eOk; }