Typedefs | |
typedef std::vector < mitk::DataNode * > | DataNodeVector |
Functions | |
template<typename TImageType > | |
static void | MinMax (typename TImageType::Pointer image, float &min, float &max) |
compute min and max | |
template<typename TImageType > | |
static void | AutoLevelWindow (mitk::DataNode::Pointer node) |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpen (const QString &fileName) |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpen (const char *fileName) |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpenSpecific (const QString &fileExtensions) |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpenSpecific (const char *fileExtensions) |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpenImageSequence (const QString &fileName) |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpenImageSequence (const char *fileName) |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpenImageSequence () |
QmitkExt_EXPORT mitk::DataNode::Pointer | FileOpen () |
QmitkExt_EXPORT mitk::DataNode::Pointer | OpenVolumeOrSliceStack () |
QmitkExt_EXPORT std::string | SaveImage (mitk::Image *image, const char *aFileName=NULL, bool askForDifferentFilename=false) |
QmitkExt_EXPORT std::string | SaveSurface (mitk::Surface *surface, const char *fileName=NULL) |
QmitkExt_EXPORT std::string | SaveScreenshot (vtkRenderWindow *renderWindow, const char *filename=NULL) |
QmitkExt_EXPORT void | SaveToFileWriter (mitk::FileWriterWithInformation::Pointer fileWriter, mitk::BaseData::Pointer data, const char *aFileName, const char *propFileName) |
QmitkExt_EXPORT void | SaveBaseData (mitk::BaseData *data, const char *name=NULL) |
This class provides some data handling methods, like loading data or adding different types to the data tree...
typedef std::vector<mitk::DataNode*> CommonFunctionality::DataNodeVector |
Definition at line 70 of file QmitkCommonFunctionality.h.
static void CommonFunctionality::AutoLevelWindow | ( | mitk::DataNode::Pointer | node ) | [static] |
Definition at line 89 of file QmitkCommonFunctionality.h.
References mitk::CastToItkImage(), mitk::LevelWindowProperty::New(), mitk::LevelWindow::SetLevelWindow(), and mitk::LevelWindow::SetRangeMinMax().
{ mitk::Image::Pointer image = dynamic_cast<mitk::Image*> (node->GetData() ); if ( image.IsNotNull() ) { typename TImageType::Pointer itkImage= TImageType::New(); mitk::CastToItkImage( image, itkImage); float extrema[2]; extrema[0] = 0; extrema[1] = 4096; MinMax<TImageType>(itkImage,extrema[0],extrema[1]); mitk::LevelWindowProperty::Pointer levWinProp = dynamic_cast<mitk::LevelWindowProperty*>(node->GetPropertyList()->GetProperty("levelwindow")); if( levWinProp.IsNull() ) { levWinProp = mitk::LevelWindowProperty::New(); node->GetPropertyList()->SetProperty("levelwindow", levWinProp); } double window = (extrema[1] - extrema[0])/10.0; double level = window/2; mitk::LevelWindow levWin = levWinProp->GetLevelWindow(); levWin.SetRangeMinMax(extrema[0], extrema[1]); levWin.SetLevelWindow( level, window ); levWinProp->SetLevelWindow(levWin); } }
mitk::DataNode::Pointer CommonFunctionality::FileOpen | ( | const char * | fileName ) |
Definition at line 234 of file QmitkCommonFunctionality.cpp.
References mitk::DataNodeFactory::New().
{ mitk::DataNodeFactory::Pointer factory = mitk::DataNodeFactory::New(); try { factory->SetFileName( fileName ); factory->Update(); return factory->GetOutput( 0 ); } catch ( itk::ExceptionObject & ex ) { itkGenericOutputMacro( << "Exception during file open: " << ex ); return NULL; } }
mitk::DataNode::Pointer CommonFunctionality::FileOpen | ( | ) |
Definition at line 310 of file QmitkCommonFunctionality.cpp.
References FileOpenSpecific(), and mitk::CoreObjectFactory::GetInstance().
{ return CommonFunctionality::FileOpenSpecific( mitk::CoreObjectFactory::GetInstance()->GetFileExtensions() ); }
mitk::DataNode::Pointer CommonFunctionality::FileOpen | ( | const QString & | fileName ) |
Definition at line 229 of file QmitkCommonFunctionality.cpp.
Referenced by FileOpenImageSequence(), FileOpenSpecific(), and OpenVolumeOrSliceStack().
{ return FileOpen( fileName.toLocal8Bit().constData() ); }
mitk::DataNode::Pointer CommonFunctionality::FileOpenImageSequence | ( | const char * | fileName ) |
Definition at line 256 of file QmitkCommonFunctionality.cpp.
References FileOpen(), and mitk::DataNodeFactory::New().
{ if(aFileName==NULL) return NULL; mitk::DataNodeFactory::Pointer factory = mitk::DataNodeFactory::New(); QString fileName = aFileName; if (!fileName.contains("dcm") && !fileName.contains("DCM")) { int fnstart = fileName.lastIndexOf( QRegExp("[/\\\\]"), fileName.length() ); if(fnstart<0) fnstart=0; int start = fileName.indexOf( QRegExp("[0-9]"), fnstart ); if(start<0) { return FileOpen(fileName.toLocal8Bit().constData());; } char prefix[1024], pattern[1024]; strncpy(prefix, fileName.toLocal8Bit().constData(), start); prefix[start]=0; int stop=fileName.indexOf( QRegExp("[^0-9]"), start ); sprintf(pattern, "%%s%%0%uu%s",stop-start,fileName.toLocal8Bit().constData()+stop); factory->SetFilePattern( pattern ); factory->SetFilePrefix( prefix ); } else { // factory->SetFileName( fileName ); factory->SetFilePattern( fileName.toLocal8Bit().constData() ); factory->SetFilePrefix( fileName.toLocal8Bit().constData() ); } factory->Update(); return factory->GetOutput( 0 ); }
mitk::DataNode::Pointer CommonFunctionality::FileOpenImageSequence | ( | ) |
Definition at line 296 of file QmitkCommonFunctionality.cpp.
References FileOpenImageSequence(), and mitk::CoreObjectFactory::GetInstance().
{ QString fileName = QFileDialog::getOpenFileName(NULL,mitk::CoreObjectFactory::GetInstance()->GetFileExtensions()); if ( !fileName.isNull() ) { return FileOpenImageSequence(fileName); } else { return NULL; } }
mitk::DataNode::Pointer CommonFunctionality::FileOpenImageSequence | ( | const QString & | fileName ) |
Definition at line 251 of file QmitkCommonFunctionality.cpp.
Referenced by FileOpenImageSequence(), FileOpenSpecific(), and OpenVolumeOrSliceStack().
{ return FileOpenImageSequence( aFileName.toLocal8Bit().constData() ); }
mitk::DataNode::Pointer CommonFunctionality::FileOpenSpecific | ( | const QString & | fileExtensions ) |
Definition at line 315 of file QmitkCommonFunctionality.cpp.
Referenced by FileOpen().
{ return FileOpenSpecific( fileExtensions.toLocal8Bit().constData() ); }
mitk::DataNode::Pointer CommonFunctionality::FileOpenSpecific | ( | const char * | fileExtensions ) |
Definition at line 320 of file QmitkCommonFunctionality.cpp.
References FileOpen(), and FileOpenImageSequence().
{ QString fileName = QFileDialog::getOpenFileName( NULL, fileExtensions ); if ( !fileName.isNull() ) { mitk::DataNode::Pointer result = FileOpen(fileName.toLocal8Bit().constData()); if ( result.IsNull() ) { return FileOpenImageSequence(fileName); } else { return result; } } else { return NULL; } }
static void CommonFunctionality::MinMax | ( | typename TImageType::Pointer | image, |
float & | min, | ||
float & | max | ||
) | [static] |
compute min and max
Definition at line 74 of file QmitkCommonFunctionality.h.
mitk::DataNode::Pointer CommonFunctionality::OpenVolumeOrSliceStack | ( | ) |
Definition at line 341 of file QmitkCommonFunctionality.cpp.
References FileOpen(), FileOpenImageSequence(), and mitk::CoreObjectFactory::GetInstance().
{ mitk::DataNode::Pointer newNode = NULL; QString fileName = QFileDialog::getOpenFileName(NULL,mitk::CoreObjectFactory::GetInstance()->GetFileExtensions() ); if ( !fileName.isNull() ) { newNode = CommonFunctionality::FileOpen(fileName); if (newNode.IsNotNull()) { mitk::Image::Pointer imageData = dynamic_cast<mitk::Image*> (newNode->GetData()) ; if (imageData.IsNull()) return NULL; if (imageData->GetDimension(2) == 1) { // std::string dir = itksys::SystemTools::GetFilenamePath( std::string(fileName.ascii()) ) newNode = CommonFunctionality::FileOpenImageSequence(fileName); imageData = dynamic_cast<mitk::Image*> (newNode->GetData()); } return newNode; } } { return NULL; } }
void CommonFunctionality::SaveBaseData | ( | mitk::BaseData * | data, |
const char * | aFileName = NULL |
||
) |
Saves the given mitk::BaseData to a file. The user is prompted to enter a file name. Currently only mitk::Image, mitk::Surface, mitk::PointSet and mitk::VesselGraphData are supported. This function is deprecated until the save-problem is solved by means of a Save-Factory or any other "nice" mechanism
Definition at line 97 of file QmitkCommonFunctionality.cpp.
References mitk::CoreObjectFactory::GetInstance(), MITK_INFO, mitk::PointSetWriter::New(), SaveImage(), SaveSurface(), and SaveToFileWriter().
Referenced by mitk::SceneIO::SaveScene(), and QmitkDataManagerView::SaveSelectedNodes().
{ //save initial time QDateTime initialTime = QDateTime::currentDateTime(); std::string fileNameUsed; //file name that was actually used by the writer (e.g. after file open dialog) bool writingSuccessful = false; try{ if (data != NULL) { mitk::Image::Pointer image = dynamic_cast<mitk::Image*>(data); QString classname(data->GetNameOfClass()); if(image.IsNotNull() && classname.compare("Image")==0) { fileNameUsed = CommonFunctionality::SaveImage(image, aFileName, true); if(!(fileNameUsed.length()>0)){ return; } else { writingSuccessful = true; } } if(!writingSuccessful) { mitk::PointSet::Pointer pointset = dynamic_cast<mitk::PointSet*>(data); if(pointset.IsNotNull()) { std::string fileName; if(aFileName == NULL) fileName = "PointSet"; else fileName = aFileName; fileName = itksys::SystemTools::GetFilenameWithoutExtension(fileName); fileName += ".mps"; QString qfileName = QFileDialog::getSaveFileName(NULL, "Save file", QString(fileName.c_str()),"MITK Point-Sets (*.mps)"); MITK_INFO<<qfileName.toLocal8Bit().constData(); mitk::PointSetWriter::Pointer writer = mitk::PointSetWriter::New(); std::string extension = itksys::SystemTools::GetFilenameLastExtension( qfileName.toLocal8Bit().constData() ); // check if extension is valid if (!writer->IsExtensionValid(extension)) { QString message; message.append("File extension not suitable for writing point set data. Choose one extension of this list: "); message.append(writer->GetPossibleFileExtensionsAsString().c_str()); QMessageBox::critical(NULL,"ERROR",message); return; } if (fileName.empty() == false ) { writer->SetInput( pointset ); writer->SetFileName( qfileName.toLocal8Bit().constData() ); writer->Update(); fileNameUsed = writer->GetFileName(); writingSuccessful = true; } else { return; } } if(!writingSuccessful) { mitk::Surface::Pointer surface = dynamic_cast<mitk::Surface*>(data); if(surface.IsNotNull()) { fileNameUsed = CommonFunctionality::SaveSurface(surface, aFileName); if(!(fileNameUsed.length()>0)){ return; } else { writingSuccessful = true; } } if(!writingSuccessful) { // now try the file writers provided by the CoreObjectFactory mitk::CoreObjectFactory::FileWriterList fileWriters = mitk::CoreObjectFactory::GetInstance()->GetFileWriters(); bool writerFound = false; for (mitk::CoreObjectFactory::FileWriterList::iterator it = fileWriters.begin() ; it != fileWriters.end() ; ++it) { if ( (*it)->CanWriteDataType(data) ) { writerFound = true; SaveToFileWriter(*it, data, NULL, aFileName); fileNameUsed = (*it)->GetFileName(); // correct writer has been found->break if(!(fileNameUsed.length()>0)){ return; } else { writingSuccessful = true; break; } } } if(!writerFound) { // no appropriate writer has been found QMessageBox::critical(NULL,"ERROR","Could not find file writer for this data type"); return; } } } } } else { QMessageBox::critical(NULL,"ERROR","Cannot write data (invalid/empty)"); return; } } catch(itk::ExceptionObject e) { QMessageBox::critical( NULL, "SaveDialog", e.GetDescription(),QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); } //writing is assumed to have been successful //check if file exists, file size >0 and last modified after this function was called try{ QFileInfo* fileInfo = new QFileInfo(QString(fileNameUsed.c_str())); if(!fileInfo->exists()) { QMessageBox::warning(NULL,"WARNING","File was not created or was split into multiple files"); } else if(fileInfo->size()==0) { QMessageBox::warning(NULL,"WARNING","File is empty"); } else if(fileInfo->lastModified()<initialTime) { QMessageBox::warning(NULL,"WARNING","Save not successful. File was not updated (only old version available)"); } delete fileInfo; } catch(...) { QMessageBox::critical(NULL,"ERROR","Save not successful. Possibly no writing permission."); } }
std::string CommonFunctionality::SaveImage | ( | mitk::Image * | image, |
const char * | aFileName = NULL , |
||
bool | askForDifferentFilename = false |
||
) |
Definition at line 444 of file QmitkCommonFunctionality.cpp.
References mitk::CoreObjectFactory::GetInstance(), MITK_INFO, and mitk::ImageWriter::New().
Referenced by SaveBaseData().
{ static QString lastDirectory = ""; std::string fileName; if(aFileName == NULL || askForDifferentFilename) { QString initialFilename(aFileName); if (initialFilename.isEmpty()) initialFilename = "NewImage.pic"; // prepend the last directory initialFilename = lastDirectory + initialFilename; QString suffix_pic("DKFZ Pic (*.pic)"); QString qfileName = QFileDialog::getSaveFileName( NULL, "Save image", initialFilename ,mitk::CoreObjectFactory::GetInstance()->GetSaveFileExtensions(),&suffix_pic); MITK_INFO<<qfileName.toLocal8Bit().constData(); if (qfileName.isEmpty() ) return ""; fileName = qfileName.toLocal8Bit().constData(); } else fileName = aFileName; try { std::string dir = itksys::SystemTools::GetFilenamePath( fileName ); std::string baseFilename = itksys::SystemTools::GetFilenameWithoutLastExtension( fileName ); std::string extension = itksys::SystemTools::GetFilenameLastExtension( fileName ); if (extension == "") extension = ".pic"; if (extension == ".gz") { QMessageBox::critical( NULL, "SaveDialog", "Warning: You can not save an image in the compressed \n" ".pic.gz format. You must save as a normal .pic file.\n" "Please press Save again and choose a filename with a .pic ending.", QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); return ""; } // check if extension is suitable for writing image data mitk::ImageWriter::Pointer imageWriter = mitk::ImageWriter::New(); if (!imageWriter->IsExtensionValid(extension)) { QString message; message.append("File extension not suitable for writing image data. Choose one extension of this list: "); message.append(imageWriter->GetPossibleFileExtensionsAsString().c_str()); QMessageBox::critical(NULL,"ERROR",message); return ""; } dir += "/"; lastDirectory = dir.c_str(); // remember path for next save dialog dir += baseFilename; imageWriter->SetInput(image); imageWriter->SetFileName(dir.c_str()); imageWriter->SetExtension(extension.c_str()); imageWriter->Write(); } catch ( itk::ExceptionObject &err) { itkGenericOutputMacro( << "Exception during write: " << err ); QString exceptionString; exceptionString.append("Error during write image: "); exceptionString.append(err.GetDescription()); QMessageBox::critical(NULL,"ERROR",exceptionString); return ""; } catch ( ... ) { itkGenericOutputMacro( << "Unknown type of exception during write" ); QMessageBox::critical(NULL,"ERROR","Error during write image. Possibly no writing permission."); fileName = ""; } return fileName; }
std::string CommonFunctionality::SaveScreenshot | ( | vtkRenderWindow * | renderWindow, |
const char * | filename = NULL |
||
) |
Saves a screenshot of the given renderer in a file.
renderWindow | the render window to generate a screenshot from. If renderWindow is NULL, the function returns an empty string. |
filename | the filename, under which the file should be saved. If filename is NULL, a file selector pops up and asks for a file name. The file type is determined via the extension of the screen shot |
Definition at line 522 of file QmitkCommonFunctionality.cpp.
{ // // perform some error checking // if ( ! renderWindow ) { itkGenericOutputMacro( << "render window is NULL!" ); return std::string(""); } if ( ! renderWindow ) { itkGenericOutputMacro( << "Unsupported type of render window! The only supported type is currently QmitkRenderWindow." ); return std::string(""); } // // create the screenshot before the filechooser is opened, // so there the file chooser will not be part of the screenshot // //QPixmap buffer = QPixmap::grabWindow( qtRenderWindow->winId() ); // new Version: vtkWindowToImageFilter* wti = vtkWindowToImageFilter::New(); wti->SetInput( renderWindow ); wti->Update(); vtkImageData* imageData = wti->GetOutput(); int framesize = 5; int* windowSize = renderWindow->GetSize(); int numberOfScalarComponents = imageData->GetNumberOfScalarComponents(); vtkImageData* processedImageData = vtkImageData::New(); processedImageData->SetNumberOfScalarComponents(numberOfScalarComponents); processedImageData->SetExtent(0,windowSize[0]-2*framesize-1,0,windowSize[1]-2*framesize-1,0,0); processedImageData->SetScalarTypeToUnsignedChar(); for (int i=framesize; i<windowSize[0]-framesize; i++) { for (int j=framesize; j<windowSize[1]-framesize; j++) { for (int k=0; k<numberOfScalarComponents; k++) { processedImageData->SetScalarComponentFromDouble(i-framesize,j-framesize,0,k,imageData->GetScalarComponentAsDouble(i,j,0,k)); } } } // write new image as *.png to file vtkPNGWriter* pngWriter = vtkPNGWriter::New(); // // if the provided filename is empty ask the user // for the name of the file in which the screenshot // should be saved // std::string concreteFilename = ""; if( filename == NULL ) { // // show a file selector with the supported file formats // QString qfileName = QFileDialog::getSaveFileName( NULL, "Save screenshot", QString( "" ), QString( ".png" ).toLocal8Bit().constData() ); if ( qfileName.isEmpty() ) return ""; concreteFilename = qfileName.toLocal8Bit().constData(); } else concreteFilename = filename; // make sure the filename ends with .png const std::string outFileSuffix("png"); std::string::size_type pos = concreteFilename.rfind('.'); if ( pos == std::string::npos ) concreteFilename = concreteFilename + '.' + outFileSuffix; else { std::string extname = concreteFilename.substr(pos+1); if ( extname.empty() ) concreteFilename += outFileSuffix; // name ended with '.' if ( !(extname == outFileSuffix) ) concreteFilename.replace( pos+1, std::string::npos, "png" ); } // // wait for 500 ms to let the file chooser close itself // // int msecs = 500; // clock_t ticks = ( clock_t )( ( ( ( float ) msecs ) / 1000.0f ) * ( ( float ) CLOCKS_PER_SEC ) ); // clock_t goal = ticks + std::clock(); // while ( goal > std::clock() ); // // // save the screenshot under the given filename // pngWriter->SetInput(processedImageData); //pngWriter->SetInput( wti->GetOutput() ); pngWriter->SetFileName( concreteFilename.c_str() ); pngWriter->Write(); if ( pngWriter->GetErrorCode() != 0 ) QMessageBox::information(NULL, "Save Screenshot...", "The file could not be saved. Please check filename, format and access rights..."); wti->Delete(); pngWriter->Delete(); return concreteFilename; }
std::string CommonFunctionality::SaveSurface | ( | mitk::Surface * | surface, |
const char * | fileName = NULL |
||
) |
Definition at line 373 of file QmitkCommonFunctionality.cpp.
References mitk::Surface::GetVtkPolyData(), mitk::SurfaceVtkWriter< VTKWRITER >::GetVtkWriter(), mitk::SurfaceVtkWriter< VTKWRITER >::New(), mitk::SurfaceVtkWriter< VTKWRITER >::SetFileName(), mitk::SurfaceVtkWriter< VTKWRITER >::SetInput(), mitk::Surface::SetVtkPolyData(), and mitk::SurfaceVtkWriter< VTKWRITER >::Write().
Referenced by SaveBaseData().
{ std::string fileName; if(aFileName == NULL) fileName = "Surface"; else fileName = aFileName; std::string selectedItemsName = itksys::SystemTools::GetFilenameWithoutExtension(fileName); selectedItemsName += ".stl"; QString qfileName = QFileDialog::getSaveFileName(NULL, "Save surface object", QString(selectedItemsName.c_str()),"Surface Data(*.stl *.vtk *.vtp)"); if (!(qfileName.isEmpty()) ) { if(qfileName.endsWith(".stl")==true) { mitk::SurfaceVtkWriter<vtkSTLWriter>::Pointer writer=mitk::SurfaceVtkWriter<vtkSTLWriter>::New(); // check if surface actually consists of triangles; if not, the writer will not do anything; so, convert to triangles... vtkPolyData* polys = surface->GetVtkPolyData(); if( polys->GetNumberOfStrips() > 0 ) { vtkTriangleFilter* triangleFilter = vtkTriangleFilter::New(); triangleFilter->SetInput(polys); triangleFilter->Update(); polys = triangleFilter->GetOutput(); polys->Register(NULL); triangleFilter->Delete(); surface->SetVtkPolyData(polys); } writer->SetInput( surface ); writer->SetFileName(qfileName.toLocal8Bit().constData()); writer->GetVtkWriter()->SetFileTypeToBinary(); writer->Write(); } else if(qfileName.endsWith(".vtp")==true) { mitk::SurfaceVtkWriter<vtkXMLPolyDataWriter>::Pointer writer=mitk::SurfaceVtkWriter<vtkXMLPolyDataWriter>::New(); writer->SetInput( surface ); writer->SetFileName(qfileName.toLocal8Bit().constData()); writer->GetVtkWriter()->SetDataModeToBinary(); writer->Write(); } else if (qfileName.endsWith(".vtk")==true) { /*if (qfileName.endsWith(".vtk")==false) qfileName += ".vtk";*/ mitk::SurfaceVtkWriter<vtkPolyDataWriter>::Pointer writer=mitk::SurfaceVtkWriter<vtkPolyDataWriter>::New(); writer->SetInput( surface ); writer->SetFileName(qfileName.toLocal8Bit().constData()); writer->Write(); } else { // file extension not suitable for writing specified data type QMessageBox::critical(NULL,"ERROR","File extension not suitable for writing Surface data. Choose .vtk, .stl or .vtp"); return ""; } fileName = qfileName.toLocal8Bit().constData(); } else { fileName.clear(); } return fileName; }
void CommonFunctionality::SaveToFileWriter | ( | mitk::FileWriterWithInformation::Pointer | fileWriter, |
mitk::BaseData::Pointer | data, | ||
const char * | aFileName, | ||
const char * | propFileName | ||
) |
Definition at line 40 of file QmitkCommonFunctionality.cpp.
Referenced by SaveBaseData().
{ if (! fileWriter->CanWriteDataType(data) ) { QMessageBox::critical(NULL,"ERROR","Could not write file. Invalid data type for file writer."); return; } QString fileName; if (aFileName == NULL) { QString proposedName(""); if(propFileName == NULL) { proposedName.append(fileWriter->GetDefaultFilename()); } else { proposedName.append(propFileName).append(fileWriter->GetDefaultExtension()); } fileName = QFileDialog::getSaveFileName(NULL, "Save file", proposedName,fileWriter->GetFileDialogPattern()); // Check if an extension exists already and if not, append the default extension if ( !fileName.contains( QRegExp("\\.\\w+$") ) ) { fileName.append( fileWriter->GetDefaultExtension() ); } else { std::string extension = itksys::SystemTools::GetFilenameLastExtension( fileName.toLocal8Bit().constData() ); if (!fileWriter->IsExtensionValid(extension)) { QString message; message.append("File extension not suitable for writing given data. Choose one extension of this list: "); message.append(fileWriter->GetPossibleFileExtensionsAsString().c_str()); QMessageBox::critical(NULL,"ERROR",message); return; } } } else fileName = aFileName; if (fileName.isEmpty() == false ) { fileWriter->SetFileName( fileName.toLocal8Bit().constData() ); fileWriter->DoWrite( data ); } }