diff --git a/src/Mod/Part/App/TopoShapeEdgePy.xml b/src/Mod/Part/App/TopoShapeEdgePy.xml
index 770b4e76f7..9600346492 100644
--- a/src/Mod/Part/App/TopoShapeEdgePy.xml
+++ b/src/Mod/Part/App/TopoShapeEdgePy.xml
@@ -528,6 +528,15 @@ coordinate system.
+
+
+ curveOnSurface(idx) -> None or tuple
+Returns the 2D curve, the surface and the parameter range of index idx.
+Returns None if index idx is out of range.
+Returns a 4-items tuple of a curve, a surface, first parameter and last parameter.
+
+
+
diff --git a/src/Mod/Part/App/TopoShapeEdgePyImp.cpp b/src/Mod/Part/App/TopoShapeEdgePyImp.cpp
index bee42e6612..068c91b716 100644
--- a/src/Mod/Part/App/TopoShapeEdgePyImp.cpp
+++ b/src/Mod/Part/App/TopoShapeEdgePyImp.cpp
@@ -44,6 +44,9 @@
# include
# include
# include
+# include
+# include
+# include
# include
# include
# include
@@ -86,6 +89,7 @@
#include
#include
+#include "Geometry2d.h"
#include "Geometry.h"
#include
#include
@@ -1045,6 +1049,42 @@ Py::Boolean TopoShapeEdgePy::getDegenerated(void) const
return Py::Boolean(ok ? true : false);
}
+PyObject* TopoShapeEdgePy::curveOnSurface(PyObject *args)
+{
+ int idx;
+ if (!PyArg_ParseTuple(args, "i", &idx))
+ return 0;
+
+ try {
+ TopoDS_Edge edge = TopoDS::Edge(getTopoShapePtr()->getShape());
+ Handle(Geom2d_Curve) curve;
+ Handle(Geom_Surface) surf;
+ TopLoc_Location loc;
+ Standard_Real first, last;
+
+ BRep_Tool::CurveOnSurface(edge, curve, surf, loc, first, last, idx+1);
+ if (curve.IsNull())
+ Py_Return;
+ std::unique_ptr geo2d = getCurve2dFromGeom2d(curve);
+ if (!geo2d)
+ Py_Return;
+ Part::GeomSurface* geosurf = makeFromSurface(surf);
+ if (!geosurf)
+ Py_Return;
+
+ Py::Tuple tuple(4);
+ tuple.setItem(0, Py::asObject(geo2d->getPyObject()));
+ tuple.setItem(1, Py::asObject(geosurf->getPyObject()));
+ tuple.setItem(2, Py::Float(first));
+ tuple.setItem(3, Py::Float(last));
+ return Py::new_reference_to(tuple);
+ }
+ catch (Standard_Failure& e) {
+ PyErr_SetString(PartExceptionOCCError, e.GetMessageString());
+ return 0;
+ }
+}
+
PyObject *TopoShapeEdgePy::getCustomAttributes(const char* /*attr*/) const
{
return 0;