下面,本教程将介绍如何在MFC下打开vtk文件,最终的效果如图所示:

如果你看过一些三维重建相关的论文,那么一定对这个图像很熟悉。很多论文都会以这个图像作为例子讲解,好了,闲话少说,直接讲实现。
早期的vtk版本(比如vtk5.x.x),example里面自带MFC的三个例子(对话框,单文档,多文档),不知为何现在的新版本删除了,不过没有关系,重新实现一遍就行了,代码也不多。
首先,你需要保证你的vs2017能够创建MFC项目,如果不能,可以通过
visual studio installer安装,具体过程,请百度,这里不再赘述。
我们先来建立一个MFC应用程序,暂且命名为“vtkdlg”,后续将以这个名称产生的代码来讲解:

点击确认,然后选择“基于对话框”,点击“完成”:

VTK是使用C++编写的,要使用VTK需要包含VTK发布的头文件,我们直接在vtkdlgDlg.h文件中添加以下代码:

#include "vtkDataSetMapper.h"
#include "vtkDataSetReader.h"
#include "vtkActor.h"
#include "vtkMFCWindow.h"
#include "vtkRenderer.h"
#include "vtkProperty.h"
#include "vtkWin32OpenGLRenderWindow.h"

点击“生成”,哎呀,找不到头文件!还记得教程1里面有个vtk-prefix文件夹吗?里面放着有,点击“项目”–>属性–>VC++目录–>包含目录,示意图如下:

修改确认后,再点击“生成”,成功了!
接下来,开始撸代码,在vtkdlgDlg.h头文件的CvtkdlgDlg类中添加以下代码,具体作用等写完所有代码后一并分析:

public:CString input_path;vtkMFCWindow* pvtkMFCWindow;vtkActor* pvtkActor;vtkDataSetMapper* pvtkDataSetMapper;vtkDataSetReader* pvtkDataSetReader;vtkRenderer* pvtkRenderer;vtkRenderWindow* pvtkRenderWindow;POINT ptBorder;void execute_pipeline();

在vtkdlgDlg.cpp文件中,找到CvtkdlgDlg的构造函数,修改如下:

CvtkdlgDlg::CvtkdlgDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_VTKDLG_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);this->pvtkActor = vtkActor::New();this->pvtkDataSetMapper = vtkDataSetMapper::New();this->pvtkDataSetReader = nullptr;this->pvtkRenderer = vtkRenderer::New();this->pvtkMFCWindow = nullptr;this->ptBorder = CPoint(0, 0);
}

在vtkdlgDlg.cpp中添加execute_pipeline函数的实现:

void CvtkdlgDlg::execute_pipeline()
{if (this->pvtkDataSetReader){this->pvtkDataSetMapper->SetInputConnection(this->pvtkDataSetReader->GetOutputPort());this->pvtkActor->SetMapper(this->pvtkDataSetMapper);this->pvtkActor->GetProperty()->SetColor(0.0, 0.0, 1.0);this->pvtkRenderer->SetBackground(1.0, 1.0, 1.0);this->pvtkRenderer->AddActor(this->pvtkActor);}else{this->pvtkRenderer->SetBackground(1.0, 1.0, 1.0);}this->pvtkRenderer->ResetCamera();
}

在CvtkdlgDlg::OnInitDialog()函数中添加以下代码,这部分代码写在//TODO后,return TRUE之前:

// TODO: 在此添加额外的初始化代码this->pvtkMFCWindow = new vtkMFCWindow(this->GetDlgItem(IDC_STATIC));CRect cRectClient;this->pvtkMFCWindow->GetClientRect(&cRectClient);this->pvtkMFCWindow->GetRenderWindow()->AddRenderer(this->pvtkRenderer);execute_pipeline();

下面切换到“资源视图”,我们来编辑对话框,只需要两步,很简单。
(1)删除其余控件,只留下“确认”,把“确认”改成“打开”。
(2)添加一个Picture Control空间。
这一步的效果图如下:

双击“打开”按钮,修改为以下代码,并在文件开头添加包含头文件#include string:

void CvtkdlgDlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码//CDialogEx::OnOK();CString sz = _T("MyType Files (*.vtk)|*.vtk");CFileDialog dlg(true, _T(".*"), NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, sz, this);if (IDOK == dlg.DoModal()){this->input_path = dlg.GetPathName();UpdateData(false);this->pvtkRenderer->RemoveActor(this->pvtkActor);std::string str(CT2A(dlg.GetPathName()));if (!this->pvtkDataSetReader)this->pvtkDataSetReader = vtkDataSetReader::New();this->pvtkDataSetReader->SetFileName(str.c_str());execute_pipeline();if (this->pvtkMFCWindow)this->pvtkMFCWindow->RedrawWindow();}
}

然后在类向导里面重载虚函数PostNcDestory,添加OnDestory的消息处理


代码修改如下:

void CvtkdlgDlg::PostNcDestroy()
{// TODO: 在此添加专用代码和/或调用基类delete this;CDialogEx::PostNcDestroy();
}void CvtkdlgDlg::OnDestroy()
{CDialogEx::OnDestroy();// TODO: 在此处添加消息处理程序代码if (this->pvtkMFCWindow != nullptr)delete this->pvtkMFCWindow;this->pvtkRenderer->Delete();this->pvtkDataSetMapper->Delete();if (this->pvtkDataSetReader != nullptr)this->pvtkDataSetReader->Delete();this->pvtkDataSetReader = nullptr;this->pvtkActor->Delete();
}

主要代码已经写好了,再次点击“生成”。完了!有一大堆无法解析的外部符号。再次回到之前的vtk-prefix文件夹,里面有lib库。点击“项目”–>属性–>链接器–>输入–>附件依赖项,将所有的lib都添加,用通配符的写法就是*.lib:

依旧没有解决问题,其实这里需要编译64位的版本,如下修改即可:

好了,编译成功!我们来运行一下,失败了,没完没了吗!在这里还有最后一步,将vtk-prefix文件夹中的bin文件夹下的所有dll文件拷贝到编译工程下即可,另外还有一个中方法,拷贝到system路径下(这种方式会对所有的程序都生效),我使用的是拷贝到编译工程下:

再次运行,弹出了错误,这已经不是代码的问题了,是新版本的vtk代码还需要有一个环境初始化过程,在以前的版本(5.x.x)是没有这个问题的,在vtkdlgDlg.h文件中添加以下代码:

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

最后,你可能还会遇到依旧不能运行的情况,如果单步执行下去,定位到是这行代码出问题:

this->pvtkMFCWindow = new vtkMFCWindow(this->GetDlgItem(IDC_STATIC));

可以进行如下修改:

修改成“使用多字节字符集”。
再次运行,you got it!

怎么和说好的不一样,那是还没有打开文件,限于篇幅太长,讲在下一讲打开文件和分析代码。
更多VTK教程,请VX搜索CodeKit。

VTK教程3--------打开vtk文件相关推荐

  1. VTK教程系列:VTK基础及应用开发教程

    由于OpenCV不能使用,只能使用VTK库的图像处理库,暂时还没有找到其他可以全面替代的库: CSDN东灵工作室:http://blog.csdn.net/www_doling_net/article ...

  2. 文件标识符必须为双精度类型的整数值标量_【翻译】VTK官方文档 - vtk文件格式

    本文翻译自vtk官方文档:vtk_file_format 文末有链接 VTK提供了许多源对象和编写器对象,用于读取和写入流行的数据文件格式,此外,VTK也提供了自己的文件格式.创建一种数据文件格式的主 ...

  3. XamarinSQLite教程Xamarin.iOS项目中打开数据库文件

    XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...

  4. 如何打开电脑就自动显示html文件,电脑教程:Win10怎么打开html文件

    很多的用户沉浸在了win10的幸福之中,但是也有些许的遗憾:那就是电脑上装的浏览器多了,Html文件以及网页快捷方式等都改变了,不是我们熟悉的IE了,那该怎么办呢?Win10怎么打开html文件?今天 ...

  5. python vtk dicom_Python vtk读取并显示dicom文件示例

    因为做项目的原因,所以接触到了医学图像dicom文件.vtk刚开始看,这里仅仅只是其最简单的读取显示功能.此处用到了vtk库,可自行百度安装方法. 下面附上代码: from vtk import * ...

  6. Mac系统如何运行Windows exe程序?mac打开exe文件方法教程

    使用了Mac系统之后,总会惦记着Windows系统的软件,无奈两个系统的程序文件不一样,所以也互不相通.为了让MacBook能够使用上Windows的应用程序,许多人都会给电脑安装一个Windows系 ...

  7. IPhone手机打开EPUB文件教程

    IPhone手机打开EPUB文件教程 EPUB是一种电子图书标准,IPhone因为其系统的特殊性,可能很多用户在面对EPUB文件时比较迷茫,不知道改如何打开,所以本文就教你如何IPhone移动平台下打 ...

  8. aspx文件怎么用服务器打开,高手教你轻松打开ASPX文件【图文教程】

    电脑下载ASPX文件却不知道该如何打开?由于ASPX文件比较少见,所以部分电脑小白看到此文件都不清楚怎么打开?ASPX文件是一种Web文件,它是网站的网页源文件,里面全是代码,一般可以用记事本直接打开 ...

  9. mysql在电脑怎么打开_电脑系统教程_电脑sql文件用什么打开

    SQL是一种高级的非过程化的编程语言,sql文件其实和Office Access文件差不多,SQL是数据库服务器和客户端的连接重要工具,而Access本机上用的比较多.sql文件作为数据库脚本文件,如 ...

最新文章

  1. python学起来难不难-新手学python数据分析难不难?
  2. information_schema中的所有表和视图
  3. python识别pdf文字_Python 神工具包!翻译、文字识别、语音转文字统统搞定
  4. angularjs获取php数据类型,利用Angularjs从PHP读取后台数据
  5. Win-MASM64汇编语言-PTR运算符
  6. 【python】为本地乌云漏洞库/知识库生成目录
  7. 算法 Tricks(五)—— 二进制逻辑运算
  8. 手机上有没有学python的软件-盘点几个在手机上可以用来学习编程的软件
  9. Windows下安装和配置Java JDK
  10. Cephalocon 2020首尔峰会取消
  11. java 生成拼音首字母_java 根据汉字生成拼音全拼或拼音首字母的示例
  12. MOSFET的雪崩特性
  13. 木瓜奇迹洗服务器维护,木瓜奇迹各种职业+点法
  14. 浮点型数据单片机传输
  15. 如何用Python从海量文本抽取主题?【转载:王树义】
  16. 华为机试HJ96:表示数字
  17. Gitee码云仓库操作步骤---忘了就来看看
  18. Linux系统新增磁盘初始化及挂载
  19. 美国秘密命令谷歌、微软和雅虎交出搜索指定关键词的人员信息
  20. GitHub与Android安装初体验(md版本)

热门文章

  1. 记nexus2升级nexus3数据迁移
  2. Java程序员学习资料分享,等你来收藏!
  3. 有限差分法matlab两点边值代码,两点边值问题的有限差分法.doc
  4. npm ERR gyp verb `which` failed Error: not found: python2
  5. 吊打面试官系列之:进阶必会Docker命令大全,怎么跟我想象的不一样,简直太easy了。
  6. Python 连接 ftp 服务器操作
  7. 告别App,数字人民币钱包来了
  8. java将包含unicode的字符串转换成中文汉字
  9. js判断手机端还是电脑PC端(以及注意事项)
  10. 如何判断是手机端还是PC端?