How to create a generic, mixed list of geometry within a Grasshopper component, and send it to a single output:
class GeometryBuilder { //constructor public GeometryBuilder() { //... } //property - declare our geometry list here private List<Rhino.Geometry.GeometryBase> geom = new List<Rhino.Geometry.GeometryBase>(); public List<Rhino.Geometry.GeometryBase> Geom { get { return geom; } set { geom = value; }} //methods public BuildGeometry() { //add a line //lines don't inherit from GeometryBase, so we can't cast it to be in // our Geom list, but we can convert it to a NurbsCurve, which does. Rhino.Geometry.Line ln = new Line(new Point3d(0,0,0), new Point3d(1,1,0)); Geom.Add((GeometryBase)(ln.ToNurbsCurve())); //Meshes DO inherit from GeometryBase, so we can add them to Geom directly Rhino.Geometry.Mesh msh = someOtherMesh; Geom.Add((GeometryBase)msh); //Generally, things within Rhino.Geometry that are classes can be cast to GeometryBase. //Things which are structs can not, though there is usually a sensible way to convert them. //Point3d is a struct, so we can't cast it to GeometryBase. //The Rhino Point is a class, and it contains a constructor converting from Point3d Rhino.Geometry.Point3d pt3d = new Point3d(5,2,0); Rhino.Geometry.Point pt = new Point(pt3d); Geom.Add((GeometryBase)pt); } } class GrasshopperComponent : GH_Component { //constructors etc... //... //set inputs //... //set outputs protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager) { //our output is created using the 'AddGeometryParameter' method. Remember to set 'access' to 'list'. pManager.AddGeometryParameter("My Geometry","my geom","This is a list of generic geometry", GH_ParamAccess.list); } protected override void SolveInstance(IGH_DataAccess DA) { //generate our list of geometry from the class we made var GeometryBuilder gb = new GeometryBuilder(); gb.BuildGeometry(); //the geometry is now saved within the Geom property of our gb instance of GeometryBuilder. //All we need to do now is send the geometry to the Grasshopper output DA.SetDataList(0, gb.Geom); } }