您可以在ODA的B-Rep构建器的帮助下创建Spatial ACIS®对象,但是如果某些事项未被考虑在内,则可能会创建不正确的ACIS对象。为防止这种情况发生,B-Rep构建器中包含了一个验证器(BB验证器)。
什么是验证器?BB验证器是一个对象,用于检查创建ACIS对象所用的输入数据是否存在错误以及ACIS核心的一些特征。默认情况下,BB验证器是启用的。不建议禁用它,因为创建的对象可能包含错误,但您可以通过调用此方法来禁用它:
void OdBrepBuilderBase::enableValidator(false)
让我们来看看BB验证器执行的检查。所有解释都基于B-Rep术语。如您所知,通常要创建一个面,您需要一个由某种循环边界的曲面。
首先,验证器检查循环是否正确设置。这通过多项检查完成,第一项检查循环中是否指定了共边(coedges)。也就是说,循环中是否至少有一个共边。如果没有,它会抛出eNoTrimmigLoop异常。
下一个检查确定循环是否在曲面上。执行此操作的方法是bool BrepBuilderValidator::isTrimmingLoopOnFaceCheck(double dTol)。如果距离大于给定距离,则认为曲线(以及循环)不在面上,并抛出eLoopIsNotOnFace异常。该算法遍历循环中的共边;从当前边取二十个点,并假设每个点都在曲面上。如果是这样,当我们定义曲面参数空间中对应的2D点,然后计算曲面上的3D点时,它应该与边上3D曲线上的点重合。如果它们之间的距离小于容差,则迭代到边的下一个3D点。
接下来的图片显示了一个减去极点的圆锥曲面。蓝色是边缘,红色表示放大的边缘(参见第二张图片)。
第二张图片显示了放大区域。边缘的其中一个点不在曲面上,这将是一个错误。
如果共边由参数曲线定义,验证器会取二十个二维点,并确定曲面上相关的三维点。假设这些点位于边缘的三维曲线上。这意味着,如果您定义了与它们对应的参数,然后再次使用这些参数计算三维点,它们必须在公差范围内重合。如果不是这种情况,则会引发异常 eLoopIsNotOnFace。
如您所见,BB验证器使用参数曲线。在这种情况下,重要的一点是参数曲线和3D曲线的区间必须匹配。在使用ACIS、B-Rep Builder和BB验证器时必须考虑到这一点:有一个检查确保参数曲线的区间必须等于或包含3D曲线的区间。此检查在bool AcisBBValidator::isDir2dCoincide3d(double dTol)方法中执行。因此,如果我们按顺序排列几个2D点,例如p1、p2、p3,我们将在曲面上获得相应的3D点pp1、pp2、pp3以及3D曲线上的点c1、c2、c3。从几何学上讲,曲面上的点顺序应与3D曲线上的点顺序相同。
下一个前提是循环必须是不可分离且闭合的。这在bool BrepBuilderValidator::isTrimmingContinuousAndClosedCheck(double dTol)中进行了验证。在这里,执行检查以确保最后一条边的末端与第一条边的开头重合(考虑到方向),并且此条件适用于两条相邻的边(当前边和下一条边)。
ACIS中的面有几个条件:它们不能具有零面积或多于一个外部循环。这些条件在BB验证器中使用以下方法进行检查:
- bool AcisBBValidator::checkZeroFaces(OdArray<BRepBuilderGeometryId> &arrZeroAreaFaces, double dTol)
- bool BrepBuilderValidator::checkNOuterLoops(double dTol)
由于算法的复杂性,封闭曲面外部循环数量的确定仍在开发中。
最后一次检查在方法bool AcisBBValidator::checkEdgeStartEndParam(double dTol)中实现。它检查曲线与最接近边起始顶点的曲线之间的距离。如果距离大于“tol”,则会引发eInvalidInput异常。