private static void AccessGlobalFromFile(
GlobalBlocksAccessor action, // метод обработки блока
string blockName = "",
string autoCADFilePath = "",
bool manyblocks = true,
bool dynamicOnly = false,
bool attributesAndParametrsMust = false)
{
Document doc = Application.DocumentManager.MdiActiveDocument;
if (doc == null) return;
Editor ed = doc.Editor;
using (Database db = new Database(false, true))
{
db.ReadDwgFile(autoCADFilePath, FileOpenMode.OpenForReadAndWriteNoShare, false, "");
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable blocktable = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); // получаем таблицу блоков и проходим по всем записям таблицы блоков
foreach (ObjectId btrId in blocktable)
{
BlockTableRecord blockTableRecord = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);// получаем запись таблицы блоков и смотрим анонимная ли она
if (!dynamicOnly || blockTableRecord.IsDynamicBlock)
if (string.IsNullOrWhiteSpace(blockName) || blockTableRecord.Name == blockName)
{
ObjectIdCollection anonymousIds = blockTableRecord.GetAnonymousBlockIds();// получаем все анонимные блоки динамического блока
foreach (ObjectId anonymousBtrId in anonymousIds)
{
BlockTableRecord anonymousBtr = (BlockTableRecord)tr.GetObject(anonymousBtrId, OpenMode.ForRead);// получаем анонимный блок
ObjectIdCollection blocksCollection = anonymousBtr.GetBlockReferenceIds(true, true);// получаем все вставки этого блока
var attributeRefCollection = new List<AttributeReference>();
DynamicBlockReferencePropertyCollection parametrsRefCollection = null;
BlockReference blockReference = null;
if (attributesAndParametrsMust)
{
foreach (ObjectId entId in blocksCollection)
{
if (tr.GetObject(entId, OpenMode.ForRead) is Entity ent)
{
blockReference = ent as BlockReference;
if (blockReference != null)
{
BlockTableRecord bd = (BlockTableRecord)tr.GetObject(blockReference.BlockTableRecord, OpenMode.ForRead);
foreach (ObjectId arId in blockReference.AttributeCollection)// ... to see whether it's a block with the name we're after
{
DBObject obj = tr.GetObject(arId, OpenMode.ForRead);
if (obj is AttributeReference ar)
attributeRefCollection.Add(ar);
}
parametrsRefCollection = blockReference.DynamicBlockReferencePropertyCollection;
if (!manyblocks) break; // получили атрибуты и параметры. Если нужен только один блок, то выходим из перечисления вставок блока
}
}
}
}
action(blockTableRecord, blocksCollection, blockReference, attributeRefCollection, parametrsRefCollection); // непосредственно обработка блока при помощи передаваемого метода
if (!manyblocks) break;// получили все параметры. Если нужен только один блок, то выходим из перечисления типов блоков
}
}
}
tr.Commit();
}
if (manyblocks) db.SaveAs(db.OriginalFileName, true, db.OriginalFileVersion, db.SecurityParameters);
}
}