VTK嵌入MFC同步显示
生活随笔
收集整理的這篇文章主要介紹了
VTK嵌入MFC同步显示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????? ?? 使用VTK嵌入MFC,實現四視圖更新,機制和細節參考原文。
???????? 原文鏈接:http://blog.csdn.net/www_doling_net/article/details/8939115
?
原文代碼:
原代碼:
// 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同步显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM8】SPI通讯
- 下一篇: 英雄联盟云顶之奕光召唤师阵容是什么