Summary: Demonstrates how to move a surface's grip objects using RhinoScript.
The following example RhinoScript demonstrates how to move a surfaces grip objects using RhinoScript. In this sample, it is assumed that the document contains a surface with the object name of “Hull” that has pre-selected grip objects that we wish to move. The grips will be moved a fixed distance of 0.5 units in the normal direction of the surface at that grip location.
Option Explicit ' Moves a surface grip Sub MoveSurfaceGrip ' The name of the surface we are going to manipulate Dim object_name object_name = "Hull" ' The distance to move the control point(s) Dim distance distance = 0.5 ' Find the object by object_name Dim object_list object_list = Rhino.ObjectsByName(object_name) If Not IsArray(object_list) Then Rhino.Print "Object not found." Exit Sub End If ' In case more than one were found, ' use the first on in the array Dim object_id object_id = object_list(0) ' Make sure is really is a surface If Not Rhino.IsSurface(object_id) Then Rhino.Print "Object is not a surface." Exit Sub End If ' Get all of the selected grips Dim grip_list grip_list = Rhino.SelectedObjectGrips(object_id) If Not IsArray(grip_list) Then Rhino.Print "No grips selected." Exit Sub End If ' Process each grip Dim grip_idx, grip_pt, new_pt, uv Dim normal_pts, normal, normal_scaled For Each grip_idx In grip_list ' Get the grip's location grip_pt = Rhino.ObjectGripLocation(object_id, grip_idx) ' Find the parameter on the surface closest to the location uv = Rhino.SurfaceClosestPoint(object_id, grip_pt) ' Find the normal to the parameter normal_pts = Rhino.SurfaceNormal(object_id, uv) ' Create a vector from the results normal = VectorCreate( normal_pts(0), normal_pts(1) ) ' Scale the vector based on the specified distance normal_scaled = VectorScale( normal, distance ) ' Modify the point location new_pt = PointAddVector( grip_pt, normal_scaled ) ' Update the grip location Rhino.ObjectGripLocation object_id, grip_idx, new_pt Next End Sub ' NOTE, V4 contains a number of vector related ' functions. Thus, the following would not be ' necessary if we were scripting in V4. ' Creates a 3D vector from 2- 3D points Function VectorCreate(p1, p2) VectorCreate = Null If Not IsArray(p1) Or (UBound(p1) <> 2) Then Exit Function If Not IsArray(p2) Or (UBound(p2) <> 2) Then Exit Function VectorCreate = Array(p2(0) - p1(0), p2(1) - p1(1), p2(2) - p1(2)) End Function ' Scale a 3D vector Function VectorScale(v, d) VectorScale = Null If Not IsArray(v) Or (UBound(v) <> 2) Then Exit Function If Not IsNumeric(d) Then Exit Function VectorScale = Array(v(0) * d, v(1) * d, v(2) * d) End Function ' Adds a 3D vector to a 3D point Function PointAddVector(p, v) PointAddVector = Null If Not IsArray(p) Or (UBound(p) <> 2) Then Exit Function If Not IsArray(v) Or (UBound(v) <> 2) Then Exit Function PointAddVector = Array(p(0) + v(0), p(1) + v(1), p(2) + v(2)) End Function