Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 27-01-2015, 18:34:52
-
Здравствуйте!
Есть идея использования динамических блоков для переопределения вида некоторых объектов. Опыты показали, что такое возможно (не без извращений, конечно же). Но есть некоторые моменты, с которыми справиться не удается. Это, в первую очередь, нечеткая работа привязок к динамическому блоку. Также, база чертежа замусоривается анонимными вариантами различных представлений динамического блока, которые создаются при изменении объекта, отображение которого переопределяем.
Переопределения хорошо работают, когда для этого используются простые объекты: отрезки, дуги, полилинии, штриховки и т.п. Но когда используется блок с динамическими параметрами или атрибутами, возникают проблемы. Главная - блок нужно добавить в какое-либо пространство, иначе будут проблемы как с атрибутами, так и с динпараметрами.
В общем, интересует такой вопрос - как считают в ADN, можно ли использовать такие блоки в переопределениях (или это непредусмотренная возможность) и если да, то есть ли какие-то рекомендации на этот счет?
Вот пример того, что у меня получилось на сегодняшний день:
https://screencast.autodesk.com/main/details/53715f6b-01dd-467a-bd3f-32913ac933b7
В архиве папка с решением для VS2013 и внутри есть чертеж для опытов версии AutoCAD 2014.
-
Также, база чертежа замусоривается анонимными вариантами различных представлений динамического блока, которые создаются при изменении объекта, отображение которого переопределяем.
Ну если ты будешь не глядя всё время менять параметры динамического блока, то конечно база будет "замусориваться". От этого никуда не денешься - такова природа динамических блоков.
Я вообще поражаюсь как у тебя AutoCAD не вылетает (или всё же вылетает?) Фактически в методе WorldDraw ты запускаешь транзакцию, меняешь параметры динамического блока. Т.е. сколько раз вызывается этот метод (а вызывается он AutoCAD'ом очень часто) - столько анонимных блоков ты плодишь...
-
Я вообще поражаюсь как у тебя 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
-------------
-
acad.err из приложенного архива
Я видел. Но это скорее всего была не последняя версия dll-файла (судя по дате/времени).
-
Не вылетает, по крайней мере по такой причине. WordDraw на самом деле не так уж и часто отрабатывает, судя по отладке.
Записи в acad.err - это была ошибка в коде (попытка модификации объекта вне транзакции). Уже исправил.
-
WordDraw на самом деле не так уж и часто отрабатывает, судя по отладке.
Как минимум должно работать при любой модификации этого примитива. Из моего опыта при перетаскивании - постоянно с дискретностью порядка десятых долей секунды.
-
Ну с одним объектом проблем не было. Наверное, если их будет несколько сотен и их попробовать переместить - тут и случится вылет. В общем, считаете, что идея использовать динблоки в отрисовке никуда не годится?
-
P.S.: Кстати с кодом я особенно не разбирался, но подозреваю, что если сначала проверить не совпадают ли dynProp.Value и cir.Diameter и только если не совпадают - тогда менять, то можно уменьшить количество анонимных блоков.
-
В общем, считаете, что идея использовать динблоки в отрисовке никуда не годится?
Моё мнение - не годится. Нужно придумать что-то попроще.
-
P.S.: Кстати с кодом я особенно не разбирался, но подозреваю, что если сначала проверить не совпадают ли dynProp.Value и cir.Diameter и только если не совпадают - тогда менять, то можно уменьшить количество анонимных блоков.
Да это просто тестовый пример. В боевых условиях предполагался набор параметров с вычисляемыми значениями. Там все сложнее (Civil 3D).
Нужно придумать что-то попроще.
Хех... попроще - это в итоге посложнее. Задача такая - чтобы пользователи сами могли составлять отображения объектов. Динблоки в этом плане выглядели очень соблазнительно... Эх :)
-
Хех... попроще - это в итоге посложнее. Задача такая - чтобы пользователи сами могли составлять отображения объектов. Динблоки в этом плане выглядели очень соблазнительно... Эх
А если не секрет - в чем общая задача - почему нельзя, чтоб просто блоки сами себя отображали?
-
Это я просто для примера привел круг и заменяющий его блок. Мне же нужно таким образом "перерисовать" объекты Civil 3D так, чтобы они отвечали требованиям наших норм.
Вот есть ролик, где я показывал над чем работаю: https://screencast.autodesk.com/Main/Details/f2fd3719-a367-4980-a76b-f943e0cfce90
-
Сильно...
есть вариант попробовать мемоизацию по всем параметрам...
А может хватит команды "создать копию с блоками по нашим требованиям"
-
есть вариант попробовать мемоизацию по всем параметрам...
Можно, но уже не хочется. Потому как, есть сильные подозрения, что еще какая-нибудь пакость вылезет. Я уже и так много чего намудрил, чтобы хотя бы это получить. А если еще ввести дополнительные сложности, то получится уже франкенштейн какой-то а не программа. У меня есть запасной вариант. Правда, он сложнее в реализации, но риск, что что-то не будет работать минимален.
А может хватит команды "создать копию с блоками по нашим требованиям"
Такое уже есть, пользуются уже не первый год. Лучше, чем ничего, но не очень удобно.
-
Нужно придумать что-то попроще.
В общем, буду прорабатывать вариант с описанием геометрии в XML файле. На первый взгляд, получается довольно неплохо: https://screencast.autodesk.com/main/details/0ead74d4-642c-43d5-9370-e6d560f35fa6
Посмотрим, как дальше пойдет.
Спасибо за советы!
-
В общем, буду прорабатывать вариант с описанием геометрии в XML файле.
XML идеален для разработки (как по "гибкости", так и по количеству инструментов для работы с ним, а главное по формальной простоте описания формата) - но есть у него существенный недостаток - никакими средствами невозможно заставить простого юзера править его самостоятельно, а тем более что когда в формат "впутываются" различные формулы и ссылки. В итоге один черт на него придется писать гуишку (TreeView в помощь), писать кучку конверторов (в простом случае "вытаскивателей" информации) во все подряд. В общем буквально на прошлой неделе закончил я "перенос" аналогичного описания "графической" информации из XML в СУБД, т.к. в какой-то момент количество "удобных костылей" начинает мешать ходить - но нельзя не отметить, что заранее формат реляционной БД, без корректировок, вывести получается только в совсем простых случаях.
-
никакими средствами невозможно заставить простого юзера править его самостоятельно
Да, есть такое, согласен. Но мне сейчас нужно просто проверить концепцию и выдать бета-версию для "обкатки". Если Когда все будет хорошо, можно уже будет думать о гуишках и других способах хранения описаний :)