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: