Site Tools


Sample: Find Circles and their centers

C#

public static Rhino.Commands.Result CircleCenter(Rhino.RhinoDoc doc)
{
  Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
  go.SetCommandPrompt("Select objects");
  go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;
  go.GeometryAttributeFilter = Rhino.Input.Custom.GeometryAttributeFilter.ClosedCurve;
  go.GetMultiple(1, 0);
  if( go.CommandResult() != Rhino.Commands.Result.Success )
    return go.CommandResult();
 
  Rhino.DocObjects.ObjRef[] objrefs = go.Objects();
  if( objrefs==null )
    return Rhino.Commands.Result.Nothing;
 
  double tolerance = doc.ModelAbsoluteTolerance;
  for( int i=0; i<objrefs.Length; i++ )
  {
    // get the curve geometry
    Rhino.Geometry.Curve curve = objrefs[i].Curve();
    if( curve==null )
      continue;
    Rhino.Geometry.Circle circle;
    if( curve.TryGetCircle(out circle, tolerance) )
    {
      Rhino.RhinoApp.WriteLine("Circle{0}: center = {1}", i+1, circle.Center);
    }
  }
  return Rhino.Commands.Result.Success;
}

VB.NET

Public Shared Function CircleCenter(ByVal doc As Rhino.RhinoDoc) As Rhino.Commands.Result
  Dim go As New Rhino.Input.Custom.GetObject()
  go.SetCommandPrompt("Select objects")
  go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve
  go.GeometryAttributeFilter = Rhino.Input.[Custom].GeometryAttributeFilter.ClosedCurve
  go.GetMultiple(1, 0)
  If go.CommandResult() <> Rhino.Commands.Result.Success Then
    Return go.CommandResult()
  End If
 
  Dim objrefs As Rhino.DocObjects.ObjRef() = go.Objects()
  If objrefs Is Nothing Then
    Return Rhino.Commands.Result.[Nothing]
  End If
 
  Dim tolerance As Double = doc.ModelAbsoluteTolerance
  For i As Integer = 0 To objrefs.Length - 1
    ' get the curve geometry
    Dim curve As Rhino.Geometry.Curve = objrefs(i).Curve()
    If curve Is Nothing Then
      Continue For
    End If
    Dim circle As Rhino.Geometry.Circle
    If curve.TryGetCircle(circle, tolerance) Then
      Rhino.RhinoApp.WriteLine("Circle{0}: center = {1}", i + 1, circle.Center)
    End If
  Next
  Return Rhino.Commands.Result.Success
End Function

Python

import Rhino
import scriptcontext
 
def CircleCenter():
    go = Rhino.Input.Custom.GetObject()
    go.SetCommandPrompt("Select objects")
    go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve
    go.GeometryAttributeFilter = Rhino.Input.Custom.GeometryAttributeFilter.ClosedCurve
    go.GetMultiple(1, 0)
    if go.CommandResult()!=Rhino.Commands.Result.Success:
        return go.CommandResult()
 
    objrefs = go.Objects()
    if not objrefs: return Rhino.Commands.Result.Nothing
 
    tolerance = scriptcontext.doc.ModelAbsoluteTolerance
    for i, objref in enumerate(objrefs):
        # get the curve geometry
        curve = objref.Curve()
        if not curve: continue
        rc, circle = curve.TryGetCircle( tolerance )
        if rc:
            print "Circle", i+1, ": center = ", circle.Center
    return Rhino.Commands.Result.Success
 
if __name__=="__main__":
    CircleCenter()
developer/rhinocommonsamples/circlecenter.txt ยท Last modified: 2020/08/14 (external edit)