Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Привалов Дмитрий от 22-01-2016, 10:07:43
-
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 (https://yadi.sk/d/HqobTIjinXgSE)
-
Оно -http://forums.autodesk.com/t5/net/attsync-in-vb-net/m-p/4645057/highlight/true#M37817
?
-
Оно
Там тема и код касаются атрибутов блока. В данном случае их не использовал.
-
Лично я с таким еще не сталкивался)
Вот еще по теме - https://forums.autodesk.com/t5/net/redefine-dynamic-block-and-update-existing-block-instances/td-p/4933716
Там посоветовали "перевставить" блоки и отметили это как решение
-
Вот еще по теме - https://forums.autodesk.com/t5/net/redefine-dynamic-block-and-update-existing-block-instances/td-p/4933716
Там посоветовали "перевставить" блоки и отметили это как решение
Большое спасибо! +
помогл вызов метода на всех вставках блока:
blockReference.RecordGraphicsModified(true);
-
помогл вызов метода на всех вставках блока:
blockReference.RecordGraphicsModified(true);
Вообще-то это тоже самое, что _REGENALL. Так что странно что помогло.
-
В общем поднимем темку, так как все что нашел не помогает, в чертеж вставляются блоки в которых геометрия задается несколькими параметрами, так как вставить требуется не один блок то все это висит в цикле while(true) пока не прервется изнутри, проблема в том, что при вставке блок отображается базовый, при изменении параметров графически он не обновляется пока не прервется макрос, либо пока не отрисуется следующий блок, после чего у первого отображение становится нормальным, а у отрисованного последним остается базовым.
ed.Regen() и blockReference.RecordGraphicsModified(true) не помогают. Пробовал разносить создание блока и изменение параметров в разные транзакции, тоже не помогло.
Понаблюдав за этим цирком сделал такую затычку - после создания блока создается еще одна его копия в которой так же меняются параметры, после чего копия сразу же удаляется, что привело к нужному результату, неужто это единственный выход обновления изображения блока?
-
Докину еще немного методов на пробу...
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()
Все это работает надежно... только медленно, сделано так, потому что в рамках одного открытия или одной транзакции почему то не получалось добиться нормальной работы =)