Как открыть файл dwg в отдельном окне

Автор Тема: Как открыть файл dwg в отдельном окне  (Прочитано 13385 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Добрый день
Помогите разобраться, как открыть файл dwg (с диска) в отдельном окне.
Указанный ниже код выводит сообщение, что файл открыт успешно, но в Автокаде не появляется вкладка с новым открытым файлом.
Нужно, чтобы файл открывался в отдельной вкладке, при этом текущим должен оставаться файл, из которого выполняется программа.


Код - C++ [Выбрать]
  1.  
  2. AcDbDatabase * CurrentFileDwg=acdbHostApplicationServices()->workingDatabase(); //сохранить указатель на текущую базу данных
  3.  
  4. //открыть новый файл с диска
  5. CString fName=_T("c:\\000.dwg");
  6. AcDbDatabase *FileDwg = new AcDbDatabase();
  7. Acad::ErrorStatus es = FileDwg->readDwgFile(fName,_SH_DENYNO);
  8. if (es != Acad::eOk) {
  9.         acutPrintf(_T("\nНе удалось прочитать файл <%s>  error = %s!"),fName, acadErrorStatusText(es));
  10.         delete FileDwg;
  11. }
  12. else {
  13.         acutPrintf(_T("\nФайл успешно прочитан <%s>"),fName);
  14. }
  15.  
  16. acdbHostApplicationServices()->setWorkingDatabase(CurrentFileDwg);      //восстановить указатель на текущую базу данных
  17.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Таким способом это сделать нельзя. Только при помощи AcApDocManager::appContextOpenDocument.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пример кода:
Код - 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 CTestOpenApp : public AcRxArxApp {
  13. public:
  14.   CTestOpenApp() : AcRxArxApp() {}
  15.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
  16.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
  17.     return (retCode);
  18.   }
  19.  
  20.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
  21.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
  22.     return (retCode);
  23.   }
  24.  
  25.   virtual void RegisterServerComponents() {     }
  26.  
  27.   static void openDocHelper(void *pData)
  28.   {
  29.     if (acDocManager->isApplicationContext())
  30.     {
  31.       const TCHAR * fileName = (const TCHAR *)pData;
  32.       acutPrintf(TEXT("\nFile Name: %s"), fileName);
  33.       Acad::ErrorStatus es = acDocManager->appContextOpenDocument(fileName);
  34.       if (es != Acad::eOk)
  35.         acutPrintf(TEXT("\nout ERROR: %s\n"), acadErrorStatusText(es));
  36.     }
  37.     else
  38.       acutPrintf(TEXT("\nout ERROR: in Document context :%s\n"),
  39.         acDocManager->curDocument()->fileName());
  40.   }
  41.  
  42.   static void OpenDwg1(CString strFileName)
  43.   {
  44.     if (acDocManager->isApplicationContext())
  45.     {
  46.       Acad::ErrorStatus es = acDocManager->appContextOpenDocument(strFileName);
  47.       if (es != Acad::eOk)
  48.         acutPrintf(TEXT("\nin ERROR: %s\n"), acadErrorStatusText(es));
  49.     }
  50.     else
  51.       acDocManager->executeInApplicationContext(openDocHelper, &strFileName);
  52.   }
  53.  
  54.   static void OpenDwg2(CString strFileName)
  55.   {
  56.     if (acDocManager->isApplicationContext())
  57.     {
  58.       Acad::ErrorStatus es = acDocManager->appContextOpenDocument(strFileName);
  59.       if (es != Acad::eOk)
  60.         acutPrintf(TEXT("\nin ERROR: %s\n"), acadErrorStatusText(es));
  61.     }
  62.     else
  63.       acDocManager->executeInApplicationContext(openDocHelper,
  64.         const_cast<TCHAR *>(strFileName.GetString()));
  65.   }
  66.  
  67.  
  68.   static void MyGroupTest1()
  69.   {
  70.     OpenDwg1(CString(TEXT("C:\\Temp\\test.dwg")));
  71.   }
  72.   static void MyGroupTest2()
  73.   {
  74.     OpenDwg2(CString(TEXT("C:\\Temp\\test.dwg")));
  75.   }
  76.  
  77. };
  78.  
  79. //-----------------------------------------------------------------------------
  80. IMPLEMENT_ARX_ENTRYPOINT(CTestOpenApp)
  81.  
  82. ACED_ARXCOMMAND_ENTRY_AUTO(CTestOpenApp, MyGroup, Test1, Test1, ACRX_CMD_MODAL, NULL)
  83. ACED_ARXCOMMAND_ENTRY_AUTO(CTestOpenApp, MyGroup, Test2, Test2, ACRX_CMD_MODAL, NULL)

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

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Большое спасибо за исходный код!!!

Вопрос. Как сделать, чтобы можно было загружать сразу несколько файлов?
Попробовал сделать несколько вызовов функции подряд, в результате:
1) При выполнении команды открывается только один файл, который становится текущим.
2) Перехожу на исходный файл - открывается второй файл, второй файл становится текущим.
3) Перехожу на исходный файл - отрывается третий файл, третий файл становится текущим.
Как сделать, чтобы отрывались сразу все 3 файла?

Код - C++ [Выбрать]
  1. static void MyGroupTest1()
  2.   {
  3.     OpenDwg1(_T("c:\\Temp\\test01.dwg"));
  4.     OpenDwg1(_T("c:\\Temp\\test02.dwg"));
  5.     OpenDwg1(_T("c:\\Temp\\test03.dwg"));
  6.   }
  7.  

Попробовал в начале функции сохранить текущий документ   - AcApDocument* ApCurDoc = acDocManager->curDocument();
и в конце функции активировать его обратно  - acDocManager->activateDocument(ApCurDoc);
но это не помогло.

Код - C++ [Выбрать]
  1. void OpenDwg1(CString strFileName)
  2.   {
  3.           AcApDocument* ApCurDoc = acDocManager->curDocument();
  4.  
  5.     if (acDocManager->isApplicationContext())
  6.     {
  7.       Acad::ErrorStatus es = acDocManager->appContextOpenDocument(strFileName);
  8.       if (es != Acad::eOk)
  9.         acutPrintf(TEXT("\nIn ERROR: %s\n"), acadErrorStatusText(es));
  10.     }
  11.         else {
  12.                        
  13.       acDocManager->executeInApplicationContext(openDocHelper, &strFileName);
  14.         }
  15.  
  16.         acDocManager->activateDocument(ApCurDoc);
  17.         acDocManager->setCurDocument(ApCurDoc);
  18.   }
  19.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как сделать, чтобы отрывались сразу все 3 файла?
Встречный вопрос - зачем? Ведь одновременно вы всё-равно вы будете работать только с одним файлом.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Программа загружает список файлов, которые необходимо обработать. Список файлов может состоять из нескольких десятков файлов.
Перед началом основных вычислений, программа загружает каждый файл и проверяет содержимое файлов на корректность данных.
Если в результате проверки выявляются файлы с некорректными данными - выводится список этих файлов.

Сейчас приходится вручную открывать эти файлы и корректировать. Для корректировки, в большинстве случаев, нужно просто нажать
нужную кнопку и сохранить файл. Основная трудоемкость, это открыть файл из большого списка файлов.
Если сделать, чтобы все некорректные файлы загружались автоматически - это существенно ускорит корректировку и упростит работу с программой.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще раз повторю вопрос. Зачем открывать все файлы одновременно? Открывайте по одному. Кстати, а для проверки корректности обязательно открывать как документ? Может быть достаточно считывать и проверять базу данных?
Можно конечно открыть и тысячу файлов одновременно (если AutoCAD'у ресурсов хватит). Только кто же с этим работать сможет?
Замените в моём примере ACRX_CMD_MODAL на ACRX_CMD_SESSION.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Ura 19-12-2018, 02:43:02

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот полный код примера:
Код - 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 COpenFilesApp : public AcRxArxApp {
  13.  
  14. public:
  15.   COpenFilesApp() : 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 RivilisOpenFiles() {
  30.     resbuf *rbFiles = NULL;
  31.     AcApDocument *doc = curDoc();
  32.     if (acedGetFileNavDialog(NULL, NULL, _T("dwg"), NULL, 4096, &rbFiles) == RTNORM && rbFiles)
  33.     {
  34.       for (resbuf *rb = rbFiles; rb; rb = rb->rbnext)
  35.       {
  36.         if (rb->restype == RTSTR)
  37.         {
  38.           acDocManager->appContextOpenDocument(rb->resval.rstring);
  39.         }
  40.       }
  41.       acDocManager->activateDocument(doc);
  42.     }
  43.   }
  44. };
  45.  
  46. //-----------------------------------------------------------------------------
  47. IMPLEMENT_ARX_ENTRYPOINT(COpenFilesApp)
  48. // Флаг команды должен быть обязательно ACRX_CMD_SESSION
  49. // Но это потребует блокировки документов при их редактировании
  50. ACED_ARXCOMMAND_ENTRY_AUTO(COpenFilesApp, Rivilis, OpenFiles, OpenFiles, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
  51.  

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

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Да, в данном случае удобнее всего загружать сразу несколько файлов.

Большое спасибо за исходники!!!