日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VTK嵌入MFC同步显示

發布時間:2023/12/31 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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> // CVtkViewclass 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"// CVtkViewIMPLEMENT_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同步显示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。