Использование динамических блоков и блоков с атрибутами в Overrule

Автор Тема: Использование динамических блоков и блоков с атрибутами в Overrule  (Прочитано 15176 раз)

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Здравствуйте!
Есть идея использования динамических блоков для переопределения вида некоторых объектов. Опыты показали, что такое возможно (не без извращений, конечно же). Но есть некоторые моменты, с которыми справиться не удается. Это, в первую очередь, нечеткая работа привязок к динамическому блоку. Также, база чертежа замусоривается анонимными вариантами различных представлений динамического блока, которые создаются при изменении объекта, отображение которого переопределяем.
Переопределения хорошо работают, когда для этого используются простые объекты: отрезки, дуги, полилинии, штриховки и т.п. Но когда используется блок с динамическими параметрами или атрибутами, возникают проблемы. Главная - блок нужно добавить в какое-либо пространство, иначе будут проблемы как с атрибутами, так и с динпараметрами.
В общем, интересует такой вопрос - как считают в ADN, можно ли использовать такие блоки в переопределениях (или это непредусмотренная возможность) и если да, то есть ли какие-то рекомендации на этот счет?
Вот пример того, что у меня получилось на сегодняшний день:
https://screencast.autodesk.com/main/details/53715f6b-01dd-467a-bd3f-32913ac933b7
В архиве папка с решением для VS2013 и внутри есть чертеж для опытов версии AutoCAD 2014.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Также, база чертежа замусоривается анонимными вариантами различных представлений динамического блока, которые создаются при изменении объекта, отображение которого переопределяем.
Ну если ты будешь не глядя всё время менять параметры динамического блока, то конечно база будет "замусориваться". От этого никуда не денешься - такова природа динамических блоков.
Я вообще поражаюсь как у тебя AutoCAD не вылетает (или всё же вылетает?) Фактически в методе WorldDraw ты запускаешь транзакцию, меняешь параметры динамического блока. Т.е. сколько раз вызывается этот метод (а вызывается он AutoCAD'ом очень часто) - столько анонимных блоков ты плодишь...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я вообще поражаюсь как у тебя 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
-------------

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
acad.err из приложенного архива
Я видел. Но это скорее всего была не последняя версия dll-файла (судя по дате/времени).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Не вылетает, по крайней мере по такой причине. WordDraw на самом деле не так уж и часто отрабатывает, судя по отладке.
Записи в acad.err - это была ошибка в коде (попытка модификации объекта вне транзакции). Уже исправил.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
WordDraw на самом деле не так уж и часто отрабатывает, судя по отладке.
Как минимум должно работать при любой модификации этого примитива. Из моего опыта при перетаскивании - постоянно с дискретностью порядка десятых долей секунды.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Ну с одним объектом проблем не было. Наверное, если их будет несколько сотен и их попробовать переместить - тут и случится вылет. В общем, считаете, что идея использовать динблоки в отрисовке никуда не годится?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
P.S.: Кстати с кодом я особенно не разбирался, но подозреваю, что если сначала проверить не совпадают ли dynProp.Value и cir.Diameter и только если не совпадают - тогда менять, то можно уменьшить количество анонимных блоков.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Дмитрий Загорулькин 28-01-2015, 10:42:03

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
В общем, считаете, что идея использовать динблоки в отрисовке никуда не годится?
Моё мнение - не годится. Нужно придумать что-то попроще.
« Последнее редактирование: 28-01-2015, 14:01:42 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Цитировать
P.S.: Кстати с кодом я особенно не разбирался, но подозреваю, что если сначала проверить не совпадают ли dynProp.Value и cir.Diameter и только если не совпадают - тогда менять, то можно уменьшить количество анонимных блоков.
Да это просто тестовый пример. В боевых условиях предполагался набор параметров с вычисляемыми значениями. Там все сложнее (Civil 3D).
Цитировать
Нужно придумать что-то попроще.
Хех... попроще - это в итоге посложнее. Задача такая - чтобы пользователи сами могли составлять отображения объектов. Динблоки в этом плане выглядели очень соблазнительно... Эх :)

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Хех... попроще - это в итоге посложнее. Задача такая - чтобы пользователи сами могли составлять отображения объектов. Динблоки в этом плане выглядели очень соблазнительно... Эх
А если не секрет - в чем общая задача - почему нельзя, чтоб просто блоки сами себя отображали?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Это я просто для примера привел круг и заменяющий его блок. Мне же нужно таким образом "перерисовать" объекты Civil 3D так, чтобы они отвечали требованиям наших норм.
Вот есть ролик, где я показывал над чем работаю: https://screencast.autodesk.com/Main/Details/f2fd3719-a367-4980-a76b-f943e0cfce90

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Сильно...
есть вариант попробовать мемоизацию по всем параметрам...
А может хватит команды "создать копию с блоками по нашим требованиям"

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
есть вариант попробовать мемоизацию по всем параметрам...
Можно, но уже не хочется. Потому как, есть сильные подозрения, что еще какая-нибудь пакость вылезет. Я уже и так много чего намудрил, чтобы хотя бы это получить. А если еще ввести дополнительные сложности, то получится уже франкенштейн какой-то а не программа. У меня есть запасной вариант. Правда, он сложнее в реализации, но риск, что что-то не будет работать минимален.
А может хватит команды "создать копию с блоками по нашим требованиям"
Такое уже есть, пользуются уже не первый год. Лучше, чем ничего, но не очень удобно.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Нужно придумать что-то попроще.
В общем, буду прорабатывать вариант с описанием геометрии в XML файле. На первый взгляд, получается довольно неплохо: https://screencast.autodesk.com/main/details/0ead74d4-642c-43d5-9370-e6d560f35fa6
Посмотрим, как дальше пойдет.
Спасибо за советы!