[ブログに戻る](/ja/blog) # B-Repビルダー出力の検証

Oleksandr Bryzghalin 4月 18, 2019 [\#b-rep](/ja/blog/tag/b-rep)

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

ODAのB-Repビルダーを使用するとSpatial ACIS®オブジェクトを作成できますが、特定の事項が考慮されていない場合、誤ったACISオブジェクトが作成される可能性があります。これを防ぐために、B-Repビルダーにはバリデーター（BBバリデーター）が含まれています。

バリデーターとは何ですか？BBバリデーターは、ACISオブジェクトを作成するために使用される入力データにエラーやACISコアに特徴的な機能が存在するかどうかをチェックするオブジェクトです。デフォルトではBBバリデーターは有効になっています。作成されたオブジェクトにエラーが含まれる可能性があるため、無効にすることはお勧めしませんが、次のメソッドを呼び出すことで無効にできます。

void OdBrepBuilderBase::enableValidator(false)

BBバリデーターによって実行されるチェックを見ていきましょう。すべての説明はB-Repの観点からです。ご存知のように、一般的に面を作成するには、何らかのループで囲まれたサーフェスが必要です。

まず、バリデーターはループが正しく設定されているかを確認します。これはいくつかのチェックを使用して行われ、最初のチェックはループ内にコエッジが指定されているかどうかを確認します。つまり、ループ内に少なくとも1つのコエッジがあるかどうかです。そうでない場合、eNoTrimmigLoop例外がスローされます。

次のチェックでは、ループがサーフェス上にあるかどうかを判断します。その方法は、bool BrepBuilderValidator::isTrimmingLoopOnFaceCheck(double dTol) です。距離が指定された距離よりも大きい場合、曲線、したがってループが面にないものと見なされ、例外 eLoopIsNotOnFace が発生します。アルゴリズムは、コエッジをループにわたって反復処理します。現在のエッジから20個の点を取り、各点がサーフェス上にあると仮定します。その場合、サーフェスのパラメトリック空間で対応する2D点を定義し、サーフェス上の3D点を計算すると、エッジの3D曲線上の点と一致するはずです。それらの間の距離が許容誤差よりも小さい場合、エッジの次の3D点に反復処理します。

次の画像は、極が減算された円錐サーフェスを示しています。青はエッジ、赤は拡大されたエッジを示します（2番目の画像を参照）。

![1](/files/inline-images/11.jpg)この2番目の画像は、拡大された領域を示しています。エッジの点の1つがサーフェス上にないため、エラーになります。

![22](/files/inline-images/22_0.jpg)コエッジがパラメトリック曲線によって定義されている場合、バリデーターは20個の2D点を取り込み、表面上の関連する3D点を決定します。これらの点はエッジの3D曲線上に存在すると仮定されます。これは、それらに対応するパラメータを定義し、それらを使用して再度3D点を計算した場合、許容範囲内で一致する必要があることを意味します。そうでない場合、例外 eLoopIsNotOnFace が発生します。

ご覧のとおり、BBバリデーターはパラメトリック曲線を使用します。この場合、重要なのは、パラメトリック曲線と3D曲線の間隔が一致する必要があることです。これは、ACIS、B-Rep Builder、およびBBバリデーターを使用する際に考慮する必要があります。パラメトリック曲線の間隔が3D曲線の間隔と等しいか、またはそれを含む必要があるというチェックがあります。このチェックは、bool AcisBBValidator::isDir2dCoincide3d(double dTol) メソッドで実行されます。したがって、例えばp1、p2、p3のような2D点をいくつか順序付けると、表面上にそれに対応する3D点pp1、pp2、pp3、および3D曲線上の点c1、c2、c3が得られます。幾何学的には、表面上の点の順序は3D曲線上の点と同じである必要があります。

次の前提条件は、ループが分離不可能で閉じている必要があることです。これは、bool BrepBuilderValidator::isTrimmingContinuousAndClosedCheck(double dTol) で検証されます。ここでは、最後のエッジの終点が最初のエッジの始点と一致し（方向を考慮して）、この条件が2つの隣接するエッジ（現在と次）で満たされるようにチェックが実行されます。

ACISの面にはいくつかの条件があります。それらはゼロ面積を持つことも、複数の外部ループを持つこともできません。これらの条件は、BBバリデーターで以下のメソッドを使用してチェックされます。

- bool AcisBBValidator::checkZeroFaces(OdArray&lt;BRepBuilderGeometryId&gt; &amp;arrZeroAreaFaces, double dTol)
- bool BrepBuilderValidator::checkNOuterLoops(double dTol)

アルゴリズムの複雑さのため、閉じたサーフェスにおける外部ループの数の決定はまだ開発中です。

最後のチェックは、bool AcisBBValidator::checkEdgeStartEndParam(double dTol) メソッドで実装されています。これは、曲線とエッジの開始頂点に最も近い曲線との間の距離をチェックします。距離が「tol」より大きい場合、例外 eInvalidInput が発生します。

## 今すぐ始める

**ODAソフトウェアを60日間無料でお試しください。  
リスクなし、クレジットカード不要。**

[無料で試す](https://www.opendesign.com/ja/free-trial)
