[返回博客](/cn/blog) # 自定义实体的平面裁剪截面生成

Andrew Markovich 三月 16, 2017 [\#rendering](/cn/blog/tag/rendering) [\#Example](/cn/blog/tag/example)

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

Teigha 矢量化框架提供了在渲染场景中裁剪几何图形的能力，使用 OdGiOrthoClipperEx 传送带节点，该节点始终在默认几何矢量化传送带中可用。OdGiOrthoClipperEx 传送带节点提供了生成平面几何截面的能力，因此任何应用程序都可以调用平面截面生成功能，而无需在几何矢量化传送带中创建任何额外的对象和修改。本文描述了使用 Teigha 矢量化框架 API 为原生和自定义数据库实体调用平面裁剪截面生成的最简单方法。

## 自定义实体截面生成支持

### 自定义数据库实体创建

例如，我们将使用一个具有最小实现的简单自定义实体，它绘制十二面体。为实体启用截面生成必须做的主要事情是以下调用：

```
// Enable sections generation
pWd->subEntityTraits().setSectionable(true);
```

此调用通知矢量化框架，可以为以下几何图元（如壳、多边形或网格）生成截面。

现在我们可以将自定义十二面体实体附加到工作数据库：

```
void attachDodecahedronEntity(OdDbDatabase *pDb)
{
    OdSmartPtr<DodecahedronEntity> pEnt = DodecahedronEntity::createObject();
    pEnt->setDatabaseDefaults(pDb);
    pEnt->setValues(OdGePoint3d::kOrigin, 10.0);
    OdDbBlockTableRecord::cast(pDb->getActiveLayoutBTRId().openObject(OdDb::kForWrite))->appendOdDbEntity(pEnt);
}
```

如果我们渲染结果（我们的数据库不包含其他实体），我们会得到这样的图片：

[![](/files/images/blog/2017-03-16-pic1.png)](/files/images/blog/2017-03-16-pic1.png)

## 附加平面裁剪边界

我们可以使用 OdGiGeometry::pushClipBoundary 和 OdGiGeometry::popClipBoundary 方法，直接在实体 subWorldDraw 或 subViewportDraw 覆盖方法内部附加任意数量的裁剪边界，这些裁剪边界将影响实体几何图形和嵌套实体几何图形。此技术对于数据库层次结构很有用，我们可以在块内部应用实体裁剪，但不能用于需要裁剪整个图形而无需修改数据库实体内部的应用程序。对于这种情况（并为了简化我们的示例应用程序），我们可以使用 setViewport3dClipping 方法直接将裁剪边界附加到 OdGsView 对象，并且此裁剪边界将用于裁剪此 OdGsView 对象内的所有内容：

```
void appendClippingBoundary(OdGsView *pView)
{ // Setup clipping plane
    OdGiPlanarClipBoundary::ClipPlaneArray clipPlanes;
    clipPlanes.push_back(OdGiPlanarClipBoundary::ClipPlane(OdGePoint3d::kOrigin - OdGeVector3d::kYAxis * 4.0, OdGeVector3d::kYAxis));
    OdGiPlanarClipBoundary bnd; bnd.setClipPlanes(clipPlanes);
    // Setup viewport clipping
    OdGiClipBoundary emptyBoundary;
    ::odgiEmptyClipBoundary(emptyBoundary);
    pView->setViewport3dClipping(&emptyBoundary, &bnd);
}
```

我们可以使用 OdGiPlanarClipBoundary 类指定一组裁剪平面。在此示例中，我们保持 OdGiClipBoundary 对象为空，因为裁剪平面完全在世界坐标空间 (WCS) 中设置。如果我们渲染裁剪结果，我们将得到如下图片：

[![](/files/images/blog/2017-03-16-pic2.png)](/files/images/blog/2017-03-16-pic2.png)

## 裁剪边界的截面生成

### 为裁剪边界启用截面生成

要启用截面生成，请在我们的示例 appendClippingBoundary 函数中进行以下更改：

```
OdGiPlanarClipBoundary bnd; bnd.setClipPlanes(clipPlanes);
// Setup traits resolver for section geometry
OdGiSectionGeometryOutputPtr pSectionGeometry = OdRxObjectImpl<OdGiSectionGeometryOutput>::createObject();
pSectionGeometry->setTraitsOverrideFlags(OdGiSubEntityTraitsChangedFlags::kColorChanged | OdGiSubEntityTraitsChangedFlags::kMaterialChanged);
pSectionGeometry->traitsOverrides().setColor(1);
bnd.setSectionGeometryOutput(pSectionGeometry);
// Setup viewport clipping
```

在此示例中，我们创建了 OdGiSectionGeometryOutput 对象，该对象用于在应用程序端处理截面几何体。此对象已附加到平面裁剪边界 (OdGiPlanarClipBoundary)。所有生成的封闭和开放截面都将通过此 OdGiSectionGeometryOutput 对象，因此我们可以自定义输出截面几何体的属性和表示。

如果我们渲染更改后的结果，我们将得到如下图片：

[![](/files/images/blog/2017-03-16-pic3.png)](/files/images/blog/2017-03-16-pic3.png)

### 多个裁剪平面

我们可以使用任意数量的裁剪平面来生成几何截面。例如，通过指定辅助裁剪平面来扩展我们的 appendClippingBoundary 函数：

```
clipPlanes.push_back(OdGiPlanarClipBoundary::ClipPlane(OdGePoint3d::kOrigin - OdGeVector3d::kYAxis * 4.0, OdGeVector3d::kYAxis));
// Secondary clipping plane
clipPlanes.push_back(OdGiPlanarClipBoundary::ClipPlane(OdGePoint3d::kOrigin + OdGeVector3d::kXAxis * 4.0, -OdGeVector3d::kXAxis));
OdGiPlanarClipBoundary bnd; bnd.setClipPlanes(clipPlanes);
```

更改后的结果将如下所示：

[![](/files/images/blog/2017-03-16-pic4.png)](/files/images/blog/2017-03-16-pic4.png)

## 今天就开始行动

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

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