Как обновить атрибуты блока чертежа?

Автор Тема: Как обновить атрибуты блока чертежа?  (Прочитано 9080 раз)

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

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Всем привет. Столкнулся с проблемой..
Вставка блоков в чертеж осуществляется при помощи DrawJig(c#), но блоки вставляются без атрибутов (то есть они не отображаются), их нужно потом обновлять при помощи диспетчера атрибутов блоков.

В первую очередь наткнулся на тему: http://adn-cis.org/forum/index.php?topic=1105.0, а именно на ответ #4 от Александра Ривилиса. Попытался выполнить обновление атрибутов там же, где и изменяю свойства блока, то есть в WorldDraw, но ничего не вышло. Далее перенес обновление в основной класс (пробовал в отдельную транзакцию), но результат тот же.. Блок, все равно, вставляется в чертеж, словно он без атрибутов.
Вот фрагмент кода-попытки обновления:
Код - C# [Выбрать]
  1. var blockRef = blockRecId.GetObject(OpenMode.ForRead) as BlockReference;
  2.                 foreach (ObjectId idAtt in blockRef.AttributeCollection)
  3.                 {
  4.                     var attr = (AttributeReference)tr2.GetObject(idAtt, OpenMode.ForRead);
  5.                     switch (attr.Tag.ToUpper())
  6.                     {
  7.                         case "ДИАМЕТР":
  8.                             attr.UpgradeOpen();
  9.                             attr.Height = 2.5;
  10.                             attr.TextString = "10";
  11.                             break;
  12.                         case "ШАГ":
  13.                             attr.UpgradeOpen();
  14.                             attr.Height = 2.5;
  15.                             attr.TextString = "200";
  16.                             break;
  17.                     }
  18.                 }
Так вот, думаю о том, чтобы сделать программно то, что делается в диспетчере атрибутов (в идеале, было бы это сделать прямо в WorldDraw, но что-то я уже сомневаюсь, что такое возможно):

В общем, совсем завис я с этим вопросом. Возможно, кто-то сталкивался и поможет? Заранее, спасибо.



Отмечено как Решение Максим Маркевич 08-08-2016, 01:16:03

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Где код вставки блока? Я так понимаю, что ты скорее всего при вставке не добавляешь атрибуты блока.
Как вставить блок с атрибутами в пространство модели
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Где код вставки блока? Я так понимаю, что ты скорее всего при вставке не добавляешь атрибуты блока.
УБИТ(с) - из игры "Морской бой".
Прямо в точку :(
Атрибуты блока то я добавлял. Но дело в том, что искал определения атрибутов в таблице BlockTableRecord, которая текущее рабочее пространство, а не определение блока (и смешно, и плакать хочется), а я уже в такие дебри полез.
Огромное Вам спасибо за очень четкий и оперативный ответ!! Бесконечно признателен!!!!
Теперь все замечательно работает, а я умиротворенный иду спать..


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

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

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Прямо в точку
Я хотел сказать, что впечатлен. ;)
И кто-бы сомневался...
Никто. )
Спасибо еще раз, что находите время!!!

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Уважаемый Александр. Спасибо за содержательное разъяснение. Но осталась одна проблема:
Динамический блок содержал атрибут в который по умолчанию было вставлено поле, которое ссылается на свойство этого же блока (BlockPlaceholder), например Position.
Так вот при вставке BlockReference используя выше приведенный код - поле "ломается".
Может Вы знаете как это исправить?

p.s. Покапался на форуме, вроде нашел что нужно:
https://adn-cis.org/forum/index.php?topic=9353.msg39198#msg39198
Буду проверять.

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
В свое время тоже заметил что поля вставляются некорректно, но так же заметил что при вставке через джиг все работает нормально, когда использовал код из инета (киана что ли), в общем нашел решение в повторном обновлении атрибута после добавления

Код - C# [Выбрать]
  1. foreach (ObjectId id in btr)
  2. {
  3.     //пытаемся открыть объект как описание атрибута
  4.     using (AttributeDefinition attr = tr.GetObject(id, OpenMode.ForRead, false, true) as AttributeDefinition)
  5.     {
  6.         //если это атрибут и он не константа
  7.         if (attr == null || attr.Constant) continue;
  8.         //создаем вставку атрибута
  9.         using (AttributeReference attrRef = new AttributeReference())
  10.         {
  11.             //добавляем в блок
  12.             attrRef.SetAttributeFromBlock(attr, br.BlockTransform);
  13.             br.AttributeCollection.AppendAttribute(attrRef);
  14.             tr.AddNewlyCreatedDBObject(attrRef, true);
  15.             //дублируем после добавления что бы нормально отрабатывали вставки полей
  16.             attrRef.SetAttributeFromBlock(attr, br.BlockTransform);
  17.         }
  18.     }
  19. }