Rs.AddNurbsCurve encountered some problems


(NARUTO) #1

hello everone
I created nurbs curve rs.AddNurbsCurve, but does not appear in rhino window,Such as pictures,I use rhinocommon can successfully create nurbs curve,Such as pictures,How do I use rs.AddNurbsCurve create nurbs curve,help me,thanks


(Dale Fugier) #2

I am able to repeat the problem. I’ll see that a fix makes it into the next Rhino SR.

Thanks for reporting.


(NARUTO) #3

Hi dale
I solved this problem,rs.addnurbscurve weighs must be set parameters,orchange the code,Example:
#coding=utf-8

import scriptcontext
import rhinoscriptsyntax as rs
import utility as rhutil
import Rhino
import math
import System.Guid, System.Array, System.Enum

def AddNurbsCurve(points, knots, degree, weights=None):
""“Adds a NURBS curve object to the document
Parameters:
points = list containing 3D control points
knots = Knot values for the curve. The number of elements in knots must
equal the number of elements in points plus degree minus 1
degree = degree of the curve. must be greater than of equal to 1
weights[opt] = weight values for the curve. Number of elements should
equal the number of elements in points. Values must be greater than 0
"”"
points = rhutil.coerce3dpointlist(points, True)
cvcount = len(points)
knotcount = cvcount + degree - 1
if len(knots)!=knotcount:
raise Exception(“Number of elements in knots must equal the number of elements in points plus degree minus 1”)
if not weights:
weights = [2 for i in range(cvcount)]
else:
if len(weights)!=cvcount:
raise Exception(“Number of elements in weights should equal the number of elements in points”)
weights = weights
rational = (weights!=None)

nc = Rhino.Geometry.NurbsCurve(3,rational,degree+1,cvcount)
#nc = Rhino.Geometry.NurbsCurve.Create(rational,degree,points)
for i in xrange(cvcount):
    cp = Rhino.Geometry.ControlPoint()
    cp.Location = points[i]
    if weights: cp.Weight = weights[i]
    nc.Points[i] = cp
for i in xrange(knotcount): nc.Knots[i] = knots[i]
rc = scriptcontext.doc.Objects.AddCurve(nc)
if rc !=System.Guid.Empty:
    scriptcontext.doc.Views.Redraw()
else:
    raise Exception("Unable to add curve to document")
return rc

def addnurbscurve():
pts = rs.GetObjects()
knot = [0.0,0.0,0.0,1.0,1.2,3.0,3.0,3.0]
weight = [8,6,3,8,4,8]
curve=AddNurbsCurve(pts, knot,3,weight)
if curve:
print(curve,type(curve))
return curve

cv=addnurbscurve()
print rs.CurveWeights(cv)


(NARUTO) #4

Great work


(NARUTO) #5

HIi dale
I found another problem,rs.OffsetSurface not be offset trim Surface and Triangle Surface,

e,Example:

import scriptcontext
import math
import Rhino
import System.Guid
import utility as rhutil
import object as rhobject
import rhinoscriptsyntax as rs

def OffsetSrf(surface_id, distance, tolerance=None, both_sides=False, create_solid=False):
""“Offsets a trimmed or untrimmed surface by a distance. The offset surface
will be added to Rhino.
Parameters:
surface_id = the surface’s identifier
distance = the distance to offset
tolerance [opt] = The offset tolerance. Use 0.0 to make a loose offset. Otherwise, the
document’s absolute tolerance is usually sufficient.
both_sides [opt] = Offset to both sides of the input surface
create_solid [opt] = Make a solid object
Returns:
identifier of the new object if successful
None on error
”""
brep = rhutil.coercesurface(surface_id, True)
face = None
if brep is None: return scriptcontext.errorhandler()
face = brep
if tolerance is None: tolerance = scriptcontext.doc.ModelAbsoluteTolerance
newbrep = Rhino.Geometry.Brep.CreateFromOffsetFace(face, distance, tolerance, both_sides, create_solid)
if newbrep is None: return scriptcontext.errorhandler()
rc = scriptcontext.doc.Objects.AddBrep(newbrep)
if rc==System.Guid.Empty: return scriptcontext.errorhandler()
scriptcontext.doc.Views.Redraw()
return rc

Thanks


(Dale Fugier) #6

Got it, thanks!


#7

I have the same problem.
I created nurbs curve rs.AddNurbsCurve, but does not appear in rhino window,Such as pictures,How do I use rs.AddNurbsCurve create nurbs curve,help me,thanks


(Dale Fugier) #8

Hi @Hiroo_Maruyama,

Can you provide the source code that you cannot make work? I’d rather not re-type your screen capture…

– Dale


#9

Hi, @dale
I am sorry not to paste my source code…
I pasted the source code.

import rhinoscriptsyntax as rs
import random as rd

curve = rs.GetObject(“Select a curve”, 4)

if curve:
points = rs.CurvePoints(curve)
knots = rs.CurveKnots(curve)
degree = rs.CurveDegree(curve)

newpoints = []
for p in points:
    dx = rd.randrange(0,5)
    dy = rd.randrange(0,5)
    dz = rd.randrange(0,5)
    d = [dx, dy, dz]
    q = rs.PointAdd(p,d)
    newpoints.append(q)
    
newcurve = rs.AddNurbsCurve(newpoints, knots, degree)
print newcurve

(Alain Cormier) #10

Hi.
Your code has non ascii characters and improper indentation. Better paste code in a code block like this:

import rhinoscriptsyntax as rs
import random as rd

curve = rs.GetObject("Select a curve", 4)

if curve:
  points = rs.CurvePoints(curve)
  knots = rs.CurveKnots(curve)
  degree = rs.CurveDegree(curve)

  newpoints = []
  for p in points:
    dx = rd.randrange(0,5)
    dy = rd.randrange(0,5)
    dz = rd.randrange(0,5)
    d = [dx, dy, dz]
    q = rs.PointAdd(p,d)
    newpoints.append(q)
    
  newcurve = rs.AddNurbsCurve(newpoints, knots, degree)
  print newcurve

Sorry, I can not reproduce the problem.

If you run the SelCrv command do you only get the original curve in your selection?


#11

thanks,
I pasted your code in my python, but nurbs curve doesn’t appear. and error code doesn’t appear either…
now I use rhino5. The setting is wrong??


(Alain Cormier) #12

Your screen capture with the printed Id shows that it was added to the document. Forcing a redraw by moving things around doesn’t show it? Does running the SelCrv command select it?


#13

Yes, Running the SelCrv command select a curve


(Alain Cormier) #14

Running the SelCrv command only selected one curve? Not two: the original curve plus the new one?


#15

Running the Selcrv command in rhino can select two curves, thanks.
but on the screen, i cannot see the new curve.(I cheched the display setting and show command, layer)


(Alain Cormier) #16

If you run the SelLast command followed by the menu: View->Zoom->ZoomSelected do you see it?


#17

If I run the SelLast command, zoom_selected commmand doesn’t work like screen capture.


(Dale Fugier) #21

Hi @Hiroo_Maruyama,

The code you posted works here in both Rhino 5 SR14 and Rhino 6 SR3.

If you are using Rhino 5 and are not using SR14, then I suggest you download and install the service release.

https://www.rhino3d.com/download/rhino/5/latest

– Dale


#22

Thank you, I will try to download!