diff --git a/src/Mod/Draft/DraftGeomUtils.py b/src/Mod/Draft/DraftGeomUtils.py index cd6c9c1b68..6c2cd6ed2b 100644 --- a/src/Mod/Draft/DraftGeomUtils.py +++ b/src/Mod/Draft/DraftGeomUtils.py @@ -1178,6 +1178,17 @@ def isReallyClosed(wire): if DraftVecUtils.equals(v1,v2): return True return False +def getSplineNormal(edge): + """Find the normal of a BSpline edge""" + startPoint = edge.valueAt(edge.FirstParameter) + endPoint = edge.valueAt(edge.LastParameter) + midParameter = edge.FirstParameter + (edge.LastParameter - edge.FirstParameter)/2 + midPoint = edge.valueAt(midParameter) + v1 = midPoint - startPoint + v2 = midPoint - endPoint + n = v1.cross(v2) + n.normalize() + return n def getNormal(shape): """Find the normal of a shape, if possible.""" @@ -1189,11 +1200,18 @@ def getNormal(shape): elif shape.ShapeType == "Edge": if geomType(shape.Edges[0]) in ["Circle","Ellipse"]: n = shape.Edges[0].Curve.Axis + elif geomType(edge) == "BSplineCurve" or \ + geomType(edge) == "BezierCurve": + n = getSplineNormal(edge) else: for e in shape.Edges: if geomType(e) in ["Circle","Ellipse"]: n = e.Curve.Axis break + elif geomType(e) == "BSplineCurve" or \ + geomType(e) == "BezierCurve": + n = getSplineNormal(e) + break e1 = vec(shape.Edges[0]) for i in range(1,len(shape.Edges)): e2 = vec(shape.Edges[i])