By Adam Nagy
We already have a blog post on doing this from .NET, but it could take a bit of time to convert the code to ARX, so here it is.
It's not doing exactly the same but close enough :)
You'll have to include acplmisc.h and make sure your project links to AcPublish_crx.lib
static void plot (AcDbDatabase *pDb) { CString pdfPath = "C:temppdfmyPDF.pdf"; CString deviceName = L"DWG To PDF.pc3"; Acad::ErrorStatus es = Acad::eOk; const TCHAR *docName; es = pDb->getFilename(docName); AcDbLayoutManager *layoutManager = acdbHostApplicationServices()->layoutManager(); AcDbDictionary *layoutDict = NULL; es = pDb->getLayoutDictionary(layoutDict, AcDb::OpenMode::kForRead); // Start collecting info for the DSD data AcPlDSDEntries dsdEntries; AcDbDictionaryIterator *layoutIterator = layoutDict->newIterator(); // If we only want to plot paper spaces and not the model layout AcDbObjectId msId = acdbSymUtil()->blockModelSpaceId(pDb); for (; layoutIterator && !layoutIterator->done(); layoutIterator->next()) { AcDbObjectPointer layout( layoutIterator->objectId(), AcDb::OpenMode::kForRead); if (layout->getBlockTableRecordId() == msId) continue; const ACHAR *layoutName; layout->getLayoutName(layoutName); AcPlDSDEntry dsdEntry; dsdEntry.setLayout(layoutName); dsdEntry.setDwgName(docName); dsdEntry.setTitle(layoutName); dsdEntries.append(dsdEntry); } delete layoutIterator; layoutDict->close(); AcPlDSDData dsdData; dsdData.setDSDEntries(dsdEntries); dsdData.setProjectPath(L"c:temppdf"); dsdData.setLogFilePath(L"c:temppdflogdwf.log"); dsdData.setSheetType(AcPlDSDEntry::SheetType::kMultiPDF); dsdData.setNoOfCopies(1); dsdData.setDestinationName(pdfPath); dsdData.setPromptForDwfName(false); dsdData.setSheetSetName(L"PublisherSet"); AcPlPlotConfig *plotConfig; acplPlotConfigManager->setCurrentConfig(plotConfig, deviceName); // We need this for acplPublishExecute acedArxLoad(L"AcPublish.arx"); acplPublishExecute(dsdData, plotConfig, false); }

Leave a Reply