Site Tools

Sample: Add Gumball


public class GumballExampleCommand : Rhino.Commands.TransformCommand
  public override string EnglishName  { get { return "csExampleGumball"; } }
  protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, Rhino.Commands.RunMode mode)
    // Select objects to scale
    var list = new Rhino.Collections.TransformObjectList();
    var rc = SelectObjects("Select objects to gumball", list);
    if (rc != Rhino.Commands.Result.Success)
      return rc;
    var bbox = list.GetBoundingBox(true, true);
    if (!bbox.IsValid)
      return Rhino.Commands.Result.Failure;
    Rhino.Commands.Result cmdrc;
    var base_gumball = new Rhino.UI.Gumball.GumballObject();
    var dc = new Rhino.UI.Gumball.GumballDisplayConduit();
    var appearance = new Rhino.UI.Gumball.GumballAppearanceSettings();
    // turn off some of the scale appearance settings to have a slightly different gumball
    appearance.ScaleXEnabled = false;
    appearance.ScaleYEnabled = false;
    appearance.ScaleZEnabled = false;
    bool bCopy = false;
    while (true)
      dc.SetBaseGumball(base_gumball, appearance);
      dc.Enabled = true;
      GetGumballXform gp = new GetGumballXform(dc);
      int copy_optindx = gp.AddOption("Copy");
      if (dc.PreTransform == Transform.Identity)
        gp.SetCommandPrompt("Drag gumball");
        gp.SetCommandPrompt("Drag gumball. Press Enter when done");
      dc.Enabled = false;
      cmdrc = gp.CommandResult();
      if (cmdrc != Rhino.Commands.Result.Success)
      var getpoint_result = gp.Result();
      if (getpoint_result == Rhino.Input.GetResult.Point)
        if (!dc.InRelocate)
          Transform xform = dc.TotalTransform;
          dc.PreTransform = xform;
        // update location of base gumball
        var gbframe = dc.Gumball.Frame;
        var baseFrame = base_gumball.Frame;
        baseFrame.Plane = gbframe.Plane;
        baseFrame.ScaleGripDistance = gbframe.ScaleGripDistance;
        base_gumball.Frame = baseFrame;
      if (getpoint_result == Rhino.Input.GetResult.Option)
        if (gp.OptionIndex() == copy_optindx)
          bCopy = true;
    dc.Enabled = false;
    if (dc.PreTransform != Transform.Identity)
      Transform xform = dc.PreTransform;
      TransformObjects(list, xform, bCopy, bCopy);
    return cmdrc;
class GetGumballXform : Rhino.Input.Custom.GetTransform
  readonly Rhino.UI.Gumball.GumballDisplayConduit m_dc;
  public GetGumballXform(Rhino.UI.Gumball.GumballDisplayConduit dc)
    m_dc = dc;
  public override Transform CalculateTransform(Rhino.Display.RhinoViewport viewport, Point3d point)
    if (m_dc.InRelocate)
      // don't move objects while relocating gumball
      return m_dc.PreTransform;
    return m_dc.TotalTransform;
  protected override void OnMouseDown(Rhino.Input.Custom.GetPointMouseEventArgs e)
    if (m_dc.PickResult.Mode != Rhino.UI.Gumball.GumballMode.None)
    Rhino.Input.Custom.PickContext pick_context = new Rhino.Input.Custom.PickContext();
    pick_context.View = e.Viewport.ParentView;
    pick_context.PickStyle = Rhino.Input.Custom.PickStyle.PointPick;
    var xform = e.Viewport.GetPickTransform(e.WindowPoint);
    Rhino.Geometry.Line pick_line;
    e.Viewport.GetFrustumLine(e.WindowPoint.X, e.WindowPoint.Y, out pick_line);
    pick_context.PickLine = pick_line;
    // pick gumball and, if hit, set getpoint dragging constraints.
    m_dc.PickGumball(pick_context, this);
  protected override void OnMouseMove(Rhino.Input.Custom.GetPointMouseEventArgs e)
    if( m_dc.PickResult.Mode == Rhino.UI.Gumball.GumballMode.None )
    Rhino.Geometry.Line world_line;
    if (!e.Viewport.GetFrustumLine(e.WindowPoint.X, e.WindowPoint.Y, out world_line))
      world_line = Rhino.Geometry.Line.Unset;
    bool rc = m_dc.UpdateGumball(e.Point, world_line);
    if( rc )
  protected override void OnDynamicDraw(Rhino.Input.Custom.GetPointDrawEventArgs e)
    // Disable default GetTransform drawing by not calling the base class
    // implementation. All aspects of gumball display are handled by 
    // GumballDisplayConduit
  // lets user drag m_gumball around.
  public Rhino.Input.GetResult MoveGumball()
    // Get point on a MouseUp event
    if( m_dc.PreTransform != Transform.Identity )
      HaveTransform = true;
      Transform = m_dc.PreTransform;
    SetBasePoint(m_dc.BaseGumball.Frame.Plane.Origin, false);
    // V5 uses a display conduit to provide display feedback
    // so shaded objects move
    ObjectList.DisplayFeedbackEnabled = true;
    if( Transform != Transform.Identity )
    // Call Get with mouseUp set to true
    var rc = this.Get(true);
    // V5 uses a display conduit to provide display feedback
    // so shaded objects move
    ObjectList.DisplayFeedbackEnabled = false;
    return rc;


Inherits Rhino.Commands.TransformCommand
Public Overrides ReadOnly Property EnglishName() As String
    Return "vbExampleGumball"
  End Get
End Property
Protected Overrides Function RunCommand(doc As RhinoDoc, mode As Rhino.Commands.RunMode) As Rhino.Commands.Result
  ' Select objects to scale
  Dim list = New Rhino.Collections.TransformObjectList()
  Dim rc = SelectObjects("Select objects to gumball", list)
  If rc <> Rhino.Commands.Result.Success Then Return rc
  Dim bbox = list.GetBoundingBox(True, True)
  If Not bbox.IsValid Then Return Rhino.Commands.Result.Failure
  Dim cmdrc As Rhino.Commands.Result
  Dim base_gumball = New Rhino.UI.Gumball.GumballObject()
  Dim dc = New Rhino.UI.Gumball.GumballDisplayConduit()
  Dim appearance = New Rhino.UI.Gumball.GumballAppearanceSettings()
  ' turn off some of the scale appearance settings to have a slightly different gumball
  appearance.ScaleXEnabled = False
  appearance.ScaleYEnabled = False
  appearance.ScaleZEnabled = False
  Dim bCopy As Boolean = False
  While True
    dc.SetBaseGumball(base_gumball, appearance)
    dc.Enabled = True
    Dim gp As New GetGumballXform(dc)
    Dim copy_optindx As Integer = gp.AddOption("Copy")
    If dc.PreTransform = Transform.Identity Then
      gp.SetCommandPrompt("Drag gumball")
      gp.SetCommandPrompt("Drag gumball. Press Enter when done")
    End If
    dc.Enabled = False
    cmdrc = gp.CommandResult()
    If cmdrc <> Rhino.Commands.Result.Success Then Exit While
    Dim getpoint_result = gp.Result()
    If getpoint_result = Rhino.Input.GetResult.Point Then
      If Not dc.InRelocate Then
        Dim xform As Transform = dc.TotalTransform
        dc.PreTransform = xform
      End If
      ' update location of base gumball
      Dim gbframe = dc.Gumball.Frame
      Dim baseFrame = base_gumball.Frame
      baseFrame.Plane = gbframe.Plane
      baseFrame.ScaleGripDistance = gbframe.ScaleGripDistance
      base_gumball.Frame = baseFrame
      Continue While
    End If
    If getpoint_result = Rhino.Input.GetResult.Option Then
      If gp.OptionIndex() = copy_optindx Then
        bCopy = True
      End If
      Continue While
    End If
    Exit While
  End While
  dc.Enabled = False
  If dc.PreTransform <> Transform.Identity Then
    Dim xform As Transform = dc.PreTransform
    TransformObjects(list, xform, bCopy, bCopy)
  End If
  Return cmdrc
End Function
developer/rhinocommonsamples/gumball.txt ยท Last modified: 2020/08/14 (external edit)