Заменить содержимое атрибута блока внутри выноски

Автор Тема: Заменить содержимое атрибута блока внутри выноски  (Прочитано 3246 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте
У меня есть выноска 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.         }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Выложи пример dwg-файла с парочкой отдельно вставленных блоков и парочкой мультилидеров.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Прикладываю файл примера

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Нашел единственный метод, который позволяет получать AttributeReference для блока из MLeader:
MLeader.GetBlockAttribute
На вход этому методу нужно передать ObjectId для соответствующего AttributeDefinition.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение