Order of objects inside a group

Hi,

Is there a reason why objects inside a group are reversed ?


  private void RunScript(object x, object y, object z, object u, ref object A)
  {
    string[] names = Rhino.RhinoDoc.ActiveDoc.Groups.GroupNames(true);

    DataTree<GeometryBase> dt = new DataTree<GeometryBase>();

    foreach(var name in names){
      if (name.Contains("nest_geo_")){

        Rhino.DocObjects.Group g = Rhino.RhinoDoc.ActiveDoc.Groups.FindName(name);
        Rhino.DocObjects.RhinoObject[] objects = Rhino.RhinoDoc.ActiveDoc.Groups.GroupMembers(g.Index);

//reverse here
        objects = objects.Reverse().ToArray();

        var path = new GH_Path(dt.Paths.Count);
        foreach(var o in objects)
         dt.Add(o.Geometry, path);

      }
    }

    A = dt;
  }

Rhino object are stored, internally, in a linked list.

GroupMembers simply traverses the linked list looking for objects that are members of the specified group.

If you expect group members to be in some particular order, then you might consider storing some user data, perhaps a sort index, on the object.

– Dale

1 Like

How you can store additional data like integer index in a rhinoobject?

You can use the GeometryBase.UserDictionary.

Does this python example help?

def get_geometry_dict_key(geom, key):
    """
    retrieve stored objects from geometry

    Args:
        geom (Rhino.GeometryBase) : geometry t get data from
        key (str) : key to read from geom
    Returns:
        object stored as key on geometry
        or  None when key not present

    retrieving keys:
    # for d_key in udict:
        if d_key.Key == get_key:
            result.append(d_key.Value)
    # removing keys: udict.Remove(key)
    """

    for KV in geom.UserDictionary:
        if KV.Key == key:
            # better to return (shallow) duplicate to prevent unintended altering of stored geometry or values
            return KV.Value


def set_geometry_dict(container_geom, store_dict):
    """
    store key-item pairs on container geometry
    Args:
        container_geom (Rhino.GeometryBase) : key,value pairs to store on geometry
        store_dict (dict) : key,value pairs to store onto container_geom
    Returns:
        None
    """
    udict = container_geom.UserDictionary
    for key, value in store_dict.items():
        # better to store (shallow) duplicate to prevent unintended altering of input geometry values
        udict.Set(key, value)