Opencascade基础类分析(含代码示例)
一 基础类概述
1.1 根类组件
根类是基本的数据类型和类,其他所有类都根据此建立的.
根类在Standard和MMgt两个包中实现。
- 基本类型(C++中的基本类型)
- 动态对象的安全处理(自动析构不再使用的对象)
- 可设置的内存优化管理器(改善常用动态对象的程序性能)
- run-time类型信息扩展机制
- 异常管理
- C++中流的封装
1.2 串类组件
用于处理动态大小的字符序列,可以通过句柄处理
1.3 集合容器组件
处理动态大小的数据集合的类,类似于C++的集合类模版
- 集合容器包含了许多通用类,如数组、列表、栈、队列、散列表等等
- 主要在TCollection和NCollection包中实现
1.4 标准对象的集合容器组件
TColStd包为TCollection包中通用类的一些经常使用实例化提供对象
1.5 基本几何类型组件
- 提供了基本几何形状的描述(点、向量、直线、平面等)
- 提供了几何变化的工具(平移、旋转、对称、缩放等)
1.6 向量和矩阵组件
类似Eigen库
1.7 常用数学算法组件
类似Eigen库,其中包含对方程组的求解算法
1.8 异常类组件
- OCC的异常类都基于Failure类
1.9 数量类组件
- 为日期和时间信息提供支持,同时可以表示一些常用的物理量
1.10 应用服务组件
ps:我也不理解 先跳过吧,基础用不到
二 数据类型、句柄、内存管理
2.1 数据类型
2.1.1 值处理类型
值处理类型比句柄处理类型表现的更直接,操作也会更快
- 基本类型:
Standard_Integer 对应 int
Standard_Real 对应 double
Standard_ShortReal 对应 float
Standard_Boolean 对应 unsigned int
Standard_False 对应 0
Standard_True 对应 1
Standard_Character 对应 char
Standard_ExtCharacter 对应 short
Standard_Cstring 对应 char*
Standard_Address 对应 void*
Standard_Extstring 对应 short*
- 枚举类型
- 一些类定义的类型(非Standard_Persistent持久化类派生的)
2.2 句柄
这里可以直接将句柄当作C++的指针就可以理解句柄的含义了
几个句柄可以同时指向同一个对象
- 句柄分为持久和短暂两种,如果由Standard_Transient类派生则是短暂的,而由Persistent派生则是持久的
- Standard_Transient提供了一个引用计数器,计数器被Handle()类使用,用于计算指向对象实例的句柄数。
2.2.1 句柄的使用:
Point和Line是Geom包的两个短暂类
Handle(Geom_Point)p1,p2;
Handle(Geom_Line)aLine;
//只是创建了空句柄,当前不指向任何对象
//如果要初始化句柄则需要new一个对象
对于持久类CartesianPoint是短暂类Point类的子类,具有句柄类型一致原则,比如
Handle(Geom_Point)p1;
Handle(Geom_CartesianPoint)p2,p3;
p2 = new Geom_CartesianPoint;
p1 = p2;//可以 , 类型是兼容的
//编译器将p1看作指向Point类的句柄,尽管p1实际不指向point
//低层句柄可以向上赋值给高层句柄 反过来则不可以
//p2 = p1不被允许
//如果一个句柄实际指向是其类的子类,则可以进行转换
p3 = Handle(Geom_CartesianPoint)::DownCast(p1);
//如果直接转换和句柄所指的对象类型不符 则句柄会被清空且指向NULL但不会产生异常
//可以用IsNUll来判断
if(p3.IsNull()) printf("类型不兼容");
- 注意:句柄和C++指针不同的是句柄不支持delete函数,当句柄不再被使用的时候,会自动释放。
- 句柄调用对象方法(和C++指针相同 使用->)下面的例子中创建了点并且用句柄调用了SetX()改变点的坐标
//调用例子
Handle(Geom_Point)p1;
Handle(Geom_CartesianPoint)p2;
p2 = new Geom_CartesianPoint(1.0,2.0,3.0);
p1 = p2;
std::cout << "(" << p1->X() << "," << p1->Y() << "," << p1->Z() << ")" << std::endl;
//通过p2调用CartesianPoint中的SetX方法设置X
p2->SetX(20);
std::cout << "(" << p1->X() << "," << p1->Y() << "," << p1->Z() << ")" << std::endl;
运行结果
(1,2,3)
(20,2,3)
2.2.2 句柄的存储分配
- 每次对同一个对象创建一个句柄时,该对象的计数器会自动+1,当退出了这个局部作用域时(可以理解为{xxxx}当代码运行出了括号时,计数器-1)计数器会-1,当计数器==0时,会自动将对象析构。
- 如果两个对象通过句柄相互引用,会出现循环,则对象不会被析构
2.3 内存管理器
2.3.1 为什么使用内存管理器
- 对比C++中的静态分配、栈分配和堆分配即可
2.3.2 内存管理器的用法
- Standard::Allocate() 替换 malloc()
- Standard::Free() 替换 free()
- Standard::Reallocate() 替换 realloc()
(是不是很简单) - 对于内存管理器还有很多内置设置以后再填坑吧
2.4 异常类
OCC异常类的使用和C++的非常相似
产生一个确定的异常则要使用Raise()
DomainError::Raise("message")
- 这样就可以抛出一个DomainError类型的异常,而该异常是可以被捕获的 如下代码
try:
{
do things;
}
catch(DomainError)
{
//处理异常
}
- 当然如果在编程中判断是否该抛出异常会变得非常的繁琐,因此OCC提供了宏定义,使得语句变得简单。
#include <Standard_OutOfRange.hxx>
#include <Standard_Failure.hxx>
#include <Standard_ErrorHandler.hxx>
void errorDemo(){
int a = -1;
Standard_OutOfRange_Raise_if(a < 0,"越界了");
}
int main() {
try{
//OCC_CATCH_SIGNALS可以允许把信号当作异常处理,用于捕获信号
OCC_CATCH_SIGNALS
errorDemo();
return 0;
}
catch(Standard_Failure){
std::cout << "异常" << std::endl;
return 1;
}
}
2.3 集合容器
2.3.1通用集合
- 通用集合有TCollection_xxx,其中xxx有Array1(一维数组)、Array2(二维数组)、HArray1(指向一维数组的Handle的数组)、HArray2(指向二维数组的Handle的数组)、Sequnence(大小可变的数组)、HSequnence、List、Queue、Stack、Set和HSet
- 这块定义较为繁琐,可以直接去官方文档搜索
- TColStd库中封装了对各种集合的使用,其中一维数组的例子如下
#include <TColStd_Array1OfInteger.hxx>
int main()
{
TColStd_Array1OfInteger a(0,4);
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;
//Lower获取起始下标 Upper获取最后一个元素下标
for(int i = a.Lower();i<=a.Upper();i++)
{
std::cout << a[i] << std::endl;
}
return 0;
}
- 用户自定义起始下标和终止下标
如果对0-4以外的下标进行操作 会报错越界
2.4 数学基本类型
2.4.1 向量和矩阵类
#include <math_Vector.hxx>
#include <math_Matrix.hxx>
//三维向量 索引区间为[1,3]
math_Vector v(1,3);
v(1) = 1.0; v(2) = 2.0; v(3) = 3.0;
//3x3的矩阵 行区间[0,2]列区间[0,2]
math_Matrix m(0,2,0,2);
//向量之间的=为值拷贝 对v2的改变不影响v1
v1 = v2;
2.4.2 几何类型
gp包提供了一些几何实体
- 包括二维、三维坐标,矩阵,笛卡尔点,向量,方向,轴,直线,圆,椭圆,双曲线等等
- 如果创建的是几何实体的集合,则可以用TColgp包,提供了几何实体的集合。