29/05/2013
Печать листов с использованием объекта Plot ActiveX в ObjectARX
Следующий код показывает как напечатать все листы в пакетном режиме с использованием ActiveX API в C++
Ключевые моменты для пакетной печати:
1) Установим число листов, которые будут напечатаны при помощи метода StartBatchMode() объекта IAcadPlot
2) Подготовим variant-массив строк типа BSTR, содержащий имена листов, которые будут напечатаны, и передать его как аргумент методу SetLayoutsToPlot()
3) Для печати используем метод PlotToDevice()
Код - C++: [Выделить]
- // используем MFC для проверки этого кода
- #import "acax19enu.tlb" raw_interfaces_only no_namespace
- void fBatchPlotLayouts()
- {
- try
- {
- // получаем объект приложения AutoCAD
- IAcadApplicationPtr pApp = NULL;
- pApp = acedGetAcadWinApp()->GetIDispatch(TRUE);
- // получаем активный документ
- IAcadDocumentPtr pDoc = NULL;
- pApp->get_ActiveDocument(&pDoc);
- IAcadLayoutsPtr pLayOuts;
- IAcadLayoutPtr pLayOut;
- long mNumberOflayouts;
- // получаем коллекцию листов и число листов
- pDoc->get_Layouts(&pLayOuts);
- pLayOuts->get_Count(&mNumberOflayouts);
- // создаем variant-массив для имен листов
- 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);
- // заполняем variant-массив
- long mCtr;
- // заметим, что индексация массива начинается с нуля
- for(mCtr = 0; mCtr < mNumberOflayouts; mCtr ++)
- {
- pLayOuts->Item(_variant_t(mCtr), &pLayOut);
- BSTR strName;
- pLayOut->get_Name(&strName);
- SafeArrayPutElement(mLayArr.parray, &mCtr, strName);
- }
- // печатаем имена листов, которые будут напечатаны
- BSTR bstrName;
- acutPrintf(_T("\nЛисты, которые будут напечатаны: "));
- for(mCtr = 0; mCtr < mNumberOflayouts;mCtr ++)
- {
- SafeArrayGetElement(mLayArr.parray,&mCtr,&bstrName);
- acutPrintf(_T("\n%s"),(TCHAR*)(_bstr_t)bstrName);
- }
- acutPrintf(_T("\nПечать начата...\n"));
- // Печатаем листы
- IAcadPlotPtr pPlot;
- pDoc->get_Plot(&pPlot);
- // устанавливаем число копий для печати и режим ошибки – без сообщений
- pPlot->put_NumberOfCopies(1);
- pPlot->put_QuietErrorMode(VARIANT_TRUE);
- // число листов, которое будет напечатано
- pPlot->StartBatchMode(mNumberOflayouts);
- // устанавливаем листы для печати
- pPlot->SetLayoutsToPlot(mLayArr);
- VARIANT_BOOL returnBool;
- pPlot->PlotToDevice(_variant_t("DWF6 ePlot.pc3"), &returnBool);
- // чистим память
- VariantClear(&mLayArr);
- }
- catch (_com_error &e)
- {
- acutPrintf(
- _T("\nОшибка пакетной печати. %s"),e.ErrorMessage());
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=63.0
Опубликовано 29.05.2013
Отредактировано 07.06.2013 в 21:48:06
Отредактировано 07.06.2013 в 21:48:06