Hi,
To list all block definitions (and their attribute definitions):
Code:
[CommandMethod("ListBlockDefinitions")]
public void ListBlockDefinitions()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
using (var tr = db.TransactionManager.StartTransaction())
{
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
foreach (ObjectId id in bt)
{
var btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead);
if (!(btr.IsLayout || btr.IsAnonymous || btr.IsFromExternalReference || btr.IsFromOverlayReference))
{
ed.WriteMessage($"\n{btr.Name}");
if (btr.HasAttributeDefinitions)
{
foreach (ObjectId attId in btr)
{
if (attId.ObjectClass.Name == "AcDbAttributeDefinition")
{
var attDef = (AttributeDefinition)tr.GetObject(attId, OpenMode.ForRead);
ed.WriteMessage($"\n\t{attDef.Tag}");
}
}
}
}
}
tr.Commit();
}
}
To list all block references (an their attribute references):
Code:
[CommandMethod("ListBlockReferences")]
public void ListBlockReferences()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
using (var tr = db.TransactionManager.StartTransaction())
{
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
foreach (ObjectId id in bt)
{
var btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead);
if (!(btr.IsLayout || btr.IsAnonymous || btr.IsFromExternalReference || btr.IsFromOverlayReference))
{
foreach (ObjectId brId in btr.GetBlockReferenceIds(true, true))
{
var br = (BlockReference)tr.GetObject(brId, OpenMode.ForRead);
ed.WriteMessage($"\n{br.Name}");
foreach (ObjectId attId in br.AttributeCollection)
{
var attRef = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead);
ed.WriteMessage($"\n\t{attRef.Tag} = {attRef.TextString}");
}
}
if (btr.IsDynamicBlock)
{
foreach (ObjectId btrId in btr.GetAnonymousBlockIds())
{
var anonymousBtr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
foreach (ObjectId brId in anonymousBtr.GetBlockReferenceIds(true, true))
{
var br = (BlockReference)tr.GetObject(brId, OpenMode.ForRead);
ed.WriteMessage($"\n{btr.Name} ({anonymousBtr.Name})");
foreach (ObjectId attId in br.AttributeCollection)
{
var attRef = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead);
ed.WriteMessage($"\n\t{attRef.Tag} = {attRef.TextString}");
}
}
}
}
}
}
tr.Commit();
}
}