Arch: Added preliminary dimensions tracking to walls
This commit is contained in:
parent
d14d5cb2e4
commit
a63e18f170
|
@ -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()
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue
Block a user