|
在 ObjectARX 中使用绘图 ActiveX 打印
下面的代码演示如何在批处理模式下使用 ActiveX API 打印所有工作表C++
批量打印要点:
1) 使用 IAcadPlot 对象的 StartBatchMode() 方法设置要打印的页数
2) 准备一个 BSTR 类型的字符串变体数组,其中包含将要打印的工作表的名称,并将其作为参数传递给方法 SetLayoutsToPlot()
3) 对于打印,我们使用 PlotToDevice() 方法
// используем 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());
}
}
|
|