Qt with OpenCascade
eryar@163.com
摘要Abstract:詳細(xì)介紹了如何在Qt中使用OpenCascade。
關(guān)鍵字Key Words:Qt、OpenCascade
一、引言 Introduction
1.1 Overview of Qt
Qt是1991年奇趣科技開發(fā)的一個(gè)跨平臺(tái)的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級(jí)的圖形用戶界面所需的所有功能。Qt很容易擴(kuò)展,并且允許真正地組件編程。基本上,Qt同X Window上的Motif,Openwin,GTK等圖形界面庫(kù)和Windows平臺(tái)上的MFC,OWL,VCL,ATL是同類型的東西。
Qt具有如下優(yōu)點(diǎn):
l 優(yōu)良的跨平臺(tái)特性:Qt支持下列操作系統(tǒng):Microsoft Windows 95/98, NT, Linux, Solaris, SunOS, HP-UX, FreeBSD, SCO等;
l 面向?qū)ο螅篞t良好的封裝機(jī)制使得Qt的模塊化程序非常高,可重用性較好,對(duì)于用戶開發(fā)來說是非常方便的。Qt提供了一種稱為signals/slots的安全類型來替代callback,這使得各個(gè)元件之間的協(xié)同工作變得非常簡(jiǎn)單;
l 豐富的API:Qt包含多達(dá)250個(gè)以上的C++類,還提供基于模板的collections, serialization, file, I/O device, directory management, data/time類。甚至還包括正則表達(dá)式的處理功能;
l 支持2D、3D圖形渲染,支持OpenGL;
l 大量的開發(fā)文檔;
l XML支持;
Qt按不同的版本進(jìn)行發(fā)布:
n Qt商業(yè)版:提供給商業(yè)軟件開發(fā)。它們提供傳統(tǒng)商業(yè)軟件發(fā)行版并且提供在協(xié)議有效期內(nèi)的免費(fèi)升級(jí)和技術(shù)支持服務(wù)。
n Qt開源版:僅為了開發(fā)自由和開放源碼軟件,提供了和商業(yè)版同樣的功能。GNU通用公共許可證下,它是免費(fèi)的。
2009年3月發(fā)布的Qt4.5起,NOKIA為Qt增添了開源LGPL授權(quán)選擇。
1.2 Overview of OpenCascacde
OpenCascade(簡(jiǎn)稱OCC)平臺(tái)是由法國(guó)Matra Datavision公司開發(fā)的CAD/CAE/CAM軟件平臺(tái),可以說是世界上最重要的幾何造型平臺(tái)之一。開源OCC對(duì)象庫(kù)是一個(gè)面向?qū)ο蟮腃++類庫(kù),用于快速設(shè)計(jì)領(lǐng)域的專業(yè)應(yīng)用程序。OCC主要用于開發(fā)二維和三維幾何建模應(yīng)用程序,包括通用的或?qū)I(yè)的計(jì)算機(jī)輔助設(shè)計(jì)(CAD)系統(tǒng)、計(jì)算機(jī)輔助制造(CAM)系統(tǒng)或分析領(lǐng)域的應(yīng)用程序、仿真應(yīng)用程序或圖形演示工具。OCC通過有機(jī)組織的C++庫(kù)文件提供了六個(gè)模塊:
l FoundationClasses
l ModelingData
l ModelingAlgorithms
l Visualization
l ApplicationFramework
l DataExchange
OCCT庫(kù)提供如下功能:
l 2D和3D幾何造型工具箱,可對(duì)任何物體造型;
n 創(chuàng)建基本圖元,如prism,cylinder, cone, torus;
n 對(duì)實(shí)體進(jìn)行布爾操作,addition, subtraction and intersection;
n 根據(jù)倒圓、倒角、草圖拉伸出幾何實(shí)體;
n 使用偏移offsets、成殼shelling、挖空hollowing和擠壓sweeps構(gòu)造幾何實(shí)體;
n 計(jì)算幾何實(shí)體屬性,如表面積、體積、重心、曲率半徑;
n 使用插值interpolation、逼近approximation、投影projection計(jì)算出幾何體;
l 可視化功能提供對(duì)幾何實(shí)體的顯示、控制功能,例如:
n 三維旋轉(zhuǎn)3D rotation;
n 縮放Zoom;
n 著色Shading;
l 程序框架提供如下功能:
n 將非幾何數(shù)據(jù)與幾何實(shí)體關(guān)聯(lián);
n 參數(shù)化模型;
n Java Application Desktop(JAD);
OCCT庫(kù)是由Open CASCADE公司開發(fā)和市場(chǎng)運(yùn)作的。庫(kù)被設(shè)計(jì)成模塊化和易擴(kuò)展。
Figure 1.1 OpenCascade架構(gòu)圖
二、Qt + OpenCascade
使用的開發(fā)工具為Qt Creator 2.7.0,Qt的版本為Qt 5.0.2。如下圖所示:
Figure 3.1 Qt and Qt Creator version Info
OpenCascade的版本為OpenCASCADE6.5.5,如下圖所示:
Figure 3.2 OpenCascade Version Info
在OpenCascade中創(chuàng)建三維場(chǎng)景的步驟分為:
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.
詳細(xì)說明請(qǐng)參考《Visualization User’s Guide》。下面結(jié)合程序代碼進(jìn)行說明。
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);
三、結(jié)論 Conclusion
編譯過程中遇到一些問題,主要是頭文件包含及庫(kù)引用問題。需要對(duì)Qt工程文件做如下設(shè)置:
l 因?yàn)槌绦蚴褂昧薗GLWidget,所以在其工程中要引用OpenGL的庫(kù)。設(shè)置方法如下:QT += core gui opengl;
l 頭文件目錄的設(shè)置:INCLUDEPATH += D:\OpenCASCADE6.5.5\ros\inc;
l 引用庫(kù)的設(shè)置:
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
上述目錄根據(jù)不同的計(jì)算機(jī)需要做相應(yīng)修改。程序運(yùn)行結(jié)果如下圖所示:
Figure 3.1 Sphere in occQt

Figure 3.2 Transformation in occQt