Working with arrays/list with C# components in Gra

2019-08-24 05:00发布

New user of Grasshopper 3D here, and I am in need of some C# syntax help for coding in Grasshopper 3D. I have a script, for example, that's pasted below:

public static int arraySum(int[] myArray){
    int someValue = 0;
    for(int i = 0; i < myArray.Length; i++){
       someValue += myArray[i];
    }
    return someValue;
}

The above static method sums all values of an array.

From my understanding of the scripting components of C# in Grasshopper, you cannot create static methods, as everything is a non-returning void method. You assign a variable (the output) as a psuedo-return, is that correct?

Knowing that - how do I implement my above script, for example, to a C# component?

Instead of having a "return", I simply assigned a variable, for example, A as the sum. But I ran into some issues there, for example, with some C# methods like .Length not working.

The format of a method in the C# component of Grasshopper 3D is the following:

private void RunScript(int x, ref object A){
}

1条回答
神经病院院长
2楼-- · 2019-08-24 05:25

This is a pretty old question, but I will go ahead and complete it for completion's sake. In any GH Scripting component there are two zones to write code. In the image you see the private method RunScript and the other area in // <Custom Additional Code> enter image description here

So I could write your code within the RunScript method like this:

 private void RunScript(List<int> myArray, ref object A)
 {

    int someValue = 0;
    for(int i = 0; i < myArray.Count; i++){
      someValue += myArray[i];
    }

    A = someValue;

 }

Notice that I redefined myArray as a list of type int like on the script component input: enter image description here

Since it is a list, I use myArray.Count in the loop. Finally I use A = someValue to get the result in the output of the component.

I could also write the method in the // <Custom additional code> area as such:

  private void RunScript(List<int> myArray, ref object A)
  {

    A = arraySum(myArray.ToArray());

  }

  // <Custom additional code> 

  public static int arraySum(int[] myArray){
    int someValue = 0;
    for(int i = 0; i < myArray.Length; i++){
      someValue += myArray[i];
    }
    return someValue;
  }

  // </Custom additional code>

Which looks like this: enter image description here

I change the incomming myArray.ToArray() since it comes in as a list to the component. In this second manner, your original code is pretty much the same.

Hope this helps answer an old question!

查看更多
登录 后发表回答