After extensive research, I was finally able to solve the problem. The magic word is EvaluateHatch.
/// <summary>
///
/// Re-evaluates all <see cref="Hatch"/> objects that belong to the block definition
/// used by the given block reference, and marks the reference graphics as modified (regen).
///
/// </summary>
///
/// <param name="blockRefId">
///
/// ObjectId of the <see cref="BlockReference"/> to refresh.
///
/// </param>
public static void
ReevaluateHatchesInBlock ( ObjectId blockRefId )
{
if ( blockRefId.IsNull || blockRefId.IsErased || !blockRefId.IsValid )
{
return;
}
var db = blockRefId.Database;
using ( var tr = db.TransactionManager.StartTransaction() )
{
var br = tr.GetObject ( blockRefId, OpenMode.ForRead, false ) as BlockReference;
if ( br == null || br.IsErased )
{
tr.Abort();
return;
}
var btr = tr.GetObject(br.BlockTableRecord, OpenMode.ForRead, false) as BlockTableRecord;
if ( btr != null && !btr.IsErased )
{
foreach (ObjectId entId in btr)
{
var hatch = tr.GetObject(entId, OpenMode.ForRead, false) as Hatch;
if (hatch != null && !hatch.IsErased)
{
// Open in write mode to run EvaluateHatch
hatch.UpgradeOpen ( );
hatch.EvaluateHatch ( true );
}
}
}
// Refresh the display of the BlockReference
br.UpgradeOpen ( );
br.RecordGraphicsModified ( true );
// br.Draw();
tr.Commit();
}
}