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

30/05/2013

Проверка состояния готовности AutoCAD с использованием OLE

Вопрос:
Как можно проверить статус готовности AutoCAD средствами OLE автоматизации? Как можно предотвратить диалог  "Ошибка. Сервер занят" ("Server Busy Error")?

Ответ:
Для надежной проверки того доступен ли AutoCAD для вызова или нет вы можете использовать проверку IAcadState. Вам нужно создать глобальный инициализированный объект IAcadState в момент когда AutoCAD не занят. Для любых последующих запросов автоматизации вы можете проверять состояние занятости AutoCAD используя объект IAcadState, а затем или дождаться когда AutoCAD освободится или отменить запрос.

Также вы можете использовать класс COleMessageFilter для установки свойств OLE автоматизации. Если вы не хотите чтобы появлялся диалог ошибки занятости сервера, вы можете подавить его, используя COleMessageFilter. Вы можете заставить своё приложение ждать пока AutoCAD не освободится и будет готов выполнять ваши запросы без показа диалога занятости сервера. Следующий пример показывает как можно этого достичь:

Код - C++: [Выделить]
  1. COleException e;
  2. CComPtr<IAcadApplication>  aApp;
  3. CComPtr<IAcadState>   aState;
  4. COleMessageFilter* pFilter;
  5.  
  6. // Инициализируем IAcadState
  7. // чтобы быть уверенным что AutoCAD
  8. // готов выполнить запрос.
  9. void iniState()
  10. {
  11.     // Получаем активный AutoCAD – мы внутри процесса
  12.   IDispatch* pDisp = acedGetAcadWinApp()->GetIDispatch(TRUE);
  13.     HRESULT hr = pDisp->QueryInterface(IID_IAcadApplication,
  14. (void**)&aApp);
  15.     if(FAILED(hr))
  16.         return;
  17.  
  18.      if(aApp != NULL)
  19.      {  
  20.          aApp->GetAcadState(&aState);
  21.     }
  22. }
  23.  
  24. // Позже когда мы хотим выполнить обращение к AutoCAD,
  25. // проверим IAcadState и только тогда используя
  26. // AcadState проверим занят он или нет
  27. void checkIfBusy()
  28. {
  29.     VARIANT_BOOL bReady = VARIANT_FALSE;
  30.      aState->get_IsQuiescent(&bReady);
  31.     if(bReady == VARIANT_TRUE)
  32.     {
  33.         CComPtr<IAcadDocument> aDoc;
  34.         aApp->get_ActiveDocument(&aDoc);
  35.  
  36.     }
  37.     else
  38.         AfxMessageBox(_T("AutoCAD сейчас занят!"),
  39.            MB_SYSTEMMODAL );
  40. }
  41. // Вы можете также захотеть изменить стандартное поведение приложения
  42. // в том, как оно обрабатывает состояние занятости сервера.
  43. // Посмотрите детали в MSDN
  44.  
  45. //// устанавливаем свойства взаимодействия приложения с OLE
  46.     pFilter = AfxOleGetMessageFilter();
  47.  
  48.     ASSERT(pFilter != NULL);   
  49.  
  50.     DWORD dTimedelay = 1000;
  51.     pFilter->SetMessagePendingDelay(dTimedelay);
  52.     dTimedelay = -1;
  53.     pFilter->SetRetryReply(dTimedelay);
  54.  
  55.     pFilter->EnableBusyDialog(FALSE);
  56.     pFilter->EnableNotRespondingDialog(FALSE);

 

Источник: http://adndevblog.typepad.com/autocad/2013/01/check-the-idle-status-of-autocad-using-ole.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=75.0

Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 01:48:28