Работа с OLE

Автор Тема: Работа с OLE  (Прочитано 7677 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Работа с OLE
« : 22-02-2016, 19:38:21 »
Доброго времени суток.
Вопрос следующий.
Есть команда _OLEOPEN для OLE объектов, вставленных в AutoCAD
В данном примере  это табличка EXCEL.
OLE объект внедрен в модель AutoCAD и нет ссылки на файл Excel.

Существует ли в AutoCAD API методы, которые аналогичны команде _OLEOPEN
База данных dwg открывается методом db.ReadDwgFile в фоновом режиме без интерфейса AutoCAD
и нет возможности использовать командную строку AutoCAD.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с OLE
« Ответ #1 : 22-02-2016, 20:48:19 »
Существует ли в AutoCAD API методы, которые аналогичны команде _OLEOPEN
Нет. Вот единственное, что можно сделать: http://adndevblog.typepad.com/autocad/2012/04/update-linked-ole-object-from-net.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Работа с OLE
« Ответ #2 : 22-02-2016, 23:21:45 »
Благодарен за ответ!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с OLE
« Ответ #3 : 23-02-2016, 00:09:35 »
Благодарен за ответ!
Поторопился. Я тут покопал и обнаружил, что средствами ObjectARX это теоретически возможно:
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6.  
  7. //-----------------------------------------------------------------------------
  8. #define szRDS _RXST("")
  9.  
  10. //-----------------------------------------------------------------------------
  11. //----- ObjectARX EntryPoint
  12. class COLE2EditApp : public AcRxArxApp {
  13.  
  14. public:
  15.   COLE2EditApp () : AcRxArxApp () {}
  16.  
  17.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  18.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;
  19.     return (retCode) ;
  20.   }
  21.  
  22.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  23.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  24.     return (retCode) ;
  25.   }
  26.  
  27.   virtual void RegisterServerComponents () {}
  28.  
  29.   static void OLEOLE2Edit () {
  30.     ads_name en; ads_point p;
  31.     if (acedEntSel(L"\nВыберите OLE-объект: ", en, p) == RTNORM) {
  32.       AcDbObjectId eid; acdbGetObjectId(eid,en);
  33.       AcDbObjectPointer<AcDbOle2Frame> pFrame(eid, AcDb::kForWrite);
  34.       if (pFrame.openStatus() == Acad::eOk) {
  35.         COleClientItem *pClient = pFrame->getOleClientItem();
  36.         if (pClient)  {
  37.           pClient->DoVerb(OLEIVERB_OPEN, NULL);
  38.         }
  39.       } else if (pFrame.openStatus() == Acad::eWrongObjectType) {
  40.         acutPrintf(L"\nЭто не OLE-объект!");
  41.       } else {
  42.         acutPrintf(L"\nОшибка открытия объекта!");
  43.       }
  44.     }
  45.  
  46.   }
  47.  
  48. } ;
  49.  
  50. //-----------------------------------------------------------------------------
  51. IMPLEMENT_ARX_ENTRYPOINT(COLE2EditApp)
  52.  
  53. ACED_ARXCOMMAND_ENTRY_AUTO(COLE2EditApp, OLE, OLE2Edit, OLE2Edit, ACRX_CMD_MODAL, NULL)
  54.  
  55.  

Т.е. вместо команды _OLEOPEN я написал команду _OLE2EDIT, которая вот так работает:


Возникает единственная проблема, что (так же как и в команде _OLEOPEN), _OLE2EDIT работает асинхронно, т.е. команда уже закончилась, а редактирование еще не началось. Поэтому видимо понадобится еще реактор на завершение редактирования и продолжать работу можно только после того, как этот реактор сработает.
Сделать это средствами .NET через P/Invoke я думаю возможно, но очень кропотливо и будет зависеть от версии и разрядности AutoCAD и MFC.

Мне вот одно непонятно - зачем таким образом работать с dwg-файлами, открываемыми через ReadDwgFile в фоновом режиме, если всё-равно собираешься OLE-объекты редактировать в Excel вручную? Для меня это полная загадка.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Работа с OLE
« Ответ #4 : 23-02-2016, 12:58:55 »
Кстати:
Код - C++ [Выбрать]
  1. BOOL bRun = pClient->IsRunning();
позволяет узнать редактируется ли OLE-объект, или редактирование закончено и сервер (в данном случае Excel) завершил работу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение