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

磨刀不误砍柴工,如果你对MFC没任何基础,请先读这篇MFC的入门基础,它会降低你对这篇文章的恐惧感

开发环境说明

win7+ opencascade-7.6.0+vs2019
最终成果如下:

先来个餐前甜点

opencasecade-7.6.0安装完成后,进入opencasecade-7.6.0目录,如下

不知道如何安装,请点击这里有完整教程

各目录的功能如下所示:

adm目录:包含编译OCCT的相关工程;
adm/cmake目录:包含使用CMake构建OCCT的相关处理脚本;
adm/msvc目录:包含window平台 Visual C++ 2010, 2012, 2013, 2015, 2017 and 2019等版本的32/64平台solutinon文件;
data目录: 包含用于OCCT功能测试的CAD文件
doc目录:包含OCCT的html和pdf格式帮助文档;
dox目录:包含了基于MarkDown文件格式的文本文档;
inc目录:OCCT头文件依赖;
samples目录:OCCT示例项目;
src目录:OCCT源码目录;
tests目录:包含测试脚本文件
tools目录:包含Inspector工具的源码.
win64/vc10目录:包含window平台预编译的可执行程序和lib库;
gendoc.bat: 将occt的Markdown格式文件编译为html格式
inspector.bat occinspector工具运行环境
msvc.bat: visual studio编译工程和运行环境
draw.bat: draw工具运行环境

我们可以进行测试一下,运行draw.bat 出现两个窗口如下图


一个是cmd命令窗口,一个 Draw窗口
在cmd命令窗口输入

pload DEFAULT
axo # 显示三维辅助视图,出现三维坐标架


继续输入命令

box b -10 -10 -10 10 10 10 # 显示一个小立方体网格
fit # 调整最佳观察位置

开始创建MFC项目

step.1 创建项目

step.2 开发环境配置

设置为x64位,如下图

设置项目的包含目录库目录
包含目录在OpenCASCADE-7.6.0-vc14-64/opencascade-7.6.0/inc 将完整路径添加到 包含目录
库目录在OpenCASCADE-7.6.0-vc14-64\opencascade-7.6.0\win64\vc14\lib将完整路径添加到库目录
如下图

然后在连接器,找到输入的 附加依赖项 ,设置附加依赖项

添加如下lib文件名

TKBin.lib;
TKBinL.lib;
TKBinTObj.lib;
TKBinXCAF.lib;
TKBO.lib;
TKBool.lib;
TKBRep.lib;
TKCAF.lib;
TKCDF.lib;
TKD3DHost.lib;
TKD3DHostTest.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;
TKMessageModel.lib;
TKMessageView.lib;
TKOffset.lib;
TKOpenGl.lib;
TKOpenGles.lib;
TKOpenGlesTest.lib;
TKOpenGlTest.lib;
TKPrim.lib;
TKQADraw.lib;
TKRWMesh.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;

打开OpenCASCADE-7.6.0-vc14-64\opencascade-7.6.0\win64\vc14\lib目录,在该目录下打开cmd,执行dir /b>libName.txt,打开该文件,即可得到上面的所有依赖名,复制后粘贴到附加依赖项

添加头文件stdafx.h,但是好像并没有stdafx.h的头文件,我们可以把occt的相关头文件放在pch.h

VS2017开始,stdafx.h改名叫pch.h了

step.3 pch.h头文件

/* occt demo include - start */
#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>
#include <BRepPrimAPI_MakeSphere.hxx>
/* occt demo include - end */

step.4 OCCmfc.h及OCCmfc.cpp

接着在OCCmfc.h的文件类中,添加如下代码

protected:Handle(Graphic3d_GraphicDriver) m_GraphicDriver;
public:Handle(Graphic3d_GraphicDriver) GetGraphicDriver() { return m_GraphicDriver; }

ps: 这里的OCCmfc为项目名,注意自己创建的项目名

OCCmfc.cpp中的构造函数COCCmfcApp::COCCmfcApp() noexcept中,添加如下代码

    try {Handle(Aspect_DisplayConnection) aDisplayConnection;m_GraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection);}catch (Standard_Failure) {AfxMessageBox(L"(Error Ocured in Initializing the Opencascade graphic variable.)");}

注意,如果出现new报错,则需要文件头部的如下代码注释

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

step.5 OCCmfcDoc.h及OCCmfcDoc.cpp

然后在OCCmfcDoc.h中的类中添加如下声明

public:Handle(V3d_Viewer) GetViewer(void) { return myViewer; }
protected:Handle(AIS_InteractiveContext) myAISContext;Handle(V3d_Viewer) myViewer;

OCCmfcDoc.cpp中的构造函数``中添加如下代码

COCCmfcDoc::COCCmfcDoc() noexcept
{// TODO: 在此添加一次性构造代码Handle(Graphic3d_GraphicDriver) theGraphicDriver = ((COCCmfcApp*)AfxGetApp())->GetGraphicDriver();myViewer = new V3d_Viewer(theGraphicDriver);myViewer->SetDefaultLights();myViewer->SetLightOn();//myViewer->SetDefaultBackgroundColor(Quantity_NOC_BLUE1);//改变背景颜色myAISContext = new AIS_InteractiveContext(myViewer);  // 创建一个交互文档// 设置实体的显示模式myAISContext->SetDisplayMode(AIS_Shaded, true);myAISContext->SetAutomaticHilight(Standard_False);
}

step.6 OCCmfcView.h及OCCmfcView.cpp

最后在OCCmfcView.h中添加如下声明

public:virtual void OnInitialUpdate();
protected:Handle(V3d_View) myView;

OCCmfcView.cpp中重写OnInitialUpdate函数,如下所示:

void COCCmfcView::OnInitialUpdate() {myView = GetDocument()->GetViewer()->CreateView();myView->SetShadingModel(V3d_GOURAUD);Handle(Graphic3d_GraphicDriver) theGraphicDriver = ((COCCmfcApp*)AfxGetApp())->GetGraphicDriver();Aspect_Handle aWindowHandle = (Aspect_Handle)GetSafeHwnd();Handle(WNT_Window) aWntWindow = new WNT_Window(GetSafeHwnd());myView->SetWindow(aWntWindow);if (!aWntWindow->IsMapped()) {aWntWindow->Map();}Standard_Integer w = 100;Standard_Integer h = 100;aWntWindow->Size(w, h);::PostMessage(GetSafeHwnd(), WM_SIZE, SIZE_RESTORED, w + h * 65536);myView->FitAll();myView->ZBufferTriedronSetup(Quantity_NOC_RED, Quantity_NOC_GREEN, Quantity_NOC_BLUE1, 0.8, 0.05, 12);myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.2, V3d_ZBUFFER);
}

并在OnDraw()函数中,添加如下代码

myView->MustBeResized();
myView->Update();

F5运行,得到如下结果,可以看到左下角的坐标系

开始绘制图形

step.7 OCCmfcDoc.h及OCCmfcDoc.cpp

首先在OCCmfcDoc.h中声明如下方法

void CmOCCTDoc::DrawSphere(double Radius);

OCCmfcDoc.cpp中定义该方法

// 注意需要添加头文件
#include "OCCmfcView.h"void COCCmfcDoc::DrawSphere(double Radius)
{BRepPrimAPI_MakeSphere mkSphere(Radius);TopoDS_Shape Sphere = mkSphere.Shape();Handle(AIS_Shape) myAISSphere = new AIS_Shape(Sphere);myAISContext->Display(myAISSphere, Standard_False);CMDIFrameWnd* pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;CMDIChildWnd* pChild = (CMDIChildWnd*)pFrame->GetActiveFrame();COCCmfcView* pView = (COCCmfcView*)pChild->GetActiveView();pView->FitAll();
}

step.8 OCCmfcView.h及OCCmfcView.cpp

OCCmfcView.h中声明FitAll()方法

public:void FitAll();

并在OCCmfcView.cpp中定义

void COCCmfcView::FitAll()
{if (!myView.IsNull()) myView->FitAll();  myView->ZFitAll();
}

接在,在COCCmfcView::OnDraw()函数中,添加绘制球的方法,如下代码

pDoc->DrawSphere(6);

F5运行,即可得到如下图

添加鼠标监听事件,实现鼠标拖拽旋转

step.9 OCCmfcView.h及OCCmfcView.cpp

首先在OCCmfcView.h中添加声明

protected:afx_msg void OnMouseMove(UINT nFlags, CPoint point);

OCCmfcView.cpp中,添加监听事件并设置消息映射

BEGIN_MESSAGE_MAP(COCCmfcView, CView)
...
ON_WM_MOUSEMOVE()
...
END_MESSAGE_MAP()...void COCCmfcView::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultCView::OnMouseMove(nFlags, point);if (nFlags && MK_LBUTTON) {//myView->Rotate(point.x,point.y);myView->Rotation(point.x, point.y);}
}

完成!

OCC-7.6.0 + MFC单文档应用入门教程相关推荐

  1. VC6.0 MFC 单文档 机器人巡检

    机器人巡检 一.整体框架 主要包括三个类:场景类(CChangJing):机器人类(小车(CCar).无人机(CWuRenJi)):煤气泄露类(CMeiQiXieLou). 二.场景类 目标主要是数据 ...

  2. VC6.0 MFC 单文档 五子棋游戏 基础入门

    五子棋游戏 一.整体思路 1.目的:通过五子棋,掌握面向对象的思想,这是我们的目的.提升分析问题.解决问题的能力,在做项目之前要有一个系统的思路,第一步干什么,第二步干什么-- 2.思路:拿到这个问题 ...

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

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

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

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

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

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

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

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

  7. OpenGL MFC单文档 实现轨迹球

    OpenGL MFC单文档 实现轨迹球 前言:我是一个怀揣着伟大梦想的普通男生!结果就是,一有时间就幻想着自己的伟大梦想,忘了自己下一步该迈出左脚还是右脚.这不,只顾做梦了,时光可不管我,独自一个人走 ...

  8. MFC单文档之给主窗口添加背景图片

    MFC单文档之给主窗口添加背景图片 1.导入图片 选择一个bmp格式的图片,将其导入到res文件夹中,然后工程资源目录下导入此图,注意格式一定要确定是百分百bmp格式的,不然报错,有的图片很坑是假bm ...

  9. 用MFC单文档改写ARToolKit5.4的例子simpleLite

    RToolkit5.4自带的示例是控制台程序,用MFC单文档改写过程如下: 1.开发环境 Win10,VS2017,ARToolkit5.4 2.新建MFC单文档程序Test 在类向导中,为CTest ...

最新文章

  1. 玩远程 可视对讲系统几大新兴应用分析
  2. Dell服务器RAID常用管理命令总结 linux
  3. Elasticsearch Java API 的使用—多条件查询
  4. 牛客假日团队赛10 L 乘积最大 (dp,大数)
  5. Smark.Data 1.5更新详解
  6. C++大小写字母互转
  7. 常用Oracle分析函数详解
  8. 自定义条件查询_跟我学shardingjdbc之自定义分库分表策略-复合分片算法自定义实现...
  9. 开源博客网站搭建之Catfish
  10. 使用EasyCHM生成CHM文档
  11. 深度学习:马尔可夫随机场
  12. java 死循环排查_java2如何排查线上死循环
  13. Kubuntu终端中文显示一半解决办法
  14. python实用贺卡制作
  15. 3、管理员添加内容的实现
  16. python批量测试网站加载时间_python测试网站访问速度
  17. vue中实现生成海报图片html2canvas详细教程
  18. 信息检索——名词解释、简答题
  19. oracle exists
  20. (四)python网络爬虫(理论+实战)——发送请求

热门文章

  1. asp.net网站修改aspx.cs文件后如何不替换网站就生效
  2. ModuleNotFoundError: No module named 'torch'(anaconda安装好Pytorch却无法在Jupyter notebook使用)
  3. Flask开发微电影网站(一)
  4. 谷歌超级机器人, 许多餐馆已经通过网络进行预订
  5. 暗影格斗3服务器响应比预期,暗影格斗3代码问题导致无法正常游戏
  6. 李建忠老师-设计模式
  7. 【网络流】【二分图最大匹配】Buaacoding1043 难题·Beihang Couple Pairing Comunity 2017
  8. CPU频率是什么?主频、睿频和超频哪个更重要?
  9. 虚拟服务器 vmotion,VMotion简单步骤
  10. 达内python 资源_Python学习资源整理,优质Python学习资源推荐