Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 27-01-2015, 18:34:52

Название: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 27-01-2015, 18:34:52
Здравствуйте!
Есть идея использования динамических блоков для переопределения вида некоторых объектов. Опыты показали, что такое возможно (не без извращений, конечно же). Но есть некоторые моменты, с которыми справиться не удается. Это, в первую очередь, нечеткая работа привязок к динамическому блоку. Также, база чертежа замусоривается анонимными вариантами различных представлений динамического блока, которые создаются при изменении объекта, отображение которого переопределяем.
Переопределения хорошо работают, когда для этого используются простые объекты: отрезки, дуги, полилинии, штриховки и т.п. Но когда используется блок с динамическими параметрами или атрибутами, возникают проблемы. Главная - блок нужно добавить в какое-либо пространство, иначе будут проблемы как с атрибутами, так и с динпараметрами.
В общем, интересует такой вопрос - как считают в ADN, можно ли использовать такие блоки в переопределениях (или это непредусмотренная возможность) и если да, то есть ли какие-то рекомендации на этот счет?
Вот пример того, что у меня получилось на сегодняшний день:
https://screencast.autodesk.com/main/details/53715f6b-01dd-467a-bd3f-32913ac933b7
В архиве папка с решением для VS2013 и внутри есть чертеж для опытов версии AutoCAD 2014.
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Александр Ривилис от 27-01-2015, 19:49:18
Также, база чертежа замусоривается анонимными вариантами различных представлений динамического блока, которые создаются при изменении объекта, отображение которого переопределяем.
Ну если ты будешь не глядя всё время менять параметры динамического блока, то конечно база будет "замусориваться". От этого никуда не денешься - такова природа динамических блоков.
Я вообще поражаюсь как у тебя AutoCAD не вылетает (или всё же вылетает?) Фактически в методе WorldDraw ты запускаешь транзакцию, меняешь параметры динамического блока. Т.е. сколько раз вызывается этот метод (а вызывается он AutoCAD'ом очень часто) - столько анонимных блоков ты плодишь...
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дима_ от 27-01-2015, 20:28:10
Я вообще поражаюсь как у тебя AutoCAD не вылетает (или всё же вылетает?)
acad.err из приложенного архива
Цитировать
ВНУТРЕННЯЯ ОШИБКА:  !dbobji.cpp@8749: eNotOpenForWrite

01/27/2015 at 17:19:51.306  Чертеж: D:\Work\_Parts\_Tests\SimpleDrawOverrule\DynBlk.dwg
-------------


ВНУТРЕННЯЯ ОШИБКА:  !dbobji.cpp@8749: eNotOpenForWrite

01/27/2015 at 17:23:56.190  Чертеж: D:\Work\_Parts\_Tests\SimpleDrawOverrule\DynBlk.dwg
-------------


ВНУТРЕННЯЯ ОШИБКА:  !dbobji.cpp@8749: eNotOpenForWrite

01/27/2015 at 17:34:05.305  Чертеж: D:\Work\_Parts\_Tests\SimpleDrawOverrule\DynBlk.dwg
-------------
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Александр Ривилис от 27-01-2015, 20:31:14
acad.err из приложенного архива
Я видел. Но это скорее всего была не последняя версия dll-файла (судя по дате/времени).
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 27-01-2015, 21:16:05
Не вылетает, по крайней мере по такой причине. WordDraw на самом деле не так уж и часто отрабатывает, судя по отладке.
Записи в acad.err - это была ошибка в коде (попытка модификации объекта вне транзакции). Уже исправил.
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Александр Ривилис от 27-01-2015, 21:19:11
WordDraw на самом деле не так уж и часто отрабатывает, судя по отладке.
Как минимум должно работать при любой модификации этого примитива. Из моего опыта при перетаскивании - постоянно с дискретностью порядка десятых долей секунды.
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 27-01-2015, 21:27:40
Ну с одним объектом проблем не было. Наверное, если их будет несколько сотен и их попробовать переместить - тут и случится вылет. В общем, считаете, что идея использовать динблоки в отрисовке никуда не годится?
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Александр Ривилис от 27-01-2015, 21:27:59
P.S.: Кстати с кодом я особенно не разбирался, но подозреваю, что если сначала проверить не совпадают ли dynProp.Value и cir.Diameter и только если не совпадают - тогда менять, то можно уменьшить количество анонимных блоков.
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Александр Ривилис от 27-01-2015, 21:28:41
В общем, считаете, что идея использовать динблоки в отрисовке никуда не годится?
Моё мнение - не годится. Нужно придумать что-то попроще.
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 27-01-2015, 21:31:29
Цитировать
P.S.: Кстати с кодом я особенно не разбирался, но подозреваю, что если сначала проверить не совпадают ли dynProp.Value и cir.Diameter и только если не совпадают - тогда менять, то можно уменьшить количество анонимных блоков.
Да это просто тестовый пример. В боевых условиях предполагался набор параметров с вычисляемыми значениями. Там все сложнее (Civil 3D).
Цитировать
Нужно придумать что-то попроще.
Хех... попроще - это в итоге посложнее. Задача такая - чтобы пользователи сами могли составлять отображения объектов. Динблоки в этом плане выглядели очень соблазнительно... Эх :)
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дима_ от 27-01-2015, 22:07:13
Хех... попроще - это в итоге посложнее. Задача такая - чтобы пользователи сами могли составлять отображения объектов. Динблоки в этом плане выглядели очень соблазнительно... Эх
А если не секрет - в чем общая задача - почему нельзя, чтоб просто блоки сами себя отображали?
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 27-01-2015, 23:47:54
Это я просто для примера привел круг и заменяющий его блок. Мне же нужно таким образом "перерисовать" объекты Civil 3D так, чтобы они отвечали требованиям наших норм.
Вот есть ролик, где я показывал над чем работаю: https://screencast.autodesk.com/Main/Details/f2fd3719-a367-4980-a76b-f943e0cfce90
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дима_ от 28-01-2015, 00:04:09
Сильно...
есть вариант попробовать мемоизацию по всем параметрам...
А может хватит команды "создать копию с блоками по нашим требованиям"
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 28-01-2015, 10:40:19
есть вариант попробовать мемоизацию по всем параметрам...
Можно, но уже не хочется. Потому как, есть сильные подозрения, что еще какая-нибудь пакость вылезет. Я уже и так много чего намудрил, чтобы хотя бы это получить. А если еще ввести дополнительные сложности, то получится уже франкенштейн какой-то а не программа. У меня есть запасной вариант. Правда, он сложнее в реализации, но риск, что что-то не будет работать минимален.
А может хватит команды "создать копию с блоками по нашим требованиям"
Такое уже есть, пользуются уже не первый год. Лучше, чем ничего, но не очень удобно.
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 28-01-2015, 16:11:35
Нужно придумать что-то попроще.
В общем, буду прорабатывать вариант с описанием геометрии в XML файле. На первый взгляд, получается довольно неплохо: https://screencast.autodesk.com/main/details/0ead74d4-642c-43d5-9370-e6d560f35fa6
Посмотрим, как дальше пойдет.
Спасибо за советы!
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дима_ от 28-01-2015, 21:39:35
В общем, буду прорабатывать вариант с описанием геометрии в XML файле.
XML идеален для разработки (как по "гибкости", так и по количеству инструментов для работы с ним, а главное по формальной простоте описания формата) - но есть у него существенный недостаток - никакими средствами невозможно заставить простого юзера править его самостоятельно, а тем более что когда в формат "впутываются" различные формулы и ссылки. В итоге один черт на него придется писать гуишку (TreeView в помощь), писать кучку конверторов (в простом случае "вытаскивателей" информации) во все подряд. В общем буквально на прошлой неделе закончил я "перенос" аналогичного описания "графической" информации из XML в СУБД, т.к. в какой-то момент количество "удобных костылей" начинает мешать ходить - но нельзя не отметить, что заранее формат реляционной БД, без корректировок, вывести получается только в совсем простых случаях.
Название: Re: Использование динамических блоков и блоков с атрибутами в Overrule
Отправлено: Дмитрий Загорулькин от 30-01-2015, 13:26:46
Цитировать
никакими средствами невозможно заставить простого юзера править его самостоятельно
Да, есть такое, согласен. Но мне сейчас нужно просто проверить концепцию и выдать бета-версию для "обкатки". Если Когда все будет хорошо, можно уже будет думать о гуишках и других способах хранения описаний :)