Как правильно обновить динамические блоки?

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

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

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

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Autocad2014 SP1 x64

Есть динамические блоки и соответствующие анонимные.
Какой порядок действий, для правильного обновления динамических блоков?

Совершаю действия над блоком.
1. Получаю BlockTableRecord динамического блока block.Name == "test1"
2. Меняю радиусы окружностей в блоке(просто тест, в результате которого наткнулся на проблему)
double radius = circle.Radius;
circle.Radius = radius * 2;
3. Обновляю соответствующие анонимные блоки
block.UpdateAnonymousBlocks();

Проблемы в следующем:
1. Отображение BlockReference меняется только у анонимных блоков. У динамического не меняется.
_Regenall приводит вид динамического в соответствие. Но этого недостаточно!
2. Возникает  проблема, если попытаться выбрать BlockReference  кликом на внешней(большей) окружности.
-BlockReference с ссылкой на анонимный блок можно выбрать.
-BlockReference с ссылкой на динамический не выбирается.
Сохранение/закрытие/открытие чертежа помогает.

Что нужно сделать, чтобы динамический блок обновил вид и выбирался корректно без закрытия/открытия чертежа?


тестовый файл
https://yadi.sk/d/HqobTIjinXgSE

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Оно -http://forums.autodesk.com/t5/net/attsync-in-vb-net/m-p/4645057/highlight/true#M37817
?

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Оно
Там тема и код касаются атрибутов блока. В данном случае их не использовал.

Отмечено как Решение Привалов Дмитрий 22-01-2016, 11:15:25

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Лично я с таким еще не сталкивался)
Вот еще по теме - https://forums.autodesk.com/t5/net/redefine-dynamic-block-and-update-existing-block-instances/td-p/4933716
Там посоветовали "перевставить" блоки и отметили это как решение

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Вот еще по теме - https://forums.autodesk.com/t5/net/redefine-dynamic-block-and-update-existing-block-instances/td-p/4933716
Там посоветовали "перевставить" блоки и отметили это как решение

Большое спасибо! +
помогл вызов метода на всех вставках блока:
blockReference.RecordGraphicsModified(true);

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

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

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
В общем поднимем темку, так как все что нашел не помогает, в чертеж вставляются блоки в которых геометрия задается несколькими параметрами, так как вставить требуется не один блок то все это висит в цикле while(true) пока не прервется изнутри, проблема в том, что при вставке блок отображается базовый, при изменении параметров графически он не обновляется пока не прервется макрос, либо пока не отрисуется следующий блок, после чего у первого отображение становится нормальным, а у отрисованного последним остается базовым.
ed.Regen() и blockReference.RecordGraphicsModified(true) не помогают. Пробовал разносить создание блока и изменение параметров в разные транзакции, тоже не помогло.
Понаблюдав за этим цирком сделал такую затычку - после создания блока создается еще одна его копия в которой так же меняются параметры, после чего копия сразу же удаляется, что привело к нужному результату, неужто это единственный выход обновления изображения блока?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Докину еще немного  методов на пробу...
1. https://help.autodesk.com/view/OARX/2022/ENU/?guid=OARX-ManagedRefGuide-Autodesk_AutoCAD_DatabaseServices_BlockTableRecord_UpdateAnonymousBlocks
2. pInvoke acdbEntUpd() (https://forums.autodesk.com/t5/net/regen-entity/td-p/2695949)

Надеюсь  поможет, хотя сейчас посмотрел в одном из своих проектов в код по вставке кучи динамических блоков и там никаких обновлений нет, однако все работает  нормально.
Сам метод вставки и изменения блоков в проекте условно разделен на 4 части:
1 - создание BlockReference в нулевой точке, добавление этого объекта в базу и закрытие объекта.
2 - открытие объекта заново, изменение динамических свойств и снова закрытие.
3 - открытие объекта в транзакции и синхронизация атрибутов и снова закрытие.
4 - открытие объекта без транзакции и перемещение его в нужную точку через TransformBy()
Все это работает надежно... только медленно, сделано так, потому что в рамках одного открытия или одной транзакции почему то не получалось добиться нормальной работы =)