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 ...
随机推荐
- Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口)
>Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口) >>实验开始,先上拓扑图参考: >>>实验目标:分别实现主 ...
- Django——6 模型基础ORM 数据库连接配置 模型的创建与映射 数据的增删改查
Django Django的ORM简介 数据库连接配置 模型的创建与映射 数据库的增删改查 增数据 查数据及补充 改数据 删数据 Django的ORM系统分析 ORM概念:对象关系映射(Objec ...
- HDU 5442 Favorite Donut
Favorite Donut Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- Linux中安装MongoDB出现的问题记录
mongoDB安装完成后,运行sudo service mongod start 查看程序状态:ps ajx | grep mongod ,启动失败 查看失败信息提示,终端命令:tail -f / ...
- centos7安装opennms-17.0.0
https://blog.csdn.net/jiangzhexi/article/details/52036858 http://www.jb51.net/os/RedHat/281470.html
- nyoj_212_K尾相等数_210402272239
K尾相等数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于100 ...
- P - How many
Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...
- [bzoj3378][Usaco2004 Open]MooFest 狂欢节_树状数组
MooFest 狂欢节 bzoj-3378 Usaco-2004 Open 题目大意:给定一个n个数的a序列,每两个数之间有一个距离,两个点之间的权值为$max(a[i],a[j])*dis(i,j) ...
- Android:阻止输入法将图片压缩变形
Scrollview定义中添加一行: android:isScrollContainer="false"
- HDU 5501
这题的01背包的特点很容易看出来,但其实发现,这个题讲究加入时候的顺序. 于是,用贪心排序,如代码中所示,如果A在B前面造成的分数损失更小,则排在前面...其实这个我也是猜的.. #include & ...