Trying to write/adapt a counter that stops at an inputed range

Hello,

I am trying out adapting the C# timer component written by @Petras_Vestartas to end at a defined range. I am hoping to use it to queue files for simulation into my grasshopper script so it counts down a list of data files and sends them one by one into Honeybee.
This is my attempt so far. Unfortuantely I am a complete novice at C# and am still making progress on the video tutorials by ICD.

Essentially I have been trying to incorporate a for statement into the original timer component. But I must be misundertsanding something fundamental about how the for statement works as it only output the last numberwhen I run the counter…

Any help would be greatly apprecaited.

using System;
using System.Collections;
using System.Collections.Generic;

using Rhino;
using Rhino.Geometry;

using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;

using System.IO;
using System.Linq;
using System.Data;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
using System.Runtime.InteropServices;

using Rhino.DocObjects;
using Rhino.Collections;
using GH_IO;
using GH_IO.Serialization;

/// <summary>
/// This class will be instantiated on demand by the Script component.
/// </summary>
public class Script_Instance : GH_ScriptInstance
{
#region Utility functions
  /// <summary>Print a String to the [Out] Parameter of the Script component.</summary>
  /// <param name="text">String to print.</param>
  private void Print(string text) { /* Implementation hidden. */ }
  /// <summary>Print a formatted String to the [Out] Parameter of the Script component.</summary>
  /// <param name="format">String format.</param>
  /// <param name="args">Formatting parameters.</param>
  private void Print(string format, params object[] args) { /* Implementation hidden. */ }
  /// <summary>Print useful information about an object instance to the [Out] Parameter of the Script component. </summary>
  /// <param name="obj">Object instance to parse.</param>
  private void Reflect(object obj) { /* Implementation hidden. */ }
  /// <summary>Print the signatures of all the overloads of a specific method to the [Out] Parameter of the Script component. </summary>
  /// <param name="obj">Object instance to parse.</param>
  private void Reflect(object obj, string method_name) { /* Implementation hidden. */ }
#endregion

#region Members
  /// <summary>Gets the current Rhino document.</summary>
  private readonly RhinoDoc RhinoDocument;
  /// <summary>Gets the Grasshopper document that owns this script.</summary>
  private readonly GH_Document GrasshopperDocument;
  /// <summary>Gets the Grasshopper script component that owns this script.</summary>
  private readonly IGH_Component Component;
  /// <summary>
  /// Gets the current iteration count. The first call to RunScript() is associated with Iteration==0.
  /// Any subsequent call within the same solution will increment the Iteration count.
  /// </summary>
  private readonly int Iteration;
#endregion

  /// <summary>
  /// This procedure contains the user code. Input parameters are provided as regular arguments,
  /// Output parameters as ref arguments. You don't have to assign output parameters,
  /// they will have a default value.
  /// </summary>
  private void RunScript(double x, bool reset, bool run, ref object A)
  {

    Component.Message = "Timer";

    if (reset)
    {
      n = 0;
    }
    else if(run)
    {
      for ( n = 0; n < x; n++);
    }

    A = n;
  }

  // <Custom additional code> 
  int n = 0;
  // </Custom additional code> 
}

I thought it might also be because I am calling out n outside the for loop but calling

A = n;

inside the for loop gives the same results

  {

    Component.Message = "Timer";

    if (reset)
    {
      n = 0;
    }
    else if(run)
    {
      for (n = 0; n <= x; n++)
      {
        A = n;
      }
    }


  }

  // <Custom additional code> 
  int n = 0;
  // </Custom additional code> 
}

To recompute on non compiled components in C# editor you need to write this.Component.ExpireSolution(true)

Hi Petras,

Thank you for the super quick reply.
I tried including the statement you provided but I’m not sure if I’ve put it in the right place yet.
Unfortunately, it is still only providing me with whatever integer I input as x when I start the counter.

  {
    Component.Message = "Timer";


    if (reset)
    {
      n = 0;
    }
    else if(run)
    {
      for (n = 0; n <= x; n++)
      {
        A = n;
      }
    }

    this.Component.ExpireSolution(true);
  }

  // <Custom additional code> 
  int n = 0;
  // </Custom additional code> 
}
private void RunScript(bool reset, bool run, int x, ref object A)
{
    Component.Message = "Timer";
    if (reset)
        n = 0;
    else if(run && n < x)
   {
      n++;
      this.Component.ExpireSolution(true);
   }
   A = n;
 }

  // <Custom additional code> 
  int n = 0;
  // </Custom additional code> 


Kim.gh (13.6 KB)

That works great!
there’s just a minor problem with it not quite responding to the timer component but it should work great for what I have in mind.