Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 18-07-2021, 10:24:09

Название: Заменить содержимое атрибута блока внутри выноски
Отправлено: Atomohod от 18-07-2021, 10:24:09
Здравствуйте
У меня есть выноска multileader в которой используется пользовательский блок с атрибутами внутри. Также этот блок используется вне выноски просто в чертеже как самостоятельное обозначение. Я программно меняю содержимое атрибута блока. Для блоков не в составе выноски все работает идеально, но значения внутри блоков привязанных в выноску не изменяются. Как сделать так чтобы они изменялись вместе с другими блоками?
Мой код
Код - C# [Выбрать]
  1.  public static ObjectIdCollection GetBlockReferencesWithDesiredPosition(string compartent, string desiredPosition) // Получает все блоки позиций с требуемым номером
  2.         {
  3.             Document doc = Application.DocumentManager.MdiActiveDocument;
  4.             Editor ed = doc.Editor;
  5.             Database db = doc.Database;
  6.  
  7.             List<Point3d> listOfBasePoints = new List<Point3d>();
  8.             ObjectIdCollection bRefCollection = new ObjectIdCollection();
  9.             using ( Transaction tr = doc.TransactionManager.StartTransaction() )
  10.             {
  11.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  12.                 if ( bt.Has("GTItemMark") )
  13.                 {
  14.                     foreach ( ObjectId btrId in bt ) //bt набор btrRecord то есть по своей сути уже коллекция!
  15.                     {
  16.                         BlockTableRecord btr = tr.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord;
  17.                         if ( btr.Name.Contains("GTItemMark") )
  18.                         {
  19.                             ObjectIdCollection bRefIdCollection = btr.GetBlockReferenceIds(false, true); // собрать все Id от BlockReference из BlockTableRecord в коллекцию
  20.  
  21.                             foreach ( ObjectId bRefId in bRefIdCollection )
  22.                             {
  23.                                 BlockReference bRef = tr.GetObject(bRefId, OpenMode.ForWrite) as BlockReference; // получить все BlockReference
  24.  
  25.                                 AttributeCollection attrIdCollection = bRef.AttributeCollection; // собрать все Id от атрибутов из BlockTableRecord в коллекцию
  26.  
  27.                                 foreach ( ObjectId idAttRef in attrIdCollection )
  28.                                 {
  29.                                     AttributeReference att = (AttributeReference)tr.GetObject(idAttRef, OpenMode.ForWrite);
  30.                                     if ( (att.Tag == "ContourNumber") && (att.TextString.Substring(0, 2) == compartent) && (int.Parse(att.TextString.Substring(3, 2)) >= int.Parse(desiredPosition)) )
  31.                                     {
  32.                                         int num = int.Parse(att.TextString.Substring(3, 2)) + 1;
  33.                                         if ( num.ToString().Length == 1 )
  34.                                         {
  35.                                             att.TextString = compartent + "-0" + num.ToString();
  36.                                         }
  37.  
  38.                                         else
  39.                                         {
  40.  
  41.                                             att.TextString = compartent + "-" + num.ToString();
  42.                                         }
  43.  
  44.                                     }
  45.                                 }
  46.                             }
  47.                         }
  48.                     }
  49.                 }
  50.  
  51.  
  52.                 tr.Commit();
  53.             }
  54.  
  55.  
  56.  
  57.             return bRefCollection;
  58.         }
Название: Re: Заменить содержимое атрибута блока внутри выноски
Отправлено: Александр Ривилис от 18-07-2021, 14:36:48
Выложи пример dwg-файла с парочкой отдельно вставленных блоков и парочкой мультилидеров.
Название: Re: Заменить содержимое атрибута блока внутри выноски
Отправлено: Atomohod от 18-07-2021, 20:30:56
Прикладываю файл примера
Название: Re: Заменить содержимое атрибута блока внутри выноски
Отправлено: Александр Ривилис от 18-07-2021, 20:47:01
Нашел единственный метод, который позволяет получать AttributeReference для блока из MLeader:
MLeader.GetBlockAttribute
На вход этому методу нужно передать ObjectId для соответствующего AttributeDefinition.
Название: Re: Заменить содержимое атрибута блока внутри выноски
Отправлено: Александр Ривилис от 18-07-2021, 20:50:38
Посмотри эту тему: https://adndevblog.typepad.com/autocad/2012/06/traversing-through-attribute-references-in-mleader.html