[返回博客](/cn/blog) # 2 之 2：为平面裁剪边界生成切割几何体

Andrew Markovich 九月 05, 2019 [\#geometry](/cn/blog/tag/geometry) [\#cutting planes](/cn/blog/tag/cutting-planes)

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

这是关于 Kernel SDK 如何支持平面裁剪边界的切割几何体的两部分系列文章中的第二篇。要阅读第一篇文章，请点击[此处](https://www.opendesign.com/blog/2019/august/part-1-2-generating-cut-geometry-planar-clipping-boundaries%20)。

#### 将切割几何体生成与截面几何体结合使用

将切割几何体输出接口与截面几何体输出接口结合使用没有限制，但为了使输出截面可见，我们需要将切割几何体自定义为透明：

```
OdGiCuttedGeometryOutputPtr pTraitsSetsCutting = OdGiCuttedGeometryOutput::createObject();
  pTraitsSetsCutting->setTraitsOverrideFlags(OdGiSubEntityTraitsChangedFlags::kColorChanged | OdGiSubEntityTraitsChangedFlags::kMaterialChanged | OdGiSubEntityTraitsChangedFlags::kTransparencyChanged);
  pTraitsSetsCutting->traitsOverrides().setColor(5);
  pTraitsSetsCutting->traitsOverrides().setTransparency(OdCmTransparency(0.5));
  bnd.setCuttedGeometryOutput(pTraitsSetsCutting);

```

现在我们可以将截面输出接口与切割几何体一起附加：

```
bnd.setSectionGeometryOutput(pTraitsSetsSection);
bnd.setCuttedGeometryOutput(pTraitsSetsCutting);
```

以下矢量化图像包含两种几何体（蓝色半透明切割几何体和红色截面）：

![blue semi-transparent cut geometry and red sections](/files/inline-images/both%20geometries%201.jpg)如果您的应用程序同时调用切割几何体和截面几何体生成，您应该考虑使用非截面几何体裁剪标志的以下规则，该标志在两个接口中都可用。下表显示了如果同时设置切割和截面几何体输出，裁剪引擎如何解释非截面几何体标志：

| 截面几何体输出中的不可截面几何体裁剪标志 | 切割几何体输出中的不可截面几何体裁剪标志 | 裁剪引擎调用的最终标志值 |
| :---: | :---: | :---: |
| false | false | false |
| false | true | true |
| true | false | true |
| true | true | true |

因此，如果要禁用不可截面几何体裁剪，则必须将此标志设置为两个输出接口的“false”，否则裁剪引擎将使用不可截面几何体裁剪。

下图显示了在上一篇文章的“禁用不可截面几何体裁剪”部分中的示例文件中，使用不可截面几何体裁剪标志同时输出截面几何体和切割几何体。

![Disabling non-sectionable geometry clipping](/files/inline-images/non-sectionable%20geometry%20clipping%202.jpg)#### 为不可截面实体启用截面

为了检查裁剪引擎是否正确处理所有类型的几何图元（不仅是 3dSolid 和其他建模器实体调用的壳和多段线），请为数据库中的所有实体启用截面。为此，我们可以调用覆盖功能：

```
class MakeSectionableDrawableOverrule : public OdStaticRxObject<odgidrawableoverrule>
{
  bool bMakeSectionable, b3dSolid, bSubDMesh, bOthers;
  public:
    MakeSectionableDrawableOverrule(bool makeSectionable, bool triDeSolid, bool subDMesh, bool others = false)
      : bMakeSectionable(makeSectionable), b3dSolid(triDeSolid), bSubDMesh(subDMesh), bOthers(others)
    {
      OdRxOverrule::setIsOverruling(true);
      if (bOthers) OdRxOverrule::addOverrule(OdDbEntity::desc(), this);
      if (b3dSolid) OdRxOverrule::addOverrule(OdDb3dSolid::desc(), this);
      if (bSubDMesh) OdRxOverrule::addOverrule(OdDbSubDMesh::desc(), this);
    }
    ~MakeSectionableDrawableOverrule()
    {
      if (bSubDMesh) OdRxOverrule::removeOverrule(OdDbSubDMesh::desc(), this);
      if (b3dSolid) OdRxOverrule::removeOverrule(OdDb3dSolid::desc(), this);
      if (bOthers) OdRxOverrule::removeOverrule(OdDbEntity::desc(), this);
      OdRxOverrule::setIsOverruling(false);
    }
    virtual bool isApplicable(const OdRxObject* pOverruledSubject) const
    {
      return true;
    }
    virtual OdUInt32 setAttributes(const OdGiDrawable* pSubject, OdGiDrawableTraits *traits)
    {
      OdUInt32 drawFlags = OdGiDrawableOverrule::setAttributes(pSubject, traits);
      OdGiSubEntityTraits *pTraits = OdGiSubEntityTraits::cast(traits);
      if (pTraits)
        pTraits->setSectionable(bMakeSectionable);
      return drawFlags;
    }
};</odgidrawableoverrule>
```

此帮助程序类在内部回归测试中调用，用于使所有类型的实体都可截面。在构造函数中，为特定或所有类型的实体启用覆盖；在析构函数中，禁用附加的覆盖。要覆盖部分代码的实体行为，我们可以添加一行代码：

```
MakeSectionableDrawableOverrule _over(true, false, false, true);
  // Vectorize database . . .
```

当我们使用此覆盖来生成切割几何体时，我们的示例图纸会显示以下图像：

![overruling for cutting geometry generation](/files/inline-images/overruling%20for%20cutting%20geometry%20generation%203.jpg)左下角和右下角的图像显示，所有实体不再被裁剪并被视为可截面，因此为它们生成了几何体的切割部分。使用这种覆盖技术，我们可以单独为任何实体类型启用或禁用截面，或者同时为所有类型启用或禁用截面——这为截面功能提供了更灵活的控制。

#### 结论

切割几何体输出的可用性包括裁剪引擎的一组可能输出：

- OdGiOrthoClipperEx::output() — 裁剪几何体的稳定输出。
- OdGiOrthoClipperEx::sectionOutput() — 截面几何体的可选输出。
- OdGiOrthoClipperEx::cuttingOutput() — 切割几何体的可选输出。

直接使用 OdGiOrthoClipperEx 调用切割几何体输出没有限制（OdGiGeometry::pushClipBoundary 功能仅将切割几何体输出的使用限制为平面裁剪边界）；切割几何体也可以为任何类型的多边形裁剪边界生成。

切割几何体渲染是基于 ODA SDK 的应用程序的一项实用功能，这些应用程序支持 3D 模型截面，也适用于希望扩展截面可视化效果集的工程和建模应用程序。

## 今天就开始行动

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

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