2 之 2:为平面裁剪边界生成切割几何体

这是关于 Kernel SDK 如何支持平面裁剪边界的切割几何体的两部分系列文章中的第二篇。要阅读第一篇文章,请点击此处

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

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

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

 

如果您的应用程序同时调用切割几何体和截面几何体生成,您应该考虑使用非截面几何体裁剪标志的以下规则,该标志在两个接口中都可用。下表显示了如果同时设置切割和截面几何体输出,裁剪引擎如何解释非截面几何体标志:

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

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

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

Disabling non-sectionable geometry clipping

 

为不可截面实体启用截面

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

class MakeSectionableDrawableOverrule : public OdStaticRxObject
{
  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;
    }
};

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

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

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

 

overruling for cutting geometry generation

 

左下角和右下角的图像显示,所有实体不再被裁剪并被视为可截面,因此为它们生成了几何体的切割部分。使用这种覆盖技术,我们可以单独为任何实体类型启用或禁用截面,或者同时为所有类型启用或禁用截面——这为截面功能提供了更灵活的控制。

结论

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

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

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

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

今天就开始行动

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

免费试用