Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkExtFileSaveProjectAction.h"
00019
00020 #include <QFileDialog>
00021 #include <QMessageBox>
00022
00023 #include "mitkSceneIO.h"
00024 #include "mitkProgressBar.h"
00025 #include <mitkNodePredicateNot.h>
00026 #include <mitkNodePredicateProperty.h>
00027 #include <mitkProperties.h>
00028
00029 #include <mitkCoreObjectFactory.h>
00030 #include <mitkDataStorageEditorInput.h>
00031 #include <berryIEditorPart.h>
00032 #include <berryIWorkbenchPage.h>
00033
00034 #include "QmitkStdMultiWidgetEditor.h"
00035
00036 QmitkExtFileSaveProjectAction::QmitkExtFileSaveProjectAction(berry::IWorkbenchWindow::Pointer window)
00037 : QAction(0)
00038 {
00039 m_Window = window;
00040 this->setParent(static_cast<QWidget*>(m_Window->GetShell()->GetControl()));
00041 this->setText("&Save Project...");
00042 this->setToolTip("Save content of Data Manager as a .mitk project file");
00043 m_Window = window;
00044
00045 this->connect(this, SIGNAL(triggered(bool)), this, SLOT(Run()));
00046 }
00047
00048 void QmitkExtFileSaveProjectAction::Run()
00049 {
00050 try
00051 {
00052 QString fileName = QFileDialog::getSaveFileName(NULL, "Save MITK scene", QString::null, "MITK scene files (*.mitk)", NULL );
00053
00054 if (fileName.isEmpty() )
00055 return;
00056
00057 if ( fileName.right(5) != ".mitk" )
00058 fileName += ".mitk";
00059
00060 mitk::SceneIO::Pointer sceneIO = mitk::SceneIO::New();
00061
00062 mitk::DataStorageEditorInput::Pointer editorInput;
00063 mitk::DataStorage::Pointer storage;
00064 QmitkStdMultiWidgetEditor::Pointer multiWidgetEditor;
00065 berry::IEditorPart::Pointer editor = m_Window->GetActivePage()->GetActiveEditor();
00066 if (editor.Cast<QmitkStdMultiWidgetEditor>().IsNull())
00067 {
00068 editorInput = new mitk::DataStorageEditorInput();
00069 storage = editorInput->GetDataStorageReference()->GetDataStorage();
00070 }
00071 else
00072 {
00073 multiWidgetEditor = editor.Cast<QmitkStdMultiWidgetEditor>();
00074 storage = multiWidgetEditor->GetEditorInput().Cast<mitk::DataStorageEditorInput>()->GetDataStorageReference()->GetDataStorage();
00075 }
00076
00077 mitk::ProgressBar::GetInstance()->AddStepsToDo(2);
00078
00079
00080
00081 mitk::NodePredicateNot::Pointer isNotHelperObject = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object", mitk::BoolProperty::New(true)));
00082
00083 mitk::DataStorage::SetOfObjects::ConstPointer nodesToBeSaved = storage->GetSubset(isNotHelperObject);
00084 if ( !sceneIO->SaveScene( nodesToBeSaved, storage, fileName.toLocal8Bit().constData() ) )
00085 {
00086 QMessageBox::information(NULL,
00087 "Scene saving",
00088 "Scene could not be written completely. Please check the log.",
00089 QMessageBox::Ok);
00090
00091 }
00092 mitk::ProgressBar::GetInstance()->Progress(2);
00093
00094 mitk::SceneIO::FailedBaseDataListType::ConstPointer failedNodes = sceneIO->GetFailedNodes();
00095 if (!failedNodes->empty())
00096 {
00097 std::stringstream ss;
00098 ss << "The following nodes could not be serialized:" << std::endl;
00099 for ( mitk::SceneIO::FailedBaseDataListType::const_iterator iter = failedNodes->begin();
00100 iter != failedNodes->end();
00101 ++iter )
00102 {
00103 ss << " - ";
00104 if ( mitk::BaseData* data =(*iter)->GetData() )
00105 {
00106 ss << data->GetNameOfClass();
00107 }
00108 else
00109 {
00110 ss << "(NULL)";
00111 }
00112
00113 ss << " contained in node '" << (*iter)->GetName() << "'" << std::endl;
00114 }
00115
00116 MITK_WARN << ss.str();
00117 }
00118
00119 mitk::PropertyList::ConstPointer failedProperties = sceneIO->GetFailedProperties();
00120 if (!failedProperties->GetMap()->empty())
00121 {
00122 std::stringstream ss;
00123 ss << "The following properties could not be serialized:" << std::endl;
00124 const mitk::PropertyList::PropertyMap* propmap = failedProperties->GetMap();
00125 for ( mitk::PropertyList::PropertyMap::const_iterator iter = propmap->begin();
00126 iter != propmap->end();
00127 ++iter )
00128 {
00129 ss << " - " << iter->second.first->GetNameOfClass() << " associated to key '" << iter->first << "'" << std::endl;
00130 }
00131
00132 MITK_WARN << ss.str();
00133 }
00134 }
00135 catch (std::exception& e)
00136 {
00137 MITK_ERROR << "Exception caught during scene saving: " << e.what();
00138 }
00139 }