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

13/01/2016

Создание многолистового PDF файла при помощи DSD

У нас уже была статья как это сделать при помощи .NET, но может потребоваться некоторое время для конвертации этого кода в ARX, так что вот он.

Он не совсем такой, как в .NET, но очень похож :)

Вам понадобится включить в исходный код acplmisc.h и убедиться, что линкеру указано использовать библиотеку AcPublish_crx.lib (для AutoCAD версии 2012 и более ранних AcPublish.lib)

Код - C++: [Выделить]
  1. static void plot (AcDbDatabase *pDb)
  2. {
  3.   CString pdfPath = "C:\\temp\\pdf\\myPDF.pdf";
  4.   CString deviceName =  L"DWG To PDF.pc3";
  5.   Acad::ErrorStatus es = Acad::eOk;
  6.  
  7.   const TCHAR *docName;
  8.   es = pDb->getFilename(docName);  
  9.  
  10.   AcDbLayoutManager *layoutManager =
  11.     acdbHostApplicationServices()->layoutManager();
  12.   AcDbDictionary *layoutDict = NULL;
  13.   es = pDb->getLayoutDictionary(layoutDict, AcDb::OpenMode::kForRead);
  14.  
  15.   // Начнём собирать данные в DSD
  16.   AcPlDSDEntries dsdEntries;
  17.   AcDbDictionaryIterator *layoutIterator = layoutDict->newIterator();
  18.  
  19.   // Если мы собираемся печатать только листы пространства листа
  20.   AcDbObjectId msId = acdbSymUtil()->blockModelSpaceId(pDb);
  21.  
  22.   for (; layoutIterator && !layoutIterator->done(); layoutIterator->next())
  23.   {
  24.     AcDbObjectPointer<AcDbLayout> layout(
  25.       layoutIterator->objectId(), AcDb::OpenMode::kForRead);
  26. // Пропускаем Пространство Модели
  27.     if (layout->getBlockTableRecordId() == msId)
  28.       continue;
  29.  
  30.     const ACHAR *layoutName;
  31.     layout->getLayoutName(layoutName);
  32.  
  33.     AcPlDSDEntry dsdEntry;
  34.     dsdEntry.setLayout(layoutName);
  35.     dsdEntry.setDwgName(docName);
  36.     dsdEntry.setTitle(layoutName);
  37.     dsdEntries.append(dsdEntry);    
  38.   }
  39.  
  40.   delete layoutIterator;
  41.   layoutDict->close();
  42.  
  43.   AcPlDSDData dsdData;
  44.   dsdData.setDSDEntries(dsdEntries); 
  45.  
  46.   dsdData.setProjectPath(L"c:\\temp\\pdf\\");
  47.   dsdData.setLogFilePath(L"c:\\temp\\pdf\\logdwf.log");
  48.   dsdData.setSheetType(AcPlDSDEntry::SheetType::kMultiPDF);
  49.   dsdData.setNoOfCopies(1);
  50.   dsdData.setDestinationName(pdfPath);
  51.   dsdData.setPromptForDwfName(false);
  52.   dsdData.setSheetSetName(L"PublisherSet");
  53.  
  54.   AcPlPlotConfig *plotConfig;
  55.   acplPlotConfigManager->setCurrentConfig(plotConfig, deviceName);   
  56.  
  57.   // Мы должны это загрузить для работы acplPublishExecute
  58.   acedArxLoad(L"AcPublish.arx");
  59.  
  60.   acplPublishExecute(dsdData, plotConfig, false);
  61. }

 

Источник: http://adndevblog.typepad.com/autocad/2016/01/create-multi-sheet-pdf-from-arx-using-dsd.html

Автор перевода: Александр Ривилис

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

Опубликовано 13.01.2016
Отредактировано 13.01.2016 в 00:09:01