Site Tools


How To: Move Objects to the Current Layer

C++, .NET

Summary: Discusses how to iterate through the Rhino geometry table and modify the layer of selected objects.
NOTICE: The Rhino.NET SDK is deprecated in Rhino 5. This example adapted for the new RhinoCommon SDK is here

The Rhino SDK provides an object iterator class, CRhinoObjectIterator, that allows you to walk through every object in the geometry table. This class makes it easy to perform operations on Rhino object without user intervention.

Example

The following is an example of how to iterate through the geometry table, filtering on only selected objects. The proper method for modifying an object's layer is also demonstrated.

C++

CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
  // Get the current layer index
  const CRhinoLayerTable& layer_table = context.m_doc.m_layer_table;
  int layer_index = layer_table.CurrentLayerIndex();
 
  // Create an object iterator that filters on selected,
  // non-light objects in the current document only
  CRhinoObjectIterator it( CRhinoObjectIterator::normal_objects,
                           CRhinoObjectIterator::active_objects  );
  it.EnableSelectedFilter( TRUE );
  it.IncludeLights( FALSE );
  CRhinoObject* obj = NULL;
  int count = 0;
 
  // Walk the geometry table
  for( obj = it.First(); obj; obj = it.Next() )
  {
    // Ignore select objects that are already on the current layer
    if( obj->Attributes().m_layer_index == layer_index )
      continue;
    // Copy the object's attributes and set the new layer index
    CRhinoObjectAttributes atts( obj->Attributes() );
    atts.m_layer_index = layer_index;
    // Modify the object's attributes
    CRhinoObjRef ref(obj);
    if( context.m_doc.ModifyObjectAttributes(ref, atts) )
      count++;
  }
  if( count > 0 )
    context.m_doc.Redraw();
 return CRhinoCommand::success;
}

VB.NET

Public Overrides Function RunCommand(ByVal context As IRhinoCommandContext) _
  As IRhinoCommand.result
 
  ' Get the current layer index
  Dim layer_table As IRhinoLayerTable = context.m_doc.m_layer_table
  Dim layer_index As Integer = layer_table.CurrentLayerIndex()
 
  ' Create an object iterator that filters on selected,
  ' non-light objects in the current document only
  Dim it As New MRhinoObjectIterator( _
                  IRhinoObjectIterator.object_state.normal_objects,_
                  IRhinoObjectIterator.object_category.active_objects)
  it.EnableSelectedFilter(True)
  it.IncludeLights(False)
 
  Dim count As Integer = 0
  ' Walk the geometry table
  For Each obj As MRhinoObject In it
    ' Ignore select objects that are already on the current layer
    If (obj.Attributes().m_layer_index = layer_index) Then Continue For
 
    ' Copy the object's attributes and set the new layer index
    Dim atts As New MRhinoObjectAttributes(obj.Attributes())
    atts.m_layer_index = layer_index
    ' Modify the object's attributes
    Dim objref As New MRhinoObjRef(obj.Attributes.m_uuid)
    If (context.m_doc.ModifyObjectAttributes(objref, atts)) Then
      count = count + 1
    End If
  Next
 
  If (count > 0) Then context.m_doc.Redraw()
  Return IRhinoCommand.result.success
End Function

C#

public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
{
  MRhinoDoc doc = RhUtil.RhinoApp().ActiveDoc();
  // Get the current layer index
  IRhinoLayerTable layer_table = doc.m_layer_table;
  int layer_index = layer_table.CurrentLayerIndex();
 
  // Create an object iterator that filters on selected,
  // non-light objects in the current document only
  MRhinoObjectIterator it =
      new MRhinoObjectIterator(IRhinoObjectIterator.object_state.normal_objects,
                               IRhinoObjectIterator.object_category.active_objects);
  it.EnableSelectedFilter(true);
  it.IncludeLights(false);
 
  int count = 0;
  // Walk the geometry table
  for (MRhinoObject obj = it.First(); obj != null; obj = it.Next())
  {
    // Ignore select objects that are already on the current layer
    if( obj.Attributes().m_layer_index == layer_index )
      continue;
 
    // Copy the object's attributes and set the new layer index
    MRhinoObjectAttributes atts = new MRhinoObjectAttributes(obj.Attributes());
    atts.m_layer_index = layer_index;
    // Modify the object's attributes
    MRhinoObjRef objref = new MRhinoObjRef(obj.Attributes().m_uuid);
    if( doc.ModifyObjectAttributes( objref, atts))
      count ++;
  }
  if (count > 0)
    doc.Redraw();
  return IRhinoCommand.result.success;
}
developer/sdksamples/moveobjectstocurrentlayer.txt ยท Last modified: 2014/01/23 (external edit)