//Code written by Luis Quinones @ [complicitMatter] //Feel free to use and modify the code in any way you want, please comment below with suggestions, ideas of any relevant throughts private void RunScript(Mesh meshIn, List<Point3d> attrPts, int cPCount, double vAmp, bool toggle, ref object C, ref object A) { Rhino.Geometry.Collections.MeshVertexList vList = meshIn.Vertices; Rhino.Geometry.Collections.MeshFaceList fList = meshIn.Faces; List<Point3f> vertToList = vList.ToList(); List<Point3d> vertPtList = vertToList.ConvertAll(x => (Point3d) x); //convert vertexlist from point3f to point3d List<Point3d> vertPtDup = new List<Point3d>(vertPtList); List<Point3d> vertAsPoint = new List<Point3d>(); foreach(Point3d pt in attrPts){ //go through each attractor point (creepers) for(int i = 0; i < cPCount; i++){ //for however many closestpoints you want each attractor to have int cIndex_A = Rhino.Collections.Point3dList.ClosestIndexInList(vertPtList, pt); vertAsPoint.Add(vertPtList[cIndex_A]); Vector3d subVec = Vector3d.Subtract(new Vector3d(pt), new Vector3d(vertPtList[cIndex_A])); subVec.Unitize(); Vector3d mult = new Vector3d(); if(!toggle){ mult = Vector3d.Multiply(subVec, vAmp); //if toggle is false amplify the vector by the user defined value }else{ double dist = pt.DistanceTo(vertPtList[cIndex_A]); mult = Vector3d.Multiply(subVec, dist); //if toggle is true then use the distance to the creeper pos } int moveIndex = vertPtDup.IndexOf(vertPtList[cIndex_A]); //get the index of the current closest point vList.SetVertex(moveIndex, Point3d.Add(mult, vertPtList[cIndex_A])); //set the mesh vertex at the specified index to the new location vertPtList.RemoveAt(cIndex_A); //remove the previous index from the vertex list to find the next closest point } } creeperMesh = meshIn; ptsOnMesh = vertAsPoint; } Update