Extract Isocurve

Demonstrates how to extract the isoparametric curves from selected surfaces.

partial class Examples
{
  public static Result ExtractIsoCurve(RhinoDoc doc)
  {
    ObjRef obj_ref;
    var rc = RhinoGet.GetOneObject("Select surface", false, ObjectType.Surface, out obj_ref);
    if (rc != Result.Success || obj_ref == null)
      return rc;
    var surface = obj_ref.Surface();

    var gp = new GetPoint();
    gp.SetCommandPrompt("Point on surface");
    gp.Constrain(surface, false);
    var option_toggle = new OptionToggle(false, "U", "V");
    gp.AddOptionToggle("Direction", ref option_toggle);
    Point3d point = Point3d.Unset;
    while (true)
    {
      var grc = gp.Get();
      if (grc == GetResult.Option)
        continue;
      else if (grc == GetResult.Point)
      {
        point = gp.Point();
        break;
      }
      else
        return Result.Nothing;
    }
    if (point == Point3d.Unset)
      return Result.Nothing;

    int direction = option_toggle.CurrentValue ? 1 : 0; // V : U
    double u_parameter, v_parameter;
    if (!surface.ClosestPoint(point, out u_parameter, out v_parameter)) return Result.Failure;

    var iso_curve = surface.IsoCurve(direction, direction == 1 ? u_parameter : v_parameter);
    if (iso_curve == null) return Result.Failure;

    doc.Objects.AddCurve(iso_curve);
    doc.Views.Redraw();
    return Result.Success;
  }
}
Partial Friend Class Examples
  Public Shared Function ExtractIsoCurve(ByVal doc As RhinoDoc) As Result
	Dim obj_ref As ObjRef = Nothing
	Dim rc = RhinoGet.GetOneObject("Select surface", False, ObjectType.Surface, obj_ref)
	If rc IsNot Result.Success OrElse obj_ref Is Nothing Then
	  Return rc
	End If
	Dim surface = obj_ref.Surface()

	Dim gp = New GetPoint()
	gp.SetCommandPrompt("Point on surface")
	gp.Constrain(surface, False)
	Dim option_toggle = New OptionToggle(False, "U", "V")
	gp.AddOptionToggle("Direction", option_toggle)
	Dim point As Point3d = Point3d.Unset
	Do
	  Dim grc = gp.Get()
	  If grc Is GetResult.Option Then
		Continue Do
	  ElseIf grc Is GetResult.Point Then
		point = gp.Point()
		Exit Do
	  Else
		Return Result.Nothing
	  End If
	Loop
	If point Is Point3d.Unset Then
	  Return Result.Nothing
	End If

	Dim direction As Integer = If(option_toggle.CurrentValue, 1, 0) ' V : U
	Dim u_parameter As Double = Nothing, v_parameter As Double = Nothing
	If Not surface.ClosestPoint(point, u_parameter, v_parameter) Then
		Return Result.Failure
	End If

	Dim iso_curve = surface.IsoCurve(direction,If(direction = 1, u_parameter, v_parameter))
	If iso_curve Is Nothing Then
		Return Result.Failure
	End If

	doc.Objects.AddCurve(iso_curve)
	doc.Views.Redraw()
	Return Result.Success
  End Function
End Class
from Rhino import *
from Rhino.DocObjects import *
from Rhino.Commands import *
from Rhino.Input import *
from Rhino.Input.Custom import *
from Rhino.Geometry import *
from scriptcontext import doc

def RunCommand():
  rc, obj_ref = RhinoGet.GetOneObject("Select surface", False, ObjectType.Surface)
  if rc <> Result.Success or obj_ref == None:
    return rc
  surface = obj_ref.Surface()

  gp = GetPoint()
  gp.SetCommandPrompt("Point on surface")
  gp.Constrain(surface, False)
  option_toggle = OptionToggle(False, "U", "V")
  gp.AddOptionToggle("Direction", option_toggle)
  point = Point3d.Unset

  while True:
    grc = gp.Get()
    if grc == GetResult.Option:
      continue
    elif grc == GetResult.Point:
      point = gp.Point()
      break
    else:
      return Result.Nothing

  if point == Point3d.Unset:
    return Result.Nothing

  direction = 1 if option_toggle.CurrentValue else 0
  b, u_parameter, v_parameter = surface.ClosestPoint(point)
  if not b: return Result.Failure

  iso_curve = surface.IsoCurve(direction, u_parameter if direction == 1 else v_parameter)
  if iso_curve == None:
    return Result.Failure

  doc.Objects.AddCurve(iso_curve)
  doc.Views.Redraw()
  return Result.Success

if __name__ == "__main__":
  RunCommand()