1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
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
23 #include "vvSegmentationDialog.h"
24 #include "vvProgressDialog.h"
25 #include "vvImageWriter.h"
26 #include "vvLandmarks.h"
27 #include "vvInteractorStyleNavigator.h"
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>
61 #include <QMessageBox>
62 #include <QFileDialog>
65 # include "vvOSXHelper.h"
68 //====================================================================
69 vvSegmentationDialog::vvSegmentationDialog(QWidget * parent, Qt::WindowFlags f)
70 :QDialog(parent,f), Ui::vvSegmentationDialog()
75 mManager = new vvSlicerManager(1);
77 mClipper = vtkImageClip::New();
78 mSquares1 = vtkMarchingSquares::New();
79 mSquaresMapper1 = vtkPolyDataMapper::New();
80 mSquaresActor1 = vtkActor::New();
82 mSquares2 = vtkMarchingSquares::New();
83 mSquaresMapper2 = vtkPolyDataMapper::New();
84 mSquaresActor2 = vtkActor::New();
86 //m3DMapper = vtkPolyDataMapper::New();
87 //m3DActor = vtkActor::New();
88 m3DExtractor = vtkMarchingCubes::New();
89 m3DExtractor->ComputeScalarsOff();
93 mBinaireImages.clear();
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)));
105 binaryButton->setEnabled(0);
106 erodeButton->setEnabled(0);
107 dilateButton->setEnabled(0);
108 infoLabel->setText("Select Up and Down threshold before clicking binarise !");
111 disableGLHiDPI(viewWidget->winId());
115 vvSegmentationDialog::~vvSegmentationDialog()
119 mSquaresActor1->Delete();
120 mSquaresMapper1->Delete();
123 mSquaresActor2->Delete();
124 mSquaresMapper2->Delete();
127 //m3DMapper->Delete();
128 //m3DActor->Delete();
129 m3DExtractor->Delete();
131 for (unsigned int i = 0; i < mBinaireImages.size(); i++)
132 mBinaireImages[i]->Delete();
134 for (unsigned int i = 0; i < m3DActors.size(); i++)
135 m3DActors[i]->Delete();
137 for (unsigned int i = 0; i < m3DMappers.size(); i++)
138 m3DMappers[i]->Delete();
143 //----------------------------------------------------------------------------
144 // This templated function executes the filter for any type of data.
145 // Handles the one input operations
147 void vvImageBinarize(vtkImageData *in1Data, T *in1Ptr,
148 int outExt[6],int clampMin, int clampMax)
150 int idxR, idxY, idxZ;
152 vtkIdType inIncX, inIncY, inIncZ;
155 // find the region to loop over
157 (outExt[1] - outExt[0]+1)*in1Data->GetNumberOfScalarComponents();
158 // What a pain. Maybe I should just make another filter.
160 maxY = outExt[3] - outExt[2];
161 maxZ = outExt[5] - outExt[4];
163 // Get increments to march through data
164 in1Data->GetContinuousIncrements(outExt, inIncX, inIncY, inIncZ);
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);
172 *in1Ptr = static_cast<T>(0);
181 void vvSegmentationDialog::SetImage(vvImage::Pointer image)
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);
192 mManager->GetImage()->GetScalarRange(range);
193 mManager->GetSlicer(0)->SetColorWindow(range[1]-range[0]);
194 mManager->GetSlicer(0)->SetColorLevel((range[1]+range[0])/2);
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]);
203 #if VTK_MAJOR_VERSION <= 5
204 mClipper->SetInput(mManager->GetSlicer(0)->GetInput());
206 mClipper->SetInputData(mManager->GetSlicer(0)->GetInput());
208 mSquares1->SetValue(0,clipping1Slider->value());
209 mSquares2->SetValue(0,clipping2Slider->value());
211 #if VTK_MAJOR_VERSION <= 5
212 mSquares1->SetInput(mClipper->GetOutput());
213 mSquares2->SetInput(mClipper->GetOutput());
215 mSquaresMapper1->SetInput(mSquares1->GetOutput());
216 mSquaresMapper2->SetInput(mSquares2->GetOutput());
218 mSquares1->SetInputData(mClipper->GetOutput());
219 mSquares2->SetInputData(mClipper->GetOutput());
221 mSquaresMapper1->SetInputData(mSquares1->GetOutput());
222 mSquaresMapper2->SetInputData(mSquares2->GetOutput());
224 mSquaresMapper1->ScalarVisibilityOff();
225 mSquaresMapper2->ScalarVisibilityOff();
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);
234 mManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor1);
235 mManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor2);
240 UpdateSlice(0,mManager->GetSlicer(0)->GetSlice());
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();
249 void vvSegmentationDialog::UpdateSlice(int slicer,int slices)
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());
256 mClipper->SetInputData(mManager->GetSlicer(0)->GetInput());
258 int* extent = mManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
259 mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
261 for (i = 0; i < 6; i = i+2) {
262 if (extent[i] == extent[i+1]) {
269 if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice) {
270 mSquaresActor1->SetPosition(1,0,0);
271 mSquaresActor2->SetPosition(1,0,0);
273 mSquaresActor1->SetPosition(-1,0,0);
274 mSquaresActor2->SetPosition(-1,0,0);
278 if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice) {
279 mSquaresActor1->SetPosition(0,1,0);
280 mSquaresActor2->SetPosition(0,1,0);
282 mSquaresActor1->SetPosition(0,-1,0);
283 mSquaresActor2->SetPosition(0,-1,0);
287 if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice) {
288 mSquaresActor1->SetPosition(0,0,1);
289 mSquaresActor2->SetPosition(0,0,1);
291 mSquaresActor1->SetPosition(0,0,-1);
292 mSquaresActor2->SetPosition(0,0,-1);
299 if (m3DActors.size()) {
300 for (unsigned int i =0; i < m3DActors.size(); i++) {
301 if (m3DActors[i]->GetVisibility()) {
302 m3DActors[i]->VisibilityOff();
305 std::cout << "display " << tslice << " on " << m3DActors.size() << std::endl;
306 m3DActors[tslice]->VisibilityOn();
313 void vvSegmentationDialog::clippingvaluechanged(int value)
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);
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);
330 if (mSquares1->GetInput()) {
338 void vvSegmentationDialog::BinariseSurface()
340 infoLabel->setText("Click erode then space on desired organ !");
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();
349 for (unsigned int numImage = 0; numImage < mManager->GetSlicer(0)->GetImage()->GetVTKImages().size(); numImage++) {
350 vtkImageData* image = mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage];
352 #if VTK_MAJOR_VERSION <= 5
353 image->GetWholeExtent(ext);
355 image->GetExtent(ext);
358 in1Ptr = image->GetScalarPointerForExtent(ext);
360 switch (image->GetScalarType()) {
362 vvImageBinarize(image, static_cast<VTK_TT *>(in1Ptr),
363 ext,clampMin,clampMax));
365 std::cerr << "Error, unknown pixel format : " << image->GetScalarTypeAsString() << std::endl;
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();
376 outputImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
378 outputImage->CopyAndCastFrom(image,ext);
379 #if VTK_MAJOR_VERSION <= 5
380 outputImage->Update();
382 //outputImage->Update();
385 image->DeepCopy(outputImage);
386 #if VTK_MAJOR_VERSION <= 5
387 image->UpdateInformation();
388 image->PropagateUpdateExtent();
390 //image->UpdateInformation();
391 //image->PropagateUpdateExtent();
394 vtkImageData* imageBin = vtkImageData::New();
395 imageBin->DeepCopy(image);
396 #if VTK_MAJOR_VERSION <= 5
399 //imageBin->Update();
401 mBinaireImages.push_back(imageBin);
404 outputImage->Delete();
405 erodeButton->setEnabled(1);
406 QApplication::restoreOverrideCursor();
407 mManager->SetColorWindow(2);
408 mManager->SetColorLevel(0.5);
412 void vvSegmentationDialog::Erode()
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);
423 erode->SetInputData(image);
426 image->DeepCopy(erode->GetOutput());
427 #if VTK_MAJOR_VERSION <= 5
434 dilateButton->setEnabled(1);
436 QApplication::restoreOverrideCursor();
439 void vvSegmentationDialog::Dilate()
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);
451 dilate->SetInputData(image);
453 vtkImageData* mask = mBinaireImages[numImage];
454 #if VTK_MAJOR_VERSION <= 5
455 And->SetInput1(dilate->GetOutput());
456 And->SetInput2(mask);
458 And->SetInput1Data(dilate->GetOutput());
459 And->SetInput2Data(mask);
462 image->DeepCopy(And->GetOutput());
463 #if VTK_MAJOR_VERSION <= 5
472 QApplication::restoreOverrideCursor();
475 void vvSegmentationDialog::InsertSeed()
477 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
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];
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];
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]);
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);
503 seed->SetInputData(image);
506 image->DeepCopy(seed->GetOutput());
507 #if VTK_MAJOR_VERSION <= 5
515 QApplication::restoreOverrideCursor();
518 void vvSegmentationDialog::ChangeDimRendering()
520 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
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]);
530 m3DExtractor->SetInputData(mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage]);
532 m3DExtractor->Update();
534 vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
535 #if VTK_MAJOR_VERSION <= 5
536 mapper->SetInput(m3DExtractor->GetOutput());
538 mapper->SetInputData(m3DExtractor->GetOutput());
540 m3DMappers.push_back(mapper);
542 actor->SetMapper(mapper);
543 actor->GetProperty()->SetColor(1.0,0.7,0.2);
544 actor->VisibilityOff();
546 mManager->GetSlicer(0)->GetRenderer()->AddActor(actor);
547 m3DActors.push_back(actor);
551 mManager->GetSlicer(0)->GetRenderer()->SetBackground(0.5,0.6,0.9);
552 m3DActors[0]->VisibilityOn();
554 vtkInteractorStyleTrackballCamera* style = vtkInteractorStyleTrackballCamera::New();
555 mManager->SetInteractorStyleNavigator(0,style);
558 mManager->GetSlicer(0)->GetImageActor()->VisibilityOff();
559 mSquaresActor1->VisibilityOff();
560 mSquaresActor2->VisibilityOff();
562 dimButton->setText("2D");
564 mManager->GetSlicer(0)->GetRenderer()->SetBackground(0.0,0.0,0.0);
565 vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
566 mManager->SetInteractorStyleNavigator(0,style);
569 mManager->GetSlicer(0)->SetSliceOrientation(2);
570 m3DActors[mManager->GetSlicer(0)->GetTSlice()]->VisibilityOff();
572 mManager->GetSlicer(0)->GetImageActor()->VisibilityOn();
573 mSquaresActor1->VisibilityOn();
574 mSquaresActor2->VisibilityOn();
575 dimButton->setText("3D");
577 QApplication::restoreOverrideCursor();
580 void vvSegmentationDialog::KernelValueChanged(int kernel)
582 mKernelValue = kernel;
585 void vvSegmentationDialog::Save()
587 if (dimButton->text() == "2D") { //If in *3D* mode, save the mesh
588 QString fileName = QFileDialog::getSaveFileName(this,
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());
597 w->SetInputData(m3DExtractor->GetOutput());
599 w->SetFileName(fileName.toStdString().c_str());
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");
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");
628 QString Extensions = "AllFiles(*.*)";
629 for (int i = 0; i < OutputListeFormat.count(); i++) {
630 Extensions += ";;Images ( *";
631 Extensions += OutputListeFormat[i];
634 QString fileName = QFileDialog::getSaveFileName(this,
636 QDir::home().dirName(),
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);
657 QString error = fileformat.c_str();
659 error += "no file format specified !";
661 error += " format unknown !!!\n";
662 QMessageBox::information(this,tr("Saving Problem"),error);
669 #endif /* end #define _vvSegmentationDialog_CXX */