OpenCASCADE基础总结
OpenCASCADE 基础总结
准备工作
概述
Open CASCADE Technology(OCCT)是一个开源的 C++库, 包含上千个类以提供以下领域的解决方案:
- 曲面和实体建模
- 3D 和 2D 可视化
- 数据交换
- 应用程序快速开发
OCCT也适用于很多CAD/CAM/CAE的其他领域, 包括AEC, GIS, 和PDM. OCCT是为工业 3D 建模和可视化程序开发的需要高质量, 可信赖和健壮的工具.
OCCT使用LGPL开源协议.
OCCT 基础
标准类型
| OCCT 类型 | C++类型 |
|---|---|
| Standard_Integer | int |
| Standard_Real | double |
| Standard_ShortReal | float |
| Standard_Boolean | bool |
| Standard_CString | const char* |
| Standard_ExtString | const short* |
| Standard_Address | void * |
| Standard_False | false |
| Standard_True | true |
Handle
Handle是OCCT的智能指针, Handle与std::shared_ptr相同.
Collections
由于历史原因, OCCT包含了TCollection和NCollection两种集合.
TCollection是 1998 年标准化之前使用的集合, 从OCCT 7.0之后被NCollection代替.
除了NCollection_Vector, OCCT 的索引从1开始, NCollection_Vector从0开始.
Collection使用值(value)进行操作, 也提供了使用Handle进行操作的大多数Collection.
| OCCT 集合 | C++ 11 集合 |
|---|---|
| NCollection_Array | std::array |
| NCollection_Vector | std::vector |
| NCollection_List | std::forward_list |
| NCollection_IndexedMap | std::unordered_set |
| NCollection_IndexedDataMap | std::unordered_map |
Exceptions
OCCT的所有异常均继承自Standard_Failure.
几何
MVC
OCCT提供了一系列类让用户可以直接使用或者增加自定义类进行扩展.
实现某些概念(比如几何实体)的类通常按照实现分组成: Model, View和Controller
以2D圆为例:
- Model:
- 一个包含
圆心和半径的数据对象. - 标准的
构造函数:默认构造, 使用点和半径等.
- 一个包含
- Controller:
- 通过 3 个
点构造一个圆. - 使用
圆心和一条切线构造一个圆每个
controller都包含一个方法返回抽象数据对象.
- 通过 3 个
- View:
- 在
viewer中显示的对象
- 在
在OCCT中实现的用于几何和拓扑对象的controller类包括:
- 直接构造(gce_MakeCircle, gce_MakeLin2d)
- 2 维约束构造(GccAna_Circ2d2TanRad)
- 复杂的构造算法: 插值近似, 投影(GeomAPI 包)
概述
非参和参数几何
非参几何:
- 类型使用
值进行操作 - 没有继承
参数几何:
Geom的实体使用Handle操作,controller类使用值- 类的继承遵循
STEP(ISO 10303) - 提供方法进行
Geom和gp互转
非参几何
Model类(2D 类使用2d结尾, gp_Pnt2d):
gp_Pnt: 笛卡尔点gp_Vec: 向量gp_Dir: 方向(非空且长度为 1)gp_Trsf: 欧式变换gp_Ax1: 轴, 有一个点加上一个方向构成gp_Lin: 直线gp_Circ: 圆gp_Elips: 椭圆gp_Hypr: 双曲线gp_Parab: 抛物线gp_Cylinder: 圆柱gp_Sphere: 球gp_Torus: 圆环
Controller类:
- 直接构造: gce_MakeCirc, gce_MakeLin
- 约束性构造(仅 2D): GccAna_Circ2d2TanRad
非参几何的局限性
- 无法回答典型的几何问题:
- 这一点的曲率是多少?
- 这一点处曲线的切向量是什么
- 曲线与给定点之间的最小欧式距离是多少
- 这些对象是否相交
- 有些对象是无限的, 无法将其变为有限:
- 直线, 双曲线, 抛物线
- 平面, 圆柱
- 无法表示自由形式和复杂对象:
- 如何表示飞机机身?(贝塞尔和 B 样条)
- 如何表示偏移表面?(需要法线)
- 如何表示扫掠表面?(线性拉伸和旋转)
参数几何
Model类(2D 类在Geom2d包中):
Geom_Curve:Geom_LineGeom_Conic:Geom_CircleGeom_EllipseGeom_HyperbolaGeom_Parabola
Geom_BoundedCurve:Geom_BSplineCurveGeom_BezierCurveGeom_TrimmedCurve
Geom_OffsetCurve
Geom_Surface:Geom_ElementarySurface:Geom_PlaneGeom_CylindricalSurfaceGeom_ConicalSurfaceGeom_SphericalSurfaceGeom_ToroidalSurface
Geom_BoundedSurface:Geom_BSplineSurfaceGeom_BezierSurfaceGeom_RectangularTrimmedSurface
Geom_SweptSurface:Geom_SurfaceOfLinearExtrusionGeom_SurfaceOfRevolution
Geom_OffsetSurface
参数几何的 Trimming
有些参数对象, 比如线(Geom_Line)或面(Geom_Plane)与其非参几何对象一样是无限的, 如何限制它们呢?
- Curve, 使用起始和结束参数进行约束,
Geom_TrimmedCurve - Surface, 使用矩形域进行约束,
Geom_RectangularTrimmedSurface
约束
2D 几何约束
在OCCT中, 2D 曲线具有隐式方向, 并且定义了内部区域. 按照惯例, 曲线的内部位于曲线的方向的左侧. 约束的创建涉及根据它们相对与解的位置对参数进行限定:
- Outside
- Enclosing
- Enclosed
拓扑
概述
拓扑通常用来描述:
- 对象的边界
- 对象的连接性
OCCT的拓扑对象被称为shape
拓扑是根据以下两个概念定义的:
- 抽象拓扑(TopoDS): 通过描述有界对象和包围对象之间的关系来定义数据结构(如: 边由其边界(顶点)描述)
- 边界表示(B-Rep): 通过关联拓扑和几何信息来完成对象的定义(如: 边位于一条曲线上, 并由点围成)
OCCT的抽象拓扑, 边界表示和算法在不同的包中.
抽象拓扑
OCCT定义了以下类型和拓扑:
TopoDS_Shape:
TopoDS_VertexTopoDS_EdgeTopoDS_WireTopoDS_FaceTopoDS_ShellTopoDS_SolidTopoDS_CompsolidTopoDS_Compound
数据结构
TopoDS_Shape的定义如下:
- 一个
TopoDS_TShape的 handle(TopoDS包) - 一个局部坐标系
TopLoc包 - 一个方向(
TopAbs包)
TopoDS_TShape: 一个 handle 类, 描述默认坐标系统中的对象
TopLoc_Location: 定义一个本地坐标系
比如: 所有的 box 共享相同的
TopoDS_TShape, 但是具有不同的位置
TopAbs_Orientation: 描述shape如何根据条件(或内部区域或外部区域)限定几何形状
比如: 两个连接面共享的边缘具有相反的方向
拓扑的操作
TopoDS_Shape提供了一些有用的方法:
- IsNull(): 检查 TShape 是否为空
- Nullify(): 清空 TShape 智能指针
- Location(): 返回现有位置
- Move(): 对实际形状应用变换
- Moved(): 返回应用了变换的新形状
- ShapeType(): 返回 TopoDS_Shape 的类型
- IsPartner(): 比较 TShape 是否相同
- IsSame(): 比较 TShape 和 Location 是否相同
- IsEqual(): 比较 TShape, Location 和方向是否相同
拓扑的转换
TopoDS_Shape对象通过值进行操作, 使用以下方法进行转换:
- TopoDS::Vertex()
- TopoDS::Edge()
- TopoDS_Wire()
- TopoDS_Face()
- TopoDS::Shell()
- TopoDS::Solid()
- TopoDS::CompSolid()
- TopoDS::Compound()
当进行不适当的转换时会引发异常
拓扑的遍历
遍历拓扑意味着遍历其子形状
TopoDS_Iterator遍历指定形状的第一级子形状TopoExp_Expplorer可以遍历指定形状的所有子形状, 并且可以选择类型TopExp::MapShapes会遍历子形状并将其放入 Map 中(剔除相同的元素)TopExp::MapShapesAndAncestors会返回所有引用另一个实体的实体
边界表示
边界表示法(B-Rep)描述三维模型对象, 在B-Rep建模中, 实体由其边界表示.
B-Rep将几何与拓扑结合起来:
- 几何: 一个 face 位于一个 surface 上, 一个 edge 位于一个 curve 上, 一个 vertex 位于一个 point 上
- 拓扑:
shape的连通性
B-Rep基于以下包:
TopoDS包: 描述对象的拓扑结构Geom和Geom2d包: 描述对象的几何形状
B-Rep 实体
BRep_TVertex, BRep_TEdge和BRep_TFace被定义用于向拓扑模型添加几何信息, 这三个类都继承自TopoDS_Tshape
根据拓扑实体的不同, 几何信息以不用的方式存储, 存储几何信息的实体可以描述:
- 边: 由顶点限定的曲线
- 面: 由边限定的表面
- 实体: 由面限定的空间
