Rhino python scripting help for NURBS modeling

I wish to draw a NURBS curve of degree 7 and with 8 control points. I’ve written the following code but this is not working somehow .Could anyone please help me out with this.Thanks.

import Rhino
import scriptcontext
def TestNurbsCurve():
degree = 7
cv_count = 8
knot_count = cv_count + degree - 1
order = degree + 1
cvs = []
cvs.append(Rhino.Geometry.Point3d(0.0, 0.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 0.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 229.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 458.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(0.0, 458.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 686.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(0.0, 915.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 915.0, 0.0))
knots = []
knots.append(0.0)
knots.append(0.0)
knots.append(0.0)
knots.append(1.0)
knots.append(2.0)
knots.append(3.0)
knots.append(3.0)
knots.append(3.0)
knots.append(5.0)
knots.append(5.0)
knots.append(5.0)
knots.append(6.0)
knots.append(6.0)
knots.append(6.0)
curve = Rhino.Geometry.NurbsCurve(degree, False, order, cv_count)
for i in xrange(cv_count):
curve.Points.SetPoint(i, cvs[i])
for i in xrange(knot_count):
curve.Knots[i] = knots[i]
if curve.IsValid:
scriptcontext.doc.Objects.AddCurve(curve)
scriptcontext.doc.Views.Redraw()
TestNurbsCurve()

Hi Sachin
Try this code:

import Rhino import scriptcontext def TestNurbsCurve(): degree = 7 cv_count = 8 knot_count = cv_count + degree - 1 order = degree + 1 cvs = [] cvs.append(Rhino.Geometry.Point3d(0.0, 0.0, 0.0)) cvs.append(Rhino.Geometry.Point3d(458.0, 0.0, 0.0)) cvs.append(Rhino.Geometry.Point3d(458.0, 229.0, 0.0)) cvs.append(Rhino.Geometry.Point3d(458.0, 458.0, 0.0)) cvs.append(Rhino.Geometry.Point3d(0.0, 458.0, 0.0)) cvs.append(Rhino.Geometry.Point3d(458.0, 686.0, 0.0)) cvs.append(Rhino.Geometry.Point3d(0.0, 915.0, 0.0)) cvs.append(Rhino.Geometry.Point3d(458.0, 915.0, 0.0)) knots = [] knots.append(0) knots.append(0) knots.append(0) knots.append(0) knots.append(0) knots.append(0) knots.append(0) knots.append(1) knots.append(1) knots.append(1) knots.append(1) knots.append(1) knots.append(1) knots.append(1) curve = Rhino.Geometry.NurbsCurve(degree,False, order, cv_count) for i in xrange(cv_count): cp = Rhino.Geometry.ControlPoint() cp.Location = cvs[i] cp.Weight = 1 curve.Points[i] = cp for i in xrange(knot_count): curve.Knots[i] = knots[i] if curve.IsValid: scriptcontext.doc.Objects.AddCurve(curve) scriptcontext.doc.Views.Redraw() TestNurbsCurve()

1 Like

Thanks mate!Yeah ,that worked. Also ,I had to make 80 such NURBS curves with different combination of weight values of the control points,based on a certain design of experiment technique.So, I wished if we can use a loop to automate the process,by reading the weight values from the excel sheet(using XLRD library) and making the curve and saving each of them separately at run time.Could you please guide me regarding the same too?.I was doubtful if we can save multiple rhino files using a single code.

You can use a grasshopper do it

1 Like

Okay.Just one more thing.

In the following code I 'm trying to modify the weight values as per the Matrix values.Although ,on putting remarks at several places in the code it is clear that that the weight values assigned to different control points is as per required matrix,but in the rhino file saved the weights of all the control points is 1 only.

import Rhino
import scriptcontext
import os
import rhinoscriptsyntax as rs
import sys

Matrix = [[0 for x in range(5)] for x in range(5)]
Matrix=([[0.1,0.2,3],[1,0.2,3],[0.1,4,0.03],[1,4,3],[1,4,3]])

def SaveAsRhinoFile(name=“Default.3dm”):

filename = name
folder = "D:/Sachin/"
path = os.path.abspath(folder + filename)
cmd = "_-SaveAs " + chr(34) + path + chr(34)
rs.Command(cmd, True)

def TestNurbsCurve(l=1):
degree = 7
cv_count = 8
knot_count = cv_count + degree - 1
order = degree + 1
cvs = []
cvs.append(Rhino.Geometry.Point3d(0.0, 0.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 0.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 229.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 458.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(0.0, 458.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(0.0, 686.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(0.0, 915.0, 0.0))
cvs.append(Rhino.Geometry.Point3d(458.0, 915.0, 0.0))
knots = []
knots.append(0)
knots.append(0)
knots.append(0)
knots.append(0)
knots.append(0)
knots.append(0)
knots.append(0)
knots.append(1)
knots.append(1)
knots.append(1)
knots.append(1)
knots.append(1)
knots.append(1)
knots.append(1)
k=2
curve = Rhino.Geometry.NurbsCurve(degree,False, order, cv_count)
for i in xrange(cv_count):
cp = Rhino.Geometry.ControlPoint()
cp.Location = cvs[i]
if ((i==2)or(i==7)):
k=0
print Matrix[l][k]
print “sach”+str(i)
cp.Weight = Matrix[l][k]
if (cp.Weight==Matrix[l][k]):
print “yes”

if ((i==3)or(i==6)):
k=1
print Matrix[l][k]
print “sach”+str(i)
cp.Weight = Matrix[l][k]

if ((i==4)or(i==5)):
k=2
print Matrix[l][k]
print “sach”+str(i)
cp.Weight = Matrix[l][k]
print "weight is "+ str(cp.Weight)

if ((i==1)or(i==8)):
print “sach”+str(i)
cp.Weight = 1
curve.Points[i] = cp
for i in xrange(knot_count):
curve.Knots[i] = knots[i]
if curve.IsValid:
scriptcontext.doc.Objects.AddCurve(curve)
scriptcontext.doc.Views.Redraw()
SaveAsRhinoFile(“testfilenew”+str(l))
l=2
TestNurbsCurve(l)