Фатальная ошибка при работе DrawJig

Автор Тема: Фатальная ошибка при работе DrawJig  (Прочитано 21629 раз)

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

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет! Эта проблема не дает мне покоя уже оооочень много времени!
Иногда пишет просто фатальную ошибку, иногда - недостаточно памяти
Основных загвоздок две:
1. Ошибка происходит во время Jig, поэтому не могу использовать отладку
2. (ВАЖНО) Ошибка происходит только в некоторых файлах! Причем, чем они отличаются от других - так сразу и не поймешь

Краткие действия функции:
1. Из файла на жестком диске копируется таблица в текущий чертеж
2. Пользователь указывает точку и таблица туда перемещается
В общем - банальная вставка таблицы
После долгих мучений и всяческих переделок я добавил в функцию возможность отключения динамической отрисовки таблицы на курсоре. Иными словами - без использования Jig. В этом случае - проблем не наблюдается
Сам метод примерно такой:
Код - C# [Выбрать]
  1. private void InsertTable(string pointAligin, ContentControl selectedItem, bool dynamicInsert)
  2. {
  3.     var doc = AcApp.DocumentManager.MdiActiveDocument;
  4.     var db = doc.Database;
  5.  
  6.     // Блокируем документ
  7.     using (doc.LockDocument())
  8.     {
  9.         using (var tr = doc.TransactionManager.StartTransaction())
  10.         {
  11.            
  12.             // Копируем таблицу из файла ресурсов - для вопроса не важно
  13.            
  14.             // Масштабируем до перемещения для правильного отображения
  15.             var mat = Matrix3d.Scaling(Scale(CbScales.SelectedItem.ToString()), tbl.Position);
  16.             tbl.TransformBy(mat);
  17.  
  18.             if (dynamicInsert)
  19.             {
  20.                 // Перемещаем с джигой
  21.                 var jig = new TableDrag();
  22.                 var jigresult = jig.StartJig(tbl, pointAligin);
  23.                 if (jigresult.Status != PromptStatus.OK)
  24.                 {
  25.                     tbl.Erase();
  26.                     return;
  27.                 }
  28.                 tbl.Position = jig.TablePositionPoint();
  29.                 doc.TransactionManager.QueueForGraphicsFlush();
  30.             }
  31.  
  32.             // Потом настройка таблицы - для вопроса не важно
  33.  
  34.             tr.Commit();
  35.         }
  36.     }
  37. }
Ну и "джига":
Извините, вам запрещён просмотр содержимого спойлеров.

Изначально в коде использовался EntityJig. Потом я изменил на DrawJig - случаи возникновения ошибок стали реже

Единственная надежда которая осталась - что более опытные разработчики "на глаз" смогут выдвинуть правильное предположение  ;)

Важное замечание: Ошибка возникает при работе в AutoCad 2016. Попробовал - "больной" файл пересохранил в 2010 и проверил - ошибки нет. 2011-2015 не пробовал. В 2017 автокаде ошибки тоже нет!

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Фатальная ошибка при работе DrawJig
« Ответ #1 : 04-04-2016, 08:37:25 »
Эта проблема не дает мне покоя уже оооочень много времени!

Попробуй вызвать Dispose() на mat, jig, jigresult после их использования. Как вариант заключи в блок using (....). Скорее всего поможет.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Фатальная ошибка при работе DrawJig
« Ответ #2 : 04-04-2016, 08:42:19 »
Попробуй вызвать Dispose() на mat, jig, jigresult после их использования
Проблема в том, что ошибка происходит во время jig, а не после

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Фатальная ошибка при работе DrawJig
« Ответ #3 : 04-04-2016, 08:51:03 »
Проблема в том, что ошибка происходит во время jig, а не после
переменные однако ты тоже объявляешь во время jig, а не после ;-)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Фатальная ошибка при работе DrawJig
« Ответ #4 : 04-04-2016, 10:19:37 »
// Копируем таблицу из файла ресурсов - для вопроса не важно
Думаю, что в этой части может быть проблема.
Как вариант - проблемы с кодом вообще нет, а есть проблема с AutoCAD 2016 на отдельно взятой машине :)

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Фатальная ошибка при работе DrawJig
« Ответ #5 : 04-04-2016, 10:37:21 »
Как вариант - проблемы с кодом вообще нет, а есть проблема с AutoCAD 2016 на отдельно взятой машине
Проблема с 2016 автокадом, только не на отдельно взятой машине, а в отдельно взятых файлах

И как я уже написал - если исключить из кода jig (просто указание точки и перемещение таблицы в эту точку), то ошибки нет

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Фатальная ошибка при работе DrawJig
« Ответ #6 : 04-04-2016, 12:49:52 »
если исключить из кода jig (просто указание точки и перемещение таблицы в эту точку), то ошибки нет
Dispose() попробовал?
если исключить из кода jig (просто указание точки и перемещение таблицы в эту точку), то ошибки нет
Из кода не понятно как создан tbl? это резидент или не резидент в базе данных.  Может и не важно, но по коду не догадаться.
Очень смущают строчки tbl.Erase(); а после tbl.Position = jig.TablePositionPoint(); смахивает на обращение  к свойству удаленного объекта.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Фатальная ошибка при работе DrawJig
« Ответ #7 : 04-04-2016, 12:50:13 »
если исключить из кода jig (просто указание точки и перемещение таблицы в эту точку), то ошибки нет
Из кода не понятно как создан tbl? это резидент или не резидент в базе данных.  Может и не важно, но по коду не догадаться.
Очень смущают строчки tbl.Erase(); а после tbl.Position = jig.TablePositionPoint(); смахивает на обращение  к свойству удаленного объекта.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Фатальная ошибка при работе DrawJig
« Ответ #8 : 04-04-2016, 12:58:09 »
Из кода не понятно как создан tbl? это резидент или не резидент в базе данных
Таблица копируется в текущую БД с помощью WblockCloneObjects. Т.е. до момента перемещения таблица уже присутствует в чертеже. По рукой кода нет, могу только через декомпилятор показать
Извините, вам запрещён просмотр содержимого спойлеров.

Ну а Erase() срабатывает только если пользователь отменил работу Jig. Т.е. такого как вы написали - Очень смущают строчки tbl.Erase(); а после tbl.Position = jig.TablePositionPoint(); - не происходит

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатальная ошибка при работе DrawJig
« Ответ #9 : 04-04-2016, 13:04:51 »
Александр Пекшев aka Modis,
После  tbl.Erase(); я но не хватает tr.Commit(); если конечно tbl содержится в базе. В прочем в этом случае мне не понятно зачем DrawJig - его обычно используют для объектов не содержащихся в базе.
Еще смущает _currPoint.DistanceTo(_prevPoint) > 1e-6; - слишком часто будет перерисовываться таблица.
Да и вообще этот тот случай, когда лучше было бы рисовать прямоугольник вместо таблицы. Его значительно легче спозиционировать.
Еще вместо:
Код - C# [Выбрать]
  1.             draw.Geometry.Draw(_table);
  2.  
  3.             return true;
я бы использовал
Код - C# [Выбрать]
  1.             return draw.Geometry.Draw(_table);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Фатальная ошибка при работе DrawJig
« Ответ #10 : 04-04-2016, 13:09:17 »
Еще смущает _currPoint.DistanceTo(_prevPoint) > 1e-6; - слишком часто будет перерисовываться таблица
Думаю вот тут и основная проблема, т.к. иногда автокад вылетает с ошибкой "Недостаточно памяти".
Александр, посоветуйте другое значение предела сравнения
Да и вообще этот тот случай, когда лучше было бы рисовать прямоугольник вместо таблицы. Его значительно легче спозиционировать
Если не сработает изменение предела, то попробую использовать просто прямоугольник

Почему DrawJig вместо EntityJig? Так случилось в процессе экспериментов по поиску и устранению ошибки. Да так и осталось :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатальная ошибка при работе DrawJig
« Ответ #11 : 04-04-2016, 13:16:10 »
Александр, посоветуйте другое значение предела сравнения
У меня обычно 1e-3, хотя и это может быть слишком мелким значением. Всё зависит от текущего масштаба единиц. Условно говоря если ты имеешь дело со строительным чертежом, в котором единицы - миллиметры, то 1e-1 будет вполне достаточно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Фатальная ошибка при работе DrawJig
« Ответ #12 : 04-04-2016, 13:17:16 »
Александр Ривилис, спасибо. Вечером буду экспериментировать ))

Отмечено как Решение Александр Пекшев aka Modis 05-04-2016, 21:32:02

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатальная ошибка при работе DrawJig
« Ответ #13 : 04-04-2016, 13:23:42 »
Еще поэкспериментируй с установкой tbl.SuppressRegenerateTable(true);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Фатальная ошибка при работе DrawJig
« Ответ #14 : 04-04-2016, 14:30:54 »
Вечером буду экспериментировать ))
У тебя сразу после 1ого запуска команды ошибки или после 2-3 ого?
Dispose все-таки проверь, т.к. либо ты вызовешь его либо за тебя это сделает сборщик мусора и позже, например во время 2-3 выполнения команды.