Dynamically Draw Geometry when Picking Points

Demonstrates how to dynamically draw geometry during point picking.

partial class Examples
{
  public static Result GetPointDynamicDraw(RhinoDoc doc)
  {
    var gp = new GetPoint();
    gp.SetCommandPrompt("Center point");
    gp.Get();
    if (gp.CommandResult() != Result.Success)
      return gp.CommandResult();
    var center_point = gp.Point();
    if (center_point == Point3d.Unset)
      return Result.Failure;

    var gcp = new GetCircleRadiusPoint(center_point);
    gcp.SetCommandPrompt("Radius");
    gcp.ConstrainToConstructionPlane(false);
    gcp.SetBasePoint(center_point, true);
    gcp.DrawLineFromPoint(center_point, true);
    gcp.Get();
    if (gcp.CommandResult() != Result.Success)
      return gcp.CommandResult();

    var radius = center_point.DistanceTo(gcp.Point());
    var cplane = doc.Views.ActiveView.ActiveViewport.ConstructionPlane();
    doc.Objects.AddCircle(new Circle(cplane, center_point, radius));
    doc.Views.Redraw();
    return Result.Success;
  }
}

public class GetCircleRadiusPoint : GetPoint
{
  private Point3d m_center_point;

  public GetCircleRadiusPoint(Point3d centerPoint)
  {
    m_center_point = centerPoint;
  }

  protected override void OnDynamicDraw(GetPointDrawEventArgs e)
  {
    base.OnDynamicDraw(e);
    var cplane = e.RhinoDoc.Views.ActiveView.ActiveViewport.ConstructionPlane();
    var radius = m_center_point.DistanceTo(e.CurrentPoint);
    var circle = new Circle(cplane, m_center_point, radius);
    e.Display.DrawCircle(circle, System.Drawing.Color.Black);
  }
}
from Rhino import *
from Rhino.Geometry import *
from Rhino.Commands import *
from Rhino.Input.Custom import *
from scriptcontext import doc
from System.Drawing import *

def RunCommand():
    gp = GetPoint()
    gp.SetCommandPrompt("Center point")
    gp.Get()
    if gp.CommandResult() != Result.Success:
        return gp.CommandResult()
    center_point = gp.Point()
    if center_point == Point3d.Unset:
        return Result.Failure

    gcp = GetCircleRadiusPoint(center_point)
    gcp.SetCommandPrompt("Radius")
    gcp.ConstrainToConstructionPlane(False)
    gcp.SetBasePoint(center_point, True)
    gcp.DrawLineFromPoint(center_point, True)
    gcp.Get()
    if gcp.CommandResult() != Result.Success:
        return gcp.CommandResult()

    radius = center_point.DistanceTo(gcp.Point())
    cplane = doc.Views.ActiveView.ActiveViewport.ConstructionPlane()
    doc.Objects.AddCircle(Circle(cplane, center_point, radius))
    doc.Views.Redraw()
    return Result.Success

class GetCircleRadiusPoint (GetPoint):
    def __init__(self, centerPoint):
        self.m_center_point = centerPoint

    def OnDynamicDraw(self, e):
        cplane = e.RhinoDoc.Views.ActiveView.ActiveViewport.ConstructionPlane()
        radius = self.m_center_point.DistanceTo(e.CurrentPoint)
        circle = Circle(cplane, self.m_center_point, radius)
        e.Display.DrawCircle(circle, Color.Black)

if __name__ == "__main__":
    RunCommand()