Данные в атрибутах блока в мультивыноске

Автор Тема: Данные в атрибутах блока в мультивыноске  (Прочитано 914 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Борюсь с такой задачей - есть мультивыноска в которой в качестве контента привязан пользовательский блок с атрибутами. Нужно считать значения атрибутов из этого блока внутри выноски. Написал такой код:
Код - C# [Выбрать]
  1.  [CommandMethod("GetMultileaderAttributeInfo")]
  2.  public void GetMultileaderAttributeInfo()
  3.  {
  4.      Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.      Database acCurDb = acDoc.Database;
  6.  
  7.      using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  8.      {
  9.          // Prompt the user to select a multileader
  10.          PromptEntityOptions peo = new PromptEntityOptions("\nSelect a multileader: ");
  11.          peo.SetRejectMessage("\nSelected entity is not a multileader.");
  12.          peo.AddAllowedClass(typeof(MLeader), false);
  13.          PromptEntityResult per = acDoc.Editor.GetEntity(peo);
  14.  
  15.          if (per.Status != PromptStatus.OK) return;
  16.  
  17.          ObjectId mlId = per.ObjectId;
  18.          MLeader ml = (MLeader)acTrans.GetObject(mlId, OpenMode.ForRead);
  19.        
  20.          // Check if the multileader has block content
  21.          if (ml.ContentType == ContentType.BlockContent)
  22.          {
  23.              BlockTableRecord btr = acTrans.GetObject(ml.BlockContentId, OpenMode.ForWrite) as BlockTableRecord;
  24.  
  25.              if (btr.HasAttributeDefinitions)
  26.              {
  27.                  ObjectIdCollection breferences = btr.GetBlockReferenceIds(true, false);
  28.                  foreach (ObjectId item in breferences)
  29.                  {
  30.  
  31.                      BlockReference blkRef = (BlockReference)acTrans.GetObject(item, OpenMode.ForRead);
  32.  
  33.                    
  34.  
  35.                        
  36.                          // Iterate through the block's attributes
  37.                          foreach (ObjectId attId in blkRef.AttributeCollection)
  38.                          {
  39.                              AttributeReference attRef = (AttributeReference)acTrans.GetObject(attId, OpenMode.ForRead);
  40.                              Editor ed = acDoc.Editor;
  41.                              ed.WriteMessage($"Attribute Tag: {attRef.Tag}, Value: {attRef.TextString}");
  42.                          }
  43.                      
  44.                  }
  45.  
  46.  
  47.              }
  48.          }
  49.          else
  50.          {
  51.              Console.WriteLine("The selected multileader does not have block content.");
  52.          }
  53.  
  54.          acTrans.Commit();
  55.      }
  56.  }

Но проблема в том что я не знаю как добраться до blockreference который привязан к конкретной выделенной в данный момент выноске. Я перебираю просто все вставки блока, но не понимаю, как определить где нужная.

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 93
  • Карма: 11
Очень много лишнего, зачем лезть в описание блока? Берете сразу вставку через свойство мультивыноски
https://help.autodesk.com/view/OARX/2024/ENU/?guid=OARX-ManagedRefGuide-Autodesk_AutoCAD_DatabaseServices_MLeader_BlockContentId