VTK嵌入MFC同步显示
使用VTK嵌入MFC,实现四视图更新,机制和细节参考原文。
原文链接:http://blog.csdn.net/www_doling_net/article/details/8939115
原文代码:
#pragma once #include <vtkResliceCursor.h>
#include <vtkResliceCursorWidget.h> #include <vtkPlane.h>
#include <vtkPlaneSource.h>
#include <vtkPlaneWidget.h> #include <vtkImagePlaneWidget.h>
#include <vtkResliceCursorThickLineRepresentation.h>
#include <vtkResliceCursor.h> #include <vtkCommand.h>
#include <vtkViewport.h>
#include <vtkViewDependentErrorMetric.h> #include <vtkSmartPointer.h> #include <vtkRenderer.h>
#include <vtkRendererSource.h>
#include <vtkRenderingOpenGLModule.h>
#include <vtkRenderWindow.h>
#include <vtkWin32OpenGLRenderWindow.h>
#include <vtkWin32RenderWindowInteractor.h>
// CVtkView class CVtkView : public CStatic
{
DECLARE_DYNAMIC(CVtkView) public:
CVtkView();
virtual ~CVtkView(); public:
//3.2 重载CvtkView类PreSubclassWindow()函数和OnPaint()函数
//PreSubclassWindow函数负责创建VTK可视化管线,OnPaint()函数负责客户区内场景渲染。
//vtkAcor,vtkRenderer,vtkRenderWindow,vtkRenderWindowInteractor四个部分。当然根据需要还可以设置vtkRenderWindowInteractorStyle,以及光照,材质,颜色等。
//在CvtkView类头文件中定义相关对象,并在PreSubclassWindow函数中实例化和构建可视化管线
void PreSubclassWindow();
void SetImageData(vtkSmartPointer<vtkImageData> ImageData);
void SetupReslice(); private:
vtkSmartPointer< vtkImagePlaneWidget > m_ImagePlaneWidget;
vtkSmartPointer< vtkResliceCursorWidget> m_ResliceCursorWidget;
vtkSmartPointer< vtkResliceCursor > m_ResliceCursor;
vtkSmartPointer< vtkResliceCursorThickLineRepresentation > m_ResliceCursorRep; vtkSmartPointer<vtkRenderer> m_Renderer;
vtkSmartPointer<vtkRenderWindow> m_RenderWindow;
vtkSmartPointer<vtkImageData> m_ImageData; //m_Direction为方向标志,取值分别为0,1和2,分别代表X轴,Y轴和Z轴方向,
int m_Direction; protected:
DECLARE_MESSAGE_MAP()
};
原代码:
// VtkView.cpp : implementation file
// #include "stdafx.h"
#include "iisu2vrMfcs.h"
#include "VtkView.h" // CVtkView IMPLEMENT_DYNAMIC(CVtkView, CStatic) CVtkView::CVtkView()
{
//在实例化时需要注意,该视图类在默认情况下渲染的是vtkResliceCursorWidget对象的输出,
//因此需要为vtkResliceCursorWidget对象指定相应的vtkRenderer对象,
//m_ResliceCursorWidget->SetInteractor(m_RenderWindow->GetInteractor());
//m_ResliceCursorWidget->SetDefaultRenderer(m_Renderer);
} CVtkView::~CVtkView()
{
} void CVtkView::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CRect rect;
GetClientRect(rect); m_Renderer = vtkSmartPointer<vtkRenderer>::New();
m_RenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
m_RenderWindow->SetParentId(this->m_hWnd);
m_RenderWindow->SetSize(rect.Width(), rect.Height());
m_RenderWindow->AddRenderer(m_Renderer); if (m_RenderWindow->GetInteractor() == NULL)
{
vtkSmartPointer<vtkRenderWindowInteractor> RenderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
RenderWindowInteractor->SetRenderWindow(m_RenderWindow);
RenderWindowInteractor->Initialize();
} m_RenderWindow->Start();
CStatic::PreSubclassWindow();
} void CVtkView::SetImageData(vtkSmartPointer<vtkImageData> ImageData)
{
if (ImageData == NULL) return; m_ImageData = ImageData;
SetupReslice();
}
void CVtkView::SetupReslice()
{
if (m_ImageData == NULL) return;
int dims[3];
m_ImageData->GetDimensions(dims); //////////////////////////////////////////////////////////////////////////
m_ImagePlaneWidget->SetInputData(m_ImageData);
m_ImagePlaneWidget->SetPlaneOrientation(m_Direction);
m_ImagePlaneWidget->SetSliceIndex(dims[m_Direction] / 2);
m_ImagePlaneWidget->On();
m_ImagePlaneWidget->InteractionOn(); //////////////////////////////////////////////////////////////////////////
m_ResliceCursor->SetCenter(m_ImageData->GetCenter());
m_ResliceCursor->SetImage(m_ImageData);
m_ResliceCursor->SetThickMode(0); //m_ResliceCursorRep->GetResliceCursorActor()->GetCursorAlgorithm()->SetResliceCursor(m_ResliceCursor);
//m_ResliceCursorRep->GetResliceCursorActor()->GetCursorAlgorithm()->SetReslicePlaneNormal(m_Direction); m_ResliceCursorWidget->SetEnabled(1);
m_Renderer->ResetCamera(); //////////////////////////////////////////////////////////////////////////
double range[2];
m_ImageData->GetScalarRange(range);
m_ResliceCursorWidget->GetResliceCursorRepresentation()->
SetWindowLevel(range[1] - range[0], (range[0] + range[1]) / 2.0);
m_ImagePlaneWidget->SetWindowLevel(range[1] - range[0], (range[0] + range[1]) / 2.0);
} BEGIN_MESSAGE_MAP(CVtkView, CStatic)
END_MESSAGE_MAP()
添加类成员:
public:
afx_msg void OnBnClickedButtonViewshow();
//CStatic m_ShowLU;
//CStatic m_ShowRU;
//CStatic m_ShowLD;
//CStatic m_ShowRD;
CVtkView m_ShowLU;
CVtkView m_ShowRU;
CVtkView m_ShowLD;
CVtkView m_ShowRD; CVtkView m_AxialView;
CVtkView m_SagittalView;
CVtkView m_CoronalView;
CVtkView m_3DView;
四视图更新代码:
//当用户改变图像切分的坐标轴时(旋转坐标轴或者平移坐标系),图像切分平面会产生相应的改变,
//如果将新的切分平面更新到二维视图的vtkImagePlaneWidget对象中,即可实现三维视图的同步更新操作。
///基于以上设计,实现一个vtkCommand子类,来监听vtkResliceCursorWidget::ResliceAxesChangedEvent消息,并实现相应的更新操作。
class vtkResliceCursorCallback : public vtkCommand
{
public:
static vtkResliceCursorCallback *New()
{
return new vtkResliceCursorCallback;
} CVtkView* view[4]; public:
void Execute(vtkObject *caller, unsigned long /*ev*/,
void *callData)
{
vtkResliceCursorWidget *rcw = dynamic_cast<vtkResliceCursorWidget *>(caller);
if (rcw)
{
for (int i = 0; i < 3; i++)
{
vtkPlaneSource *ps =
static_cast<vtkPlaneSource *>(view[i]->GetImagePlaneWidget()->GetPolyDataAlgorithm()); ps->SetOrigin(view[i]->GetResliceCursorWidget()->
GetResliceCursorRepresentation()->GetPlaneSource()->GetOrigin());
ps->SetPoint1(view[i]->GetResliceCursorWidget()->
GetResliceCursorRepresentation()->GetPlaneSource()->GetPoint1());
ps->SetPoint2(view[i]->GetResliceCursorWidget()->
GetResliceCursorRepresentation()->GetPlaneSource()->GetPoint2()); view[i]->GetImagePlaneWidget()->UpdatePlacement();
view[i]->Render();
}
view[3]->Render();
} } vtkResliceCursorCallback() {} };
最终效果图:
VTK嵌入MFC同步显示的更多相关文章
- VTK:VTK嵌入MFC成功
VTK作为医学显示库,得到较多使用.作为较为上层的设计,对OpenGL进行了封装,并且有Windows.Linux.安卓等开发版本,可移植性较强. 不过VES暂时没有编译成功. 以下是嵌入MFC-ID ...
- SharePoint 2013技巧分享系列 - Active Directory同步显示用户照片
为了保持通讯信息的一致性,需要设置SharePoint,Exchange, Lync等信息同步更新显示,例如,员工头像信息. 本文介绍如何在SharePoint 2013中同步显示Active Dir ...
- MFC对话框显示BMP图片
1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...
- asp.net MVC SignalR 与数据库 实时同步显示
asp.net MVC SignalR 与数据库 实时同步显示 错误:未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数据库启用 ...
- 在MFC[转载]在MFC状态栏显示时间 状态栏显示时间
原文:在MFC状态栏显示时间,谢小哈皮儿 c/c++ vc 在mfc状态栏显示时间,在VC的控件中有个Status bar可以在窗体状态栏中添加日期和时间.其实通过简单的代码,你就能创建一个有时钟显示 ...
- Android(java)学习笔记138:html嵌入到java显示乱码
解决方案: 使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”.“gbk”.“gb2312”也一样. webView.getSettings().setDefaultTextEnc ...
- JS中同步显示并分割输入的数字字符串
题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图 ...
- Android 小技巧-- TextView与EditText 同步显示
方法一.利用View.OnKeyListener"同步"显示 EditText myEdit = (EditText)findViewById(R.id.myEdit); Tex ...
- Android(java)学习笔记80:Html嵌入到Java显示乱码
1. Html嵌入到Java显示乱码: 解决方案: 使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”.“gbk”.“gb2312”也一样. webView.getSettings ...
随机推荐
- Dubbo学习总结(2)——Dubbo架构详解
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- chromeDriver下载地址
http://chromedriver.storage.googleapis.com/index.html
- noip模拟赛 整除
分析:最暴力的思想就是枚举一边啦,然后就会发现有很多n/i的结果都是相同的,可以每次跳过这一段,这样能过60分. 想不出其它解法了,打个表找了一下规律: ans num 1 1 2 ...
- 使用JQUERY的flexselect插件来实现将SELECT下拉菜单变成自动补全输入框
这也是下拉列表太长了之后,使用的同事提出来的意见, 然后,本来开始想将DJANGO的那个后台下拉菜单移植过来的,但发现不现实,也麻烦, 就找了几个JQUERY的插件测试了一下,最后选中了flexsel ...
- vjudge B - Design T-Shirt
B - Design T-Shirt 思路:水题,模拟即可. #include<cstdio> #include<cstring> #include<iostream&g ...
- ArcGIS Engine 创建索引(属性索引)——提高查询效率
转自原文 ArcGIS Engine 创建索引(属性索引)——提高查询效率 众所周知,建立索引可以提高查询的效率,当对FeatureClass中的某一列频繁的查找,且数据量比较大时,建立索引是非常有必 ...
- ps f
这个命令可以以树形结构列出进程信息.可以清楚的看清父进程子进程直接的关系.可笑我之前还以为所有的命令参数都是带有一个中划线的. 不过,这里列出的进程好像不全.应该仔细的看看ps 的命令. [root@ ...
- 通过urllib2抓取网页内容(1)
一.urllib2发送请求 import urllib2 url = 'http://www.baidu.com' req = urllib2.Request(url) response = urll ...
- jquery easyui datagrid实现数据改动
1.单击选中待改动行 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA= ...
- JCE, Java Cryptography Extension
JCE, Java Cryptography Extension Java 8 JCE下载地址: http://www.oracle.com/technetwork/java/javase/downl ...