Here is my version for a 3 guides + 3 profiles test (use the 3 curves of BeGrid)
but the metfods compute good models near the origin BePlan Nurbs.
EDIT: I have added the S3 component. So I get a really good approximation .
Code: Select all
def createGordon():
es=App.ActiveDocument.BeGrid.Shape.Edges
poles=[]
for e in es:
poles += [e.Curve.getPoles()]
polsu=np.array(poles[0:3])
polsv=np.array(poles[3:6])
# lagrange polynoms as blender
blender=[
lambda t: (t-1)*(t-2),
lambda t: (t-0)*(t-2),
lambda t: (t-0)*(t-1),
]
s3tt=np.zeros(7*7*3).reshape(7,7,3)
dd=0.4
for ui,u in enumerate([0,dd,1-dd,1,1+dd,2-dd,2]):
for vi,v in enumerate([0,dd,1-dd,1,1+dd,2-dd,2]):
# print (ui,vi,".................")
for i in range(3):
for j in range(3):
# print polsu[i][3*j],polsv[j][3*i]
s3tt[ui,vi] += polsu[i][3*j]*blender[i](u)/blender[i](i)*blender[j](v)/blender[j](j)
ag=Part.BSplineSurface()
ag.buildFromPolesMultsKnots(s3tt,
[4,3,4],[4,3,4],
[0,1,2],[0,1,2],
False,False,3,3)
name="gordonS3"
tt=App.ActiveDocument.getObject(name)
if tt==None:
tt=App.ActiveDocument.addObject('Part::Spline',name)
tt.Shape=ag.toShape()
ptsarr=[]
for u in [0,dd,1-dd,1,1+dd,2-dd,2]:
pts=np.zeros(7*3).reshape(1,7,3)
for i in range(3):
pts += [polsu[i]*blender[i](u)/blender[i](i)]
ptsa=[FreeCAD.Vector(p) for p in pts[0]]
ptsarr += [ptsa]
ag=Part.BSplineSurface()
ag.buildFromPolesMultsKnots(ptsarr,
[4,3,4],[4,3,4],
[0,1,2],[0,1,2],
False,False,3,3)
name="gordonU"
tt=App.ActiveDocument.getObject(name)
if tt==None:
tt=App.ActiveDocument.addObject('Part::Spline',name)
tt.Shape=ag.toShape()
ptsarr2=[]
for u in [0,dd,1-dd,1,1+dd,2-dd,2]:
pts=np.zeros(7*3).reshape(1,7,3)
for i in range(3):
pts += [polsv[i]*blender[i](u)/blender[i](i)]
ptsa=[FreeCAD.Vector(p) for p in pts[0]]
ptsarr2 += [ptsa]
ag=Part.BSplineSurface()
ag.buildFromPolesMultsKnots(ptsarr2,
[4,3,4],[4,3,4],
[0,1,2],[0,1,2],
False,False,3,3)
name="gordonV"
tt=App.ActiveDocument.getObject(name)
if tt==None:
tt=App.ActiveDocument.addObject('Part::Spline',name)
tt.Shape=ag.toShape()
ptsarr3=(np.array(ptsarr) +np.array(ptsarr2).swapaxes(0,1)-s3tt)
ag=Part.BSplineSurface()
ag.buildFromPolesMultsKnots(ptsarr3,
[4,3,4],[4,3,4],
[0,1,2],[0,1,2],
False,False,3,3)
name="gordon"
tt=App.ActiveDocument.getObject(name)
if tt==None:
tt=App.ActiveDocument.addObject('Part::Spline',name)
tt.Shape=ag.toShape()