Table of Contents
Replacing a Hatch Object's Pattern
C++, .NET
Summary: Demonstrates 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; }