]> Creatis software - clitk.git/blob - vv/vvSegmentationDialog.cxx
Debug RTStruct conversion with empty struc
[clitk.git] / vv / vvSegmentationDialog.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #ifndef _vvSegmentationDialog_CXX
19 #define _vvSegmentationDialog_CXX
20 #include <QtGui>
21 #include <Qt>
22
23 #include "vvSegmentationDialog.h"
24 #include "vvProgressDialog.h"
25 #include "vvImageWriter.h"
26 #include "vvLandmarks.h"
27 #include "vvInteractorStyleNavigator.h"
28 #include "vvSlicer.h"
29
30 #include <vtkVersion.h>
31 #include <vtkStreamingDemandDrivenPipeline.h>
32 #include <vtkInformation.h>
33 #include "vtkMarchingCubes.h"
34 #include "vtkMarchingSquares.h"
35 #include "vtkImageClip.h"
36 #include "vtkCamera.h"
37 #include "vtkRenderer.h"
38 #include "vtkProperty.h"
39 #include "vtkLookupTable.h"
40 #include "vtkClipPolyData.h"
41 #include "vtkImageToPolyDataFilter.h"
42 #include "vtkLookupTable.h"
43 #include "vtkDoubleArray.h"
44 #include "vtkPointData.h"
45 #include "vtkCellData.h"
46 #include "vtkImageMapToWindowLevelColors.h"
47 #include "vtkImageContinuousErode3D.h"
48 #include "vtkImageContinuousDilate3D.h"
49 #include "vtkImageLogic.h"
50 #include "vtkInteractorStyleTrackballCamera.h"
51 #include "vtkImageSeedConnectivity.h"
52 #include "vtkConnectivityFilter.h"
53 #include "vtkPolyData.h"
54 #include <vtkPolyDataMapper.h>
55 #include <vtkImageData.h>
56 #include "vtkInformation.h"
57 #include "vtkInformationVector.h"
58 #include "vtkStreamingDemandDrivenPipeline.h"
59 #include <vtkPolyDataWriter.h>
60
61 #include <QMessageBox>
62 #include <QFileDialog>
63
64 #ifdef Q_OS_OSX
65 # include "vvOSXHelper.h"
66 #endif
67
68 //====================================================================
69 vvSegmentationDialog::vvSegmentationDialog(QWidget * parent, Qt::WindowFlags f)
70   :QDialog(parent,f), Ui::vvSegmentationDialog()
71 {
72
73   // initialization
74   setupUi(this);
75   mManager = new vvSlicerManager(1);
76
77   mClipper = vtkImageClip::New();
78   mSquares1 = vtkMarchingSquares::New();
79   mSquaresMapper1 = vtkPolyDataMapper::New();
80   mSquaresActor1 = vtkActor::New();
81
82   mSquares2 = vtkMarchingSquares::New();
83   mSquaresMapper2 = vtkPolyDataMapper::New();
84   mSquaresActor2 = vtkActor::New();
85
86   //m3DMapper = vtkPolyDataMapper::New();
87   //m3DActor = vtkActor::New();
88   m3DExtractor = vtkMarchingCubes::New();
89   m3DExtractor->ComputeScalarsOff();
90   m3DMappers.clear();
91   m3DActors.clear();
92
93   mBinaireImages.clear();
94   mKernelValue = 2;
95
96   connect(clipping1Slider,SIGNAL(valueChanged(int)),this,SLOT(clippingvaluechanged(int)));
97   connect(clipping2Slider,SIGNAL(valueChanged(int)),this,SLOT(clippingvaluechanged(int)));
98   connect(binaryButton,SIGNAL(clicked()),this,SLOT(BinariseSurface()));
99   connect(saveButton,SIGNAL(clicked()),this,SLOT(Save()));
100   connect(erodeButton,SIGNAL(clicked()),this,SLOT(Erode()));
101   connect(dilateButton,SIGNAL(clicked()),this,SLOT(Dilate()));
102   connect(dimButton,SIGNAL(clicked()),this,SLOT(ChangeDimRendering()));
103   connect(kernelSpinBox,SIGNAL(valueChanged(int)),this,SLOT(KernelValueChanged(int)));
104
105   binaryButton->setEnabled(0);
106   erodeButton->setEnabled(0);
107   dilateButton->setEnabled(0);
108   infoLabel->setText("Select Up and Down threshold before clicking binarise !");
109
110 #ifdef Q_OS_OSX
111   disableGLHiDPI(viewWidget->winId());
112 #endif
113 }
114
115 vvSegmentationDialog::~vvSegmentationDialog()
116 {
117   mClipper->Delete();
118
119   mSquaresActor1->Delete();
120   mSquaresMapper1->Delete();
121   mSquares1->Delete();
122
123   mSquaresActor2->Delete();
124   mSquaresMapper2->Delete();
125   mSquares2->Delete();
126
127   //m3DMapper->Delete();
128   //m3DActor->Delete();
129   m3DExtractor->Delete();
130
131   for (unsigned int i = 0; i < mBinaireImages.size(); i++)
132     mBinaireImages[i]->Delete();
133
134   for (unsigned int i = 0; i < m3DActors.size(); i++)
135     m3DActors[i]->Delete();
136
137   for (unsigned int i = 0; i < m3DMappers.size(); i++)
138     m3DMappers[i]->Delete();
139
140   delete mManager;
141 }
142
143 //----------------------------------------------------------------------------
144 // This templated function executes the filter for any type of data.
145 // Handles the one input operations
146 template <class T>
147 void vvImageBinarize(vtkImageData *in1Data, T *in1Ptr,
148                      int outExt[6],int clampMin, int clampMax)
149 {
150   int idxR, idxY, idxZ;
151   int maxY, maxZ;
152   vtkIdType inIncX, inIncY, inIncZ;
153   int rowLength;
154
155   // find the region to loop over
156   rowLength =
157     (outExt[1] - outExt[0]+1)*in1Data->GetNumberOfScalarComponents();
158   // What a pain. Maybe I should just make another filter.
159
160   maxY = outExt[3] - outExt[2];
161   maxZ = outExt[5] - outExt[4];
162
163   // Get increments to march through data
164   in1Data->GetContinuousIncrements(outExt, inIncX, inIncY, inIncZ);
165
166   for (idxZ = 0; idxZ <= maxZ; idxZ++) {
167     for (idxY = 0; idxY <= maxY; idxY++) {
168       for (idxR = 0; idxR < rowLength; idxR++) {
169         if (static_cast<double>(*in1Ptr) > clampMin && static_cast<double>(*in1Ptr) <= clampMax)
170           *in1Ptr = static_cast<T>(1);
171         else
172           *in1Ptr = static_cast<T>(0);
173         in1Ptr++;
174       }
175       in1Ptr += inIncY;
176     }
177     in1Ptr += inIncZ;
178   }
179 }
180
181 void vvSegmentationDialog::SetImage(vvImage::Pointer image)
182 {
183
184   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
185   mManager->SetImage(image);
186   mManager->SetSlicerWindow(0,viewWidget->GetRenderWindow());
187   vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
188   mManager->SetInteractorStyleNavigator(0,style);
189   style->Delete();
190
191   double range[2];
192   mManager->GetImage()->GetScalarRange(range);
193   mManager->GetSlicer(0)->SetColorWindow(range[1]-range[0]);
194   mManager->GetSlicer(0)->SetColorLevel((range[1]+range[0])/2);
195
196   clipping1Slider->setMinimum(range[0]);
197   clipping1Slider->setMaximum(range[1]);
198   clipping2Slider->setMinimum(range[0]);
199   clipping2Slider->setMaximum(range[1]);
200   clipping1Slider->setValue(range[0]);
201   clipping2Slider->setValue(range[1]);
202
203 #if VTK_MAJOR_VERSION <= 5
204   mClipper->SetInput(mManager->GetSlicer(0)->GetInput());
205 #else
206   mClipper->SetInputData(mManager->GetSlicer(0)->GetInput());
207 #endif
208   mSquares1->SetValue(0,clipping1Slider->value());
209   mSquares2->SetValue(0,clipping2Slider->value());
210
211 #if VTK_MAJOR_VERSION <= 5
212   mSquares1->SetInput(mClipper->GetOutput());
213   mSquares2->SetInput(mClipper->GetOutput());
214
215   mSquaresMapper1->SetInput(mSquares1->GetOutput());
216   mSquaresMapper2->SetInput(mSquares2->GetOutput());
217 #else
218   mSquares1->SetInputData(mClipper->GetOutput());
219   mSquares2->SetInputData(mClipper->GetOutput());
220
221   mSquaresMapper1->SetInputData(mSquares1->GetOutput());
222   mSquaresMapper2->SetInputData(mSquares2->GetOutput());
223 #endif
224   mSquaresMapper1->ScalarVisibilityOff();
225   mSquaresMapper2->ScalarVisibilityOff();
226
227   mSquaresActor1->SetMapper(mSquaresMapper1);
228   mSquaresActor2->SetMapper(mSquaresMapper2);
229   mSquaresActor1->GetProperty()->SetColor(1.0,0,0);
230   mSquaresActor2->GetProperty()->SetColor(0,0,1.0);
231   mSquaresActor1->SetPickable(0);
232   mSquaresActor2->SetPickable(0);
233
234   mManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor1);
235   mManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor2);
236
237   mSquares1->Update();
238   mSquares2->Update();
239
240   UpdateSlice(0,mManager->GetSlicer(0)->GetSlice());
241
242   connect(mManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
243   connect(mManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
244   connect(mManager,SIGNAL(UpdateSliceRange(int,int,int,int,int)),this,SLOT(UpdateSlice(int, int)));
245   connect(mManager,SIGNAL(LandmarkAdded()),this,SLOT(InsertSeed()));
246   QApplication::restoreOverrideCursor();
247 }
248
249 void vvSegmentationDialog::UpdateSlice(int slicer,int slices)
250 {
251   int slice = mManager->GetSlicer(0)->GetSlice();
252   int tslice = mManager->GetSlicer(0)->GetTSlice();
253 #if VTK_MAJOR_VERSION <= 5
254   mClipper->SetInput(mManager->GetSlicer(0)->GetInput());
255 #else
256   mClipper->SetInputData(mManager->GetSlicer(0)->GetInput());
257 #endif
258   int* extent = mManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
259   mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
260   int i;
261   for (i = 0; i < 6; i = i+2) {
262     if (extent[i] == extent[i+1]) {
263       break;
264     }
265   }
266
267   switch (i) {
268   case 0:
269     if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice) {
270       mSquaresActor1->SetPosition(1,0,0);
271       mSquaresActor2->SetPosition(1,0,0);
272     } else {
273       mSquaresActor1->SetPosition(-1,0,0);
274       mSquaresActor2->SetPosition(-1,0,0);
275     }
276     break;
277   case 2:
278     if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice) {
279       mSquaresActor1->SetPosition(0,1,0);
280       mSquaresActor2->SetPosition(0,1,0);
281     } else {
282       mSquaresActor1->SetPosition(0,-1,0);
283       mSquaresActor2->SetPosition(0,-1,0);
284     }
285     break;
286   case 4:
287     if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice) {
288       mSquaresActor1->SetPosition(0,0,1);
289       mSquaresActor2->SetPosition(0,0,1);
290     } else {
291       mSquaresActor1->SetPosition(0,0,-1);
292       mSquaresActor2->SetPosition(0,0,-1);
293     }
294     break;
295   }
296   mSquares1->Update();
297   mSquares2->Update();
298
299   if (m3DActors.size()) {
300     for (unsigned int i =0; i < m3DActors.size(); i++) {
301       if (m3DActors[i]->GetVisibility()) {
302         m3DActors[i]->VisibilityOff();
303       }
304     }
305     std::cout << "display " << tslice << " on " << m3DActors.size()  << std::endl;
306     m3DActors[tslice]->VisibilityOn();
307   }
308
309   mManager->Render();
310 }
311
312
313 void vvSegmentationDialog::clippingvaluechanged(int value)
314 {
315   binaryButton->setEnabled(1);
316   int min = (clipping1Slider->value() < clipping2Slider->value() ) ?
317             clipping1Slider->value():clipping2Slider->value();
318   int max = (clipping1Slider->value() > clipping2Slider->value() ) ?
319             clipping1Slider->value():clipping2Slider->value();
320   mSquares1->SetValue(0,min);
321   mSquares2->SetValue(0,max);
322
323   QString textMin = "<b> Min : </b>";
324   textMin += QString::number(min);
325   QString textMax = "\n <b> Max : </b>";
326   textMax += QString::number(max);
327   minLabel->setText(textMin);
328   maxLabel->setText(textMax);
329
330   if (mSquares1->GetInput()) {
331     mSquares1->Update();
332     mSquares2->Update();
333     mManager->Render();
334   }
335 }
336
337
338 void vvSegmentationDialog::BinariseSurface()
339 {
340   infoLabel->setText("Click erode then space on desired organ !");
341
342   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
343   int clampMin = (clipping1Slider->value() < clipping2Slider->value() ) ?
344                  clipping1Slider->value():clipping2Slider->value();
345   int clampMax = (clipping1Slider->value() > clipping2Slider->value() ) ?
346                  clipping1Slider->value():clipping2Slider->value();
347   vtkImageData* outputImage = vtkImageData::New();
348
349   for (unsigned int numImage = 0; numImage < mManager->GetSlicer(0)->GetImage()->GetVTKImages().size(); numImage++) {
350     vtkImageData* image = mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage];
351     int ext[6];
352 #if VTK_MAJOR_VERSION <= 5
353     image->GetWholeExtent(ext);
354 #else
355     image->GetExtent(ext);
356 #endif
357     void *in1Ptr;
358     in1Ptr = image->GetScalarPointerForExtent(ext);
359
360     switch (image->GetScalarType()) {
361       vtkTemplateMacro(
362         vvImageBinarize(image, static_cast<VTK_TT *>(in1Ptr),
363                         ext,clampMin,clampMax));
364     default:
365       std::cerr << "Error, unknown pixel format : " << image->GetScalarTypeAsString() << std::endl;
366       return;
367     }
368
369     outputImage->Initialize();
370     outputImage->SetExtent(ext);
371     outputImage->SetOrigin(image->GetOrigin());
372     outputImage->SetSpacing(image->GetSpacing());
373 #if VTK_MAJOR_VERSION <= 5
374     outputImage->SetScalarTypeToUnsignedChar();
375 #else
376     outputImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
377 #endif
378     outputImage->CopyAndCastFrom(image,ext);
379 #if VTK_MAJOR_VERSION <= 5
380     outputImage->Update();
381 #else
382     //outputImage->Update();
383 #endif
384
385     image->DeepCopy(outputImage);
386 #if VTK_MAJOR_VERSION <= 5
387     image->UpdateInformation();
388     image->PropagateUpdateExtent();
389 #else
390     //image->UpdateInformation();
391     //image->PropagateUpdateExtent();
392 #endif
393
394     vtkImageData* imageBin = vtkImageData::New();
395     imageBin->DeepCopy(image);
396 #if VTK_MAJOR_VERSION <= 5
397     imageBin->Update();
398 #else
399     //imageBin->Update();
400 #endif
401     mBinaireImages.push_back(imageBin);
402   }
403
404   outputImage->Delete();
405   erodeButton->setEnabled(1);
406   QApplication::restoreOverrideCursor();
407   mManager->SetColorWindow(2);
408   mManager->SetColorLevel(0.5);
409   mManager->Render();
410 }
411
412 void vvSegmentationDialog::Erode()
413 {
414   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
415   vtkImageContinuousErode3D* erode = vtkImageContinuousErode3D::New();
416   erode->SetKernelSize(mKernelValue,mKernelValue,mKernelValue);
417   for (unsigned int numImage = 0; numImage < mManager->GetSlicer(0)->GetImage()->GetVTKImages().size(); numImage++) {
418     vtkImageData* image = mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage];
419 #if VTK_MAJOR_VERSION <= 5
420     erode->SetInput(image);
421     erode->Update();
422 #else
423     erode->SetInputData(image);
424     //erode->Update();
425 #endif
426     image->DeepCopy(erode->GetOutput());
427 #if VTK_MAJOR_VERSION <= 5
428     image->Update();
429 #else
430     //image->Update();
431 #endif
432   }
433   erode->Delete();
434   dilateButton->setEnabled(1);
435   mManager->Render();
436   QApplication::restoreOverrideCursor();
437 }
438
439 void vvSegmentationDialog::Dilate()
440 {
441   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
442   vtkImageContinuousDilate3D* dilate = vtkImageContinuousDilate3D::New();
443   vtkImageLogic* And = vtkImageLogic::New();
444   And->SetOperationToAnd();
445   dilate->SetKernelSize(mKernelValue,mKernelValue,mKernelValue);
446   for (unsigned int numImage = 0; numImage < mManager->GetSlicer(0)->GetImage()->GetVTKImages().size(); numImage++) {
447     vtkImageData* image = mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage];
448 #if VTK_MAJOR_VERSION <= 5
449     dilate->SetInput(image);
450 #else
451     dilate->SetInputData(image);
452 #endif
453     vtkImageData* mask = mBinaireImages[numImage];
454 #if VTK_MAJOR_VERSION <= 5
455     And->SetInput1(dilate->GetOutput());
456     And->SetInput2(mask);
457 #else
458     And->SetInput1Data(dilate->GetOutput());
459     And->SetInput2Data(mask);
460 #endif
461     And->Update();
462     image->DeepCopy(And->GetOutput());
463 #if VTK_MAJOR_VERSION <= 5
464     image->Update();
465 #else
466     //image->Update();
467 #endif
468   }
469   And->Delete();
470   dilate->Delete();
471   mManager->Render();
472   QApplication::restoreOverrideCursor();
473 }
474
475 void vvSegmentationDialog::InsertSeed()
476 {
477   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
478   int point4D[4];
479   point4D[0] = mManager->GetLandmarks()->GetCoordinates(
480                  mManager->GetLandmarks()->GetNumberOfPoints()-1)[0];
481   point4D[1] = mManager->GetLandmarks()->GetCoordinates(
482                  mManager->GetLandmarks()->GetNumberOfPoints()-1)[1];
483   point4D[2] = mManager->GetLandmarks()->GetCoordinates(
484                  mManager->GetLandmarks()->GetNumberOfPoints()-1)[2];
485   point4D[3] = mManager->GetLandmarks()->GetCoordinates(
486                  mManager->GetLandmarks()->GetNumberOfPoints()-1)[3];
487
488   point4D[0] = (point4D[0]-mManager->GetSlicer(0)->GetImage()->GetVTKImages()[0]->GetOrigin()[0])/mManager->GetSlicer(0)->GetImage()->GetVTKImages()[0]->GetSpacing()[0];
489   point4D[1] = (point4D[1]-mManager->GetSlicer(0)->GetImage()->GetVTKImages()[0]->GetOrigin()[1])/mManager->GetSlicer(0)->GetImage()->GetVTKImages()[0]->GetSpacing()[1];
490   point4D[2] = (point4D[2]-mManager->GetSlicer(0)->GetImage()->GetVTKImages()[0]->GetOrigin()[2])/mManager->GetSlicer(0)->GetImage()->GetVTKImages()[0]->GetSpacing()[2];
491
492   vtkImageSeedConnectivity* seed = vtkImageSeedConnectivity::New();
493   seed->SetInputConnectValue(1);
494   seed->SetOutputConnectedValue(1);
495   seed->SetOutputUnconnectedValue(0);
496   seed->AddSeed(point4D[0],point4D[1],point4D[2]);
497
498   for (unsigned int numImage = 0; numImage < mManager->GetSlicer(0)->GetImage()->GetVTKImages().size(); numImage++) {
499     vtkImageData* image = mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage];
500 #if VTK_MAJOR_VERSION <= 5
501     seed->SetInput(image);
502 #else
503     seed->SetInputData(image);
504 #endif
505     seed->Update();
506     image->DeepCopy(seed->GetOutput());
507 #if VTK_MAJOR_VERSION <= 5
508     image->Update();
509 #else
510     //image->Update();
511 #endif
512   }
513
514   seed->Delete();
515   QApplication::restoreOverrideCursor();
516 }
517
518 void vvSegmentationDialog::ChangeDimRendering()
519 {
520   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
521
522   if (dimButton->text() == "3D") {
523     if (m3DActors.size() == 0) {
524       m3DExtractor->SetValue(0,0.5);
525       for (unsigned int numImage = 0; numImage < mManager->GetSlicer(0)->GetImage()->GetVTKImages().size(); numImage++) {
526         vtkActor* actor = vtkActor::New();
527 #if VTK_MAJOR_VERSION <= 5
528         m3DExtractor->SetInput(mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage]);
529 #else
530         m3DExtractor->SetInputData(mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage]);
531 #endif
532         m3DExtractor->Update();
533
534         vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
535 #if VTK_MAJOR_VERSION <= 5
536         mapper->SetInput(m3DExtractor->GetOutput());
537 #else
538         mapper->SetInputData(m3DExtractor->GetOutput());
539 #endif
540         m3DMappers.push_back(mapper);
541
542         actor->SetMapper(mapper);
543         actor->GetProperty()->SetColor(1.0,0.7,0.2);
544         actor->VisibilityOff();
545
546         mManager->GetSlicer(0)->GetRenderer()->AddActor(actor);
547         m3DActors.push_back(actor);
548       }
549     }
550
551     mManager->GetSlicer(0)->GetRenderer()->SetBackground(0.5,0.6,0.9);
552     m3DActors[0]->VisibilityOn();
553
554     vtkInteractorStyleTrackballCamera* style = vtkInteractorStyleTrackballCamera::New();
555     mManager->SetInteractorStyleNavigator(0,style);
556     style->Delete();
557
558     mManager->GetSlicer(0)->GetImageActor()->VisibilityOff();
559     mSquaresActor1->VisibilityOff();
560     mSquaresActor2->VisibilityOff();
561     mManager->Render();
562     dimButton->setText("2D");
563   } else {
564     mManager->GetSlicer(0)->GetRenderer()->SetBackground(0.0,0.0,0.0);
565     vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
566     mManager->SetInteractorStyleNavigator(0,style);
567     style->Delete();
568
569     mManager->GetSlicer(0)->SetSliceOrientation(2);
570     m3DActors[mManager->GetSlicer(0)->GetTSlice()]->VisibilityOff();
571
572     mManager->GetSlicer(0)->GetImageActor()->VisibilityOn();
573     mSquaresActor1->VisibilityOn();
574     mSquaresActor2->VisibilityOn();
575     dimButton->setText("3D");
576   }
577   QApplication::restoreOverrideCursor();
578 }
579
580 void vvSegmentationDialog::KernelValueChanged(int kernel)
581 {
582   mKernelValue = kernel;
583 }
584
585 void vvSegmentationDialog::Save()
586 {
587   if (dimButton->text() == "2D") { //If in *3D* mode, save the mesh
588     QString fileName = QFileDialog::getSaveFileName(this,
589                        tr("Save Mesh As"),
590                        QDir::home().dirName(),
591                        "Mesh Files (*.vtk *.vtp)");
592     if (!fileName.isEmpty()) {
593       vtkSmartPointer<vtkPolyDataWriter> w = vtkSmartPointer<vtkPolyDataWriter>::New();
594 #if VTK_MAJOR_VERSION <= 5
595       w->SetInput(m3DExtractor->GetOutput());
596 #else
597       w->SetInputData(m3DExtractor->GetOutput());
598 #endif
599       w->SetFileName(fileName.toStdString().c_str());
600       w->Write();
601     }
602   } else {
603     QStringList OutputListeFormat;
604     OutputListeFormat.clear();
605     int dimension = mManager->GetDimension();
606     if (dimension == 1) {
607       OutputListeFormat.push_back(".mhd");
608       OutputListeFormat.push_back(".mha");
609     }
610     if (dimension == 2) {
611       OutputListeFormat.push_back(".bmp");
612       OutputListeFormat.push_back(".png");
613       OutputListeFormat.push_back(".jpeg");
614       OutputListeFormat.push_back(".tif");
615       OutputListeFormat.push_back(".mha");
616       OutputListeFormat.push_back(".mhd");
617       OutputListeFormat.push_back(".hdr");
618       OutputListeFormat.push_back(".vox");
619     } else if (dimension == 3) {
620       OutputListeFormat.push_back(".mha");
621       OutputListeFormat.push_back(".mhd");
622       OutputListeFormat.push_back(".hdr");
623       OutputListeFormat.push_back(".vox");
624     } else if (dimension == 4) {
625       OutputListeFormat.push_back(".mha");
626       OutputListeFormat.push_back(".mhd");
627     }
628     QString Extensions = "AllFiles(*.*)";
629     for (int i = 0; i < OutputListeFormat.count(); i++) {
630       Extensions += ";;Images ( *";
631       Extensions += OutputListeFormat[i];
632       Extensions += ")";
633     }
634     QString fileName = QFileDialog::getSaveFileName(this,
635                        tr("Save As"),
636                        QDir::home().dirName(),
637                        Extensions);
638     if (!fileName.isEmpty()) {
639       std::string fileformat = vtksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
640       if (OutputListeFormat.contains(
641             fileformat.c_str())) {
642         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
643         vvProgressDialog progress("Saving "+fileName.toStdString());
644         qApp->processEvents();
645         vvImageWriter::Pointer writer = vvImageWriter::New();
646         writer->SetOutputFileName(fileName.toStdString());
647         writer->SetInput(mManager->GetSlicer(0)->GetImage());
648         writer->Update(dimension,"unsigned_char");
649         QApplication::restoreOverrideCursor();
650         if (writer->GetLastError().size()) {
651           QString error = "Saving did not succeed\n";
652           error += writer->GetLastError().c_str();
653           QMessageBox::information(this,tr("Saving Problem"),error);
654           Save();
655         }
656       } else {
657         QString error = fileformat.c_str();
658         if (error.isEmpty())
659           error += "no file format specified !";
660         else
661           error += " format unknown !!!\n";
662         QMessageBox::information(this,tr("Saving Problem"),error);
663         Save();
664       }
665     }
666   }
667 }
668
669 #endif /* end #define _vvSegmentationDialog_CXX */
670