X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FPlaneGCSSolver%2FPlaneGCSSolver_EdgeWrapper.cpp;h=d1269bb1bf01420576fab3b5eab1e6014944ae20;hb=87447545000c44e455431ed0d401f850f373374e;hp=7ec36cf236a33507de548cfad7bde4f137c137a5;hpb=6e421e939851e0de46554ae45a3ca0e1f67cd91d;p=modules%2Fshaper.git diff --git a/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_EdgeWrapper.cpp b/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_EdgeWrapper.cpp index 7ec36cf23..d1269bb1b 100644 --- a/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_EdgeWrapper.cpp +++ b/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_EdgeWrapper.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -20,19 +20,28 @@ #include #include +template +static bool isCurve(const GCSCurvePtr& theEntity) +{ + return std::dynamic_pointer_cast(theEntity).get(); +} + + PlaneGCSSolver_EdgeWrapper::PlaneGCSSolver_EdgeWrapper(const GCSCurvePtr theEntity) : myEntity(theEntity) { - std::shared_ptr aLine = std::dynamic_pointer_cast(myEntity); - if (aLine) myType = ENTITY_LINE; - else { - std::shared_ptr anArc = std::dynamic_pointer_cast(myEntity); - if (anArc) myType = ENTITY_ARC; - else { - std::shared_ptr aCircle = std::dynamic_pointer_cast(myEntity); - if (aCircle) myType = ENTITY_CIRCLE; - } - } + if (isCurve(myEntity)) + myType = ENTITY_LINE; + else if (isCurve(myEntity)) + myType = ENTITY_ARC; + else if (isCurve(myEntity)) + myType = ENTITY_CIRCLE; + else if (isCurve(myEntity)) + myType = ENTITY_ELLIPTIC_ARC; + else if (isCurve(myEntity)) + myType = ENTITY_ELLIPSE; + else if (isCurve(myEntity)) + myType = ENTITY_BSPLINE; } static double squareDistance(const GCS::Point& theP1, const GCS::Point& theP2) @@ -44,23 +53,36 @@ static double squareDistance(const GCS::Point& theP1, const GCS::Point& theP2) bool PlaneGCSSolver_EdgeWrapper::isDegenerated() const { - static const double aSqTol = tolerance * 1e-2; - static const double aMaxRadius = 1e8; + static const double THE_SQ_TOL = tolerance * 1e-2; + static const double THE_ANGLE_TOL = 1.e-5; + static const double THE_MAX_RADIUS = 1e8; + static const double THE_SQ_MAX_RADIUS = THE_MAX_RADIUS * THE_MAX_RADIUS; + if (myType == ENTITY_LINE) { std::shared_ptr aLine = std::dynamic_pointer_cast(myEntity); - return squareDistance(aLine->p1, aLine->p2) < aSqTol; + return squareDistance(aLine->p1, aLine->p2) < THE_SQ_TOL; } else if (myType == ENTITY_CIRCLE) { std::shared_ptr aCircle = std::dynamic_pointer_cast(myEntity); - return *aCircle->rad < tolerance || *aCircle->rad > aMaxRadius; + return *aCircle->rad < tolerance || *aCircle->rad > THE_MAX_RADIUS; } else if (myType == ENTITY_ARC) { - static const double anAngleTol = 1.e-5; std::shared_ptr anArc = std::dynamic_pointer_cast(myEntity); double anAngleDiff = fabs(*anArc->startAngle - *anArc->endAngle); double aSqRadius = squareDistance(anArc->center, anArc->start); - return aSqRadius < aSqTol || aSqRadius > aMaxRadius * aMaxRadius || // <- arc radius - anAngleDiff < anAngleTol || fabs(anAngleDiff - 2*PI) < anAngleTol; // <- arc angle + return aSqRadius < THE_SQ_TOL || aSqRadius > THE_SQ_MAX_RADIUS || // <- arc radius + anAngleDiff < THE_ANGLE_TOL || fabs(anAngleDiff - 2*PI) < THE_ANGLE_TOL; // <- arc angle + } + else if (myType == ENTITY_ELLIPSE) { + std::shared_ptr anEllipse = std::dynamic_pointer_cast(myEntity); + return *anEllipse->radmin < tolerance || anEllipse->getRadMaj() > THE_MAX_RADIUS; + } + else if (myType == ENTITY_ELLIPTIC_ARC) { + std::shared_ptr anArc = + std::dynamic_pointer_cast(myEntity); + double anAngleDiff = fabs(*anArc->startAngle - *anArc->endAngle); + return *anArc->radmin < THE_SQ_TOL || anArc->getRadMaj() > THE_SQ_MAX_RADIUS || // <- arc radius + anAngleDiff < THE_ANGLE_TOL || fabs(anAngleDiff - 2*PI) < THE_ANGLE_TOL; // <- arc angle } return false; }