From c05f7762f8fe0ffb1716bc5b19a2904febb1cef3 Mon Sep 17 00:00:00 2001 From: Sebastian Hoogen Date: Tue, 20 Jan 2015 17:59:04 +0100 Subject: [PATCH] import dxf splines as Draft BezCurve if applicable fixes 1743 --- src/Mod/Draft/importDXF.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Mod/Draft/importDXF.py b/src/Mod/Draft/importDXF.py index cc1c60214896..c1d9cd8f69d6 100644 --- a/src/Mod/Draft/importDXF.py +++ b/src/Mod/Draft/importDXF.py @@ -621,7 +621,7 @@ def drawSpline(spline,forceShape=False): non-parametric curve""" flags = rawValue(spline,70) closed = (flags & 1) != 0 - periodic = (flags & 2) != 0 + periodic = (flags & 2) != 0 and False # workaround rational = (flags & 4) != 0 planar = (flags & 8) != 0 linear = (flags & 16) != 0 @@ -694,11 +694,31 @@ def drawSpline(spline,forceShape=False): previousknot = knotvalue knotvector.append(knotvalue) multvector.append(mult) + # check if the multiplicities are valid innermults = multvector[:] if periodic else multvector[1:-1] - if any(m>degree for m in innermults): - #raise ValueError('Invalid multiplicities') - #warn('polygon fallback on %s' %spline) - return drawSplineIterpolation(controlpoints,closed=closed,\ + if any(m>degree for m in innermults): #invalid + if all(m == degree+1 for m in multvector): + if not forceShape and weights is None: + points=controlpoints[:] + del points[degree+1::degree+1] + return Draft.makeBezCurve(points,Degree=degree) + else: + poles=controlpoints[:] + edges=[] + while len(poles) >= degree+1: + #bezier segments + bzseg=Part.BezierCurve() + bzseg.increase(degree) + bzseg.setPoles(poles[0:degree+1]) + poles=poles[degree+1:] + if weights is not None: + bzseg.setWeights(weights[0:degree+1]) + weights=weights[degree+1:] + edges.append(bzseg.toShape()) + return Part.Wire(edges) + else: + warn('polygon fallback on %s' %spline) + return drawSplineIterpolation(controlpoints,closed=closed,\ forceShape=forceShape,alwaysDiscretize=True) try: bspline=Part.BSplineCurve()