Чем вызваны вылеты Civil 3D в процессе расчленения его объектов?

Автор Тема: Чем вызваны вылеты Civil 3D в процессе расчленения его объектов?  (Прочитано 19157 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Тут ARXDBG и MGDDBG должны помочь.
Я не смог найти там нужных инструментов. Нет там такого события "объект был открыт на чтение". Может просто проглядел - глаза уже от этих тестов немного в кучку...
Написал тестовый код, погонял. Тесты показали - да, нет входа в Open для BlockTableRecord, когда BlockReference открывается на чтение.

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, в Cancel не попадает ни разу при выполнении кода.
Я сейчас делаю пошаговое выполнение, провожу очень тщательный анализ всего что происходит. Есть задумка по итогу собрать всё то странное что найду и отправить в DevHelp.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, в Cancel не попадает ни разу при выполнении кода.
Ну если до входа в Idle нет закрытия, то похоже на баг в Civil 3D.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ну если до входа в Idle нет закрытия
А как это поймать?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну если до входа в Idle нет закрытия
А как это поймать?
Подпишись на событие Idle в конце своей команды Run, не вызывая CurrentLabelBlockComponentsNames = null;
В этом событии выведи результаты. Ну и сразу отпишись от события Idle.
Альтернативным может быть событие: Editor.EnteringQuiescentState
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Интересно, что в Civil 3D 2008 такая ошибка возникает и без дополнительных приложений (во всяком случае про то, что такие приложения установлены ни слова не сказано): https://forums.autodesk.com/t5/civil-3d-forum/drawings-getting-map-error/td-p/2046148
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Я подозреваю, что при открытии BlockReference открывается и соответствующая ему BlockTableRecord для чтения каких-то данных для BlockReference. И как раз на этом и происходит сбой.

Правильно подозреваешь. И возможно причина вылетов в этом.

Как писал ранее Александр Ривилис:
Кстати, BlockReference.Name открывает соответствующий BlockTableRecord и уже оттуда берёт Name.

Недавно наткнулся, что BlockReference.Name работает, если существует тот самый BlockTableRecord, а если имя брать неоткуда, то происходит вылет.

Возможно ты расчленяешь свои объекты, добавляешь в базу данных и запрашиваешь имя в одной транзакции. Возможно надо поэтапно, и возможно не только Name.

Для того, чтобы не было вылетов, при запросе имени не используй BlockReference.Name напрямую, попробуй такой подход для обхода и поиска проблемы:
Код - C# [Выбрать]
  1. ObjectId idRef = br.BlockTableRecord;//ну или AnonymousBlockTableRecord, DynamicBlockTableRecord смотря что надо
  2. if (idRef.IsValid)
  3. {
  4.    BlockTableRecord block = tr.GetObject(idRef, OpenMode.ForRead) as BlockTableRecord;
  5.    if (block != null)
  6.    {
  7.       string name = block.Name;
  8.    }
  9. }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Возможно ты расчленяешь свои объекты, добавляешь в базу данных и запрашиваешь имя в одной транзакции. Возможно надо поэтапно
Вынести расчленение вообще в отдельную транзакцию? А это мысль. Спасибо, попробую! Но уже не сегодня и не в ближайшие несколько дней. Пока пришлось отложить эту проблему.