From 0638b524ec7b38cba779af7ffd241f88b5d7eba5 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Mon, 21 Oct 2013 11:32:36 -0200 Subject: [PATCH] Draft: workaround for pivy SoInput.setBuffer bug --- src/Mod/Draft/DraftTrackers.py | 64 +++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/src/Mod/Draft/DraftTrackers.py b/src/Mod/Draft/DraftTrackers.py index c1d71f71b..47abce88a 100644 --- a/src/Mod/Draft/DraftTrackers.py +++ b/src/Mod/Draft/DraftTrackers.py @@ -315,17 +315,20 @@ class bsplineTracker(Tracker): #fp=open("spline.iv","w") #fp.write(buf) #fp.close() - ivin = coin.SoInput() - ivin.setBuffer(buf) - ivob = coin.SoDB.readAll(ivin) - # In case reading from buffer failed - if ivob and ivob.getNumChildren() > 1: - self.bspline = ivob.getChild(1).getChild(0) - self.bspline.removeChild(self.bspline.getChild(0)) - self.bspline.removeChild(self.bspline.getChild(0)) - self.sep.addChild(self.bspline) + try: + ivin = coin.SoInput() + ivin.setBuffer(buf) + ivob = coin.SoDB.readAll(ivin) + except: + print "Error retrieving coin node" else: - FreeCAD.Console.PrintWarning("bsplineTracker.recompute() failed to read-in Inventor string\n") + if ivob and ivob.getNumChildren() > 1: + self.bspline = ivob.getChild(1).getChild(0) + self.bspline.removeChild(self.bspline.getChild(0)) + self.bspline.removeChild(self.bspline.getChild(0)) + self.sep.addChild(self.bspline) + else: + FreeCAD.Console.PrintWarning("bsplineTracker.recompute() failed to read-in Inventor string\n") class arcTracker(Tracker): "An arc tracker" @@ -388,7 +391,7 @@ class arcTracker(Tracker): self.recompute() def recompute(self): - import Part + import Part,re if self.circle: self.sep.removeChild(self.circle) self.circle = None if self.endangle < self.startangle: @@ -396,17 +399,36 @@ class arcTracker(Tracker): else: c = Part.makeCircle(1,Vector(0,0,0),FreeCAD.DraftWorkingPlane.axis,self.startangle,self.endangle) buf=c.writeInventor(2,0.01) - ivin = coin.SoInput() - ivin.setBuffer(buf) - ivob = coin.SoDB.readAll(ivin) - # In case reading from buffer failed - if ivob and ivob.getNumChildren() > 1: - self.circle = ivob.getChild(1).getChild(0) - self.circle.removeChild(self.circle.getChild(0)) - self.circle.removeChild(self.circle.getChild(0)) + try: + ivin = coin.SoInput() + ivin.setBuffer(buf) + ivob = coin.SoDB.readAll(ivin) + except: + # workaround for pivy SoInput.setBuffer() bug + buf = buf.replace("\n","") + pts = re.findall("point \[(.*?)\]",buf)[0] + pts = pts.split(",") + pc = [] + for p in pts: + v = p.strip().split() + pc.append([float(v[0]),float(v[1]),float(v[2])]) + coords = coin.SoCoordinate3() + coords.point.setValues(0,len(pc),pc) + line = coin.SoLineSet() + line.numVertices.setValue(-1) + self.circle = coin.SoSeparator() + self.circle.addChild(coords) + self.circle.addChild(line) self.sep.addChild(self.circle) else: - FreeCAD.Console.PrintWarning("arcTracker.recompute() failed to read-in Inventor string\n") + if ivob and ivob.getNumChildren() > 1: + self.circle = ivob.getChild(1).getChild(0) + self.circle.removeChild(self.circle.getChild(0)) + self.circle.removeChild(self.circle.getChild(0)) + self.sep.addChild(self.circle) + else: + FreeCAD.Console.PrintWarning("arcTracker.recompute() failed to read-in Inventor string\n") + class ghostTracker(Tracker): '''A Ghost tracker, that allows to copy whole object representations. @@ -478,7 +500,7 @@ class ghostTracker(Tracker): sep.addChild(coinobj.getChildren()[1]) # sep.addChild(coinobj) except: - pass + print "Error retrieving coin node" return sep class editTracker(Tracker):