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

19/02/2014

Создаем копию текущего документа в новом документе.

Вопрос:
Как можно создать точную копию текущего документа в новом документе?

Решение:
Одно из решений – сначала создание временного файла-шаблона из текущего файла, а затем создание нового чертежа из этого шаблона. Затем шаблон можно удалить. Вот шаги, которые последовательно нужно проделать:

  1. Выполняем операцию Wblock для текущего чертежа.
  2. Сохраняем чертеж как файл шаблона (с расширением DWT) по временному пути на жестком диске
  3. Из контекста приложения создаем новый документ из предварительно созданного шаблона.
  4. Если необходимо удаляем временный файл с жесткого диска.

Код - C++: [Выделить]
  1. // Вспомогательная функция: создает новый документ
  2. void newDocHelper(void *pData)
  3. {
  4.    AcApDocument* pDoc = acDocManager->curDocument();
  5.    if (acDocManager->isApplicationContext())
  6.    {
  7.     acDocManager->appContextNewDocument((const ACHAR *)pData);
  8.    }
  9.    else
  10.    {
  11.     acutPrintf(L"\nОшибка: мы в контексте документа: %s\n",pDoc->fileName());
  12.    }
  13. } 
  14. // Обратите внимание, что мы используем путь "C:/temp.dwt" для размещения
  15. // временного файла. Измените местоположение в соответствии с вашими
  16. // условиями.
  17.   void copydwg()
  18. {
  19.    // TODO: Код команды
  20.    AcDbDatabase *pDb = NULL;
  21.    AcDbDatabase *pnewDb = NULL;
  22.  
  23.     pDb = acdbHostApplicationServices()->workingDatabase();
  24.    assert( pDb != NULL );
  25.  
  26.    if( pDb->wblock(pnewDb) != Acad::eOk ) {
  27.     acutPrintf(L"Не могу выполнить wblock.\n");
  28.     return;
  29.    }
  30.  
  31.    if( pnewDb->saveAs(L"C:/temp.dwt") != Acad::eOk) {
  32.     acutPrintf(L"Не могу сохранить как C:/temp.dwt файл.\n");
  33.     delete pnewDb;
  34.     return;
  35.    } 
  36.    delete pnewDb;  
  37.    static wchar_t pData[] = L"c:/temp.dwt";
  38.    acDocManager->executeInApplicationContext(newDocHelper, (void *)pData); 
  39.    // 'remove' – это C-функция для удаления файлов и ее синтаксис
  40.     //int remove(const wchar_t *path );
  41.      remove("c:/temp.dwt");
  42. }

Внимание: Не регистрируйте эту команду с флагом 'ACRX_CMD_SESSION' так как AcDbDatabase::wblock() не сможет выполниться в этом контексте.

Источник: http://adndevblog.typepad.com/autocad/2012/12/create-a-copy-of-the-current-document-into-a-new-document.html

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

Опубликовано 19.02.2014