1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
19 #include <QMessageBox>
20 #include <QInputDialog>
22 #include "QTreePushButton.h"
25 #include "vvMainWindow.h"
26 #include "vvHelpDialog.h"
27 #include "vvDocumentation.h"
28 #include "vvProgressDialog.h"
29 #include "vvQDicomSeriesSelector.h"
30 #include "vvSlicerManager.h"
31 #include "clitkImageCommon.h"
33 #include "vvInteractorStyleNavigator.h"
34 #include "vvImageWriter.h"
35 #include "vvResamplerDialog.h"
36 #include "vvSegmentationDialog.h"
37 #include "vvSurfaceViewerDialog.h"
38 #include "vvDeformationDialog.h"
39 #include "vvImageWarp.h"
41 #include "vvMaximumIntensityProjection.h"
42 #include "vvMidPosition.h"
44 #include "vvStructSelector.h"
45 #include "vvMeshReader.h"
46 #include "vvConstants.h"
48 #ifdef CLITK_VV_USE_BDCM
49 #include <bdcmDicomFilesSelectorDialog.h>
54 #include "itkImageFileReader.h"
55 #include "itkByteSwapper.h"
56 #include "itkCommand.h"
57 #include "itkNumericSeriesFileNames.h"
60 #include "vtkImageData.h"
61 #include "vtkImageActor.h"
62 #include "vtkCornerAnnotation.h"
63 #include "vtkRenderWindow.h"
64 #include "vtkRenderWindowInteractor.h"
65 #include "vtkRenderer.h"
66 #include "vtkRendererCollection.h"
67 #include "vtkWindowToImageFilter.h"
68 #include "vtkBMPWriter.h"
69 #include "vtkTIFFWriter.h"
70 #include "vtkPNMWriter.h"
71 #include "vtkPNGWriter.h"
72 #include "vtkJPEGWriter.h"
78 #define COLUMN_UL_VIEW 1
79 #define COLUMN_UR_VIEW 2
80 #define COLUMN_DL_VIEW 3
81 #define COLUMN_DR_VIEW 4
82 #define COLUMN_CLOSE_IMAGE 5
83 #define COLUMN_RELOAD_IMAGE 6
84 #define COLUMN_IMAGE_NAME 7
86 #define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr)"
89 0,Qt::UserRole full filename
90 1,Qt::CheckStateRole checkbutton UL View
91 1,Qt::UserRole overlay, fusion or vector
92 2,Qt::CheckStateRole checkbutton UR View
93 3,Qt::CheckStateRole checkbutton DL View
94 4,Qt::CheckStateRole checkbutton DR View
96 5,Qt::UserRole mSlicerManager id*/
98 //------------------------------------------------------------------------------
99 vvMainWindow::vvMainWindow():vvMainWindowBase() {
100 setupUi(this); // this sets up the GUI
103 mMenuTools = menuTools;
104 mMenuExperimentalTools = menuExperimental;
107 //Init the contextMenu
108 this->setContextMenuPolicy(Qt::CustomContextMenu);
109 contextActions.resize(0);
110 QAction* actionOpen_new_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/fileopen.png")),
111 tr("O&pen new Image"));
112 actionOpen_new_image->setShortcut(QKeySequence(tr("Ctrl+O")));
113 connect(actionOpen_new_image,SIGNAL(triggered()),this,SLOT(OpenImages()));
114 contextActions.push_back(actionOpen_new_image);
115 contextMenu.addSeparator();
117 QAction* actionClose_Image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")),
118 tr("Close Current Image"));
119 connect(actionClose_Image,SIGNAL(triggered()),this,SLOT(CloseImage()));
120 contextActions.push_back(actionClose_Image);
122 QAction* actionReload_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")),
123 tr("Reload Current Image"));
124 connect(actionReload_image,SIGNAL(triggered()),this,SLOT(ReloadImage()));
125 contextActions.push_back(actionReload_image);
127 QAction* actionSave_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/filesave.png")),
128 tr("Save Current Image"));
129 connect(actionSave_image,SIGNAL(triggered()),this,SLOT(SaveAs()));
130 contextActions.push_back(actionSave_image);
132 contextMenu.addSeparator();
134 // QAction* actionCrop_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/crop.png")),
135 // tr("Crop Current Image"));
136 // connect(actionCrop_image,SIGNAL(triggered()),this,SLOT(CropImage()));
137 // contextActions.push_back(actionCrop_image);
139 QAction* actionSplit_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/cut.png")),
140 tr("Split Current Image"));
141 connect(actionSplit_image,SIGNAL(triggered()),this,SLOT(SplitImage()));
142 contextActions.push_back(actionSplit_image);
144 contextMenu.addSeparator();
146 contextMenu.addAction(actionAdd_VF_to_current_Image);
147 contextActions.push_back(actionAdd_VF_to_current_Image);
149 QAction* actionAdd_Overlay_to_current_Image = menuOverlay->addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/GPSup.png")),
150 tr("Add overlay image to current image"));
151 contextMenu.addAction(actionAdd_Overlay_to_current_Image);
152 contextActions.push_back(actionAdd_Overlay_to_current_Image);
154 connect(actionAdd_Overlay_to_current_Image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));
156 contextMenu.addAction(actionAdd_fusion_image);
157 connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(AddFusionImage()));
158 contextActions.push_back(actionAdd_fusion_image);
161 mSlicerManagers.resize(0);
171 header.append("Name");
173 DataTree->setHeaderLabels(header);
174 DataTree->resizeColumnToContents(COLUMN_TREE);
175 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
176 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
177 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
178 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
179 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
180 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
181 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
184 documentation = new vvDocumentation();
185 help_dialog = new vvHelpDialog();
186 dicomSeriesSelector = new vvDicomSeriesSelector();
188 inverseButton->setEnabled(0);
189 actionAdd_Overlay_to_current_Image->setEnabled(0);
190 actionSave_As->setEnabled(0);
191 actionAdd_VF_to_current_Image->setEnabled(0);
192 actionAdd_fusion_image->setEnabled(0);
195 verticalSliders.push_back(NOVerticalSlider);
196 verticalSliders.push_back(NEVerticalSlider);
197 verticalSliders.push_back(SOVerticalSlider);
198 verticalSliders.push_back(SEVerticalSlider);
200 for (int i =0; i < 4; i++)
201 verticalSliders[i]->hide();
203 horizontalSliders.push_back(NOHorizontalSlider);
204 horizontalSliders.push_back(NEHorizontalSlider);
205 horizontalSliders.push_back(SOHorizontalSlider);
206 horizontalSliders.push_back(SEHorizontalSlider);
208 for (int i =0; i < 4; i++)
209 horizontalSliders[i]->hide();
212 connect(NOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOVerticalSliderChanged()));
213 connect(NEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEVerticalSliderChanged()));
214 connect(SOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOVerticalSliderChanged()));
215 connect(SEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEVerticalSliderChanged()));
217 connect(NOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOHorizontalSliderMoved()));
218 connect(NEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEHorizontalSliderMoved()));
219 connect(SOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOHorizontalSliderMoved()));
220 connect(SEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEHorizontalSliderMoved()));
223 connect(actionMaximum_Intensity_Projection,SIGNAL(triggered()),this,SLOT(ComputeMIP()));
224 connect(actionCompute_mid_position_image,SIGNAL(triggered()),this,SLOT(ComputeMidPosition()));
225 connect(actionDeformable_Registration,SIGNAL(triggered()),this,SLOT(ComputeDeformableRegistration()));
226 connect(actionWarp_image_with_vector_field,SIGNAL(triggered()),this,SLOT(WarpImage()));
227 connect(actionLoad_images,SIGNAL(triggered()),this,SLOT(OpenImages()));
228 connect(actionOpen_Dicom,SIGNAL(triggered()),this,SLOT(OpenDicom()));
229 connect(actionOpen_Dicom_Struct,SIGNAL(triggered()),this,SLOT(OpenDCStructContour()));
230 connect(actionOpen_VTK_contour,SIGNAL(triggered()),this,SLOT(OpenVTKContour()));
231 connect(actionOpen_Multiple_Images_As_One,SIGNAL(triggered()),this,SLOT(MergeImages()));
232 connect(actionOpen_Image_With_Time,SIGNAL(triggered()),this,SLOT(OpenImageWithTime()));
233 connect(actionMerge_images_as_n_dim_t, SIGNAL(triggered()), this, SLOT(MergeImagesWithTime()));
234 connect(actionSave_As,SIGNAL(triggered()),this,SLOT(SaveAs()));
235 connect(actionExit,SIGNAL(triggered()),this,SLOT(close()));
236 connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField()));
237 connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
238 connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation()));
240 ///////////////////////////////////////////////
241 contextMenu.addAction(actionResampler);
242 connect(actionResampler,SIGNAL(triggered()),this,SLOT(ResampleCurrentImage()));
243 connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage()));
244 connect(actionSurface_Viewer,SIGNAL(triggered()),this,SLOT(SurfaceViewerLaunch()));
245 ///////////////////////////////////////////////
247 actionNorth_East_Window->setEnabled(0);
248 actionNorth_West_Window->setEnabled(0);
249 actionSouth_East_Window->setEnabled(0);
250 actionSouth_West_Window->setEnabled(0);
252 connect(actionNorth_East_Window,SIGNAL(triggered()),this,SLOT(SaveNEScreenshot()));
253 connect(actionNorth_West_Window,SIGNAL(triggered()),this,SLOT(SaveNOScreenshot()));
254 connect(actionSouth_East_Window,SIGNAL(triggered()),this,SLOT(SaveSEScreenshot()));
255 connect(actionSouth_West_Window,SIGNAL(triggered()),this,SLOT(SaveSOScreenshot()));
257 connect(DataTree,SIGNAL(itemSelectionChanged()),this,SLOT(ImageInfoChanged()));
258 connect(DataTree,SIGNAL(itemClicked(QTreeWidgetItem*, int)),this,
259 SLOT(DisplayChanged(QTreeWidgetItem*, int)));
261 connect(viewButton,SIGNAL(clicked()),this, SLOT(ChangeViewMode()) );
262 connect(windowSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
263 connect(levelSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
264 connect(colorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateColorMap()));
265 connect(presetComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateWindowLevel()));
266 connect(inverseButton,SIGNAL(clicked()),this,SLOT(SwitchWindowLevel()));
269 connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowContextMenu(QPoint)));
271 connect(linkPanel,SIGNAL(addLink(QString,QString)),this,SLOT(AddLink(QString,QString)));
272 connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString)));
273 connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int)),this,SLOT(SetVFProperty(int,int,int)));
274 connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int)),this,SLOT(SetOverlayProperty(int)));
275 connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,double,double)),
276 this,SLOT(SetFusionProperty(int,int,double,double)));
277 connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
281 playButton->setEnabled(0);
282 frameRateLabel->setEnabled(0);
283 frameRateSpinBox->setEnabled(0);
284 connect(playButton, SIGNAL(clicked()),this,SLOT(PlayPause()));
285 connect(frameRateSpinBox, SIGNAL(valueChanged(int)),this,SLOT(ChangeFrameRate(int)));
287 goToCursorPushButton->setEnabled(0);
288 connect(goToCursorPushButton, SIGNAL(clicked()),this,SLOT(GoToCursor()));
290 NOViewWidget->hide();
291 NEViewWidget->hide();
292 SOViewWidget->hide();
293 SEViewWidget->hide();
295 //Recently opened files
296 std::list<std::string> recent_files = GetRecentlyOpenedImages();
297 if ( !recent_files.empty() )
299 QMenu * rmenu = new QMenu("Recently opened files...");
300 rmenu->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")));
301 menuFile->insertMenu(actionOpen_Image_With_Time,rmenu);
302 for (std::list<std::string>::iterator i = recent_files.begin();i!=recent_files.end();i++)
304 QAction* current=new QAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")),
306 rmenu->addAction(current);
307 connect(current,SIGNAL(triggered()),this,SLOT(OpenRecentImage()));
311 // Adding all new tools (insertion in the menu)
312 vvToolManager::GetInstance()->InsertToolsInMenu(this);
314 if (!CLITK_EXPERIMENTAL)
315 menuExperimental->menuAction()->setVisible(false);
317 //------------------------------------------------------------------------------
320 //------------------------------------------------------------------------------
321 void vvMainWindow::ComputeMIP()
323 vvMaximumIntensityProjection mip;
324 vvSlicerManager* selected_slicer = mSlicerManagers[GetSlicerIndexFromItem(DataTree->selectedItems()[0])];
325 QFileInfo info(selected_slicer->GetFileName().c_str());
326 mip.Compute(selected_slicer);
327 AddImage(mip.GetOutput(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_mip.mhd");
329 //------------------------------------------------------------------------------
332 //------------------------------------------------------------------------------
333 void vvMainWindow::ComputeMidPosition()
336 int index=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
337 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
338 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
342 midp.slicer_manager = mSlicerManagers[index];
343 midp.reference_image_index = ref;
344 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
347 QMessageBox::warning(this, "Error computing midposition image",midp.error_message.c_str());
350 QFileInfo info(midp.slicer_manager->GetFileName().c_str());
351 AddImage(midp.output,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_midposition.mhd");
353 QApplication::restoreOverrideCursor();
356 //------------------------------------------------------------------------------
359 //------------------------------------------------------------------------------
360 void vvMainWindow::AddContour(int image_index, vvMesh::Pointer contour, bool propagation)
362 QTreeWidgetItem *item = new QTreeWidgetItem();
363 item->setData(0,Qt::UserRole,"filename.vtk");
364 item->setData(1,Qt::UserRole,tr("contour"));
366 brush.setColor(QColor(contour->r*255,contour->g*255,contour->b*255));
367 brush.setStyle(Qt::SolidPattern);
368 item->setData(COLUMN_IMAGE_NAME,Qt::BackgroundRole,brush);
369 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,contour->structure_name.c_str());
371 for (int j = 1; j <= 4; j++)
372 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(image_index)->data(j,Qt::CheckStateRole));
374 QTreePushButton* cButton = new QTreePushButton;
375 cButton->setItem(item);
376 cButton->setColumn(COLUMN_CLOSE_IMAGE);
377 cButton->setToolTip(tr("close image"));
378 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
379 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
380 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
382 QTreePushButton* rButton = new QTreePushButton;
383 rButton->setItem(item);
384 rButton->setColumn(COLUMN_RELOAD_IMAGE);
385 rButton->setToolTip(tr("reload image"));
386 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
387 rButton->setEnabled(false);
389 //connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
390 //this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
392 DataTree->topLevelItem(image_index)->setExpanded(1);
393 DataTree->topLevelItem(image_index)->addChild(item);
394 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
395 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
396 QString id = DataTree->topLevelItem(image_index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
397 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
400 mSlicerManagers[image_index]->AddContour(contour,propagation);
401 mSlicerManagers[image_index]->Render();
403 //------------------------------------------------------------------------------
406 //------------------------------------------------------------------------------
407 void vvMainWindow::OpenVTKContour()
409 if (mSlicerManagers.size() > 0)
411 QString Extensions = "Images ( *.vtk; *.obj)";
412 Extensions += ";;All Files (*)";
413 QString file = QFileDialog::getOpenFileName(this,tr("Open vtkPolyData"),mInputPathName,Extensions);
416 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
417 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
419 reader.SetImage(mSlicerManagers[index]->GetImage());
420 reader.SetModeToVTK();
421 reader.SetFilename(file.toStdString());
423 AddContour(index,reader.GetOutput()[0],false);
424 QApplication::restoreOverrideCursor();
427 //------------------------------------------------------------------------------
430 //------------------------------------------------------------------------------
431 void vvMainWindow::OpenDCStructContour()
433 if (mSlicerManagers.size() > 0)
435 QString Extensions = "Dicom Files ( *.dcm; RS*)";
436 Extensions += ";;All Files (*)";
437 QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"),mInputPathName,Extensions);
440 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
442 reader.SetFilename(file.toStdString());
443 vvStructSelector selector;
444 selector.SetStructures(reader.GetROINames());
445 if (!mSlicerManagers[index]->GetVF().IsNull())
446 selector.EnablePropagationCheckBox();
449 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
450 reader.SetSelectedItems(selector.getSelectedItems());
451 reader.SetImage(mSlicerManagers[index]->GetImage());
452 if (selector.PropagationEnabled())
453 reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
455 std::vector<vvMesh::Pointer> contours=reader.GetOutput();
456 for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
457 i!=contours.end();i++)
458 AddContour(index,*i,selector.PropagationEnabled());
459 QApplication::restoreOverrideCursor();
463 //------------------------------------------------------------------------------
466 //------------------------------------------------------------------------------
467 void vvMainWindow::ComputeDeformableRegistration()
469 if (mSlicerManagers.size() > 0)
471 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
472 vvDeformationDialog dialog(index,mSlicerManagers);
475 std::string base_name=itksys::SystemTools::GetFilenameWithoutExtension(mSlicerManagers[dialog.GetInputFileIndex()]->GetFileName());
476 AddField(dialog.GetOutput(),dialog.getFieldFile(),dialog.GetInputFileIndex());
477 WarpImage(dialog.GetSelectedSlicer(),dialog.GetReferenceFrameIndex());
480 std::cout << "Error or user cancellation while computing deformation field..." << std::endl;
482 else QMessageBox::information(this, "Need to open image","You must open an image first.");
484 //------------------------------------------------------------------------------
487 //------------------------------------------------------------------------------
488 void vvMainWindow::WarpImage()
490 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
491 if (!mSlicerManagers[index]->GetVF().IsNull())
494 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
495 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
498 WarpImage(mSlicerManagers[index],ref);
502 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field"));
504 //------------------------------------------------------------------------------
507 //------------------------------------------------------------------------------
508 void vvMainWindow::WarpImage(vvSlicerManager* selected_slicer,int reference_phase)
510 if (!selected_slicer->GetVF().IsNull())
512 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
513 QFileInfo info(selected_slicer->GetFileName().c_str());
514 vvImageWarp warp(selected_slicer->GetImage(),selected_slicer->GetVF(),
515 reference_phase,this);
516 if (warp.ComputeWarpedImage())
518 AddImage(warp.GetWarpedImage(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_warped.mhd");
519 AddImage(warp.GetDiffImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_diff.mhd");
520 AddImage(warp.GetJacobianImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_jacobian.mhd");
521 QApplication::restoreOverrideCursor();
525 QApplication::restoreOverrideCursor();
526 QMessageBox::warning(this,tr("Different spacings"),tr("The vector field and image spacings must be the same in order to warp."));
530 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field."));
532 //------------------------------------------------------------------------------
535 //------------------------------------------------------------------------------
536 vvMainWindow::~vvMainWindow() {
537 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
539 if (mSlicerManagers[i] != NULL)
540 delete mSlicerManagers[i];
543 //------------------------------------------------------------------------------
546 //------------------------------------------------------------------------------
547 void vvMainWindow::MergeImages() {
548 QString Extensions = EXTENSIONS;
549 Extensions += ";;All Files (*)";
550 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images"),mInputPathName,Extensions);
553 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
554 std::vector<std::string> vector;
556 unsigned int currentDim = 0;
557 std::vector<double> currentSpacing;
558 std::vector<int> currentSize;
559 std::vector<double> currentOrigin;
561 for (int i = 0; i < files.size(); i++)
563 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
564 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
565 reader->SetFileName(files[i].toStdString().c_str());
566 reader->ReadImageInformation();
568 //NOViewWidget->hide();
569 //NEViewWidget->hide();
570 //SOViewWidget->hide();
571 //SEViewWidget->hide();
573 currentDim = reader->GetNumberOfDimensions();
575 for (unsigned int j = 0;j < currentDim; j++)
581 currentSpacing.resize(currentDim);
582 currentSize.resize(currentDim);
583 currentOrigin.resize(currentDim);
585 currentOrigin[j] = reader->GetOrigin(j);
586 currentSpacing[j] = reader->GetSpacing(j);
587 currentSize[j] = reader->GetDimensions(j);
589 else if (currentDim != reader->GetNumberOfDimensions()
590 || currentSpacing[j] != reader->GetSpacing(j)
591 || currentSize[j] != (int)reader->GetDimensions(j)
592 || currentOrigin[j] != reader->GetOrigin(j))
594 QString error = "Cannot read file (too different from others ";
595 error += files[i].toStdString().c_str();
596 QMessageBox::information(this,tr("Reading problem"),error);
602 vector.push_back(files[i].toStdString());
605 if (vector.size() > 0)
606 LoadImages(vector, MERGED);
608 //------------------------------------------------------------------------------
611 //------------------------------------------------------------------------------
612 void vvMainWindow::MergeImagesWithTime() {
613 QString Extensions = EXTENSIONS;
614 Extensions += ";;All Files (*)";
615 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images With Time"),mInputPathName,Extensions);
618 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
619 std::vector<std::string> vector;
621 unsigned int currentDim = 0;
622 std::vector<double> currentSpacing;
623 std::vector<int> currentSize;
624 std::vector<double> currentOrigin;
626 for (int i = 0; i < files.size(); i++)
628 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
629 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
632 reader->SetFileName(files[i].toStdString().c_str());
633 reader->ReadImageInformation();
635 currentDim = reader->GetNumberOfDimensions();
637 for (unsigned int j = 0;j < currentDim; j++)
643 currentSpacing.resize(currentDim);
644 currentSize.resize(currentDim);
645 currentOrigin.resize(currentDim);
647 currentOrigin[j] = reader->GetOrigin(j);
648 currentSpacing[j] = reader->GetSpacing(j);
649 currentSize[j] = reader->GetDimensions(j);
651 else if (currentDim != reader->GetNumberOfDimensions()
652 || currentSpacing[j] != reader->GetSpacing(j)
653 || currentSize[j] != (int)reader->GetDimensions(j)
654 || currentOrigin[j] != reader->GetOrigin(j))
656 QString error = "Cannot read file (too different from others ";
657 error += files[i].toStdString().c_str();
658 QMessageBox::information(this,tr("Reading problem"),error);
664 vector.push_back(files[i].toStdString());
668 QString error = "Cannot read file info for ";
669 error += files[i].toStdString().c_str();
671 error += "Maybe you're trying to open an image in an unsupported format?\n";
672 QMessageBox::information(this,tr("Reading problem"),error);
675 sort(vector.begin(),vector.end());
676 if (vector.size() > 1)
677 LoadImages(vector, MERGEDWITHTIME);
679 QMessageBox::warning(this,tr("Reading problem"),"You need to select at least two images to merge images with time.\nIf you only want to open one image, please use the \"Open Image\" function.");
681 //------------------------------------------------------------------------------
684 //------------------------------------------------------------------------------
685 void vvMainWindow::OpenDicom() {
686 std::vector<std::string> files;
688 #ifdef CLITK_VV_USE_BDCM
689 bool r = bdcm::OpenDicomFilesSelectorDialog(files,
690 "DicomFilesSelectorDialog test",
694 std::cout << "$$$$ main : user clicked 'OK' $$$$"<<std::endl;
695 std::cout << "$$$$ selected files : "<<std::endl;
696 std::vector<std::string>::iterator i;
697 for (i=files.begin();i!=files.end();++i) {
698 std::cout << *i << std::endl;
700 std::cout << "$$$$ "<<std::endl;
702 LoadImages(files,DICOM);
705 std::cout << "$$$$ main : user clicked 'CANCEL' $$$$"<<std::endl;
708 std::cout << "dicomSeriesSelector " << std::endl;
709 if (dicomSeriesSelector->exec() == QDialog::Accepted) {
710 files = *(dicomSeriesSelector->GetFilenames());
711 LoadImages(files,DICOM);
716 //------------------------------------------------------------------------------
718 //------------------------------------------------------------------------------
719 void vvMainWindow::OpenImages() {
720 QString Extensions = EXTENSIONS;
721 Extensions += ";;All Files (*)";
723 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images"),mInputPathName,Extensions);
726 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
727 std::vector<std::string> vector;
728 for (int i = 0; i < files.size(); i++)
729 vector.push_back(files[i].toStdString());
730 LoadImages(vector, IMAGE);
732 //------------------------------------------------------------------------------
733 void vvMainWindow::OpenRecentImage()
735 QAction * caller = qobject_cast<QAction*>(sender());
736 std::vector<std::string> images;
737 images.push_back(caller->text().toStdString());
738 mInputPathName = itksys::SystemTools::GetFilenamePath(images[0]).c_str();
739 LoadImages(images,IMAGE);
742 //------------------------------------------------------------------------------
743 void vvMainWindow::OpenImageWithTime() {
744 QString Extensions = EXTENSIONS;
745 Extensions += ";;All Files (*)";
747 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images With Time"),mInputPathName,Extensions);
750 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
751 std::vector<std::string> vector;
752 for (int i = 0; i < files.size(); i++)
754 vector.push_back(files[i].toStdString());
756 LoadImages(vector, IMAGEWITHTIME);
758 //------------------------------------------------------------------------------
760 //------------------------------------------------------------------------------
761 void vvMainWindow::LoadImages(std::vector<std::string> files, LoadedImageType filetype) {
762 //Separate the way to open images and dicoms
764 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
765 fileSize = files.size();
769 //Only add to the list of recently opened files when a single file is opened,
770 //to avoid polluting the list of recently opened files
771 if (files.size() == 1)
773 QFileInfo finfo=tr(files[0].c_str());
774 AddToRecentlyOpenedImages(finfo.absoluteFilePath().toStdString());
776 //init the progress events
777 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
778 vvProgressDialog progress("Opening " + files[0],fileSize>1);
779 qApp->processEvents();
781 int numberofsuccesulreads=0;
782 //open images as 1 or multiples
783 for (int i = 0; i < fileSize; i++) {
785 progress.Update("Opening " + files[i]);
786 progress.SetProgress(i,fileSize);
787 qApp->processEvents();
789 //read the image and put it in mSlicerManagers
790 vvSlicerManager* imageManager = new vvSlicerManager(4);
791 qApp->processEvents();
793 bool SetImageSucceed=false;
795 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
796 SetImageSucceed = imageManager->SetImage(files[i],filetype);
799 SetImageSucceed = imageManager->SetImages(files,filetype);
801 if (SetImageSucceed == false)
803 QApplication::restoreOverrideCursor();
804 QString error = "Cannot open file \n";
805 error += imageManager->GetLastError().c_str();
806 QMessageBox::information(this,tr("Reading problem"),error);
811 mSlicerManagers.push_back(imageManager);
813 //create an item in the tree with good settings
814 QTreeWidgetItem *item = new QTreeWidgetItem();
815 item->setData(0,Qt::UserRole,files[i].c_str());
816 QFileInfo fileinfo(imageManager->GetFileName().c_str()); //Do not show the path
817 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
818 qApp->processEvents();
820 //Create the buttons for reload and close
821 qApp->processEvents();
822 QTreePushButton* cButton = new QTreePushButton;
823 cButton->setItem(item);
824 cButton->setColumn(COLUMN_CLOSE_IMAGE);
825 cButton->setToolTip(tr("close image"));
826 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
827 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
828 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
830 QTreePushButton* rButton = new QTreePushButton;
831 rButton->setItem(item);
832 rButton->setColumn(COLUMN_RELOAD_IMAGE);
833 rButton->setToolTip(tr("reload image"));
834 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
835 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
836 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
838 DataTree->addTopLevelItem(item);
839 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
840 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
842 //set the id of the image
843 QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1);
844 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
845 mSlicerManagers.back()->SetId(id.toStdString());
847 linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
849 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
850 this,SLOT(CurrentImageChanged(std::string)));
851 connect(mSlicerManagers.back(),SIGNAL(
852 UpdatePosition(int, double, double, double, double, double, double, double)),this,
853 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
854 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
855 this, SLOT(VectorChanged(int,double,double,double, double)));
856 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
857 this, SLOT(OverlayChanged(int,double,double)));
858 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
859 this, SLOT(FusionChanged(int,double)));
860 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
861 this,SLOT(WindowsChanged(int, int, int)));
862 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
863 this,SLOT(WindowLevelChanged(double, double, int, int)));
864 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
865 this,SLOT(UpdateSlice(int,int)));
866 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
867 this,SLOT(UpdateTSlice(int, int)));
868 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
869 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
870 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
871 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
872 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
874 numberofsuccesulreads++;
877 if (numberofsuccesulreads)
879 NOViewWidget->show();
880 NEViewWidget->show();
881 SOViewWidget->show();
882 SEViewWidget->show();
887 QApplication::restoreOverrideCursor();
890 //------------------------------------------------------------------------------
892 //------------------------------------------------------------------------------
893 void vvMainWindow::UpdateTree() {
894 DataTree->resizeColumnToContents(COLUMN_TREE);
895 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
896 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
897 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
898 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
899 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
900 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
901 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
903 //------------------------------------------------------------------------------
905 //------------------------------------------------------------------------------
906 void vvMainWindow::CurrentImageChanged(std::string id) {
908 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
910 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id)
916 DataTree->topLevelItem(i)->setSelected(0);
918 for (int child = 0; child < DataTree->topLevelItem(i)->childCount();child++)
919 DataTree->topLevelItem(i)->child(child)->setSelected(0);
922 DataTree->topLevelItem(selected)->setSelected(1);
924 //------------------------------------------------------------------------------
926 //------------------------------------------------------------------------------
927 void vvMainWindow::ImageInfoChanged() {
928 contextActions[7]->setEnabled(1);
929 contextActions[6]->setEnabled(1);
930 actionSave_As->setEnabled(1);
931 actionAdd_VF_to_current_Image->setEnabled(1);
932 actionAdd_fusion_image->setEnabled(1);
933 actionNorth_East_Window->setEnabled(1);
934 actionNorth_West_Window->setEnabled(1);
935 actionSouth_East_Window->setEnabled(1);
936 actionSouth_West_Window->setEnabled(1);
937 inverseButton->setEnabled(1);
939 goToCursorPushButton->setEnabled(1);
941 if (DataTree->selectedItems().size()) {
942 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
944 colorMapComboBox->setEnabled(1);
945 for (int i = 0; i < DataTree->topLevelItem(index)->childCount();i++)
947 if (DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "overlay" ||
948 DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion")
950 colorMapComboBox->setEnabled(0);
955 std::vector<double> origin;
956 std::vector<double> inputSpacing;
957 std::vector<int> inputSize;
958 std::vector<double> sizeMM;
961 QString inputSizeInBytes;
962 QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
964 if (mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size() > 1 || playMode == 1)
966 playButton->setEnabled(1);
967 frameRateLabel->setEnabled(1);
968 frameRateSpinBox->setEnabled(1);
972 playButton->setEnabled(0);
973 frameRateLabel->setEnabled(0);
974 frameRateSpinBox->setEnabled(0);
980 if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0])
982 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
983 dimension = imageSelected->GetNumberOfDimensions();
984 origin.resize(dimension);
985 inputSpacing.resize(dimension);
986 inputSize.resize(dimension);
987 sizeMM.resize(dimension);
988 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
989 for (int i = 0;i < dimension;i++)
991 origin[i] = imageSelected->GetOrigin()[i];
992 inputSpacing[i] = imageSelected->GetSpacing()[i];
993 inputSize[i] = imageSelected->GetSize()[i];
994 sizeMM[i] = inputSize[i]*inputSpacing[i];
995 NPixel *= inputSize[i];
997 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
999 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
1001 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF();
1002 dimension = imageSelected->GetNumberOfDimensions();
1003 origin.resize(dimension);
1004 inputSpacing.resize(dimension);
1005 inputSize.resize(dimension);
1006 sizeMM.resize(dimension);
1007 pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsString().c_str();
1008 for (int i = 0;i < dimension;i++)
1010 origin[i] = imageSelected->GetOrigin()[i];
1011 inputSpacing[i] = imageSelected->GetSpacing()[i];
1012 inputSize[i] = imageSelected->GetSize()[i];
1013 sizeMM[i] = inputSize[i]*inputSpacing[i];
1014 NPixel *= inputSize[i];
1016 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1018 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay")
1020 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay();
1021 dimension = imageSelected->GetNumberOfDimensions();
1022 origin.resize(dimension);
1023 inputSpacing.resize(dimension);
1024 inputSize.resize(dimension);
1025 sizeMM.resize(dimension);
1026 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1027 for (int i = 0;i < dimension;i++)
1029 origin[i] = imageSelected->GetOrigin()[i];
1030 inputSpacing[i] = imageSelected->GetSpacing()[i];
1031 inputSize[i] = imageSelected->GetSize()[i];
1032 sizeMM[i] = inputSize[i]*inputSpacing[i];
1033 NPixel *= inputSize[i];
1035 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1037 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion")
1039 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
1040 dimension = imageSelected->GetNumberOfDimensions();
1041 origin.resize(dimension);
1042 inputSpacing.resize(dimension);
1043 inputSize.resize(dimension);
1044 sizeMM.resize(dimension);
1045 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1046 for (int i = 0;i < dimension;i++)
1048 origin[i] = imageSelected->GetOrigin()[i];
1049 inputSpacing[i] = imageSelected->GetSpacing()[i];
1050 inputSize[i] = imageSelected->GetSize()[i];
1051 sizeMM[i] = inputSize[i]*inputSpacing[i];
1052 NPixel *= inputSize[i];
1054 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1057 QString dim = QString::number(dimension) + " (";
1058 dim += pixelType + ")";
1060 infoPanel->setFileName(image);
1061 infoPanel->setDimension(dim);
1062 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1063 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1064 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1065 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1066 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1068 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1069 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1070 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1071 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1073 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1074 for (int i = 0; i < 4;i++)
1076 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1078 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1082 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1083 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1084 // DD(mSlicerManagers[index]->GetColorMap());
1085 // DD(mSlicerManagers[index]->GetPreset());
1086 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1087 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1089 infoPanel->setFileName(image);
1090 infoPanel->setDimension(dim);
1091 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1092 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1093 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1094 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1095 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1097 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1098 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1099 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1100 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1102 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1103 for (int i = 0; i < 4;i++)
1105 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1107 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1111 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1112 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1113 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1114 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1116 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
1118 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1119 overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
1120 mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
1121 mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
1125 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1126 overlayPanel->getVFProperty(-1,-1,-1);
1128 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
1130 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1131 overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor());
1135 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1136 overlayPanel->getOverlayProperty(-1);
1138 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
1140 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1141 overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
1142 mSlicerManagers[index]->GetFusionColorMap(),
1143 mSlicerManagers[index]->GetFusionWindow(),
1144 mSlicerManagers[index]->GetFusionLevel());
1148 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1149 overlayPanel->getFusionProperty(-1, -1,-1,-1);
1153 //------------------------------------------------------------------------------
1155 //------------------------------------------------------------------------------
1156 void vvMainWindow::ShowDocumentation() {
1157 documentation->show();
1159 //------------------------------------------------------------------------------
1160 void vvMainWindow::ShowHelpDialog() {
1161 help_dialog->show();
1163 //------------------------------------------------------------------------------
1165 //------------------------------------------------------------------------------
1166 void vvMainWindow::ChangeViewMode() {
1167 QListIterator<int> it0(splitter_3->sizes());
1168 QListIterator<int> it1(splitter_3->sizes());
1171 while (it0.hasNext())
1175 while (it1.hasNext())
1184 size0.push_back(max0);
1186 size1.push_back(max1);
1188 splitter_3->setSizes(size0);
1189 OSplitter->setSizes(size1);
1190 DataTree->setColumnHidden(2,1);
1191 DataTree->setColumnHidden(3,1);
1192 DataTree->setColumnHidden(4,1);
1197 size0.push_back(int(max0/2));
1198 size0.push_back(int(max0/2));
1199 size1.push_back(int(max1/2));
1200 size1.push_back(int(max1/2));
1201 splitter_3->setSizes(size0);
1202 OSplitter->setSizes(size1);
1203 DataTree->setColumnHidden(2,0);
1204 DataTree->setColumnHidden(3,0);
1205 DataTree->setColumnHidden(4,0);
1208 //------------------------------------------------------------------------------
1210 //------------------------------------------------------------------------------
1211 QString vvMainWindow::GetSizeInBytes(unsigned long size) {
1212 QString result = "";// QString::number(size);
1213 //result += " bytes (";
1214 if (size > 1000000000)
1217 result += QString::number(size);
1218 result += "Gb";//)";
1220 else if (size > 1000000)
1223 result += QString::number(size);
1224 result += "Mb";//)";
1226 else if (size > 1000)
1229 result += QString::number(size);
1230 result += "kb";//)";
1234 //------------------------------------------------------------------------------
1236 //------------------------------------------------------------------------------
1237 QString vvMainWindow::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
1239 for (unsigned int i= 0; i < vectorDouble.size(); i++)
1243 result += QString::number(vectorDouble[i]);
1247 //------------------------------------------------------------------------------
1249 //------------------------------------------------------------------------------
1250 QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt) {
1252 for (unsigned int i= 0; i < vectorInt.size(); i++)
1256 result += QString::number(vectorInt[i]);
1260 //------------------------------------------------------------------------------
1262 //------------------------------------------------------------------------------
1263 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item) {
1264 QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1265 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1267 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString() == id)
1272 //------------------------------------------------------------------------------
1274 //------------------------------------------------------------------------------
1275 void vvMainWindow::DisplayChanged(QTreeWidgetItem *clicked_item, int column) {
1276 int index = GetSlicerIndexFromItem(clicked_item);
1277 if ( column >= COLUMN_CLOSE_IMAGE || column <= 0)
1279 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1281 QTreeWidgetItem* current_row=DataTree->topLevelItem(i);
1282 if (DataTree->topLevelItem(index) == current_row)
1284 vvSlicer* clicked_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1285 if (current_row == clicked_item)
1287 //If we just activated a slicer
1288 if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1290 mSlicerManagers[i]->UpdateSlicer(column-1,clicked_item->data(column,Qt::CheckStateRole).toInt());
1291 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1292 DisplaySliders(i,column-1);
1293 std::map<std::string,int> overlay_counts;
1294 for (int child = 0; child < current_row->childCount(); child++)
1296 std::string overlay_type =
1297 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1298 overlay_counts[overlay_type]++;
1299 current_row->child(child)->setData(column,Qt::CheckStateRole,
1300 current_row->data(column,Qt::CheckStateRole));
1301 clicked_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,true);
1304 else //We don't allow simply desactivating a slicer
1306 clicked_item->setData(column,Qt::CheckStateRole,2);
1310 //if we clicked on the vector(or overlay) and not the image
1313 if (clicked_item->data(column,Qt::CheckStateRole).toInt())
1315 current_row->setData(column,Qt::CheckStateRole,2);
1316 mSlicerManagers[i]->UpdateSlicer(column-1,2);
1317 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1318 DisplaySliders(i,column-1);
1320 int vis = clicked_item->data(column,Qt::CheckStateRole).toInt();
1321 std::string overlay_type = clicked_item->data(1,Qt::UserRole).toString().toStdString();
1322 int overlay_index=0;
1323 for (int child = 0; child < current_row->childCount(); child++)
1325 if (current_row->child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1327 if (current_row->child(child) == clicked_item) break;
1329 clicked_slicer->SetActorVisibility(
1330 clicked_item->data(1,Qt::UserRole).toString().toStdString(), overlay_index-1,vis);
1333 else if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1335 current_row->setData(column,Qt::CheckStateRole,0);
1336 mSlicerManagers[i]->UpdateSlicer(column-1,0);
1337 std::map<std::string,int> overlay_counts;
1338 for (int child = 0; child < current_row->childCount(); child++)
1340 std::string overlay_type =
1341 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1342 overlay_counts[overlay_type]++;
1343 current_row->child(child)->setData(column,Qt::CheckStateRole,0);
1344 vvSlicer * current_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1345 current_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,false);
1348 //mSlicerManagers[i]->SetColorMap(-1);
1349 mSlicerManagers[i]->SetColorMap();
1351 mSlicerManagers[index]->GetSlicer(column-1)->Render();
1353 //------------------------------------------------------------------------------
1355 void vvMainWindow::InitSlicers()
1357 if (mSlicerManagers.size())
1359 mSlicerManagers.back()->GenerateDefaultLookupTable();
1361 mSlicerManagers.back()->SetSlicerWindow(0,NOViewWidget->GetRenderWindow());
1362 mSlicerManagers.back()->SetSlicerWindow(1,NEViewWidget->GetRenderWindow());
1363 mSlicerManagers.back()->SetSlicerWindow(2,SOViewWidget->GetRenderWindow());
1364 mSlicerManagers.back()->SetSlicerWindow(3,SEViewWidget->GetRenderWindow());
1368 //------------------------------------------------------------------------------
1369 void vvMainWindow::InitDisplay() {
1370 if (mSlicerManagers.size())
1372 //BE CAREFUL : this is absolutely necessary to set the interactor style
1373 //in order to have the same style instanciation for all SlicerManagers in
1375 for (int j = 0; j < 4; j++)
1377 vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
1378 style->SetAutoAdjustCameraClippingRange(1);
1379 bool AlreadySelected = false;
1380 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1382 mSlicerManagers[i]->SetInteractorStyleNavigator(j,style);
1384 //select the image only if previous are not selected
1385 if (DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 1)
1387 mSlicerManagers[i]->UpdateSlicer(j,1);
1388 AlreadySelected = true;
1390 else if (i == DataTree->topLevelItemCount()-1 && !AlreadySelected)
1392 if (DataTree->selectedItems().size() == 0)
1393 DataTree->topLevelItem(i)->setSelected(1);
1394 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,2);
1395 mSlicerManagers[i]->UpdateSlicer(j,1);
1396 DisplaySliders(i,j);
1400 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,0);
1401 mSlicerManagers[i]->UpdateSlicer(j,0);
1408 //------------------------------------------------------------------------------
1410 //------------------------------------------------------------------------------
1411 void vvMainWindow::DisplaySliders(int slicer, int window) {
1413 mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
1414 int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
1418 tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
1419 int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
1420 bool showHorizontal = false;
1421 bool showVertical = false;
1422 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1423 || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
1424 && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME
1425 && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME))
1426 showVertical = true;
1427 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1428 || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME
1429 || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME)
1430 showHorizontal = true;
1433 verticalSliders[window]->show();
1435 verticalSliders[window]->hide();
1436 verticalSliders[window]->setRange(range[0],range[1]);
1437 verticalSliders[window]->setValue(position);
1440 horizontalSliders[window]->show();
1442 horizontalSliders[window]->hide();
1443 horizontalSliders[window]->setRange(tRange[0],tRange[1]);
1444 horizontalSliders[window]->setValue(tPosition);
1446 //------------------------------------------------------------------------------
1448 //------------------------------------------------------------------------------
1449 void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) {
1450 int index = GetSlicerIndexFromItem(item);
1452 if (DataTree->topLevelItem(index) != item)
1454 QString warning = "Do you really want to close the overlay : ";
1455 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1456 QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
1458 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1459 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1460 if (msgBox.exec() == QMessageBox::AcceptRole)
1462 std::string overlay_type=item->data(1,Qt::UserRole).toString().toStdString();
1463 int overlay_index=0;
1464 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1466 if (DataTree->topLevelItem(index)->\
1467 child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1469 if (DataTree->topLevelItem(index)->child(child) == item) break;
1471 mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
1472 mSlicerManagers[index]->SetColorMap(0);
1473 DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
1474 mSlicerManagers[index]->Render();
1477 else if (DataTree->topLevelItemCount() <= 1)
1479 QString warning = "Do you really want to close the image : ";
1480 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1481 warning += "\nThis is the last image, you're about to close vv !!!";
1482 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1484 msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
1485 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1486 if (msgBox.exec() == QMessageBox::AcceptRole)
1493 QString warning = "Do you really want to close the image : ";
1494 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1495 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1497 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1498 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1499 if (msgBox.exec() == QMessageBox::AcceptRole)
1502 // Tell tools that we close an image
1503 emit AnImageIsBeingClosed(mSlicerManagers[index]);
1505 std::vector<vvSlicerManager*>::iterator Manageriter = mSlicerManagers.begin();
1506 DataTree->takeTopLevelItem(index);
1507 for (int i = 0; i < index; i++)
1511 linkPanel->removeImage(index);
1512 mSlicerManagers[index]->RemoveActors();
1513 delete mSlicerManagers[index];
1514 mSlicerManagers.erase(Manageriter);
1521 //------------------------------------------------------------------------------
1523 //------------------------------------------------------------------------------
1524 void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) {
1525 // int index = GetSlicerIndexFromItem(item);
1526 // QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1527 // if (item->data(1,Qt::UserRole).toString() == "vector")
1528 // mSlicerManagers[index]->ReloadVF();
1530 // mSlicerManagers[index]->Reload();
1532 // QApplication::restoreOverrideCursor();
1533 int index = GetSlicerIndexFromItem(item);
1534 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1535 QString role=item->data(1,Qt::UserRole).toString();
1536 if ( role == "vector")
1537 mSlicerManagers[index]->ReloadVF();
1538 else if (role == "overlay")
1539 mSlicerManagers[index]->ReloadOverlay();
1540 else if (role == "fusion")
1541 mSlicerManagers[index]->ReloadFusion();
1543 mSlicerManagers[index]->Reload();
1544 QApplication::restoreOverrideCursor();
1546 //------------------------------------------------------------------------------
1548 // void vvMainWindow::CropImage()
1550 // int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1551 // vvCropDialog crop(mSlicerManagers,index);
1553 // AddImage(crop.GetOutput(),"cropped.mhd");
1556 //------------------------------------------------------------------------------
1557 void vvMainWindow::SplitImage() {
1558 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1559 int dim = mSlicerManagers[index]->GetDimension();
1560 QString warning = "Do you really want to split the ";
1561 warning += QString::number(dim) + "D image ";
1562 warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into ";
1563 warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " ";
1564 warning += QString::number(dim-1) + "D images.";
1565 QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"),
1567 msgBox.addButton(tr("Split"), QMessageBox::AcceptRole);
1568 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1569 if (msgBox.exec() == QMessageBox::AcceptRole)
1571 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1574 std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString();
1575 int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1];
1576 std::string path = itksys::SystemTools::GetFilenamePath(
1579 path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString();
1581 path += itksys::SystemTools::GetFilenameLastExtension(
1584 typedef itk::NumericSeriesFileNames NameGeneratorType;
1585 NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
1586 nameGenerator->SetSeriesFormat(path.c_str());
1587 nameGenerator->SetStartIndex(0);
1588 nameGenerator->SetEndIndex(numberOfSlice-1);
1589 nameGenerator->SetIncrementIndex(1);
1591 for (int i = 0; i < numberOfSlice; i++)
1593 vvSlicerManager* imageManager = new vvSlicerManager(4);
1594 imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i],
1595 mSlicerManagers[index]->GetSlicer(0)->GetImage(), i);
1596 mSlicerManagers.push_back(imageManager);
1598 //create an item in the tree with good settings
1599 QTreeWidgetItem *item = new QTreeWidgetItem();
1600 item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str());
1601 std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension(
1602 nameGenerator->GetFileNames()[i]).c_str();
1603 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str());
1604 for (int j = 1; j <= 4; j++)
1606 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1608 DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0);
1610 item->setData(j,Qt::CheckStateRole,2);
1613 //Create the buttons for reload and close
1614 QTreePushButton* cButton = new QTreePushButton;
1615 cButton->setItem(item);
1616 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1617 cButton->setToolTip(tr("close image"));
1618 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1619 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1620 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1622 QTreePushButton* rButton = new QTreePushButton;
1623 rButton->setItem(item);
1624 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1625 rButton->setToolTip(tr("reload image"));
1626 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1627 rButton->setEnabled(false);
1628 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1629 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1631 DataTree->addTopLevelItem(item);
1632 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1633 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1635 //set the id of the image
1636 QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1);
1637 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1638 mSlicerManagers.back()->SetId(id.toStdString());
1639 linkPanel->addImage(fileI, id.toStdString());
1640 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
1641 this,SLOT(CurrentImageChanged(std::string)));
1642 connect(mSlicerManagers.back(),SIGNAL(
1643 UpdatePosition(int, double, double, double, double, double, double, double)),this,
1644 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
1645 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
1646 this, SLOT(VectorChanged(int,double,double,double, double)));
1647 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
1648 this, SLOT(OverlayChanged(int,double,double)));
1649 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
1650 this, SLOT(FusionChanged(int,double)));
1651 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
1652 this,SLOT(WindowsChanged(int, int, int)));
1653 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
1654 this,SLOT(WindowLevelChanged(double, double, int, int)));
1655 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
1656 this,SLOT(UpdateSlice(int,int)));
1657 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
1658 this,SLOT(UpdateTSlice(int, int)));
1659 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
1660 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
1661 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
1662 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
1663 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
1665 qApp->processEvents();
1668 qApp->processEvents();
1670 QApplication::restoreOverrideCursor();
1674 QApplication::restoreOverrideCursor();
1675 QString error = "Cannot split file (dimensions must be greater than 2) ";
1676 QMessageBox::information(this,tr("Splitting problem"),error);
1680 //------------------------------------------------------------------------------
1682 //------------------------------------------------------------------------------
1683 void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) {
1684 infoPanel->setCurrentInfo(visibility,x,y,z,X,Y,Z,value);
1686 //------------------------------------------------------------------------------
1688 //------------------------------------------------------------------------------
1689 void vvMainWindow::VectorChanged(int visibility,double x, double y, double z, double value) {
1690 overlayPanel->getCurrentVectorInfo(visibility,x,y,z,value);
1692 //------------------------------------------------------------------------------
1694 //------------------------------------------------------------------------------
1695 void vvMainWindow::OverlayChanged(int visibility, double valueOver, double valueRef) {
1696 overlayPanel->getCurrentOverlayInfo(visibility,valueOver, valueRef);
1698 //------------------------------------------------------------------------------
1700 //------------------------------------------------------------------------------
1701 void vvMainWindow::FusionChanged(int visibility, double value) {
1702 overlayPanel->getCurrentFusionInfo(visibility,value);
1704 //------------------------------------------------------------------------------
1706 //------------------------------------------------------------------------------
1707 void vvMainWindow::WindowsChanged(int window, int view, int slice) {
1708 infoPanel->setViews(window, view, slice);
1710 //------------------------------------------------------------------------------
1712 //------------------------------------------------------------------------------
1713 void vvMainWindow::WindowLevelChanged(double window, double level,int preset,int colormap) {
1714 windowSpinBox->setValue(window);
1715 levelSpinBox->setValue(level);
1716 colorMapComboBox->setCurrentIndex(colormap);
1717 presetComboBox->setCurrentIndex(preset);
1719 //------------------------------------------------------------------------------
1721 //------------------------------------------------------------------------------
1722 void vvMainWindow::WindowLevelEdited() {
1723 presetComboBox->setCurrentIndex(6);
1724 UpdateWindowLevel();
1726 //------------------------------------------------------------------------------
1728 //------------------------------------------------------------------------------
1729 void vvMainWindow::UpdateWindowLevel() {
1730 if (DataTree->selectedItems().size())
1732 if (presetComboBox->currentIndex() == 7) //For ventilation
1733 colorMapComboBox->setCurrentIndex(5);
1734 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1735 mSlicerManagers[index]->SetColorWindow(windowSpinBox->value());
1736 mSlicerManagers[index]->SetColorLevel(levelSpinBox->value());
1737 mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex());
1738 mSlicerManagers[index]->Render();
1741 //------------------------------------------------------------------------------
1743 //------------------------------------------------------------------------------
1744 void vvMainWindow::UpdateColorMap() {
1745 if (DataTree->selectedItems().size())
1747 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1748 mSlicerManagers[index]->SetColorMap(colorMapComboBox->currentIndex());
1749 mSlicerManagers[index]->Render();
1752 //------------------------------------------------------------------------------
1753 void vvMainWindow::SwitchWindowLevel() {
1754 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1755 int window = mSlicerManagers[index]->GetColorWindow();
1756 presetComboBox->setCurrentIndex(6);
1757 windowSpinBox->setValue(-window);
1758 UpdateWindowLevel();
1760 //------------------------------------------------------------------------------
1762 //------------------------------------------------------------------------------
1763 void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) {
1764 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1766 if (mSlicerManagers[i]->GetId() == id)
1768 //mSlicerManagers[i]->SetTSlice(temps);
1769 mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
1770 mSlicerManagers[i]->UpdateViews(0,slicer);
1775 //------------------------------------------------------------------------------
1777 //------------------------------------------------------------------------------
1778 void vvMainWindow::ShowContextMenu(QPoint point) {
1779 if (!DataTree->selectedItems().size())
1781 contextActions[1]->setEnabled(0);
1782 contextActions[2]->setEnabled(0);
1783 contextActions[3]->setEnabled(0);
1784 contextActions[4]->setEnabled(0);
1785 contextActions[5]->setEnabled(0);
1786 contextActions[6]->setEnabled(0);
1787 contextActions[7]->setEnabled(0);
1791 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1792 contextActions[1]->setEnabled(1);
1793 contextActions[2]->setEnabled(
1794 DataTree->itemWidget(DataTree->selectedItems()[0],
1795 COLUMN_RELOAD_IMAGE)->isEnabled());
1796 contextActions[3]->setEnabled(1);
1797 contextActions[5]->setEnabled(1);
1798 contextActions[6]->setEnabled(1);
1799 contextActions[7]->setEnabled(1);
1801 if (mSlicerManagers[index]->GetDimension() < 3)
1802 contextActions[4]->setEnabled(0);
1804 contextActions[4]->setEnabled(1);
1806 contextMenu.exec(QCursor::pos());
1808 //------------------------------------------------------------------------------
1810 //------------------------------------------------------------------------------
1811 void vvMainWindow::CloseImage() {
1812 CloseImage(DataTree->selectedItems()[0],0);
1814 //------------------------------------------------------------------------------
1816 //------------------------------------------------------------------------------
1817 void vvMainWindow::ReloadImage() {
1818 ReloadImage(DataTree->selectedItems()[0],0);
1820 //------------------------------------------------------------------------------
1822 //------------------------------------------------------------------------------
1823 void vvMainWindow::SelectOverlayImage() {
1824 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1826 //check if one overlay image is added
1827 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1828 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "overlay")
1830 QString error = "Cannot add more than one compared image\n";
1831 error += "Please remove first ";
1832 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1833 QMessageBox::information(this,tr("Problem adding compared image !"),error);
1837 QString Extensions = EXTENSIONS;
1838 Extensions += ";;All Files (*)";
1839 QString file = QFileDialog::getOpenFileName(this,tr("Load Overlay image"),mInputPathName,Extensions);
1840 if (!file.isEmpty())
1841 AddOverlayImage(index,file);
1843 //------------------------------------------------------------------------------
1845 //------------------------------------------------------------------------------
1846 void vvMainWindow::AddOverlayImage(int index, QString file) {
1847 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1848 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1849 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1850 reader->SetFileName(file.toStdString().c_str());
1851 reader->ReadImageInformation();
1852 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1853 int dimension = reader->GetNumberOfDimensions();
1854 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1855 vvProgressDialog progress("Opening " + file.toStdString());
1856 qApp->processEvents();
1858 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1859 if (mSlicerManagers[index]->SetOverlay(file.toStdString(),dimension, component))
1861 //create an item in the tree with good settings
1862 QTreeWidgetItem *item = new QTreeWidgetItem();
1863 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1864 item->setData(1,Qt::UserRole,tr("overlay"));
1865 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1866 qApp->processEvents();
1868 for (int j = 1; j <= 4; j++)
1870 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1871 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("overlay",0,
1872 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1875 //Create the buttons for reload and close
1876 qApp->processEvents();
1877 QTreePushButton* cButton = new QTreePushButton;
1878 cButton->setItem(item);
1879 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1880 cButton->setToolTip(tr("close image"));
1881 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1882 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1883 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1885 QTreePushButton* rButton = new QTreePushButton;
1886 rButton->setItem(item);
1887 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1888 rButton->setToolTip(tr("reload image"));
1889 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1890 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1891 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1893 DataTree->topLevelItem(index)->setExpanded(1);
1894 DataTree->topLevelItem(index)->addChild(item);
1895 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1896 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1898 //set the id of the image
1899 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1900 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1902 qApp->processEvents();
1904 QApplication::restoreOverrideCursor();
1908 QApplication::restoreOverrideCursor();
1909 QString error = "Cannot import the new image.\n";
1910 error += mSlicerManagers[index]->GetLastError().c_str();
1911 QMessageBox::information(this,tr("Problem reading image !"),error);
1915 void vvMainWindow::AddFusionImage()
1917 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1919 //check if one fusion image is added
1920 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1921 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion")
1923 QString error = "Cannot add more than one fusion image\n";
1924 error += "Please remove first ";
1925 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1926 QMessageBox::information(this,tr("Problem adding fusion image !"),error);
1930 QString Extensions = EXTENSIONS;
1931 Extensions += ";;All Files (*)";
1932 QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
1933 if (!file.isEmpty())
1935 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1936 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1937 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1938 reader->SetFileName(file.toStdString().c_str());
1939 reader->ReadImageInformation();
1940 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1943 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1944 vvProgressDialog progress("Opening fusion");
1945 qApp->processEvents();
1947 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1948 if (mSlicerManagers[index]->SetFusion(file.toStdString(),
1949 reader->GetNumberOfDimensions(), component))
1951 //create an item in the tree with good settings
1952 QTreeWidgetItem *item = new QTreeWidgetItem();
1953 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1954 item->setData(1,Qt::UserRole,tr("fusion"));
1955 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1956 qApp->processEvents();
1958 for (int j = 1; j <= 4; j++)
1960 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1961 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0,
1962 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1965 //Create the buttons for reload and close
1966 qApp->processEvents();
1967 QTreePushButton* cButton = new QTreePushButton;
1968 cButton->setItem(item);
1969 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1970 cButton->setToolTip(tr("close image"));
1971 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1972 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1973 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1975 QTreePushButton* rButton = new QTreePushButton;
1976 rButton->setItem(item);
1977 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1978 rButton->setToolTip(tr("reload image"));
1979 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1980 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1981 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1983 DataTree->topLevelItem(index)->setExpanded(1);
1984 DataTree->topLevelItem(index)->addChild(item);
1985 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1986 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1988 //set the id of the image
1989 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1990 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1992 qApp->processEvents();
1994 QApplication::restoreOverrideCursor();
1998 QApplication::restoreOverrideCursor();
1999 QString error = "Cannot import the new image.\n";
2000 error += mSlicerManagers[index]->GetLastError().c_str();
2001 QMessageBox::information(this,tr("Problem reading image !"),error);
2006 QString error = "Cannot import the new image.\n";
2007 QMessageBox::information(this,tr("Problem reading image !"),error);
2013 void vvMainWindow::OpenField()
2015 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2016 //check if a vector field has already been added
2017 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
2018 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "vector")
2020 QString error = "Cannot add more than one vector field\n";
2021 error += "Please remove first ";
2022 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
2023 QMessageBox::information(this,tr("Problem adding vector field!"),error);
2027 QString Extensions = "Images ( *.mhd)";
2028 Extensions += ";;Images ( *.vf)";
2029 QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
2030 if (!file.isEmpty())
2031 AddField(file,index);
2034 void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
2036 //create an item in the tree with good settings
2037 QTreeWidgetItem *item = new QTreeWidgetItem();
2038 item->setData(0,Qt::UserRole,filename.toStdString().c_str());
2039 item->setData(1,Qt::UserRole,tr("vector"));
2040 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename);
2041 qApp->processEvents();
2043 for (int j = 1; j <= 4; j++)
2045 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
2046 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("vector",0,
2047 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
2050 //Create the buttons for reload and close
2051 qApp->processEvents();
2052 QTreePushButton* cButton = new QTreePushButton;
2053 cButton->setItem(item);
2054 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2055 cButton->setToolTip(tr("close vector field"));
2056 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2057 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2058 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2060 QTreePushButton* rButton = new QTreePushButton;
2061 rButton->setItem(item);
2062 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2063 rButton->setToolTip(tr("reload vector field"));
2064 rButton->setEnabled(from_disk);
2065 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2066 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2067 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2069 DataTree->topLevelItem(index)->setExpanded(1);
2070 DataTree->topLevelItem(index)->addChild(item);
2071 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2072 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2074 //set the id of the image
2075 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
2076 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2078 qApp->processEvents();
2080 QApplication::restoreOverrideCursor();
2083 void vvMainWindow::AddField(vvImage::Pointer vf,QString file,int index)
2085 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2086 vvSlicerManager* imageManager = mSlicerManagers[index];
2087 if (imageManager->SetVF(vf,file.toStdString()))
2089 AddFieldEntry(file,index,false);
2093 QString error = "Cannot import the vector field for this image.\n";
2094 error += imageManager->GetLastError().c_str();
2095 QMessageBox::information(this,tr("Problem reading VF !"),error);
2097 QApplication::restoreOverrideCursor();
2100 void vvMainWindow::AddField(QString file,int index)
2102 if (QFile::exists(file))
2104 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
2106 //init the progress events
2107 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2108 vvProgressDialog progress("Opening " + file.toStdString());
2109 qApp->processEvents();
2111 //read the vector and put it in the current mSlicerManager
2112 vvSlicerManager* imageManager = mSlicerManagers[index];
2113 qApp->processEvents();
2115 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
2116 if (imageManager->SetVF(file.toStdString()))
2118 imageManager->Render();
2119 AddFieldEntry(file,index,true);
2123 QApplication::restoreOverrideCursor();
2124 QString error = "Cannot import the vector field for this image.\n";
2125 error += imageManager->GetLastError().c_str();
2126 QMessageBox::information(this,tr("Problem reading VF !"),error);
2130 QMessageBox::information(this,tr("Problem reading VF !"),"File doesn't exist!");
2133 //------------------------------------------------------------------------------
2135 //------------------------------------------------------------------------------
2136 void vvMainWindow::SetVFProperty(int subsampling, int scale, int log) {
2137 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2138 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
2140 for (int i = 0; i < 4; i++)
2142 mSlicerManagers[index]->GetSlicer(i)->SetVFSubSampling(subsampling);
2143 mSlicerManagers[index]->GetSlicer(i)->SetVFScale(scale);
2145 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(1);
2147 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(0);
2151 //------------------------------------------------------------------------------
2153 //------------------------------------------------------------------------------
2154 void vvMainWindow::SetOverlayProperty(int color) {
2155 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2156 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
2158 mSlicerManagers[index]->SetOverlayColor(color);
2159 mSlicerManagers[index]->SetColorMap(0);
2160 mSlicerManagers[index]->Render();
2163 //------------------------------------------------------------------------------
2165 //------------------------------------------------------------------------------
2166 void vvMainWindow::SetFusionProperty(int opacity, int colormap,double window, double level) {
2167 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2168 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
2170 mSlicerManagers[index]->SetFusionOpacity(opacity);
2171 mSlicerManagers[index]->SetFusionColorMap(colormap);
2172 mSlicerManagers[index]->SetFusionWindow(window);
2173 mSlicerManagers[index]->SetFusionLevel(level);
2174 mSlicerManagers[index]->SetColorMap(0);
2175 mSlicerManagers[index]->Render();
2178 //------------------------------------------------------------------------------
2180 //------------------------------------------------------------------------------
2181 void vvMainWindow::SaveAs() {
2182 if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
2184 QMessageBox::warning(this,tr("Unsupported type"),tr("Sorry, saving a vector field is unsupported for the moment"));
2188 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2189 int dimension = mSlicerManagers[index]->GetDimension();
2190 QStringList OutputListeFormat;
2191 OutputListeFormat.clear();
2194 OutputListeFormat.push_back(".mhd");
2198 OutputListeFormat.push_back(".bmp");
2199 OutputListeFormat.push_back(".png");
2200 OutputListeFormat.push_back(".jpeg");
2201 OutputListeFormat.push_back(".tif");
2202 OutputListeFormat.push_back(".mhd");
2203 OutputListeFormat.push_back(".hdr");
2204 OutputListeFormat.push_back(".vox");
2206 else if (dimension == 3)
2208 OutputListeFormat.push_back(".mhd");
2209 OutputListeFormat.push_back(".hdr");
2210 OutputListeFormat.push_back(".vox");
2212 else if (dimension == 4)
2214 OutputListeFormat.push_back(".mhd");
2216 QString Extensions = "AllFiles(*.*)";
2217 for (int i = 0; i < OutputListeFormat.count(); i++)
2219 Extensions += ";;Images ( *";
2220 Extensions += OutputListeFormat[i];
2223 QString fileName = QFileDialog::getSaveFileName(this,
2225 mSlicerManagers[index]->GetFileName().c_str(),
2227 if (!fileName.isEmpty())
2229 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
2230 if (OutputListeFormat.contains(
2231 fileformat.c_str()))
2233 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2234 std::string action = "Saving";
2235 vvProgressDialog progress("Saving "+fileName.toStdString());
2236 qApp->processEvents();
2237 vvImageWriter *writer = new vvImageWriter;
2238 writer->SetOutputFileName(fileName.toStdString());
2239 writer->SetInput(mSlicerManagers[index]->GetImage());
2241 QApplication::restoreOverrideCursor();
2242 if (writer->GetLastError().size())
2244 QString error = "Saving did not succeed\n";
2245 error += writer->GetLastError().c_str();
2246 QMessageBox::information(this,tr("Saving Problem"),error);
2252 QString error = fileformat.c_str();
2253 if (error.isEmpty())
2254 error += "no file format specified !";
2256 error += " format unknown !!!\n";
2257 QMessageBox::information(this,tr("Saving Problem"),error);
2262 //------------------------------------------------------------------------------
2264 //------------------------------------------------------------------------------
2265 void vvMainWindow::AddLink(QString image1,QString image2) {
2266 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2268 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2270 mSlicerManagers[i]->AddLink(image2.toStdString());
2272 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2274 mSlicerManagers[i]->AddLink(image1.toStdString());
2278 //------------------------------------------------------------------------------
2280 //------------------------------------------------------------------------------
2281 void vvMainWindow::RemoveLink(QString image1,QString image2) {
2282 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2284 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2286 mSlicerManagers[i]->RemoveLink(image2.toStdString());
2288 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2290 mSlicerManagers[i]->RemoveLink(image1.toStdString());
2294 //------------------------------------------------------------------------------
2296 void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
2298 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2300 if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1)
2302 for (int j = 0; j < 4; j++)
2304 mSlicerManagers[i]->SetTSliceInSlicer(value,j);
2305 //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
2306 //UpdateTSlice(j,value);
2308 mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
2314 //------------------------------------------------------------------------------
2315 void vvMainWindow::NOHorizontalSliderMoved() {
2316 HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
2318 //------------------------------------------------------------------------------
2320 //------------------------------------------------------------------------------
2321 void vvMainWindow::NEHorizontalSliderMoved() {
2322 HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
2324 //------------------------------------------------------------------------------
2326 //------------------------------------------------------------------------------
2327 void vvMainWindow::SOHorizontalSliderMoved() {
2328 HorizontalSliderMoved(SOHorizontalSlider->value(),COLUMN_DL_VIEW,2);
2330 //------------------------------------------------------------------------------
2332 //------------------------------------------------------------------------------
2333 void vvMainWindow::SEHorizontalSliderMoved() {
2334 HorizontalSliderMoved(SEHorizontalSlider->value(),COLUMN_DR_VIEW,3);
2336 //------------------------------------------------------------------------------
2338 //------------------------------------------------------------------------------
2339 void vvMainWindow::NOVerticalSliderChanged() {
2340 int value = NOVerticalSlider->value();
2341 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2343 if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
2345 mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
2346 mSlicerManagers[i]->UpdateSlice(0); // <-- DS add this. Not too much update ?
2351 //------------------------------------------------------------------------------
2353 //------------------------------------------------------------------------------
2354 void vvMainWindow::NEVerticalSliderChanged() {
2355 int value = NEVerticalSlider->value();
2356 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2358 if (DataTree->topLevelItem(i)->data(COLUMN_UR_VIEW,Qt::CheckStateRole).toInt() > 1)
2360 mSlicerManagers[i]->GetSlicer(1)->SetSlice(value);
2365 //------------------------------------------------------------------------------
2367 //------------------------------------------------------------------------------
2368 void vvMainWindow::SOVerticalSliderChanged() {
2369 int value = SOVerticalSlider->value();
2370 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2372 if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
2374 mSlicerManagers[i]->GetSlicer(2)->SetSlice(value);
2379 //------------------------------------------------------------------------------
2381 //------------------------------------------------------------------------------
2382 void vvMainWindow::SEVerticalSliderChanged() {
2383 int value = SEVerticalSlider->value();
2384 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2386 if (DataTree->topLevelItem(i)->data(COLUMN_DR_VIEW,Qt::CheckStateRole).toInt() > 1)
2388 mSlicerManagers[i]->GetSlicer(3)->SetSlice(value);
2393 //------------------------------------------------------------------------------
2395 //------------------------------------------------------------------------------
2396 void vvMainWindow::UpdateSlice(int slicer, int slice) {
2398 if (slice != NOVerticalSlider->value())
2399 NOVerticalSlider->setValue(slice);
2401 else if (slicer == 1)
2402 NEVerticalSlider->setValue(slice);
2403 else if (slicer == 2)
2404 SOVerticalSlider->setValue(slice);
2405 else if (slicer == 3)
2406 SEVerticalSlider->setValue(slice);
2408 //------------------------------------------------------------------------------
2410 //------------------------------------------------------------------------------
2411 void vvMainWindow::UpdateTSlice(int slicer, int slice) {
2415 NOHorizontalSlider->setValue(slice);
2418 NEHorizontalSlider->setValue(slice);
2421 SOHorizontalSlider->setValue(slice);
2424 SEHorizontalSlider->setValue(slice);
2428 //------------------------------------------------------------------------------
2430 //------------------------------------------------------------------------------
2431 void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax) {
2432 int position = int((min+max)/2);
2433 int tPosition = int((tmin+tmax)/2);
2436 NOVerticalSlider->setValue(position);
2437 NOVerticalSlider->setRange(min,max);
2438 NOHorizontalSlider->setRange(tmin,tmax);
2439 NOHorizontalSlider->setValue(tPosition);
2441 else if (slicer == 1)
2443 NEVerticalSlider->setValue(position);
2444 NEVerticalSlider->setRange(min,max);
2445 NEHorizontalSlider->setRange(tmin,tmax);
2446 NEHorizontalSlider->setValue(tPosition);
2448 else if (slicer == 2)
2450 SOVerticalSlider->setValue(position);
2451 SOVerticalSlider->setRange(min,max);
2452 SOHorizontalSlider->setRange(tmin,tmax);
2453 SOHorizontalSlider->setValue(tPosition);
2455 else if (slicer == 3)
2457 SEVerticalSlider->setValue(position);
2458 SEVerticalSlider->setRange(min,max);
2459 SEHorizontalSlider->setRange(tmin,tmax);
2460 SEHorizontalSlider->setValue(tPosition);
2463 //------------------------------------------------------------------------------
2465 //------------------------------------------------------------------------------
2466 void vvMainWindow::SaveNOScreenshot() {
2467 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2468 w2i->SetInput(NOViewWidget->GetRenderWindow());
2470 SaveScreenshot(w2i->GetOutput());
2473 //------------------------------------------------------------------------------
2475 //------------------------------------------------------------------------------
2476 void vvMainWindow::SaveNEScreenshot() {
2477 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2478 w2i->SetInput(NEViewWidget->GetRenderWindow());
2480 SaveScreenshot(w2i->GetOutput());
2483 //------------------------------------------------------------------------------
2485 //------------------------------------------------------------------------------
2486 void vvMainWindow::SaveSOScreenshot() {
2487 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2488 w2i->SetInput(SOViewWidget->GetRenderWindow());
2490 SaveScreenshot(w2i->GetOutput());
2493 //------------------------------------------------------------------------------
2495 //------------------------------------------------------------------------------
2496 void vvMainWindow::SaveSEScreenshot() {
2497 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2498 w2i->SetInput(SEViewWidget->GetRenderWindow());
2500 SaveScreenshot(w2i->GetOutput());
2503 //------------------------------------------------------------------------------
2505 //------------------------------------------------------------------------------
2506 void vvMainWindow::SaveScreenshot(vtkImageData* image) {
2507 QString Extensions = "Images( *.png);;";
2508 Extensions += "Images( *.jpg);;";
2509 Extensions += "Images( *.bmp);;";
2510 Extensions += "Images( *.tif);;";
2511 Extensions += "Images( *.ppm)";
2512 QString fileName = QFileDialog::getSaveFileName(this,
2514 itksys::SystemTools::GetFilenamePath(
2515 mSlicerManagers[0]->GetFileName()).c_str(),
2517 if (!fileName.isEmpty())
2519 const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
2520 if (!strcmp(ext, ".bmp"))
2522 vtkBMPWriter *bmp = vtkBMPWriter::New();
2523 bmp->SetInput(image);
2524 bmp->SetFileName(fileName.toStdString().c_str());
2528 else if (!strcmp(ext, ".tif"))
2530 vtkTIFFWriter *tif = vtkTIFFWriter::New();
2531 tif->SetInput(image);
2532 tif->SetFileName(fileName.toStdString().c_str());
2536 else if (!strcmp(ext, ".ppm"))
2538 vtkPNMWriter *pnm = vtkPNMWriter::New();
2539 pnm->SetInput(image);
2540 pnm->SetFileName(fileName.toStdString().c_str());
2544 else if (!strcmp(ext, ".png"))
2546 vtkPNGWriter *png = vtkPNGWriter::New();
2547 png->SetInput(image);
2548 png->SetFileName(fileName.toStdString().c_str());
2552 else if (!strcmp(ext, ".jpg"))
2554 vtkJPEGWriter *jpg = vtkJPEGWriter::New();
2555 jpg->SetInput(image);
2556 jpg->SetFileName(fileName.toStdString().c_str());
2562 QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!"));
2567 //------------------------------------------------------------------------------
2569 //------------------------------------------------------------------------------
2570 void vvMainWindow::GoToCursor() {
2571 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2572 for (int column = 1; column < 5; column++)
2574 if (DataTree->selectedItems()[0]->data(column,Qt::CheckStateRole).toInt() > 1)
2576 double* cursorPos = mSlicerManagers[index]->GetSlicer(column-1)->GetCursorPosition();
2577 mSlicerManagers[index]->GetSlicer(column-1)->SetCurrentPosition(
2578 cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
2579 mSlicerManagers[index]->UpdateViews(1,column-1);
2580 mSlicerManagers[index]->UpdateLinked(column-1);
2585 //------------------------------------------------------------------------------
2587 //------------------------------------------------------------------------------
2588 void vvMainWindow::PlayPause() {
2592 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_play.png")));
2598 int image_number=DataTree->topLevelItemCount();
2600 for (int i=0;i<image_number;i++)
2601 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1)
2609 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_pause.png")));
2610 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2614 //------------------------------------------------------------------------------
2616 //------------------------------------------------------------------------------
2617 void vvMainWindow::PlayNext() {
2618 if (playMode && !this->isHidden())
2620 int image_number=DataTree->topLevelItemCount();
2621 ///Only play one slicer per SM, and only if the SM is being displayed
2622 for (int i=0;i<image_number;i++)
2623 for (int j=0;j<4;j++)
2624 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1 &&
2625 DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0)
2627 mSlicerManagers[i]->SetNextTSlice(j);
2630 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2633 //------------------------------------------------------------------------------
2635 void vvMainWindow::ShowLastImage()
2637 if (mSlicerManagers.size() > 1)
2639 QTreeWidgetItem * item=DataTree->topLevelItem(DataTree->topLevelItemCount()-1);
2640 CurrentImageChanged(mSlicerManagers.back()->GetId()); //select new image
2641 item->setData(1,Qt::CheckStateRole,2); //show the new image in the first panel
2642 DisplayChanged(item,1);
2646 //------------------------------------------------------------------------------
2647 void vvMainWindow::UpdateRenderWindows() {
2648 if (NOViewWidget->GetRenderWindow()) NOViewWidget->GetRenderWindow()->Render();
2649 if (NEViewWidget->GetRenderWindow()) NEViewWidget->GetRenderWindow()->Render();
2650 if (SOViewWidget->GetRenderWindow()) SOViewWidget->GetRenderWindow()->Render();
2651 if (SEViewWidget->GetRenderWindow()) SEViewWidget->GetRenderWindow()->Render();
2653 //------------------------------------------------------------------------------
2655 //------------------------------------------------------------------------------
2656 void vvMainWindow::ResampleCurrentImage() {
2657 vvResamplerDialog resampler;
2658 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2659 resampler.SetSlicerManagers(mSlicerManagers,index);
2660 if (resampler.exec())
2661 AddImage(resampler.GetOutput(),resampler.GetOutputFileName());
2663 //------------------------------------------------------------------------------
2665 //------------------------------------------------------------------------------
2666 void vvMainWindow::SegmentationOnCurrentImage() {
2667 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2669 vvSegmentationDialog segmentation;
2670 segmentation.SetImage(mSlicerManagers[index]->GetSlicer(0)->GetImage());
2671 segmentation.exec();
2673 //------------------------------------------------------------------------------
2675 void vvMainWindow::SurfaceViewerLaunch()
2677 vvSurfaceViewerDialog surfaceViewer;
2678 surfaceViewer.exec();
2681 //------------------------------------------------------------------------------
2682 void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
2684 vvSlicerManager* m = new vvSlicerManager(4);
2686 m->SetFilename(filename);
2690 //------------------------------------------------------------------------------
2691 void vvMainWindow::AddImage(vvSlicerManager * slicer_manager) {
2692 mSlicerManagers.push_back(slicer_manager);
2694 std::string filename = slicer_manager->GetFileName();
2696 //create an item in the tree with good settings
2697 QTreeWidgetItem *item = new QTreeWidgetItem();
2698 item->setData(0,Qt::UserRole,slicer_manager->GetFileName().c_str());//files[i].c_str());
2699 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
2700 qApp->processEvents();
2702 for (int j = 1; j <= 4; j++) item->setData(j,Qt::CheckStateRole,1);
2704 //Create the buttons for reload and close
2705 qApp->processEvents();
2706 QTreePushButton* cButton = new QTreePushButton;
2707 cButton->setItem(item);
2708 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2709 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2710 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2711 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2713 QTreePushButton* rButton = new QTreePushButton;
2714 rButton->setItem(item);
2715 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2716 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2717 rButton->setEnabled(0);
2718 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2719 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2721 DataTree->addTopLevelItem(item);
2722 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2723 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2725 //set the id of the image
2726 QString id = slicer_manager->GetFileName().c_str() + QString::number(mSlicerManagers.size()-1);
2727 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2728 mSlicerManagers.back()->SetId(id.toStdString());
2730 linkPanel->addImage(filename, id.toStdString());
2732 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
2733 this,SLOT(CurrentImageChanged(std::string)));
2734 connect(mSlicerManagers.back(),SIGNAL(
2735 UpdatePosition(int, double, double, double, double, double, double, double)),this,
2736 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
2737 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
2738 this, SLOT(VectorChanged(int,double,double,double, double)));
2739 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
2740 this, SLOT(OverlayChanged(int,double,double)));
2741 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
2742 this, SLOT(FusionChanged(int,double)));
2743 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
2744 this,SLOT(WindowsChanged(int, int, int)));
2745 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
2746 this,SLOT(WindowLevelChanged(double, double, int, int)));
2747 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
2748 this,SLOT(UpdateSlice(int,int)));
2749 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
2750 this,SLOT(UpdateTSlice(int, int)));
2751 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
2752 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
2753 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
2754 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
2755 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
2757 qApp->processEvents();
2761 qApp->processEvents();
2763 //------------------------------------------------------------------------------
2766 //------------------------------------------------------------------------------
2767 void vvMainWindow::UpdateCurrentSlicer() {
2769 if (DataTree->selectedItems().size() > 0) {
2770 index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2772 mSlicerManagerCurrentIndex = index;
2774 //------------------------------------------------------------------------------