[返回博客](/cn/blog) # 2 之 2：使用几何截面回调

Andrew Markovich 十一月 07, 2019 [\#clipping](/cn/blog/tag/clipping) [\#sectioning](/cn/blog/tag/sectioning) [\#cutting](/cn/blog/tag/cutting) [\#geometry](/cn/blog/tag/geometry)

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

本文包含一个使用几何截面回调的示例。这是系列文章中的第二篇；有关更多详细信息，请参阅[第 1 部分](https://www.opendesign.com/blog/2019/october/part-1-2-using-geometry-sectioning-callback%20)。

在我们的示例中，我们将使用包含四个 3D 对象的以下模型：

![3D objects](/files/inline-images/4%203D%20objects.jpg)每个对象都放置在自己的图层上，并具有不同的颜色：

![layers with colors](/files/inline-images/layers%20with%20different%20colors.jpg)在我们的示例中，我们将使用图层名称中的图层编号。首先实现您自己的继承自 OdGiClippedGeometryOutputCallback 类的类，该类将包含我们的回调函数实现：

```
struct ClippingCallback : public OdGiClippedGeometryOutputCallback
{
  static const bool pSectVis[4], pCutVis[4];
  static const OdUInt16 pSectClr[4], pCutClr[4];

  virtual bool clippedGeometryOutputCallbackProc(OdGiClippedGeometryOutput &pGeomOutput, const OdGiConveyorContext &pDrawContext)
  {
    OdDbEntity* pEnt = OdDbEntity::cast(pDrawContext.currentDrawable());
    if (pEnt)
    {
      const OdString layer = pEnt->layer();
      if (layer.left(5) == OD_T("Layer"))
      {
        const int lrNum = int(layer.getAt(5) - '0') - 1;
        const bool bCutting = pGeomOutput.isA() == OdGiCuttedGeometryOutput::desc();
        const bool *pVis = (bCutting) ? pCutVis : pSectVis;
        const OdUInt16 *pClr = (bCutting) ? pCutClr : pSectClr;
        pGeomOutput.setTraitsOverrideFlags(pGeomOutput.traitsOverrideFlags() | OdGiSubEntityTraitsChangedFlags::kColorChanged);
        pGeomOutput.traitsOverrides().setColor(pClr[lrNum]);
        return pVis[lrNum];
      }
    }
    return true;
  }
  ClippingCallback() {}
};
```

在我们的 clippedGeometryOutputCallbackProc() 方法实现中，我们调用了四个静态数组：

- bool pSectVis\[4\] — 包含截面几何体的可见性。
- bool pCutVis\[4\] — 包含切割几何体的可见性。
- OdUInt16 pSectClr\[4\] — 包含截面几何体的颜色索引。
- OdUInt16 pCutClr\[4\] — 包含切割几何体的颜色索引。

我们使用图层编号作为这些数组的索引。由于我们不仅会为截面输出几何体调用此回调，还会为切割几何体输出调用此回调，因此我们会检查 pGeomOutput 是否为切割几何体输出，然后使用适当的数组来更改几何体颜色并返回几何体可见性标志。

构建我们的截面/切割几何体回调，并将其与几何体裁剪边界一起设置：

```
// Construct our callback object
  OdGiClippedGeometryOutputCallbackPtr pSectionCallback = OdRxObjectImpl<ClippingCallback>::createObject();
  // Construct clipping boundary with section planes
  OdGiPlanarClipBoundary bnd; bnd.setClipPlanes(clipPlanes);
  bnd.setSectionGeometryOutput(OdGiSectionGeometryOutput::createObject());
  { OdGiCuttedGeometryOutputPtr pTraitsSets = OdGiCuttedGeometryOutput::createObject();
    pTraitsSets->setTraitsOverrideFlags(OdGiSubEntityTraitsChangedFlags::kTransparencyChanged);
    pTraitsSets->traitsOverrides().setTransparency(OdCmTransparency(0.5));
    bnd.setCuttedGeometryOutput(pTraitsSets);
  }
  // Setup our callback object
  bnd.sectionGeometryOutput()->setGeometryProcessingCallback(pSectionCallback);
  bnd.cuttedGeometryOutput()->setGeometryProcessingCallback(pSectionCallback);
  // Setup viewport clipping
  OdGiClipBoundary emptyBoundary;
  ::odgiEmptyClipBoundary(emptyBoundary);
  pGsView->setViewport3dClipping(&emptyBoundary, &bnd);
```

此代码与之前[截面文章](https://www.opendesign.com/blog/2019/october/part-1-2-using-geometry-sectioning-callback%20)和[切割几何体文章](https://www.opendesign.com/blog/2019/august/part-1-2-generating-cut-geometry-planar-clipping-boundaries%20)中的代码示例几乎相同。在这里，我们额外设置了一个透明度覆盖，使切割几何体半透明，否则我们将看不到几何体截面。

首先，我们将所有图层的几何体可见性设置为 true，以使所有截面和切割几何体可见。并为每个图层设置不同的颜色。

```
 <code class=" cpp="">
const bool ClippingCallback::pSectVis[4] = { true, true, true, true }; 
const bool ClippingCallback::pCutVis[4] = { true, true, true, true }; 
const OdUInt16 ClippingCallback::pSectClr[4] = { 4, 32, 220, 81 }; 
const OdUInt16 ClippingCallback::pCutClr[4] = { 231, 20, 171, 9 };
```

生成的图像如下所示：

![example generated image](/files/inline-images/example%20generated%20image.jpg)正如我们所看到的，对于所有对象，截面和切割几何体都以不同的颜色生成。现在我们还可以为某些对象禁用几何体类型（切割或截面）：

```
const bool ClippingCallback::pSectVis[4] = { true, false, false, true };
const bool ClippingCallback::pCutVis[4] = { true, true, false, false };
const OdUInt16 ClippingCallback::pSectClr[4] = { 4, 32, 220, 81 };
const OdUInt16 ClippingCallback::pCutClr[4] = { 231, 20, 171, 9 };
```

结果图像如下所示：

![disable some types of geometry example](/files/inline-images/example%20disable%20types%20of%20geometry.jpg)如您所见，第一个对象（圆锥体）绘制了截面和切割几何体，因为它们都已为其启用。第二个对象（球体）绘制时没有截面几何体，但启用了切割几何体。第三个对象被裁剪，但截面和切割几何体输出都已为其禁用。最后一个对象（圆环体）仅绘制了截面几何体。

这个简单的例子展示了如何使用裁剪几何回调来配置不同图形场景对象的输出几何行为。

#### 结论

裁剪几何输出回调提供了一种简单的方法，可以根据数据库对象的具体情况配置截面和切割几何输出行为。这种灵活的功能能够为所有软件需求配置整个裁剪图形场景。

## 今天就开始行动

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

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