OpenCASCADE 基础总结

准备工作

Preliminaries.pdf

概述

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

HandleOCCT的智能指针, Handlestd::shared_ptr相同.

Collections

由于历史原因, OCCT包含了TCollectionNCollection两种集合.

TCollection是 1998 年标准化之前使用的集合, 从OCCT 7.0之后被NCollection代替.

除了NCollection_Vector, OCCT 的索引从1开始, NCollection_Vector0开始.

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.

几何

Geometry.pdf

MVC

OCCT提供了一系列类让用户可以直接使用或者增加自定义类进行扩展.

实现某些概念(比如几何实体)的类通常按照实现分组成: Model, ViewController

2D圆为例:

  • Model:
    • 一个包含圆心半径的数据对象.
    • 标准的构造函数: 默认构造, 使用半径等.
  • Controller:
    • 通过 3 个构造一个圆.
    • 使用圆心和一条切线构造一个圆

      每个controller都包含一个方法返回抽象数据对象.

  • View:
    • viewer中显示的对象

OCCT中实现的用于几何拓扑对象的controller类包括:

  • 直接构造(gce_MakeCircle, gce_MakeLin2d)
  • 2 维约束构造(GccAna_Circ2d2TanRad)
  • 复杂的构造算法: 插值近似, 投影(GeomAPI 包)

概述

非参和参数几何

非参几何:

  • 类型使用进行操作
  • 没有继承

参数几何:

  • Geom的实体使用Handle操作, controller类使用
  • 类的继承遵循STEP(ISO 10303)
  • 提供方法进行Geomgp互转

非参几何

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

拓扑

Topology.pdf

概述

拓扑通常用来描述:

  • 对象的边界
  • 对象的连接性

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包: 描述对象的拓扑结构
  • GeomGeom2d包: 描述对象的几何形状

B-Rep 实体

BRep_TVertex, BRep_TEdgeBRep_TFace被定义用于向拓扑模型添加几何信息, 这三个类都继承自TopoDS_Tshape

根据拓扑实体的不同, 几何信息以不用的方式存储, 存储几何信息的实体可以描述:

  • 边: 由顶点限定的曲线
  • 面: 由边限定的表面
  • 实体: 由面限定的空间