Не работает метод AcDbDatabase::readDwgFile

Автор Тема: Не работает метод AcDbDatabase::readDwgFile  (Прочитано 12396 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Есть обычная тестовая функция следующего вида:
Код - C++ [Выбрать]
  1. void testReadDwgFile()
  2. {
  3.   AcDbDatabase* pDbFile = new AcDbDatabase(Adesk::kFalse);
  4.   Acad::ErrorStatus errorStatus = pDbFile->readDwgFile(ACRX_T("D:\\Test.dwg"), AcDbDatabase::kForReadAndAllShare);
  5.  
  6.   if(errorStatus == Acad::eOk)  AfxMessageBox(ACRX_T("Acad::eOk"));
  7.   else if(errorStatus == Acad::eNoInputFiler) AfxMessageBox(ACRX_T("Acad::eNoInputFiler"));
  8.   else AfxMessageBox(ACRX_T("Неизвестная ошибка"));
  9.  
  10.   delete pDbFile;
  11. }
При условии существования файла D:\Test.dwg эта функция выдает сообщение с Acad::eOk. То есть, доступ к файлу есть.
Другая функция - это CallBack функция для BubbleWindow:
Код - C++ [Выбрать]
  1. void bubbleWindowCallback(void* pData, int nReturnCode)
  2. {
  3.   if (nReturnCode == AcTrayItemBubbleWindowControl::BUBBLE_WINDOW_HYPERLINK_CLICK)
  4.   {
  5.      AcDbDatabase* pDbFile = new AcDbDatabase(Adesk::kFalse);
  6.      Acad::ErrorStatus errorStatus = pDbFile->readDwgFile(ACRX_T("D:\\Test.dwg"), AcDbDatabase::kForReadAndAllShare);
  7.  
  8.      if(errorStatus == Acad::eOk) AfxMessageBox(ACRX_T("Acad::eOk"));
  9.      else if(errorStatus == Acad::eNoInputFiler) AfxMessageBox(ACRX_T("Acad::eNoInputFiler"));
  10.      else AfxMessageBox(ACRX_T("Неизвестная ошибка"));
  11.  
  12.      delete pDbFile;
  13.   }
  14. }
Эта функция выдает сообщение Acad::eNoInputFiler.
В чем причина, понять не могу. В принципе код один и тот же, а результат разный. В первом случае доступ к файлу есть, во втором случае доступа к файлу нет.
Помогите, кто может.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #1 : 01-11-2020, 00:30:27 »
Помогите, кто может.
Обращение к API работы с базой данных чертежа не из основного потока приложения AutoCAD недопустимо.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #2 : 01-11-2020, 00:42:45 »
Обращение к API работы с базой данных чертежа не из основного потока приложения AutoCAD недопустимо.
А обойти это как-то можно?
Обновление внешних ссылок из BubbleWindow как-то ведь происходит.
Может какой-нибудь реактор реагирует на нажатие на BubbleWindow?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #3 : 01-11-2020, 00:59:46 »
А обойти это как-то можно?
Попытаться запустить из основного потока. Не уверен что это получится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #4 : 01-11-2020, 01:01:41 »
А в чем смысл всего этого действия? Может быть можно как-то иначе это всё решить?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #5 : 01-11-2020, 01:12:18 »
Моя программа читает данные из других файлов DWG и нужно обеспечивать синхронность данных в разных файлах. Для проверки этой синхронности есть соответствующее диалоговое окно. Но это окно надо явно вызывать. То есть можно просто забыть это сделать. Я хотел сделать что-то похожее на работу Автокада с внешними ссылками. То есть периодически проверять в фоновом режиме синхронность данных и если данные различаются, то показывать BubbleWindow с предупреждением так же, как это делает Автокад для внешних ссылок. Если пользователь захочет данные синхронизировать, то просто нажимает на Hyperlink в BubbleWindow и данные обновляются. Вот тут то и надо открывать внешние файлы и читать данные из этих файлов. Для пользователя это удобно. К тому же поддерживает интерфейс Автокада. Ну вот тут и наткнулся на проблему. Через простой диалог все уже работает давно. Хотел добавать функционала. Не люблю, когда мои идеи не осуществляются. Хотелось бы и здесь добиться нужного мне результата. Автоматизировать полностью синхронизацию мне нельзя. Нужен обязательно контроль пользователя.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #6 : 01-11-2020, 01:15:48 »
Baton,
А если из этой callback-функции запустить команду, которая и будет выполнять синхронизацию? Её можно сделать такой, чтобы она не попадала в историю команд...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #7 : 01-11-2020, 01:21:36 »
Её можно сделать такой, чтобы она не попадала в историю команд...
Я не понимаю, что для этого надо сделать. В callback-функции просто была вложена нужная мне функция, то это не то. Если был бы какой-то реактор на это, то в реактор можно было бы передать соответствующий сигнал, что надо делать. Но реактора на BubbleWindow я не нашел.

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #8 : 01-11-2020, 01:22:58 »
Можно, конечно, просто вывести информационное сообщение, но это как-то примитивно :).

Отмечено как Решение Baton 01-11-2020, 09:41:44

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #9 : 01-11-2020, 01:28:06 »
Baton,
В функции bubbleWindowCallback через AcApDocManager::sendStringToExecute запускаете команду, в которой выполняете синхронизацию. Команду можете назвать как угодно. Например, BatonSyncronization.
Чтобы команда не попала в историю команд её нужно определить с флагом ACRX_CMD_NOHISTORY
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #10 : 01-11-2020, 01:36:06 »
через AcApDocManager::sendStringToExecute запускаете команд
Спасибо за наводку. Завтра попробую.

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Re: Не работает метод AcDbDatabase::readDwgFile
« Ответ #11 : 01-11-2020, 09:41:38 »
В функции bubbleWindowCallback через AcApDocManager::sendStringToExecute запускаете команду, в которой выполняете синхронизацию.
Это решение. Все получилось. Огромное спасибо.