Try to replace your GetBRefIds method with the following one.
C#
public ObjectIdCollection GetBRefIDs(Database db, string blkName)
{
var ids = new ObjectIdCollection();
using (var tr = db.TransactionManager.StartOpenCloseTransaction())
{
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
if (!bt.Has(blkName))
return null;
var btr = (BlockTableRecord)tr.GetObject(bt[blkName], OpenMode.ForRead);
GetReferencesInSpaces(btr, tr, ids);
if (btr.IsDynamicBlock)
{
foreach (ObjectId btrId in btr.GetAnonymousBlockIds())
{
var anonymousBtr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
GetReferencesInSpaces(anonymousBtr, tr, ids);
}
}
tr.Commit();
}
return ids;
}
private void GetReferencesInSpaces(BlockTableRecord btr, Transaction tr, ObjectIdCollection ids)
{
foreach (ObjectId brId in btr.GetBlockReferenceIds(true, true))
{
var br = (BlockReference)tr.GetObject(brId, OpenMode.ForRead);
var owner = (BlockTableRecord)tr.GetObject(br.OwnerId, OpenMode.ForRead);
if (owner.IsLayout)
ids.Add(br.ObjectId);
}
}
VB (converted with telerik, not tested)
Public Function GetBRefIDs(ByVal db As Database, ByVal blkName As String) As ObjectIdCollection
Dim ids = New ObjectIdCollection()
Using tr = db.TransactionManager.StartOpenCloseTransaction()
Dim bt = CType(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
If Not bt.Has(blkName) Then Return Nothing
Dim btr = CType(tr.GetObject(bt(blkName), OpenMode.ForRead), BlockTableRecord)
GetReferencesInSpaces(btr, tr, ids)
If btr.IsDynamicBlock Then
For Each btrId As ObjectId In btr.GetAnonymousBlockIds()
Dim anonymousBtr = CType(tr.GetObject(btrId, OpenMode.ForRead), BlockTableRecord)
GetReferencesInSpaces(anonymousBtr, tr, ids)
Next
End If
tr.Commit()
End Using
Return ids
End Function
Private Sub GetReferencesInSpaces(ByVal btr As BlockTableRecord, ByVal tr As Transaction, ByVal ids As ObjectIdCollection)
For Each brId As ObjectId In btr.GetBlockReferenceIds(True, True)
Dim br = CType(tr.GetObject(brId, OpenMode.ForRead), BlockReference)
Dim owner = CType(tr.GetObject(br.OwnerId, OpenMode.ForRead), BlockTableRecord)
If owner.IsLayout Then ids.Add(br.ObjectId)
Next
End Sub
'=======================================================
'Service provided by Telerik (www.telerik.com)
'Conversion powered by Refactoring Essentials.
'Twitter: @telerik
'Facebook: facebook.com/telerik
'=======================================================