Arch: Added preliminary dimensions tracking to walls

This commit is contained in:
Yorik van Havre 2013-06-16 14:13:20 -03:00
parent d14d5cb2e4
commit a63e18f170
2 changed files with 98 additions and 5 deletions

View File

@ -71,11 +71,15 @@ class Snapper:
self.constrainLine = None self.constrainLine = None
self.trackLine = None self.trackLine = None
self.radiusTracker = None self.radiusTracker = None
self.dim1 = None
self.dim2 = None
self.snapInfo = None self.snapInfo = None
self.lastSnappedObject = None self.lastSnappedObject = None
self.lastArchPoint = None
self.active = True self.active = True
self.forceGridOff = False 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] self.polarAngles = [90,45]
@ -85,9 +89,9 @@ class Snapper:
'parallel':'circle', 'parallel':'circle',
'grid':'circle', 'grid':'circle',
'endpoint':'dot', 'endpoint':'dot',
'midpoint':'dot', 'midpoint':'square',
'perpendicular':'dot', 'perpendicular':'dot',
'angle':'dot', 'angle':'square',
'center':'dot', 'center':'dot',
'ortho':'dot', 'ortho':'dot',
'intersection':'dot'} 'intersection':'dot'}
@ -172,6 +176,10 @@ class Snapper:
self.extLine.off() self.extLine.off()
if self.trackLine: if self.trackLine:
self.trackLine.off() self.trackLine.off()
if self.dim1:
self.dim1.off()
if self.dim2:
self.dim2.off()
point = self.getApparentPoint(screenpos[0],screenpos[1]) point = self.getApparentPoint(screenpos[0],screenpos[1])
@ -199,6 +207,9 @@ class Snapper:
if self.trackLine and lastpoint and (not noTracker): if self.trackLine and lastpoint and (not noTracker):
self.trackLine.p2(fp) self.trackLine.p2(fp)
self.trackLine.on() self.trackLine.on()
# set the arch point tracking
if self.lastArchPoint:
self.setArchDims(self.lastArchPoint,fp)
return fp return fp
else: else:
@ -242,7 +253,7 @@ class Snapper:
snaps.extend(self.snapToPerpendicular(edge,lastpoint)) snaps.extend(self.snapToPerpendicular(edge,lastpoint))
snaps.extend(self.snapToIntersection(edge)) snaps.extend(self.snapToIntersection(edge))
snaps.extend(self.snapToElines(edge,eline)) snaps.extend(self.snapToElines(edge,eline))
elif obj.isDerivedFrom("Part::Feature"): elif obj.isDerivedFrom("Part::Feature"):
if (not self.maxEdges) or (len(obj.Edges) <= self.maxEdges): if (not self.maxEdges) or (len(obj.Edges) <= self.maxEdges):
if "Edge" in comp: if "Edge" in comp:
@ -326,7 +337,16 @@ class Snapper:
self.trackLine.on() self.trackLine.on()
# set the cursor # set the cursor
self.setCursor(winner[1]) 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 the final point
return fp return fp
@ -643,6 +663,21 @@ class Snapper:
nv = DraftVecUtils.project(dv,DraftGeomUtils.vec(edge)) nv = DraftVecUtils.project(dv,DraftGeomUtils.vec(edge))
np = (edge.Vertexes[0].Point).add(nv) np = (edge.Vertexes[0].Point).add(nv)
return np 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): def setCursor(self,mode=None):
"setCursor(self,mode=None): sets or resets the cursor to the given mode or resets" "setCursor(self,mode=None): sets or resets the cursor to the given mode or resets"
@ -686,6 +721,10 @@ class Snapper:
self.extLine.off() self.extLine.off()
if self.radiusTracker: if self.radiusTracker:
self.radiusTracker.off() self.radiusTracker.off()
if self.dim1:
self.dim1.off()
if self.dim2:
self.dim2.off()
if self.grid: if self.grid:
if not Draft.getParam("alwaysShowGrid"): if not Draft.getParam("alwaysShowGrid"):
self.grid.off() self.grid.off()
@ -958,6 +997,8 @@ class Snapper:
self.tracker = self.trackers[2][i] self.tracker = self.trackers[2][i]
self.extLine = self.trackers[3][i] self.extLine = self.trackers[3][i]
self.radiusTracker = self.trackers[4][i] self.radiusTracker = self.trackers[4][i]
self.dim1 = self.trackers[5][i]
self.dim2 = self.trackers[6][i]
else: else:
if Draft.getParam("grid"): if Draft.getParam("grid"):
self.grid = DraftTrackers.gridTracker() self.grid = DraftTrackers.gridTracker()
@ -966,11 +1007,15 @@ class Snapper:
self.tracker = DraftTrackers.snapTracker() self.tracker = DraftTrackers.snapTracker()
self.extLine = DraftTrackers.lineTracker(dotted=True) self.extLine = DraftTrackers.lineTracker(dotted=True)
self.radiusTracker = DraftTrackers.radiusTracker() self.radiusTracker = DraftTrackers.radiusTracker()
self.dim1 = DraftTrackers.archDimTracker(mode=2)
self.dim2 = DraftTrackers.archDimTracker(mode=3)
self.trackers[0].append(v) self.trackers[0].append(v)
self.trackers[1].append(self.grid) self.trackers[1].append(self.grid)
self.trackers[2].append(self.tracker) self.trackers[2].append(self.tracker)
self.trackers[3].append(self.extLine) self.trackers[3].append(self.extLine)
self.trackers[4].append(self.radiusTracker) 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): if self.grid and (not self.forceGridOff):
self.grid.set() self.grid.set()

View File

@ -784,3 +784,51 @@ class radiusTracker(Tracker):
self.trans.translation.setValue([arg2.x,arg2.y,arg2.z]) self.trans.translation.setValue([arg2.x,arg2.y,arg2.z])
else: else:
self.sphere.radius.setValue(arg2) 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())