OCC开源框架学习分享资料
Open_CASCADE学习笔记-句柄

OPEN CASCADE学习笔记——句柄著: Roman Lygin译:George Feng这是一篇关于开源三维建模软件O P E N C A S C A D E内核的博文:R O M A N L Y G I N是O P E N C A S C A D E的前程序开发员和项目经理,曾经写过许多关于该开源软件开发包的深入文章,可以在他的博客(H T T P://O P E N C A S C A D E.B L O G S P O T.C O M)上面找到这些文章。
序在OpenCascade的论坛上知道了Roman Lygin在他的博客上写了Open CASCADE notes系列文章,但是却无法访问他的博客,幸而百度文库已经收录了Topology and Geometry和Surface Modeling两篇文章,拜读之后获益良多。
如果大家发现文中翻译有错误或不足之处,望不吝赐教,可以发到我的邮箱fenghongkui@,十分感谢。
2012年6月28日星期四译者案:句柄是某个对象的一种标号,它是一个数值,它不是指针,根据指针可以知道对象在内存中的位置,但是通过句柄却不能直接更改内存中的对象,这事实上对于内存中的对象形成了一种保护。
中文中句柄这个词应该是来源于手柄的演化,利用手柄可以拎起来皮箱、包裹、茶壶等,就是说通过手柄可以控制一个对象,而计算机语言中的句柄却是用来“拎”(间接访问)内存中或者其他设备对象的。
我的第一篇文章,引言我也成为一个博友了,这是我第一次发博文,所以我对这种发文方式没有概念,也不知道是否有效。
让我们走着瞧吧。
我曾经在Open CASCADE(OCC)工作了7年时间,2004年离开,然后去了Intel,在那一直工作到现在。
在OCC的那些年的经历是非常珍贵的,我做过软件开发和项目管理,客户关系维护,与来自于各地和具有各种文化背景的人一起工作。
从1997年开始,我就在CAD数据交换小组作为软件开发工程师工作,我觉得这非常幸运,因为这使我可以学习到很多OCC代码,因为数据交换使用了大量的OCC算法。
opencascade源码架构

Opencascade源码架构解析一、概述Opencascade是一个开源的CAD/CAM/CAE建模内核,它提供了一整套用于3D模型创建和处理的工具。
其源码架构设计精良,涵盖了多个关键模块,包括几何构建、模型修剪、模型显示、数据交换等,为用户提供了丰富的功能和灵活的扩展性。
在本文中,我们将深入分析Opencascade的源码架构,以帮助读者更好地理解其内部机制和设计理念。
二、核心模块1. 几何构建模块Opencascade的几何构建模块是其核心部分,负责处理3D模型的构建和基本几何运算。
该模块包括了诸多子模块,如曲面建模、实体建模、几何算法等,各子模块之间通过良好定义的接口进行耦合,使得模块之间的协作更加灵活。
2. 模型修剪模块模型修剪模块主要用于处理几何模型之间的相交、相切、相离等关系,通过实现布尔运算、平移旋转等操作,为模型的进一步处理和展示提供了基础支撑。
3. 模型显示模块模型显示模块负责将构建好的3D模型呈现在用户面前。
它包括了模型渲染、光照效果、阴影效果等多项功能,以提供精美的图形展示效果。
4. 数据交换模块Opencascade的数据交换模块具有强大的能力,可以与多种格式的文件进行交互,包括STEP、IGES、STL等。
这使得Opencascade成为一个理想的CAD/CAM/CAE建模内核,在工程设计过程中起到了重要的作用。
三、源码实现细节1. 设计模式Opencascade的源码架构采用了多种设计模式,如工厂模式、观察者模式、策略模式等,以实现关注点分离、复用性和扩展性。
这些设计模式的运用使得Opencascade的源码更具健壮性和灵活性。
2. 抽象数据结构Opencascade中采用了丰富的抽象数据结构,用于描述几何实体、曲面、多边形等。
这些数据结构的设计具有良好的通用性和扩展性,使得Opencascade能够应对不同的建模需求。
3. 精巧的算法源码中涵盖了多种精巧的几何算法,用于处理曲面的构建、实体的操作等。
OCC类基础

一直在用OCC作项目,但这方面的中文资料很少,瞧来OCC在中国还不就是十分普及;后来,项目中使用OCC与DirectX结合使用,取得了很好的效果;随着OCC6、3版本的推出,Open CASCADE在速度方面已有了很大的改变。
以下为一些OCC 的基础知识,愿与各位OCC爱好者共同学习;一:OCC中的基础类:gp_Pnt在OCC中,gp_Pnt表示一个顶点,gp_Vec表示一个向量,可以用两个顶点来生成一个向量。
比如:gp_Pnt P1(0,0,0);gp_Pnt P2(5,0,0);gp_Vec V1 (P1,P2);向量有一个方法、IsOpposite(),可以用来测试两个向量的方向就是相对还就是平行;比如:gp_Pnt P3(-5,0,2);gp_Vec V2(P1,P3);Standard_Boolean result =V1、IsOpposite(V2,Precision::Angular());另外向量还有一些重要方法:--Standard_Real Magnitude() const;计算向量的大小;--Standard_Real SquareMagnitude() const;计算向量的平方;--向量的加减乘除操作;--向量的单位化;--通过一个点,线,面得出其镜像的向量;--向量的旋转,平移,缩放;具体的函数名称可以瞧OCC的头文件说明;有时需要决定一组空间点就是位于一个点;一条直线,或一个平面,或一个空间:OCC中提供了相应的算法;比如:TColgp_Array1OfPnt array (1,5); // sizing arrayarray、SetValue(1,gp_Pnt(0,0,1));array、SetValue(2,gp_Pnt(1,2,2));array、SetValue(3,gp_Pnt(2,3,3));array、SetValue(4,gp_Pnt(4,4,4));array、SetValue(5,gp_Pnt(5,5,5));GProp_PEquation PE (array,1、5 );if (PE、IsPoint()){ } //就是否就是同一个点gp_LinL;if (PE、IsLinear()) { L = PE、Line(); } //就是否位于一条直线上;if (PE、IsPlanar()){ } //就是否在一个平面内;if (PE、IsSpace()) { }gp_Dir类:此类用来描述3D空间中的一个单位向量;常用方法:(1):IsEqual(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量就是否相等;(2):IsNormal(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量的夹角就是否就是PI/2;(3):IsOpposite(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量就是否方向相反;(4):IsParallel(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量夹角O或PI;(5):Angle(const gp_Dir& Other) const;求两个向量之间的夹角;(6):void CrossCross(const gp_Dir& V1,const gp_Dir& V2) ;计算三个向量之间的叉积;(7):Standard_Real Dot(const gp_Dir& Other) const;计算点积;(8):Standard_Real DotCross(const gp_Dir& V1,const gp_Dir& V2) const;计算叉积再点积;(9):gp_Dir Reversed() const;得到反方向,在OCC中用gp_Lin2d 类,来生成一个二维空间的直线,有它的原点与单位向量;gp_Ax2d 类:通过原点与X方向单位与Y方向单位建立一个二维坐标系;利用sense参数可以决定就是右手系还就是左手系;可以利用平移、旋转、缩放、镜像来更改坐标系;类似地,gp_Ax3类:用来描述一个3D空间的坐标系。
基本体理论之OCC体系结构

产品信息建模原理与方法课程讲义之Open CASCADE 的体系结构刘子建 2012-3-6第一部分:基本结构描述在Open CASCADE (以下简称OCC )中,三维形体采用了基于B-Rep (边界表示,Boundary Representation ,B-Rep )的模型,系统包括拓扑(Topologic )和几何(Geometric )两种主要结构,如图1所示。
的sub_Shape 索引链表的sub_Shape 索引链表的sub_Shape 索引链表的Shape 索引链表的sub_Shape 索引链表的sub_Shape 索引链表的sub_Shape 链表图1. OCC 模型的几何拓扑结构OCC定义了9种基本拓扑结构,由该9种基本拓扑结构可以表示一个任意复杂模型的拓扑结构。
它们的定义如下:COMPOUNDA group of any type of topological object.COMPSOLIDA composite solid is a set of solids connected by their faces. It expands the notions of WIRE and SHELL to solids.SOLIDA part of space limited by shells. It is three dimensional.SHELLA set of faces connected by their edges. A shell can be open or closed.FaceIn 2D it is part of a plane; in 3D it is part of a surface. Its geometry is constrained (trimmed) by contours. It is two dimensional.WireA set of edges connected by their vertices. It can be an open or closed contour depending on whether the edges are linked or not.EdgeA topological element corresponding to a restrained curve. An edge is generally limited by vertices. It has one dimension.VERTEXA topological element corresponding to a point. It has zero dimension.SHAPEA generic term covering all of the above.第二部分:数据结构基础OCC定义了拓扑元素的两个基类TopoDS_Shape和TopoDS_TShape,统一处理有关拓扑的共有事物,再由这两个类派生出具体的拓扑元素类。
open cascade occ 几何模型创建与删除操作 -回复

open cascade occ 几何模型创建与删除操作-回复Open Cascade OCC (Open Cascade Technology) 是一个开源的CAD/CAE/PLM 开发框架,它提供了一套丰富的工具和算法,用于处理和操作几何模型。
本文将逐步回答如何使用Open Cascade OCC 进行几何模型的创建与删除操作。
第一步: 安装Open Cascade OCC要使用Open Cascade OCC,首先需要将它安装在计算机上。
可以从官方网站下载最新版本的Open Cascade Technology。
第二步: 引入OCC 头文件和命名空间在代码中引入OCC 头文件,并使用OCC 的命名空间。
例如,在C++ 中,可以使用以下语句引入OCC 头文件和命名空间:cpp#include <TopoDS_Shape.hxx>#include <BRepBuilderAPI_MakeBox.hxx>#include <BRepAlgoAPI_Common.hxx>#include <BRepTools.hxx>#include <Standard_Failure.hxx>#include <Standard_ErrorHandler.hxx>#include <iostream>using namespace std;第三步: 创建几何模型使用OCC 的几何建模算法,可以创建各种类型的几何模型。
例如,下面的代码片段演示了如何创建一个简单的立方体模型:cppTopoDS_Shape box = BRepBuilderAPI_MakeBox(10.0, 20.0,30.0).Shape();这里使用BRepBuilderAPI_MakeBox 函数来创建一个立方体,参数分别是立方体的宽度、高度和深度。
通过 .Shape() 函数可以获取到创建好的几何模型。
OpenCascade入门教程

TutorialMy First ApplicationVersion 6.3 / September 2008Table of Contents1.PROJECT OVERVIEW (4)1.1.P REREQUISITES (4)1.2.T HE PROJECT (4)1.3.P ROJECT S PECIFICATIONS (4)2.BUILDING THE PROFILE (6)2.1.D EFINING S UPPORT P OINTS (6)2.2.P ROFILE:D EFINING THE G EOMETRY (7)2.3.P ROFILE:D EFINING THE T OPOLOGY (8)2.4.P ROFILE:C OMPLETING THE P ROFILE (10)3.BUILDING THE BODY (12)3.1.P RISM THE P ROFILE (12)3.2.A PPLYING F ILLETS (13)3.3.A DDING THE N ECK (15)3.4.C REATING A H OLLOWED S OLID (16)4.BUILDING THE THREADING (19)4.1.C REATING S URFACES (19)4.2.D EFINING 2D C URVES (19)4.3.B UILDING E DGES AND W IRES (23)4.4.C REATING T HREADING (24)5.BUILDING THE RESULTING COMPOUND (26)6.APPENDIX (27)4 Project Overview1. Project OverviewThis tutorial will teach you how to use Open CASCADE services to model a 3D object. The purpose ofthis tutorial is not to describe all Open CASCADE classes but to help you to start thinking in terms of the Open CASCADE tool.1.1. PrerequisitesThis tutorial assumes that you have experience in using and setting up C++.From a programming standpoint, Open CASCADE is designed to enhance your C++ tools with high performance modeling classes, methods and functions. The combination of all these resources will allow you to create substantial applications.1.2. The projectTo illustrate the use of classes provided in the 3D geometric modeling toolkits, you will create a bottle as shown:In the tutorial we will create, step-by-step, a function that will model a bottle as shown above. You will find the complete source code of this tutorial, including the very function MakeBottle in the distribution of Open CASCADE. The function body is provided in the file Tutorial/src/MakeBottle.cxx.1.3. Project SpecificationsWe first define the bottle specifications as follows:Object Parameter ParameterName Parameter Value Bottle height MyHeight 70mmBottle width MyWidth 50mm Bottle thickness MyThickness30mm为了演示3D 几何模型工具箱中类的使用丆你可以创建一个如下的瓶子。
OCC类基础资料

一直在用OCC作项目,但这方面的中文资料很少,看来OCC在中国还不是十分普及;后来,项目中使用OCC和DirectX结合使用,取得了很好的效果;随着OCC6.3版本的推出,Open CASCADE在速度方面已有了很大的改变。
以下为一些OCC 的基础知识,愿与各位OCC爱好者共同学习;一:OCC中的基础类:gp_Pnt在OCC中,gp_Pnt表示一个顶点,gp_Vec表示一个向量,可以用两个顶点来生成一个向量。
比如:gp_Pnt P1(0,0,0);gp_Pnt P2(5,0,0);gp_Vec V1 (P1,P2);向量有一个方法.IsOpposite(),可以用来测试两个向量的方向是相对还是平行;比如:gp_Pnt P3(-5,0,2);gp_Vec V2(P1,P3);Standard_Boolean result =V1.IsOpposite(V2,Precision::Angular());另外向量还有一些重要方法:--Standard_Real Magnitude() const;计算向量的大小;--Standard_Real SquareMagnitude() const;计算向量的平方;--向量的加减乘除操作;--向量的单位化;--通过一个点,线,面得出其镜像的向量;--向量的旋转,平移,缩放;具体的函数名称可以看OCC的头文件说明;有时需要决定一组空间点是位于一个点;一条直线,或一个平面,或一个空间:OCC中提供了相应的算法;比如:TColgp_Array1OfPnt array (1,5); // sizing arrayarray.SetValue(1,gp_Pnt(0,0,1));array.SetValue(2,gp_Pnt(1,2,2));array.SetValue(3,gp_Pnt(2,3,3));array.SetValue(4,gp_Pnt(4,4,4));array.SetValue(5,gp_Pnt(5,5,5));GProp_PEquation PE(array,1.5 );if (PE.IsPoint()){ } //是否是同一个点gp_LinL;if (PE.IsLinear()) { L = PE.Line(); } //是否位于一条直线上;if (PE.IsPlanar()){ } //是否在一个平面内;if (PE.IsSpace()) { }gp_Dir类:此类用来描述3D空间中的一个单位向量;常用方法:(1):IsEqual(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量是否相等;(2):IsNormal(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量的夹角是否是PI/2;(3):IsOpposite(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量是否方向相反;(4):IsParallel(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量夹角O或PI;(5):Angle(const gp_Dir& Other) const;求两个向量之间的夹角;(6):void CrossCross(const gp_Dir& V1,const gp_Dir& V2) ;计算三个向量之间的叉积;(7):Standard_Real Dot(const gp_Dir& Other) const;计算点积;(8):Standard_Real DotCross(const gp_Dir& V1,const gp_Dir& V2) const;计算叉积再点积;(9):gp_Dir Reversed() const;得到反方向,在OCC中用gp_Lin2d 类,来生成一个二维空间的直线,有它的原点和单位向量;gp_Ax2d 类:通过原点和X方向单位和Y方向单位建立一个二维坐标系;利用sense参数可以决定是右手系还是左手系;可以利用平移、旋转、缩放、镜像来更改坐标系;类似地,gp_Ax3类:用来描述一个3D空间的坐标系。
OpenCascade中文帮助文档

1.2.3 持久化和数据模式 数据模式是应用程序用来存储数据的一种结构,由一些持久类构成。 一个对象若可以被永久存储,则是持久的。持久对象可以被它的创建程序或
其它程序在以后的时间里再次使用。 要 想 使 一 个 对 象 在 CDL 中 是 持 久 的 , 必 须 声 明 它 的 类 型 继 承 自
例 2.1:
class Array1OfReal instantiates Array1 from TCollection (Real);
这 个 声 明 位 于 TColStd 包 的 一 个 CDL 文 件 中 。 它 定 义 了 一 个 新 的 类 TColStd_Array1OfReal。该类是通用类 TCollection_Array1 的一个实例,并且参 数类型指定为实型。
通过值处理的类型首先有基本类型,如布尔类型、字符型、整型、实型等。 通过句柄处理的类型变量,如果它不指向任何对象,那我们就说它是空的。要引 用一个对象,我们就得用它的一个构造函数实例化该对象,如例 2.3。
例 2.3:
Handle(myClass) m = new myClass;
在 OCC 中,句柄是一些特殊类,它们以引用的方式对动态存储对象进行安 全处理。句柄提供了一种引用计算机制,通过这种机制,当对象不被引用时,可 以自动析构对象。
1.3 本章小结
本章用面向对象方法和软件工程思想从整体上分析了 OCC 的体系结构。整 个 OCC 包含五个模块;模块中包含工具箱;工具箱中包含包;包中包含类;类 是 OCC 软件的最基本要素。
本章还介绍了 OCC 的几个基本概念:类、泛化、数据类型的分类、持久化 和数据模式。与 C++类的命名不同,OCC 有自己的命名方法。OCC 中类分为普 通类、推迟类和通用类三种,分别对应 C++中的具体类、抽象类和模板类。OCC 的数据可以分为句柄处理类型和值处理类型两种。OCC 的持久化和数据模式与 一般软件的原理相同,不同的是:为了使对象持久化,需要声明该对象是由 Standard_Persistent 类或其派生类派生的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.OCC基础数据
1.Abstraction 主要分两类
Basic:gp,例如gp_Pnt,gp_Circle…… Advance(句柄操作):Geom,Geom2d,例如 Geom_Pnt,Geom2d_Pnt ……
4.OCC基础数据
2.Control
4.OCC基础数据
3.Presentation
Presentation Packages Selection packages
Basic Management
PrsMgr
SelectMgr
2D objects 3D objects
V2d and Graphic2d
SelectBasics, Select2d, Select3d and StdSelect
OCC开源框架学习分享
目录
1.研究方法 2.总体描述 3.OCC与MFC框架 4.OCC的基础数据 5.OCC的显示 6.OCC与Smart Electrical数据的设计
1.研究方法(重点研究2D)
1.阅读ppt英文文档,不清楚的地方再参考OCCT帮助文 档。(达到对occ有个大致了解的目的)
3. Graphic Attributes Manager,用来设置交互实体的图形属性。置。
重点:熟练掌握
2.总体描述
Data Exchange(数据交互) 1. STEP等标准的数据结构。(免费) 2. DXF等标准的数据结构。(扩展,收费) 稍后研究
3.OCC与MFC框架
它是OCAF在MFC上的实现
CWinApp->OCC_App->MyApp
CDocument->OCC_BaseDoc->OCC_2dDoc->My2dDoc
Cview->OCC_BaseView->OCC_2dView->My2dView
pDocTemplateForView2d = new CMultiDocTemplate( IDR_2DTYPE, RUNTIME_CLASS(My2dDoc), RUNTIME_CLASS(MyFrame2D), // custom MDI child frame RUNTIME_CLASS(MyView2D));
3.OCC与MFC框架
主要功能
1.Doc完成图形数据的构建,图形数据的处理(移动,拷贝 等)。视图自动更新。 2.View接收事件的消息,并调用doc中的方法来完成响应。
3.OCC与MFC框架
学习方法 仔细读例子代码,理清逻辑关系。
4.OCC基础数据
一个图形数据(component)分为以下三部分,并分在不 同的package和class下面: Abstaction:图形的数据抽象(极简) Control:图形的各种创建方法 Presetation:图形的显示
2.总体描述
OCAF(应用程序框架)
1. 结合mfc,App,doc,view的建立。 2. 主要工作在doc和view上,doc建立数据,view完成交互。 3. 其他一些功能,拷贝,黏贴,回退,前进,外部数据交换,
文档保存等。
逐步仔细研究
3.OCC与MFC框架
它是OCAF在MFC上的实现
CDocument->OCC_BaseDoc->OCC_2dDoc
2.总体描述
MESS(3D网格呈现) 主要用于3D实体网格化显示,包括各种工具和方法 暂时可不研究
2.总体描述
Visualization(图形显示和交互)
1. Interactive Context 及AIS对象,最重要的显示及交互的环境, 所有的显示和交互由它来完成。
2. Interactive Objects,即交互实体,只有交互实体才能在交互环 境中显示。
2.重新建立一个OCC工程,在视图窗口中画一个死的基 本元素。 (能处理各种编译问题,了解occ架构和基本 运行原理)
3.在此基础上,参考occtry,OCAF的例子,完成对视图 中对象的动态绘制及交互处理。 (对occ的整个操作模 式有个基本的感受,基本入门)
4.仔细研究OCAF,在OCAF上实现cad的一些基础功能, 包括绘图,插入,移动,拷贝,回退,前进等操作。 (达到可以进行Smart Electrical开发的要求)
Cview->OCC_BaseView->OCC_2dView
pDocTemplateForView2d = new CMultiDocTemplate( IDR_2DTYPE, RUNTIME_CLASS(CMy2dDoc), RUNTIME_CLASS(CMyFrame2D), // custom MDI child frame RUNTIME_CLASS(CMyView2D));
2.总体描述
选取occ作为底层框架的原因:
1.基于C++ 2.易于实现CAD技术框架,2D,3D扩展性 3.支持windows,android,mac 4.发展多年,较为成熟,功能完善 5.EPLAN等商业软件也采用OCC
2.总体描述
2.总体描述
Foundation Classes(基本类)
1.基本的类型,变量,特殊字符串等定义,比如Standard_Integer 2.自动内存管理(handle管理机制) 3.对象集合的管理 4.基本的数学对象和运算定义,包括矢量,矩阵运算 5.内存对象的ACSII码存储?????
3.OCC与MFC框架
视图初始化过程
1.在app构造函数中得到opengl连接句柄。
2.在doc的构造函数中,用opengl连接创建viewer(仅创建 视图指针,而非视图窗口),并作初始化设置。同时通过 viewer再得到AISContext交互环境句柄。
3.在view的OnInitialUpdate()中,创建窗口(window),完 成显示设置。
知识零散,前3条必须掌握
2.总体描述
Modeling Data(数据类) 1.建立2D,3D几何对象 2.各种几何对象建立工具 3.建立3D(2D)的TOPO对象
重点:必须熟练运用
2.总体描述
Modeling Algorithms(几何计算类) 各种几何计算工具,包括插值,曲面计算等等,,,, 暂时可不研究