Plotting Layouts using the ActiveX Plot Object in ObjectARX

By Gopinath Taget

The sample code below, (function in the attached project) shows how plot all the layouts in batch mode using the ActiveX API in C++.

The key points to batch plot layouts are:

1) Set the number of layouts be plotted using the method StartBatchMode() of the IAcadPlot object.

2) Preparing a variant array of BSTRs having the names of the layouts to be plotted and then pass it as argument to SetLayoutsToPlot() method.

3) Finally to plot, use PlotToDevice() method.

//use MFC to test this code

#import "acax19enu.tlb" raw_interfaces_only no_namespace

void fBatchPlotLayouts()

{

 try

{

  //get the AutoCAD application

  IAcadApplicationPtr pApp = NULL;

  pApp = acedGetAcadWinApp()->GetIDispatch(TRUE);

  //get the Active Document

  IAcadDocumentPtr pDoc = NULL;

  pApp->get_ActiveDocument(&pDoc);

  IAcadLayoutsPtr pLayOuts;

  IAcadLayoutPtr pLayOut;

  long mNumberOflayouts;

  //get the layouts collection and the number of layouts

  pDoc->get_Layouts(&pLayOuts);

  pLayOuts->get_Count(&mNumberOflayouts);

  //create the variant array that will hold the layout names

  VARIANT mLayArr;

  SAFEARRAYBOUND mSAB;

  mSAB.lLbound = 0;

  mSAB.cElements = mNumberOflayouts;

  VariantInit(&mLayArr);

  mLayArr.vt = VT_ARRAY | VT_BSTR;

  mLayArr.parray = SafeArrayCreate(VT_BSTR,1,&mSAB);

  //populate the variant array

  long mCtr;

  //note that array here has zero based index

  for(mCtr = 0; mCtr < mNumberOflayouts; mCtr ++)

  {

   pLayOuts->Item(_variant_t(mCtr), &pLayOut);

   BSTR strName;

   pLayOut->get_Name(&strName);

   SafeArrayPutElement(mLayArr.parray, &mCtr, strName);

  }

  //print the layout names that are being plotted

  BSTR bstrName;

  acutPrintf(_T("\nLayouts to be plotted:"));

  for(mCtr = 0; mCtr < mNumberOflayouts;mCtr ++)

  {

   SafeArrayGetElement(mLayArr.parray,&mCtr,&bstrName);

   acutPrintf(_T("\n%s"),(TCHAR*)(_bstr_t)bstrName);

  }

  acutPrintf(_T("\nPlotting started…\n"));

  //plot the layouts

  IAcadPlotPtr pPlot;

  pDoc->get_Plot(&pPlot);

  //set the number of plots and error mode to quiet

  pPlot->put_NumberOfCopies(1);

  pPlot->put_QuietErrorMode(VARIANT_TRUE);

  //number of layouts to be plotted

  pPlot->StartBatchMode(mNumberOflayouts);

  //set the layouts to plot

  pPlot->SetLayoutsToPlot(mLayArr);

  VARIANT_BOOL returnBool;

  pPlot->PlotToDevice(_variant_t("DWF6 ePlot.pc3"), &returnBool);

  //clean up

  VariantClear(&mLayArr);

}

 catch (_com_error &e)

{

  acutPrintf(

   _T("\nError while batch plotting. %s"),e.ErrorMessage());

}

}


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading