Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Baton от 01-11-2020, 00:26:05

Название: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Baton от 01-11-2020, 00:26:05
Есть обычная тестовая функция следующего вида:
Код - 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.
В чем причина, понять не могу. В принципе код один и тот же, а результат разный. В первом случае доступ к файлу есть, во втором случае доступа к файлу нет.
Помогите, кто может.
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Александр Ривилис от 01-11-2020, 00:30:27
Помогите, кто может.
Обращение к API работы с базой данных чертежа не из основного потока приложения AutoCAD недопустимо.
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Baton от 01-11-2020, 00:42:45
Обращение к API работы с базой данных чертежа не из основного потока приложения AutoCAD недопустимо.
А обойти это как-то можно?
Обновление внешних ссылок из BubbleWindow как-то ведь происходит.
Может какой-нибудь реактор реагирует на нажатие на BubbleWindow?
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Александр Ривилис от 01-11-2020, 00:59:46
А обойти это как-то можно?
Попытаться запустить из основного потока. Не уверен что это получится.
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Александр Ривилис от 01-11-2020, 01:01:41
А в чем смысл всего этого действия? Может быть можно как-то иначе это всё решить?
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Baton от 01-11-2020, 01:12:18
Моя программа читает данные из других файлов DWG и нужно обеспечивать синхронность данных в разных файлах. Для проверки этой синхронности есть соответствующее диалоговое окно. Но это окно надо явно вызывать. То есть можно просто забыть это сделать. Я хотел сделать что-то похожее на работу Автокада с внешними ссылками. То есть периодически проверять в фоновом режиме синхронность данных и если данные различаются, то показывать BubbleWindow с предупреждением так же, как это делает Автокад для внешних ссылок. Если пользователь захочет данные синхронизировать, то просто нажимает на Hyperlink в BubbleWindow и данные обновляются. Вот тут то и надо открывать внешние файлы и читать данные из этих файлов. Для пользователя это удобно. К тому же поддерживает интерфейс Автокада. Ну вот тут и наткнулся на проблему. Через простой диалог все уже работает давно. Хотел добавать функционала. Не люблю, когда мои идеи не осуществляются. Хотелось бы и здесь добиться нужного мне результата. Автоматизировать полностью синхронизацию мне нельзя. Нужен обязательно контроль пользователя.
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Александр Ривилис от 01-11-2020, 01:15:48
Baton,
А если из этой callback-функции запустить команду, которая и будет выполнять синхронизацию? Её можно сделать такой, чтобы она не попадала в историю команд...
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Baton от 01-11-2020, 01:21:36
Её можно сделать такой, чтобы она не попадала в историю команд...
Я не понимаю, что для этого надо сделать. В callback-функции просто была вложена нужная мне функция, то это не то. Если был бы какой-то реактор на это, то в реактор можно было бы передать соответствующий сигнал, что надо делать. Но реактора на BubbleWindow я не нашел.
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Baton от 01-11-2020, 01:22:58
Можно, конечно, просто вывести информационное сообщение, но это как-то примитивно :).
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Александр Ривилис от 01-11-2020, 01:28:06
Baton,
В функции bubbleWindowCallback через AcApDocManager::sendStringToExecute запускаете команду, в которой выполняете синхронизацию. Команду можете назвать как угодно. Например, BatonSyncronization.
Чтобы команда не попала в историю команд её нужно определить с флагом ACRX_CMD_NOHISTORY
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Baton от 01-11-2020, 01:36:06
через AcApDocManager::sendStringToExecute запускаете команд
Спасибо за наводку. Завтра попробую.
Название: Re: Не работает метод AcDbDatabase::readDwgFile
Отправлено: Baton от 01-11-2020, 09:41:38
В функции bubbleWindowCallback через AcApDocManager::sendStringToExecute запускаете команду, в которой выполняете синхронизацию.
Это решение. Все получилось. Огромное спасибо.