From 8f2a3a4d7d51e37e8e1c2986cca934dfe5918bbb Mon Sep 17 00:00:00 2001 From: Yash Suthar Date: Mon, 2 Feb 2026 22:41:20 +0530 Subject: [PATCH] Draft : Added knots support for snapping (#26571) * Draft : Added knots support for snapping Signed-off-by: Yash Suthar * Use Special snap for knots and rename snapToBSpline to snapToBSplineKnots --------- Signed-off-by: Yash Suthar Co-authored-by: Roy-043 <70520633+Roy-043@users.noreply.github.com> --- src/Mod/Draft/draftguitools/gui_snapper.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Mod/Draft/draftguitools/gui_snapper.py b/src/Mod/Draft/draftguitools/gui_snapper.py index 2fe274e23a..201c1de519 100644 --- a/src/Mod/Draft/draftguitools/gui_snapper.py +++ b/src/Mod/Draft/draftguitools/gui_snapper.py @@ -413,6 +413,8 @@ class Snapper: elif et == "Ellipse": # extra ellipse options snaps.extend(self.snapToCenter(edge)) + elif et == "BSplineCurve": + snaps.extend(self.snapToBSplineKnots(edge)) elif "Face" in comp: # we are snapping to a face if shape.ShapeType == "Face": @@ -800,6 +802,17 @@ class Snapper: snaps.append([mp, "midpoint", self.toWP(mp)]) return snaps + def snapToBSplineKnots(self, edge): + """Return a list of knot snap locations for a BSpline.""" + snaps = [] + if self.isEnabled("Special"): + if hasattr(edge, "Curve") and isinstance(edge.Curve, Part.BSplineCurve): + knots = edge.Curve.getKnots() + for k in knots: + p = edge.Curve.value(k) + snaps.append([p, "special", self.toWP(p)]) + return snaps + def snapToNear(self, shape, point): """Return a list with a near snap location for an edge.""" if self.isEnabled("Near") and point: