void mitk::QmitkIOUtil::SavePointSetWithDialog(mitk::PointSet::Pointer pointset, std::string fileName, QWidget *parent) { //default selected suffix for point sets QString selected_suffix("MITK Point-Sets (*.mps)"); QString possible_suffixes("MITK Point-Sets (*.mps)"); //default initial file name QString initialFilename("NewPointSet"); //default image extension initialFilename.append((mitk::IOUtil::DEFAULTPOINTSETEXTENSION).c_str()); //if any filename is supplied by the user, use it if( !fileName.empty() ) { initialFilename = fileName.c_str(); } QString qfileName = GetFileNameWithQDialog("Save PointSet", initialFilename , possible_suffixes, &selected_suffix, parent); //do nothing if the user presses cancel if ( qfileName.isEmpty() ) return; try{ mitk::IOUtil::SavePointSet(pointset,qfileName.toLocal8Bit().constData()); } catch(mitk::Exception &e) { MITK_ERROR << "error saving file: " << e.what(); std::string msg("Could not save pointset.\n Error: "); msg.append(e.what()); QMessageBox::critical( NULL, "Exception during saving", msg.c_str(), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); } }
void mitk::QmitkIOUtil::SaveSurfaceWithDialog(mitk::Surface::Pointer surface, std::string fileName, QWidget* parent) { //default selected suffix for surfaces QString selected_suffix("STL File (*.stl)"); QString possible_suffixes("STL File (*.stl);; VTK File (*.vtk);; VTP File (*.vtp)"); //default initial file name QString initialFilename("NewSurface"); //default image extension initialFilename.append((mitk::IOUtil::DEFAULTSURFACEEXTENSION).c_str()); //if any filename is supplied by the user, use it if( !fileName.empty() ) { initialFilename = fileName.c_str(); } QString qfileName = GetFileNameWithQDialog("Save Surface", initialFilename , possible_suffixes, &selected_suffix, parent); //do nothing if the user presses cancel if ( qfileName.isEmpty() ) return; try{ mitk::IOUtil::SaveSurface(surface,qfileName.toLocal8Bit().constData()); } catch(mitk::Exception &e) { MITK_ERROR << "error saving file: " << e.what(); std::string msg("Could not save surface.\n Error: "); msg.append(e.what()); QMessageBox::critical( NULL, "Exception during saving", msg.c_str(), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); } }
std::string CommonFunctionality::SaveSurface(mitk::Surface* surface, const char* aFileName) { std::string fileName; if(aFileName == NULL) fileName = "Surface"; else fileName = aFileName; std::string selectedItemsName = itksys::SystemTools::GetFilenameWithoutExtension(fileName); //selectedItemsName += ".stl" QString selected_suffix("STL File (*.stl)"); QString possible_suffixes("STL File (*.stl);; VTK File (*.vtk);; VTP File (*.vtp)"); QString qfileName = GetSaveFileNameStartingInLastDirectory("Save surface object", QString::fromStdString(selectedItemsName), possible_suffixes,&selected_suffix); if (qfileName.isEmpty()) return ""; std::string extension = itksys::SystemTools::GetFilenameLastExtension( qfileName.toStdString() ); if (extension == "") // if no extension has been entered manually into the filename { // get from combobox selected file extension extension = itksys::SystemTools::GetFilenameLastExtension( selected_suffix.toLocal8Bit().constData()); extension = extension.substr(0, extension.size()-1); qfileName += QString::fromStdString(extension); } if(extension == ".stl" ) { 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(extension == ".vtp") { mitk::SurfaceVtkWriter<vtkXMLPolyDataWriter>::Pointer writer=mitk::SurfaceVtkWriter<vtkXMLPolyDataWriter>::New(); writer->SetInput( surface ); writer->SetFileName(qfileName.toLocal8Bit().constData()); writer->GetVtkWriter()->SetDataModeToBinary(); writer->Write(); } else if (extension == ".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 ""; } return qfileName.toLocal8Bit().constData(); }
/** * 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 */ void CommonFunctionality::SaveBaseData( mitk::BaseData* data, const char * aFileName ) { //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 || classname.compare("SeedsImage")==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); QString initialFileName = QString::fromStdString(fileName); QString selected_suffix("MITK Point-Sets (*.mps)"); QString possible_suffixes("MITK Point-Sets (*.mps)"); /*QString qfileName = QFileDialog::getSaveFileName( NULL, "Save image", initialFilename ,mitk::CoreObjectFactory::GetInstance()->GetSaveFileExtensions(),&selected_suffix); */ QString qfileName = GetSaveFileNameStartingInLastDirectory("Save file", initialFileName, possible_suffixes, &selected_suffix); MITK_INFO<<qfileName.toLocal8Bit().constData(); mitk::PointSetWriter::Pointer writer = mitk::PointSetWriter::New(); std::string extension = itksys::SystemTools::GetFilenameLastExtension( qfileName.toLocal8Bit().constData() ); if (extension == "") // if no extension has been entered manually into the filename { // get from combobox selected file extension extension = itksys::SystemTools::GetFilenameLastExtension( selected_suffix.toLocal8Bit().constData()); extension = extension.substr(0, extension.size()-1); qfileName += QString::fromStdString(extension); } MITK_INFO<<"extension: " << extension; // 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 (qfileName.isEmpty() == 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)->CanWriteBaseDataType(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."); } }