Фатальная ошибка при AcDbDatabase::readDwgFile

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

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

Оффлайн LegaCADАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Перед открытием файла в AutoCAD 2015 мое ARX-приложение загружает dwg для проверки:
Код - C++ [Выбрать]
  1. AcDbDatabase* pDwg = new AcDbDatabase(false, true);
  2. pDwg->readDwgFile(pszDwgPath);
Все работает нормально, если файл простой. А если в нем есть прокси-объекты, то автокад "валится" с фатальной ошибкой внутри readDwgFile. Но, если в автокаде уже открыт хоть один документ, то все работает без проблем. Я примерно понимаю, какие процессы происходят, но не встречал в документации каких-то ограничений на readDwgFile. Это нормальное поведение readDwgFile?
« Последнее редактирование: 30-11-2016, 18:18:30 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А если в нем есть прокси-объекты, то автокад "валится" с фатальной ошибкой внутри readDwgFile. Но, если в автокаде уже открыт хоть один документ, то все работает без проблем.
Не сталкивался с таким. Но если такое происходит, то просто создай еще один пустой документ.
Надеюсь установлены все обновления для AutoCAD 2015?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще одна мысль. Если нет ни одного открытого документа (ты можешь это проверить), то попробуй использовать конструктор:
Код - C++ [Выбрать]
  1. AcDbDatabase* pDwg = new AcDbDatabase(false, false);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LegaCADАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Но если такое происходит, то просто создай еще один пустой документ.
Надеюсь установлены все обновления для AutoCAD 2015?
От обновлений не зависит. Я пока так и делал и это работает. Но нужно быть уверенным в наличии .dwt и на экране вкладка моргает.

Еще одна мысль. Если нет ни одного открытого документа (ты можешь это проверить), то попробуй использовать конструктор:
Код - C++ [Выбрать]
  1. AcDbDatabase* pDwg = new AcDbDatabase(false, false);
А вот это пока работает.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот это пока работает.
Ага! Значит и на этот раз интуиция не подвела. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LegaCADАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
А вот это пока работает.
Ага! Значит и на этот раз интуиция не подвела. :)
Да, какое внезапное поведение параметра... :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, какое внезапное поведение параметра... :)
Тут как раз всё логично - этот параметр при true требует наличия хотя бы одного документа. Скорее нелогично почему только при прокси в этом случае Fatal Error. Кстати, при false и наличии AcDbOle2Frame ты не сможешь их перемещать - эта информация на всякий случай. Возможно это не единственное побочное действие.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LegaCADАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
А вот это пока работает.
Ага! Значит и на этот раз интуиция не подвела. :)
Недолго музыка играла. :(  Нашелся dwg с прокси и с отсутствующими shx и ага. При открытии нового документа не падает.
Сейчас новый документ создается из шаблона acad.dwt. Можно рассчитывать, что он есть всегда и будет открываться без проблем?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Сейчас новый документ создается из шаблона acad.dwt. Можно рассчитывать, что он есть всегда и будет открываться без проблем?
Нет. Кстати, а почему не acadiso.dwt?
Но никто не мешает тебе создать пустой dwt-файл на лету:
Код - C++ [Выбрать]
  1. AcDbDatabase *pdb = new AcDbDatabase(true);
  2. pdb->saveAs(L"путь к dwt-файлу");
  3. delete pdb;
Ну а дальше его использовать как шаблон.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LegaCADАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Сейчас новый документ создается из шаблона acad.dwt. Можно рассчитывать, что он есть всегда и будет открываться без проблем?
Нет. Кстати, а почему не acadiso.dwt?
В данном случае без разницы, окно же сразу закроется, пользователь только увидит мелькание закладки от него сможет.
Предположение об неизменности следует из его места расположения. Но идею я понял.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатальная ошибка при AcDbDatabase::readDwgFile
« Ответ #10 : 01-12-2016, 21:42:43 »
Кстати, а почему не пойти другим путём и не препятствовать закрытию последнего открытого документа?
Вообще каким образом у тебя возникает ситуация, когда нет ни одного открытого документа?
Zero-document state - это очень неустойчивое состояние AutoCAD и лучше в него не попадать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LegaCADАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Фатальная ошибка при AcDbDatabase::readDwgFile
« Ответ #11 : 02-12-2016, 18:09:08 »
Кстати, а почему не пойти другим путём и не препятствовать закрытию последнего открытого документа?
А нечего пока закрывать. "Чтобы продать что-то ненужное..." :)

Вообще каким образом у тебя возникает ситуация, когда нет ни одного открытого документа?
Обработка файла производится до его открытия автокадом.

Zero-document state - это очень неустойчивое состояние AutoCAD и лучше в него не попадать.
Ну это же не повод в нем совсем не работать.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Фатальная ошибка при AcDbDatabase::readDwgFile
« Ответ #12 : 02-12-2016, 18:24:46 »
Обработка файла производится до его открытия автокадом.
В нормальном состоянии при запуске AutoCAD в нём уже есть хотя бы один открытый документ, если конечно ты не пытаешься работать с AutoCAD на этапе его инициализации, чего делать не следует.
Ну это же не повод в нем совсем не работать.
Ты просто сам себе ищешь лишние приключения. Но это твоё право.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LegaCADАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Фатальная ошибка при AcDbDatabase::readDwgFile
« Ответ #13 : 12-12-2016, 16:57:55 »
В нормальном состоянии при запуске AutoCAD в нём уже есть хотя бы один открытый документ, если конечно ты не пытаешься работать с AutoCAD на этапе его инициализации, чего делать не следует.
Поизучал скудный хелп и перенес все проверки и правки в initialDwgFileOpenComplete. Все стало как надо, но все вопросы хелп еще не решил.

Ты просто сам себе ищешь лишние приключения. Но это твоё право.
"Все украдено до нас".  :D