有时 Teigha 订阅者会问:如何只将图纸的特定部分而不是整个图纸导出到 .pdf 文件?这可能不明显,因为 PDF 导出设置中有一个默认选项 ZoomToExtents,并且 OdaMfcApp 示例应用程序的 PDFExportDialog 中也默认设置了相同的选项。

这个选项是什么,以及如何摆脱它?
该选项是 PdfExportSettings 中的一个标志,它使得开始使用 PDF 导出功能变得容易。如果此标志未设置,则所有与绘图区域相关的设置都将从存储在绘图文件中的 PlotSetting 中获取。有关这些设置的更多详细信息请参见文档。这里我们只提及 ZoomToExtents 选项使 PdfExport 模块导出绘图,就像设置了以下选项一样:
- 绘图区域 – 范围
- 按比例缩放以适应
- 居中绘图
那么,请看下一张图纸:
使用 ZoomToExtents 选项将其导出为 PDF,您将得到此 .pdf 文件:
但是,如果您只想导出图纸的一部分,例如位于中心的实体,该怎么办?我们在这里不描述如何使用 OdaMfcApp 示例应用程序来完成,而是通过程序代码进行解释:
读取图纸:
OdDbDatabasePtr pDb = m_pHostApp.readFile(inputFile);
使用其 ID 获取实体的指针:
OdDbEntityPtr pRect = OdDbEntity::cast(pDb->getOdDbObjectId( OdDbHandle(0x2AB)).safeOpenObject(OdDb::kForRead));
if (pRect.isNull())
throw OdError(eNullEntityPointer);
请注意,在此示例中,OdDbHandle(0x2AB) 是硬编码的句柄,它从特定图纸中复制而来。您应该将 0x2AB 替换为您正在处理的图纸中的您自己的句柄。
获取实体范围:
OdGeExtents3d ext;
pRect->getGeomExtents(ext);
对于图纸空间来说这就足够了,因为实体坐标与图纸坐标相对应。
对于模型空间,范围应投影到活动视口的视平面:
OdGePoint3d pt1, pt2;
OdRxObjectPtr pObj;
OdDbViewportTablePtr pVPT = pDb->getViewportTableId().safeOpenObject();
OdDbViewportTableRecordPtr pActiveVP = pVPT->getActiveViewportId().safeOpenObject();
OdAbstractViewPEPtr pVp = OdAbstractViewPEPtr(pObj = pActiveVP);
OdGeVector3d vecY = pVp->upVector(pObj);
OdGeVector3d vecZ = pVp->direction(pObj);
OdGeVector3d vecX = vecY.crossProduct(vecZ).normal();
OdGeVector2d offset = pVp->viewOffset(pObj);
OdGePoint3d prTarg = pVp->target(pObj) - vecX * offset.x - vecY * offset.y;
pt1.x = vecX.dotProduct(ext.minPoint() - prTarg);
pt1.y = vecY.dotProduct(ext.minPoint() - prTarg);
pt1.z = 0.;
pt2.x = vecX.dotProduct(ext.maxPoint() - prTarg);
pt2.y = vecY.dotProduct(ext.maxPoint() - prTarg);
pt2.z = 0.;
ext.set(pt1, pt2);
获取绘图设置:
OdDbObjectId idLayout =
OdDbBlockTableRecordPtr(pDb->getActiveLayoutBTRId().safeOpenObject())->getLayoutId();
OdDbLayoutPtr pLayout = idLayout.safeOpenObject(OdDb::kForWrite);
OdDbPlotSettings *pPlotSettings = pLayout.get();
设置必要的绘图区域:
OdDbPlotSettingsValidatorPtr pValidator = pDb->appServices()->plotSettingsValidator();
pValidator->setPlotWindowArea(pPlotSettings, ext.minPoint().x, ext.minPoint().y, ext.maxPoint().x, ext.maxPoint().y);
pValidator->setPlotType(pPlotSettings, OdDbPlotSettings::kWindow);
pValidator->setPlotCentered(pPlotSettings, true);
pValidator->setStdScaleType(pPlotSettings, OdDbPlotSettings::kScaleToFit);
然后导出图纸:
OdPdfExportModulePtr pPdfModule = ::odrxDynamicLinker()->loadApp(OdPdfExportModuleName);
OdPdfExportPtr exporter = pPdfModule->create();
PDFExportParams params;
params.setDatabase(pDb);
params.setExportFlags((PDFExportParams::PDFExportFlags)(params.exportFlags() & (~PDFExportParams::kZoomToExtentsMode)));
OdUInt32 errCode = exporter->exportPdf(params);
以下 .pdf 文件是结果:
这是一种简单易行的方法,可以选择图纸的任何部分并将其导出到 .pdf 文件。