これは、Kernel SDKが平面クリッピング境界のカットジオメトリをどのようにサポートするかについての2部構成シリーズの2番目の記事です。最初の記事については、こちらをクリックしてください。
切断ジオメトリ生成と断面ジオメトリの併用
切断ジオメトリ出力インターフェースと断面ジオメトリ出力インターフェースを併用することに制限はありませんが、出力断面を可視化するには、切断ジオメトリを透明にするようにカスタマイズする必要があります。
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;
}
};
このヘルパークラスは内部回帰テストで呼び出され、すべての種類のエンティティを断面化可能にするために使用されます。コンストラクタでは、特定のエンティティまたはすべての種類のエンティティに対してオーバーライドが有効になり、デストラクタでは、アタッチされたオーバーライドが無効になります。コードの一部でエンティティの動作をオーバーライドするには、1行のコードを追加できます。
MakeSectionableDrawableOverrule _over(true, false, false, true);
// Vectorize database . . .
このオーバーライドを切断ジオメトリ生成に使用すると、サンプル図面に対して以下の画像が表示されます。
左下と右下の画像は、すべてのエンティティがクリップされなくなり、断面化可能として扱われるため、ジオメトリの切断部分がそれらに対して生成されたことを示しています。このオーバーライド技術を使用すると、任意のエンティティタイプに対して個別に、またはすべてのタイプに対して同時に断面化を有効または無効にすることができ、断面化機能のより柔軟な制御が可能になります。
結論
切断ジオメトリ出力の利用可能性には、クリッピングエンジンに対する一連の可能な出力が含まれます。
- OdGiOrthoClipperEx::output() — クリッピングされたジオメトリの安定した出力。
- OdGiOrthoClipperEx::sectionOutput() — セクションジオメトリのオプション出力。
- OdGiOrthoClipperEx::cuttingOutput() — カットジオメトリのオプション出力。
OdGiOrthoClipperEx を直接使用してカットジオメトリ出力を呼び出すことに制限はありません (OdGiGeometry::pushClipBoundary 機能は、カットジオメトリの使用を平面クリッピング境界のみに制限します)。カットジオメトリは、あらゆる種類のポリゴンクリッピング境界に対しても生成できます。
カットジオメトリのレンダリングは、3D モデルの断面化をサポートする ODA SDK に基づくアプリケーションや、断面化の視覚化効果のセットを拡張したいエンジニアリングおよびモデリングアプリケーションにとって実用的な機能です。