摘 要: Qt是挪威TrollTech公司推出的一個跨平臺的C++圖形用戶界面庫,提供給應(yīng)用程序開發(fā)者建立圖形用戶界面所需的所有功能。OpenCASCADE采用基于OpenGL的專用CAD類庫,可應(yīng)用于CAD軟件開發(fā)、仿真軟件設(shè)計和三維圖形顯示等領(lǐng)域。將Qt和OpenCASCADE在C++環(huán)境下結(jié)合起來能夠進(jìn)行建模軟件的開發(fā)。介紹了Qt及OpenCASCADE類庫的主要功能,簡要敘述了邊界表示法,給出了幾何和拓?fù)涞亩x,對OCC中的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)進(jìn)行了闡述。經(jīng)過實際的編程開發(fā),結(jié)果表明,Qt及OpenCASCADE類庫能夠建立多種復(fù)雜模型,且擁有較好的顯示效果,適合作為幾何建模軟件的開發(fā)工具。
關(guān)鍵詞: Qt; OpenCASCADE; 建模; 邊界表示法; 數(shù)據(jù)結(jié)構(gòu)
中圖分類號: TN919?34; TP391.9 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2013)10?0074?04
0 引 言
特定平臺具有特定的系統(tǒng)特性、應(yīng)用開發(fā)環(huán)境及系統(tǒng)運行環(huán)境,若想使編制好的軟件能夠運行在多個平臺上,需選用具備跨平臺開發(fā)程序的工具開發(fā)軟件。Qt是挪威TrollTech公司推出的一個跨平臺的C++圖形用戶界面庫,提供給應(yīng)用程序開發(fā)者建立圖形用戶界面所需的所有功能[1]。
使用“一次編寫,隨處編譯”的方式用于構(gòu)建多平臺圖形用戶界面程序,使用單一的源代碼樹和簡單的重編譯,能夠在Windows,MacOS X,Linux,Solaris,HP?UX和其他使用X11的Unix版本下編制程序[2]。Qt完全面向?qū)ο笄液苋菀讛U(kuò)展, 它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ),并為世界上數(shù)千個大公司,包括IBM、摩托羅拉和夏普等提供開發(fā)軟件。綜合以上因素,選擇Qt作為建模平臺的開發(fā)工具。
OpenCASCADE(Open Computer Aided Software for Computer Aided Design and Engineering) 是由法國的MDTV(Matra Datavision)公司設(shè)計開發(fā)的CAD系統(tǒng)[3],于1999年開放源代碼。
OpenCASCADE采用C++開發(fā)基于OpenGL的專用快速開發(fā)的CAD類庫,提供基本幾何體表達(dá)與操作、CAD模型顯示與操作、多種CAD文件格式讀取與保存等功能,可應(yīng)用于CAD軟件開發(fā)、仿真軟件設(shè)計和三維圖形顯示等方面[4]。
基于OpenCASCADE進(jìn)行CAD系統(tǒng)開發(fā),能夠?qū)?OpenCASCADE類庫的二維和三維建模、布爾操作、可視化的特性及VC++程序?qū)崟r性好的特點有效地結(jié)合,進(jìn)行仿真應(yīng)用等,因此選用它作為建模內(nèi)核創(chuàng)建模型。
1 Qt簡介
Qt類似于X Window上的Motif,Openwin,GTK等圖形界面庫和Windows平臺上的MFC,OWL,VCL,ATL等,提供給應(yīng)用程序開發(fā)者建立圖形用戶界面所需的所有功能,目前包括基于Framebuffer的Qt Embedded、快速開發(fā)工具Qt Designer、國際化工具Qt Linguist等部分。自1995年以來QT/C++應(yīng)用程序就在商業(yè)應(yīng)用中占據(jù)核心地位。QT也是流行的Linux桌面環(huán)境KDE的基礎(chǔ),KDE是所有主要的Linux發(fā)行版的一個標(biāo)準(zhǔn)組件。Qt支持的操作系統(tǒng)有Microsoft Windows 95/98,Microsoft Windows NT,Linux、Solaris,SunOS,HP?UX,Digital UNIX(OSF/1,Tru64),Irix,F(xiàn)reeBSD,BSD/OS,SCO,AIX,OS390,QNX等。Qt提取了窗口和操作系統(tǒng)的底層基礎(chǔ)構(gòu)造函數(shù),為軟件開發(fā)工程師提供了一致的邏輯界面,Qt API在所有支持的平臺上都是相同的[5]。
Qt用C++語言實現(xiàn),其良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性較好,對于用戶開發(fā)來說是非常方便的。還提供了一種稱為signals/slots的安全類型來替代callback,這使得各個元件之間的協(xié)同工作變得十分簡單[6]。
Qt有一個圖形界面的所見即所得工具——Qt Designer。根據(jù)這一工具可以任意構(gòu)造需要的圖形界面,而且利用UIC工具將生成的UI文件轉(zhuǎn)換為CPP文件和H文件,使界面軟件部分和系統(tǒng)實現(xiàn)軟件部分融合到一起[7]。Qt Designer提供了Qt基本的可繪制窗口部件,比如QWidget,QLabel,QPushButton,QVBoxLayout等。在設(shè)計器中通過鼠標(biāo)直接拖放這些窗口部件,能夠高效、快速地實現(xiàn)GUI界面的設(shè)計,界面直觀形象,所見所得[8]。
2 OpenCASCADE簡介
OpenCASCADE包括3D曲面和實體建模組件、可視化組件、數(shù)據(jù)交換組件和適合快速開發(fā)的應(yīng)用程序開發(fā)框架,提供二維和三維幾何體的生成、顯示和分析,是一款可以用來進(jìn)行計算機(jī)可視化的幾何內(nèi)核,并且是開放源代碼的。OpenCASCADE提供了點、線、面、體和復(fù)雜形體的顯示和交互操作,經(jīng)過深度開發(fā)后可實現(xiàn)紋理、光照、圖元填充、渲染等圖形操作和放大、縮小、旋轉(zhuǎn)、漫游、模擬飛行、模擬穿越等動態(tài)操作[9]。OpenCASCADE定義了圖形數(shù)據(jù)的存儲格式以及大量的圖形算法,可以幫助開發(fā)人員快速地進(jìn)行面向?qū)ο蟪绦虻拈_發(fā)。目前支持3種操作系統(tǒng):Linux,Windows NT和Sun Solaris。
OpenCASCADE由一系列的C++類構(gòu)成,相關(guān)的類組織成包,包組織成庫文件,最后相關(guān)庫組織成模塊,通過有機(jī)組織的庫文件提供了基礎(chǔ)類、模塊數(shù)據(jù)管理、建模算法、模型的顯示、應(yīng)用框架、數(shù)據(jù)交換6個模塊。
OpenCASCADE還為用戶提供了OCAF(OpenCASCADE AppliCation Framework),它是一種基于OpenCASCADE的RAD(Rapid Applieation Development,快速開發(fā)工具)框架[10],是OpenCASCADE類庫的輔助工具,在幾何建模過程中,不僅能處理用到的類庫里的任何數(shù)據(jù)和算法,還可以用于組織、保存應(yīng)用數(shù)據(jù),開發(fā)人員可以使用這一工具進(jìn)行應(yīng)用程序的快速開發(fā)。
3 OpenCASCADE建模技術(shù)
3.1 邊界表示法
OpenCASCADE是一個先進(jìn)的、三維的、邊界表示(B?Rep)為主的幾何造型工具包,是由C++開發(fā)設(shè)計基于OpenGL的專用快速開發(fā)的CAD類庫,提供統(tǒng)一的數(shù)據(jù)結(jié)構(gòu),同時支持線框、CSG、B?Rep三種模型,并允許這個三種表示共存于統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)中[11]。OpenCASCADE主要基于邊界表示法進(jìn)行建模。邊界表示(Boundary Representation)也稱為BR表示或B?rep表示,是三維實體建模在計算機(jī)內(nèi)部的一種表達(dá)方式,即數(shù)據(jù)存放的邏輯結(jié)構(gòu)。它是幾何造型中最成熟、無二義的表示法[12]。物體的邊界是物體內(nèi)外部點的分界面,一般用體表、面表、環(huán)表、邊表和頂點表5層描述[13]。即實體的邊界由面的并集表示,每個面由它所在的曲面的定義加上其邊界來表示,面的邊界是邊的并集,邊由點來表示[12]。
邊界表示法強(qiáng)調(diào)物體表面的細(xì)節(jié),詳細(xì)記錄了構(gòu)成物體形體的所有幾何元素的幾何信息及其相互間的聯(lián)接關(guān)系即拓?fù)湫畔ⅲ瑤缀涡畔⑴c拓?fù)湫畔⒎珠_存儲,完整清晰,并能惟一定義物體的三維模型,缺點是對于不規(guī)則三維物體的描述不太方便。這一方法主要適用于三維空間操作和分析[13]。
3.2 幾何和拓?fù)?/p>
在OpenCASCADE中,幾何體(Geometry)、拓?fù)洌═opology)都是從最基礎(chǔ)的抽象類派生而來,所有的實體對象具有相同的功能,如實體本身的信息保存功能、自身復(fù)制功能以及調(diào)試功能等,這些功能均由類TopoDS來實現(xiàn)。幾何是指構(gòu)成模型的純粹的幾何元素,如點(point)、曲線(curve)和曲面(surface)等,拓?fù)涫侵改P透鲙缀螌嶓w之間的空間關(guān)系,幾何體及其拓?fù)潢P(guān)系構(gòu)成了模型的基本空間結(jié)構(gòu)[13]。
OpenCASCADE中存在兩種實現(xiàn)方法完全不同的幾何體類:構(gòu)造幾何體和模型幾何體。構(gòu)造幾何體是指那些具有幾何對象的數(shù)學(xué)定義的C++類;模型幾何體是指為構(gòu)造幾何體增加模型操作功能的那些類,它的數(shù)據(jù)結(jié)構(gòu)中含有指向構(gòu)造幾何體類的指針,模型幾何體和模型保存在一起[14]。
在邊界表示法中,描述形體的信息包括幾何信息(Geometry)和拓?fù)湫畔ⅲ═opology)兩個方面。一般說來,幾何信息描述形體的大小、尺寸、位置、形狀等,如邊的形狀、頂點的坐標(biāo)等。拓?fù)湫畔⒚枋鲂误w上的頂點、邊、面的連接關(guān)系,形成物體邊界表示的“骨架”,幾何信息猶如附著在“骨架”上的肌肉[12]。
3.3 數(shù)據(jù)類型
數(shù)據(jù)類型是作為類被實現(xiàn)的。依據(jù)處理方式的不同, OCC 中的數(shù)據(jù)類型可分為兩大類:通過值處理的數(shù)據(jù)類型和通過句柄(或引用)處理的數(shù)據(jù)類型。一個通過值處理的類型變量包含自己的實例;而另一個通過句柄處理的類型變量包含一個實例的引用[14]。
3.3.1 值處理類型
值處理類型可分三大類:基本類型、枚舉類型和由這樣一些類(既不是由Standard_Persistent 類派生,也不是由Standard_Transient 類派生,直接派生或間接派生)定義的類型。基本類型如表1所示。
表1 基本類型
值處理類型的表現(xiàn)形式比句柄處理類型的表現(xiàn)形式更直接。因此操作也會更快。但是這一類型對象不能單獨存于文件中,那些能被數(shù)據(jù)模式識別(包括基本類型和從Storable 類繼承過來的類型)的值處理類型可以作為持久對象的部分結(jié)構(gòu)而存儲在持久對象內(nèi)部,這也是值處理類型對象能夠存進(jìn)文件的惟一方式[14]。
3.3.2 句柄處理類型
句柄處理類型可以分為兩大類:由Persistent 類的派生類定義的類型和由Transient 類的派生類定義的類型[14]。
OCC 的引用管理采用的是一種句柄機(jī)制。這種機(jī)制的基本元素是句柄。在OCC 中,句柄是通過類實現(xiàn)的。句柄含有多個接口成員,其中一個包含一個引用,一般僅使用它的引用。與C++指針一樣,幾個句柄可以引用同一個對象,一個句柄也可以引用多個對象,但是每次只能引用一個。在句柄訪問對象前,句柄必須被聲明[14]。
3.4 OCC的數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)元素之間的相互關(guān)系,尤其是數(shù)據(jù)的邏輯結(jié)構(gòu)。選擇數(shù)據(jù)結(jié)構(gòu)的主要依據(jù)就是數(shù)據(jù)的邏輯結(jié)構(gòu)。
OCC 擁有一個建模數(shù)據(jù)模塊,也稱數(shù)據(jù)結(jié)構(gòu)模塊,主要為二維和三維幾何模型提供數(shù)據(jù)結(jié)構(gòu)。 數(shù)據(jù)結(jié)構(gòu)模塊由4個工具箱組成:幾何工具、二維幾何、三維幾何和拓?fù)鋄14]。
3.4.1 二維幾何數(shù)據(jù)結(jié)構(gòu)
二維幾何數(shù)據(jù)結(jié)構(gòu)定義了二維空間上幾何對象的數(shù)據(jù)結(jié)構(gòu),主要由Geom2d包提供,Geom2d 包提供了比gp 包更大范圍的對象。這些對象是非持久的,并且是通過引用處理的。
如果需要的對象不是單一的,而是一系列的,那么TColGeom2d 包(用來處理這類對象的集合容器)可以提供必要的功能。特別地,該包為通用類中那些標(biāo)準(zhǔn)的和經(jīng)常使用的實例化提供幾何對象。
TColGeom2d 包為來自Geom2d 包的曲線提供一維數(shù)組、二維數(shù)組和序列的實現(xiàn),所有這些對象能以句柄和數(shù)值兩種不同的方式處理[14]。TopAbs 包提供通用枚舉類,用來描述拓?fù)鋵W(xué)基本概念和處理枚舉類的方法,不包含具體類。
TopAbs 定義了3個概念:拓?fù)漕愋停ㄓ蒚opAbs_ShapeEnum 類描述)、拓?fù)浞较颍ㄓ蒚opAbs_Orientation 類描述)和拓?fù)錉顟B(tài)(由TopAbs_State 類描述) [14]。
3.4.2 三維幾何數(shù)據(jù)結(jié)構(gòu)
三維幾何對象的數(shù)據(jù)結(jié)構(gòu)主要由Geom包提供。Geom 包包含了所有的基本幾何轉(zhuǎn)換(如等價、旋轉(zhuǎn)、平移、鏡像、縮放和復(fù)合變換等)。另外,Geom 包也提供了一些基于幾何對象引用定義的特殊函數(shù)(如在B 樣條曲線上增加一個控制點,對曲線進(jìn)行改善等)。Geom 包中所有幾何實體都是以STEP 方式處理的,包中可實現(xiàn)的非持久的通過句柄處理的對象有:點、笛卡爾點、向量、方向具有幅值的向量、軸、曲線、直線、圓錐、圓、橢圓、雙曲線與拋物線、基本曲面、平面、邊界曲線與邊界曲面、裁剪曲線與裁剪曲面、非均勻有理化B 樣條曲線與曲面、Bezier 曲線與曲面、圓柱面、球面與螺旋面、掃描曲面、線性擠壓曲面、旋轉(zhuǎn)曲面、偏移曲面[14]。
3.4.3 拓?fù)鋽?shù)據(jù)結(jié)構(gòu)
OCC使用TopoDS 包描述了拓?fù)鋽?shù)據(jù)結(jié)構(gòu)。TopoDS 包提供了兩套類:一套由TopoDS_Shape(與TopoAbs 包中列出的標(biāo)準(zhǔn)拓?fù)銼hape 一致)派生;另一套由下層Shape(既沒有拓?fù)浞较蛞矝]有位置)派生。
OCC 描述了參數(shù)空間對象的數(shù)據(jù)結(jié)構(gòu)。這些描述用到了定位和限制。可以由這些術(shù)語描述的Shape 的類型有:頂點、面和Shape。頂點依據(jù)參數(shù)空間位置來定義,面和Shape 依據(jù)空間的限制來定義,可以將上述簡單Shape 組成集。例如,一個邊集形成一個線框;一個面集形成一個殼;一個實心體集形成一個組合實心體。也可以將不同類型的Shape 組成一個復(fù)合體,并為一個Shape 指定拓?fù)浞较蚝臀恢谩R罁?jù)Shape 的復(fù)雜程度,從頂點到組合實心體依次將Shape 列出來,這樣能方便地知道一個Shape 是由哪些簡單Shape 組成的。事實上,這就是TopoDS 包的意圖[14]。TopoDS_Shape 類描述了Shape 的引用。它包含一個指向下層抽象Shape 的引用、一個拓?fù)浞较蚝鸵粋€引用坐標(biāo)。該類是通過數(shù)值處理的,不能被共享。描繪下層Shape 的類從不被直接引用,而是通過TopoDS_Shape 類被間接引用[14]。
3.5 建立幾何體的相關(guān)包
在創(chuàng)建一個幾何對象前,必須知道這個對象是2D的還是3D的,以及將如何使用這個對象[14]。下面簡述基本幾何類型中主要的幾個包。gp 包為二維和三維對象提供了一些通過值處理的類,定義了一些基本的非持久幾何實體,這些實體在二維和三維的代數(shù)計算和基本幾何結(jié)構(gòu)分析中用到。gp包可以建立的幾何實體有:二維和三維直角坐標(biāo)(x,y,z)、矩陣、笛卡爾點、向量、方向、軸、直線、圓、橢圓、雙曲線、拋物線、平面、無窮圓柱曲面、球面、螺旋面和圓錐面;它也提供了一些基本的幾何轉(zhuǎn)換,如等價、旋轉(zhuǎn)、平移、鏡像、縮放、復(fù)合變換等。BRepPrimAPI包可以構(gòu)建立方體、圓柱體、球體、圓臺、楔形體、圓環(huán)、旋轉(zhuǎn)體和拉伸體等幾何實體;BRepAlgoAPI包提供用布爾運算來建立新的模型;BRepBuilderAPI包能夠建立點、邊、線框、面、殼、實體、組合實體等;BRepFilletAPI包可實現(xiàn)對實體進(jìn)行倒角、圓角等操作。
4 結(jié) 語
Qt是一個使用廣泛的跨平臺圖形界面開發(fā)工具,可用于Windows,Linux,Mac OSX和許多平臺。它具有靈活的面向?qū)ο蟮慕Y(jié)構(gòu)、清晰的文檔以及直觀的API,針對同功能的程序能夠運行在不同的系統(tǒng)平臺,并保持一致的界面和功能,較好地增強(qiáng)了程序的靈活性和可移植性,為開發(fā)跨平臺桌面應(yīng)用程序的人機(jī)交互界面提供了良好的支持。OpenCASCADE提供了多種包建立基本和復(fù)雜幾何模型。
在Visual C++環(huán)境下結(jié)合Qt和OpenCASCADE類庫能夠開發(fā)出跨平臺的幾何建模程序,建立不同復(fù)雜程度的幾何模型,可以作為相關(guān)數(shù)值計算軟件的建模模塊。
參考文獻(xiàn)
[1] 鄧飛.基于Qt的地震資料采集質(zhì)量監(jiān)控及評價系統(tǒng)的開發(fā)與研究[D].成都:成都理工大學(xué),2004.
[2] 李艷民.基于Qt跨平臺的人機(jī)交互界面的研究和應(yīng)用[D].重慶:重慶大學(xué),2007.
[3] 陳宏宇.基于OpenCASCADE的“一元四體”模型實現(xiàn)技術(shù)研究[J].計算機(jī)工程與科學(xué),2012,34(3):15?17.
[4] 汪玉璽.基于三坐標(biāo)測量機(jī)的測量軟件MworksCAD[J].計算機(jī)輔助工程,2007,16(2):29?31.
[5] 楊少鵬.SXD/Linux通信編碼仿真平臺的設(shè)計與實現(xiàn)[D].成都:西南交通大學(xué),2005.
[6] 王愛文.Linux平臺下基于Qt的電子海圖的研究與實現(xiàn)[D].哈爾濱:哈爾濱工程大學(xué),2004.
[7] 許德新.基于Qt組件庫應(yīng)用程序的生成及其跨平臺實現(xiàn)[J].東北農(nóng)業(yè)大學(xué)學(xué)報,2006,37(3):373?376.
[8] 蔡志明.精通Qt4編程[M].2版.北京:電子工業(yè)出版社,2011.
[9] 丁偉.基于Open CASCADE下的點云數(shù)據(jù)的研究與實現(xiàn)[J].制造業(yè)自動化,2010,32(11):216?218.
[10] 陳月鳳.基于虛擬環(huán)境的工程圖學(xué)三維建模系統(tǒng)的開發(fā)[D].濟(jì)南:山東大學(xué),2010.
[11] 鄭旺.逆向工程中的幾何特征重建及其優(yōu)化[D].西安:西北工業(yè)大學(xué),2010.
[12] 黃林竹.三維形體的幾何建模研究[J].科技信息,2007(3):56?58.
[13] 畢碩本.三維建模技術(shù)及實現(xiàn)方法對比研究[J].武漢理工大學(xué)學(xué)報,2010,32(16):70?72.
[14] 佚名.OpenCascade中文幫助文檔[EB/OL].[2012?05?07].http://wenku.baidu.com/view/c11d144b2e3f5727a5e96237.html.
[15] 袁媛,王延紅,江凌,等.C++類庫Qt在數(shù)值模擬軟件開發(fā)中的應(yīng)用[J].現(xiàn)代電子技術(shù),2010,33(2):80?83.