OCC-7.6.0 + MFC单文档应用入门教程
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单文档应用入门教程相关推荐
- VC6.0 MFC 单文档 机器人巡检
机器人巡检 一.整体框架 主要包括三个类:场景类(CChangJing):机器人类(小车(CCar).无人机(CWuRenJi)):煤气泄露类(CMeiQiXieLou). 二.场景类 目标主要是数据 ...
- VC6.0 MFC 单文档 五子棋游戏 基础入门
五子棋游戏 一.整体思路 1.目的:通过五子棋,掌握面向对象的思想,这是我们的目的.提升分析问题.解决问题的能力,在做项目之前要有一个系统的思路,第一步干什么,第二步干什么-- 2.思路:拿到这个问题 ...
- 从0开始创建一个MFC单文档工程
MFC单文档快速入门教程 开发环境 win7+vs2019 如何创建一个新的MFC单文档项目 如何创建菜单添加点击事件 创建菜单我的->测试的菜单 修改测试的菜单ID为ID_MY_TEST如下 ...
- MFC单文档框架编程(二): SDI框架下的消息处理
MFC单文档框架编程(一) ...................................................................................... ...
- VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...
1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...
- 【数字图像处理】 二.MFC单文档分割窗口显示图片
本文是讲述<数字图像处理>系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程 ...
- OpenGL MFC单文档 实现轨迹球
OpenGL MFC单文档 实现轨迹球 前言:我是一个怀揣着伟大梦想的普通男生!结果就是,一有时间就幻想着自己的伟大梦想,忘了自己下一步该迈出左脚还是右脚.这不,只顾做梦了,时光可不管我,独自一个人走 ...
- MFC单文档之给主窗口添加背景图片
MFC单文档之给主窗口添加背景图片 1.导入图片 选择一个bmp格式的图片,将其导入到res文件夹中,然后工程资源目录下导入此图,注意格式一定要确定是百分百bmp格式的,不然报错,有的图片很坑是假bm ...
- 用MFC单文档改写ARToolKit5.4的例子simpleLite
RToolkit5.4自带的示例是控制台程序,用MFC单文档改写过程如下: 1.开发环境 Win10,VS2017,ARToolkit5.4 2.新建MFC单文档程序Test 在类向导中,为CTest ...
最新文章
- 玩远程 可视对讲系统几大新兴应用分析
- Dell服务器RAID常用管理命令总结 linux
- Elasticsearch Java API 的使用—多条件查询
- 牛客假日团队赛10 L	乘积最大 (dp,大数)
- Smark.Data 1.5更新详解
- C++大小写字母互转
- 常用Oracle分析函数详解
- 自定义条件查询_跟我学shardingjdbc之自定义分库分表策略-复合分片算法自定义实现...
- 开源博客网站搭建之Catfish
- 使用EasyCHM生成CHM文档
- 深度学习:马尔可夫随机场
- java 死循环排查_java2如何排查线上死循环
- Kubuntu终端中文显示一半解决办法
- python实用贺卡制作
- 3、管理员添加内容的实现
- python批量测试网站加载时间_python测试网站访问速度
- vue中实现生成海报图片html2canvas详细教程
- 信息检索——名词解释、简答题
- oracle exists
- (四)python网络爬虫(理论+实战)——发送请求
热门文章
- asp.net网站修改aspx.cs文件后如何不替换网站就生效
- ModuleNotFoundError: No module named 'torch'(anaconda安装好Pytorch却无法在Jupyter notebook使用)
- Flask开发微电影网站(一)
- 谷歌超级机器人, 许多餐馆已经通过网络进行预订
- 暗影格斗3服务器响应比预期,暗影格斗3代码问题导致无法正常游戏
- 李建忠老师-设计模式
- 【网络流】【二分图最大匹配】Buaacoding1043 难题·Beihang Couple Pairing Comunity 2017
- CPU频率是什么?主频、睿频和超频哪个更重要?
- 虚拟服务器 vmotion,VMotion简单步骤
- 达内python 资源_Python学习资源整理,优质Python学习资源推荐