Add Radial Dimension

Demonstrates how to add radial dimensions to a selected curve.

partial class Examples
{
  public static Rhino.Commands.Result AddRadialDimension(Rhino.RhinoDoc doc)
  {
    ObjRef obj_ref;
    var rc = RhinoGet.GetOneObject("Select curve for radius dimension",
      true, ObjectType.Curve, out obj_ref);
    if (rc != Result.Success)
      return rc;
    double curve_parameter;
    var curve = obj_ref.CurveParameter(out curve_parameter);
    if (curve == null)
      return Result.Failure;

    if (curve.IsLinear() || curve.IsPolyline())
    {
      RhinoApp.WriteLine("Curve must be non-linear.");
      return Result.Nothing;
    }

    // in this example just deal with planar curves
    if (!curve.IsPlanar())
    {
      RhinoApp.WriteLine("Curve must be planar.");
      return Result.Nothing;
    }

    var point_on_curve = curve.PointAt(curve_parameter);
    var curvature_vector = curve.CurvatureAt(curve_parameter);
    var len = curvature_vector.Length;
    if (len < RhinoMath.SqrtEpsilon)
    {
      RhinoApp.WriteLine("Curve is almost linear and therefore has no curvature.");
      return Result.Nothing;
    }

    var center = point_on_curve + (curvature_vector/(len*len));
    Plane plane;
    curve.TryGetPlane(out plane);
    var radial_dimension =
      new RadialDimension(center, point_on_curve, plane.XAxis, plane.Normal, 5.0);
    doc.Objects.AddRadialDimension(radial_dimension);
    doc.Views.Redraw();
    return Result.Success;
  }
}
Partial Friend Class Examples
  Public Shared Function AddRadialDimension(ByVal doc As Rhino.RhinoDoc) As Rhino.Commands.Result
	Dim obj_ref As ObjRef = Nothing
	Dim rc = RhinoGet.GetOneObject("Select curve for radius dimension", True, ObjectType.Curve, obj_ref)
	If rc IsNot Result.Success Then
	  Return rc
	End If
	Dim curve_parameter As Double = Nothing
	Dim curve = obj_ref.CurveParameter(curve_parameter)
	If curve Is Nothing Then
	  Return Result.Failure
	End If

	If curve.IsLinear() OrElse curve.IsPolyline() Then
	  RhinoApp.WriteLine("Curve must be non-linear.")
	  Return Result.Nothing
	End If

	' in this example just deal with planar curves
	If Not curve.IsPlanar() Then
	  RhinoApp.WriteLine("Curve must be planar.")
	  Return Result.Nothing
	End If

	Dim point_on_curve = curve.PointAt(curve_parameter)
	Dim curvature_vector = curve.CurvatureAt(curve_parameter)
	Dim len = curvature_vector.Length
	If len < RhinoMath.SqrtEpsilon Then
	  RhinoApp.WriteLine("Curve is almost linear and therefore has no curvature.")
	  Return Result.Nothing
	End If

	Dim center = point_on_curve + (curvature_vector/(len*len))
	Dim plane As Plane = Nothing
	curve.TryGetPlane(plane)
	Dim radial_dimension = New RadialDimension(center, point_on_curve, plane.XAxis, plane.Normal, 5.0)
	doc.Objects.AddRadialDimension(radial_dimension)
	doc.Views.Redraw()
	Return Result.Success
  End Function
End Class
from Rhino import *
from Rhino.DocObjects import *
from Rhino.Commands import *
from Rhino.Geometry import *
from Rhino.Input import *
from scriptcontext import doc

def RunCommand():
    rc, obj_ref = RhinoGet.GetOneObject("Select curve for radius dimension", True, ObjectType.Curve)
    if rc != Result.Success:
        return rc
    curve, curve_parameter = obj_ref.CurveParameter()
    if curve == None:
        return Result.Failure

    if curve.IsLinear() or curve.IsPolyline():
        print "Curve must be non-linear."
        return Result.Nothing

    # in this example just deal with planar curves
    if not curve.IsPlanar():
        print "Curve must be planar."
        return Result.Nothing

    point_on_curve = curve.PointAt(curve_parameter)
    curvature_vector = curve.CurvatureAt(curve_parameter)
    len = curvature_vector.Length
    if len < RhinoMath.SqrtEpsilon:
        print "Curve is almost linear and therefore has no curvature."
        return Result.Nothing

    center = point_on_curve + (curvature_vector/(len*len))
    _, plane = curve.TryGetPlane()
    radial_dimension = RadialDimension(center, point_on_curve, plane.XAxis, plane.Normal, 5.0)
    doc.Objects.AddRadialDimension(radial_dimension)
    doc.Views.Redraw()
    return Result.Success

if __name__=="__main__":
    RunCommand()