Здравствуйте!
Борюсь с такой задачей - есть мультивыноска в которой в качестве контента привязан пользовательский блок с атрибутами. Нужно считать значения атрибутов из этого блока внутри выноски. Написал такой код:
[CommandMethod("GetMultileaderAttributeInfo")]
public void GetMultileaderAttributeInfo()
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Prompt the user to select a multileader
PromptEntityOptions peo = new PromptEntityOptions("\nSelect a multileader: ");
peo.SetRejectMessage("\nSelected entity is not a multileader.");
peo.AddAllowedClass(typeof(MLeader), false);
PromptEntityResult per = acDoc.Editor.GetEntity(peo);
if (per.Status != PromptStatus.OK) return;
ObjectId mlId = per.ObjectId;
MLeader ml = (MLeader)acTrans.GetObject(mlId, OpenMode.ForRead);
// Check if the multileader has block content
if (ml.ContentType == ContentType.BlockContent)
{
BlockTableRecord btr = acTrans.GetObject(ml.BlockContentId, OpenMode.ForWrite) as BlockTableRecord;
if (btr.HasAttributeDefinitions)
{
ObjectIdCollection breferences = btr.GetBlockReferenceIds(true, false);
foreach (ObjectId item in breferences)
{
BlockReference blkRef = (BlockReference)acTrans.GetObject(item, OpenMode.ForRead);
// Iterate through the block's attributes
foreach (ObjectId attId in blkRef.AttributeCollection)
{
AttributeReference attRef = (AttributeReference)acTrans.GetObject(attId, OpenMode.ForRead);
Editor ed = acDoc.Editor;
ed.WriteMessage($"Attribute Tag: {attRef.Tag}, Value: {attRef.TextString}");
}
}
}
}
else
{
Console.WriteLine("The selected multileader does not have block content.");
}
acTrans.Commit();
}
}
Но проблема в том что я не знаю как добраться до blockreference который привязан к конкретной выделенной в данный момент выноске. Я перебираю просто все вставки блока, но не понимаю, как определить где нужная.