Sdk Replace Hatch Pattern
Last changed: dale@mcneel.com-204.177.179.113

.
DeveloperC++, .NET
SummaryDemonstrates how to replace a Hatch Object's pattern using the Rhino SDK.

Question

Is it possible to replace the pattern of existing hatch objects without just deleting them and rehatching?

Answer

Yes it is possible. The following code demonstrates this:

  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;
  }