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