Получить список атрибутов из динамического блока

Автор Тема: Получить список атрибутов из динамического блока  (Прочитано 559 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • **
  • Сообщений: 84
  • Карма: 0
Добрый день, пытаюсь получить у динамического блока список атрибутов на C# через COM, следующим образом:
Код - C# [Выбрать]
  1.             var blocks = document.ModelSpace.Database.Blocks;
  2.             foreach (AcadBlock block in blocks)
  3.             {
  4.                 try
  5.                 {
  6.                     if (block != null && (block.Name.Equals("Формат_чертежа") && block.IsDynamicBlock))
  7.                     {
  8.  
  9.                         var blockReference = block as AcadBlockReference; //null
  10.                         foreach (var attribute in blockReference.GetAttributes())
  11.                         {
  12.                             Console.WriteLine(attribute);
  13.                         }
  14.  
  15.                     }
  16.  
  17.                 }
  18.                 catch (Exception e)
  19.                 {
  20.                     Console.WriteLine(e);
  21.                     throw;
  22.                 }
  23.  
Сначала я получаю все блоки в текущем открытом документе, затем получаю именно нужный мне блок.
Далее как я понял чтобы получить атрибуты мне нужно привести к типу
Цитировать
AcadBlockReference
, чтобы получить список атрибутов, но это возвращает null... Как правильно можно получить этот список?

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

  • Administrator
  • *****
  • Сообщений: 12493
  • Карма: 1621
  • Рыцарь ObjectARX
  • Skype: rivilis
user32,
Неправильно всё. Главная неправильность в том, что ты путаешь AcadBlock (это описание блока) с AcadBlockReference (это вставка блока). Это совершенно разные вещи.
P.S.: Этот код будет выполняться из отдельного exe-файла? Если нет, то зачем здесь COM?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 84
  • Карма: 0
Да, хотел из отдельного Exe-шника запускать, а как правильно можно получить этот блок, чтобы вытянуть атрибуты?

Отмечено как Решение user32 11-09-2020, 16:56:48

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

  • Administrator
  • *****
  • Сообщений: 12493
  • Карма: 1621
  • Рыцарь ObjectARX
  • Skype: rivilis
user32,
Нужна итерация не по элементам document.ModelSpace.Database.Blocks, а по элементам document.ModelSpace (или document.PaperSpace)
Из них отбираешь все AcadBlockReference, определяешь  имя и если это нужный тебе блок, то получаешь его атрибуты.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 84
  • Карма: 0
Спасибо, все получилось, ниже код, как получить и атрибуты и свойства у динамического блока:
Код - C# [Выбрать]
  1.             var blocks = document.ModelSpace;
  2.             foreach (var block in blocks)
  3.             {
  4.                 if (block!=null && block is AcadBlockReference blockReference)
  5.                 {
  6.                     if (blockReference != null && blockReference.IsDynamicBlock && blockReference.EffectiveName.Equals("Формат_чертежа"))
  7.                     {
  8.                         #region Получить атрибуты у блока
  9.                         //var getAttribute = blockReference.GetAttributes();
  10.                         //foreach (AcadAttributeReference attribute in getAttribute)
  11.                         //{
  12.                         //    if (attribute != null)
  13.                         //    {
  14.                         //        Console.WriteLine(attribute.TagString);
  15.                         //        attribute.TextString = "Test";
  16.                         //    }
  17.                         //}
  18.                         #endregion
  19.  
  20.                         #region Получить свойства у динамического блока
  21.  
  22.                         var getDynamicBlockProperties = blockReference.GetDynamicBlockProperties();
  23.                         foreach (AcadDynamicBlockReferenceProperty prop in getDynamicBlockProperties)
  24.                         {
  25.                             if (prop != null)
  26.                             {
  27.                                 if (prop.PropertyName.Equals("a"))
  28.                                 {
  29.                                     double a = 335;
  30.                                     prop.Value = a;
  31.                                 }
  32.                                 if (prop.PropertyName.Equals("b"))
  33.                                 {
  34.                                     double b = 500;
  35.                                     prop.Value = b;
  36.                                 }
  37.                             }
  38.                         }
  39.  
  40.                         #endregion
  41.  
  42.                     }
  43.  
  44.                 }
  45.             }
  46.  
  47.