Replace Object Hatch Pattern

Demonstrates how to replace a Hatch Object's pattern.

C/C++

CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
  CRhinoGetObject go;
  go.SetCommandPrompt( L"Select hatches to replace pattern" );
  go.SetGeometryFilter( CRhinoGetObject::hatch_object );
  go.GetObjects( 1, 0 );
  if( go.CommandResult() != success )
    return go.CommandResult();

  CRhinoGetString gs;
  gs.SetCommandPrompt( L"Name of replacement hatch pattern" );
  gs.GetString();
  if( gs.CommandResult() != success )
    return gs.CommandResult();

  ON_wString pattern_name = gs.String();
  pattern_name.TrimLeftAndRight();
  if( pattern_name.IsEmpty() )
    return nothing;

  int hatch_index = context.m_doc.m_hatchpattern_table.FindHatchPattern( pattern_name );
  if( hatch_index < 0 )
  {
    RhinoApp().Print( L"Specified hatch pattern not found in the document.\n" );
    return nothing;
  }

  int i, replaced = 0;
  for( i = 0; i < go.ObjectCount(); i++ )
  {
    const CRhinoHatch* hatch_obj = CRhinoHatch::Cast( go.Object(i).Object() );
    if( 0 == hatch_obj )
      continue;

    if( hatch_index == hatch_obj->PatternIndex() )
      continue;

    const ON_Hatch* hatch = hatch_obj->Hatch();
    if( 0 == hatch )
      continue;

    ON_Hatch* dup_hatch = hatch->DuplicateHatch();
    if( 0 == dup_hatch )
      continue;

    dup_hatch->SetPatternIndex( hatch_index );

    CRhinoHatch* dup_obj = hatch_obj->Duplicate();
    if( 0 == dup_obj )
    {
      delete dup_hatch;
      continue;
    }

    dup_obj->SetHatch( dup_hatch );
    if( !context.m_doc.ReplaceObject(CRhinoObjRef(hatch_obj), dup_obj) )
    {
      delete dup_obj;
      continue;
    }

    replaced++;
  }

  if( replaced > 0 )
  {
    context.m_doc.Redraw();
    if( 1 == replaced )
      RhinoApp().Print( L"1 hatch pattern replaced.\n" );
    else
      RhinoApp().Print( L"%d hatch patterns replaced.\n", replaced );
  }
  else
    RhinoApp().Print( L"0 hatch patterns replaced.\n" );

  return success;
}