Обновление полей в атрибутах блока

Автор Тема: Обновление полей в атрибутах блока  (Прочитано 19678 раз)

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

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Всем добрый день,

Какие есть варианты обновления полей в атрибутах вхождения блока?

Можно регенерировать весь чертеж. Но, лучше если можно обновлять только нужные объекты.
Что-то найти ничего похожего не удалось  :(

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А я не понял - а в какой момент это нужно? При создании блока? При вставке?

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Перед созданием спецификации по выбранным вхождениям блоков.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Может тут найдете что-то подходящее

Отмечено как Решение Вильдар 16-05-2016, 13:11:19

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Autodesk.AutoCAD.DatabaseServices.Database.EvaluateFields - в AutoCAD .NET API. Обновляет все поля в базе.
2. acdbEvaluateFields - в ObjectARX можно указать какие поля будут обновляться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Спасибо, Database.EvaluateFields сойдет. Не видел его.

Пробовал так, но не работает.
Поле определяется, пересчитывается, но текст атрибута не обновляется после SetField().
Код - C# [Выбрать]
  1.         [CommandMethod("Test", "Test", CommandFlags.Modal)]
  2.         public void Test()
  3.         {
  4.             // Обновление полей в блоке
  5.             Document doc = Application.DocumentManager.MdiActiveDocument;
  6.             Database db = doc.Database;
  7.             Editor ed = doc.Editor;            
  8.  
  9.             var sel = ed.GetEntity("Выбери блок для обновления полей в атрибутах");
  10.             if (sel.Status != PromptStatus.OK) return;
  11.  
  12.             using (var t = db.TransactionManager.StartTransaction())
  13.             {
  14.                 var blRef = sel.ObjectId.GetObject(OpenMode.ForRead) as BlockReference;
  15.  
  16.                 foreach (ObjectId idAtr in blRef.AttributeCollection)
  17.                 {
  18.                     var atrRef = idAtr.GetObject(OpenMode.ForRead) as AttributeReference;                    
  19.                     if (atrRef.HasFields)
  20.                     {
  21.                         var fieldId = atrRef.GetField();
  22.                         var field = fieldId.GetObject(OpenMode.ForWrite) as Field;
  23.                         field.Evaluate();
  24.                        
  25.                         atrRef.UpgradeOpen();
  26.                         atrRef.SetField("TextString", field);
  27.                     }
  28.                 }                
  29.                 t.Commit();
  30.             }
  31.         }
« Последнее редактирование: 16-05-2016, 20:38:47 от vildar82 »

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А если так:
Код - C# [Выбрать]
  1. atrRef.UpgradeOpen();
  2. atrRef.TextString = "";
  3. atrRef.SetField("TextString", field);
  4. atrRef.DowngradeOpen();

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А если так:
Код - C# [Выбрать]
  1. atrRef.UpgradeOpen();
  2. atrRef.TextString = "";
  3. atrRef.SetField("TextString", field);
  4. atrRef.DowngradeOpen();
SetField устанавливает поле, но не обновляет его отображение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Пока непонятное поведение SetField(). при первом вызове обновляет, дальше - нет. DowngradeOpen() не влияет.

SetField устанавливает поле, но не обновляет его отображение.
А как обновить? Field.Evaluate() не то?
« Последнее редактирование: 16-05-2016, 14:43:27 от vildar82 »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Field.Evaluate() не то?
Нет. Это просто вычисляет поле, но не обновляет видимость его в чертеже.
Можешь попробовать для atrRef вызвать atrRef.RecordGraphicsModified(true); после изменения поля и в конце TransactionManager.QueueForGraphicsFlush(); хотя мне кажется, что в этой ситуации не сработает. Не зря специальный метод acdbEvaluateFields в ObjectARX присутствует. 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Обновление полей в атрибутах блока
« Ответ #10 : 16-05-2016, 15:57:56 »
Пока непонятное поведение SetField(). при первом вызове обновляет, дальше - нет. DowngradeOpen() не влияет.
возможно тебе поможет, после изменения в блоке, пометить принудительно, что графика выбранного блока была изменена.

...
blRef.RecordGraphicsModified(true);
t.Commit();

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

using (var t = db.TransactionManager.StartTransaction())
{
...
}
ed.Regen();

..если это не поможет попробуй пометить еще и атрибуты внутри блока как измененные(как написал Александр)
var atrRef = idAtr.GetObject(OpenMode.ForRead) as DBText;                   
if (atrRef.HasFields)
{
}
atrRef.RecordGraphicsModified(true);



Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Обновление полей в атрибутах блока
« Ответ #11 : 16-05-2016, 15:58:55 »
...как удалять свои сообщения?  :P

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Обновление полей в атрибутах блока
« Ответ #12 : 16-05-2016, 16:46:34 »
...как удалять свои сообщения?  :P
Никак. Их можно только редактировать - это политика нашего форума. Чтобы не возникло ситуации, когда на вопрос отвечают, тратят на это время и силы, а вопроса уже нет...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Обновление полей в атрибутах блока
« Ответ #13 : 16-05-2016, 20:32:15 »
Пока непонятное поведение SetField(). при первом вызове обновляет, дальше - нет. DowngradeOpen() не влияет.
возможно тебе поможет, после изменения в блоке, пометить принудительно, что графика выбранного блока была изменена.
...
blRef.RecordGraphicsModified(true);
t.Commit();
Не подходит. И QueueForGraphicsFlush тоже.

При повторном получении поля из атрибута у него в статусе добавляется флаг Modified. Что делать в зависимости от этого флага или как его изменить непонятно.
Т.е. в блоке изменяются параметры влияющие на поле в атрибуте, и при первом запуске команды Test поле в атрибуте обновляется. Потом опять редактируется параметр блока и опять запускается команда Test. В результате атрибут получает пустое значение.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Обновление полей в атрибутах блока
« Ответ #14 : 16-05-2016, 20:42:14 »
При повторном получении поля из атрибута, у него в статусе добавляется флаг Modified. что делать в зависимости от этого флага или как его изменить непонятно.
Переведи. А заодно приложи код и файл с блоком, на котором тестируешь. Кроме того я не понял если уже нашлось решение Database.EvaluateFields, то зачем всё остальное?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение