Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkVtkPropRendererTest.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "vtkActor.h"
14 #include "vtkPolyDataMapper.h"
15 #include "vtkProperty.h"
16 #include "vtkRenderWindow.h"
17 #include "vtkRenderWindowInteractor.h"
18 #include "vtkRenderer.h"
19 #include "vtkSphereSource.h"
20 #include "vtkUnsignedCharArray.h"
21 
22 #include <mitkImage.h>
23 #include <mitkPicFileReader.h>
24 
25 #include <mitkDataStorage.h>
26 #include <mitkLevelWindow.h>
28 
29 #include <mitkVtkLayerController.h>
30 #include <mitkVtkPropRenderer.h>
31 #include <vtkMitkRenderProp.h>
32 
33 #include <itksys/SystemTools.hxx>
34 
35 #include <fstream>
36 int mitkVtkPropRendererTest(int argc, char *argv[])
37 {
38  // independently read header of pic file
39  mitkIpPicDescriptor *picheader = nullptr;
40  if (argc >= 1)
41  {
42  if (itksys::SystemTools::LowerCase(itksys::SystemTools::GetFilenameExtension(argv[1])).find(".pic") !=
43  std::string::npos)
44  picheader = mitkIpPicGetHeader(argv[1], nullptr);
45  }
46  if (picheader == nullptr)
47  {
48  std::cout << "file not found/not a pic-file - test not applied [PASSED]" << std::endl;
49  std::cout << "[TEST DONE]" << std::endl;
50  return EXIT_SUCCESS;
51  }
52 
53  static long int sum_orig_Pic3D_pic_gz = 14685408;
54 
55  mitkIpPicGetTags(argv[1], picheader);
56 
57  // Read pic-Image from file
58  std::cout << "Reading image: ";
59  mitk::PicFileReader::Pointer reader = mitk::PicFileReader::New();
60  reader->SetFileName(argv[1]);
61  reader->Update();
62  std::cout << "[PASSED]" << std::endl;
63 
64  mitk::Image::Pointer image = reader->GetOutput();
65 
66  std::cout << "Creating node: ";
68  node->SetData(image);
69  std::cout << "[PASSED]" << std::endl;
70 
71  std::cout << "Creating DataStorage: ";
73  std::cout << "[PASSED]" << std::endl;
74 
75  std::cout << "Adding node via DataStorage: ";
76  ds->Add(node);
77  std::cout << "[PASSED]" << std::endl;
78 
79  std::cout << "Adding level-window property: ";
81  mitk::LevelWindow levelwindow;
82  levelwindow.SetAuto(image);
83  levWinProp->SetLevelWindow(levelwindow);
84  node->GetPropertyList()->SetProperty("levelwindow", levWinProp);
85  std::cout << "[PASSED]" << std::endl;
86 
87  std::cout << "Creating a vtk sphere: ";
88  vtkSphereSource *sphere = vtkSphereSource::New();
89  sphere->SetRadius(1.0);
90  sphere->SetThetaResolution(18);
91  sphere->SetPhiResolution(18);
92 
93  vtkPolyDataMapper *map = vtkPolyDataMapper::New();
94  map->SetInput(sphere->GetOutput());
95  sphere->Delete();
96 
97  vtkActor *aSphere = vtkActor::New();
98  aSphere->SetMapper(map);
99  map->Delete();
100  aSphere->GetProperty()->SetColor(0, 0, 1); // sphere color blue
101  std::cout << "[PASSED]" << std::endl;
102 
103  std::cout << "Creating a renderer for the sphere: ";
104  vtkRenderer *sphereRenderer = vtkRenderer::New();
105  sphereRenderer->AddActor(aSphere);
106  aSphere->Delete();
107  // sphereRenderer->SetBackground(1,1,1); // Background color white
108  std::cout << "[PASSED]" << std::endl;
109 
110  std::cout << "Creating vtkRenderWindow and VtkPropRenderer: ";
111  vtkRenderWindow *renderWindow = vtkRenderWindow::New();
112  mitk::VtkPropRenderer::Pointer propRenderer = mitk::VtkPropRenderer::New("the renderer", renderWindow);
113  // propRenderer->SetMapperID(2);
114  std::cout << "[PASSED]" << std::endl;
115 
116  // renderWindow->AddRenderer(sphereRenderer);
117  // renderWindow->SetErase(0);
118 
119  std::cout << "BaseRenderer::SetData(iterator): ";
120  propRenderer->SetDataStorage(ds);
121  std::cout << "[PASSED]" << std::endl;
122 
123  std::cout << "Creating vtkMitkRenderProp and connecting it to the VtkPropRenderer: ";
125  renderProp->SetPropRenderer(propRenderer);
126  propRenderer->GetVtkRenderer()->AddViewProp(renderProp);
127  std::cout << "[PASSED]" << std::endl;
128 
129  std::cout << "Inserting the sphere into the foreground of the VtkLayerController: ";
130  mitk::VtkLayerController::GetInstance(renderWindow)->InsertForegroundRenderer(sphereRenderer, true);
131  std::cout << "[PASSED]" << std::endl;
132 
133  // mouse interaction for debugging
134  // vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
135  // iren->SetRenderWindow(renderWindow);
136 
137  std::cout << "Setting and getting size of renderWindow: ";
138  renderWindow->SetSize(400, 400);
139  int *size = renderWindow->GetSize();
140  std::cout << "[PASSED]" << std::endl;
141 
142  std::cout << "Do the rendering: ";
143  renderWindow->Render();
144  std::cout << "[PASSED]" << std::endl;
145 
146  // iren->Start();
147 
148  std::cout << "Testing to pick a world position: ";
149  mitk::Point2D p;
150  mitk::Point3D p_mm;
151  p[0] = 10;
152  p[1] = 10;
153  propRenderer->PickWorldPoint(p, p_mm);
154  std::cout << "returned world position: " << p_mm << "\n";
155 
156  std::cout << "Creating vtkUnsignedCharArray: ";
157  vtkUnsignedCharArray *vtkImage = vtkUnsignedCharArray::New();
158  std::cout << "[PASSED]" << std::endl;
159 
160  cout << "Reading image from renderWindow" << std::endl;
161  renderWindow->GetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, 0, vtkImage);
162  cout << "Read " << size[0] * size[1] << " data points\n";
163 
164  cout << "Computing sum of all RGBA values..\n";
165  long int sum_now = 0;
166  for (int i = 0; i < size[0] * size[1]; i++)
167  sum_now += vtkImage->GetValue(i);
168  std::cout << "Sum of all RGBA values: " << sum_now << "\n";
169  std::cout << "Sum should be: " << sum_orig_Pic3D_pic_gz << "\n";
170 
171  // std::string Pic3d_pic_gz_str("Pic3D.pic.gz");
172  // std::cout << "pic3d " << Pic3d_pic_gz_str << "\n";
173  // std::cout << "argv " << argv_str << "\n";
174  // std::cout << "find " << (int) argv_str.find("Pic3D.pic.gz") << "\n";
175  // std::cout << "size " << argv_str.size() << "\n";
176 
177  // if(argv_str.size() - ((int) argv_str.find("Pic3D.pic.gz")) == 12)
178  //{
179  // std::cout << "Input image is Pic3D.pic.gz\n";
180  // std::cout << "Sum should be: " << sum_orig_Pic3D_pic_gz << "\n";
181  // if(sum_orig_Pic3D_pic_gz!=sum_now)
182  // {
183  // std::cout<<"[FAILED]"<<std::endl;
184  // return EXIT_FAILURE;
185  // }
186  // std::cout<<"[PASSED]"<<std::endl;
187  //}
188  // else
189  //{
190  // std::cout<<"Unknown image, comparison test skipped"<<std::endl;
191  //}
192 
193  propRenderer->GetVtkRenderer()->RemoveViewProp(renderProp);
194  renderProp->Delete();
195  propRenderer = nullptr;
196  sphereRenderer->Delete();
197 
198  renderWindow->Delete();
199 
200  vtkImage->Delete();
201  ds = nullptr;
202 
203  std::cout << "[TEST DONE]" << std::endl;
204  return EXIT_SUCCESS;
205 }
void SetPropRenderer(mitk::VtkPropRenderer::Pointer propRenderer)
mitkIpPicDescriptor * mitkIpPicGetHeader(const char *picfile_name, mitkIpPicDescriptor *pic)
void InsertForegroundRenderer(vtkSmartPointer< vtkRenderer > renderer, bool forceAbsoluteForeground)
static Pointer New()
vtkMitkRenderProp
mitkIpPicDescriptor * mitkIpPicGetTags(const char *picfile_name, mitkIpPicDescriptor *pic)
The LevelWindow class Class to store level/window values.
static VtkLayerController * GetInstance(vtkSmartPointer< vtkRenderWindow > renWin)
static Pointer New()
void SetAuto(const Image *image, bool tryPicTags=true, bool guessByCentralSlice=true, unsigned selectedComponent=0)
sets level/window to optimize the contrast of the given Image
mitk::Image::Pointer image
int mitkVtkPropRendererTest(int argc, char *argv[])
static vtkMitkRenderProp * New()
static Pointer New(const char *_arga, vtkRenderWindow *_argb)