将 CAD 图纸的一部分导出到 .pdf 文件

有时 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 文件。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用