From 21c4fa316ee74744db396e72ee8159999292b933 Mon Sep 17 00:00:00 2001 From: tomate44 Date: Mon, 30 Oct 2017 17:30:44 +0100 Subject: [PATCH 1/2] add ArcOfEllipse to DraftGeomUtils.orientEdge --- src/Mod/Draft/DraftGeomUtils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Mod/Draft/DraftGeomUtils.py b/src/Mod/Draft/DraftGeomUtils.py index f6531fc4d158b..03b2a81d0edec 100755 --- a/src/Mod/Draft/DraftGeomUtils.py +++ b/src/Mod/Draft/DraftGeomUtils.py @@ -570,6 +570,9 @@ def orientEdge(edge, normal=None, make_arc=False): elif make_arc and isinstance(edge.Curve,Part.Circle) and not edge.Closed: return Part.ArcOfCircle(edge.Curve, edge.FirstParameter, edge.LastParameter,edge.Curve.Axis.z>0) + elif make_arc and isinstance(edge.Curve,Part.Ellipse) and not edge.Closed: + return Part.ArcOfEllipse(edge.Curve, edge.FirstParameter, + edge.LastParameter,edge.Curve.Axis.z>0) return edge.Curve def mirror (point, edge): From 5657acdfb6e7db67936121ade53af4c496dbefa2 Mon Sep 17 00:00:00 2001 From: tomate44 Date: Mon, 30 Oct 2017 18:13:32 +0100 Subject: [PATCH 2/2] fix BSpline curves treatment in Draft.makeSketch. BSplineCurves in a wire were doubled. Don't expose internal geometries of BSplineCurves of a wire to keep sketch lighter. --- src/Mod/Draft/Draft.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 0ea9648377716..c6cdcf4a786c9 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -2676,6 +2676,12 @@ def addRadiusConstraint(edge): except AttributeError: pass + def convertBezier(edge): + if DraftGeomUtils.geomType(edge) == "BezierCurve": + return(edge.Curve.toBSpline(edge.FirstParameter,edge.LastParameter).toShape()) + else: + return(edge) + rotation = None for obj in objectslist: ok = False @@ -2779,17 +2785,13 @@ def addRadiusConstraint(edge): FreeCAD.Console.PrintWarning(translate("draft","Unable to guess the normal direction of this object")) rotation = FreeCAD.Rotation() norm = obj.Placement.Rotation.Axis - for e in shape.Edges: - if DraftGeomUtils.geomType(e) in ["BSplineCurve","BezierCurve"]: - if DraftGeomUtils.geomType(e) == "BezierCurve": - bsp = e.Curve.toBSpline(e.Curve.FirstParameter,e.Curve.LastParameter) - else: - bsp = e.Curve - nobj.addGeometry(bsp) - nobj.exposeInternalGeometry(nobj.GeometryCount-1) - ok = True - #FreeCAD.Console.PrintError(translate("draft","BSplines and Bezier curves are not supported by this tool")) - #return None + if not shape.Wires: + for e in shape.Edges: + # unconnected edges + newedge = convertBezier(e) + nobj.addGeometry(DraftGeomUtils.orientEdge(newedge,norm,make_arc=True)) + addRadiusConstraint(newedge) + # if not addTo: # nobj.Placement.Rotation = DraftGeomUtils.calculatePlacement(shape).Rotation @@ -2798,9 +2800,10 @@ def addRadiusConstraint(edge): last_count = nobj.GeometryCount edges = wire.OrderedEdges for edge in edges: + newedge = convertBezier(edge) nobj.addGeometry(DraftGeomUtils.orientEdge( - edge,norm,make_arc=True)) - addRadiusConstraint(edge) + newedge,norm,make_arc=True)) + addRadiusConstraint(newedge) for i,g in enumerate(nobj.Geometry[last_count:]): if edges[i].Closed: continue @@ -2840,8 +2843,9 @@ def addRadiusConstraint(edge): else: for wire in shape.Wires: for edge in wire.OrderedEdges: + newedge = convertBezier(edge) nobj.addGeometry(DraftGeomUtils.orientEdge( - edge,norm,make_arc=True)) + newedge,norm,make_arc=True)) ok = True formatObject(nobj,obj) if ok and delete and obj.isDerivedFrom("Part::Feature"):