From 35ee3f03a7a9e00a887ab25f000147f6bef17c54 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 21 Feb 2018 12:53:48 -0300 Subject: [PATCH] Draft: Reducing memory leak in snapper - ussie #3340 --- src/Mod/Draft/DraftTools.py | 3 ++- src/Mod/Draft/DraftTrackers.py | 45 +++++++++++++++++++--------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 32881461ce..335cf393c3 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -127,11 +127,12 @@ def getPoint(target,args,mobile=False,sym=False,workingplane=True,noTracker=Fals amod = hasMod(args,MODSNAP) cmod = hasMod(args,MODCONSTRAIN) + point = None if hasattr(FreeCADGui,"Snapper"): point = FreeCADGui.Snapper.snap(args["Position"],lastpoint=last,active=amod,constrain=cmod,noTracker=noTracker) info = FreeCADGui.Snapper.snapInfo mask = FreeCADGui.Snapper.affinity - else: + if not point: p = FreeCADGui.ActiveDocument.ActiveView.getCursorPos() point = FreeCADGui.ActiveDocument.ActiveView.getPoint(p) info = FreeCADGui.ActiveDocument.ActiveView.getObjectInfo(p) diff --git a/src/Mod/Draft/DraftTrackers.py b/src/Mod/Draft/DraftTrackers.py index a140fcc748..bb793b2277 100644 --- a/src/Mod/Draft/DraftTrackers.py +++ b/src/Mod/Draft/DraftTrackers.py @@ -162,14 +162,16 @@ class lineTracker(Tracker): def p1(self,point=None): "sets or gets the first point of the line" if point: - self.coords.point.set1Value(0,point.x,point.y,point.z) + if self.coords.point.getValues()[0].getValue() != tuple(point): + self.coords.point.set1Value(0,point.x,point.y,point.z) else: return Vector(self.coords.point.getValues()[0].getValue()) def p2(self,point=None): "sets or gets the second point of the line" if point: - self.coords.point.set1Value(1,point.x,point.y,point.z) + if self.coords.point.getValues()[-1].getValue() != tuple(point): + self.coords.point.set1Value(1,point.x,point.y,point.z) else: return Vector(self.coords.point.getValues()[-1].getValue()) @@ -796,6 +798,7 @@ class gridTracker(Tracker): mat3.diffuseColor.setValue(col) self.coords3 = coin.SoCoordinate3() self.lines3 = coin.SoLineSet() + self.pts = [] s = coin.SoSeparator() s.addChild(pick) s.addChild(self.trans) @@ -832,24 +835,26 @@ class gridTracker(Tracker): else: pts.extend([[-bound,curr,z],[bound,curr,z]]) pts.extend([[curr,-bound,z],[curr,bound,z]]) - idx = [] - midx = [] - aidx = [] - for p in range(0,len(pts),2): - idx.append(2) - for mp in range(0,len(mpts),2): - midx.append(2) - for ap in range(0,len(apts),2): - aidx.append(2) - self.lines1.numVertices.deleteValues(0) - self.lines2.numVertices.deleteValues(0) - self.lines3.numVertices.deleteValues(0) - self.coords1.point.setValues(pts) - self.lines1.numVertices.setValues(idx) - self.coords2.point.setValues(mpts) - self.lines2.numVertices.setValues(midx) - self.coords3.point.setValues(apts) - self.lines3.numVertices.setValues(aidx) + if pts != self.pts: + idx = [] + midx = [] + aidx = [] + for p in range(0,len(pts),2): + idx.append(2) + for mp in range(0,len(mpts),2): + midx.append(2) + for ap in range(0,len(apts),2): + aidx.append(2) + self.lines1.numVertices.deleteValues(0) + self.lines2.numVertices.deleteValues(0) + self.lines3.numVertices.deleteValues(0) + self.coords1.point.setValues(pts) + self.lines1.numVertices.setValues(idx) + self.coords2.point.setValues(mpts) + self.lines2.numVertices.setValues(midx) + self.coords3.point.setValues(apts) + self.lines3.numVertices.setValues(aidx) + self.pts = pts def setSize(self,size): self.numlines = size