00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkSimpleExampleView.h"
00019
00020 #include "mitkNodePredicateDataType.h"
00021
00022 #include "QmitkDataStorageComboBox.h"
00023 #include "QmitkStdMultiWidget.h"
00024
00025 #include <QMessageBox>
00026
00027 #include <mitkMovieGenerator.h>
00028 #include "mitkNodePredicateProperty.h"
00029 #include "mitkNodePredicateNot.h"
00030 #include "mitkProperties.h"
00031 #include <QmitkStepperAdapter.h>
00032 #include <QFileDialog>
00033 #include <QFileInfo>
00034 #include <QDir>
00035
00036
00037 #include <vtkRenderWindow.h>
00038 #include "vtkImageWriter.h"
00039 #include "vtkPNGWriter.h"
00040 #include "vtkJPEGWriter.h"
00041 #include "vtkRenderLargeImage.h"
00042
00043 const std::string QmitkSimpleExampleView::VIEW_ID = "org.mitk.views.simpleexample";
00044
00045 QmitkSimpleExampleView::QmitkSimpleExampleView()
00046 : QmitkFunctionality(),
00047 m_Controls(NULL),
00048 m_MultiWidget(NULL),
00049 m_NavigatorsInitialized(false)
00050 {
00051 }
00052
00053 QmitkSimpleExampleView::~QmitkSimpleExampleView()
00054 {
00055 }
00056
00057 void QmitkSimpleExampleView::CreateQtPartControl(QWidget *parent)
00058 {
00059 if (!m_Controls)
00060 {
00061
00062 m_Controls = new Ui::QmitkSimpleExampleViewControls;
00063 m_Controls->setupUi(parent);
00064 this->CreateConnections();
00065 }
00066 }
00067
00068 void QmitkSimpleExampleView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
00069 {
00070 m_MultiWidget = &stdMultiWidget;
00071
00072 new QmitkStepperAdapter(m_Controls->sliceNavigatorTransversal, m_MultiWidget->mitkWidget1->GetSliceNavigationController()->GetSlice(), "sliceNavigatorTransversalFromSimpleExample");
00073 new QmitkStepperAdapter(m_Controls->sliceNavigatorSagittal, m_MultiWidget->mitkWidget2->GetSliceNavigationController()->GetSlice(), "sliceNavigatorSagittalFromSimpleExample");
00074 new QmitkStepperAdapter(m_Controls->sliceNavigatorFrontal, m_MultiWidget->mitkWidget3->GetSliceNavigationController()->GetSlice(), "sliceNavigatorFrontalFromSimpleExample");
00075 new QmitkStepperAdapter(m_Controls->sliceNavigatorTime, m_MultiWidget->GetTimeNavigationController()->GetTime(), "sliceNavigatorTimeFromSimpleExample");
00076 new QmitkStepperAdapter(m_Controls->movieNavigatorTime, m_MultiWidget->GetTimeNavigationController()->GetTime(), "movieNavigatorTimeFromSimpleExample");
00077 }
00078
00079 void QmitkSimpleExampleView::StdMultiWidgetNotAvailable()
00080 {
00081 m_MultiWidget = NULL;
00082 }
00083
00084 void QmitkSimpleExampleView::CreateConnections()
00085 {
00086 if ( m_Controls )
00087 {
00088 connect(m_Controls->stereoSelect, SIGNAL(activated(int)), this, SLOT(stereoSelectionChanged(int)) );
00089 connect(m_Controls->reInitializeNavigatorsButton, SIGNAL(clicked()), this, SLOT(initNavigators()) );
00090 connect(m_Controls->genMovieButton, SIGNAL(clicked()), this, SLOT(generateMovie()) );
00091 connect(m_Controls->m_RenderWindow1Button, SIGNAL(clicked()), this, SLOT(OnRenderWindow1Clicked()) );
00092 connect(m_Controls->m_RenderWindow2Button, SIGNAL(clicked()), this, SLOT(OnRenderWindow2Clicked()) );
00093 connect(m_Controls->m_RenderWindow3Button, SIGNAL(clicked()), this, SLOT(OnRenderWindow3Clicked()) );
00094 connect(m_Controls->m_RenderWindow4Button, SIGNAL(clicked()), this, SLOT(OnRenderWindow4Clicked()) );
00095 connect(m_Controls->m_TakeScreenshotBtn, SIGNAL(clicked()), this, SLOT(OnTakeScreenshot()) );
00096 connect(m_Controls->m_TakeHighResScreenShotBtn, SIGNAL(clicked()), this, SLOT(OnTakeHighResolutionScreenshot()) );
00097 }
00098 }
00099
00100 void QmitkSimpleExampleView::Activated()
00101 {
00102 QmitkFunctionality::Activated();
00103 }
00104
00105 void QmitkSimpleExampleView::Deactivated()
00106 {
00107 QmitkFunctionality::Deactivated();
00108 }
00109
00110 void QmitkSimpleExampleView::initNavigators()
00111 {
00112
00113 mitk::NodePredicateNot::Pointer pred = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("includeInBoundingBox", mitk::BoolProperty::New(false)));
00114 mitk::DataStorage::SetOfObjects::ConstPointer rs = this->GetDataStorage()->GetSubset(pred);
00115
00116 mitk::TimeSlicedGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(rs);
00117
00118 m_NavigatorsInitialized = mitk::RenderingManager::GetInstance()->InitializeViews(bounds);
00119
00120 }
00121
00122 void QmitkSimpleExampleView::generateMovie()
00123 {
00124 QmitkRenderWindow* movieRenderWindow = GetMovieRenderWindow();
00125
00126 mitk::Stepper::Pointer stepper = movieRenderWindow->GetSliceNavigationController()->GetSlice();
00127 mitk::MovieGenerator::Pointer movieGenerator = mitk::MovieGenerator::New();
00128 if (movieGenerator.IsNotNull()) {
00129 movieGenerator->SetStepper( stepper );
00130 movieGenerator->SetRenderer( mitk::BaseRenderer::GetInstance(movieRenderWindow->GetRenderWindow()) );
00131
00132 QString movieFileName = QFileDialog::getSaveFileName(0, "Choose a file name", QString(), "Movie (*.avi)");
00133 if (!movieFileName.isEmpty()) {
00134 movieGenerator->SetFileName( movieFileName.toStdString().c_str() );
00135 movieGenerator->WriteMovie();
00136 }
00137 }
00138 }
00139
00140 void QmitkSimpleExampleView::stereoSelectionChanged( int id )
00141 {
00142
00143
00144
00145
00146 vtkRenderWindow * vtkrenderwindow = m_MultiWidget->mitkWidget4->GetRenderWindow();
00147
00148
00149
00150 switch(id)
00151 {
00152 case 0:
00153 vtkrenderwindow->StereoRenderOff();
00154 break;
00155 case 1:
00156 vtkrenderwindow->SetStereoTypeToRedBlue();
00157 vtkrenderwindow->StereoRenderOn();
00158 m_MultiWidget->DisableDepartmentLogo();
00159 break;
00160 case 2:
00161 vtkrenderwindow->SetStereoTypeToDresden();
00162 vtkrenderwindow->StereoRenderOn();
00163 m_MultiWidget->DisableDepartmentLogo();
00164 break;
00165 }
00166
00167
00168 mitk::BaseRenderer::GetInstance(m_MultiWidget->mitkWidget4->GetRenderWindow())->SetMapperID(2);
00169 m_MultiWidget->RequestUpdate();
00170 }
00171
00172 QmitkRenderWindow* QmitkSimpleExampleView::GetMovieRenderWindow()
00173 {
00174
00175 if(m_Controls->m_RenderWindow1Button->isChecked())
00176 {
00177 return m_MultiWidget->mitkWidget1;
00178 }
00179 else if(m_Controls->m_RenderWindow2Button->isChecked())
00180 {
00181 return m_MultiWidget->mitkWidget2;
00182 }
00183 else if(m_Controls->m_RenderWindow3Button->isChecked())
00184 {
00185 return m_MultiWidget->mitkWidget3;
00186 }
00187 else if(m_Controls->m_RenderWindow4Button->isChecked())
00188 {
00189 return m_MultiWidget->mitkWidget4;
00190 }
00191 else
00192 {
00193 return m_MultiWidget->mitkWidget1;
00194 }
00195
00196 }
00197
00198 void QmitkSimpleExampleView::OnRenderWindow1Clicked()
00199 {
00200 m_Controls->m_RenderWindow2Button->setChecked(false);
00201 m_Controls->m_RenderWindow3Button->setChecked(false);
00202 m_Controls->m_RenderWindow4Button->setChecked(false);
00203 }
00204 void QmitkSimpleExampleView::OnRenderWindow2Clicked()
00205 {
00206 m_Controls->m_RenderWindow1Button->setChecked(false);
00207 m_Controls->m_RenderWindow3Button->setChecked(false);
00208 m_Controls->m_RenderWindow4Button->setChecked(false);
00209 }
00210 void QmitkSimpleExampleView::OnRenderWindow3Clicked()
00211 {
00212 m_Controls->m_RenderWindow2Button->setChecked(false);
00213 m_Controls->m_RenderWindow1Button->setChecked(false);
00214 m_Controls->m_RenderWindow4Button->setChecked(false);
00215 }
00216 void QmitkSimpleExampleView::OnRenderWindow4Clicked()
00217 {
00218 m_Controls->m_RenderWindow2Button->setChecked(false);
00219 m_Controls->m_RenderWindow3Button->setChecked(false);
00220 m_Controls->m_RenderWindow1Button->setChecked(false);
00221 }
00222
00223
00224 void QmitkSimpleExampleView::OnTakeHighResolutionScreenshot()
00225 {
00226 QString fileName = QFileDialog::getSaveFileName(NULL, "Save screenshot to...", QDir::currentPath(), "JPEG file (*.jpg);;PNG file (*.png)");
00227
00228
00229 vtkRenderer* renderer = m_MultiWidget->mitkWidget4->GetRenderer()->GetVtkRenderer();
00230 if (renderer == NULL)
00231 return;
00232 this->TakeScreenshot(renderer, 4, fileName);
00233 }
00234
00235 void QmitkSimpleExampleView::OnTakeScreenshot()
00236 {
00237 QString fileName = QFileDialog::getSaveFileName(NULL, "Save screenshot to...", QDir::currentPath(), "JPEG file (*.jpg);;PNG file (*.png)");
00238
00239 QmitkRenderWindow* renWin = this->GetMovieRenderWindow();
00240 if (renWin == NULL)
00241 return;
00242
00243 vtkRenderer* renderer = renWin->GetRenderer()->GetVtkRenderer();
00244 if (renderer == NULL)
00245 return;
00246 this->TakeScreenshot(renderer, 1, fileName);
00247 }
00248
00249
00250 void QmitkSimpleExampleView::TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName)
00251 {
00252 if ((renderer == NULL) ||(magnificationFactor < 1) || fileName.isEmpty())
00253 return;
00254
00255 bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() );
00256 renderer->GetRenderWindow()->DoubleBufferOff();
00257
00258 vtkImageWriter* fileWriter;
00259
00260 QFileInfo fi(fileName);
00261 QString suffix = fi.suffix();
00262 if (suffix.compare("png", Qt::CaseInsensitive) == 0)
00263 {
00264 fileWriter = vtkPNGWriter::New();
00265 }
00266 else
00267 {
00268 vtkJPEGWriter* w = vtkJPEGWriter::New();
00269 w->SetQuality(100);
00270 w->ProgressiveOff();
00271 fileWriter = w;
00272 }
00273 vtkRenderLargeImage* magnifier = vtkRenderLargeImage::New();
00274 magnifier->SetInput(renderer);
00275 magnifier->SetMagnification(magnificationFactor);
00276
00277 fileWriter->SetInput(magnifier->GetOutput());
00278 fileWriter->SetFileName(fileName.toLatin1());
00279
00280
00281
00282
00283 double oldBackground[3];
00284 renderer->GetBackground(oldBackground);
00285 double white[] = {1.0, 1.0, 1.0};
00286 renderer->SetBackground(white);
00287 m_MultiWidget->DisableColoredRectangles();
00288 m_MultiWidget->DisableDepartmentLogo();
00289 m_MultiWidget->DisableGradientBackground();
00290
00291 fileWriter->Write();
00292 fileWriter->Delete();
00293
00294 m_MultiWidget->EnableColoredRectangles();
00295 m_MultiWidget->EnableDepartmentLogo();
00296 m_MultiWidget->EnableGradientBackground();
00297 renderer->SetBackground(oldBackground);
00298
00299 renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering);
00300 }