Unable to Enter a Number as a String

I am trying to make a command line options menu for my plugin. I want to input in a string, as well as have 3 options, 2 boolean and 1 double. Everything works, except for when I input a plain number, like “12”. What that does is change the double value to 12, which I don’t want; I want “12” to be the inputted string. However, if I added another double option to the command bar, and input “12”, the code executes fine.

My code snippet:

        Rhino.Input.Custom.GetString getStr = new Rhino.Input.Custom.GetString();
        getStr.SetCommandPrompt("Expression");
        getStr.AcceptNumber(true, true);
        var leIndex = getStr.AddOption("Last_Expression");
        getStr.AddOptionDouble("Accuracy", ref accuracy);
        //getStr.AddOptionDouble("AccuracyB", ref accuracyb);
        getStr.AddOptionToggle("Curves", ref showCurves);

How can I get the code to be able to pass in a number (“12”) while having only one double option?

Remove the “AcceptNumber” statement.

protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
  var string_value = "12";
  var bool_a_value = false;
  var bool_b_value = true;
  var double_value = 1.0;

  var bool_a_option = new OptionToggle(bool_a_value, "No", "Yes");
  var bool_b_option = new OptionToggle(bool_b_value, "No", "Yes");
  var double_option = new OptionDouble(double_value, 1.0, 100.0);

  var gs = new GetString();
  gs.SetCommandPrompt("Enter a string");
  gs.SetDefaultString(string_value);
  gs.AcceptNothing(true);
  var bool_a_index = gs.AddOptionToggle("BooleanA", ref bool_a_option);
  var bool_b_index = gs.AddOptionToggle("BooleanB", ref bool_b_option);
  var double_index = gs.AddOptionDouble("Double", ref double_option);
  for (;;)
  {
    var rc = gs.Get();
        
    if (rc == GetResult.Option)
    {
      var index = gs.OptionIndex();
      if (index == bool_a_index)
        bool_a_value = bool_a_option.CurrentValue;
      else if (index == bool_b_index)
        bool_b_value = bool_b_option.CurrentValue;
      else // if (index == double_index)
        double_value = double_option.CurrentValue;
      continue;
    }

    if (rc != GetResult.String && rc != GetResult.Nothing)
    {
      return Result.Cancel;
    }

    break;
  }

  string_value = gs.StringResult();

  RhinoApp.WriteLine("String value = {0}", string_value);
  RhinoApp.WriteLine("Boolean A value = {0}", bool_a_value);
  RhinoApp.WriteLine("Boolean B value = {0}", bool_b_value);
  RhinoApp.WriteLine("Double value = {0}", double_value);
      
  return Result.Success;
}

Hello Dale,

I removed the “AcceptNumber” statement, and now my code looks like this:

        getStr.ClearCommandOptions(); //I need this because I set up a command bar menu before this one
        getStr.SetCommandPrompt("Expression");
        //getStr.AcceptNumber(true, true);
        //getStr.SetDefaultString("12");
        var leIndex = getStr.AddOption("Last_Expression");
        getStr.AddOptionDouble("Accuracy", ref accuracy);
        //getStr.AddOptionDouble("AccuracyB", ref accuracyb);
        getStr.AddOptionToggle("Curves", ref showCurves);

But I’m still getting getting the same result. If this helps, the code after it looks like this:

        while (true)
        {
            // perform the get operation. This will prompt the user to input a string, but also
            // allow for command line options defined above

            if (!lastExpression)
            {
                get_rc = getStr.GetLiteralString();
                RhinoApp.WriteLine("getStr.StringResult(): {0}", getStr.StringResult().ToLower().Replace(" ", "").Trim());
            }
            if (getStr.CommandResult() != Rhino.Commands.Result.Success)
            {
                return getStr.CommandResult();
            }
            
            if (get_rc == Rhino.Input.GetResult.String || lastExpression)
            {
                RhinoApp.WriteLine("HERE");
            }
            else if (get_rc == Rhino.Input.GetResult.Option)
            {
                if (getStr.OptionIndex() == leIndex)
                {
                    RhinoApp.WriteLine("Previous Equation: {0}", savedLastExpression);
                }

                continue;
            }

            break;
        }

I can enter letters, characters, and numbers all in the same string, but I just can’t put numbers by themselves.

Ah, OK, try this:

protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
  var string_value = "12";
  var bool_a_value = false;
  var bool_b_value = true;
  var double_value = 1.0;

  var bool_a_option = new OptionToggle(bool_a_value, "No", "Yes");
  var bool_b_option = new OptionToggle(bool_b_value, "No", "Yes");
  var double_option = new OptionDouble(double_value, 1.0, 100.0);

  var gs = new GetString();
  gs.SetCommandPrompt("Enter a string");
  gs.SetDefaultString(string_value);
  gs.AcceptNumber(true, true);
  gs.AcceptNothing(true);
  var bool_a_index = gs.AddOptionToggle("BooleanA", ref bool_a_option);
  var bool_b_index = gs.AddOptionToggle("BooleanB", ref bool_b_option);
  var double_index = gs.AddOptionDouble("Double", ref double_option);
  for (; ; )
  {
    var rc = gs.Get();

    if (rc == GetResult.Option)
    {
      var index = gs.OptionIndex();
      if (index == bool_a_index)
        bool_a_value = bool_a_option.CurrentValue;
      else if (index == bool_b_index)
        bool_b_value = bool_b_option.CurrentValue;
      else // if (index == double_index)
        double_value = double_option.CurrentValue;
      continue;
    }

    if (rc == GetResult.Number)
    {
      var value = gs.Number();
      string_value = value.ToString();
      break;
    }

    if (rc != GetResult.String && rc != GetResult.Nothing)
    {
      return Result.Cancel;
    }

    string_value = gs.StringResult();
    break;
  }

  RhinoApp.WriteLine("String value = {0}", string_value);
  RhinoApp.WriteLine("Boolean A value = {0}", bool_a_value);
  RhinoApp.WriteLine("Boolean B value = {0}", bool_b_value);
  RhinoApp.WriteLine("Double value = {0}", double_value);

  return Result.Success;
}

I just wanted to quickly thank you, ever since I got ready for school and started other projects I forgot about the one I was currently working on. Your help was very valuable and was able to enter a number perfectly after I figured out the issue.