import Rhino import rhinoscriptsyntax as rs import scriptcontext from System.Drawing import Color import random as rnd import time """-------------------------------------------------------- RHINOCOMMON METHODS One Time Search to find all points within specified radius The points found inside the specified radius get sampled for closest neighbor No Repeat Search Search Sample = 1 Million Points Search Radius = 500 Units Search Space = Cube (5000,5000,5000) --------------------------------------------------------""" def closestSearch(pts, point): #function to sample point based on a search radius first then search for the closest inside that list mimic the rtree pass basically but with brute force ptsinRange = [] #dynamic list to store points found inside initial search for i, pt in enumerate(pts): dist = point.DistanceTo(pt) #find the distance from each point to the query point if dist < 500: ptsinRange.append(pt) #if the distance is less than 500 append that point to the ptsinRange List cPoint = Rhino.Collections.Point3dList.ClosestPointInList(ptsinRange,point) #search for the closest point from that list of points in range if cPoint[0] == point[0] and cPoint[1] == point[1] and cPoint[2] == point[1]: #test against the closest neighbor being you print "IS THE SAME" return cPoint,ptsinRange #return the closest neighbor and the list of points in range def RunSearch(): point = Rhino.Geometry.Point3d(5000/2,5000/2,5000/2) intNumPts = 1000000 #specify number of sample points pts = [] #store the random points in an empty list for x in range(0,intNumPts): randomPt = Rhino.Geometry.Point3d(rnd.random()*5000,rnd.random()*5000,rnd.random()*5000) #randomly place each point inside the 5k x 5k x 5k cube pts.append(randomPt) #append each random point to the pts list timeStart = time.time() #Start timer data = closestSearch(pts, point) #call closestsearch function Pass query pt and list of points to search print "ClosestPoint = {}".format(data[0]) #print the closest neighbor print "Number of Pts in Range = {}".format(len(data[1])) #print how many points were captures inside the search radius timeEnd = time.time() #stop the timer print "time taken: {}".format(timeEnd - timeStart) #print the amount of time the calculations took if __name__=="__main__": RunSearch() Update