Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

developer:sdksamples:moveobjectstocurrentlayer [2015/09/14] (current)
Line 1: Line 1:
 +====== 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 [[developer:​rhinocommonsamples:​moveobjectstocurrentlayer|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++ =====
 +<code 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;​
 +}
 +</​code>​
 +===== VB.NET =====
 +<code vb>
 +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
 +</​code>​
 +===== C# =====
 +<code 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;​
 +}
 +
 +</​code>​
 +
 +
 +{{tag>​Developer cplusplus dotnet}}
  
developer/sdksamples/moveobjectstocurrentlayer.txt ยท Last modified: 2015/09/14 (external edit)