algorithmic modeling for Rhino
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
pManager.Register_CurveParam( "Line", "Line", "Line to get start point of"); pManager.Register_DoubleParam("Length", "Line Length", "Length of Line to pass on");
pManager.Register_GenericParam("Object", "Object", "mixed objects"); //insert output patameters
object objectArray = new object;
Rhino.Geometry.Curve line = null;
DA.GetData(0, ref line);
double length = 0;
DA.GetData(1, ref length);
objectArray  = line.PointAt(0.0);
objectArray  = length;
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
pManager.Register_GenericParam("objects", "objects in", "objects to process", GH_ParamAccess.list);
pManager.Register_GenericParam("objects", "objects", "objects ");
pManager.Register_DoubleParam("object property", "object property", "object length");
List<object> objects = new List<object>();
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,
Hope this helps.
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)
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
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
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!