algorithmic modeling for Rhino
Hello there,
I’m trying to pass an array of object arrays which contain different data types between two grasshopper components. Not sure if I should be doing this at all, but I thought I'd try!
COMPONENT 1: - the user inputs a line (curve) and a length (double). It stores the start point of the curve and the length in an object[]
Input parameters:
pManager.Register_CurveParam( "Line", "Line", "Line to get start point of"); pManager.Register_DoubleParam("Length", "Line Length", "Length of Line to pass on");
Output parameters:
pManager.Register_GenericParam("Object", "Object", "mixed objects"); //insert output patameters
SolveInstance:
object[] objectArray = new object[2];
Rhino.Geometry.Curve line = null;
DA.GetData(0, ref line);
double length = 0;
DA.GetData(1, ref length);
objectArray [0] = line.PointAt(0.0);
objectArray [1] = length;
DA.SetData(0, objectArray);
So far so good (?). When I try to receive it in the next component down the line, I try the following:
COMPONENT2: Tries to read the object[] imported in the first component, and export the object[] as well as the length property in object[1]
Input parameters:
pManager.Register_GenericParam("objects", "objects in", "objects to process", GH_ParamAccess.list);
Output parameters:
pManager.Register_GenericParam("objects", "objects", "objects ");
pManager.Register_DoubleParam("object property", "object property", "object length");
SolveInstance:
List<object[]> objects = new List<object[]>();
DA.GetDataList(0, objects);
DA.SetData(0, objects);
DA.SetData(1, objects[0][1]);
In the output, I get the error “Invalid cast: ObjectWrapper >> Object[]”. I guess this has to do with GH_Goo wrapping the "object[]" into an "object" when exporting from the first component?
I also tried taking the "object[]" arrays in as "objects", which removes the error, but then I cannot apply the indexing I require to access the length property anymore…
I’m not sure if that’s at all the way to go about passing this kind of information between components. I looked at creating my own parameters following David's instructions in the SDK (is this the way this should be done?), but got very stuck when I tried to include multiple types (or arrays).
Any ideas or pointers on how I could pass multiple-type info on without needing multiple wires or converting everything to the same type (might not be possible) first?
Thanks for any help, and Merry Christmas,
Daniel
Tags:
Hi Daniel,
Hope this helps.
Regards,
Sridevi
hmm, thanks Sridevi, but I'm not sure this solves my issue. Does it work with you?
I can't even use .ElementAt(i) as you suggested to retrieve the "objects" item. "objects[i]" doesn't work either. I'll keep on playing around with it, perhaps I'll find a way!
Thanks again! Dan
That's odd. The code works for me. What if you try using the foreach loop? Something along the lines of ->
int index = 0;
foreach(object output in objects)
{
DA.SetData(index, output);
index++;
}
may try List instead of arrays.. much more easy to work with.....
and make you own class.... you have to provide the class in both components
public class line_and_length_para
{
public int;
public Line;
}
this you simply have to cast in the second component...
line_and_length_para my_para = (line_and_length_para) object;
and you have perfect access
thanks for your help, both of two!
I tried lists and classes, foreach's and the behaviour you describe was what I was hoping for, but it seems I'm getting issues with grasshopper wrapping the objects or list of objects in a
Grasshopper.Kernel.Types.GH_ObjectWrapper
type when I pass it in and out of components. From this type I cannot cast to my custom object.
If I understand correctly, David Rutten talks about this in the SDK examples section when describing custom data types. I think I might have to write my own CastTo-function when specifying my class, which seems complicated if I have more than one .Value (of different types).
I'm currently trying to write a class which holds a list of objects as .Value, but as you might have guessed I'm not exactly the world expert in writing code ;-)
Michael, have you ever tried your way of passing a class from one component to another? Don't you get the "Invalid cast: Grasshopper.Kernel.Types.GH_ObjectWrapper >> custom type" error?
I'll keep on trying and keep you posted, I know there's a way somehow!
Dan
Welcome to
Grasshopper
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
© 2024 Created by Scott Davidson. Powered by