2、Opencascade基础类分析(含代码示例)【基础篇】

Opencascade基础类分析(含代码示例)

一 基础类概述

1.1 根类组件

根类是基本的数据类型和类,其他所有类都根据此建立的.
根类在Standard和MMgt两个包中实现。
  1. 基本类型(C++中的基本类型)
  2. 动态对象的安全处理(自动析构不再使用的对象)
  3. 可设置的内存优化管理器(改善常用动态对象的程序性能)
  4. run-time类型信息扩展机制
  5. 异常管理
  6. 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包,提供了几何实体的集合。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值