OCCT 曲面支持矩形修剪。布尔运算后可能会出现非矩形域。
![![[Pasted image 20231115140418.png]]](https://1000bd.com/contentImg/2023/11/16/225536695.png)
如何存储剪切操作的结果?
一般来说,拓扑是描述对象局限性的一种手段。
![![[Pasted image 20231115140611.png]]](https://1000bd.com/contentImg/2023/11/16/225536754.png)
OCC拓扑被用于用于描述:
拓扑形状是根据这两个概念定义的:
![![[Pasted image 20231115141321.png]]](https://1000bd.com/contentImg/2023/11/16/225537223.png)
B-Rep 有多种替代方案:
![![[Pasted image 20231115141954.png]]](https://1000bd.com/contentImg/2023/11/16/225537220.png)
OCCT定义了以下类型的拓扑形状:
![![[Pasted image 20231115142507.png]]](https://1000bd.com/contentImg/2023/11/16/225537422.png)
下图显示了复杂形状(图中的实体)的子形状之间关系的示例:
![![[Pasted image 20231115142801.png]]](https://1000bd.com/contentImg/2023/11/16/225537537.png)
如果两个形状(shapes)共享一些边界子形状,则它们是连接的。
示例:让我们考虑两条边——e1 和 e2。它们中的每一个都受到其边界的限制,边界是顶点(v1f 和 v1l是e1的边界)(v2f 和 v2l是e2的边界)。当这两条边共享一个公共顶点 v3 时,它们是连接的。
![![[Pasted image 20231115143423.png]]](https://1000bd.com/contentImg/2023/11/16/225537190.png)
TopoDS_Shape 是所有拓扑形状类的基类。

TopoDS_Vertex 保存有关点(零维对象)的信息;
TopoDS_Edge 保存有关曲线(一维对象)的信息;
TopoDS_Wire 是边的集合;
TopoDS_Face 保存有关表面(二维对象)的信息;
TopoDS_Shell 是面的集合;
TopoDS_Solid、TopoDS_Compsolid 保存有关实体的信息;
TopoDS_Compound 表示一个形状,它是形状的集合。
TopoDS_Shape 类通过以下方式定义形状:
![![[Pasted image 20231115144441.png]]](https://1000bd.com/contentImg/2023/11/16/225537298.png)
TopoDS_TShape:一个句柄类,描述其对象在它默认坐标系。这个类从来没有直接使用过,通常使用 TopoDS_Shape。
TopLoc_Location:定义局部坐标系,将形状放置在与其定义不同的位置。
示例:所有这些盒子共享相同的 TShape,但位置不同。
![![[Pasted image 20231115144358.png]]](https://1000bd.com/contentImg/2023/11/16/225537581.png)
TopAbs_Orientation:描述形状如何根据区域(内部和外部)界定几何形状。
![![[Pasted image 20231115145008.png]]](https://1000bd.com/contentImg/2023/11/16/225536687.png)
考虑形状(shape)的上下文关系时,形状的方向和位置参数也被假定影响其子形状。当将一个形状发展为子形状时,子形状的方向和位置将与主形状的方向和位置相结合。这确保了在引用子形状的每个形状的上下文中对子形状的参数进行一致的解释。例如,当在这些面的上下文中搜索时,两个相连的面共享的边将具有相反的方向。
TopoDS_Shape 类及其子类提供了各种有用的方法,例如:
访问 TShape:
![![[Pasted image 20231115145707.png]]](https://1000bd.com/contentImg/2023/11/16/225537739.png)
TopoDS_Shape 对象通过值进行操作。这就是为什么要实现特殊方法来提供向下转换功能的原因:
![![[Pasted image 20231115150353.png]]](https://1000bd.com/contentImg/2023/11/16/225537703.png)
TopTools 包提供:
![![[Pasted image 20231115150728.png]]](https://1000bd.com/contentImg/2023/11/16/225537744.png)
搜索拓扑形状意味着找到它的子形状,可能符合特定的标准。
TopoDS_Iterator 类搜索给定形状的第一级子形状(来自其 TShape 中的列表)。
TopExp_Explorer 类搜索给定形状中的所有子形状,并可以选择实体类型(例如,仅面)。![![[Pasted image 20231115151146.png]]](https://1000bd.com/contentImg/2023/11/16/225536748.png)
TopExp::MapShapes() 方法搜索子形状并将它们放入map中(从而检测相同的元素)。![![[Pasted image 20231115151226.png]]](https://1000bd.com/contentImg/2023/11/16/225537049.png)
TopExp::MapShapesAndAncestors() 方法返回引用另一个实体的所有实体。![![[Pasted image 20231115151420.png]]](https://1000bd.com/contentImg/2023/11/16/225537386.png)
在OCCT中,不存在从子形状到其祖先形状的反向指针。相反,TopExp::MapShapesAndAncestors() 可用于恢复此信息。例如,如果您想查找包含给定顶点或边的所有面,您可以使用此方法。
边界表示(B-Rep)在三维描述模型对象。
在 B-Rep 建模中,实体由其边界表示。
![![[Pasted image 20231115151959.png]]](https://1000bd.com/contentImg/2023/11/16/225537440.png)
B-Rep 将几何融入拓扑:
定义 BRep_TVertex、BRep_TEdge 和 BRep_TFace 是为了向拓扑模型添加几何信息。
BRep_TVertex、BRep_TEdge 和 BRep_TFace 继承 TopoDS_TShape。
根据拓扑实体的不同,几何信息的存储方式也不同。
存储几何信息的实体允许描述:
BRep_TVertex 几何存储为:3D 点 (gp_Pnt) ——对于所有顶点。
点表示的列表可以是:
![![[Pasted image 20231115153221.png]]](https://1000bd.com/contentImg/2023/11/16/225536567.png)
BRep_TEdge 几何图形存储为曲线列表,可以是:
![![[Pasted image 20231115153734.png]]](https://1000bd.com/contentImg/2023/11/16/225536548.png)
BRep_TFace 几何图形存储为 Geom_Surface
![![[Pasted image 20231115153915.png]]](https://1000bd.com/contentImg/2023/11/16/225537074.png)
一些几何表示可以附加到拓扑(B-Rep)对象。例如,一个顶点可以表示为:
![![[Pasted image 20231115162809.png]]](https://1000bd.com/contentImg/2023/11/16/225536673.png)
在 BRep_TEdge 中,精度定义了 3D 曲线周围管道的半径:![![[Pasted image 20231115162914.png]]](https://1000bd.com/contentImg/2023/11/16/225536751.png)
在 BRep_TFace 中,精度定义了曲面面上方和下方的厚度:![![[Pasted image 20231115163008.png]]](https://1000bd.com/contentImg/2023/11/16/225536554.png)
由于公差与几何载体相关,因此它是由 B-Rep 中创建或修改几何的算法定义的。
OCCT要求:公差(顶点) >= 公差(边) >= 公差(面)
![[Pasted image 20231115163106.png]]
OCCT 使适配器用于通过适配器模式在几何算法中使用拓扑实体。边界表示作为修剪的曲线和曲面工作,从而消除了手动修剪的必要性。可以使用以下适配器:
3D 空间(3D 拓扑)和参数空间(UV 拓扑)中同一面的表示通常拓扑相似。
![![[Pasted image 20231115164601.png]]](https://1000bd.com/contentImg/2023/11/16/225537313.png)
有时 3D 拓扑和 UV 拓扑是不同的。这是情况出现在接缝边和退化的边。

OCCT提供了多个软件包,为建模算法提供高级 API。这些 API 既简单又强大:
简单,因为只需要调用一次函数即可创建对象![![[Pasted image 20231115164822.png]]](https://1000bd.com/contentImg/2023/11/16/225536875.png)
功能强大,因为它包括错误处理和对算法提供的额外信息的访问![![[Pasted image 20231115164934.png]]](https://1000bd.com/contentImg/2023/11/16/225537526.png)
该包包含以下类:
![![[Pasted image 20231115170216.png]]](https://1000bd.com/contentImg/2023/11/16/225537777.png)
OCCT 中提供的数据共享概念允许重复使用拓扑信息和实例模型通过不同的位置。形状内的位置是一组连续的变换,它们是作为单个转换进行操作。
注意:空位置和现有的相同位置被视为不同。IsSame() 检查将返回 false。
位置方法如下:
![![[Pasted image 20231115170730.png]]](https://1000bd.com/contentImg/2023/11/16/225537672.png)
OCCT方向概念旨在通过内部和外部区域的信息完成边界表示。该信息是一组影响形状正确性的规则。
方向本身对于顶点没有任何意义。仅当顶点限制某些边时,顶点方向才有
意义。边是使用一对顶点构造的(在周期曲线的情况下至少一个顶点使用两
次);按照约定,第一个顶点具有 TopAbs_FORWARD 方向,第二个顶点具有 TopAbs_REVERSED 方向。
注意:BRepBuilderAPI_MakeVertex 构造一个具有 TopAbs_FORWARD 方向的顶点。
![![[Pasted image 20231115171023.png]]](https://1000bd.com/contentImg/2023/11/16/225537775.png)
面是由边界定的一部分曲面。边被组织成线框,以便能够单独跟踪每个环(外部或内部)。
当相框是自由时,没有任何限制;可以无限制地将边添加到线框上。
当线框属于面时,右手法则起作用;线框中的每个边应根据曲线上参数增加的方向定向,使内部位于左侧。
![![[Pasted image 20231115171720.png]]](https://1000bd.com/contentImg/2023/11/16/225537754.png)
可以重建曲线,但更好的做法是复原基础曲线。第二选项是在OCCT中重建。
实体是模型空间的一部分,由组织成壳的面界定。实体中的法线应该指向实体外部。微分几何指出可以通过曲面上的点计算曲面法向,使用以下公式(“x”代表叉积):
N
(
u
0
,
v
0
)
=
s
u
′
(
u
0
,
v
0
)
×
s
v
′
(
u
0
,
v
0
)
N(u_{0},v_{0})=s_{u}'(u_{0},v_{0})\times s_{v}'(u_{0},v_{0})
N(u0,v0)=su′(u0,v0)×sv′(u0,v0)
法向计算得到方向的符号,因此存在交换偏导数的替代公式(OCCT 使用上面提供的公式)。如何保证实体中正确的法线方向?
面方向在法线之前决定符号:
![![[Pasted image 20231115173318.png]]](https://1000bd.com/contentImg/2023/11/16/225537640.png)
OCCT 有两种布尔算法的实现。在内部,它们被称为“旧”和“新”算法。旧算法不再维护并标记为已过时。 OCCT 的“新”布尔算法可在 BRepAlgoAPI package中找到。可以使用以下算法:
![![[Pasted image 20231116095712.png]]](https://1000bd.com/contentImg/2023/11/16/225536863.png)
该软件包提供了额外的构建工具,例如:
![![[Pasted image 20231116102107.png]]](https://1000bd.com/contentImg/2023/11/16/225536994.png)
该package提供了用于创建圆角和切角的类:
![![[Pasted image 20231116103755.png]]](https://1000bd.com/contentImg/2023/11/16/225537089.png)
有时,内置操作无法解决建模问题。在这种情况下使用自定义建模管道。 OCCT 没有持久索引;操作后拓扑项可能会发生不可预测的变化。历史支持可以克服这个问题。建模算法具有三种方法可以了解拓扑操作后初始形状“S”的修改状态:
![![[Pasted image 20231116104451.png]]](https://1000bd.com/contentImg/2023/11/16/225537321.png)