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

29/05/2013

Печать листов с использованием объекта Plot ActiveX в ObjectARX

Следующий код показывает как напечатать все листы в пакетном режиме с использованием ActiveX API в C++

Ключевые моменты для пакетной печати:

1) Установим число листов, которые будут напечатаны при помощи метода StartBatchMode() объекта IAcadPlot

2) Подготовим variant-массив строк типа BSTR, содержащий имена листов, которые будут напечатаны, и передать его как аргумент методу SetLayoutsToPlot()

3) Для печати используем метод PlotToDevice()

Код - C++: [Выделить]
  1. // используем MFC для проверки этого кода
  2. #import "acax19enu.tlb" raw_interfaces_only no_namespace
  3. void fBatchPlotLayouts()
  4. {
  5.  try
  6.  {
  7.   // получаем объект приложения AutoCAD
  8.   IAcadApplicationPtr pApp = NULL;
  9.   pApp = acedGetAcadWinApp()->GetIDispatch(TRUE);
  10.   // получаем активный документ
  11.   IAcadDocumentPtr pDoc = NULL;
  12.   pApp->get_ActiveDocument(&pDoc);
  13.   IAcadLayoutsPtr pLayOuts;
  14.   IAcadLayoutPtr pLayOut;
  15.   long mNumberOflayouts;
  16.   // получаем коллекцию листов и число листов
  17.   pDoc->get_Layouts(&pLayOuts);
  18.   pLayOuts->get_Count(&mNumberOflayouts);
  19.   // создаем variant-массив для имен листов
  20.   VARIANT mLayArr;
  21.   SAFEARRAYBOUND mSAB;
  22.   mSAB.lLbound = 0;
  23.   mSAB.cElements = mNumberOflayouts;
  24.   VariantInit(&mLayArr);
  25.   mLayArr.vt = VT_ARRAY | VT_BSTR;
  26.   mLayArr.parray = SafeArrayCreate(VT_BSTR,1,&mSAB);
  27.   // заполняем variant-массив
  28.   long mCtr;
  29.   // заметим, что индексация массива начинается с нуля
  30.   for(mCtr = 0; mCtr < mNumberOflayouts; mCtr ++)
  31.   {
  32.    pLayOuts->Item(_variant_t(mCtr), &pLayOut);
  33.    BSTR strName;
  34.    pLayOut->get_Name(&strName);
  35.    SafeArrayPutElement(mLayArr.parray, &mCtr, strName);
  36.   }
  37.   // печатаем имена листов, которые будут напечатаны
  38.   BSTR bstrName;
  39.   acutPrintf(_T("\nЛисты, которые будут напечатаны: "));
  40.   for(mCtr = 0; mCtr < mNumberOflayouts;mCtr ++)
  41.   {
  42.    SafeArrayGetElement(mLayArr.parray,&mCtr,&bstrName);
  43.    acutPrintf(_T("\n%s"),(TCHAR*)(_bstr_t)bstrName);
  44.   }
  45.   acutPrintf(_T("\nПечать начата...\n"));
  46.   // Печатаем листы
  47.   IAcadPlotPtr pPlot;
  48.   pDoc->get_Plot(&pPlot);
  49.   // устанавливаем число копий для печати и режим ошибки – без сообщений
  50.   pPlot->put_NumberOfCopies(1);
  51.   pPlot->put_QuietErrorMode(VARIANT_TRUE);
  52.   // число листов, которое будет напечатано
  53.   pPlot->StartBatchMode(mNumberOflayouts);
  54.   // устанавливаем листы для печати
  55.   pPlot->SetLayoutsToPlot(mLayArr);
  56.   VARIANT_BOOL returnBool;
  57.   pPlot->PlotToDevice(_variant_t("DWF6 ePlot.pc3"), &returnBool);
  58.   // чистим память
  59.   VariantClear(&mLayArr);
  60.  }
  61.  catch (_com_error &e)
  62.  {
  63.   acutPrintf(
  64.    _T("\nОшибка пакетной печати. %s"),e.ErrorMessage());
  65.  }
  66. }

 

 

Источник: http://adndevblog.typepad.com/autocad/2012/12/plotting-layouts-using-the-activex-plot-object-in-objectarx.html

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

Опубликовано 29.05.2013
Отредактировано 07.06.2013 в 21:48:06