Site Tools


Finding the Centers of Circles

.NET

Summary: Demonstrates how to find the center point of a circle curve using the Rhino SDK.

Example

The following example code demonstrates how to find the center point of a circle curve using the Rhino SDK. In this is example, the center point is simply printed to the Rhino command line.

C#

public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
{
  // Pick closed curves
  MRhinoGetObject go = new MRhinoGetObject();
  go.SetCommandPrompt("Select objects");
  go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object);
  go.SetGeometryAttributeFilter(IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.closed_curve);
  go.GetObjects(1, 0);
  if (go.CommandResult() != IRhinoCommand.result.success)
    return go.CommandResult();
 
  for (int i = 0; i < go.ObjectCount(); i++)
  {
    // Get the curve geometry
    IOnCurve curve = go.Object(i).Curve();
    if (curve == null)
      continue;
 
    // Is the curve an arc curve?
    IOnArcCurve arc_curve = OnArcCurve.ConstCast(curve);
    if (arc_curve != null)
    {
      // Is the arc curve a circle
      if (arc_curve.IsCircle())
      {
        string sPoint = ;
        RhUtil.RhinoFormatPoint(arc_curve.m_arc.Center(), ref sPoint);
        RhUtil.RhinoApp().Print(string.Format("Circle{0}: center = ({1})\n", i+1, sPoint));
      }
    }
    else
    {
      // Does the curve look like a circle?
      OnPlane plane = new OnPlane();
      double tol = RhUtil.RhinoApp().ActiveDoc().AbsoluteTolerance();
      if (curve.IsPlanar(plane, tol))
      {
        OnArc arc = new OnArc();
        if (curve.IsArc(plane, arc, tol))
        {
          if (arc.IsCircle())
          {
            string sPoint = ;
            RhUtil.RhinoFormatPoint(arc.Center(), ref sPoint);
            RhUtil.RhinoApp().Print(string.Format("Circle{0}: center = ({1})\n", i+1, sPoint));
          }
        }
      }
    }
  }
 
  return IRhinoCommand.result.success;
}
developer/sdksamples/circlecenter.txt ยท Last modified: 2010/01/26 (external edit)