From 63aa77307820fbc1cbc9f74bf8c809116f356bdb Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 2 Dec 2016 11:06:31 -0200 Subject: [PATCH] Draft: fixes related to LineSegment + more powerful draft2sketch conversion --- src/Mod/Draft/Draft.py | 30 ++++++++++++++++++++++++++++-- src/Mod/Draft/DraftGeomUtils.py | 4 +++- src/Mod/Draft/DraftTools.py | 4 ++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 0377ddb6e..1a13235c0 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -2595,8 +2595,34 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S return None # if not addTo: # nobj.Placement.Rotation = DraftGeomUtils.calculatePlacement(obj.Shape).Rotation - for edge in obj.Shape.Edges: - nobj.addGeometry(DraftGeomUtils.orientEdge(edge)) + if autoconstraints: + start = 0 + end = 0 + for wire in obj.Shape.Wires: + for edge in wire.OrderedEdges: + nobj.addGeometry(DraftGeomUtils.orientEdge(edge)) + end += 1 + segs = list(range(start,end)) + for seg in segs: + if seg == nobj.GeometryCount-1: + if wire.isClosed: + if nobj.Geometry[seg].EndPoint == nobj.Geometry[start].StartPoint: + nobj.addConstraint(Constraint("Coincident",seg,EndPoint,start,StartPoint)) + else: + nobj.addConstraint(Constraint("Coincident",seg,StartPoint,start,EndPoint)) + else: + if nobj.Geometry[seg].EndPoint == nobj.Geometry[seg+1].StartPoint: + nobj.addConstraint(Constraint("Coincident",seg,EndPoint,seg+1,StartPoint)) + else: + nobj.addConstraint(Constraint("Coincident",seg,StartPoint,seg+1,EndPoint)) + if DraftGeomUtils.isAligned(nobj.Geometry[seg],"x"): + nobj.addConstraint(Constraint("Vertical",seg)) + elif DraftGeomUtils.isAligned(nobj.Geometry[seg],"y"): + nobj.addConstraint(Constraint("Horizontal",seg)) + start = end + else: + for edge in obj.Shape.Edges: + nobj.addGeometry(DraftGeomUtils.orientEdge(edge)) ok = True formatObject(nobj,obj) if ok and delete: diff --git a/src/Mod/Draft/DraftGeomUtils.py b/src/Mod/Draft/DraftGeomUtils.py index f5cb2f7f8..a45576264 100755 --- a/src/Mod/Draft/DraftGeomUtils.py +++ b/src/Mod/Draft/DraftGeomUtils.py @@ -188,7 +188,7 @@ def hasOnlyWires(shape): def geomType(edge): "returns the type of geom this edge is based on" try: - if isinstance(edge.Curve,Part.LineSegment): + if (isinstance(edge.Curve,Part.LineSegment) or isinstance(edge.Curve,Part.Line)): return "Line" elif isinstance(edge.Curve,Part.Circle): return "Circle" @@ -549,6 +549,8 @@ def orientEdge(edge, normal=None): angle = -1*edge.Placement.Rotation.Angle*FreeCAD.Units.Radian edge.rotate(base, axis, angle) + if isinstance(edge.Curve,Part.Line): + return Part.LineSegment(edge.Curve,edge.FirstParameter,edge.LastParameter) return edge.Curve def mirror (point, edge): diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 455fec2a4..0862239cb 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -4199,8 +4199,8 @@ class Draft2Sketch(Modifier): elif obj.isDerivedFrom("Part::Part2DObjectPython"): lines.append("Draft.makeSketch(FreeCAD.ActiveDocument."+obj.Name+",autoconstraints=True)") elif obj.isDerivedFrom("Part::Feature"): - if (len(obj.Shape.Wires) == 1) or (len(obj.Shape.Edges) == 1): - lines.append("Draft.makeSketch(FreeCAD.ActiveDocument."+obj.Name+",autoconstraints=False)") + #if (len(obj.Shape.Wires) == 1) or (len(obj.Shape.Edges) == 1): + lines.append("Draft.makeSketch(FreeCAD.ActiveDocument."+obj.Name+",autoconstraints=True)") self.commit(translate("draft","Convert"), lines + ['FreeCAD.ActiveDocument.recompute()']) self.finish()