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:
BOOL InitOCC();
Handle(V3d_Viewer) GetViewer(){ return m_hViewer;}
Handle(AIS_InteractiveContext) GetAISContext(){ return m_hAISContext;}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的按鈕
-
添加消息響應
void COccEditorView::OnSphere(){DrawSphere(6);}
鼠標右鍵,在COccEditorView類添加消息響應代碼: -
添加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();}
-
最終效果
其他功能
-
添加鼠標旋轉場景
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); }
添加MFC鼠標左鍵拖動事件: -
坐標軸出現閃爍
添加此處代碼,法線坐標軸出現頻繁閃爍,跟蹤代碼也沒有找到好的辦法,原因是鼠標mosemove事件內部調用view::Rotation,該函數內部每次調用圖形刷新,此方法在mousemove直接調用不可取,會頻繁觸發更新申請,以后有時間再解決。
后記
到目前,也僅僅是開了個occ學習的頭,看了些資料對基礎的數據組織,創建還沒有深入。但本著興趣去學習,定會一天天進步。后續希望將界面和上層功能進行分離,包裝occ功能,實現數據抽象,否則,代碼都寫到MFC代碼中,太過凌亂。
總結
以上是生活随笔為你收集整理的OCCT学习003-----MFC单文档工程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CS信息系统建设和服务认证都有哪些等级?
- 下一篇: 常见的非关系型数据库(非RDBMS)