Example #1
0
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);
    }
}
Example #2
0
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);
    }
}
Example #3
0
void mitk::QmitkIOUtil::SaveImageWithDialog(mitk::Image::Pointer image, std::string fileName, QWidget *parent)
{
    //default selected suffix for images
    QString selected_suffix("Nearly Raw Raster Data (*.nrrd)");
    //default initial file name
    QString initialFilename("NewImage");
    //default image extension
    initialFilename.append((mitk::IOUtil::DEFAULTIMAGEEXTENSION).c_str());

    //if any filename is supplied by the user, use it
    if( !fileName.empty() )
    {
        initialFilename = fileName.c_str();
    }

    QString qfileName = GetFileNameWithQDialog("Save Image", initialFilename,
                                               mitk::ImageWriter::New()->GetFileDialogPattern(),
                                               &selected_suffix,parent);

    //do nothing if the user presses cancel
    if ( qfileName.isEmpty() ) return;

    try
    {
        mitk::IOUtil::SaveImage(image, qfileName.toLocal8Bit().constData());
    }
    catch(mitk::Exception &e)
    {
        MITK_ERROR << "error saving file: " << e.what();

        std::string msg("Could not save image.\n Error: ");
        msg.append(e.what());

        QMessageBox::critical( NULL, "Exception during saving", msg.c_str(),
                               QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
    }
}
std::string CommonFunctionality::SaveImage(mitk::Image* image, const char* aFileName, bool askForDifferentFilename)
{
  QString selected_suffix("Nearly Raw Raster Data (*.nrrd)");
  std::string defaultExtension = ".nrrd";

  std::string fileName;
  if(aFileName == NULL || askForDifferentFilename)
  {
    QString initialFilename(aFileName);
    if (initialFilename.isEmpty()) initialFilename = "NewImage.pic";

    QString qfileName = GetSaveFileNameStartingInLastDirectory("Save image", initialFilename ,mitk::CoreObjectFactory::GetInstance()->GetSaveFileExtensions(),&selected_suffix);
    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 = defaultExtension;

    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))
    {
      // muellerm, 12-05-02, using default file extension
      // if no valid extension was given, see bug 11799

      MITK_WARN << extension << " extension is unknown. Writing image to file " << fileName
                   << defaultExtension;
      extension = defaultExtension;
      baseFilename = itksys::SystemTools::GetFilenameName( fileName );
      //MITK_INFO << baseFilename;

      /*
      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 += "/";
    dir += baseFilename;

    if( itksys::SystemTools::FileExists( (dir + extension).c_str() ) )
    {
      int answer = QMessageBox::question( QApplication::topLevelWidgets().at(0), "Warning",
                                          QString("File %1 already exists. Overwrite?").arg( QString::fromStdString(dir + extension) ),
                                          QMessageBox::Yes,
                                          QMessageBox::No );
      if( answer == QMessageBox::No )
        return "";
    }


    // Check if Image data/ Geometry information is lost
    if (image->GetDimension() == 2)
    {
       if (!image->GetGeometry()->Is2DConvertable())
       {
          // information will be lost, if continuing to save this file as 2D
          // tell it the user and offer to save it as 3D

          // todo: if format is png, jpg, etc.. forget it, no geometry information at all
          QMessageBox msgBox;
          msgBox.setText("You are trying to save a 2D image that has 3D geometry informations.");
          msgBox.setInformativeText("You will lose the 3D geometry information this way. Do you rather want to save it as a 3D image?");
          msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
          msgBox.setDefaultButton(QMessageBox::Yes);
          int ret = msgBox.exec();

          if (ret == QMessageBox::YesRole)
          {
             // convert image to 2D
             mitk::Convert2Dto3DImageFilter::Pointer convertFilter = mitk::Convert2Dto3DImageFilter::New();
             convertFilter->SetInput(image);
             convertFilter->Update();
             image = convertFilter->GetOutput();
          }
          else if (ret == QMessageBox::NoRole)
          {
             // Continue Saving as 2D

          }
          else 
          {
             // Abort, don't save anything
             return 0; 
          }
       }
    }

    // write image
    imageWriter->SetInput(image);
    imageWriter->SetFileName(dir.c_str());
    imageWriter->SetExtension(extension.c_str());
    imageWriter->Write();
    fileName = dir + extension;
  }
  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::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.");
  }
}