TransformOverrule для Explode. Предупреждение "Forgot to call Dispose?".

Автор Тема: TransformOverrule для Explode. Предупреждение "Forgot to call Dispose?".  (Прочитано 8682 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Столкнулся с тем, что Visual Studio выдает предупреждение при вызове команды Explode, если был переопределен метод TransformOverrule.Explode для объекта. В этом методе я создаю свои примитивы и добавляю их в коллекцию, которая является вторым параметром метода. Я так понимаю, что в дальнейшем AutoCAD должен сам обрабатывать эти объекты при вызове команды взрыва. Но, почему - то студия на них ругается.
В блоге у Кина Волмсли есть хороший пример по использованию TransformOverrule: http://through-the-interface.typepad.com/through_the_interface/2009/04/overruling-explode-in-autocad-2010-using-net.html. Продемонстрирую это поведение на его коде:

Как считаете, это означает, что что-то не так или не стоит обращать на это внимание?

Отмечено как Решение Дмитрий Загорулькин 15-04-2016, 00:51:32

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как считаете, это означает, что что-то не так или не стоит обращать на это внимание?
Считаю, что не стоит обращать внимания. Этот метод вызывается из вне и на это "из вне" и возложена функция вызова Dispose. Т.е. если это результат вызова команды EXPLODE, то всё что в этой коллекции будет добавлено в чертеж и вызван метод Dispose, который в данном случае будет эквивалентен вызову Close. А если вызывается просто метод Explode, который в свою очередь вызовет этот перегруженный метод, то вызвавший этот метод должен будет вызвать Dispose для всех элементов коллекции, если не собирается добавлять эти примитивы в базу данных.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, я это понимаю. Просто это сообщение всегда воспринимал как сигнал большой опасности - незакрытые объекты рано или поздно приводят к фатальному завершению работы. А тут оказалось, что это не всегда так.
Тогда, возможно, это предупреждение (Forgot to call Dispose?) - результат работы некой проверки, которая работает по примерно такой схеме: если код в подгруженной внешней dll создает/открывает объекты и эти объекты не закрыты по завершению работы этого кода, то выводить предупреждение. Если так, то переживать действительно не о чем.
Т.е. если это результат вызова команды EXPLODE, то всё что в этой коллекции будет добавлено в чертеж и вызван метод Dispose, который в данном случае будет эквивалентен вызову Close.
А это можно как-то проверить? Или Вы уверены на 100%, что это так?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А это можно как-то проверить? Или Вы уверены на 100%, что это так?
ARXDBG или MgdDBG, включай реакторы и отслеживай. Но я уверен на 100%.
В любом случае ты ничего изменить не сможешь - если вызовешь метод Dispose добавленного в коллекцию objs примитива, то Fatal Error подкрадётся незаметно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
На самом деле, есть еще один способ реализации взрыва. С точки зрения самой идеи метода TransformOverrule.Explode он совершенно неправильный, но вполне рабочий :)
Вместо того, чтобы объект добавлять в коллекцию, можно его сразу же добавить в чертеж, а коллекцию оставить пустой (точнее, без изменений). Конечно, в этом случае, при вызове в коде метода Entity.Explode мы получим совершенно иное поведение, сродни лисповской функции vla-Explode. Но такой подход позволяет в качестве "осколков" выдавать, например, блоки с атрибутами. В "правильной" реализации это сделать не получится - значения атрибутов можно задать только после добавления блока в базу чертежа.