Create Contour Curves

Demonstrates how to create contour curves on user-specified objects.

partial class Examples
{
  public static Result ContourCurves(RhinoDoc doc)
  {
    var filter = ObjectType.Surface | ObjectType.PolysrfFilter | ObjectType.Mesh;
    ObjRef[] obj_refs;
    var rc = RhinoGet.GetMultipleObjects("Select objects to contour", false, filter, out obj_refs);
    if (rc != Result.Success)
      return rc;

    var gp = new GetPoint();
    gp.SetCommandPrompt("Contour plane base point");
    gp.Get();
    if (gp.CommandResult() != Result.Success)
      return gp.CommandResult();
    var base_point = gp.Point();

    gp.DrawLineFromPoint(base_point, true);
    gp.SetCommandPrompt("Direction perpendicular to contour planes");
    gp.Get();
    if (gp.CommandResult() != Result.Success)
      return gp.CommandResult();
    var end_point = gp.Point();

    if (base_point.DistanceTo(end_point) < RhinoMath.ZeroTolerance)
      return Result.Nothing;

    double distance = 1.0;
    rc = RhinoGet.GetNumber("Distance between contours", false, ref distance);
    if (rc != Result.Success)
      return rc;

    var interval = Math.Abs(distance);

    Curve[] curves = null;
    foreach (var obj_ref in obj_refs)
    {
      var geometry = obj_ref.Geometry();
      if (geometry == null)
        return Result.Failure;

      if (geometry is Brep)
      {
        curves = Brep.CreateContourCurves(geometry as Brep, base_point, end_point, interval);
      }
      else
      {
        curves = Mesh.CreateContourCurves(geometry as Mesh, base_point, end_point, interval);
      }

      foreach (var curve in curves)
      {
        var curve_object_id = doc.Objects.AddCurve(curve);
        doc.Objects.Select(curve_object_id);
      }
    }

    if (curves != null)
      doc.Views.Redraw();
    return Result.Success;
  }
}
Partial Friend Class Examples
  Public Shared Function ContourCurves(ByVal doc As RhinoDoc) As Result
	Dim filter = ObjectType.Surface Or ObjectType.PolysrfFilter Or ObjectType.Mesh
	Dim obj_refs() As ObjRef = Nothing
	Dim rc = RhinoGet.GetMultipleObjects("Select objects to contour", False, filter, obj_refs)
	If rc IsNot Result.Success Then
	  Return rc
	End If

	Dim gp = New GetPoint()
	gp.SetCommandPrompt("Contour plane base point")
	gp.Get()
	If gp.CommandResult() <> Result.Success Then
	  Return gp.CommandResult()
	End If
	Dim base_point = gp.Point()

	gp.DrawLineFromPoint(base_point, True)
	gp.SetCommandPrompt("Direction perpendicular to contour planes")
	gp.Get()
	If gp.CommandResult() <> Result.Success Then
	  Return gp.CommandResult()
	End If
	Dim end_point = gp.Point()

	If base_point.DistanceTo(end_point) < RhinoMath.ZeroTolerance Then
	  Return Result.Nothing
	End If

	Dim distance As Double = 1.0
	rc = RhinoGet.GetNumber("Distance between contours", False, distance)
	If rc IsNot Result.Success Then
	  Return rc
	End If

	Dim interval = Math.Abs(distance)

	Dim curves() As Curve = Nothing
	For Each obj_ref In obj_refs
	  Dim geometry = obj_ref.Geometry()
	  If geometry Is Nothing Then
		Return Result.Failure
	  End If

	  If TypeOf geometry Is Brep Then
		curves = Brep.CreateContourCurves(TryCast(geometry, Brep), base_point, end_point, interval)
	  Else
		curves = Mesh.CreateContourCurves(TryCast(geometry, Mesh), base_point, end_point, interval)
	  End If

	  For Each curve In curves
		Dim curve_object_id = doc.Objects.AddCurve(curve)
		doc.Objects.Select(curve_object_id)
	  Next curve
	Next obj_ref

	If curves IsNot Nothing Then
	  doc.Views.Redraw()
	End If
	Return Result.Success
  End Function
End Class
from System import *
from Rhino import *
from Rhino.DocObjects import *
from Rhino.Geometry import *
from Rhino.Input import *
from Rhino.Input.Custom import *
from Rhino.Commands import *
from scriptcontext import doc

def RunCommand():
  filter = ObjectType.Surface | ObjectType.PolysrfFilter | ObjectType.Mesh
  rc, obj_refs = RhinoGet.GetMultipleObjects("Select objects to contour", False, filter)
  if rc <> Result.Success:
    return rc

  gp = GetPoint()
  gp.SetCommandPrompt("Contour plane base point")
  gp.Get()
  if gp.CommandResult() <> Result.Success:
    return gp.CommandResult()
  base_point = gp.Point()

  gp.DrawLineFromPoint(base_point, True)
  gp.SetCommandPrompt("Direction perpendicular to contour planes")
  gp.Get()
  if gp.CommandResult() <> Result.Success:
    return gp.CommandResult()
  end_point = gp.Point()

  if base_point.DistanceTo(end_point) < RhinoMath.ZeroTolerance:
    return Result.Nothing

  distance = 1.0
  rc, distance = RhinoGet.GetNumber("Distance between contours", False, distance)
  if rc <> Result.Success:
    return rc

  interval = Math.Abs(distance)

  for obj_ref in obj_refs:
    geometry = obj_ref.Geometry()
    if geometry == None:
      return Result.Failure

    if type(geometry) == Brep:
      curves = Brep.CreateContourCurves(geometry, base_point, end_point, interval)
    else:
      curves = Mesh.CreateContourCurves(geometry, base_point, end_point, interval)

    for curve in curves:
      curve_object_id = doc.Objects.AddCurve(curve)
      doc.Objects.Select(curve_object_id)

  if curves <> None:
    doc.Views.Redraw()
  return Result.Success

if __name__ == "__main__":
  RunCommand()