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单文档工程相关推荐

  1. 从0开始创建一个MFC单文档工程

    MFC单文档快速入门教程 开发环境 win7+vs2019 如何创建一个新的MFC单文档项目 如何创建菜单添加点击事件 创建菜单我的->测试的菜单 修改测试的菜单ID为ID_MY_TEST如下 ...

  2. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

    MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...

  3. 【数字图像处理】 二.MFC单文档分割窗口显示图片

    本文是讲述<数字图像处理>系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程 ...

  4. OCC-7.6.0 + MFC单文档应用入门教程

    OCC-7.6.0 + MFC单文档应用 入门教程 磨刀不误砍柴工,如果你对MFC没任何基础,请先读这篇MFC的入门基础,它会降低你对这篇文章的恐惧感 开发环境说明 win7+ opencascade ...

  5. MFC单文档项目动态绘制十字线

    MFC单文档项目动态绘制十字线 因为最近的一个项目涉及到了这方面的内容,所以基于自己已学的知识,在网上搜索了许多相关的资料,这些资料各有可取之处,但相对来说比较杂散,不够凝练.在经过一番整理及代码实践 ...

  6. MFC单文档及其简介

    MFC单文档及其简介 MFC 是一个编程框架 MFC 中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来 建立Windows 下的应用程序.MFC 框架定义了应用程序的轮廓,并 ...

  7. MFC单文档程序响应菜单消息的顺序

    在MFC中,新建一个单文档应用程序,将生成四个类: 在消息传递过程中,一般对于单文档类来说,对菜单的响应顺序是View类 --- Doc类---- MainFrame----- App: 新建一个单文 ...

  8. MFC单文档框架编程(二): SDI框架下的消息处理

    MFC单文档框架编程(一) ...................................................................................... ...

  9. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...

    1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...

最新文章

  1. RFID助力汽车零部件厂商识别冲压工具位置
  2. 在VS2008中使用Qt编程
  3. 2021年江苏高考各科成绩查询,江苏2021年高考总分及各科分数
  4. Nmap渗透测试详解(一)
  5. ubantu系统之快捷键使用
  6. 【转】Linux内存管理(最透彻的一篇)
  7. 9.Linux 高性能服务器编程 --- IO 复用
  8. 在Colaboratory中使用ImageAI训练自己的数据集
  9. matlab画伯德图(带谐振点和-3dB带宽)
  10. Jmeter循环获取JDBC查询结果及断言数据库查询结果
  11. 深入理解MATLAB中contour函数
  12. 整顿风暴后网址导航将何去何从 如何孕育重生
  13. 根据收入计算纳税和税后所得
  14. Comet OJ-2019国庆欢乐赛
  15. nvm管理node版本的使用方法和常用指令
  16. 百度京东加持的新潮传媒 已成为分众传媒最大的敌人
  17. “绿色低碳+数字孪生“双轮驱动,解码油气管道站升级难点 | 图扑软件
  18. 求一元二次方程的根 java
  19. Neutron的VLAN实现模型
  20. 华为软件下载方法(不限权限任意下载)

热门文章

  1. springmvc @RequestMapping
  2. BigBrother的大数据之旅Day 11 hive(2)
  3. 需求规格说明书RUP版
  4. 顺丰bsp系统 java_顺丰BSP订单号查询接口SOAP的请求示例
  5. JAVA外卖项目第一天 技术选型和包结构
  6. 嵌入式系统设计与应用
  7. Mac M1芯片安装 MySQL
  8. 回顾:Java影响者考虑了Java 11和JDK的状态
  9. Linux部署IPFS(分布式存储系统)私有网络
  10. 8DOER: Dual Cross-Shared RNN for Aspect Term-Polarity Co-Extraction(2020.10.22)