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_Line
Geom_Conic
:Geom_Circle
Geom_Ellipse
Geom_Hyperbola
Geom_Parabola
Geom_BoundedCurve
:Geom_BSplineCurve
Geom_BezierCurve
Geom_TrimmedCurve
Geom_OffsetCurve
Geom_Surface
:Geom_ElementarySurface
:Geom_Plane
Geom_CylindricalSurface
Geom_ConicalSurface
Geom_SphericalSurface
Geom_ToroidalSurface
Geom_BoundedSurface
:Geom_BSplineSurface
Geom_BezierSurface
Geom_RectangularTrimmedSurface
Geom_SweptSurface
:Geom_SurfaceOfLinearExtrusion
Geom_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_Vertex
TopoDS_Edge
TopoDS_Wire
TopoDS_Face
TopoDS_Shell
TopoDS_Solid
TopoDS_Compsolid
TopoDS_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
根据拓扑实体的不同, 几何信息以不用的方式存储, 存储几何信息的实体可以描述:
- 边: 由顶点限定的曲线
- 面: 由边限定的表面
- 实体: 由面限定的空间