-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2019 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
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include<GeomAPI_Edge.h>
#include<GeomAPI_Lin.h>
#include<GeomAPI_Ax2.h>
#include<GeomAPI_Ellipse.h>
+#include<GeomAPI_Vertex.h>
#include <BRepAdaptor_Curve.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <Geom_Ellipse.hxx>
#include <Geom_Plane.hxx>
+#include <GeomAPI_ExtremaCurveCurve.hxx>
+#include <GeomAPI_ExtremaCurveSurface.hxx>
#include <GeomAPI_IntCS.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <gp_Ax1.hxx>
}
}
+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;
+}
+
bool GeomAPI_Edge::isLine() const
{
const TopoDS_Shape& aShape = const_cast<GeomAPI_Edge*>(this)->impl<TopoDS_Shape>();
double A, B, C, D;
thePlane->coefficients(A, B, C, D);
gp_Pln aPln(A, B, C, D);
-
Handle(Geom_Plane) aPlane = new Geom_Plane(aPln);
+
+ // intersect the plane with the curve
GeomAPI_IntCS aIntersect;
aIntersect.Perform(aCurve, aPlane);
if (aIntersect.IsDone() && (aIntersect.NbPoints() > 0)) {
theResult.push_back(aPntPtr);
}
}
+ else {
+ // find minimal distance between the plane and the curve
+ GeomAPI_ExtremaCurveSurface anExtrema(aCurve, aPlane);
+ double aTolerance = BRep_Tool::Tolerance(TopoDS::Edge(aShape));
+ if (anExtrema.NbExtrema() > 0 &&
+ anExtrema.LowerDistance() < aTolerance) {
+ // distance is lower than tolerance => tangent case
+ gp_Pnt aPntC, aPntS;
+ anExtrema.NearestPoints(aPntC, aPntS);
+ std::shared_ptr<GeomAPI_Pnt> aPntPtr(new GeomAPI_Pnt(aPntS.X(), aPntS.Y(), aPntS.Z()));
+ theResult.push_back(aPntPtr);
+ }
+ }
}
}