日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OCCT学习003-----MFC单文档工程

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OCCT学习003-----MFC单文档工程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OCCT學習003-----MFC單文檔工程創建

longlongway2012@hotmail.com

背景

window平臺下開發軟件,常用的c++界面開發主要使用MFC,雖然近些年幾乎被淘汰,但對于傳統軟件公司,仍然沒有拋棄掉。后起之秀Qt也很受歡迎,以后再研究,這里先從MFC開個頭。

開發準備

  • vs2010開發環境
  • occt 7.2版本
    最新的vs已經到了2019,下一個版本估計是2021了,但對于研究機制,差別不是很大,其他人可以進行嘗試。

創建工程和環境配置

創建MFC單文檔工程和運行環境

  • 設置工程名稱:

  • 設置工程界面風格

  • 最終點擊完成,生成了一個空的MFC單文檔框架程序:

  • 創建x64程序

  • 設置庫路徑

  • 填寫依賴庫:

    TKBin.lib;TKBinL.lib;TKBinTObj.lib;TKBinXCAF.lib;TKBO.lib;TKBool.lib;TKBRep.lib;TKCAF.lib;TKCDF.lib;TKD3DHost.lib;TKDCAF.lib;TKDFBrowser.lib;TKDraw.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKIGES.lib;TKIVtk.lib;TKIVtkDraw.lib;TKLCAF.lib;TKMath.lib;TKMesh.lib;TKMeshVS.lib;TKOffset.lib;TKOpenGl.lib;TKPrim.lib;TKQADraw.lib;TKService.lib;TKShapeView.lib;TKShHealing.lib;TKStd.lib;TKStdL.lib;TKSTEP.lib;TKSTEP209.lib;TKSTEPAttr.lib;TKSTEPBase.lib;TKSTL.lib;TKTInspector.lib;TKTInspectorAPI.lib;TKTObj.lib;TKTObjDRAW.lib;TKToolsDraw.lib;TKTopAlgo.lib;TKTopTest.lib;TKTreeModel.lib;TKV3d.lib;TKVCAF.lib;TKView.lib;TKViewerTest.lib;TKVInspector.lib;TKVRML.lib;TKXCAF.lib;TKXDEDRAW.lib;TKXDEIGES.lib;TKXDESTEP.lib;TKXMesh.lib;TKXml.lib;TKXmlL.lib;TKXmlTObj.lib;TKXmlXCAF.lib;TKXSBase.lib;TKXSDRAW.lib
  • 創建occ運行的運行環境env.bat,可以參考occ中的custom.bat和evironment.bat

    set OCC_ROOT=F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\opencascade-7.2.0set path=%path%;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\opencascade-7.2.0\win64\vc10\bin;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\ffmpeg-3.3-lgpl-64\bin;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\freeimage-3.17.0-vc10-64\bin;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\freetype-2.5.5-vc10-64\bin;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\gl2ps-1.3.8-vc10-64\bin;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\tbb_2017.0.100\bin\intel64\vc10;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\tcltk-86-64\bin;F:\Project\occ\OpenCASCADE-7.2.0-vc10-64\vtk-6.1.0-vc10-64\bin
  • 創建visual studio 命令運行的啟動環境Start.bat:

    call %~dp0\env.batstart "E:\Program Files (x86)\vs2010\Common7\IDE\devenv.exe" %~dp0\examples\OccEditor\OccEditor.sln

    重新運行Start.bat啟動IDE。

搭建occ和MFC框架結合代碼

  • 在stdafx.h中添加部分頭文件:

    #pragma warning( disable : 4244 ) // Issue warning 4244#include <Standard_ShortReal.hxx>#pragma warning( default : 4244 ) // Issue warning 4244#include <Standard.hxx>#include <Aspect_DisplayConnection.hxx>#include <AIS_InteractiveContext.hxx>#include <AIS_Shape.hxx>#include <AIS_Point.hxx>#include <V3d_Viewer.hxx>#include <V3d_View.hxx>#include <OpenGl_GraphicDriver.hxx>#include <WNT_Window.hxx>#include <Standard_ErrorHandler.hxx>
  • 在occEditor.h中定義圖形設備環境變量

    public:Handle_Graphic3d_GraphicDriver GetGraphicDriver() const; private:Handle_Graphic3d_GraphicDriver m_hGraphicDriver;
  • 在occEditor.cpp 中實現函數 GetGraphicDriver()及初始化變量

    Handle_Graphic3d_GraphicDriver COccEditorApp::GetGraphicDriver() const{return m_hGraphicDriver;}
  • 在BOOL COccEditorApp::InitInstance()中初始化變量:

    // init occtry{Handle(Aspect_DisplayConnection) aDisplayConnection;m_hGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection);}catch(Standard_Failure){AfxMessageBox (_T("Fatal error during graphic initialization"), MB_ICONSTOP);ExitProcess(1);}

    此時編譯可能出現錯誤:

    1>OccEditor.cpp(115): error C2661: “Standard_Transient::operator new”: 沒有重載函數接受 3 個參數

    需要在OccEditor.cpp 注釋掉如下New的重載聲明,其他文件中的也需要注釋掉。

    //#ifdef _DEBUG//#define new DEBUG_NEW//#endif
  • 創建Viewer對象

    • 在occEditorDoc.h中聲明:

      public:
      Handle(V3d_Viewer) GetViewer(){ return m_hViewer;}
      Handle(AIS_InteractiveContext) GetAISContext(){ return m_hAISContext;}

      BOOL InitOCC();

      private:
      Handle(V3d_Viewer) m_hViewer;
      Handle(AIS_InteractiveContext) m_hAISContext;

    • 在對于cpp中實現相關代碼:

      BOOL COccEditorDoc::InitOCC(){Handle(Graphic3d_GraphicDriver) aGraphicDriver = ((COccEditorApp*)AfxGetApp())->GetGraphicDriver();m_hViewer = new V3d_Viewer(aGraphicDriver); m_hViewer->SetDefaultLights();m_hViewer->SetLightOn();//myViewer->SetDefaultBackgroundColor(Quantity_NOC_BLUE1);//改變背景顏色m_hAISContext =new AIS_InteractiveContext(m_hViewer); //創建一個交互文檔//m_hAISContext->DefaultDrawer()->UIsoAspect()->SetNumber(11);//m_hAISContext->DefaultDrawer()->VIsoAspect()->SetNumber(11);//這里設置實體的顯示模式m_hAISContext->SetDisplayMode(AIS_Shaded,Standard_True);m_hAISContext->SetAutomaticHilight(Standard_False);return TRUE;}
    • 在NewDocument中調用InitOcc()函數

      BOOL COccEditorDoc::OnNewDocument(){if (!CDocument::OnNewDocument())return FALSE;InitOCC();return TRUE;}
  • 在COccEditorView類中實現可視化組件的創建

    • OccEditorView.h 中聲明變量:

      private:Handle_V3d_View m_hView;Standard_Boolean m_bHlrModeIsOn;public:virtual void OnInitialUpdate();void FitAll();
    • OccEditorView.cpp中初始化及創建FitAll函數,OnInitialUpdate函數

      void COccEditorView::OnInitialUpdate(){CView::OnInitialUpdate();m_bHlrModeIsOn = Standard_False;m_hView = GetDocument()->GetViewer()->CreateView();m_hView->SetComputedMode(m_bHlrModeIsOn);Handle(Graphic3d_GraphicDriver) graphicDriver = ((COccEditorApp*)AfxGetApp())->GetGraphicDriver();Handle(WNT_Window) hWntWindow = new WNT_Window(GetSafeHwnd());m_hView->SetWindow(hWntWindow);if (!hWntWindow->IsMapped()) {hWntWindow->Map();}hWntWindow->SetBackground(Quantity_NOC_SLATEBLUE2);// 構建OpenCaseCade坐標軸m_hView->ZBufferTriedronSetup(Quantity_NOC_RED, Quantity_NOC_GREEN, Quantity_NOC_BLUE1, 0.8, 0.05, 12);m_hView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.2, V3d_ZBUFFER);FitAll();}void COccEditorView::FitAll() { if (!m_hView.IsNull()) m_hView->FitAll();m_hView->ZFitAll();}

至此,一個最簡單的occ+MFC框架已經搭建完畢:

繪制簡單的幾何體

  • 添加MFC菜單
    打開資源管理器中Ribbon資源,添加一個類別,在在類別的面板中添加一個名為sphere的按鈕

  • 添加消息響應
    鼠標右鍵,在COccEditorView類添加消息響應代碼:

    void COccEditorView::OnSphere(){DrawSphere(6);}
  • 添加DrawSphere繪制函數實現代碼:

  • void COccEditorView::DrawSphere(float radius){BRepPrimAPI_MakeSphere mkSphere(radius);TopoDS_Shape Sphere = mkSphere.Shape();Handle(AIS_Shape) myAISSphere = new AIS_Shape(Sphere);GetDocument()->GetAISContext()->Display(myAISSphere, Standard_False);FitAll();}
  • 最終效果

其他功能

  • 添加鼠標旋轉場景
    添加MFC鼠標左鍵拖動事件:

    void COccEditorView::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息處理程序代碼和/或調用默認值CView::OnMouseMove(nFlags, point);if(nFlags && MK_LBUTTON){ //myView->Rotate(point.x,point.y); m_hView->Rotation(point.x,point.y); }
  • 坐標軸出現閃爍

    添加此處代碼,法線坐標軸出現頻繁閃爍,跟蹤代碼也沒有找到好的辦法,原因是鼠標mosemove事件內部調用view::Rotation,該函數內部每次調用圖形刷新,此方法在mousemove直接調用不可取,會頻繁觸發更新申請,以后有時間再解決。

后記

到目前,也僅僅是開了個occ學習的頭,看了些資料對基礎的數據組織,創建還沒有深入。但本著興趣去學習,定會一天天進步。后續希望將界面和上層功能進行分離,包裝occ功能,實現數據抽象,否則,代碼都寫到MFC代碼中,太過凌亂。

總結

以上是生活随笔為你收集整理的OCCT学习003-----MFC单文档工程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。