九韶内核 1.0.0.0
|
OrientationType 共有 4 种类型:Forward,Reversed,Internal,External,其中最常用的是 Forward 和 Reversed。任何一级的 TopoShape 都可以用 SetOrientation() 来设置 Orientation,或者用 Orientation() 来获取 Orientation。如果想获得一个与当前 TopoShape 只有 Orientation 不同的 TopoShape,可以使用 Orientated() 。Orientation 是与几何、Location 独立的成员,改变任何一个不会影响其他任意成员。
对于一条 Edge ,其起始 Vertex 的 Orientation 为 Forward,终止 Vertex 的 Orientation 为 Reversed。比如一个线段 Edge 有两个不同的 Vertex,则 Orientation 一个是 Forward,另一个是 Reversed。再比如圆构成的 Edge 有两个相同的 Vertex,但 Orientation 也是一个为 Forward,另一个为 Reversed。
注:在上面这个例子中,因为圆构成的 Edge 有两个相同的 Vertex,所有只需要构造一个顶点就可以,这时 AMCAX::TopoTool::IsClosed(edge) 会返回 true。如果构造了两个顶点,那么 AMCAX::TopoTool::IsClosed(edge) 会返回 false。
Edge 的 Forward 方向是 curve3d 的方向。如果没有 curve3d 就是 pcurve 的方向。Reversed Edge 的方向与 curve 方向相反。
比如已知三条用 xoy 平面上的 3d curve 构建的 Edge,以及用自然标架构造的 Geom3Plane:
由于必须保证在参数域上,Wire 的方向是逆时针的,所以应当使用 Reversed 的 Edge0,Forward 的 Edge2,Forward 的 Edge1 构成 Wire。
如果使用了顺时针的 Wire ,即 Forward 的 Edge0,Reversed 的 Edge1,Reversed 的 Edge2,那么 Face 会定义为 Wire 不围成的部分。以下分别为逆时针和顺时针的 Wire:
如果 Geom3Plane 是用 Frame3(O, -OZ, OX) 构造的,那么 Wire 的方向应为顺时针方向,即 Forward 的 Edge0,Reversed 的 Edge1,Reversed 的 Edge2,这样就可以确保 Face 被正确定义为 Wire 围成的区域。
Wire 的 Reversed 等价于将 Forward 的 Wire 中的每个 Edge 的 Orientation 变为反向。
对 Face 进行 Reversed 后, Face 所包围的方向变为曲面法向的反向。对 Face 进行 Reversed 等价于将 Forward 的 Face 中 Wire 的 Orientation 变为反向。
其中获取 Face 所在曲面的法向的方法如下:
对 Shell 进行 Reversed 后 ,Shell 所包围的方向变为反向。对 Shell 进行 Reversed 等价于将 Forward 的 Shell 中的每个 Face 的 Orientation 变为反向。
对 Solid 进行 Reversed 后, Solid 所包围的方向变为反向。对 Solid 进行 Reversed 等价于将 Forward 的 Solid 中的每个 Face 的 Orientation 变为反向。
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 的方法是: AMCAX::TopoBuilder::UpdateVertex() , AMCAX::TopoBuilder::UpdateEdge(), AMCAX::TopoBuilder::UpdateFace()。
接下来我们将逐一介绍 Vertex、Edge、Face 中的 Tolerance:
Vertex 的 Tolerance 是一个设定的值,其意义为 Point 到 Vertex 的距离(Point 到 Vertex 中 Point 的距离)不大于 Tolerance 时,认为 Point 在 Vertex 上。而 Vertex 的 Point 有很多来源:本身的 Point3,Curve 在某一参数上的值,Surface 在某一 uv 参数上的值,Vertex 的 Tolerance 要不小于这些点之间的最大距离。
Edge 的 Tolerance 是一个设定的值,其意义为 Point 到 Edge 的距离不大于 Tolerance 时,认为 Point 在 Edge 上。此外,Edge 有 curve3d 和 pcurve,而 pcurve 可以通过 Surface 构建一个等价的 curve3d。若干条 curve3d 在采样下的最大距离不能大于 Edge 的 Tolerance,如果不满足则必须增大 Edge 的 Tolerance。另外,Vertex 的 Tolerance 必须比所在 Edge 的 Tolerance 更大或相等。
Face 的 Tolerance 是一个设定的值,其意义为 Point 到 Face 的距离不大于 Tolerance 时,认为 Point 在 Face 上,较多用于布尔操作里。除此之外,Vertex、Edge 的 Tolerance 必须比所在 Face 的 Tolerance 更大或相等。
注:当存在从属关系时,Vertex 的 Tolerance ≥ Edge 的 Tolerance ≥ Face 的 Tolerance。
TopoShape 是否封闭是一个关键的 Flag。我们可以使用 AMCAX::TopoTool::IsClosed() 来判断 TopoShape 是否为封闭的。在这里需要与 AMCAX::TopoShape::Closed() 进行区分, AMCAX::TopoShape::Closed() 返回的 bool 是一个用户任意定义的 flag。比如,将一条线段构建成一个 Edge,尽管不封闭,但仍然可以用 AMCAX::TopoShape::Closed(true) 将其 flag 设为 true。
而 AMCAX::TopoTool::IsClosed() 是对某几类 TopoShape 进行拓扑上的判断。接下来将逐一介绍输入不同 ShapeType 的 TopoShape 时, AMCAX::TopoTool::IsClosed 的用途。
AMCAX::TopoTool::IsClosed() 用于判断 Edge 的 FirstVertex 和 LastVertex 是否 IsSame。
AMCAX::TopoTool::IsClosed() 用于判断 Wire 是否没有边界 Vertex,即对 Wire 遍历 Vertex,每个 Vertex 都出现偶数次。
AMCAX::TopoTool::IsClosed() 用于判断 Shell 是否没有边界 Edge(自由Edge),即对 Shell 遍历 Edge,除退化边外每个 Edge 都出现偶数次。
对 edge wire shell 外的其他类型执行 AMCAX::TopoTool::IsClosed() 时,其结果就是 AMCAX::TopoShape::Closed() 的结果。