From a63e18f170a3edb32f830c443619cb00e727e63c Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sun, 16 Jun 2013 14:13:20 -0300 Subject: [PATCH] Arch: Added preliminary dimensions tracking to walls --- src/Mod/Draft/DraftSnap.py | 55 ++++++++++++++++++++++++++++++---- src/Mod/Draft/DraftTrackers.py | 48 +++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 5 deletions(-) diff --git a/src/Mod/Draft/DraftSnap.py b/src/Mod/Draft/DraftSnap.py index 792f1c8be..24d6cdb08 100644 --- a/src/Mod/Draft/DraftSnap.py +++ b/src/Mod/Draft/DraftSnap.py @@ -71,11 +71,15 @@ class Snapper: self.constrainLine = None self.trackLine = None self.radiusTracker = None + self.dim1 = None + self.dim2 = None self.snapInfo = None self.lastSnappedObject = None + self.lastArchPoint = None self.active = True self.forceGridOff = False - self.trackers = [[],[],[],[],[]] # view, grid, snap, extline, radius + # the trackers are stored in lists because there can be several views, each with its own set + self.trackers = [[],[],[],[],[],[],[]] # view, grid, snap, extline, radius, dim1, dim2 self.polarAngles = [90,45] @@ -85,9 +89,9 @@ class Snapper: 'parallel':'circle', 'grid':'circle', 'endpoint':'dot', - 'midpoint':'dot', + 'midpoint':'square', 'perpendicular':'dot', - 'angle':'dot', + 'angle':'square', 'center':'dot', 'ortho':'dot', 'intersection':'dot'} @@ -172,6 +176,10 @@ class Snapper: self.extLine.off() if self.trackLine: self.trackLine.off() + if self.dim1: + self.dim1.off() + if self.dim2: + self.dim2.off() point = self.getApparentPoint(screenpos[0],screenpos[1]) @@ -199,6 +207,9 @@ class Snapper: if self.trackLine and lastpoint and (not noTracker): self.trackLine.p2(fp) self.trackLine.on() + # set the arch point tracking + if self.lastArchPoint: + self.setArchDims(self.lastArchPoint,fp) return fp else: @@ -242,7 +253,7 @@ class Snapper: snaps.extend(self.snapToPerpendicular(edge,lastpoint)) snaps.extend(self.snapToIntersection(edge)) snaps.extend(self.snapToElines(edge,eline)) - + elif obj.isDerivedFrom("Part::Feature"): if (not self.maxEdges) or (len(obj.Edges) <= self.maxEdges): if "Edge" in comp: @@ -326,7 +337,16 @@ class Snapper: self.trackLine.on() # set the cursor self.setCursor(winner[1]) - + + # set the arch point tracking + if self.lastArchPoint: + self.setArchDims(self.lastArchPoint,fp) + if Draft.getType(obj) == "Wall": + if self.lastArchPoint != fp: + self.lastArchPoint = fp + else: + self.lastArchPoint = None + # return the final point return fp @@ -643,6 +663,21 @@ class Snapper: nv = DraftVecUtils.project(dv,DraftGeomUtils.vec(edge)) np = (edge.Vertexes[0].Point).add(nv) return np + + def setArchDims(self,p1,p2): + "show arch dimensions between 2 points" + if not self.dim1: + self.dim1 = DraftTrackers.archDimTracker(mode=2) + if not self.dim2: + self.dim1 = DraftTrackers.archDimTracker(mode=3) + self.dim1.p1(p1) + self.dim2.p1(p1) + self.dim1.p2(p2) + self.dim2.p2(p2) + if self.dim1.Distance: + self.dim1.on() + if self.dim2.Distance: + self.dim2.on() def setCursor(self,mode=None): "setCursor(self,mode=None): sets or resets the cursor to the given mode or resets" @@ -686,6 +721,10 @@ class Snapper: self.extLine.off() if self.radiusTracker: self.radiusTracker.off() + if self.dim1: + self.dim1.off() + if self.dim2: + self.dim2.off() if self.grid: if not Draft.getParam("alwaysShowGrid"): self.grid.off() @@ -958,6 +997,8 @@ class Snapper: self.tracker = self.trackers[2][i] self.extLine = self.trackers[3][i] self.radiusTracker = self.trackers[4][i] + self.dim1 = self.trackers[5][i] + self.dim2 = self.trackers[6][i] else: if Draft.getParam("grid"): self.grid = DraftTrackers.gridTracker() @@ -966,11 +1007,15 @@ class Snapper: self.tracker = DraftTrackers.snapTracker() self.extLine = DraftTrackers.lineTracker(dotted=True) self.radiusTracker = DraftTrackers.radiusTracker() + self.dim1 = DraftTrackers.archDimTracker(mode=2) + self.dim2 = DraftTrackers.archDimTracker(mode=3) self.trackers[0].append(v) self.trackers[1].append(self.grid) self.trackers[2].append(self.tracker) self.trackers[3].append(self.extLine) self.trackers[4].append(self.radiusTracker) + self.trackers[5].append(self.dim1) + self.trackers[6].append(self.dim2) if self.grid and (not self.forceGridOff): self.grid.set() diff --git a/src/Mod/Draft/DraftTrackers.py b/src/Mod/Draft/DraftTrackers.py index 570883c06..89b4d9935 100644 --- a/src/Mod/Draft/DraftTrackers.py +++ b/src/Mod/Draft/DraftTrackers.py @@ -784,3 +784,51 @@ class radiusTracker(Tracker): self.trans.translation.setValue([arg2.x,arg2.y,arg2.z]) else: self.sphere.radius.setValue(arg2) + +class archDimTracker(Tracker): + "A wrapper around a Sketcher dim" + def __init__(self,p1=FreeCAD.Vector(0,0,0),p2=FreeCAD.Vector(1,0,0),mode=1): + import SketcherGui + self.dimnode = coin.SoType.fromName("SoDatumLabel").createInstance() + p1node = coin.SbVec3f([p1.x,p1.y,p1.z]) + p2node = coin.SbVec3f([p2.x,p2.y,p2.z]) + self.dimnode.pnts.setValues([p1node,p2node]) + self.dimnode.lineWidth = 1 + color = FreeCADGui.draftToolBar.getDefaultColor("snap") + self.dimnode.textColor.setValue(coin.SbVec3f(color)) + self.setString() + self.setMode(mode) + Tracker.__init__(self,children=[self.dimnode]) + + def setString(self,text=None): + "sets the dim string to the given value or auto value" + self.dimnode.param1.setValue(.5) + p1 = Vector(self.dimnode.pnts.getValues()[0].getValue()) + p2 = Vector(self.dimnode.pnts.getValues()[-1].getValue()) + self.Distance = p2.sub(p1).Length + if not text: + text = Draft.getParam("dimPrecision") + text = "%."+str(text)+"f" + text = (text % self.Distance) + self.dimnode.string.setValue(text) + + def setMode(self,mode=1): + """sets the mode: 0 = without lines (a simple mark), 1 = + aligned (default), 2 = horizontal, 3 = vertical.""" + self.dimnode.datumtype.setValue(mode) + + def p1(self,point=None): + "sets or gets the first point of the dim" + if point: + self.dimnode.pnts.set1Value(0,point.x,point.y,point.z) + self.setString() + else: + return Vector(self.dimnode.pnts.getValues()[0].getValue()) + + def p2(self,point=None): + "sets or gets the second point of the dim" + if point: + self.dimnode.pnts.set1Value(1,point.x,point.y,point.z) + self.setString() + else: + return Vector(self.dimnode.pnts.getValues()[-1].getValue())