# HELP_ Python Primer page 57_ Geodesiccurve

#1

I am following Rhino 5 Python Primer regarding Geodesic curve.
I am struggling to solve errors like this
"Message: unsupported operand type(s) for -: ‘NoneType’ and 'NoneType’

this is my code.

import rhinoscriptsyntax as rs

def SubDividePolyline(arrV):
arrSubD = []

``````for i in range(0, len(arrV)-1):
arrSubD.append(arrV[i])
arrSubD.append([arrV[i][0] +arrV[i+1][0]] / 2.0, [arrV[i][1] +arrV[i+1][1]] / 2.0, [arrV[i][2] +arrV[i+1][2]] / 2.0 )
arrSubD.append(arrV[len(arrV)])
return arrSubD
``````

def getr2pathonsurface(surface_id, segments, prompt1, prompt2):
start_point = rs.GetPointOnSurface(surface_id, prompt1)
if not start_point: return

``````end_point = rs.GetPointOnSurface(surface_id, prompt2)
if not end_point: return

if rs.Distance(start_point, end_point) == 0.0: return

uva = rs.SurfaceClosestPoint(surface_id, start_point)
uvb = rs.SurfaceClosestPoint(surface_id, end_point)

path = []
for i in range(segments):
t = i / segments
u = uva[0] + t*(uvb[0] - uva[0])
v = uva[1] + t*(uvb[1] - uva[1])
pt = rs.EvaluateSurface(surface_id, u, v)
path.append(pt)
return path
``````

def smoothpolyline(vertices):
smooth = []
smooth.append(vertices[0])

``````for i in range(1, len(vertices)-1):
prev = vertices[i-1]
this = vertices[i]
next = vertices[i+1]
pt = (prev+this+next)/3.0
smooth.append(pt)
smooth.append(vertices[len(vertices)-1])
return smooth
``````

def projectpolyline(vertices, surface_id):
polyline = []
for vertex in vertices:
pt = rs.BrepClosestPoint(surface_id, vertex)
if pt : polyline.append(pt[0])
return polyline

def PolylineLength(arrVertices):
PolylineLength = 0.0
for i in range(0, len(arrVertices)-1):
PolylineLength = PolylineLength + rs.Distance(arrVertices[i], arrVertices[i+1])

def geodesicfit(vertices, surface_id, tolerance):
length = PolylineLength(vertices)
while True:
vertices = smoothpolyline(vertices)
vertices = projectpolyline(vertices, surface_id)
newlength = PolylineLength(vertices)
if abs(newlength - length)<tolerance: return vertices
length = newlength

def geodesiccurve():
surface_id = rs.GetObject(“Select surface for geodesic curve solution”, 9, True, True)
if not surface_id: return

``````vertices = getr2pathonsurface(surface_id, 10, "Start of geodes curve", "End of geodes curve")
if not vertices : return

tolerance = float(rs.UnitAbsoluteTolerance()) / 10.0
length = 1e300
newlength = 0.0

while True:
print ("Solving geodesic fit for %d samples" % len(vertices))
vertices = geodesicfit(vertices, surface_id, tolerance)

newlength = PolylineLength(vertices)
if abs(newlength - length)<tolerance: break
if length(vertices)>1000: break
vertices = SubDividePolyline(vertices)
length = newlength

print "geodesic curve added with length: ", newlength
``````

if name == “main” :
geodesiccurve()

I went over scripts several times but I have no idea.
I would be much appreciated if you share your know-how on this.
thanks

#2

I think you need to change this row:

``````def geodesicfit(vertices, surface_id, tolerance):
length = PolylineLength(vertices)
while True:
vertices = smoothpolyline(vertices)
vertices = projectpolyline(vertices, surface_id)
newlength = PolylineLength(vertices)

if abs(newlength - length)        length = newlength
``````

to

``````     if abs(newlength - length):
length = newlength
``````

#3

Hi, Myongki, did you manage to figure out the problem? I am having the same issue at the exact line.
"Message: unsupported operand type(s) for -: ‘NoneType’ and ‘NoneType’

#4

Any updates on this? I’m hung up at the same place as well. NoneType means it’s not returning a value, right?