医站点医维基

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3894|回复: 4

[VTK] VTK例子20-vtkImagePlaneWidget显示四幅图像

[复制链接]

336

主题

410

回帖

2806

积分

管理员

积分
2806

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2015-12-5 18:06:54 | 显示全部楼层 |阅读模式
vtkImagePlaneWidget显示四幅图像
#include "stdafx.h"
#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkCellPicker.h"
#include "vtkCommand.h"
#include "vtkImageActor.h"
#include "vtkImageMapToColors.h"
#include "vtkImagePlaneWidget.h"
#include "vtkImageReader.h"
#include "vtkInteractorEventRecorder.h"
#include "vtkLookupTable.h"
#include "vtkOutlineFilter.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkVolume16Reader.h"
#include "vtkImageData.h"
#include "vtkTestUtilities.h"
#include "vtkRegressionTestImage.h"
#include "vtkDebugLeaks.h"


class vtkWidgetWindowLevelCallback : public vtkCommand
{
public:
  static vtkWidgetWindowLevelCallback *New()
  { return new vtkWidgetWindowLevelCallback; }
  void Execute( vtkObject *caller, unsigned long vtkNotUsed( event ),
                void *callData )
  {
    vtkImagePlaneWidget* self =
      reinterpret_cast< vtkImagePlaneWidget* >( caller );
    if(!self) return;
    double* wl = static_cast<double*>( callData );
    if ( self == this->WidgetX )
      {
      this->WidgetY->SetWindowLevel(wl[0],wl[1]);
      this->WidgetZ->SetWindowLevel(wl[0],wl[1]);
      }
    else if( self == this->WidgetY )
      {
      this->WidgetX->SetWindowLevel(wl[0],wl[1]);
      this->WidgetZ->SetWindowLevel(wl[0],wl[1]);
      }
    else if (self == this->WidgetZ)
      {
      this->WidgetX->SetWindowLevel(wl[0],wl[1]);
      this->WidgetY->SetWindowLevel(wl[0],wl[1]);
      }
  }
  vtkWidgetWindowLevelCallback():WidgetX( 0 ), WidgetY( 0 ), WidgetZ ( 0 ) {}
  vtkImagePlaneWidget* WidgetX;
  vtkImagePlaneWidget* WidgetY;
  vtkImagePlaneWidget* WidgetZ;
};
int main( int argc, char *argv[] )
{
  char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/headsq/quarter");
  vtkVolume16Reader* v16 =  vtkVolume16Reader::New();
    v16->SetDataDimensions( 64, 64);
    v16->SetDataByteOrderToLittleEndian();
    v16->SetImageRange( 1, 93);
    v16->SetDataSpacing( 3.2, 3.2, 1.5);
    v16->SetFilePrefix("E://VTK//VTKData//Data//headsq//quarter");
    //v16->SetFilePrefix(fname);
    v16->SetDataMask( 0x7fff);
    v16->Update();
  delete[] fname;
  vtkOutlineFilter* outline = vtkOutlineFilter::New();
    outline->SetInputConnection(v16->GetOutputPort());
  vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New();
    outlineMapper->SetInputConnection(outline->GetOutputPort());
  vtkActor* outlineActor =  vtkActor::New();
    outlineActor->SetMapper( outlineMapper);
  
  vtkRenderer* ren1 = vtkRenderer::New();
  vtkRenderer* ren2 = vtkRenderer::New();
  vtkRenderer* ren3 = vtkRenderer::New();
  vtkRenderer* ren = vtkRenderer::New();
  vtkRenderWindow* renWin = vtkRenderWindow::New();
   
    renWin->AddRenderer(ren1);
    renWin->AddRenderer(ren2);
    renWin->AddRenderer(ren3);
    renWin->AddRenderer(ren);
  vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
    iren->SetRenderWindow(renWin);
  vtkCellPicker* picker = vtkCellPicker::New();
    picker->SetTolerance(0.005);
  vtkProperty* ipwProp = vtkProperty::New();
  
   //assign default props to the ipw's texture plane actor

  vtkImagePlaneWidget* planeWidgetX = vtkImagePlaneWidget::New();
    planeWidgetX->SetInteractor( iren);
    planeWidgetX->SetKeyPressActivationValue('x');
    planeWidgetX->SetPicker(picker);
    planeWidgetX->RestrictPlaneToVolumeOn();
    planeWidgetX->GetPlaneProperty()->SetColor(1,0,0);
    planeWidgetX->SetTexturePlaneProperty(ipwProp);
    planeWidgetX->TextureInterpolateOff();
    planeWidgetX->SetResliceInterpolateToNearestNeighbour();
    planeWidgetX->SetInput(v16->GetOutput());
    planeWidgetX->SetPlaneOrientationToXAxes();
    planeWidgetX->SetSliceIndex(32);
    planeWidgetX->GetTexturePlaneProperty()->SetOpacity(1);
    planeWidgetX->DisplayTextOn();
    planeWidgetX->On();
    planeWidgetX->InteractionOn();
   
  vtkImagePlaneWidget* planeWidgetY = vtkImagePlaneWidget::New();
    planeWidgetY->SetInteractor( iren);
    planeWidgetY->SetKeyPressActivationValue('y');
    planeWidgetY->SetPicker(picker);
    planeWidgetY->GetPlaneProperty()->SetColor(1,1,0);
    planeWidgetY->SetTexturePlaneProperty(ipwProp);
    planeWidgetY->TextureInterpolateOn();
    planeWidgetY->SetResliceInterpolateToLinear();
    planeWidgetY->SetInput(v16->GetOutput());
    planeWidgetY->SetPlaneOrientationToYAxes();
    planeWidgetY->SetSlicePosition(122.5);
    planeWidgetY->GetTexturePlaneProperty()->SetOpacity(1);
    planeWidgetY->SetLookupTable( planeWidgetX->GetLookupTable());
    planeWidgetY->DisplayTextOn();
    planeWidgetY->UpdatePlacement();
    planeWidgetY->On();
  vtkImagePlaneWidget* planeWidgetZ = vtkImagePlaneWidget::New();
    planeWidgetZ->SetInteractor( iren);
    planeWidgetZ->SetKeyPressActivationValue('z');
    planeWidgetZ->SetPicker(picker);
    planeWidgetZ->GetPlaneProperty()->SetColor(0,0,1);
    planeWidgetZ->SetTexturePlaneProperty(ipwProp);
    planeWidgetZ->TextureInterpolateOn();
    planeWidgetZ->SetResliceInterpolateToCubic();
    planeWidgetZ->SetInput(v16->GetOutput());
    planeWidgetZ->SetPlaneOrientationToZAxes();
    planeWidgetZ->SetSliceIndex(46);
    planeWidgetZ->GetTexturePlaneProperty()->SetOpacity(1);
    planeWidgetZ->SetLookupTable( planeWidgetX->GetLookupTable());
    planeWidgetZ->DisplayTextOn();
    planeWidgetZ->On();
   vtkWidgetWindowLevelCallback* cbk = vtkWidgetWindowLevelCallback::New();
   cbk->WidgetX = planeWidgetX;
   cbk->WidgetY = planeWidgetY;
   cbk->WidgetZ = planeWidgetZ;
  // planeWidgetX->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );
   //planeWidgetY->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );
   //planeWidgetZ->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );
   cbk->Delete();
  //double wl[2];
// planeWidgetZ->GetWindowLevel(wl);

  // Add a 2D image to test the GetReslice method
  //
   vtkImageMapToColors* colorMap1 = vtkImageMapToColors::New();
    colorMap1->PassAlphaToOutputOff();
    colorMap1->SetActiveComponent(0);
    colorMap1->SetOutputFormatToLuminance();
    colorMap1->SetInput(planeWidgetX->GetResliceOutput());
    colorMap1->SetLookupTable(planeWidgetX->GetLookupTable());
   vtkImageActor* imageActor1 = vtkImageActor::New();
    imageActor1->PickableOff();
    imageActor1->SetInput(colorMap1->GetOutput());
   
   vtkImageMapToColors* colorMap2 = vtkImageMapToColors::New();
    colorMap2->PassAlphaToOutputOff();
    colorMap2->SetActiveComponent(0);
    colorMap2->SetOutputFormatToLuminance();
    colorMap2->SetInput(planeWidgetY->GetResliceOutput());
    colorMap2->SetLookupTable(planeWidgetX->GetLookupTable());
  vtkImageActor* imageActor2 = vtkImageActor::New();
    imageActor2->PickableOff();
    imageActor2->SetInput(colorMap2->GetOutput());
  vtkImageMapToColors* colorMap3 = vtkImageMapToColors::New();
    colorMap3->PassAlphaToOutputOff();
    colorMap3->SetActiveComponent(0);
    colorMap3->SetOutputFormatToLuminance();
    colorMap3->SetInput(planeWidgetZ->GetResliceOutput());
    colorMap3->SetLookupTable(planeWidgetX->GetLookupTable());
  vtkImageActor* imageActor3 = vtkImageActor::New();
    imageActor3->PickableOff();
    imageActor3->SetInput(colorMap3->GetOutput());
   //Add the actors
  
  ren->AddActor( outlineActor);
  ren1->AddActor( imageActor1);
  ren2->AddActor( imageActor2);
  ren3->AddActor( imageActor3);
  ren->SetBackground( 0.1, 0.1, 0.2);
  ren1->SetBackground( 0.1, 0.2, 0.1);
  ren2->SetBackground( 0.2, 0.1, 0.2);
  ren3->SetBackground( 0.2, 0.2, 0.2);
  renWin->SetSize( 600, 400);
  ren->SetViewport(0,0.5,0.5,1);
  ren1->SetViewport(0.5,0.5,1,1);
  ren2->SetViewport(0,0,0.5,0.5);
  ren3->SetViewport(0.5,0,1,0.5);
  // Set the actors' postions
  //
  renWin->Render();
  //iren->SetEventPosition(100,200);
  //iren->SetKeyCode('r');
  //iren->InvokeEvent(vtkCommand::CharEvent,NULL);
  //iren->SetEventPosition( 200,200);
  //iren->SetKeyCode('r');
// iren->InvokeEvent(vtkCommand::CharEvent,NULL);
  
  
  renWin->Render();
  ren->GetActiveCamera()->Elevation(110);
  ren->GetActiveCamera()->SetViewUp(0, 0, -1);
  ren->GetActiveCamera()->Azimuth(45);
  ren->GetActiveCamera()->Dolly(1.15);
  ren->ResetCameraClippingRange();
  
  iren->Initialize();
  iren->Start();
  renWin->Render();
  // Test SetKeyPressActivationValue for one of the widgets
  //
  //iren->SetKeyCode('z');
  //iren->InvokeEvent(vtkCommand::CharEvent,NULL);
  //iren->SetKeyCode('z');
  //iren->InvokeEvent(vtkCommand::CharEvent,NULL);
  
  // Remove the observers so we can go interactive. Without this the "-I"
  // testing option fails.
  int retVal = vtkRegressionTestImage( renWin );
  
  if ( retVal == vtkRegressionTester::DO_INTERACTOR)
  {
    iren->Start();
  }
   //Clean up
  
  
  getchar();
  cbk->Delete();
  ipwProp->Delete();
  planeWidgetX->Delete();
  planeWidgetY->Delete();
  planeWidgetZ->Delete();
  colorMap1->Delete();
  imageActor1->Delete();
  colorMap2->Delete();
  imageActor2->Delete();
  colorMap3->Delete();
  imageActor3->Delete();
  picker->Delete();
  outlineActor->Delete();
  outlineMapper->Delete();
  outline->Delete();
  iren->Delete();
  renWin->Delete();
  ren->Delete();
  ren1->Delete();
  ren2->Delete();
  ren3->Delete();
  v16->Delete();
  return !retVal;
}
20.png
回复

使用道具 举报

37

主题

407

回帖

1137

积分

版主

积分
1137

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2015-12-5 22:11:16 | 显示全部楼层
看着还不错,学习下
回复

使用道具 举报

47

主题

416

回帖

1214

积分

版主

积分
1214

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-15 02:32:23 | 显示全部楼层
顶贴
回复

使用道具 举报

0

主题

392

回帖

783

积分

高级会员

积分
783

最佳新人

发表于 2016-5-15 08:27:23 | 显示全部楼层
回复看下,!!
回复

使用道具 举报

60

主题

416

回帖

1235

积分

版主

积分
1235

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-24 10:03:29 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于我们|医维基|网站地图|Archiver|手机版|医疗之家 ( 沪ICP备2023001278号-1 )  

GMT+8, 2024-5-2 12:49 , Processed in 0.196516 second(s), 31 queries .

Designed by Medical BBS

快速回复 返回顶部 返回列表