这是关于 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);
以下矢量化图像包含两种几何体(蓝色半透明切割几何体和红色截面):
如果您的应用程序同时调用切割几何体和截面几何体生成,您应该考虑使用非截面几何体裁剪标志的以下规则,该标志在两个接口中都可用。下表显示了如果同时设置切割和截面几何体输出,裁剪引擎如何解释非截面几何体标志:
| 截面几何体输出中的不可截面几何体裁剪标志 | 切割几何体输出中的不可截面几何体裁剪标志 | 裁剪引擎调用的最终标志值 |
|---|---|---|
| false | false | false |
| false | true | true |
| true | false | true |
| true | true | true |
因此,如果要禁用不可截面几何体裁剪,则必须将此标志设置为两个输出接口的“false”,否则裁剪引擎将使用不可截面几何体裁剪。
下图显示了在上一篇文章的“禁用不可截面几何体裁剪”部分中的示例文件中,使用不可截面几何体裁剪标志同时输出截面几何体和切割几何体。
为不可截面实体启用截面
为了检查裁剪引擎是否正确处理所有类型的几何图元(不仅是 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 . . .
当我们使用此覆盖来生成切割几何体时,我们的示例图纸会显示以下图像:
左下角和右下角的图像显示,所有实体不再被裁剪并被视为可截面,因此为它们生成了几何体的切割部分。使用这种覆盖技术,我们可以单独为任何实体类型启用或禁用截面,或者同时为所有类型启用或禁用截面——这为截面功能提供了更灵活的控制。
结论
切割几何体输出的可用性包括裁剪引擎的一组可能输出:
- OdGiOrthoClipperEx::output() — 裁剪几何体的稳定输出。
- OdGiOrthoClipperEx::sectionOutput() — 截面几何体的可选输出。
- OdGiOrthoClipperEx::cuttingOutput() — 切割几何体的可选输出。
直接使用 OdGiOrthoClipperEx 调用切割几何体输出没有限制(OdGiGeometry::pushClipBoundary 功能仅将切割几何体输出的使用限制为平面裁剪边界);切割几何体也可以为任何类型的多边形裁剪边界生成。
切割几何体渲染是基于 ODA SDK 的应用程序的一项实用功能,这些应用程序支持 3D 模型截面,也适用于希望扩展截面可视化效果集的工程和建模应用程序。