eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

Qt with OpenCascade

Posted on 2013-08-18 17:46 eryar 阅读(19412) 评论(25)  编辑 收藏 引用 所属分类: 2.OpenCASCADE

Qt with OpenCascade

eryar@163.com

摘要Abstract:详细介绍了如何在Qt中使用OpenCascade。

关键字Key Words:Qt、OpenCascade

一、引言 Introduction

1.1 Overview of Qt

Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。Qt很容易扩展,并且允许真正地组件编程。基本上,Qt同X Window上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西。

Qt具有如下优点:

l 优良的跨平台特性:Qt支持下列操作系统:Microsoft Windows 95/98, NT, Linux, Solaris, SunOS, HP-UX, FreeBSD, SCO等;

l 面向对象:Qt良好的封装机制使得Qt的模块化程序非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得非常简单;

l 丰富的API:Qt包含多达250个以上的C++类,还提供基于模板的collections, serialization, file, I/O device, directory management, data/time类。甚至还包括正则表达式的处理功能;

l 支持2D、3D图形渲染,支持OpenGL;

l 大量的开发文档;

l XML支持;

Qt按不同的版本进行发布:

n Qt商业版:提供给商业软件开发。它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务。

n Qt开源版:仅为了开发自由和开放源码软件,提供了和商业版同样的功能。GNU通用公共许可证下,它是免费的。

2009年3月发布的Qt4.5起,NOKIA为Qt增添了开源LGPL授权选择。

1.2 Overview of OpenCascacde

OpenCascade(简称OCC)平台是由法国Matra Datavision公司开发的CAD/CAE/CAM软件平台,可以说是世界上最重要的几何造型平台之一。开源OCC对象库是一个面向对象的C++类库,用于快速设计领域的专业应用程序。OCC主要用于开发二维和三维几何建模应用程序,包括通用的或专业的计算机辅助设计(CAD)系统、计算机辅助制造(CAM)系统或分析领域的应用程序、仿真应用程序或图形演示工具。OCC通过有机组织的C++库文件提供了六个模块:

l FoundationClasses

l ModelingData

l ModelingAlgorithms

l Visualization

l ApplicationFramework

l DataExchange

OCCT库提供如下功能:

l 2D和3D几何造型工具箱,可对任何物体造型;

n 创建基本图元,如prism,cylinder, cone, torus;

n 对实体进行布尔操作,addition, subtraction and intersection;

n 根据倒圆、倒角、草图拉伸出几何实体;

n 使用偏移offsets、成壳shelling、挖空hollowing和挤压sweeps构造几何实体;

n 计算几何实体属性,如表面积、体积、重心、曲率半径;

n 使用插值interpolation、逼近approximation、投影projection计算出几何体;

l 可视化功能提供对几何实体的显示、控制功能,例如:

n 三维旋转3D rotation;

n 缩放Zoom;

n 着色Shading;

l 程序框架提供如下功能:

n 将非几何数据与几何实体关联;

n 参数化模型;

n Java Application Desktop(JAD);

OCCT库是由Open CASCADE公司开发和市场运作的。库被设计成模块化和易扩展。

wps_clip_image-13969

Figure 1.1 OpenCascade架构图

二、Qt + OpenCascade

使用的开发工具为Qt Creator 2.7.0,Qt的版本为Qt 5.0.2。如下图所示:

wps_clip_image-31905

Figure 3.1 Qt and Qt Creator version Info

OpenCascade的版本为OpenCASCADE6.5.5,如下图所示:

wps_clip_image-23467

 

image

Figure 3.2 OpenCascade Version Info

在OpenCascade中创建三维场景的步骤分为:

1.Create attributes.

2.Create a 3D viewer.

3.Create a view.

4.Create an interactive context.

5.Create interactive objects.

6.Create primitives in the interactive object.

7.Display the interactive object.

详细说明请参考《Visualization User’s Guide》。下面结合程序代码进行说明。

1. Create attributes. 

略;

2. Create a 3D viewer. 

 

1 // Create a 3D viewer.
2    try
3    {
4        myGraphicDevice = new Graphic3d_WNTGraphicDevice;
5    }
6    catch (Standard_Failure)
7    {
8        QMessageBox::critical(this, tr("About occQt"),
9            tr("<h2>Fatal error in graphic initialisation!</h2>"),
10            QMessageBox::Apply);
11    }
12 
13    myViewer = new V3d_Viewer(myGraphicDevice, Standard_ExtString("Visu3D"));
14    myViewer->Init();
15    myViewer->SetDefaultLights();
16    myViewer->SetLightOn();


3. Create a view.

1 // Create the view.
2 myView = theContext->CurrentViewer()->CreateView();

4. Create an interactive context.

1 // Create an interactive context.
2 myContext = new AIS_InteractiveContext(myViewer);
3 myContext->SetDisplayMode(AIS_Shaded);

5. Create interactive objects.

略;

6. Create primitives in the interactive object.

1 Handle_AIS_Shape aBox = new AIS_Shape(MF.Shape());
2 Handle_AIS_Shape aCone = new AIS_Shape(BRepPrimAPI_MakeCone(50, 30, 80));
3 Handle_AIS_Shape aSphere = new AIS_Shape(BRepPrimAPI_MakeSphere(60));

7. Display the interactive object.

1 myContext->Display(aBox);
2 myContext->Display(aCone);
3 myContext->Display(aSphere);

 

三、结论 Conclusion

编译过程中遇到一些问题,主要是头文件包含及库引用问题。需要对Qt工程文件做如下设置:

l 因为程序使用了QGLWidget,所以在其工程中要引用OpenGL的库。设置方法如下:QT += core gui opengl;

l 头文件目录的设置:INCLUDEPATH += D:\OpenCASCADE6.5.5\ros\inc;

l 引用库的设置:

1   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKernel.lib
2   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKMath.lib
3   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKBRep.lib
4   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKTopAlgo.lib
5   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKPrim.lib
6   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKService.lib
7   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKV3d.lib
8   LIBS += D:\OpenCASCADE6.5.5\ros\win64\vc11\libd\TKFillet.lib

 

上述目录根据不同的计算机需要做相应修改。程序运行结果如下图所示:

wps_clip_image-18191

Figure 3.1 Sphere in occQt

image

Figure 3.2 Transformation in occQt

 

PDF Version and Sample Code: Qt with OpenCascade

Feedback

# re: Qt with OpenCascade  回复  更多评论   

2013-08-19 11:41 by tb
QT 还是比较简单的

# re: Qt with OpenCascade  回复  更多评论   

2013-08-19 18:33 by eryar
Qt面向对象做得不错。。。@tb

# re: Qt with OpenCascade  回复  更多评论   

2014-10-07 16:58 by rio
博主您好!我在winXP 32位机上用Qt creator 2.7.2 和直接安装的 OCC 6.7.1 运行您的这个demo. 在.pro文件中为了找到有关文件有几行还改为类似如下
LIBS += D:\OpenCASCADE6.7.1\opencascade-6.7.1\win32\vc9\lib\TKernel.lib ... 等。

编译时出现五处类似如下的问题:
代码 TopoDS_Shape theBox = BRepPrimAPI_MakeBox(100, 60, 80) 编译错误 conversion from 'BRepPrimAPI_MakeBox' to 'const TopoDS_Shape' is ambiguous

这是哪里出问题了呢?

# re: Qt with OpenCascade  回复  更多评论   

2014-10-07 17:02 by eryar
@rio
你是编译的6.7.1的例子?
Sample Code for OpenCascade6.7.1: Qt with OpenCascade

# re: Qt with OpenCascade  回复  更多评论   

2014-10-10 11:39 by lijin
您好,请问我出现好多这种类型的错误是什么原因呢?
E:\OpenCasCade\occQt\occQt.cpp:158: error: undefined reference to `Graphic3d::InitGraphicDriver(Handle_Aspect_DisplayConnection const&)'
谢谢!
我用的是 OpenCascade6.7.1的例子,在win7下面Qt creator编译的

# re: Qt with OpenCascade  回复  更多评论   

2014-10-10 19:42 by eryar
@lijin
是不是头文件的路径没有设置?

# re: Qt with OpenCascade  回复  更多评论   

2014-10-13 10:23 by lijin
添加了的,您的那个VC11版的库是自己重新编译的是吗?

# re: Qt with OpenCascade  回复  更多评论   

2014-10-13 14:56 by eryar
@lijin
是的,确保你用的是opencascade6.7版本。
使用Graphic3d::InitGraphicDriver这种方式是6.6以后用的

# re: Qt with OpenCascade  回复  更多评论   

2014-10-17 14:02 by rio
注意到下载可以直接安装的 opencascade 6.7.1 windows 版是用 visual studio 编译的。 这是否会导致使用 Qt creator 存在兼容的问题?

# re: Qt with OpenCascade  回复  更多评论   

2014-10-17 18:05 by eryar
@rio
如果你的Qt Creator也是用的VS的编译器,应该不会冲突。

# re: Qt with OpenCascade  回复  更多评论   

2014-10-20 11:04 by rio
试了。用 visual studio 2010 的 vc++ 能编译这个例子。Qt creator 还有问题。

# re: Qt with OpenCascade  回复  更多评论   

2014-10-20 14:27 by eryar
@rio
这个例子适用在VS中用Qt的plugin来编译。

# re: Qt with OpenCascade  回复  更多评论   

2014-10-21 07:12 by soongv
Thank you very much for the code. It helps me a lot for setting up simple QT with OCCT (Window7(32-bit), QT 4.8.4, and OCCT6.7.1)

I also had a problem with graphic driver "Fatal error in graphic initialisation!" but finally solved it.

In graphic initialization section,

Handle_Aspect_DisplayConnection displayConnection; OR
Handle_Graphic3d_GraphicDriver graphicDriver;

I changed the handle to the one used in sample project opencascade-6.7.1/samples/qt/Tutorial


#include <OpenGl_GraphicDriver.hxx>

static Handle(OpenGl_GraphicDriver) graphicDriver;
if (graphicDriver.IsNull())
{
Handle(Aspect_DisplayConnection) displayConnection;
graphicDriver = new OpenGl_GraphicDriver (displayConnection);
}


Hope this help anyone who may have this problem.

# re: Qt with OpenCascade  回复  更多评论   

2014-10-21 09:49 by eryar
@soongv
Hi soongv,

You are welcome.

Thanks for your advice.

I will update the sample occQt according to your code.

Best Regards,
Xing

# re: Qt with OpenCascade  回复  更多评论   

2014-12-30 22:23 by eryar
更新occQt例子到OpenCASCADE6.8.0&Qt5.4:
http://www.cppblog.com/eryar/archive/2014/12/29/209335.html
代码下载:
https://github.com/eryar/occQt

# re: Qt with OpenCascade  回复  更多评论   

2015-04-01 20:39 by qwerty
你好,我用VS2010,运行程序后弹出“Fatal Error in graphic initialisation”后就停止了,想问一下这是哪里出问题了

# re: Qt with OpenCascade  回复  更多评论   

2015-04-01 20:44 by eryar
@qwerty

可视化模块加载失败。
可能原因是与可视化相关的第三方库的dll没有找到等

# re: Qt with OpenCascade  回复  更多评论   

2016-01-04 17:59 by bns
OpenCascade我也在学习 mark

# re: Qt with OpenCascade  回复  更多评论   

2018-05-24 17:44 by birds
您好,我是第一次通过vs2012+qt5.2编译该案例,但是最后生成.exe文件前总是报错,无法解析外部符号,VS2012中的部分报错如下:

moc_vier.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: static struct QMetaObject const QGLWidget::staticMetaObject" (__imp_?staticMetaObject@QGLWidget@@2UQMetaObject@@B)
1>vier.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QGLWidget::QGLWidget(class QWidget *,class QGLWidget const *,class QFlags<enum Qt::WindowType>)" (__imp_??0QGLWidget@@QEAA@PEAVQWidget@@PEBV0@V?$QFlags@W4WindowType@Qt@@@@@Z),该符号在函数 "public: __cdecl vier::vier(class opencascade::handle<class AIS_InteractiveContext>,class QWidget *)" (??0vier@@QEAA@V?$handle@VAIS_InteractiveContext@@@opencascade@@PEAVQWidget@@@Z) 中被引用
1>vier.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __cdecl QGLWidget::~QGLWidget(void)" (__imp_??1QGLWidget@@UEAA@XZ),该符号在函数 "int `public: __cdecl vier::vier(class opencascade::handle<class AIS_InteractiveContext>,class QWidget *)'::`1'::dtor$1" (?dtor$1@?0???0vier@@QEAA@V?$handle@VAIS_InteractiveContext@@@opencascade@@PEAVQWidget@@@Z@4HA) 中被引用
1>vier.obj : error LNK2001: 无法解析的外部符号 "protected: virtual bool __cdecl QGLWidget::event(class QEvent *)" (?event@QGLWidget@@MEAA_NPEAVQEvent@@@Z)
1>vier.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __cdecl QGLWidget::glDraw(void)" (?glDraw@QGLWidget@@MEAAXXZ)
1>vier.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __cdecl QGLWidget::glInit(void)" (?glInit@QGLWidget@@MEAAXXZ)
1>vier.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __cdecl QGLWidget::initializeGL(void)" (?initializeGL@QGLWidget@@MEAAXXZ)
1>vier.obj : error LNK2001: 无法解析的外部符号 "protected: virtual void __cdecl QGLWidget::initializeOverlayGL(void)" (?initializeOverlayGL@QGLWidget@@MEAAXXZ)

然后我又在qt5.2中编译了一次,它又是在生成执行文件前出错,错误如下:

occt.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl BRepPrimAPI_MakeBox::BRepPrimAPI_MakeBox(double,double,double)" (??0BRepPrimAPI_MakeBox@@QEAA@NNN@Z),该符号在函数 "private: void __cdecl occt::makeBox(void)" (?makeBox@occt@@AEAAXXZ) 中被引用
occt.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl BRepPrimAPI_MakeBox::BRepPrimAPI_MakeBox(class gp_Pnt const &,class gp_Pnt const &)" (??0BRepPrimAPI_MakeBox@@QEAA@AEBVgp_Pnt@@0@Z),该符号在函数 "private: void __cdecl occt::transform(void)" (?transform@occt@@AEAAXXZ) 中被引用
。。。。

求博主老师帮帮我,谢谢。

# re: Qt with OpenCascade  回复  更多评论   

2018-05-27 20:18 by eryar
@birds
都是链接错误,配置好lib库就可以了。

# re: Qt with OpenCascade  回复  更多评论   

2018-05-29 10:06 by birds
谢谢博主,已解决,但是后来我在调试时发现内存错误,

HWND winID = (HWND) (winId());
Handle_WNT_Window hWnd = new WNT_Window(winID);
myView->SetWindow(hWnd); //当程序运行到这一行时,突然报错:
0x00007FF9B3DEF218 处(位于 occt.exe 中)有未经处理的异常:Microsoft C++ 异常: Standard_Failure,位于内存位置 0x000000CF5EBDDB10 处。

这时程序就跳到OpenGl_ShaderManager.hxx文件的
Standard_Boolean BindFboBlitProgram()
{
if (myBlitProgram.IsNull())
{
prepareStdProgramFboBlit();
}
return !myBlitProgram.IsNull()
&& myContext->BindProgram (myBlitProgram); //执行到这儿出错
}

求博主看看这又是什么方面的问题。万分感谢。

# re: Qt with OpenCascade  回复  更多评论   

2018-05-29 10:13 by eryar
@birds
你用的occt哪个版本?

# re: Qt with OpenCascade  回复  更多评论   

2018-05-29 13:28 by birds
我是用vs2013+Qt5.6.2 编译opencascade7.0的

# re: Qt with OpenCascade  回复  更多评论   

2018-05-30 09:46 by eryar
@birds
可能是shader文件路径设置问题。
需要在环境变量中设置shader文件路径。

# re: Qt with OpenCascade  回复  更多评论   

2018-05-30 10:30 by birds
谢谢 已解决,就是添加了环境变量。万分感谢博主。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理