From 9ea523a9e072b45d7b14620d0650287bd92ec50c Mon Sep 17 00:00:00 2001 From: tomate44 Date: Sat, 29 Dec 2018 19:43:52 +0100 Subject: [PATCH] fix intersectCC method missing some intersection points for Geom2d curves --- src/Mod/Part/App/Geom2d/Curve2dPyImp.cpp | 49 +++++++++++++++--------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/Mod/Part/App/Geom2d/Curve2dPyImp.cpp b/src/Mod/Part/App/Geom2d/Curve2dPyImp.cpp index 1555013c28..48a1c96f50 100644 --- a/src/Mod/Part/App/Geom2d/Curve2dPyImp.cpp +++ b/src/Mod/Part/App/Geom2d/Curve2dPyImp.cpp @@ -882,31 +882,42 @@ PyObject* Curve2dPy::intersectCC(PyObject *args) if (!PyArg_ParseTuple(args, "O!|d", &(Part::Curve2dPy::Type), &p, &prec)) return 0; Handle(Geom2d_Curve) curve2 = Handle(Geom2d_Curve)::DownCast(static_cast(p)->getGeometry2dPtr()->handle()); - Geom2dAPI_ExtremaCurveCurve intersector(curve1, curve2, - curve1->FirstParameter(), - curve1->LastParameter(), - curve2->FirstParameter(), - curve2->LastParameter()); - if (intersector.LowerDistance() > Precision::Confusion()) { - // No intersection - return Py::new_reference_to(Py::List()); - } - Py::List points; Py::Module module("__FreeCADBase__"); Py::Callable method(module.getAttr("Vector2d")); Py::Tuple arg(2); - for (int i = 1; i <= intersector.NbExtrema(); i++) { - if (intersector.Distance(i) > Precision::Confusion()) - continue; - gp_Pnt2d p1, p2; - intersector.Points(i, p1, p2); - - arg.setItem(0, Py::Float(p1.X())); - arg.setItem(1, Py::Float(p1.Y())); - points.append(method.apply(arg)); + Geom2dAPI_InterCurveCurve intersector(curve1, curve2, prec); + if ((intersector.NbPoints() == 0) && (intersector.NbSegments() == 0)) { + // No intersection + return Py::new_reference_to(Py::List()); } + if (intersector.NbPoints() > 0) { + // Cross intersections + for (int i = 1; i <= intersector.NbPoints(); i++) { + gp_Pnt2d p1 = intersector.Point(i); + arg.setItem(0, Py::Float(p1.X())); + arg.setItem(1, Py::Float(p1.Y())); + points.append(method.apply(arg)); + } + } + if (intersector.NbSegments() > 0) { + // Tangential intersections + Geom2dAPI_ExtremaCurveCurve intersector2(curve1, curve2, + curve1->FirstParameter(), + curve1->LastParameter(), + curve2->FirstParameter(), + curve2->LastParameter()); + for (int i = 1; i <= intersector2.NbExtrema(); i++) { + if (intersector2.Distance(i) > prec) + continue; + gp_Pnt2d p1, p2; + intersector2.Points(i, p1, p2); + arg.setItem(0, Py::Float(p1.X())); + arg.setItem(1, Py::Float(p1.Y())); + points.append(method.apply(arg)); + } + } return Py::new_reference_to(points); } }