+void GeomAPI_Edge::vertices(std::shared_ptr<GeomAPI_Vertex>& theStartVertex,
+ std::shared_ptr<GeomAPI_Vertex>& theEndVertex) const
+{
+ const TopoDS_Edge& anEdge = impl<TopoDS_Edge>();
+ TopoDS_Vertex aStart, aEnd;
+ TopExp::Vertices(anEdge, aStart, aEnd);
+ theStartVertex.reset(new GeomAPI_Vertex);
+ theStartVertex->setImpl(new TopoDS_Vertex(aStart));
+ theEndVertex.reset(new GeomAPI_Vertex);
+ theEndVertex->setImpl(new TopoDS_Vertex(aEnd));
+}
+
+static Handle(Geom_Curve) baseCurve(const TopoDS_Edge& theEdge)
+{
+ double aFirst, aLast;
+ Handle(Geom_Curve) aCurve = BRep_Tool::Curve(theEdge, aFirst, aLast);
+ while (aCurve->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))) {
+ Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(aCurve);
+ aCurve = tc->BasisCurve();
+ }
+ return aCurve;
+}
+
+bool GeomAPI_Edge::isSameGeometry(const std::shared_ptr<GeomAPI_Shape> theShape) const
+{
+ if (!theShape->isEdge())
+ return false;
+ if (isSame(theShape))
+ return true;
+
+ TopoDS_Edge anOwnEdge = TopoDS::Edge(impl<TopoDS_Shape>());
+ TopoDS_Edge anOtherEdge = TopoDS::Edge(theShape->impl<TopoDS_Shape>());
+
+ Handle(Geom_Curve) anOwnCurve = baseCurve(anOwnEdge);
+ Handle(Geom_Curve) anOtherCurve = baseCurve(anOtherEdge);
+ GeomAPI_ExtremaCurveCurve anExtrema(anOwnCurve, anOtherCurve);
+
+ bool isSame = anExtrema.Extrema().IsParallel() &&
+ anExtrema.TotalLowerDistance() < Precision::Confusion();
+ return isSame;
+}
+