diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 45f58df37..c8e980297 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -1245,6 +1245,7 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,name="Sketch"): nobj = addTo else: nobj = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject",name) + nobj.ViewObject.Autoconstraints = False for obj in objectslist: ok = False tp = getType(obj) @@ -1297,7 +1298,9 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,name="Sketch"): if fcgeo.hasOnlyWires(obj.Shape): for w in obj.Shape.Wires: for edge in fcgeo.sortEdges(w.Edges): - nobj.addGeometry(fcgeo.geom(edge)) + g = fcgeo.geom(edge) + if g: + nobj.addGeometry(g) if autoconstraints: last = nobj.GeometryCount segs = range(last-len(w.Edges),last-1) diff --git a/src/Mod/Draft/DraftSnap.py b/src/Mod/Draft/DraftSnap.py index 855e95110..14d409009 100644 --- a/src/Mod/Draft/DraftSnap.py +++ b/src/Mod/Draft/DraftSnap.py @@ -152,7 +152,7 @@ class Snapper: if self.extLine: self.extLine.off() - point = FreeCADGui.ActiveDocument.ActiveView.getPoint(screenpos[0],screenpos[1]) + point = self.getApparentPoint(screenpos[0],screenpos[1]) # check if we snapped to something info = FreeCADGui.ActiveDocument.ActiveView.getObjectInfo((screenpos[0],screenpos[1])) @@ -259,6 +259,12 @@ class Snapper: # return the final point return cstr(winner[2]) + + def getApparentPoint(self,x,y): + "returns a 3D point, projected on the current working plane" + pt = FreeCADGui.ActiveDocument.ActiveView.getPoint(x,y) + dv = FreeCADGui.ActiveDocument.ActiveView.getViewDirection() + return FreeCAD.DraftWorkingPlane.projectPoint(pt,dv) def snapToExtensions(self,point,last,constrain): "returns a point snapped to extension or parallel line to last object, if any" diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 8d2fabcc8..6e21bb347 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -3545,6 +3545,9 @@ class Draft2Sketch(): allDraft = False elif obj.isDerivedFrom("Part::Part2DObjectPython"): allSketches = False + else: + allDraft = False + allSketches = False if not sel: return elif allDraft: @@ -3559,9 +3562,12 @@ class Draft2Sketch(): FreeCAD.ActiveDocument.openTransaction("Convert") for obj in sel: if obj.isDerivedFrom("Sketcher::SketchObject"): - Draft.makeSketch(sel,autoconstraints=True) + Draft.draftify(obj) elif obj.isDerivedFrom("Part::Part2DObjectPython"): - Draft.draftify(sel,makeblock=True) + Draft.makeSketch(obj,autoconstraints=True) + elif obj.isDerivedFrom("Part::Feature"): + if len(obj.Shape.Wires) == 1: + Draft.makeSketch(obj,autoconstraints=False) FreeCAD.ActiveDocument.commitTransaction() diff --git a/src/Mod/Draft/draftlibs/fcgeo.py b/src/Mod/Draft/draftlibs/fcgeo.py index 2d1355260..0c5c95089 100755 --- a/src/Mod/Draft/draftlibs/fcgeo.py +++ b/src/Mod/Draft/draftlibs/fcgeo.py @@ -361,14 +361,17 @@ def geom(edge): return edge.Curve elif isinstance(edge.Curve,Part.Circle): if len(edge.Vertexes) == 1: - return edge.Curve + return Part.Circle(edge.Curve.Center,edge.Curve.Axis,edge.Curve.Radius) else: + ref = edge.Placement.multVec(Vector(1,0,0)) v1 = edge.Vertexes[0].Point v2 = edge.Vertexes[-1].Point c = edge.Curve.Center - a1 = -fcvec.angle(v1.sub(c)) - a2 = -fcvec.angle(v2.sub(c)) - return Part.ArcOfCircle(edge.Curve,a1,a2) + cu = Part.Circle(edge.Curve.Center,edge.Curve.Axis,edge.Curve.Radius) + a1 = -fcvec.angle(v1.sub(c),ref) + a2 = -fcvec.angle(v2.sub(c),ref) + p= Part.ArcOfCircle(cu,a1,a2) + return p else: return edge.Curve @@ -764,12 +767,20 @@ def connect(edges,closed=False): next = None if prev: # print "debug: fcgeo.connect prev : ",prev.Vertexes[0].Point,prev.Vertexes[-1].Point - v1 = findIntersection(curr,prev,True,True)[0] + i = findIntersection(curr,prev,True,True) + if i: + v1 = i[0] + else: + v1 = curr.Vertexes[0].Point else: v1 = curr.Vertexes[0].Point if next: # print "debug: fcgeo.connect next : ",next.Vertexes[0].Point,next.Vertexes[-1].Point - v2 = findIntersection(curr,next,True,True)[0] + i = findIntersection(curr,next,True,True) + if i: + v2 = i[0] + else: + v2 = curr.Vertexes[-1].Point else: v2 = curr.Vertexes[-1].Point if isinstance(curr.Curve,Part.Line): @@ -778,7 +789,10 @@ def connect(edges,closed=False): elif isinstance(curr.Curve,Part.Circle): if v1 != v2: nedges.append(Part.Arc(v1,findMidPoint(curr),v2)) - return Part.Wire(nedges) + try: + return Part.Wire(nedges) + except: + return None def findDistance(point,edge,strict=False): '''