+ if (isCurve<GCS::Line>(myEntity))
+ myType = ENTITY_LINE;
+ else if (isCurve<GCS::Arc>(myEntity))
+ myType = ENTITY_ARC;
+ else if (isCurve<GCS::Circle>(myEntity))
+ myType = ENTITY_CIRCLE;
+ else if (isCurve<GCS::ArcOfEllipse>(myEntity))
+ myType = ENTITY_ELLIPTIC_ARC;
+ else if (isCurve<GCS::Ellipse>(myEntity))
+ myType = ENTITY_ELLIPSE;
+ else if (isCurve<GCS::BSpline>(myEntity))
+ myType = ENTITY_BSPLINE;
+}
+
+static double squareDistance(const GCS::Point& theP1, const GCS::Point& theP2)
+{
+ double dx = *theP1.x - *theP2.x;
+ double dy = *theP1.y - *theP2.y;
+ return dx*dx + dy*dy;
+}
+
+bool PlaneGCSSolver_EdgeWrapper::isDegenerated() const
+{
+ 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<GCS::Line> aLine = std::dynamic_pointer_cast<GCS::Line>(myEntity);
+ return squareDistance(aLine->p1, aLine->p2) < THE_SQ_TOL;
+ }
+ else if (myType == ENTITY_CIRCLE) {
+ std::shared_ptr<GCS::Circle> aCircle = std::dynamic_pointer_cast<GCS::Circle>(myEntity);
+ return *aCircle->rad < tolerance || *aCircle->rad > THE_MAX_RADIUS;
+ }
+ else if (myType == ENTITY_ARC) {