mhd四视图显示 vtk+Qt

VTK+Qt读取mhd文件 可以进行四视图显示,并且拖动平面可以动态显示

在窗口cpp文件的源代码:

#include “vtkmainwindow.h”
#include “ui_vtkmainwindow.h”
//VTK
#include “vtkSmartPointer.h”
#include “vtkXMLPolyDataReader.h”
#include “vtkPolyDataMapper.h”
#include “vtkActor.h”
#include “vtkRenderer.h”
#include “vtkRenderWindow.h”
#include “vtkRenderWindowInteractor.h”
#include “vtkInteractorStyle.h”
#include <vtkInteractorStyleTrackballCamera.h>
#include “vtkMetaImageReader.h”
#include “vtkImageCast.h”
//#include “vtkVolumeRayCastCompositeFunction.h”
#include “vtkGPUVolumeRayCastMapper.h”
#include “vtkFixedPointVolumeRayCastMapper.h”
#include “vtkVolumeProperty.h”
#include “vtkPiecewiseFunction.h”
#include “vtkColorTransferFunction.h”
#include “vtkVolume.h”
#include “vtkProperty.h”
#include <vtkImageData.h>
#include <vtkTransform.h>
#include <vtkLinearTransform.h>
#include <vtkMatrix4x4.h>
#include <vtkImageReslice.h>
#include <vtkImageActor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkPlane.h>
#include <vtkImagePlaneWidget.h>
#include <vtkCommand.h>
#include <vtkCamera.h>
#include <vtkWidgetEventTranslator.h>
#include <vtkcutter.h>
#include <vtkImageData.h>
//Qt
#include
#include
#include <QVTKWidget.h>
#include <QFileInfo.h>
#include
#include <qtimer.h>
#include <qevent.h>

//C++
#define _USE_MATH_DEFINES
#include <math.h>
#include

#define VTP_FILETYPE 1
#define MHAORMHD_FILETYPE 2
#define MHD_FILETYPE 2

double m_RedColor[3] = { 1.0, 0.0, 0.0 };
double m_GreenColor[3] = { 0.0, 1.0, 0.0 };
double m_BlueColor[3] = { 0.0, 0.0, 1.0 };
int m_Extent[6] = { 0, 0, 0, 0, 0, 0 };//图像的范围
double m_Spacing[3] = { 0, 0, 0 };//像素间距
double m_Origen[3] = { 0, 0, 0 };//原点
double m_Center[3] = { 0, 0, 0 };//图像的中心位置
int VolumeExtent[6] = { 0, 0, 0, 0, 0, 0 };

class vtkPlaneCallback : public vtkCommand
{
public:
vtkPlaneCallback() {}
~vtkPlaneCallback(){}

static vtkPlaneCallback *New()
{
	return new vtkPlaneCallback;
}

void SetImageReslice(std::vector<vtkSmartPointer<vtkImageReslice> > reslice)
{
	this->m_vCbReslice = reslice;
}

void SetPlaneWidget(std::vector<vtkSmartPointer<vtkImagePlaneWidget> > planeZ)
{
	this->m_vCbPlaneWidget = planeZ;
}

void SetInteractor(std::vector<vtkSmartPointer<vtkRenderWindowInteractor> > interactor)
{
	this->m_vInteractor = interactor;
}

void SetPlane(std::vector<vtkSmartPointer<vtkPlane> > plane)
{
	this->m_vCbPlane = plane;
}

void SetvtpPolydata(std::vector<vtkSmartPointer<vtkPolyData> > vtpPolyData)
{
	this->m_vCbPolyData = vtpPolyData;
}

void SetActor(std::vector<vtkSmartPointer<vtkActor> > cutterActor)
{
	this->m_vCbCutterActor = cutterActor;
}

void SetRenderer(std::vector<vtkSmartPointer<vtkRenderer> > imageRenderer)
{
	this->m_vCbImageRenderer = imageRenderer;
}

void SetQvtkWidget(std::vector <QVTKWidget* > qvtkwidget)
{
	this->m_vCbQvtkWidget = qvtkwidget;
}

void Execute(vtkObject *caller, unsigned long vtkNotUsed(event), void *callData) VTK_OVERRIDE
{
	for (int i = 0; i < m_vCbPlaneWidget.size(); ++i)
	{
		m_vCbReslice[i]->SetResliceAxesOrigin(m_vCbPlaneWidget[i]->GetCenter());//获取切片轴心
		m_vCbReslice[i]->Update();//缺少该句qvtkwidget将不能动态显示

		//m_vCbPlane[i]->GetOrigin(m_vCbPlaneWidget[i]->GetOrigin());
		//m_vCbPlane[i]->GetNormal(m_vCbPlaneWidget[i]->GetNormal());
		//m_vInteractor[i]->Render();
		//------------------------------------------------------------------------------------------------
		vtkSmartPointer <vtkPlane> plane = vtkSmartPointer <vtkPlane>::New();
		plane->SetOrigin(m_vCbPlaneWidget[i]->GetOrigin());
		plane->SetNormal(m_vCbPlaneWidget[i]->GetNormal());



		for (int j = 0; j < m_vCbPolyData.size(); ++j)
		{
			vtkSmartPointer<vtkCutter> cutter = vtkSmartPointer<vtkCutter>::New();
			cutter->SetCutFunction(plane);
			cutter->SetInputData(m_vCbPolyData[j]);
			cutter->Update();

			vtkSmartPointer<vtkPolyDataMapper> cutterMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
			cutterMapper->SetInputConnection(cutter->GetOutputPort());
			cutterMapper->Update();

			m_vCbCutterActor[i * m_vCbPolyData.size() + j]->SetMapper(cutterMapper);

			vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();

			if (m_vCbPlaneWidget[i]->GetNormal()[2] == 1)
			{
				transform->Translate(m_vCbPlaneWi
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值