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单文档工程相关推荐
- 从0开始创建一个MFC单文档工程
MFC单文档快速入门教程 开发环境 win7+vs2019 如何创建一个新的MFC单文档项目 如何创建菜单添加点击事件 创建菜单我的->测试的菜单 修改测试的菜单ID为ID_MY_TEST如下 ...
- MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...
- 【数字图像处理】 二.MFC单文档分割窗口显示图片
本文是讲述<数字图像处理>系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程 ...
- OCC-7.6.0 + MFC单文档应用入门教程
OCC-7.6.0 + MFC单文档应用 入门教程 磨刀不误砍柴工,如果你对MFC没任何基础,请先读这篇MFC的入门基础,它会降低你对这篇文章的恐惧感 开发环境说明 win7+ opencascade ...
- MFC单文档项目动态绘制十字线
MFC单文档项目动态绘制十字线 因为最近的一个项目涉及到了这方面的内容,所以基于自己已学的知识,在网上搜索了许多相关的资料,这些资料各有可取之处,但相对来说比较杂散,不够凝练.在经过一番整理及代码实践 ...
- MFC单文档及其简介
MFC单文档及其简介 MFC 是一个编程框架 MFC 中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来 建立Windows 下的应用程序.MFC 框架定义了应用程序的轮廓,并 ...
- MFC单文档程序响应菜单消息的顺序
在MFC中,新建一个单文档应用程序,将生成四个类: 在消息传递过程中,一般对于单文档类来说,对菜单的响应顺序是View类 --- Doc类---- MainFrame----- App: 新建一个单文 ...
- MFC单文档框架编程(二): SDI框架下的消息处理
MFC单文档框架编程(一) ...................................................................................... ...
- VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...
1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...
最新文章
- RFID助力汽车零部件厂商识别冲压工具位置
- 在VS2008中使用Qt编程
- 2021年江苏高考各科成绩查询,江苏2021年高考总分及各科分数
- Nmap渗透测试详解(一)
- ubantu系统之快捷键使用
- 【转】Linux内存管理(最透彻的一篇)
- 9.Linux 高性能服务器编程 --- IO 复用
- 在Colaboratory中使用ImageAI训练自己的数据集
- matlab画伯德图(带谐振点和-3dB带宽)
- Jmeter循环获取JDBC查询结果及断言数据库查询结果
- 深入理解MATLAB中contour函数
- 整顿风暴后网址导航将何去何从 如何孕育重生
- 根据收入计算纳税和税后所得
- Comet OJ-2019国庆欢乐赛
- nvm管理node版本的使用方法和常用指令
- 百度京东加持的新潮传媒 已成为分众传媒最大的敌人
- “绿色低碳+数字孪生“双轮驱动,解码油气管道站升级难点 | 图扑软件
- 求一元二次方程的根 java
- Neutron的VLAN实现模型
- 华为软件下载方法(不限权限任意下载)
热门文章
- springmvc @RequestMapping
- BigBrother的大数据之旅Day 11 hive(2)
- 需求规格说明书RUP版
- 顺丰bsp系统 java_顺丰BSP订单号查询接口SOAP的请求示例
- JAVA外卖项目第一天 技术选型和包结构
- 嵌入式系统设计与应用
- Mac M1芯片安装 MySQL
- 回顾:Java影响者考虑了Java 11和JDK的状态
- Linux部署IPFS(分布式存储系统)私有网络
- 8DOER: Dual Cross-Shared RNN for Aspect Term-Polarity Co-Extraction(2020.10.22)