From 4e4218e01a3fb0bdec27bcd02754232ec2d5efa3 Mon Sep 17 00:00:00 2001 From: carlopav <47068848+carlopav@users.noreply.github.com> Date: Sun, 7 Apr 2019 20:26:28 +0200 Subject: [PATCH] Update DraftTrackers.py Upate bezier curve tracker to accept a given degree of the curve and to be able to segment the preview in a similar way the curve creator work. --- src/Mod/Draft/DraftTrackers.py | 114 ++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 50 deletions(-) diff --git a/src/Mod/Draft/DraftTrackers.py b/src/Mod/Draft/DraftTrackers.py index de35e01595..7ead768f72 100644 --- a/src/Mod/Draft/DraftTrackers.py +++ b/src/Mod/Draft/DraftTrackers.py @@ -379,70 +379,84 @@ class bezcurveTracker(Tracker): def __init__(self,dotted=False,scolor=None,swidth=None,points = []): self.bezcurve = None self.points = points + self.degree = None self.trans = coin.SoTransform() self.sep = coin.SoSeparator() self.recompute() Tracker.__init__(self,dotted,scolor,swidth,[self.trans,self.sep],name="bezcurveTracker") - def update(self, points): + def update(self, points, degree=None): self.points = points + if degree: + self.degree = degree self.recompute() def recompute(self): + + if self.bezcurve: + for seg in self.bezcurve: + self.sep.removeChild(seg) + seg = None + + self.bezcurve = [] + if (len(self.points) >= 2): - if self.bezcurve: self.sep.removeChild(self.bezcurve) - self.bezcurve = None -### c = Part.BSplineCurve() #!!!!!!!!!!!!!!! - c = Part.BezierCurve() - # DNC: allows to close the curve by placing ends close to each other - if ( len(self.points) >= 3 ) and ( (self.points[0] - self.points[-1]).Length < Draft.tolerance() ): - # YVH: Added a try to bypass some hazardous situations - try: -### c.interpolate(self.points[:-1], True) #!!!!!!!!!!!! - c.setPoles(self.points[:-1]) - except Part.OCCError: - pass - elif self.points: - try: -### c.interpolate(self.points, False) #!!!!!!! - c.setPoles(self.points) - except Part.OCCError: - pass - c = c.toShape() #???? c = Part.Edge(c)?, c = Part.Wire(c)?? - buf=c.writeInventor(2,0.01) + + if self.degree: + + poles=self.points[1:] + + segpoleslst = [poles[x:x+self.degree] for x in range(0, len(poles), (self.degree or 1))] + else: + segpoleslst = [self.points] + + startpoint=self.points[0] + + + for segpoles in segpoleslst: + c = Part.BezierCurve() #last segment may have lower degree + c.increase(len(segpoles)) + c.setPoles([startpoint]+segpoles) + c = c.toShape() + startpoint = segpoles[-1] + + buf=c.writeInventor(2,0.01) #fp=open("spline.iv","w") #fp.write(buf) #fp.close() - try: - ivin = coin.SoInput() - ivin.setBuffer(buf) - ivob = coin.SoDB.readAll(ivin) - except: - # workaround for pivy SoInput.setBuffer() bug - import re - 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.bezcurve = coin.SoSeparator() - self.bezcurve.addChild(coords) - self.bezcurve.addChild(line) - self.sep.addChild(self.bezcurve) - else: - if ivob and ivob.getNumChildren() > 1: - self.bezcurve = ivob.getChild(1).getChild(0) - self.bezcurve.removeChild(self.bezcurve.getChild(0)) - self.bezcurve.removeChild(self.bezcurve.getChild(0)) - self.sep.addChild(self.bezcurve) + try: + ivin = coin.SoInput() + ivin.setBuffer(buf) + ivob = coin.SoDB.readAll(ivin) + except: + # workaround for pivy SoInput.setBuffer() bug + import re + 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) + bezcurveseg = coin.SoSeparator() + bezcurveseg.addChild(coords) + bezcurveseg.addChild(line) + self.sep.addChild(bezcurveseg) else: - FreeCAD.Console.PrintWarning("bezcurveTracker.recompute() failed to read-in Inventor string\n") + if ivob and ivob.getNumChildren() > 1: + bezcurveseg = ivob.getChild(1).getChild(0) + bezcurveseg.removeChild(bezcurveseg.getChild(0)) + bezcurveseg.removeChild(bezcurveseg.getChild(0)) + self.sep.addChild(bezcurveseg) + else: + FreeCAD.Console.PrintWarning("bezcurveTracker.recompute() failed to read-in Inventor string\n") + self.bezcurve.append(bezcurveseg) + + ####################################### class arcTracker(Tracker): "An arc tracker"