From 3764181284663f8eb83ff45641407242330c9db8 Mon Sep 17 00:00:00 2001 From: yorikvanhavre Date: Thu, 13 Oct 2011 19:38:44 +0000 Subject: [PATCH] + added RFE #314 and #331 extending the Draft snap with perpendicular, parallel and extension snaps git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5013 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d --- src/Mod/Draft/draftTools.py | 52 ++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/src/Mod/Draft/draftTools.py b/src/Mod/Draft/draftTools.py index 9dbf5e0c41..cd91add78f 100755 --- a/src/Mod/Draft/draftTools.py +++ b/src/Mod/Draft/draftTools.py @@ -154,6 +154,13 @@ def snapPoint(target,point,cursor,ctrl=False): return target.grid.getClosestNode(point) return None + def getPerpendicular(edge,last): + "returns a point on an edge, perpendicular to the given point" + dv = last.sub(edge.Vertexes[0].Point) + nv = fcvec.project(dv,fcgeo.vec(edge)) + np = (edge.Vertexes[0].Point).add(nv) + return np + # checking if alwaySnap setting is on extractrl = False if Draft.getParam("alwaysSnap"): @@ -163,10 +170,41 @@ def snapPoint(target,point,cursor,ctrl=False): # setting Radius radius = getScreenDist(Draft.getParam("snapRange"),cursor) - snapped=target.view.getObjectInfo((cursor[0],cursor[1])) + # checking if parallel to one of the edges of the last objects + target.snap.off() + target.extsnap.off() + if (len(target.node) > 0): + for o in [lastObj[1],lastObj[0]]: + if o: + edges = target.doc.getObject(o).Shape.Edges + if len(edges)<10: + for e in edges: + if isinstance(e.Curve,Part.Line): + last = target.node[len(target.node)-1] + de = Part.Line(last,last.add(fcgeo.vec(e))).toShape() + np = getPerpendicular(e,point) + if (np.sub(point)).Length < radius: + target.snap.coords.point.setValue((np.x,np.y,np.z)) + target.snap.setMarker("circle") + target.snap.on() + target.extsnap.p1(e.Vertexes[0].Point) + target.extsnap.p2(np) + target.extsnap.on() + point = np + else: + last = target.node[len(target.node)-1] + de = Part.Line(last,last.add(fcgeo.vec(e))).toShape() + np = getPerpendicular(de,point) + if (np.sub(point)).Length < radius: + target.snap.coords.point.setValue((np.x,np.y,np.z)) + target.snap.setMarker("circle") + target.snap.on() + point = np # check if we snapped to something - if (snapped == None): + snapped=target.view.getObjectInfo((cursor[0],cursor[1])) + + if (snapped == None): gpt = getGridSnap(target,point) if gpt: if radius != 0: @@ -174,15 +212,13 @@ def snapPoint(target,point,cursor,ctrl=False): if dv.Length <= radius: target.snap.coords.point.setValue((gpt.x,gpt.y,gpt.z)) target.snap.setMarker("point") - target.snap.switch.whichChild = 0 + target.snap.on() return gpt - target.snap.switch.whichChild = -1 return point else: obj = target.doc.getObject(snapped['Object']) if hasattr(obj.ViewObject,"Selectable"): if not obj.ViewObject.Selectable: - target.snap.switch.whichChild = -1 return point if not ctrl: # are we in passive snap? @@ -209,6 +245,8 @@ def snapPoint(target,point,cursor,ctrl=False): if (len(target.node) > 0): last = target.node[len(target.node)-1] snapArray.extend(getConstrainedPoint(edge,last,target.constrain)) + np = getPerpendicular(edge,last) + snapArray.append([np,1,np]) elif isinstance (edge.Curve,Part.Circle): rad = edge.Curve.Radius @@ -272,7 +310,7 @@ def snapPoint(target,point,cursor,ctrl=False): target.snap.setMarker("square") else: target.snap.setMarker("circle") - target.snap.switch.whichChild = 0 + target.snap.on() return newpoint[2] def constrainPoint (target,pt,mobile=False,sym=False): @@ -1164,6 +1202,7 @@ class Creator: self.constrain = None self.obj = None self.snap = snapTracker() + self.extsnap = lineTracker(dotted=True) self.planetrack = PlaneTracker() if Draft.getParam("grid"): self.grid = gridTracker() @@ -2379,6 +2418,7 @@ class Modifier: self.ui.setTitle(name) self.featureName = name self.snap = snapTracker() + self.extsnap = lineTracker(dotted=True) self.planetrack = PlaneTracker() if Draft.getParam("grid"): self.grid = gridTracker()