|
九韶内核 1.0.0.0
|
OrientationType 定义了四种方向类型:Forward、Reversed、Internal 和 External,其中 Forward 和 Reversed 是最常用的两种类型。在 TopoShape 的任何层级中,都可以通过以下方法操作方向属性:设置方向:使用 SetOrientation() 方法;获取当前方向:使用 Orientation() 方法;生成仅方向不同的新形状:使用 Orientated() 方法。方向是 TopoShape 的一个独立属性,与几何(Geometry)和位置(Location)互不影响,修改其中任意一个属性,都不会对其他属性造成改变。
对于一条 Edge ,其起始 Vertex 的 Orientation 为 Forward,终止 Vertex 的 Orientation 为 Reversed。比如一个线段 Edge 有两个不同的 Vertex,则 Orientation 一个是 Forward,另一个是 Reversed。再比如圆构成的 Edge 有两个相同的 Vertex,但 Orientation 也是一个为 Forward,另一个为 Reversed。
注:在上面这个例子中,因为圆构成的 Edge 有两个相同的 Vertex,因此实际上只需构造一个 Vertex 即可完整定义该 Edge,这时调用 AMCAX::TopoTool::IsClosed(edge) 会返回 true。如果构造了两个顶点(坐标相同且方向相反),此时调用 AMCAX::TopoTool::IsClosed(edge) 会返回 false。
正向边(Forward)的方向与三维曲线(curve3d)的走向一致;若边无三维曲线,则正向边的方向与参数曲线(pcurve)的走向一致。反向边(Reversed)的方向与三维曲线(curve3d)的走向相反;若边无三维曲线,则反向边的方向与参数曲线(pcurve)的走向相反。
下面我们通过一个具体案例来演示边方向的重要性。在 XOY 平面上,通过三条三维曲线以及 Frame3(O, OZ, OX) 构建了一个三维几何平面:
在几何建模中,Wire 的方向直接影响了 Face 的有效构建。正常情况下,由于必须保证在参数域上,Wire 的方向是逆时针的,所以应当使用 Reversed 的 Edge0,Forward 的 Edge2,Forward 的 Edge1 构成 Wire。
如果构造了顺时针的 Wire ,即 Forward 的 Edge0,Reversed 的 Edge1,Reversed 的 Edge2,此时 Face 会定义为 Wire 不围成的部分。为直观展示这一特性,我们提供了对比图示:
若三维几何平面由 Frame3 (O, -OZ, OX) 构造而成,为确保 Face 能被正确定义为 Wire 所围成的区域,此时 Wire 的方向需为顺时针方向,即 Forward 的 Edge0,Reversed 的 Edge1,Reversed 的 Edge2。
对 Wire 执行 Reversed 操作会反转其方向。这一操作等价于:将 Wire 中所有 Edge 的 Orientation 变为反向(即原 Forward 变为 Reversed,原 Reversed 变为 Forward)。
对 Face 执行 Reversed 操作后,Face 所包围区域的方向,会变为该 Face 曲面法向的相反方向。这一操作等价于:将 Face 中所有 Wire 的 Orientation 变为反向(即原 Forward 变为 Reversed,原 Reversed 变为 Forward)。
获取 Face 所属曲面法向的方法如下:
对 Shell 执行 Reversed 操作会反转其方向。这一操作等价于:将 Shell 中所有 Face 的 Orientation 变为反向(即原 Forward 变为 Reversed,原 Reversed 变为 Forward)。
对 Solid 执行 Reversed 操作会反转其方向。这一操作等价于:将 Solid 中所有 Shell 的 Orientation 变为反向(即原 Forward 变为 Reversed,原 Reversed 变为 Forward)。
Tolerance 用于表示 TopoShape 的误差允许范围。例如,若某 Vertex 在 Edge1 的曲线上的对应点为 Point3 (0.0, 0.0, 0.0),在 Edge2 的曲线上的对应点为 Point3 (1.0, 0.0, 0.0),当 tolerance=2.0 时,这两个点会被视作同一点。也就是说,此类 Vertex 虽在不同 Edge 上的几何点不同,但作为拓扑结构,这个 Vertex 是合法的。
获取 TopoShape 的 Tolerance 可通过 AMCAX::TopoTool::Tolerance() 实现。仅 Vertex、Edge、Face 这类包含几何信息的结构具有 Tolerance 属性。若想更改 Tolerance 的可通过 UpdateVertex() ,UpdateEdge(),UpdateFace() 实现。
接下来我们将分别介绍 Vertex、Edge、Face 中的 Tolerance:
Vertex 的 Tolerance 是一个设定值,其含义为:当 Point 到 Vertex 的距离(Point 到 Vertex 中 Point 的距离)不超过该 Tolerance 时,判定该点位于 Vertex 上。而 Vertex 的 Point 来源多样,包括其自身的 Point3、曲线(Curve)在某一参数下的值、曲面(Surface)在某一 uv 参数下的值等。需要注意的是,Vertex 的 Tolerance 必须不小于这些来源点之间的最大距离。
Edge 的 Tolerance 是一个设定值,其含义为:当 Point 到 Edge 的距离不超过该 Tolerance 时,判定该点位于 Edge 上。此外,Edge 有 curve3d 和 pcurve,其中 pcurve 可通过 Surface 构建一个等价的 curve3d。需要注意的是,多条 curve3d 在采样时的最大距离不得超过 Edge 的 Tolerance,若不满足这一条件,则必须增大 Edge 的 Tolerance。此外,Vertex 的 Tolerance 必须大于或等于其所在 Edge 的 Tolerance。
Face 的 Tolerance 是一个设定值,其含义为:当 Point 到 Face 的距离不超过该 Tolerance 时,判定该点位于 Face 上,这一特性在布尔操作中应用较多。此外,Vertex 和 Edge 的 Tolerance 必须大于或等于其所在 Face 的 Tolerance。
注:当存在从属关系时,Vertex 的 Tolerance ≥ Edge 的 Tolerance ≥ Face 的 Tolerance。
TopoShape 是否封闭是一个关键标志(Flag)。我们可以使用 IsClosed() 来判断 TopoShape 是否封闭。这里需要与 Closed() 加以区分,Closed() 返回的布尔值是一个由用户自定义的标志。例如,将一条线段构建为一条 Edge,即便该 Edge 实际不封闭,仍可通过 Closed (true) 将其标志设为 true 。
而 IsClosed() 方法用于对特定类型的 TopoShape 进行拓扑上的判断。下文将逐一说明,当输入不同 ShapeType 的 TopoShape 时,IsClosed () 的具体用途。
IsClosed() 方法用于判断 Edge 的起始顶点与终止顶点是否为同一顶点(IsSame)。
IsClosed() 方法用于判断 Wire 中是否不存在边界顶点,其判定逻辑为:遍历 Wire 中的所有顶点,每个顶点的出现次数均为偶数。
IsClosed () 方法用于判断 Shell 中是否不存在边界边(自由边),其判定逻辑为:遍历 Shell 中所有边,除退化边外,每条边的出现次数均为偶数。
对 Solid、Face 类型执行 IsClosed() 的结果就是 Closed() 的结果。