From de14265ba710ece1fd9c6ec4916acb2981334df4 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 14 Aug 2025 18:31:41 +0200 Subject: [PATCH] Part: Check for straight splines or Bezier curves Straight splines or Bezier curves can be considered as line segments and thus can be used to measure e.g. angles. This fixes https://github.com/FreeCAD/FreeCAD/issues/22878 --- src/Mod/Part/App/MeasureClient.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Mod/Part/App/MeasureClient.cpp b/src/Mod/Part/App/MeasureClient.cpp index 5d1a937496..42b53d40d8 100644 --- a/src/Mod/Part/App/MeasureClient.cpp +++ b/src/Mod/Part/App/MeasureClient.cpp @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include #include #include @@ -127,6 +129,13 @@ TopoDS_Shape getLocatedShape(const App::SubObjectT& subject, Base::Matrix4D* mat App::MeasureElementType PartMeasureTypeCb(App::DocumentObject* ob, const char* subName) { + auto isStraightBezierCurve = [](Handle(Geom_BezierCurve) curve) { + return curve->NbPoles() == 2; + }; + auto isStraightBSplineCurve = [](Handle(Geom_BSplineCurve) curve) { + return curve->NbPoles() == 2; + }; + TopoDS_Shape shape = Part::Feature::getShape(ob, Part::ShapeOption::NeedSubElement | Part::ShapeOption::ResolveLink @@ -153,10 +162,18 @@ App::MeasureElementType PartMeasureTypeCb(App::DocumentObject* ob, const char* s return ob->isDerivedFrom() ? App::MeasureElementType::LINE : App::MeasureElementType::LINESEGMENT; } - case GeomAbs_Circle: { return App::MeasureElementType::CIRCLE; } - case GeomAbs_BezierCurve: + case GeomAbs_Circle: { + return App::MeasureElementType::CIRCLE; + } + case GeomAbs_BezierCurve: { + return isStraightBezierCurve(curve.Bezier()) + ? App::MeasureElementType::LINESEGMENT + : App::MeasureElementType::CURVE; + } case GeomAbs_BSplineCurve: { - return App::MeasureElementType::CURVE; + return isStraightBSplineCurve(curve.BSpline()) + ? App::MeasureElementType::LINESEGMENT + : App::MeasureElementType::CURVE; } default: { return App::MeasureElementType::INVALID; } }