1 /*=========================================================================
4 Module: $RCSfile: vvMainWindow.cxx,v $
6 Date: $Date: 2010/03/24 13:59:01 $
7 Version: $Revision: 1.19 $
8 Author : Pierre Seroul (pierre.seroul@gmail.com)
10 Copyright (C) 200COLUMN_IMAGE_NAME
11 Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
12 CREATIS-LRMN http://www.creatis.insa-lyon.fr
14 This program is free software: you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation, version 3 of the License.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program. If not, see <http://www.gnu.org/licenses/>.
26 =========================================================================*/
30 #include <QMessageBox>
31 #include <QInputDialog>
33 #include "QTreePushButton.h"
36 #include "vvMainWindow.h"
37 #include "vvHelpDialog.h"
38 #include "vvDocumentation.h"
39 #include "vvProgressDialog.h"
40 #include "vvQDicomSeriesSelector.h"
41 #include "vvSlicerManager.h"
42 #include "clitkImageCommon.h"
44 #include "vvInteractorStyleNavigator.h"
45 #include "vvImageWriter.h"
46 #include "vvResamplerDialog.h"
47 #include "vvSegmentationDialog.h"
48 #include "vvSurfaceViewerDialog.h"
49 #include "vvDeformationDialog.h"
50 #include "vvImageWarp.h"
52 #include "vvMaximumIntensityProjection.h"
53 #include "vvMidPosition.h"
55 #include "vvStructSelector.h"
56 #include "vvMeshReader.h"
57 #include "vvConstants.h"
59 #ifdef CLITK_VV_USE_BDCM
60 #include <bdcmDicomFilesSelectorDialog.h>
65 #include "itkImageFileReader.h"
66 #include "itkByteSwapper.h"
67 #include "itkCommand.h"
68 #include "itkNumericSeriesFileNames.h"
71 #include "vtkImageData.h"
72 #include "vtkImageActor.h"
73 #include "vtkCornerAnnotation.h"
74 #include "vtkRenderWindow.h"
75 #include "vtkRenderWindowInteractor.h"
76 #include "vtkRenderer.h"
77 #include "vtkRendererCollection.h"
78 #include "vtkWindowToImageFilter.h"
79 #include "vtkBMPWriter.h"
80 #include "vtkTIFFWriter.h"
81 #include "vtkPNMWriter.h"
82 #include "vtkPNGWriter.h"
83 #include "vtkJPEGWriter.h"
89 #define COLUMN_UL_VIEW 1
90 #define COLUMN_UR_VIEW 2
91 #define COLUMN_DL_VIEW 3
92 #define COLUMN_DR_VIEW 4
93 #define COLUMN_CLOSE_IMAGE 5
94 #define COLUMN_RELOAD_IMAGE 6
95 #define COLUMN_IMAGE_NAME 7
97 #define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr)"
100 0,Qt::UserRole full filename
101 1,Qt::CheckStateRole checkbutton UL View
102 1,Qt::UserRole overlay, fusion or vector
103 2,Qt::CheckStateRole checkbutton UR View
104 3,Qt::CheckStateRole checkbutton DL View
105 4,Qt::CheckStateRole checkbutton DR View
107 5,Qt::UserRole mSlicerManager id*/
109 //------------------------------------------------------------------------------
110 vvMainWindow::vvMainWindow():vvMainWindowBase() {
111 setupUi(this); // this sets up the GUI
114 mMenuTools = menuTools;
115 mMenuExperimentalTools = menuExperimental;
118 //Init the contextMenu
119 this->setContextMenuPolicy(Qt::CustomContextMenu);
120 contextActions.resize(0);
121 QAction* actionOpen_new_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/fileopen.png")),
122 tr("O&pen new Image"));
123 actionOpen_new_image->setShortcut(QKeySequence(tr("Ctrl+O")));
124 connect(actionOpen_new_image,SIGNAL(triggered()),this,SLOT(OpenImages()));
125 contextActions.push_back(actionOpen_new_image);
126 contextMenu.addSeparator();
128 QAction* actionClose_Image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")),
129 tr("Close Current Image"));
130 connect(actionClose_Image,SIGNAL(triggered()),this,SLOT(CloseImage()));
131 contextActions.push_back(actionClose_Image);
133 QAction* actionReload_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")),
134 tr("Reload Current Image"));
135 connect(actionReload_image,SIGNAL(triggered()),this,SLOT(ReloadImage()));
136 contextActions.push_back(actionReload_image);
138 QAction* actionSave_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/filesave.png")),
139 tr("Save Current Image"));
140 connect(actionSave_image,SIGNAL(triggered()),this,SLOT(SaveAs()));
141 contextActions.push_back(actionSave_image);
143 contextMenu.addSeparator();
145 // QAction* actionCrop_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/crop.png")),
146 // tr("Crop Current Image"));
147 // connect(actionCrop_image,SIGNAL(triggered()),this,SLOT(CropImage()));
148 // contextActions.push_back(actionCrop_image);
150 QAction* actionSplit_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/cut.png")),
151 tr("Split Current Image"));
152 connect(actionSplit_image,SIGNAL(triggered()),this,SLOT(SplitImage()));
153 contextActions.push_back(actionSplit_image);
155 contextMenu.addSeparator();
157 contextMenu.addAction(actionAdd_VF_to_current_Image);
158 contextActions.push_back(actionAdd_VF_to_current_Image);
160 QAction* actionAdd_Overlay_to_current_Image = menuOverlay->addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/GPSup.png")),
161 tr("Add overlay image to current image"));
162 contextMenu.addAction(actionAdd_Overlay_to_current_Image);
163 contextActions.push_back(actionAdd_Overlay_to_current_Image);
165 connect(actionAdd_Overlay_to_current_Image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));
167 contextMenu.addAction(actionAdd_fusion_image);
168 connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(AddFusionImage()));
169 contextActions.push_back(actionAdd_fusion_image);
172 mSlicerManagers.resize(0);
182 header.append("Name");
184 DataTree->setHeaderLabels(header);
185 DataTree->resizeColumnToContents(COLUMN_TREE);
186 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
187 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
188 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
189 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
190 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
191 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
192 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
195 documentation = new vvDocumentation();
196 help_dialog = new vvHelpDialog();
197 dicomSeriesSelector = new vvDicomSeriesSelector();
199 inverseButton->setEnabled(0);
200 actionAdd_Overlay_to_current_Image->setEnabled(0);
201 actionSave_As->setEnabled(0);
202 actionAdd_VF_to_current_Image->setEnabled(0);
203 actionAdd_fusion_image->setEnabled(0);
206 verticalSliders.push_back(NOVerticalSlider);
207 verticalSliders.push_back(NEVerticalSlider);
208 verticalSliders.push_back(SOVerticalSlider);
209 verticalSliders.push_back(SEVerticalSlider);
211 for (int i =0; i < 4; i++)
212 verticalSliders[i]->hide();
214 horizontalSliders.push_back(NOHorizontalSlider);
215 horizontalSliders.push_back(NEHorizontalSlider);
216 horizontalSliders.push_back(SOHorizontalSlider);
217 horizontalSliders.push_back(SEHorizontalSlider);
219 for (int i =0; i < 4; i++)
220 horizontalSliders[i]->hide();
223 connect(NOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOVerticalSliderChanged()));
224 connect(NEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEVerticalSliderChanged()));
225 connect(SOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOVerticalSliderChanged()));
226 connect(SEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEVerticalSliderChanged()));
228 connect(NOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOHorizontalSliderMoved()));
229 connect(NEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEHorizontalSliderMoved()));
230 connect(SOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOHorizontalSliderMoved()));
231 connect(SEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEHorizontalSliderMoved()));
234 connect(actionMaximum_Intensity_Projection,SIGNAL(triggered()),this,SLOT(ComputeMIP()));
235 connect(actionCompute_mid_position_image,SIGNAL(triggered()),this,SLOT(ComputeMidPosition()));
236 connect(actionDeformable_Registration,SIGNAL(triggered()),this,SLOT(ComputeDeformableRegistration()));
237 connect(actionWarp_image_with_vector_field,SIGNAL(triggered()),this,SLOT(WarpImage()));
238 connect(actionLoad_images,SIGNAL(triggered()),this,SLOT(OpenImages()));
239 connect(actionOpen_Dicom,SIGNAL(triggered()),this,SLOT(OpenDicom()));
240 connect(actionOpen_Dicom_Struct,SIGNAL(triggered()),this,SLOT(OpenDCStructContour()));
241 connect(actionOpen_VTK_contour,SIGNAL(triggered()),this,SLOT(OpenVTKContour()));
242 connect(actionOpen_Multiple_Images_As_One,SIGNAL(triggered()),this,SLOT(MergeImages()));
243 connect(actionOpen_Image_With_Time,SIGNAL(triggered()),this,SLOT(OpenImageWithTime()));
244 connect(actionMerge_images_as_n_dim_t, SIGNAL(triggered()), this, SLOT(MergeImagesWithTime()));
245 connect(actionSave_As,SIGNAL(triggered()),this,SLOT(SaveAs()));
246 connect(actionExit,SIGNAL(triggered()),this,SLOT(close()));
247 connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField()));
248 connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
249 connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation()));
251 ///////////////////////////////////////////////
252 contextMenu.addAction(actionResampler);
253 connect(actionResampler,SIGNAL(triggered()),this,SLOT(ResampleCurrentImage()));
254 connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage()));
255 connect(actionSurface_Viewer,SIGNAL(triggered()),this,SLOT(SurfaceViewerLaunch()));
256 ///////////////////////////////////////////////
258 actionNorth_East_Window->setEnabled(0);
259 actionNorth_West_Window->setEnabled(0);
260 actionSouth_East_Window->setEnabled(0);
261 actionSouth_West_Window->setEnabled(0);
263 connect(actionNorth_East_Window,SIGNAL(triggered()),this,SLOT(SaveNEScreenshot()));
264 connect(actionNorth_West_Window,SIGNAL(triggered()),this,SLOT(SaveNOScreenshot()));
265 connect(actionSouth_East_Window,SIGNAL(triggered()),this,SLOT(SaveSEScreenshot()));
266 connect(actionSouth_West_Window,SIGNAL(triggered()),this,SLOT(SaveSOScreenshot()));
268 connect(DataTree,SIGNAL(itemSelectionChanged()),this,SLOT(ImageInfoChanged()));
269 connect(DataTree,SIGNAL(itemClicked(QTreeWidgetItem*, int)),this,
270 SLOT(DisplayChanged(QTreeWidgetItem*, int)));
272 connect(viewButton,SIGNAL(clicked()),this, SLOT(ChangeViewMode()) );
273 connect(windowSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
274 connect(levelSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
275 connect(colorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateColorMap()));
276 connect(presetComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateWindowLevel()));
277 connect(inverseButton,SIGNAL(clicked()),this,SLOT(SwitchWindowLevel()));
280 connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowContextMenu(QPoint)));
282 connect(linkPanel,SIGNAL(addLink(QString,QString)),this,SLOT(AddLink(QString,QString)));
283 connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString)));
284 connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int)),this,SLOT(SetVFProperty(int,int,int)));
285 connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int)),this,SLOT(SetOverlayProperty(int)));
286 connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,double,double)),
287 this,SLOT(SetFusionProperty(int,int,double,double)));
288 connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
292 playButton->setEnabled(0);
293 frameRateLabel->setEnabled(0);
294 frameRateSpinBox->setEnabled(0);
295 connect(playButton, SIGNAL(clicked()),this,SLOT(PlayPause()));
296 connect(frameRateSpinBox, SIGNAL(valueChanged(int)),this,SLOT(ChangeFrameRate(int)));
298 goToCursorPushButton->setEnabled(0);
299 connect(goToCursorPushButton, SIGNAL(clicked()),this,SLOT(GoToCursor()));
301 NOViewWidget->hide();
302 NEViewWidget->hide();
303 SOViewWidget->hide();
304 SEViewWidget->hide();
306 //Recently opened files
307 std::list<std::string> recent_files = GetRecentlyOpenedImages();
308 if ( !recent_files.empty() )
310 QMenu * rmenu = new QMenu("Recently opened files...");
311 rmenu->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")));
312 menuFile->insertMenu(actionOpen_Image_With_Time,rmenu);
313 for (std::list<std::string>::iterator i = recent_files.begin();i!=recent_files.end();i++)
315 QAction* current=new QAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")),
317 rmenu->addAction(current);
318 connect(current,SIGNAL(triggered()),this,SLOT(OpenRecentImage()));
322 // Adding all new tools (insertion in the menu)
323 vvToolManager::GetInstance()->InsertToolsInMenu(this);
325 if (!CLITK_EXPERIMENTAL)
326 menuExperimental->menuAction()->setVisible(false);
328 //------------------------------------------------------------------------------
331 //------------------------------------------------------------------------------
332 void vvMainWindow::ComputeMIP()
334 vvMaximumIntensityProjection mip;
335 vvSlicerManager* selected_slicer = mSlicerManagers[GetSlicerIndexFromItem(DataTree->selectedItems()[0])];
336 QFileInfo info(selected_slicer->GetFileName().c_str());
337 mip.Compute(selected_slicer);
338 AddImage(mip.GetOutput(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_mip.mhd");
340 //------------------------------------------------------------------------------
343 //------------------------------------------------------------------------------
344 void vvMainWindow::ComputeMidPosition()
347 int index=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
348 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
349 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
353 midp.slicer_manager = mSlicerManagers[index];
354 midp.reference_image_index = ref;
355 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
358 QMessageBox::warning(this, "Error computing midposition image",midp.error_message.c_str());
361 QFileInfo info(midp.slicer_manager->GetFileName().c_str());
362 AddImage(midp.output,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_midposition.mhd");
364 QApplication::restoreOverrideCursor();
367 //------------------------------------------------------------------------------
370 //------------------------------------------------------------------------------
371 void vvMainWindow::AddContour(int image_index, vvMesh::Pointer contour, bool propagation)
373 QTreeWidgetItem *item = new QTreeWidgetItem();
374 item->setData(0,Qt::UserRole,"filename.vtk");
375 item->setData(1,Qt::UserRole,tr("contour"));
377 brush.setColor(QColor(contour->r*255,contour->g*255,contour->b*255));
378 brush.setStyle(Qt::SolidPattern);
379 item->setData(COLUMN_IMAGE_NAME,Qt::BackgroundRole,brush);
380 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,contour->structure_name.c_str());
382 for (int j = 1; j <= 4; j++)
383 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(image_index)->data(j,Qt::CheckStateRole));
385 QTreePushButton* cButton = new QTreePushButton;
386 cButton->setItem(item);
387 cButton->setColumn(COLUMN_CLOSE_IMAGE);
388 cButton->setToolTip(tr("close image"));
389 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
390 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
391 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
393 QTreePushButton* rButton = new QTreePushButton;
394 rButton->setItem(item);
395 rButton->setColumn(COLUMN_RELOAD_IMAGE);
396 rButton->setToolTip(tr("reload image"));
397 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
398 rButton->setEnabled(false);
400 //connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
401 //this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
403 DataTree->topLevelItem(image_index)->setExpanded(1);
404 DataTree->topLevelItem(image_index)->addChild(item);
405 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
406 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
407 QString id = DataTree->topLevelItem(image_index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
408 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
411 mSlicerManagers[image_index]->AddContour(contour,propagation);
412 mSlicerManagers[image_index]->Render();
414 //------------------------------------------------------------------------------
417 //------------------------------------------------------------------------------
418 void vvMainWindow::OpenVTKContour()
420 if (mSlicerManagers.size() > 0)
422 QString Extensions = "Images ( *.vtk; *.obj)";
423 Extensions += ";;All Files (*)";
424 QString file = QFileDialog::getOpenFileName(this,tr("Open vtkPolyData"),mInputPathName,Extensions);
427 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
428 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
430 reader.SetImage(mSlicerManagers[index]->GetImage());
431 reader.SetModeToVTK();
432 reader.SetFilename(file.toStdString());
434 AddContour(index,reader.GetOutput()[0],false);
435 QApplication::restoreOverrideCursor();
438 //------------------------------------------------------------------------------
441 //------------------------------------------------------------------------------
442 void vvMainWindow::OpenDCStructContour()
444 if (mSlicerManagers.size() > 0)
446 QString Extensions = "Dicom Files ( *.dcm; RS*)";
447 Extensions += ";;All Files (*)";
448 QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"),mInputPathName,Extensions);
451 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
453 reader.SetFilename(file.toStdString());
454 vvStructSelector selector;
455 selector.SetStructures(reader.GetROINames());
456 if (!mSlicerManagers[index]->GetVF().IsNull())
457 selector.EnablePropagationCheckBox();
460 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
461 reader.SetSelectedItems(selector.getSelectedItems());
462 reader.SetImage(mSlicerManagers[index]->GetImage());
463 if (selector.PropagationEnabled())
464 reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
466 std::vector<vvMesh::Pointer> contours=reader.GetOutput();
467 for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
468 i!=contours.end();i++)
469 AddContour(index,*i,selector.PropagationEnabled());
470 QApplication::restoreOverrideCursor();
474 //------------------------------------------------------------------------------
477 //------------------------------------------------------------------------------
478 void vvMainWindow::ComputeDeformableRegistration()
480 if (mSlicerManagers.size() > 0)
482 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
483 vvDeformationDialog dialog(index,mSlicerManagers);
486 std::string base_name=itksys::SystemTools::GetFilenameWithoutExtension(mSlicerManagers[dialog.GetInputFileIndex()]->GetFileName());
487 AddField(dialog.GetOutput(),dialog.getFieldFile(),dialog.GetInputFileIndex());
488 WarpImage(dialog.GetSelectedSlicer(),dialog.GetReferenceFrameIndex());
491 std::cout << "Error or user cancellation while computing deformation field..." << std::endl;
493 else QMessageBox::information(this, "Need to open image","You must open an image first.");
495 //------------------------------------------------------------------------------
498 //------------------------------------------------------------------------------
499 void vvMainWindow::WarpImage()
501 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
502 if (!mSlicerManagers[index]->GetVF().IsNull())
505 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
506 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
509 WarpImage(mSlicerManagers[index],ref);
513 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field"));
515 //------------------------------------------------------------------------------
518 //------------------------------------------------------------------------------
519 void vvMainWindow::WarpImage(vvSlicerManager* selected_slicer,int reference_phase)
521 if (!selected_slicer->GetVF().IsNull())
523 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
524 QFileInfo info(selected_slicer->GetFileName().c_str());
525 vvImageWarp warp(selected_slicer->GetImage(),selected_slicer->GetVF(),
526 reference_phase,this);
527 if (warp.ComputeWarpedImage())
529 AddImage(warp.GetWarpedImage(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_warped.mhd");
530 AddImage(warp.GetDiffImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_diff.mhd");
531 AddImage(warp.GetJacobianImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_jacobian.mhd");
532 QApplication::restoreOverrideCursor();
536 QApplication::restoreOverrideCursor();
537 QMessageBox::warning(this,tr("Different spacings"),tr("The vector field and image spacings must be the same in order to warp."));
541 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field."));
543 //------------------------------------------------------------------------------
546 //------------------------------------------------------------------------------
547 vvMainWindow::~vvMainWindow() {
548 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
550 if (mSlicerManagers[i] != NULL)
551 delete mSlicerManagers[i];
554 //------------------------------------------------------------------------------
557 //------------------------------------------------------------------------------
558 void vvMainWindow::MergeImages() {
559 QString Extensions = EXTENSIONS;
560 Extensions += ";;All Files (*)";
561 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images"),mInputPathName,Extensions);
564 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
565 std::vector<std::string> vector;
567 unsigned int currentDim = 0;
568 std::vector<double> currentSpacing;
569 std::vector<int> currentSize;
570 std::vector<double> currentOrigin;
572 for (int i = 0; i < files.size(); i++)
574 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
575 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
576 reader->SetFileName(files[i].toStdString().c_str());
577 reader->ReadImageInformation();
579 //NOViewWidget->hide();
580 //NEViewWidget->hide();
581 //SOViewWidget->hide();
582 //SEViewWidget->hide();
584 currentDim = reader->GetNumberOfDimensions();
586 for (unsigned int j = 0;j < currentDim; j++)
592 currentSpacing.resize(currentDim);
593 currentSize.resize(currentDim);
594 currentOrigin.resize(currentDim);
596 currentOrigin[j] = reader->GetOrigin(j);
597 currentSpacing[j] = reader->GetSpacing(j);
598 currentSize[j] = reader->GetDimensions(j);
600 else if (currentDim != reader->GetNumberOfDimensions()
601 || currentSpacing[j] != reader->GetSpacing(j)
602 || currentSize[j] != (int)reader->GetDimensions(j)
603 || currentOrigin[j] != reader->GetOrigin(j))
605 QString error = "Cannot read file (too different from others ";
606 error += files[i].toStdString().c_str();
607 QMessageBox::information(this,tr("Reading problem"),error);
613 vector.push_back(files[i].toStdString());
616 if (vector.size() > 0)
617 LoadImages(vector, MERGED);
619 //------------------------------------------------------------------------------
622 //------------------------------------------------------------------------------
623 void vvMainWindow::MergeImagesWithTime() {
624 QString Extensions = EXTENSIONS;
625 Extensions += ";;All Files (*)";
626 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images With Time"),mInputPathName,Extensions);
629 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
630 std::vector<std::string> vector;
632 unsigned int currentDim = 0;
633 std::vector<double> currentSpacing;
634 std::vector<int> currentSize;
635 std::vector<double> currentOrigin;
637 for (int i = 0; i < files.size(); i++)
639 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
640 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
643 reader->SetFileName(files[i].toStdString().c_str());
644 reader->ReadImageInformation();
646 currentDim = reader->GetNumberOfDimensions();
648 for (unsigned int j = 0;j < currentDim; j++)
654 currentSpacing.resize(currentDim);
655 currentSize.resize(currentDim);
656 currentOrigin.resize(currentDim);
658 currentOrigin[j] = reader->GetOrigin(j);
659 currentSpacing[j] = reader->GetSpacing(j);
660 currentSize[j] = reader->GetDimensions(j);
662 else if (currentDim != reader->GetNumberOfDimensions()
663 || currentSpacing[j] != reader->GetSpacing(j)
664 || currentSize[j] != (int)reader->GetDimensions(j)
665 || currentOrigin[j] != reader->GetOrigin(j))
667 QString error = "Cannot read file (too different from others ";
668 error += files[i].toStdString().c_str();
669 QMessageBox::information(this,tr("Reading problem"),error);
675 vector.push_back(files[i].toStdString());
679 QString error = "Cannot read file info for ";
680 error += files[i].toStdString().c_str();
682 error += "Maybe you're trying to open an image in an unsupported format?\n";
683 QMessageBox::information(this,tr("Reading problem"),error);
686 sort(vector.begin(),vector.end());
687 if (vector.size() > 1)
688 LoadImages(vector, MERGEDWITHTIME);
690 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.");
692 //------------------------------------------------------------------------------
695 //------------------------------------------------------------------------------
696 void vvMainWindow::OpenDicom() {
697 std::vector<std::string> files;
699 #ifdef CLITK_VV_USE_BDCM
700 bool r = bdcm::OpenDicomFilesSelectorDialog(files,
701 "DicomFilesSelectorDialog test",
705 std::cout << "$$$$ main : user clicked 'OK' $$$$"<<std::endl;
706 std::cout << "$$$$ selected files : "<<std::endl;
707 std::vector<std::string>::iterator i;
708 for (i=files.begin();i!=files.end();++i) {
709 std::cout << *i << std::endl;
711 std::cout << "$$$$ "<<std::endl;
713 LoadImages(files,DICOM);
716 std::cout << "$$$$ main : user clicked 'CANCEL' $$$$"<<std::endl;
719 std::cout << "dicomSeriesSelector " << std::endl;
720 if (dicomSeriesSelector->exec() == QDialog::Accepted) {
721 files = *(dicomSeriesSelector->GetFilenames());
722 LoadImages(files,DICOM);
727 //------------------------------------------------------------------------------
729 //------------------------------------------------------------------------------
730 void vvMainWindow::OpenImages() {
731 QString Extensions = EXTENSIONS;
732 Extensions += ";;All Files (*)";
734 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images"),mInputPathName,Extensions);
737 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
738 std::vector<std::string> vector;
739 for (int i = 0; i < files.size(); i++)
740 vector.push_back(files[i].toStdString());
741 LoadImages(vector, IMAGE);
743 //------------------------------------------------------------------------------
744 void vvMainWindow::OpenRecentImage()
746 QAction * caller = qobject_cast<QAction*>(sender());
747 std::vector<std::string> images;
748 images.push_back(caller->text().toStdString());
749 mInputPathName = itksys::SystemTools::GetFilenamePath(images[0]).c_str();
750 LoadImages(images,IMAGE);
753 //------------------------------------------------------------------------------
754 void vvMainWindow::OpenImageWithTime() {
755 QString Extensions = EXTENSIONS;
756 Extensions += ";;All Files (*)";
758 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images With Time"),mInputPathName,Extensions);
761 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
762 std::vector<std::string> vector;
763 for (int i = 0; i < files.size(); i++)
765 vector.push_back(files[i].toStdString());
767 LoadImages(vector, IMAGEWITHTIME);
769 //------------------------------------------------------------------------------
771 //------------------------------------------------------------------------------
772 void vvMainWindow::LoadImages(std::vector<std::string> files, LoadedImageType filetype) {
773 //Separate the way to open images and dicoms
775 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
776 fileSize = files.size();
780 //Only add to the list of recently opened files when a single file is opened,
781 //to avoid polluting the list of recently opened files
782 if (files.size() == 1)
784 QFileInfo finfo=tr(files[0].c_str());
785 AddToRecentlyOpenedImages(finfo.absoluteFilePath().toStdString());
787 //init the progress events
788 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
789 vvProgressDialog progress("Opening " + files[0],fileSize>1);
790 qApp->processEvents();
792 int numberofsuccesulreads=0;
793 //open images as 1 or multiples
794 for (int i = 0; i < fileSize; i++) {
796 progress.Update("Opening " + files[i]);
797 progress.SetProgress(i,fileSize);
798 qApp->processEvents();
800 //read the image and put it in mSlicerManagers
801 vvSlicerManager* imageManager = new vvSlicerManager(4);
802 qApp->processEvents();
804 bool SetImageSucceed=false;
806 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
807 SetImageSucceed = imageManager->SetImage(files[i],filetype);
810 SetImageSucceed = imageManager->SetImages(files,filetype);
812 if (SetImageSucceed == false)
814 QApplication::restoreOverrideCursor();
815 QString error = "Cannot open file \n";
816 error += imageManager->GetLastError().c_str();
817 QMessageBox::information(this,tr("Reading problem"),error);
822 mSlicerManagers.push_back(imageManager);
824 //create an item in the tree with good settings
825 QTreeWidgetItem *item = new QTreeWidgetItem();
826 item->setData(0,Qt::UserRole,files[i].c_str());
827 QFileInfo fileinfo(imageManager->GetFileName().c_str()); //Do not show the path
828 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
829 qApp->processEvents();
831 //Create the buttons for reload and close
832 qApp->processEvents();
833 QTreePushButton* cButton = new QTreePushButton;
834 cButton->setItem(item);
835 cButton->setColumn(COLUMN_CLOSE_IMAGE);
836 cButton->setToolTip(tr("close image"));
837 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
838 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
839 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
841 QTreePushButton* rButton = new QTreePushButton;
842 rButton->setItem(item);
843 rButton->setColumn(COLUMN_RELOAD_IMAGE);
844 rButton->setToolTip(tr("reload image"));
845 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
846 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
847 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
849 DataTree->addTopLevelItem(item);
850 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
851 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
853 //set the id of the image
854 QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1);
855 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
856 mSlicerManagers.back()->SetId(id.toStdString());
858 linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
860 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
861 this,SLOT(CurrentImageChanged(std::string)));
862 connect(mSlicerManagers.back(),SIGNAL(
863 UpdatePosition(int, double, double, double, double, double, double, double)),this,
864 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
865 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
866 this, SLOT(VectorChanged(int,double,double,double, double)));
867 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
868 this, SLOT(OverlayChanged(int,double,double)));
869 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
870 this, SLOT(FusionChanged(int,double)));
871 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
872 this,SLOT(WindowsChanged(int, int, int)));
873 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
874 this,SLOT(WindowLevelChanged(double, double, int, int)));
875 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
876 this,SLOT(UpdateSlice(int,int)));
877 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
878 this,SLOT(UpdateTSlice(int, int)));
879 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
880 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
881 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
882 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
883 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
885 numberofsuccesulreads++;
888 if (numberofsuccesulreads)
890 NOViewWidget->show();
891 NEViewWidget->show();
892 SOViewWidget->show();
893 SEViewWidget->show();
898 QApplication::restoreOverrideCursor();
901 //------------------------------------------------------------------------------
903 //------------------------------------------------------------------------------
904 void vvMainWindow::UpdateTree() {
905 DataTree->resizeColumnToContents(COLUMN_TREE);
906 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
907 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
908 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
909 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
910 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
911 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
912 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
914 //------------------------------------------------------------------------------
916 //------------------------------------------------------------------------------
917 void vvMainWindow::CurrentImageChanged(std::string id) {
919 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
921 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id)
927 DataTree->topLevelItem(i)->setSelected(0);
929 for (int child = 0; child < DataTree->topLevelItem(i)->childCount();child++)
930 DataTree->topLevelItem(i)->child(child)->setSelected(0);
933 DataTree->topLevelItem(selected)->setSelected(1);
935 //------------------------------------------------------------------------------
937 //------------------------------------------------------------------------------
938 void vvMainWindow::ImageInfoChanged() {
939 contextActions[7]->setEnabled(1);
940 contextActions[6]->setEnabled(1);
941 actionSave_As->setEnabled(1);
942 actionAdd_VF_to_current_Image->setEnabled(1);
943 actionAdd_fusion_image->setEnabled(1);
944 actionNorth_East_Window->setEnabled(1);
945 actionNorth_West_Window->setEnabled(1);
946 actionSouth_East_Window->setEnabled(1);
947 actionSouth_West_Window->setEnabled(1);
948 inverseButton->setEnabled(1);
950 goToCursorPushButton->setEnabled(1);
952 if (DataTree->selectedItems().size()) {
953 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
955 colorMapComboBox->setEnabled(1);
956 for (int i = 0; i < DataTree->topLevelItem(index)->childCount();i++)
958 if (DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "overlay" ||
959 DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion")
961 colorMapComboBox->setEnabled(0);
966 std::vector<double> origin;
967 std::vector<double> inputSpacing;
968 std::vector<int> inputSize;
969 std::vector<double> sizeMM;
972 QString inputSizeInBytes;
973 QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
975 if (mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size() > 1 || playMode == 1)
977 playButton->setEnabled(1);
978 frameRateLabel->setEnabled(1);
979 frameRateSpinBox->setEnabled(1);
983 playButton->setEnabled(0);
984 frameRateLabel->setEnabled(0);
985 frameRateSpinBox->setEnabled(0);
991 if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0])
993 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
994 dimension = imageSelected->GetNumberOfDimensions();
995 origin.resize(dimension);
996 inputSpacing.resize(dimension);
997 inputSize.resize(dimension);
998 sizeMM.resize(dimension);
999 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1000 for (int i = 0;i < dimension;i++)
1002 origin[i] = imageSelected->GetOrigin()[i];
1003 inputSpacing[i] = imageSelected->GetSpacing()[i];
1004 inputSize[i] = imageSelected->GetSize()[i];
1005 sizeMM[i] = inputSize[i]*inputSpacing[i];
1006 NPixel *= inputSize[i];
1008 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1010 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
1012 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF();
1013 dimension = imageSelected->GetNumberOfDimensions();
1014 origin.resize(dimension);
1015 inputSpacing.resize(dimension);
1016 inputSize.resize(dimension);
1017 sizeMM.resize(dimension);
1018 pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsString().c_str();
1019 for (int i = 0;i < dimension;i++)
1021 origin[i] = imageSelected->GetOrigin()[i];
1022 inputSpacing[i] = imageSelected->GetSpacing()[i];
1023 inputSize[i] = imageSelected->GetSize()[i];
1024 sizeMM[i] = inputSize[i]*inputSpacing[i];
1025 NPixel *= inputSize[i];
1027 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1029 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay")
1031 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay();
1032 dimension = imageSelected->GetNumberOfDimensions();
1033 origin.resize(dimension);
1034 inputSpacing.resize(dimension);
1035 inputSize.resize(dimension);
1036 sizeMM.resize(dimension);
1037 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1038 for (int i = 0;i < dimension;i++)
1040 origin[i] = imageSelected->GetOrigin()[i];
1041 inputSpacing[i] = imageSelected->GetSpacing()[i];
1042 inputSize[i] = imageSelected->GetSize()[i];
1043 sizeMM[i] = inputSize[i]*inputSpacing[i];
1044 NPixel *= inputSize[i];
1046 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1048 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion")
1050 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
1051 dimension = imageSelected->GetNumberOfDimensions();
1052 origin.resize(dimension);
1053 inputSpacing.resize(dimension);
1054 inputSize.resize(dimension);
1055 sizeMM.resize(dimension);
1056 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1057 for (int i = 0;i < dimension;i++)
1059 origin[i] = imageSelected->GetOrigin()[i];
1060 inputSpacing[i] = imageSelected->GetSpacing()[i];
1061 inputSize[i] = imageSelected->GetSize()[i];
1062 sizeMM[i] = inputSize[i]*inputSpacing[i];
1063 NPixel *= inputSize[i];
1065 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1068 QString dim = QString::number(dimension) + " (";
1069 dim += pixelType + ")";
1071 infoPanel->setFileName(image);
1072 infoPanel->setDimension(dim);
1073 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1074 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1075 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1076 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1077 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1079 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1080 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1081 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1082 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1084 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1085 for (int i = 0; i < 4;i++)
1087 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1089 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1093 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1094 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1095 // DD(mSlicerManagers[index]->GetColorMap());
1096 // DD(mSlicerManagers[index]->GetPreset());
1097 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1098 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1100 infoPanel->setFileName(image);
1101 infoPanel->setDimension(dim);
1102 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1103 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1104 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1105 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1106 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1108 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1109 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1110 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1111 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1113 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1114 for (int i = 0; i < 4;i++)
1116 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1118 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1122 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1123 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1124 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1125 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1127 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
1129 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1130 overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
1131 mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
1132 mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
1136 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1137 overlayPanel->getVFProperty(-1,-1,-1);
1139 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
1141 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1142 overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor());
1146 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1147 overlayPanel->getOverlayProperty(-1);
1149 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
1151 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1152 overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
1153 mSlicerManagers[index]->GetFusionColorMap(),
1154 mSlicerManagers[index]->GetFusionWindow(),
1155 mSlicerManagers[index]->GetFusionLevel());
1159 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1160 overlayPanel->getFusionProperty(-1, -1,-1,-1);
1164 //------------------------------------------------------------------------------
1166 //------------------------------------------------------------------------------
1167 void vvMainWindow::ShowDocumentation() {
1168 documentation->show();
1170 //------------------------------------------------------------------------------
1171 void vvMainWindow::ShowHelpDialog() {
1172 help_dialog->show();
1174 //------------------------------------------------------------------------------
1176 //------------------------------------------------------------------------------
1177 void vvMainWindow::ChangeViewMode() {
1178 QListIterator<int> it0(splitter_3->sizes());
1179 QListIterator<int> it1(splitter_3->sizes());
1182 while (it0.hasNext())
1186 while (it1.hasNext())
1195 size0.push_back(max0);
1197 size1.push_back(max1);
1199 splitter_3->setSizes(size0);
1200 OSplitter->setSizes(size1);
1201 DataTree->setColumnHidden(2,1);
1202 DataTree->setColumnHidden(3,1);
1203 DataTree->setColumnHidden(4,1);
1208 size0.push_back(int(max0/2));
1209 size0.push_back(int(max0/2));
1210 size1.push_back(int(max1/2));
1211 size1.push_back(int(max1/2));
1212 splitter_3->setSizes(size0);
1213 OSplitter->setSizes(size1);
1214 DataTree->setColumnHidden(2,0);
1215 DataTree->setColumnHidden(3,0);
1216 DataTree->setColumnHidden(4,0);
1219 //------------------------------------------------------------------------------
1221 //------------------------------------------------------------------------------
1222 QString vvMainWindow::GetSizeInBytes(unsigned long size) {
1223 QString result = "";// QString::number(size);
1224 //result += " bytes (";
1225 if (size > 1000000000)
1228 result += QString::number(size);
1229 result += "Gb";//)";
1231 else if (size > 1000000)
1234 result += QString::number(size);
1235 result += "Mb";//)";
1237 else if (size > 1000)
1240 result += QString::number(size);
1241 result += "kb";//)";
1245 //------------------------------------------------------------------------------
1247 //------------------------------------------------------------------------------
1248 QString vvMainWindow::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
1250 for (unsigned int i= 0; i < vectorDouble.size(); i++)
1254 result += QString::number(vectorDouble[i]);
1258 //------------------------------------------------------------------------------
1260 //------------------------------------------------------------------------------
1261 QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt) {
1263 for (unsigned int i= 0; i < vectorInt.size(); i++)
1267 result += QString::number(vectorInt[i]);
1271 //------------------------------------------------------------------------------
1273 //------------------------------------------------------------------------------
1274 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item) {
1275 QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1276 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1278 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString() == id)
1283 //------------------------------------------------------------------------------
1285 //------------------------------------------------------------------------------
1286 void vvMainWindow::DisplayChanged(QTreeWidgetItem *clicked_item, int column) {
1287 int index = GetSlicerIndexFromItem(clicked_item);
1288 if ( column >= COLUMN_CLOSE_IMAGE || column <= 0)
1290 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1292 QTreeWidgetItem* current_row=DataTree->topLevelItem(i);
1293 if (DataTree->topLevelItem(index) == current_row)
1295 vvSlicer* clicked_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1296 if (current_row == clicked_item)
1298 //If we just activated a slicer
1299 if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1301 mSlicerManagers[i]->UpdateSlicer(column-1,clicked_item->data(column,Qt::CheckStateRole).toInt());
1302 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1303 DisplaySliders(i,column-1);
1304 std::map<std::string,int> overlay_counts;
1305 for (int child = 0; child < current_row->childCount(); child++)
1307 std::string overlay_type =
1308 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1309 overlay_counts[overlay_type]++;
1310 current_row->child(child)->setData(column,Qt::CheckStateRole,
1311 current_row->data(column,Qt::CheckStateRole));
1312 clicked_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,true);
1315 else //We don't allow simply desactivating a slicer
1317 clicked_item->setData(column,Qt::CheckStateRole,2);
1321 //if we clicked on the vector(or overlay) and not the image
1324 if (clicked_item->data(column,Qt::CheckStateRole).toInt())
1326 current_row->setData(column,Qt::CheckStateRole,2);
1327 mSlicerManagers[i]->UpdateSlicer(column-1,2);
1328 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1329 DisplaySliders(i,column-1);
1331 int vis = clicked_item->data(column,Qt::CheckStateRole).toInt();
1332 std::string overlay_type = clicked_item->data(1,Qt::UserRole).toString().toStdString();
1333 int overlay_index=0;
1334 for (int child = 0; child < current_row->childCount(); child++)
1336 if (current_row->child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1338 if (current_row->child(child) == clicked_item) break;
1340 clicked_slicer->SetActorVisibility(
1341 clicked_item->data(1,Qt::UserRole).toString().toStdString(), overlay_index-1,vis);
1344 else if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1346 current_row->setData(column,Qt::CheckStateRole,0);
1347 mSlicerManagers[i]->UpdateSlicer(column-1,0);
1348 std::map<std::string,int> overlay_counts;
1349 for (int child = 0; child < current_row->childCount(); child++)
1351 std::string overlay_type =
1352 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1353 overlay_counts[overlay_type]++;
1354 current_row->child(child)->setData(column,Qt::CheckStateRole,0);
1355 vvSlicer * current_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1356 current_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,false);
1359 //mSlicerManagers[i]->SetColorMap(-1);
1360 mSlicerManagers[i]->SetColorMap();
1362 mSlicerManagers[index]->GetSlicer(column-1)->Render();
1364 //------------------------------------------------------------------------------
1366 void vvMainWindow::InitSlicers()
1368 if (mSlicerManagers.size())
1370 mSlicerManagers.back()->GenerateDefaultLookupTable();
1372 mSlicerManagers.back()->SetSlicerWindow(0,NOViewWidget->GetRenderWindow());
1373 mSlicerManagers.back()->SetSlicerWindow(1,NEViewWidget->GetRenderWindow());
1374 mSlicerManagers.back()->SetSlicerWindow(2,SOViewWidget->GetRenderWindow());
1375 mSlicerManagers.back()->SetSlicerWindow(3,SEViewWidget->GetRenderWindow());
1379 //------------------------------------------------------------------------------
1380 void vvMainWindow::InitDisplay() {
1381 if (mSlicerManagers.size())
1383 //BE CAREFUL : this is absolutely necessary to set the interactor style
1384 //in order to have the same style instanciation for all SlicerManagers in
1386 for (int j = 0; j < 4; j++)
1388 vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
1389 style->SetAutoAdjustCameraClippingRange(1);
1390 bool AlreadySelected = false;
1391 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1393 mSlicerManagers[i]->SetInteractorStyleNavigator(j,style);
1395 //select the image only if previous are not selected
1396 if (DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 1)
1398 mSlicerManagers[i]->UpdateSlicer(j,1);
1399 AlreadySelected = true;
1401 else if (i == DataTree->topLevelItemCount()-1 && !AlreadySelected)
1403 if (DataTree->selectedItems().size() == 0)
1404 DataTree->topLevelItem(i)->setSelected(1);
1405 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,2);
1406 mSlicerManagers[i]->UpdateSlicer(j,1);
1407 DisplaySliders(i,j);
1411 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,0);
1412 mSlicerManagers[i]->UpdateSlicer(j,0);
1419 //------------------------------------------------------------------------------
1421 //------------------------------------------------------------------------------
1422 void vvMainWindow::DisplaySliders(int slicer, int window) {
1424 mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
1425 int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
1429 tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
1430 int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
1431 bool showHorizontal = false;
1432 bool showVertical = false;
1433 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1434 || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
1435 && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME
1436 && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME))
1437 showVertical = true;
1438 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1439 || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME
1440 || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME)
1441 showHorizontal = true;
1444 verticalSliders[window]->show();
1446 verticalSliders[window]->hide();
1447 verticalSliders[window]->setRange(range[0],range[1]);
1448 verticalSliders[window]->setValue(position);
1451 horizontalSliders[window]->show();
1453 horizontalSliders[window]->hide();
1454 horizontalSliders[window]->setRange(tRange[0],tRange[1]);
1455 horizontalSliders[window]->setValue(tPosition);
1457 //------------------------------------------------------------------------------
1459 //------------------------------------------------------------------------------
1460 void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) {
1461 int index = GetSlicerIndexFromItem(item);
1463 if (DataTree->topLevelItem(index) != item)
1465 QString warning = "Do you really want to close the overlay : ";
1466 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1467 QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
1469 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1470 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1471 if (msgBox.exec() == QMessageBox::AcceptRole)
1473 std::string overlay_type=item->data(1,Qt::UserRole).toString().toStdString();
1474 int overlay_index=0;
1475 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1477 if (DataTree->topLevelItem(index)->\
1478 child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1480 if (DataTree->topLevelItem(index)->child(child) == item) break;
1482 mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
1483 mSlicerManagers[index]->SetColorMap(0);
1484 DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
1485 mSlicerManagers[index]->Render();
1488 else if (DataTree->topLevelItemCount() <= 1)
1490 QString warning = "Do you really want to close the image : ";
1491 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1492 warning += "\nThis is the last image, you're about to close vv !!!";
1493 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1495 msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
1496 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1497 if (msgBox.exec() == QMessageBox::AcceptRole)
1504 QString warning = "Do you really want to close the image : ";
1505 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1506 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1508 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1509 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1510 if (msgBox.exec() == QMessageBox::AcceptRole)
1513 // Tell tools that we close an image
1514 emit AnImageIsBeingClosed(mSlicerManagers[index]);
1516 std::vector<vvSlicerManager*>::iterator Manageriter = mSlicerManagers.begin();
1517 DataTree->takeTopLevelItem(index);
1518 for (int i = 0; i < index; i++)
1522 linkPanel->removeImage(index);
1523 mSlicerManagers[index]->RemoveActors();
1524 delete mSlicerManagers[index];
1525 mSlicerManagers.erase(Manageriter);
1532 //------------------------------------------------------------------------------
1534 //------------------------------------------------------------------------------
1535 void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) {
1536 // int index = GetSlicerIndexFromItem(item);
1537 // QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1538 // if (item->data(1,Qt::UserRole).toString() == "vector")
1539 // mSlicerManagers[index]->ReloadVF();
1541 // mSlicerManagers[index]->Reload();
1543 // QApplication::restoreOverrideCursor();
1544 int index = GetSlicerIndexFromItem(item);
1545 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1546 QString role=item->data(1,Qt::UserRole).toString();
1547 if ( role == "vector")
1548 mSlicerManagers[index]->ReloadVF();
1549 else if (role == "overlay")
1550 mSlicerManagers[index]->ReloadOverlay();
1551 else if (role == "fusion")
1552 mSlicerManagers[index]->ReloadFusion();
1554 mSlicerManagers[index]->Reload();
1555 QApplication::restoreOverrideCursor();
1557 //------------------------------------------------------------------------------
1559 // void vvMainWindow::CropImage()
1561 // int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1562 // vvCropDialog crop(mSlicerManagers,index);
1564 // AddImage(crop.GetOutput(),"cropped.mhd");
1567 //------------------------------------------------------------------------------
1568 void vvMainWindow::SplitImage() {
1569 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1570 int dim = mSlicerManagers[index]->GetDimension();
1571 QString warning = "Do you really want to split the ";
1572 warning += QString::number(dim) + "D image ";
1573 warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into ";
1574 warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " ";
1575 warning += QString::number(dim-1) + "D images.";
1576 QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"),
1578 msgBox.addButton(tr("Split"), QMessageBox::AcceptRole);
1579 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1580 if (msgBox.exec() == QMessageBox::AcceptRole)
1582 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1585 std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString();
1586 int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1];
1587 std::string path = itksys::SystemTools::GetFilenamePath(
1590 path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString();
1592 path += itksys::SystemTools::GetFilenameLastExtension(
1595 typedef itk::NumericSeriesFileNames NameGeneratorType;
1596 NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
1597 nameGenerator->SetSeriesFormat(path.c_str());
1598 nameGenerator->SetStartIndex(0);
1599 nameGenerator->SetEndIndex(numberOfSlice-1);
1600 nameGenerator->SetIncrementIndex(1);
1602 for (int i = 0; i < numberOfSlice; i++)
1604 vvSlicerManager* imageManager = new vvSlicerManager(4);
1605 imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i],
1606 mSlicerManagers[index]->GetSlicer(0)->GetImage(), i);
1607 mSlicerManagers.push_back(imageManager);
1609 //create an item in the tree with good settings
1610 QTreeWidgetItem *item = new QTreeWidgetItem();
1611 item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str());
1612 std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension(
1613 nameGenerator->GetFileNames()[i]).c_str();
1614 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str());
1615 for (int j = 1; j <= 4; j++)
1617 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1619 DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0);
1621 item->setData(j,Qt::CheckStateRole,2);
1624 //Create the buttons for reload and close
1625 QTreePushButton* cButton = new QTreePushButton;
1626 cButton->setItem(item);
1627 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1628 cButton->setToolTip(tr("close image"));
1629 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1630 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1631 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1633 QTreePushButton* rButton = new QTreePushButton;
1634 rButton->setItem(item);
1635 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1636 rButton->setToolTip(tr("reload image"));
1637 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1638 rButton->setEnabled(false);
1639 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1640 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1642 DataTree->addTopLevelItem(item);
1643 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1644 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1646 //set the id of the image
1647 QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1);
1648 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1649 mSlicerManagers.back()->SetId(id.toStdString());
1650 linkPanel->addImage(fileI, id.toStdString());
1651 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
1652 this,SLOT(CurrentImageChanged(std::string)));
1653 connect(mSlicerManagers.back(),SIGNAL(
1654 UpdatePosition(int, double, double, double, double, double, double, double)),this,
1655 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
1656 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
1657 this, SLOT(VectorChanged(int,double,double,double, double)));
1658 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
1659 this, SLOT(OverlayChanged(int,double,double)));
1660 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
1661 this, SLOT(FusionChanged(int,double)));
1662 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
1663 this,SLOT(WindowsChanged(int, int, int)));
1664 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
1665 this,SLOT(WindowLevelChanged(double, double, int, int)));
1666 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
1667 this,SLOT(UpdateSlice(int,int)));
1668 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
1669 this,SLOT(UpdateTSlice(int, int)));
1670 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
1671 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
1672 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
1673 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
1674 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
1676 qApp->processEvents();
1679 qApp->processEvents();
1681 QApplication::restoreOverrideCursor();
1685 QApplication::restoreOverrideCursor();
1686 QString error = "Cannot split file (dimensions must be greater than 2) ";
1687 QMessageBox::information(this,tr("Splitting problem"),error);
1691 //------------------------------------------------------------------------------
1693 //------------------------------------------------------------------------------
1694 void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) {
1695 infoPanel->setCurrentInfo(visibility,x,y,z,X,Y,Z,value);
1697 //------------------------------------------------------------------------------
1699 //------------------------------------------------------------------------------
1700 void vvMainWindow::VectorChanged(int visibility,double x, double y, double z, double value) {
1701 overlayPanel->getCurrentVectorInfo(visibility,x,y,z,value);
1703 //------------------------------------------------------------------------------
1705 //------------------------------------------------------------------------------
1706 void vvMainWindow::OverlayChanged(int visibility, double valueOver, double valueRef) {
1707 overlayPanel->getCurrentOverlayInfo(visibility,valueOver, valueRef);
1709 //------------------------------------------------------------------------------
1711 //------------------------------------------------------------------------------
1712 void vvMainWindow::FusionChanged(int visibility, double value) {
1713 overlayPanel->getCurrentFusionInfo(visibility,value);
1715 //------------------------------------------------------------------------------
1717 //------------------------------------------------------------------------------
1718 void vvMainWindow::WindowsChanged(int window, int view, int slice) {
1719 infoPanel->setViews(window, view, slice);
1721 //------------------------------------------------------------------------------
1723 //------------------------------------------------------------------------------
1724 void vvMainWindow::WindowLevelChanged(double window, double level,int preset,int colormap) {
1725 windowSpinBox->setValue(window);
1726 levelSpinBox->setValue(level);
1727 colorMapComboBox->setCurrentIndex(colormap);
1728 presetComboBox->setCurrentIndex(preset);
1730 //------------------------------------------------------------------------------
1732 //------------------------------------------------------------------------------
1733 void vvMainWindow::WindowLevelEdited() {
1734 presetComboBox->setCurrentIndex(6);
1735 UpdateWindowLevel();
1737 //------------------------------------------------------------------------------
1739 //------------------------------------------------------------------------------
1740 void vvMainWindow::UpdateWindowLevel() {
1741 if (DataTree->selectedItems().size())
1743 if (presetComboBox->currentIndex() == 7) //For ventilation
1744 colorMapComboBox->setCurrentIndex(5);
1745 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1746 mSlicerManagers[index]->SetColorWindow(windowSpinBox->value());
1747 mSlicerManagers[index]->SetColorLevel(levelSpinBox->value());
1748 mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex());
1749 mSlicerManagers[index]->Render();
1752 //------------------------------------------------------------------------------
1754 //------------------------------------------------------------------------------
1755 void vvMainWindow::UpdateColorMap() {
1756 if (DataTree->selectedItems().size())
1758 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1759 mSlicerManagers[index]->SetColorMap(colorMapComboBox->currentIndex());
1760 mSlicerManagers[index]->Render();
1763 //------------------------------------------------------------------------------
1764 void vvMainWindow::SwitchWindowLevel() {
1765 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1766 int window = mSlicerManagers[index]->GetColorWindow();
1767 presetComboBox->setCurrentIndex(6);
1768 windowSpinBox->setValue(-window);
1769 UpdateWindowLevel();
1771 //------------------------------------------------------------------------------
1773 //------------------------------------------------------------------------------
1774 void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) {
1775 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1777 if (mSlicerManagers[i]->GetId() == id)
1779 //mSlicerManagers[i]->SetTSlice(temps);
1780 mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
1781 mSlicerManagers[i]->UpdateViews(0,slicer);
1786 //------------------------------------------------------------------------------
1788 //------------------------------------------------------------------------------
1789 void vvMainWindow::ShowContextMenu(QPoint point) {
1790 if (!DataTree->selectedItems().size())
1792 contextActions[1]->setEnabled(0);
1793 contextActions[2]->setEnabled(0);
1794 contextActions[3]->setEnabled(0);
1795 contextActions[4]->setEnabled(0);
1796 contextActions[5]->setEnabled(0);
1797 contextActions[6]->setEnabled(0);
1798 contextActions[7]->setEnabled(0);
1802 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1803 contextActions[1]->setEnabled(1);
1804 contextActions[2]->setEnabled(
1805 DataTree->itemWidget(DataTree->selectedItems()[0],
1806 COLUMN_RELOAD_IMAGE)->isEnabled());
1807 contextActions[3]->setEnabled(1);
1808 contextActions[5]->setEnabled(1);
1809 contextActions[6]->setEnabled(1);
1810 contextActions[7]->setEnabled(1);
1812 if (mSlicerManagers[index]->GetDimension() < 3)
1813 contextActions[4]->setEnabled(0);
1815 contextActions[4]->setEnabled(1);
1817 contextMenu.exec(QCursor::pos());
1819 //------------------------------------------------------------------------------
1821 //------------------------------------------------------------------------------
1822 void vvMainWindow::CloseImage() {
1823 CloseImage(DataTree->selectedItems()[0],0);
1825 //------------------------------------------------------------------------------
1827 //------------------------------------------------------------------------------
1828 void vvMainWindow::ReloadImage() {
1829 ReloadImage(DataTree->selectedItems()[0],0);
1831 //------------------------------------------------------------------------------
1833 //------------------------------------------------------------------------------
1834 void vvMainWindow::SelectOverlayImage() {
1835 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1837 //check if one overlay image is added
1838 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1839 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "overlay")
1841 QString error = "Cannot add more than one compared image\n";
1842 error += "Please remove first ";
1843 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1844 QMessageBox::information(this,tr("Problem adding compared image !"),error);
1848 QString Extensions = EXTENSIONS;
1849 Extensions += ";;All Files (*)";
1850 QString file = QFileDialog::getOpenFileName(this,tr("Load Overlay image"),mInputPathName,Extensions);
1851 if (!file.isEmpty())
1852 AddOverlayImage(index,file);
1854 //------------------------------------------------------------------------------
1856 //------------------------------------------------------------------------------
1857 void vvMainWindow::AddOverlayImage(int index, QString file) {
1858 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1859 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1860 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1861 reader->SetFileName(file.toStdString().c_str());
1862 reader->ReadImageInformation();
1863 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1864 int dimension = reader->GetNumberOfDimensions();
1865 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1866 vvProgressDialog progress("Opening " + file.toStdString());
1867 qApp->processEvents();
1869 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1870 if (mSlicerManagers[index]->SetOverlay(file.toStdString(),dimension, component))
1872 //create an item in the tree with good settings
1873 QTreeWidgetItem *item = new QTreeWidgetItem();
1874 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1875 item->setData(1,Qt::UserRole,tr("overlay"));
1876 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1877 qApp->processEvents();
1879 for (int j = 1; j <= 4; j++)
1881 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1882 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("overlay",0,
1883 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1886 //Create the buttons for reload and close
1887 qApp->processEvents();
1888 QTreePushButton* cButton = new QTreePushButton;
1889 cButton->setItem(item);
1890 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1891 cButton->setToolTip(tr("close image"));
1892 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1893 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1894 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1896 QTreePushButton* rButton = new QTreePushButton;
1897 rButton->setItem(item);
1898 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1899 rButton->setToolTip(tr("reload image"));
1900 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1901 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1902 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1904 DataTree->topLevelItem(index)->setExpanded(1);
1905 DataTree->topLevelItem(index)->addChild(item);
1906 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1907 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1909 //set the id of the image
1910 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1911 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1913 qApp->processEvents();
1915 QApplication::restoreOverrideCursor();
1919 QApplication::restoreOverrideCursor();
1920 QString error = "Cannot import the new image.\n";
1921 error += mSlicerManagers[index]->GetLastError().c_str();
1922 QMessageBox::information(this,tr("Problem reading image !"),error);
1926 void vvMainWindow::AddFusionImage()
1928 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1930 //check if one fusion image is added
1931 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1932 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion")
1934 QString error = "Cannot add more than one fusion image\n";
1935 error += "Please remove first ";
1936 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1937 QMessageBox::information(this,tr("Problem adding fusion image !"),error);
1941 QString Extensions = EXTENSIONS;
1942 Extensions += ";;All Files (*)";
1943 QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
1944 if (!file.isEmpty())
1946 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1947 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1948 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1949 reader->SetFileName(file.toStdString().c_str());
1950 reader->ReadImageInformation();
1951 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1954 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1955 vvProgressDialog progress("Opening fusion");
1956 qApp->processEvents();
1958 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1959 if (mSlicerManagers[index]->SetFusion(file.toStdString(),
1960 reader->GetNumberOfDimensions(), component))
1962 //create an item in the tree with good settings
1963 QTreeWidgetItem *item = new QTreeWidgetItem();
1964 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1965 item->setData(1,Qt::UserRole,tr("fusion"));
1966 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1967 qApp->processEvents();
1969 for (int j = 1; j <= 4; j++)
1971 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1972 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0,
1973 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1976 //Create the buttons for reload and close
1977 qApp->processEvents();
1978 QTreePushButton* cButton = new QTreePushButton;
1979 cButton->setItem(item);
1980 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1981 cButton->setToolTip(tr("close image"));
1982 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1983 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1984 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1986 QTreePushButton* rButton = new QTreePushButton;
1987 rButton->setItem(item);
1988 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1989 rButton->setToolTip(tr("reload image"));
1990 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1991 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1992 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1994 DataTree->topLevelItem(index)->setExpanded(1);
1995 DataTree->topLevelItem(index)->addChild(item);
1996 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1997 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1999 //set the id of the image
2000 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
2001 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2003 qApp->processEvents();
2005 QApplication::restoreOverrideCursor();
2009 QApplication::restoreOverrideCursor();
2010 QString error = "Cannot import the new image.\n";
2011 error += mSlicerManagers[index]->GetLastError().c_str();
2012 QMessageBox::information(this,tr("Problem reading image !"),error);
2017 QString error = "Cannot import the new image.\n";
2018 QMessageBox::information(this,tr("Problem reading image !"),error);
2024 void vvMainWindow::OpenField()
2026 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2027 //check if a vector field has already been added
2028 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
2029 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "vector")
2031 QString error = "Cannot add more than one vector field\n";
2032 error += "Please remove first ";
2033 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
2034 QMessageBox::information(this,tr("Problem adding vector field!"),error);
2038 QString Extensions = "Images ( *.mhd)";
2039 Extensions += ";;Images ( *.vf)";
2040 QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
2041 if (!file.isEmpty())
2042 AddField(file,index);
2045 void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
2047 //create an item in the tree with good settings
2048 QTreeWidgetItem *item = new QTreeWidgetItem();
2049 item->setData(0,Qt::UserRole,filename.toStdString().c_str());
2050 item->setData(1,Qt::UserRole,tr("vector"));
2051 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename);
2052 qApp->processEvents();
2054 for (int j = 1; j <= 4; j++)
2056 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
2057 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("vector",0,
2058 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
2061 //Create the buttons for reload and close
2062 qApp->processEvents();
2063 QTreePushButton* cButton = new QTreePushButton;
2064 cButton->setItem(item);
2065 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2066 cButton->setToolTip(tr("close vector field"));
2067 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2068 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2069 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2071 QTreePushButton* rButton = new QTreePushButton;
2072 rButton->setItem(item);
2073 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2074 rButton->setToolTip(tr("reload vector field"));
2075 rButton->setEnabled(from_disk);
2076 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2077 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2078 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2080 DataTree->topLevelItem(index)->setExpanded(1);
2081 DataTree->topLevelItem(index)->addChild(item);
2082 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2083 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2085 //set the id of the image
2086 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
2087 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2089 qApp->processEvents();
2091 QApplication::restoreOverrideCursor();
2094 void vvMainWindow::AddField(vvImage::Pointer vf,QString file,int index)
2096 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2097 vvSlicerManager* imageManager = mSlicerManagers[index];
2098 if (imageManager->SetVF(vf,file.toStdString()))
2100 AddFieldEntry(file,index,false);
2104 QString error = "Cannot import the vector field for this image.\n";
2105 error += imageManager->GetLastError().c_str();
2106 QMessageBox::information(this,tr("Problem reading VF !"),error);
2108 QApplication::restoreOverrideCursor();
2111 void vvMainWindow::AddField(QString file,int index)
2113 if (QFile::exists(file))
2115 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
2117 //init the progress events
2118 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2119 vvProgressDialog progress("Opening " + file.toStdString());
2120 qApp->processEvents();
2122 //read the vector and put it in the current mSlicerManager
2123 vvSlicerManager* imageManager = mSlicerManagers[index];
2124 qApp->processEvents();
2126 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
2127 if (imageManager->SetVF(file.toStdString()))
2129 imageManager->Render();
2130 AddFieldEntry(file,index,true);
2134 QApplication::restoreOverrideCursor();
2135 QString error = "Cannot import the vector field for this image.\n";
2136 error += imageManager->GetLastError().c_str();
2137 QMessageBox::information(this,tr("Problem reading VF !"),error);
2141 QMessageBox::information(this,tr("Problem reading VF !"),"File doesn't exist!");
2144 //------------------------------------------------------------------------------
2146 //------------------------------------------------------------------------------
2147 void vvMainWindow::SetVFProperty(int subsampling, int scale, int log) {
2148 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2149 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
2151 for (int i = 0; i < 4; i++)
2153 mSlicerManagers[index]->GetSlicer(i)->SetVFSubSampling(subsampling);
2154 mSlicerManagers[index]->GetSlicer(i)->SetVFScale(scale);
2156 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(1);
2158 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(0);
2162 //------------------------------------------------------------------------------
2164 //------------------------------------------------------------------------------
2165 void vvMainWindow::SetOverlayProperty(int color) {
2166 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2167 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
2169 mSlicerManagers[index]->SetOverlayColor(color);
2170 mSlicerManagers[index]->SetColorMap(0);
2171 mSlicerManagers[index]->Render();
2174 //------------------------------------------------------------------------------
2176 //------------------------------------------------------------------------------
2177 void vvMainWindow::SetFusionProperty(int opacity, int colormap,double window, double level) {
2178 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2179 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
2181 mSlicerManagers[index]->SetFusionOpacity(opacity);
2182 mSlicerManagers[index]->SetFusionColorMap(colormap);
2183 mSlicerManagers[index]->SetFusionWindow(window);
2184 mSlicerManagers[index]->SetFusionLevel(level);
2185 mSlicerManagers[index]->SetColorMap(0);
2186 mSlicerManagers[index]->Render();
2189 //------------------------------------------------------------------------------
2191 //------------------------------------------------------------------------------
2192 void vvMainWindow::SaveAs() {
2193 if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
2195 QMessageBox::warning(this,tr("Unsupported type"),tr("Sorry, saving a vector field is unsupported for the moment"));
2199 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2200 int dimension = mSlicerManagers[index]->GetDimension();
2201 QStringList OutputListeFormat;
2202 OutputListeFormat.clear();
2205 OutputListeFormat.push_back(".mhd");
2209 OutputListeFormat.push_back(".bmp");
2210 OutputListeFormat.push_back(".png");
2211 OutputListeFormat.push_back(".jpeg");
2212 OutputListeFormat.push_back(".tif");
2213 OutputListeFormat.push_back(".mhd");
2214 OutputListeFormat.push_back(".hdr");
2215 OutputListeFormat.push_back(".vox");
2217 else if (dimension == 3)
2219 OutputListeFormat.push_back(".mhd");
2220 OutputListeFormat.push_back(".hdr");
2221 OutputListeFormat.push_back(".vox");
2223 else if (dimension == 4)
2225 OutputListeFormat.push_back(".mhd");
2227 QString Extensions = "AllFiles(*.*)";
2228 for (int i = 0; i < OutputListeFormat.count(); i++)
2230 Extensions += ";;Images ( *";
2231 Extensions += OutputListeFormat[i];
2234 QString fileName = QFileDialog::getSaveFileName(this,
2236 mSlicerManagers[index]->GetFileName().c_str(),
2238 if (!fileName.isEmpty())
2240 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
2241 if (OutputListeFormat.contains(
2242 fileformat.c_str()))
2244 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2245 std::string action = "Saving";
2246 vvProgressDialog progress("Saving "+fileName.toStdString());
2247 qApp->processEvents();
2248 vvImageWriter *writer = new vvImageWriter;
2249 writer->SetOutputFileName(fileName.toStdString());
2250 writer->SetInput(mSlicerManagers[index]->GetImage());
2252 QApplication::restoreOverrideCursor();
2253 if (writer->GetLastError().size())
2255 QString error = "Saving did not succeed\n";
2256 error += writer->GetLastError().c_str();
2257 QMessageBox::information(this,tr("Saving Problem"),error);
2263 QString error = fileformat.c_str();
2264 if (error.isEmpty())
2265 error += "no file format specified !";
2267 error += " format unknown !!!\n";
2268 QMessageBox::information(this,tr("Saving Problem"),error);
2273 //------------------------------------------------------------------------------
2275 //------------------------------------------------------------------------------
2276 void vvMainWindow::AddLink(QString image1,QString image2) {
2277 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2279 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2281 mSlicerManagers[i]->AddLink(image2.toStdString());
2283 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2285 mSlicerManagers[i]->AddLink(image1.toStdString());
2289 //------------------------------------------------------------------------------
2291 //------------------------------------------------------------------------------
2292 void vvMainWindow::RemoveLink(QString image1,QString image2) {
2293 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2295 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2297 mSlicerManagers[i]->RemoveLink(image2.toStdString());
2299 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2301 mSlicerManagers[i]->RemoveLink(image1.toStdString());
2305 //------------------------------------------------------------------------------
2307 void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
2309 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2311 if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1)
2313 for (int j = 0; j < 4; j++)
2315 mSlicerManagers[i]->SetTSliceInSlicer(value,j);
2316 //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
2317 //UpdateTSlice(j,value);
2319 mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
2325 //------------------------------------------------------------------------------
2326 void vvMainWindow::NOHorizontalSliderMoved() {
2327 HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
2329 //------------------------------------------------------------------------------
2331 //------------------------------------------------------------------------------
2332 void vvMainWindow::NEHorizontalSliderMoved() {
2333 HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
2335 //------------------------------------------------------------------------------
2337 //------------------------------------------------------------------------------
2338 void vvMainWindow::SOHorizontalSliderMoved() {
2339 HorizontalSliderMoved(SOHorizontalSlider->value(),COLUMN_DL_VIEW,2);
2341 //------------------------------------------------------------------------------
2343 //------------------------------------------------------------------------------
2344 void vvMainWindow::SEHorizontalSliderMoved() {
2345 HorizontalSliderMoved(SEHorizontalSlider->value(),COLUMN_DR_VIEW,3);
2347 //------------------------------------------------------------------------------
2349 //------------------------------------------------------------------------------
2350 void vvMainWindow::NOVerticalSliderChanged() {
2351 int value = NOVerticalSlider->value();
2352 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2354 if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
2356 mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
2357 mSlicerManagers[i]->UpdateSlice(0); // <-- DS add this. Not too much update ?
2362 //------------------------------------------------------------------------------
2364 //------------------------------------------------------------------------------
2365 void vvMainWindow::NEVerticalSliderChanged() {
2366 int value = NEVerticalSlider->value();
2367 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2369 if (DataTree->topLevelItem(i)->data(COLUMN_UR_VIEW,Qt::CheckStateRole).toInt() > 1)
2371 mSlicerManagers[i]->GetSlicer(1)->SetSlice(value);
2376 //------------------------------------------------------------------------------
2378 //------------------------------------------------------------------------------
2379 void vvMainWindow::SOVerticalSliderChanged() {
2380 int value = SOVerticalSlider->value();
2381 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2383 if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
2385 mSlicerManagers[i]->GetSlicer(2)->SetSlice(value);
2390 //------------------------------------------------------------------------------
2392 //------------------------------------------------------------------------------
2393 void vvMainWindow::SEVerticalSliderChanged() {
2394 int value = SEVerticalSlider->value();
2395 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2397 if (DataTree->topLevelItem(i)->data(COLUMN_DR_VIEW,Qt::CheckStateRole).toInt() > 1)
2399 mSlicerManagers[i]->GetSlicer(3)->SetSlice(value);
2404 //------------------------------------------------------------------------------
2406 //------------------------------------------------------------------------------
2407 void vvMainWindow::UpdateSlice(int slicer, int slice) {
2409 if (slice != NOVerticalSlider->value())
2410 NOVerticalSlider->setValue(slice);
2412 else if (slicer == 1)
2413 NEVerticalSlider->setValue(slice);
2414 else if (slicer == 2)
2415 SOVerticalSlider->setValue(slice);
2416 else if (slicer == 3)
2417 SEVerticalSlider->setValue(slice);
2419 //------------------------------------------------------------------------------
2421 //------------------------------------------------------------------------------
2422 void vvMainWindow::UpdateTSlice(int slicer, int slice) {
2426 NOHorizontalSlider->setValue(slice);
2429 NEHorizontalSlider->setValue(slice);
2432 SOHorizontalSlider->setValue(slice);
2435 SEHorizontalSlider->setValue(slice);
2439 //------------------------------------------------------------------------------
2441 //------------------------------------------------------------------------------
2442 void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax) {
2443 int position = int((min+max)/2);
2444 int tPosition = int((tmin+tmax)/2);
2447 NOVerticalSlider->setValue(position);
2448 NOVerticalSlider->setRange(min,max);
2449 NOHorizontalSlider->setRange(tmin,tmax);
2450 NOHorizontalSlider->setValue(tPosition);
2452 else if (slicer == 1)
2454 NEVerticalSlider->setValue(position);
2455 NEVerticalSlider->setRange(min,max);
2456 NEHorizontalSlider->setRange(tmin,tmax);
2457 NEHorizontalSlider->setValue(tPosition);
2459 else if (slicer == 2)
2461 SOVerticalSlider->setValue(position);
2462 SOVerticalSlider->setRange(min,max);
2463 SOHorizontalSlider->setRange(tmin,tmax);
2464 SOHorizontalSlider->setValue(tPosition);
2466 else if (slicer == 3)
2468 SEVerticalSlider->setValue(position);
2469 SEVerticalSlider->setRange(min,max);
2470 SEHorizontalSlider->setRange(tmin,tmax);
2471 SEHorizontalSlider->setValue(tPosition);
2474 //------------------------------------------------------------------------------
2476 //------------------------------------------------------------------------------
2477 void vvMainWindow::SaveNOScreenshot() {
2478 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2479 w2i->SetInput(NOViewWidget->GetRenderWindow());
2481 SaveScreenshot(w2i->GetOutput());
2484 //------------------------------------------------------------------------------
2486 //------------------------------------------------------------------------------
2487 void vvMainWindow::SaveNEScreenshot() {
2488 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2489 w2i->SetInput(NEViewWidget->GetRenderWindow());
2491 SaveScreenshot(w2i->GetOutput());
2494 //------------------------------------------------------------------------------
2496 //------------------------------------------------------------------------------
2497 void vvMainWindow::SaveSOScreenshot() {
2498 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2499 w2i->SetInput(SOViewWidget->GetRenderWindow());
2501 SaveScreenshot(w2i->GetOutput());
2504 //------------------------------------------------------------------------------
2506 //------------------------------------------------------------------------------
2507 void vvMainWindow::SaveSEScreenshot() {
2508 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2509 w2i->SetInput(SEViewWidget->GetRenderWindow());
2511 SaveScreenshot(w2i->GetOutput());
2514 //------------------------------------------------------------------------------
2516 //------------------------------------------------------------------------------
2517 void vvMainWindow::SaveScreenshot(vtkImageData* image) {
2518 QString Extensions = "Images( *.png);;";
2519 Extensions += "Images( *.jpg);;";
2520 Extensions += "Images( *.bmp);;";
2521 Extensions += "Images( *.tif);;";
2522 Extensions += "Images( *.ppm)";
2523 QString fileName = QFileDialog::getSaveFileName(this,
2525 itksys::SystemTools::GetFilenamePath(
2526 mSlicerManagers[0]->GetFileName()).c_str(),
2528 if (!fileName.isEmpty())
2530 const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
2531 if (!strcmp(ext, ".bmp"))
2533 vtkBMPWriter *bmp = vtkBMPWriter::New();
2534 bmp->SetInput(image);
2535 bmp->SetFileName(fileName.toStdString().c_str());
2539 else if (!strcmp(ext, ".tif"))
2541 vtkTIFFWriter *tif = vtkTIFFWriter::New();
2542 tif->SetInput(image);
2543 tif->SetFileName(fileName.toStdString().c_str());
2547 else if (!strcmp(ext, ".ppm"))
2549 vtkPNMWriter *pnm = vtkPNMWriter::New();
2550 pnm->SetInput(image);
2551 pnm->SetFileName(fileName.toStdString().c_str());
2555 else if (!strcmp(ext, ".png"))
2557 vtkPNGWriter *png = vtkPNGWriter::New();
2558 png->SetInput(image);
2559 png->SetFileName(fileName.toStdString().c_str());
2563 else if (!strcmp(ext, ".jpg"))
2565 vtkJPEGWriter *jpg = vtkJPEGWriter::New();
2566 jpg->SetInput(image);
2567 jpg->SetFileName(fileName.toStdString().c_str());
2573 QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!"));
2578 //------------------------------------------------------------------------------
2580 //------------------------------------------------------------------------------
2581 void vvMainWindow::GoToCursor() {
2582 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2583 for (int column = 1; column < 5; column++)
2585 if (DataTree->selectedItems()[0]->data(column,Qt::CheckStateRole).toInt() > 1)
2587 double* cursorPos = mSlicerManagers[index]->GetSlicer(column-1)->GetCursorPosition();
2588 mSlicerManagers[index]->GetSlicer(column-1)->SetCurrentPosition(
2589 cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
2590 mSlicerManagers[index]->UpdateViews(1,column-1);
2591 mSlicerManagers[index]->UpdateLinked(column-1);
2596 //------------------------------------------------------------------------------
2598 //------------------------------------------------------------------------------
2599 void vvMainWindow::PlayPause() {
2603 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_play.png")));
2609 int image_number=DataTree->topLevelItemCount();
2611 for (int i=0;i<image_number;i++)
2612 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1)
2620 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_pause.png")));
2621 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2625 //------------------------------------------------------------------------------
2627 //------------------------------------------------------------------------------
2628 void vvMainWindow::PlayNext() {
2629 if (playMode && !this->isHidden())
2631 int image_number=DataTree->topLevelItemCount();
2632 ///Only play one slicer per SM, and only if the SM is being displayed
2633 for (int i=0;i<image_number;i++)
2634 for (int j=0;j<4;j++)
2635 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1 &&
2636 DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0)
2638 mSlicerManagers[i]->SetNextTSlice(j);
2641 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2644 //------------------------------------------------------------------------------
2646 void vvMainWindow::ShowLastImage()
2648 if (mSlicerManagers.size() > 1)
2650 QTreeWidgetItem * item=DataTree->topLevelItem(DataTree->topLevelItemCount()-1);
2651 CurrentImageChanged(mSlicerManagers.back()->GetId()); //select new image
2652 item->setData(1,Qt::CheckStateRole,2); //show the new image in the first panel
2653 DisplayChanged(item,1);
2657 //------------------------------------------------------------------------------
2658 void vvMainWindow::UpdateRenderWindows() {
2659 if (NOViewWidget->GetRenderWindow()) NOViewWidget->GetRenderWindow()->Render();
2660 if (NEViewWidget->GetRenderWindow()) NEViewWidget->GetRenderWindow()->Render();
2661 if (SOViewWidget->GetRenderWindow()) SOViewWidget->GetRenderWindow()->Render();
2662 if (SEViewWidget->GetRenderWindow()) SEViewWidget->GetRenderWindow()->Render();
2664 //------------------------------------------------------------------------------
2666 //------------------------------------------------------------------------------
2667 void vvMainWindow::ResampleCurrentImage() {
2668 vvResamplerDialog resampler;
2669 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2670 resampler.SetSlicerManagers(mSlicerManagers,index);
2671 if (resampler.exec())
2672 AddImage(resampler.GetOutput(),resampler.GetOutputFileName());
2674 //------------------------------------------------------------------------------
2676 //------------------------------------------------------------------------------
2677 void vvMainWindow::SegmentationOnCurrentImage() {
2678 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2680 vvSegmentationDialog segmentation;
2681 segmentation.SetImage(mSlicerManagers[index]->GetSlicer(0)->GetImage());
2682 segmentation.exec();
2684 //------------------------------------------------------------------------------
2686 void vvMainWindow::SurfaceViewerLaunch()
2688 vvSurfaceViewerDialog surfaceViewer;
2689 surfaceViewer.exec();
2692 //------------------------------------------------------------------------------
2693 void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
2695 vvSlicerManager* m = new vvSlicerManager(4);
2697 m->SetFilename(filename);
2701 //------------------------------------------------------------------------------
2702 void vvMainWindow::AddImage(vvSlicerManager * slicer_manager) {
2703 mSlicerManagers.push_back(slicer_manager);
2705 std::string filename = slicer_manager->GetFileName();
2707 //create an item in the tree with good settings
2708 QTreeWidgetItem *item = new QTreeWidgetItem();
2709 item->setData(0,Qt::UserRole,slicer_manager->GetFileName().c_str());//files[i].c_str());
2710 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
2711 qApp->processEvents();
2713 for (int j = 1; j <= 4; j++) item->setData(j,Qt::CheckStateRole,1);
2715 //Create the buttons for reload and close
2716 qApp->processEvents();
2717 QTreePushButton* cButton = new QTreePushButton;
2718 cButton->setItem(item);
2719 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2720 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2721 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2722 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2724 QTreePushButton* rButton = new QTreePushButton;
2725 rButton->setItem(item);
2726 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2727 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2728 rButton->setEnabled(0);
2729 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2730 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2732 DataTree->addTopLevelItem(item);
2733 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2734 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2736 //set the id of the image
2737 QString id = slicer_manager->GetFileName().c_str() + QString::number(mSlicerManagers.size()-1);
2738 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2739 mSlicerManagers.back()->SetId(id.toStdString());
2741 linkPanel->addImage(filename, id.toStdString());
2743 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
2744 this,SLOT(CurrentImageChanged(std::string)));
2745 connect(mSlicerManagers.back(),SIGNAL(
2746 UpdatePosition(int, double, double, double, double, double, double, double)),this,
2747 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
2748 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
2749 this, SLOT(VectorChanged(int,double,double,double, double)));
2750 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
2751 this, SLOT(OverlayChanged(int,double,double)));
2752 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
2753 this, SLOT(FusionChanged(int,double)));
2754 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
2755 this,SLOT(WindowsChanged(int, int, int)));
2756 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
2757 this,SLOT(WindowLevelChanged(double, double, int, int)));
2758 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
2759 this,SLOT(UpdateSlice(int,int)));
2760 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
2761 this,SLOT(UpdateTSlice(int, int)));
2762 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
2763 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
2764 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
2765 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
2766 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
2768 qApp->processEvents();
2772 qApp->processEvents();
2774 //------------------------------------------------------------------------------
2777 //------------------------------------------------------------------------------
2778 void vvMainWindow::UpdateCurrentSlicer() {
2780 if (DataTree->selectedItems().size() > 0) {
2781 index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2783 mSlicerManagerCurrentIndex = index;
2785 //------------------------------------------------------------------------------