[返回博客](/cn/blog) # 将 CAD 图纸的一部分导出到 .pdf 文件

Sergey Sherstnev 一月 26, 2017 [\#pdf](/cn/blog/tag/pdf) [\#Example](/cn/blog/tag/example)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

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

![](/files/images/blog/2017-01-26-pic1.png)

### 这个选项是什么，以及如何摆脱它？

该选项是 PdfExportSettings 中的一个标志，它使得开始使用 PDF 导出功能变得容易。如果此标志未设置，则所有与绘图区域相关的设置都将从存储在绘图文件中的 PlotSetting 中获取。有关这些设置的更多详细信息请参见文档。这里我们只提及 ZoomToExtents 选项使 PdfExport 模块导出绘图，就像设置了以下选项一样：

- 绘图区域 – 范围
- 按比例缩放以适应
- 居中绘图

那么，请看下一张图纸：

[![](/files/images/blog/2017-01-26-pic2.png)](/files/images/blog/2017-01-26-pic2.png)

使用 ZoomToExtents 选项将其导出为 PDF，您将得到此 .pdf 文件：

[![](/files/images/blog/2017-01-26-pic3.png)](/files/images/blog/2017-01-26-pic3.png)

但是，如果您只想导出图纸的一部分，例如位于中心的实体，该怎么办？我们在这里不描述如何使用 OdaMfcApp 示例应用程序来完成，而是通过程序代码进行解释：

#### 读取图纸：

```
<span class="hljs-title">OdDbDatabasePtr</span> pDb = m_pHostApp.<span class="hljs-keyword">readFile</span>(inputFile);
```

#### 使用其 ID 获取实体的指针：

```
<span class="hljs-title">OdDbEntityPtr</span> pRect = <span class="hljs-title">OdDbEntity</span>::<span class="hljs-keyword">cast</span>(pDb-><span class="hljs-keyword">getOdDbObjectId</span>( <span class="hljs-title">OdDbHandle</span>(0x2AB)).<span class="hljs-keyword">safeOpenObject</span>(<span class="hljs-title">OdDb</span>::kForRead));

if (pRect.<span class="hljs-keyword">isNull</span>())
    throw <span class="hljs-keyword">OdError</span>(eNullEntityPointer);
```

请注意，在此示例中，OdDbHandle(0x2AB) 是硬编码的句柄，它从特定图纸中复制而来。您应该将 0x2AB 替换为您正在处理的图纸中的您自己的句柄。

#### 获取实体范围：

```
<span class="hljs-title">OdGeExtents3d</span> ext;
pRect-><span class="hljs-keyword">getGeomExtents</span>(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);
```

#### 获取绘图设置：

```
<span class="hljs-title">OdDbObjectId</span> idLayout =
<span class="hljs-title">OdDbBlockTableRecordPtr</span>(pDb-><span class="hljs-keyword">getActiveLayoutBTRId</span>().<span class="hljs-keyword">safeOpenObject</span>())-><span class="hljs-keyword">getLayoutId</span>();
<span class="hljs-title">OdDbLayoutPtr</span> pLayout = idLayout.<span class="hljs-keyword">safeOpenObject</span>(<span class="hljs-title">OdDb</span>::kForWrite);
<span class="hljs-title">OdDbPlotSettings</span> *pPlotSettings = pLayout.<span class="hljs-keyword">get</span>();
```

#### 设置必要的绘图区域：

```
<span class="hljs-title">OdDbPlotSettingsValidatorPtr</span> pValidator = pDb-><span class="hljs-keyword">appServices</span>()-><span class="hljs-keyword">plotSettingsValidator</span>();
pValidator-><span class="hljs-keyword">setPlotWindowArea</span>(pPlotSettings, ext.minPoint().x, ext.minPoint().y, ext.<span class="hljs-keyword">maxPoint</span>().x, ext.<span class="hljs-keyword">maxPoint</span>().y);
pValidator-><span class="hljs-keyword">setPlotType</span>(pPlotSettings, <span class="hljs-title">OdDbPlotSettings</span>::kWindow); 
pValidator-><span class="hljs-keyword">setPlotCentered</span>(pPlotSettings, true);
pValidator-><span class="hljs-keyword">setStdScaleType</span>(pPlotSettings, <span class="hljs-title">OdDbPlotSettings</span>::kScaleToFit);
```

#### 然后导出图纸：

```
<span class="hljs-title">OdPdfExportModulePtr</span> pPdfModule = ::<span class="hljs-keyword">odrxDynamicLinker</span>()-><span class="hljs-keyword">loadApp</span>(OdPdfExportModuleName);
<span class="hljs-title">OdPdfExportPtr</span> exporter = pPdfModule-><span class="hljs-keyword">create</span>();

<span class="hljs-title">PDFExportParams</span> params;
params.<span class="hljs-keyword">setDatabase</span>(pDb);
params.<span class="hljs-keyword">setExportFlags</span>((<span class="hljs-title">PDFExportParams</span>::PDFExportFlags)(params.<span class="hljs-keyword">exportFlags</span>() & (~<span class="hljs-title">PDFExportParams</span>::kZoomToExtentsMode)));

<span class="hljs-title">OdUInt32</span> errCode = exporter-><span class="hljs-keyword">exportPdf</span>(params);
```

以下 .pdf 文件是结果：

[![](/files/images/blog/2017-01-26-pic4.png)](/files/images/blog/2017-01-26-pic4.png)

这是一种简单易行的方法，可以选择图纸的任何部分并将其导出到 .pdf 文件。

## 今天就开始行动

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

[免费试用](https://www.opendesign.com/cn/free-trial)
