• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            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 閱讀(19849) 評(píng)論(25)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            Qt with OpenCascade

            eryar@163.com

            摘要Abstract:詳細(xì)介紹了如何在Qt中使用OpenCascade。

            關(guān)鍵字Key Words:Qt、OpenCascade

            一、引言 Introduction

            1.1 Overview of Qt

            Qt是1991年奇趣科技開(kāi)發(fā)的一個(gè)跨平臺(tái)的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開(kāi)發(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ì)于用戶開(kāi)發(fā)來(lái)說(shuō)是非常方便的。Qt提供了一種稱為signals/slots的安全類型來(lái)替代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 大量的開(kāi)發(fā)文檔;

            l XML支持;

            Qt按不同的版本進(jìn)行發(fā)布:

            n Qt商業(yè)版:提供給商業(yè)軟件開(kāi)發(fā)。它們提供傳統(tǒng)商業(yè)軟件發(fā)行版并且提供在協(xié)議有效期內(nèi)的免費(fèi)升級(jí)和技術(shù)支持服務(wù)。

            n Qt開(kāi)源版:僅為了開(kāi)發(fā)自由和開(kāi)放源碼軟件,提供了和商業(yè)版同樣的功能。GNU通用公共許可證下,它是免費(fèi)的。

            2009年3月發(fā)布的Qt4.5起,NOKIA為Qt增添了開(kāi)源LGPL授權(quán)選擇。

            1.2 Overview of OpenCascacde

            OpenCascade(簡(jiǎn)稱OCC)平臺(tái)是由法國(guó)Matra Datavision公司開(kāi)發(fā)的CAD/CAE/CAM軟件平臺(tái),可以說(shuō)是世界上最重要的幾何造型平臺(tái)之一。開(kāi)源OCC對(duì)象庫(kù)是一個(gè)面向?qū)ο蟮腃++類庫(kù),用于快速設(shè)計(jì)領(lǐng)域的專業(yè)應(yīng)用程序。OCC主要用于開(kāi)發(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通過(guò)有機(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公司開(kāi)發(fā)和市場(chǎng)運(yùn)作的。庫(kù)被設(shè)計(jì)成模塊化和易擴(kuò)展。

            wps_clip_image-13969

            Figure 1.1 OpenCascade架構(gòu)圖

            二、Qt + OpenCascade

            使用的開(kāi)發(fā)工具為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中創(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ì)說(shuō)明請(qǐng)參考《Visualization User’s Guide》。下面結(jié)合程序代碼進(jìn)行說(shuō)明。

            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

            編譯過(guò)程中遇到一些問(wèn)題,主要是頭文件包含及庫(kù)引用問(wèn)題。需要對(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é)果如下圖所示:

            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  回復(fù)  更多評(píng)論   

            2013-08-19 11:41 by tb
            QT 還是比較簡(jiǎn)單的

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2013-08-19 18:33 by eryar
            Qt面向?qū)ο笞龅貌诲e(cuò)。。。@tb

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2014-10-07 16:58 by rio
            博主您好!我在winXP 32位機(jī)上用Qt creator 2.7.2 和直接安裝的 OCC 6.7.1 運(yùn)行您的這個(gè)demo. 在.pro文件中為了找到有關(guān)文件有幾行還改為類似如下
            LIBS += D:\OpenCASCADE6.7.1\opencascade-6.7.1\win32\vc9\lib\TKernel.lib ... 等。

            編譯時(shí)出現(xiàn)五處類似如下的問(wèn)題:
            代碼 TopoDS_Shape theBox = BRepPrimAPI_MakeBox(100, 60, 80) 編譯錯(cuò)誤 conversion from 'BRepPrimAPI_MakeBox' to 'const TopoDS_Shape' is ambiguous

            這是哪里出問(wèn)題了呢?

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

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

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2014-10-10 11:39 by lijin
            您好,請(qǐng)問(wèn)我出現(xiàn)好多這種類型的錯(cuò)誤是什么原因呢?
            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  回復(fù)  更多評(píng)論   

            2014-10-10 19:42 by eryar
            @lijin
            是不是頭文件的路徑?jīng)]有設(shè)置?

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2014-10-13 10:23 by lijin
            添加了的,您的那個(gè)VC11版的庫(kù)是自己重新編譯的是嗎?

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

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

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2014-10-17 14:02 by rio
            注意到下載可以直接安裝的 opencascade 6.7.1 windows 版是用 visual studio 編譯的。 這是否會(huì)導(dǎo)致使用 Qt creator 存在兼容的問(wèn)題?

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2014-10-17 18:05 by eryar
            @rio
            如果你的Qt Creator也是用的VS的編譯器,應(yīng)該不會(huì)沖突。

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2014-10-20 11:04 by rio
            試了。用 visual studio 2010 的 vc++ 能編譯這個(gè)例子。Qt creator 還有問(wèn)題。

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2014-10-20 14:27 by eryar
            @rio
            這個(gè)例子適用在VS中用Qt的plugin來(lái)編譯。

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            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  回復(fù)  更多評(píng)論   

            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  回復(fù)  更多評(píng)論   

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

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2015-04-01 20:39 by qwerty
            你好,我用VS2010,運(yùn)行程序后彈出“Fatal Error in graphic initialisation”后就停止了,想問(wèn)一下這是哪里出問(wèn)題了

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

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

            可視化模塊加載失敗。
            可能原因是與可視化相關(guān)的第三方庫(kù)的dll沒(méi)有找到等

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2016-01-04 17:59 by bns
            OpenCascade我也在學(xué)習(xí) mark

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2018-05-24 17:44 by birds
            您好,我是第一次通過(guò)vs2012+qt5.2編譯該案例,但是最后生成.exe文件前總是報(bào)錯(cuò),無(wú)法解析外部符號(hào),VS2012中的部分報(bào)錯(cuò)如下:

            moc_vier.obj : error LNK2001: 無(wú)法解析的外部符號(hào) "__declspec(dllimport) public: static struct QMetaObject const QGLWidget::staticMetaObject" (__imp_?staticMetaObject@QGLWidget@@2UQMetaObject@@B)
            1>vier.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "__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),該符號(hào)在函數(shù) "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: 無(wú)法解析的外部符號(hào) "__declspec(dllimport) public: virtual __cdecl QGLWidget::~QGLWidget(void)" (__imp_??1QGLWidget@@UEAA@XZ),該符號(hào)在函數(shù) "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: 無(wú)法解析的外部符號(hào) "protected: virtual bool __cdecl QGLWidget::event(class QEvent *)" (?event@QGLWidget@@MEAA_NPEAVQEvent@@@Z)
            1>vier.obj : error LNK2001: 無(wú)法解析的外部符號(hào) "protected: virtual void __cdecl QGLWidget::glDraw(void)" (?glDraw@QGLWidget@@MEAAXXZ)
            1>vier.obj : error LNK2001: 無(wú)法解析的外部符號(hào) "protected: virtual void __cdecl QGLWidget::glInit(void)" (?glInit@QGLWidget@@MEAAXXZ)
            1>vier.obj : error LNK2001: 無(wú)法解析的外部符號(hào) "protected: virtual void __cdecl QGLWidget::initializeGL(void)" (?initializeGL@QGLWidget@@MEAAXXZ)
            1>vier.obj : error LNK2001: 無(wú)法解析的外部符號(hào) "protected: virtual void __cdecl QGLWidget::initializeOverlayGL(void)" (?initializeOverlayGL@QGLWidget@@MEAAXXZ)

            然后我又在qt5.2中編譯了一次,它又是在生成執(zhí)行文件前出錯(cuò),錯(cuò)誤如下:

            occt.obj:-1: error: LNK2019: 無(wú)法解析的外部符號(hào) "public: __cdecl BRepPrimAPI_MakeBox::BRepPrimAPI_MakeBox(double,double,double)" (??0BRepPrimAPI_MakeBox@@QEAA@NNN@Z),該符號(hào)在函數(shù) "private: void __cdecl occt::makeBox(void)" (?makeBox@occt@@AEAAXXZ) 中被引用
            occt.obj:-1: error: LNK2019: 無(wú)法解析的外部符號(hào) "public: __cdecl BRepPrimAPI_MakeBox::BRepPrimAPI_MakeBox(class gp_Pnt const &,class gp_Pnt const &)" (??0BRepPrimAPI_MakeBox@@QEAA@AEBVgp_Pnt@@0@Z),該符號(hào)在函數(shù) "private: void __cdecl occt::transform(void)" (?transform@occt@@AEAAXXZ) 中被引用
            。。。。

            求博主老師幫幫我,謝謝。

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2018-05-27 20:18 by eryar
            @birds
            都是鏈接錯(cuò)誤,配置好lib庫(kù)就可以了。

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2018-05-29 10:06 by birds
            謝謝博主,已解決,但是后來(lái)我在調(diào)試時(shí)發(fā)現(xiàn)內(nèi)存錯(cuò)誤,

            HWND winID = (HWND) (winId());
            Handle_WNT_Window hWnd = new WNT_Window(winID);
            myView->SetWindow(hWnd); //當(dāng)程序運(yùn)行到這一行時(shí),突然報(bào)錯(cuò):
            0x00007FF9B3DEF218 處(位于 occt.exe 中)有未經(jīng)處理的異常:Microsoft C++ 異常: Standard_Failure,位于內(nèi)存位置 0x000000CF5EBDDB10 處。

            這時(shí)程序就跳到OpenGl_ShaderManager.hxx文件的
            Standard_Boolean BindFboBlitProgram()
            {
            if (myBlitProgram.IsNull())
            {
            prepareStdProgramFboBlit();
            }
            return !myBlitProgram.IsNull()
            && myContext->BindProgram (myBlitProgram); //執(zhí)行到這兒出錯(cuò)
            }

            求博主看看這又是什么方面的問(wèn)題。萬(wàn)分感謝。

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2018-05-29 10:13 by eryar
            @birds
            你用的occt哪個(gè)版本?

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

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

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2018-05-30 09:46 by eryar
            @birds
            可能是shader文件路徑設(shè)置問(wèn)題。
            需要在環(huán)境變量中設(shè)置shader文件路徑。

            # re: Qt with OpenCascade  回復(fù)  更多評(píng)論   

            2018-05-30 10:30 by birds
            謝謝 已解決,就是添加了環(huán)境變量。萬(wàn)分感謝博主。
            久久人妻少妇嫩草AV无码蜜桃| 99热都是精品久久久久久| 一97日本道伊人久久综合影院| 久久精品综合一区二区三区| 久久久久久无码国产精品中文字幕| 国产成人久久久精品二区三区 | 久久精品国产第一区二区三区| 久久精品国产亚洲AV电影| 丁香久久婷婷国产午夜视频| 久久综合九色欧美综合狠狠| 一本一本久久A久久综合精品| 国内精品久久久人妻中文字幕| 久久线看观看精品香蕉国产| 欧美久久久久久午夜精品| 色8久久人人97超碰香蕉987| 亚洲狠狠久久综合一区77777| 久久亚洲视频| 99久久无码一区人妻a黑| 久久久久久毛片免费看| 天天爽天天狠久久久综合麻豆| 91精品国产91久久久久久蜜臀| 一级a性色生活片久久无少妇一级婬片免费放| 亚洲精品无码专区久久久| 国产精品女同一区二区久久| 欧美精品九九99久久在观看| 99精品国产在热久久| 欧美久久一级内射wwwwww.| 99久久精品日本一区二区免费| 伊人色综合久久天天网 | 欧美久久精品一级c片片| 一本色综合久久| 亚洲嫩草影院久久精品| 无码人妻久久一区二区三区免费丨| 亚洲国产精品一区二区久久| 久久久一本精品99久久精品88| 色综合合久久天天给综看| 免费观看成人久久网免费观看| 人人狠狠综合久久88成人| 一级做a爰片久久毛片免费陪| 亚洲精品高清久久| 91精品国产高清91久久久久久|