Fillet Curves

Demonstrates how to fillet two curves by a specified radius.

partial class Examples
{
  public static Result FilletCurves(RhinoDoc doc)
  {
    var gc1 = new GetObject();
    gc1.DisablePreSelect();
    gc1.SetCommandPrompt("Select first curve to fillet (close to the end you want to fillet)");
    gc1.GeometryFilter = ObjectType.Curve;
    gc1.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve;
    gc1.Get();
    if (gc1.CommandResult() != Result.Success)
      return gc1.CommandResult();
    var curve1_obj_ref = gc1.Object(0);
    var curve1 = curve1_obj_ref.Curve();
    if (curve1 == null) return Result.Failure;
    var curve1_point_near_end = curve1_obj_ref.SelectionPoint();
    if (curve1_point_near_end == Point3d.Unset)
      return Result.Failure;

    var gc2 = new GetObject();
    gc2.DisablePreSelect();
    gc2.SetCommandPrompt("Select second curve to fillet (close to the end you want to fillet)");
    gc2.GeometryFilter = ObjectType.Curve;
    gc2.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve;
    gc2.Get();
    if (gc2.CommandResult() != Result.Success)
      return gc2.CommandResult();
    var curve2_obj_ref = gc2.Object(0);
    var curve2 = curve2_obj_ref.Curve();
    if (curve2 == null) return Result.Failure;
    var curve2_point_near_end = curve2_obj_ref.SelectionPoint();
    if (curve2_point_near_end == Point3d.Unset)
      return Result.Failure;

    double radius = 0;
    var rc = RhinoGet.GetNumber("fillet radius", false, ref radius);
    if (rc != Result.Success) return rc;

    var join = false;
    var trim = true;
    var arc_extension = true;
    var fillet-curves = Curve.CreateFilletCurves(curve1, curve1_point_near_end, curve2, curve2_point_near_end, radius,
      join, trim, arc_extension, doc.ModelAbsoluteTolerance, doc.ModelAngleToleranceDegrees);
    if (fillet-curves == null /*|| fillet-curves.Length != 3*/)
      return Result.Failure;

    foreach(var fillet-curve in fillet-curves)
      doc.Objects.AddCurve(fillet-curve);
    doc.Views.Redraw();
    return rc;
  }
}
from Rhino.Commands import Result
from Rhino.Geometry import Point3d, Curve
from Rhino.Input import RhinoGet
from Rhino.DocObjects import ObjectType
from Rhino.Input.Custom import GetObject, GeometryAttributeFilter
from scriptcontext import doc

def RunCommand():
    gc1 = GetObject()
    gc1.DisablePreSelect()
    gc1.SetCommandPrompt("Select first curve to fillet (close to the end you want to fillet)")
    gc1.GeometryFilter = ObjectType.Curve
    gc1.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve
    gc1.Get()
    if gc1.CommandResult() != Result.Success:
        return gc1.CommandResult()
    curve1_obj_ref = gc1.Object(0)
    curve1 = curve1_obj_ref.Curve()
    if curve1 == None: return Result.Failure
    curve1_point_near_end = curve1_obj_ref.SelectionPoint()
    if curve1_point_near_end == Point3d.Unset:
        return Result.Failure

    gc2 = GetObject()
    gc2.DisablePreSelect()
    gc2.SetCommandPrompt("Select second curve to fillet (close to the end you want to fillet)")
    gc2.GeometryFilter = ObjectType.Curve
    gc2.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve
    gc2.Get()
    if gc2.CommandResult() != Result.Success:
        return gc2.CommandResult()
    curve2_obj_ref = gc2.Object(0)
    curve2 = curve2_obj_ref.Curve()
    if curve2 == None: return Result.Failure
    curve2_point_near_end = curve2_obj_ref.SelectionPoint()
    if curve2_point_near_end == Point3d.Unset:
        return Result.Failure

    radius = 0.0
    rc, radius = RhinoGet.GetNumber("fillet radius", False, radius)
    if rc != Result.Success: return rc

    fillet_curve = Curve.CreateFilletCurves(curve1, curve1_point_near_end, curve2, curve2_point_near_end, radius, True, True, True, doc.ModelAbsoluteTolerance, doc.ModelAngleToleranceDegrees)
    if fillet_curve == None or fillet_curve.Length != 1:
        return Result.Failure

    doc.Objects.AddCurve(fillet_curve[0])
    doc.Views.Redraw()
    return rc

if __name__ == "__main__":
    RunCommand()