Does anyone have an example on how to use BezierSurface.CreateLoftedBezier? Here is my attempt:
Python code
from __future__ import absolute_import, print_function, unicode_literals
import Rhino
import Rhino.Geometry as rg
import rhinoscriptsyntax as rs
import scriptcontext as sc
import random
def epsilonEquals(ptA, ptB, epsilon=Rhino.RhinoMath.ZeroTolerance):
if not Rhino.RhinoMath.EpsilonEquals(ptA.X, ptB.X, epsilon):
return False
if not Rhino.RhinoMath.EpsilonEquals(ptA.Y, ptB.Y, epsilon):
return False
try:
return Rhino.RhinoMath.EpsilonEquals(ptA.Z, ptB.Z, epsilon)
except:
return True
def evalBezierCrv(bc):
sEval="bc.Dimension"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bc.IsRational"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bc.IsValid"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bc.ControlVertexCount"; print("{}: {}".format(sEval, eval(sEval)))
print("\nGetControlVertex2d, 3d, 4d")
for i in range(bc.ControlVertexCount):
pt2d = bc.GetControlVertex2d(i)
pt3d = bc.GetControlVertex3d(i)
pt4d = bc.GetControlVertex4d(i)
print("iV[{}]".format(i))
print("2D:{}".format(pt2d))
print(
"3D:{}".format(pt3d),
"" if epsilonEquals(pt2d, pt3d) else "<---")
print(
"4D:{}".format(pt4d),
"" if epsilonEquals(pt4d, pt3d) else "<---")
def main():
degree = rs.GetInteger(
"Degree",
number=5,
minimum=1,
maximum=11)
if not degree: return
bcs = []
for i in range(degree+1):
pts = Rhino.Collections.Point3dList()
for j in range(degree+1):
pts.Add(
float(i) + 0.2*(random.random()-0.5),
float(j) + 0.2*(random.random()-0.5),
0.2*(random.random()-0.5))
bc = rg.BezierCurve.CreateLoftedBezier(pts)
sc.doc.Objects.AddCurve(bc.ToNurbsCurve())
bcs.append(bc)
bs = rg.BezierSurface.CreateLoftedBezier(curves=bcs)
if not bs.IsValid:
print("BezierSurface is not valid.")
return
sEval="bs.Dimension"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bs.IsRational"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bs.IsValid"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bs.ControlVertexCount(0)"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bs.ControlVertexCount(1)"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bs.Domain(0)"; print("{}: {}".format(sEval, eval(sEval)))
sEval="bs.Domain(1)"; print("{}: {}".format(sEval, eval(sEval)))
print("\nGetControlVertex2d, 3d, 4d")
for i in range(bs.ControlVertexCount(0)):
for j in range(bs.ControlVertexCount(1)):
pt2d = bs.GetControlVertex2d(i,j)
pt3d = bs.GetControlVertex3d(i,j)
pt4d = bs.GetControlVertex4d(i,j)
print("i[{}],j[{}]".format(i,j))
print("2D:{}".format(pt2d))
print(
"3D:{}".format(pt3d),
"" if epsilonEquals(pt2d, pt3d) else "<---")
print(
"4D:{}".format(pt4d),
"" if epsilonEquals(pt4d, pt3d) else "<---")
ns = bs.ToNurbsSurface()
if not ns.IsValid:
print("NurbsSurface is not valid.")
return
# Fix last CP.
#ns.Points.SetControlPoint(i,j,nc_from_bc.Points[nc_from_bc.Points.Count-1])
sc.doc.Objects.AddSurface(ns)
sc.doc.Views.Redraw()
if __name__ == '__main__': main()
Thanks