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>
64 //====================================================================
65 vvSegmentationDialog::vvSegmentationDialog(QWidget * parent, Qt::WindowFlags f)
66 :QDialog(parent,f), Ui::vvSegmentationDialog()
71 mManager = new vvSlicerManager(1);
73 mClipper = vtkImageClip::New();
74 mSquares1 = vtkMarchingSquares::New();
75 mSquaresMapper1 = vtkPolyDataMapper::New();
76 mSquaresActor1 = vtkActor::New();
78 mSquares2 = vtkMarchingSquares::New();
79 mSquaresMapper2 = vtkPolyDataMapper::New();
80 mSquaresActor2 = vtkActor::New();
82 //m3DMapper = vtkPolyDataMapper::New();
83 //m3DActor = vtkActor::New();
84 m3DExtractor = vtkMarchingCubes::New();
85 m3DExtractor->ComputeScalarsOff();
89 mBinaireImages.clear();
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)));
101 binaryButton->setEnabled(0);
102 erodeButton->setEnabled(0);
103 dilateButton->setEnabled(0);
104 infoLabel->setText("Select Up and Down threshold before clicking binarise !");
107 vvSegmentationDialog::~vvSegmentationDialog()
111 mSquaresActor1->Delete();
112 mSquaresMapper1->Delete();
115 mSquaresActor2->Delete();
116 mSquaresMapper2->Delete();
119 //m3DMapper->Delete();
120 //m3DActor->Delete();
121 m3DExtractor->Delete();
123 for (unsigned int i = 0; i < mBinaireImages.size(); i++)
124 mBinaireImages[i]->Delete();
126 for (unsigned int i = 0; i < m3DActors.size(); i++)
127 m3DActors[i]->Delete();
129 for (unsigned int i = 0; i < m3DMappers.size(); i++)
130 m3DMappers[i]->Delete();
135 //----------------------------------------------------------------------------
136 // This templated function executes the filter for any type of data.
137 // Handles the one input operations
139 void vvImageBinarize(vtkImageData *in1Data, T *in1Ptr,
140 int outExt[6],int clampMin, int clampMax)
142 int idxR, idxY, idxZ;
144 vtkIdType inIncX, inIncY, inIncZ;
147 // find the region to loop over
149 (outExt[1] - outExt[0]+1)*in1Data->GetNumberOfScalarComponents();
150 // What a pain. Maybe I should just make another filter.
152 maxY = outExt[3] - outExt[2];
153 maxZ = outExt[5] - outExt[4];
155 // Get increments to march through data
156 in1Data->GetContinuousIncrements(outExt, inIncX, inIncY, inIncZ);
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);
164 *in1Ptr = static_cast<T>(0);
173 void vvSegmentationDialog::SetImage(vvImage::Pointer image)
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);
184 mManager->GetImage()->GetScalarRange(range);
185 mManager->GetSlicer(0)->SetColorWindow(range[1]-range[0]);
186 mManager->GetSlicer(0)->SetColorLevel((range[1]+range[0])/2);
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]);
195 #if VTK_MAJOR_VERSION <= 5
196 mClipper->SetInput(mManager->GetSlicer(0)->GetInput());
198 mClipper->SetInputData(mManager->GetSlicer(0)->GetInput());
200 mSquares1->SetValue(0,clipping1Slider->value());
201 mSquares2->SetValue(0,clipping2Slider->value());
203 #if VTK_MAJOR_VERSION <= 5
204 mSquares1->SetInput(mClipper->GetOutput());
205 mSquares2->SetInput(mClipper->GetOutput());
207 mSquaresMapper1->SetInput(mSquares1->GetOutput());
208 mSquaresMapper2->SetInput(mSquares2->GetOutput());
210 mSquares1->SetInputData(mClipper->GetOutput());
211 mSquares2->SetInputData(mClipper->GetOutput());
213 mSquaresMapper1->SetInputData(mSquares1->GetOutput());
214 mSquaresMapper2->SetInputData(mSquares2->GetOutput());
216 mSquaresMapper1->ScalarVisibilityOff();
217 mSquaresMapper2->ScalarVisibilityOff();
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);
226 mManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor1);
227 mManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor2);
232 UpdateSlice(0,mManager->GetSlicer(0)->GetSlice());
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();
241 void vvSegmentationDialog::UpdateSlice(int slicer,int slices)
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());
248 mClipper->SetInputData(mManager->GetSlicer(0)->GetInput());
250 int* extent = mManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
251 mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
253 for (i = 0; i < 6; i = i+2) {
254 if (extent[i] == extent[i+1]) {
261 if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice) {
262 mSquaresActor1->SetPosition(1,0,0);
263 mSquaresActor2->SetPosition(1,0,0);
265 mSquaresActor1->SetPosition(-1,0,0);
266 mSquaresActor2->SetPosition(-1,0,0);
270 if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice) {
271 mSquaresActor1->SetPosition(0,1,0);
272 mSquaresActor2->SetPosition(0,1,0);
274 mSquaresActor1->SetPosition(0,-1,0);
275 mSquaresActor2->SetPosition(0,-1,0);
279 if (mManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice) {
280 mSquaresActor1->SetPosition(0,0,1);
281 mSquaresActor2->SetPosition(0,0,1);
283 mSquaresActor1->SetPosition(0,0,-1);
284 mSquaresActor2->SetPosition(0,0,-1);
291 if (m3DActors.size()) {
292 for (unsigned int i =0; i < m3DActors.size(); i++) {
293 if (m3DActors[i]->GetVisibility()) {
294 m3DActors[i]->VisibilityOff();
297 std::cout << "display " << tslice << " on " << m3DActors.size() << std::endl;
298 m3DActors[tslice]->VisibilityOn();
305 void vvSegmentationDialog::clippingvaluechanged(int value)
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);
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);
322 if (mSquares1->GetInput()) {
330 void vvSegmentationDialog::BinariseSurface()
332 infoLabel->setText("Click erode then space on desired organ !");
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();
341 for (unsigned int numImage = 0; numImage < mManager->GetSlicer(0)->GetImage()->GetVTKImages().size(); numImage++) {
342 vtkImageData* image = mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage];
344 #if VTK_MAJOR_VERSION <= 5
345 image->GetWholeExtent(ext);
347 image->GetExtent(ext);
350 in1Ptr = image->GetScalarPointerForExtent(ext);
352 switch (image->GetScalarType()) {
354 vvImageBinarize(image, static_cast<VTK_TT *>(in1Ptr),
355 ext,clampMin,clampMax));
357 std::cerr << "Error, unknown pixel format : " << image->GetScalarTypeAsString() << std::endl;
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();
368 outputImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
370 outputImage->CopyAndCastFrom(image,ext);
371 #if VTK_MAJOR_VERSION <= 5
372 outputImage->Update();
374 //outputImage->Update();
377 image->DeepCopy(outputImage);
378 #if VTK_MAJOR_VERSION <= 5
379 image->UpdateInformation();
380 image->PropagateUpdateExtent();
382 //image->UpdateInformation();
383 //image->PropagateUpdateExtent();
386 vtkImageData* imageBin = vtkImageData::New();
387 imageBin->DeepCopy(image);
388 #if VTK_MAJOR_VERSION <= 5
391 //imageBin->Update();
393 mBinaireImages.push_back(imageBin);
396 outputImage->Delete();
397 erodeButton->setEnabled(1);
398 QApplication::restoreOverrideCursor();
399 mManager->SetColorWindow(2);
400 mManager->SetColorLevel(0.5);
404 void vvSegmentationDialog::Erode()
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);
415 erode->SetInputData(image);
418 image->DeepCopy(erode->GetOutput());
419 #if VTK_MAJOR_VERSION <= 5
426 dilateButton->setEnabled(1);
428 QApplication::restoreOverrideCursor();
431 void vvSegmentationDialog::Dilate()
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);
443 dilate->SetInputData(image);
445 vtkImageData* mask = mBinaireImages[numImage];
446 #if VTK_MAJOR_VERSION <= 5
447 And->SetInput1(dilate->GetOutput());
448 And->SetInput2(mask);
450 And->SetInput1Data(dilate->GetOutput());
451 And->SetInput2Data(mask);
454 image->DeepCopy(And->GetOutput());
455 #if VTK_MAJOR_VERSION <= 5
464 QApplication::restoreOverrideCursor();
467 void vvSegmentationDialog::InsertSeed()
469 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
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];
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];
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]);
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);
495 seed->SetInputData(image);
498 image->DeepCopy(seed->GetOutput());
499 #if VTK_MAJOR_VERSION <= 5
507 QApplication::restoreOverrideCursor();
510 void vvSegmentationDialog::ChangeDimRendering()
512 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
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]);
522 m3DExtractor->SetInputData(mManager->GetSlicer(0)->GetImage()->GetVTKImages()[numImage]);
524 m3DExtractor->Update();
526 vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
527 #if VTK_MAJOR_VERSION <= 5
528 mapper->SetInput(m3DExtractor->GetOutput());
530 mapper->SetInputData(m3DExtractor->GetOutput());
532 m3DMappers.push_back(mapper);
534 actor->SetMapper(mapper);
535 actor->GetProperty()->SetColor(1.0,0.7,0.2);
536 actor->VisibilityOff();
538 mManager->GetSlicer(0)->GetRenderer()->AddActor(actor);
539 m3DActors.push_back(actor);
543 mManager->GetSlicer(0)->GetRenderer()->SetBackground(0.5,0.6,0.9);
544 m3DActors[0]->VisibilityOn();
546 vtkInteractorStyleTrackballCamera* style = vtkInteractorStyleTrackballCamera::New();
547 mManager->SetInteractorStyleNavigator(0,style);
550 mManager->GetSlicer(0)->GetImageActor()->VisibilityOff();
551 mSquaresActor1->VisibilityOff();
552 mSquaresActor2->VisibilityOff();
554 dimButton->setText("2D");
556 mManager->GetSlicer(0)->GetRenderer()->SetBackground(0.0,0.0,0.0);
557 vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
558 mManager->SetInteractorStyleNavigator(0,style);
561 mManager->GetSlicer(0)->SetSliceOrientation(2);
562 m3DActors[mManager->GetSlicer(0)->GetTSlice()]->VisibilityOff();
564 mManager->GetSlicer(0)->GetImageActor()->VisibilityOn();
565 mSquaresActor1->VisibilityOn();
566 mSquaresActor2->VisibilityOn();
567 dimButton->setText("3D");
569 QApplication::restoreOverrideCursor();
572 void vvSegmentationDialog::KernelValueChanged(int kernel)
574 mKernelValue = kernel;
577 void vvSegmentationDialog::Save()
579 if (dimButton->text() == "2D") { //If in *3D* mode, save the mesh
580 QString fileName = QFileDialog::getSaveFileName(this,
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());
589 w->SetInputData(m3DExtractor->GetOutput());
591 w->SetFileName(fileName.toStdString().c_str());
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");
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");
620 QString Extensions = "AllFiles(*.*)";
621 for (int i = 0; i < OutputListeFormat.count(); i++) {
622 Extensions += ";;Images ( *";
623 Extensions += OutputListeFormat[i];
626 QString fileName = QFileDialog::getSaveFileName(this,
628 QDir::home().dirName(),
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);
649 QString error = fileformat.c_str();
651 error += "no file format specified !";
653 error += " format unknown !!!\n";
654 QMessageBox::information(this,tr("Saving Problem"),error);
661 #endif /* end #define _vvSegmentationDialog_CXX */