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.
This commit is contained in:
committed by
Yorik van Havre
parent
8602c887d8
commit
4e4218e01a
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user