1 /*=========================================================================
4 Module: $RCSfile: vvMainWindow.cxx,v $
6 Date: $Date: 2010/01/29 13:53:49 $
7 Version: $Revision: 1.5 $
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 "clitkIOCommon.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 "vvCropDialog.h"
58 #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
98 0,Qt::UserRole full filename
99 1,Qt::CheckStateRole checkbutton UL View
100 1,Qt::UserRole overlay, fusion or vector
101 2,Qt::CheckStateRole checkbutton UR View
102 3,Qt::CheckStateRole checkbutton DL View
103 4,Qt::CheckStateRole checkbutton DR View
105 5,Qt::UserRole mSlicerManager id*/
107 //------------------------------------------------------------------------------
108 vvMainWindow::vvMainWindow() {
109 setupUi(this); // this sets up the GUI
112 mCurrentToolInfo = 0;
114 //Init the contextMenu
115 this->setContextMenuPolicy(Qt::CustomContextMenu);
116 contextActions.resize(0);
117 QAction* actionOpen_new_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/fileopen.png")),
118 tr("Open new Image"));
119 connect(actionOpen_new_image,SIGNAL(triggered()),this,SLOT(OpenImages()));
120 contextActions.push_back(actionOpen_new_image);
122 contextMenu.addSeparator();
124 QAction* actionClose_Image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")),
125 tr("Close Current Image"));
126 connect(actionClose_Image,SIGNAL(triggered()),this,SLOT(CloseImage()));
127 contextActions.push_back(actionClose_Image);
129 QAction* actionReload_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")),
130 tr("Reload Current Image"));
131 connect(actionReload_image,SIGNAL(triggered()),this,SLOT(ReloadImage()));
132 contextActions.push_back(actionReload_image);
134 QAction* actionSave_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/filesave.png")),
135 tr("Save Current Image"));
136 connect(actionSave_image,SIGNAL(triggered()),this,SLOT(SaveAs()));
137 contextActions.push_back(actionSave_image);
139 contextMenu.addSeparator();
141 QAction* actionCrop_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/crop.png")),
142 tr("Crop Current Image"));
143 connect(actionCrop_image,SIGNAL(triggered()),this,SLOT(CropImage()));
144 contextActions.push_back(actionCrop_image);
146 QAction* actionSplit_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/cut.png")),
147 tr("Split Current Image"));
148 connect(actionSplit_image,SIGNAL(triggered()),this,SLOT(SplitImage()));
149 contextActions.push_back(actionSplit_image);
151 contextMenu.addSeparator();
153 contextMenu.addAction(actionAdd_VF_to_current_Image);
154 contextActions.push_back(actionAdd_VF_to_current_Image);
156 QAction* actionAdd_Overlay_to_current_Image = menuOverlay->addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/GPSup.png")),
157 tr("Add overlay image to current image"));
158 contextMenu.addAction(actionAdd_Overlay_to_current_Image);
159 contextActions.push_back(actionAdd_Overlay_to_current_Image);
161 connect(actionAdd_Overlay_to_current_Image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));
163 contextMenu.addAction(actionAdd_fusion_image);
164 connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(AddFusionImage()));
165 contextActions.push_back(actionAdd_fusion_image);
169 mSlicerManagers.resize(0);
179 header.append("Name");
181 DataTree->setHeaderLabels(header);
182 DataTree->resizeColumnToContents(COLUMN_TREE);
183 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
184 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
185 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
186 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
187 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
188 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
189 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
192 documentation = new vvDocumentation();
193 help_dialog = new vvHelpDialog();
194 dicomSeriesSelector = new vvDicomSeriesSelector();
196 inverseButton->setEnabled(0);
197 actionAdd_Overlay_to_current_Image->setEnabled(0);
198 actionSave_As->setEnabled(0);
199 actionAdd_VF_to_current_Image->setEnabled(0);
200 actionAdd_fusion_image->setEnabled(0);
203 verticalSliders.push_back(NOVerticalSlider);
204 verticalSliders.push_back(NEVerticalSlider);
205 verticalSliders.push_back(SOVerticalSlider);
206 verticalSliders.push_back(SEVerticalSlider);
208 for (int i =0; i < 4; i++)
209 verticalSliders[i]->hide();
211 horizontalSliders.push_back(NOHorizontalSlider);
212 horizontalSliders.push_back(NEHorizontalSlider);
213 horizontalSliders.push_back(SOHorizontalSlider);
214 horizontalSliders.push_back(SEHorizontalSlider);
216 for (int i =0; i < 4; i++)
217 horizontalSliders[i]->hide();
220 connect(NOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOVerticalSliderChanged()));
221 connect(NEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEVerticalSliderChanged()));
222 connect(SOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOVerticalSliderChanged()));
223 connect(SEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEVerticalSliderChanged()));
225 connect(NOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOHorizontalSliderMoved()));
226 connect(NEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEHorizontalSliderMoved()));
227 connect(SOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOHorizontalSliderMoved()));
228 connect(SEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEHorizontalSliderMoved()));
231 connect(actionMaximum_Intensity_Projection,SIGNAL(triggered()),this,SLOT(ComputeMIP()));
232 connect(actionCompute_mid_position_image,SIGNAL(triggered()),this,SLOT(ComputeMidPosition()));
233 connect(actionDeformable_Registration,SIGNAL(triggered()),this,SLOT(ComputeDeformableRegistration()));
234 connect(actionWarp_image_with_vector_field,SIGNAL(triggered()),this,SLOT(WarpImage()));
235 connect(actionLoad_images,SIGNAL(triggered()),this,SLOT(OpenImages()));
236 connect(actionOpen_Dicom,SIGNAL(triggered()),this,SLOT(OpenDicom()));
237 connect(actionOpen_Dicom_Struct,SIGNAL(triggered()),this,SLOT(OpenDCStructContour()));
238 connect(actionOpen_VTK_contour,SIGNAL(triggered()),this,SLOT(OpenVTKContour()));
239 connect(actionOpen_Multiple_Images_As_One,SIGNAL(triggered()),this,SLOT(MergeImages()));
240 connect(actionOpen_Image_With_Time,SIGNAL(triggered()),this,SLOT(OpenImageWithTime()));
241 connect(actionMerge_images_as_n_dim_t, SIGNAL(triggered()), this, SLOT(MergeImagesWithTime()));
242 connect(actionSave_As,SIGNAL(triggered()),this,SLOT(SaveAs()));
243 connect(actionExit,SIGNAL(triggered()),this,SLOT(close()));
244 connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField()));
245 connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
246 connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation()));
248 ///////////////////////////////////////////////
249 contextMenu.addAction(actionResampler);
250 connect(actionResampler,SIGNAL(triggered()),this,SLOT(ResampleCurrentImage()));
251 connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage()));
252 connect(actionSurface_Viewer,SIGNAL(triggered()),this,SLOT(SurfaceViewerLaunch()));
253 ///////////////////////////////////////////////
255 actionNorth_East_Window->setEnabled(0);
256 actionNorth_West_Window->setEnabled(0);
257 actionSouth_East_Window->setEnabled(0);
258 actionSouth_West_Window->setEnabled(0);
260 connect(actionNorth_East_Window,SIGNAL(triggered()),this,SLOT(SaveNEScreenshot()));
261 connect(actionNorth_West_Window,SIGNAL(triggered()),this,SLOT(SaveNOScreenshot()));
262 connect(actionSouth_East_Window,SIGNAL(triggered()),this,SLOT(SaveSEScreenshot()));
263 connect(actionSouth_West_Window,SIGNAL(triggered()),this,SLOT(SaveSOScreenshot()));
265 connect(DataTree,SIGNAL(itemSelectionChanged()),this,SLOT(ImageInfoChanged()));
266 connect(DataTree,SIGNAL(itemClicked(QTreeWidgetItem*, int)),this,
267 SLOT(DisplayChanged(QTreeWidgetItem*, int)));
269 connect(viewButton,SIGNAL(clicked()),this, SLOT(ChangeViewMode()) );
270 connect(windowSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
271 connect(levelSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
272 connect(colorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateColorMap()));
273 connect(presetComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateWindowLevel()));
274 connect(inverseButton,SIGNAL(clicked()),this,SLOT(SwitchWindowLevel()));
277 connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowContextMenu(QPoint)));
279 connect(linkPanel,SIGNAL(addLink(QString,QString)),this,SLOT(AddLink(QString,QString)));
280 connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString)));
281 connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int)),this,SLOT(SetVFProperty(int,int,int)));
282 connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int)),this,SLOT(SetOverlayProperty(int)));
283 connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,double,double)),
284 this,SLOT(SetFusionProperty(int,int,double,double)));
285 connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
289 playButton->setEnabled(0);
290 frameRateLabel->setEnabled(0);
291 frameRateSpinBox->setEnabled(0);
292 connect(playButton, SIGNAL(clicked()),this,SLOT(PlayPause()));
293 connect(frameRateSpinBox, SIGNAL(valueChanged(int)),this,SLOT(ChangeFrameRate(int)));
295 goToCursorPushButton->setEnabled(0);
296 connect(goToCursorPushButton, SIGNAL(clicked()),this,SLOT(GoToCursor()));
298 NOViewWidget->hide();
299 NEViewWidget->hide();
300 SOViewWidget->hide();
301 SEViewWidget->hide();
303 //Recently opened files
304 std::list<std::string> recent_files = GetRecentlyOpenedImages();
305 if ( not recent_files.empty() )
307 QMenu * rmenu = new QMenu("Recently opened files...");
308 rmenu->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")));
309 menuFile->insertMenu(actionOpen_Image_With_Time,rmenu);
310 for (std::list<std::string>::iterator i = recent_files.begin();i!=recent_files.end();i++)
312 QAction* current=new QAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")),
314 rmenu->addAction(current);
315 connect(current,SIGNAL(triggered()),this,SLOT(OpenRecentImage()));
319 // Adding all new tools (insertion in the menu)
320 vvToolManager::GetInstance()->Initialize(this);
322 //------------------------------------------------------------------------------
325 //------------------------------------------------------------------------------
326 void vvMainWindow::ComputeMIP()
328 vvMaximumIntensityProjection mip;
329 vvSlicerManager* selected_slicer = mSlicerManagers[GetSlicerIndexFromItem(DataTree->selectedItems()[0])];
330 QFileInfo info(selected_slicer->GetFileName().c_str());
331 mip.Compute(selected_slicer);
332 AddImage(mip.GetOutput(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_mip.mhd");
334 //------------------------------------------------------------------------------
337 //------------------------------------------------------------------------------
338 void vvMainWindow::ComputeMidPosition()
341 int index=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
342 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
343 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
347 midp.slicer_manager = mSlicerManagers[index];
348 midp.reference_image_index = ref;
349 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
352 QMessageBox::warning(this, "Error computing midposition image",midp.error_message.c_str());
355 QFileInfo info(midp.slicer_manager->GetFileName().c_str());
356 AddImage(midp.output,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_midposition.mhd");
358 QApplication::restoreOverrideCursor();
362 void vvMainWindow::AddContour(int image_index, vvMesh::Pointer contour, bool propagation)
364 QTreeWidgetItem *item = new QTreeWidgetItem();
365 item->setData(0,Qt::UserRole,"filename.vtk");
366 item->setData(1,Qt::UserRole,tr("contour"));
368 brush.setColor(QColor(contour->r*255,contour->g*255,contour->b*255));
369 brush.setStyle(Qt::SolidPattern);
370 item->setData(COLUMN_IMAGE_NAME,Qt::BackgroundRole,brush);
371 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,contour->structure_name.c_str());
373 for (int j = 1; j <= 4; j++)
374 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(image_index)->data(j,Qt::CheckStateRole));
376 QTreePushButton* cButton = new QTreePushButton;
377 cButton->setItem(item);
378 cButton->setColumn(COLUMN_CLOSE_IMAGE);
379 cButton->setToolTip(tr("close image"));
380 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
381 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
382 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
384 QTreePushButton* rButton = new QTreePushButton;
385 rButton->setItem(item);
386 rButton->setColumn(COLUMN_RELOAD_IMAGE);
387 rButton->setToolTip(tr("reload image"));
388 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
389 rButton->setEnabled(false);
391 //connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
392 //this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
394 DataTree->topLevelItem(image_index)->setExpanded(1);
395 DataTree->topLevelItem(image_index)->addChild(item);
396 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
397 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
398 QString id = DataTree->topLevelItem(image_index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
399 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
402 mSlicerManagers[image_index]->AddContour(contour,propagation);
403 mSlicerManagers[image_index]->Render();
406 //------------------------------------------------------------------------------
407 void vvMainWindow::OpenVTKContour()
409 if (mSlicerManagers.size() > 0)
411 QString Extensions = "Images ( *.vtk)";
412 Extensions += ";;All Files (*)";
413 QString file = QFileDialog::getOpenFileName(this,tr("Open vtkPolyData"),mInputPathName,Extensions);
416 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
417 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
419 reader.SetModeToVTK();
420 reader.SetFilename(file.toStdString());
422 AddContour(index,reader.GetOutput()[0],false);
423 QApplication::restoreOverrideCursor();
426 //------------------------------------------------------------------------------
427 void vvMainWindow::OpenDCStructContour()
429 if (mSlicerManagers.size() > 0)
431 QString Extensions = "Dicom Files ( *.dcm)";
432 Extensions += ";;All Files (*)";
433 QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"),mInputPathName,Extensions);
436 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
438 reader.SetFilename(file.toStdString());
439 vvStructSelector selector;
440 selector.SetStructures(reader.GetROINames());
441 if (!mSlicerManagers[index]->GetVF().IsNull())
442 selector.EnablePropagationCheckBox();
445 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
446 reader.SetSelectedItems(selector.getSelectedItems());
447 reader.SetImage(mSlicerManagers[index]->GetImage());
448 if (selector.PropagationEnabled())
449 reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
451 std::vector<vvMesh::Pointer> contours=reader.GetOutput();
452 for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
453 i!=contours.end();i++)
454 AddContour(index,*i,selector.PropagationEnabled());
455 QApplication::restoreOverrideCursor();
460 //------------------------------------------------------------------------------
461 void vvMainWindow::ComputeDeformableRegistration()
463 if (mSlicerManagers.size() > 0)
465 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
466 vvDeformationDialog dialog(index,mSlicerManagers);
469 std::string base_name=itksys::SystemTools::GetFilenameWithoutExtension(mSlicerManagers[dialog.GetInputFileIndex()]->GetFileName());
470 AddField(dialog.GetOutput(),dialog.getFieldFile(),dialog.GetInputFileIndex());
471 WarpImage(dialog.GetSelectedSlicer(),dialog.GetReferenceFrameIndex());
474 std::cout << "Error or user cancellation while computing deformation field..." << std::endl;
476 else QMessageBox::information(this, "Need to open image","You must open an image first.");
479 //------------------------------------------------------------------------------
480 void vvMainWindow::WarpImage()
482 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
483 if (!mSlicerManagers[index]->GetVF().IsNull())
486 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
487 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
490 WarpImage(mSlicerManagers[index],ref);
494 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field"));
497 //------------------------------------------------------------------------------
498 void vvMainWindow::WarpImage(vvSlicerManager* selected_slicer,int reference_phase)
500 if (!selected_slicer->GetVF().IsNull())
502 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
503 QFileInfo info(selected_slicer->GetFileName().c_str());
504 vvImageWarp warp(selected_slicer->GetImage(),selected_slicer->GetVF(),
505 reference_phase,this);
506 if (warp.ComputeWarpedImage())
508 AddImage(warp.GetWarpedImage(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_warped.mhd");
509 AddImage(warp.GetDiffImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_diff.mhd");
510 AddImage(warp.GetJacobianImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_jacobian.mhd");
511 QApplication::restoreOverrideCursor();
515 QApplication::restoreOverrideCursor();
516 QMessageBox::warning(this,tr("Different spacings"),tr("The vector field and image spacings must be the same in order to warp."));
520 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field."));
523 //------------------------------------------------------------------------------
524 vvMainWindow::~vvMainWindow() {
525 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
527 if (mSlicerManagers[i] != NULL)
528 delete mSlicerManagers[i];
531 //------------------------------------------------------------------------------
533 //------------------------------------------------------------------------------
534 void vvMainWindow::MergeImages() {
535 QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
536 Extensions += ";;All Files (*)";
537 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images"),mInputPathName,Extensions);
540 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
541 std::vector<std::string> vector;
543 unsigned int currentDim = 0;
544 std::vector<double> currentSpacing;
545 std::vector<int> currentSize;
546 std::vector<double> currentOrigin;
548 for (int i = 0; i < files.size(); i++)
550 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
551 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
552 reader->SetFileName(files[i].toStdString().c_str());
553 reader->ReadImageInformation();
554 if (reader) NOViewWidget->hide();
555 NEViewWidget->hide();
556 SOViewWidget->hide();
557 SEViewWidget->hide();
560 currentDim = reader->GetNumberOfDimensions();
562 for (unsigned int j = 0;j < currentDim; j++)
568 currentSpacing.resize(currentDim);
569 currentSize.resize(currentDim);
570 currentOrigin.resize(currentDim);
572 currentOrigin[j] = reader->GetOrigin(j);
573 currentSpacing[j] = reader->GetSpacing(j);
574 currentSize[j] = reader->GetDimensions(j);
576 else if (currentDim != reader->GetNumberOfDimensions()
577 || currentSpacing[j] != reader->GetSpacing(j)
578 || currentSize[j] != (int)reader->GetDimensions(j)
579 || currentOrigin[j] != reader->GetOrigin(j))
581 QString error = "Cannot read file (too different from others ";
582 error += files[i].toStdString().c_str();
583 QMessageBox::information(this,tr("Reading problem"),error);
589 vector.push_back(files[i].toStdString());
592 if (vector.size() > 0)
593 LoadImages(vector, MERGED);
595 //------------------------------------------------------------------------------
597 //------------------------------------------------------------------------------
598 void vvMainWindow::MergeImagesWithTime() {
599 QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
600 Extensions += ";;All Files (*)";
601 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images With Time"),mInputPathName,Extensions);
604 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
605 std::vector<std::string> vector;
607 unsigned int currentDim = 0;
608 std::vector<double> currentSpacing;
609 std::vector<int> currentSize;
610 std::vector<double> currentOrigin;
612 for (int i = 0; i < files.size(); i++)
614 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
615 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
618 reader->SetFileName(files[i].toStdString().c_str());
619 reader->ReadImageInformation();
621 currentDim = reader->GetNumberOfDimensions();
623 for (unsigned int j = 0;j < currentDim; j++)
629 currentSpacing.resize(currentDim);
630 currentSize.resize(currentDim);
631 currentOrigin.resize(currentDim);
633 currentOrigin[j] = reader->GetOrigin(j);
634 currentSpacing[j] = reader->GetSpacing(j);
635 currentSize[j] = reader->GetDimensions(j);
637 else if (currentDim != reader->GetNumberOfDimensions()
638 || currentSpacing[j] != reader->GetSpacing(j)
639 || currentSize[j] != (int)reader->GetDimensions(j)
640 || currentOrigin[j] != reader->GetOrigin(j))
642 QString error = "Cannot read file (too different from others ";
643 error += files[i].toStdString().c_str();
644 QMessageBox::information(this,tr("Reading problem"),error);
650 vector.push_back(files[i].toStdString());
654 QString error = "Cannot read file info for ";
655 error += files[i].toStdString().c_str();
657 error += "Maybe you're trying to open an image in an unsupported format?\n";
658 QMessageBox::information(this,tr("Reading problem"),error);
661 sort(vector.begin(),vector.end());
662 if (vector.size() > 1)
663 LoadImages(vector, MERGEDWITHTIME);
665 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.");
667 //------------------------------------------------------------------------------
669 //------------------------------------------------------------------------------
670 void vvMainWindow::OpenDicom() {
671 std::vector<std::string> files;
673 #ifdef CLITK_VV_USE_BDCM
674 bool r = bdcm::OpenDicomFilesSelectorDialog(files,
675 "DicomFilesSelectorDialog test",
679 std::cout << "$$$$ main : user clicked 'OK' $$$$"<<std::endl;
680 std::cout << "$$$$ selected files : "<<std::endl;
681 std::vector<std::string>::iterator i;
682 for (i=files.begin();i!=files.end();++i) {
683 std::cout << *i << std::endl;
685 std::cout << "$$$$ "<<std::endl;
687 LoadImages(files,DICOM);
690 std::cout << "$$$$ main : user clicked 'CANCEL' $$$$"<<std::endl;
693 std::cout << "dicomSeriesSelector " << std::endl;
694 if (dicomSeriesSelector->exec() == QDialog::Accepted) {
695 files = *(dicomSeriesSelector->GetFilenames());
696 LoadImages(files,DICOM);
701 //------------------------------------------------------------------------------
703 //------------------------------------------------------------------------------
704 void vvMainWindow::OpenImages() {
705 QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
706 Extensions += ";;All Files (*)";
708 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images"),mInputPathName,Extensions);
711 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
712 std::vector<std::string> vector;
713 for (int i = 0; i < files.size(); i++)
714 vector.push_back(files[i].toStdString());
715 LoadImages(vector, IMAGE);
717 //------------------------------------------------------------------------------
718 void vvMainWindow::OpenRecentImage()
720 QAction * caller = qobject_cast<QAction*>(sender());
721 std::vector<std::string> images;
722 images.push_back(caller->text().toStdString());
723 mInputPathName = itksys::SystemTools::GetFilenamePath(images[0]).c_str();
724 LoadImages(images,IMAGE);
727 //------------------------------------------------------------------------------
728 void vvMainWindow::OpenImageWithTime() {
729 QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
730 Extensions += ";;All Files (*)";
732 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images With Time"),mInputPathName,Extensions);
735 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
736 std::vector<std::string> vector;
737 for (int i = 0; i < files.size(); i++)
739 vector.push_back(files[i].toStdString());
741 LoadImages(vector, IMAGEWITHTIME);
743 //------------------------------------------------------------------------------
745 //------------------------------------------------------------------------------
746 void vvMainWindow::LoadImages(std::vector<std::string> files, LoadedImageType filetype) {
747 //Separate the way to open images and dicoms
749 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
750 fileSize = files.size();
754 //Only add to the list of recently opened files when a single file is opened,
755 //to avoid polluting the list of recently opened files
756 if (files.size() == 1)
758 QFileInfo finfo=tr(files[0].c_str());
759 AddToRecentlyOpenedImages(finfo.absoluteFilePath().toStdString());
761 //init the progress events
762 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
763 vvProgressDialog progress("Opening " + files[0],fileSize>1);
764 qApp->processEvents();
766 int numberofsuccesulreads=0;
767 //open images as 1 or multiples
768 for (int i = 0; i < fileSize; i++) {
770 progress.Update("Opening " + files[i]);
771 progress.SetProgress(i,fileSize);
772 qApp->processEvents();
774 //read the image and put it in mSlicerManagers
775 vvSlicerManager* imageManager = new vvSlicerManager(4);
776 qApp->processEvents();
778 bool SetImageSucceed=false;
780 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
781 SetImageSucceed = imageManager->SetImage(files[i],filetype);
784 SetImageSucceed = imageManager->SetImages(files,filetype);
786 if (SetImageSucceed == false)
788 QApplication::restoreOverrideCursor();
789 QString error = "Cannot open file \n";
790 error += imageManager->GetLastError().c_str();
791 QMessageBox::information(this,tr("Reading problem"),error);
796 mSlicerManagers.push_back(imageManager);
798 //create an item in the tree with good settings
799 QTreeWidgetItem *item = new QTreeWidgetItem();
800 item->setData(0,Qt::UserRole,files[i].c_str());
801 QFileInfo fileinfo(imageManager->GetFileName().c_str()); //Do not show the path
802 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
803 qApp->processEvents();
805 //Create the buttons for reload and close
806 qApp->processEvents();
807 QTreePushButton* cButton = new QTreePushButton;
808 cButton->setItem(item);
809 cButton->setColumn(COLUMN_CLOSE_IMAGE);
810 cButton->setToolTip(tr("close image"));
811 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
812 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
813 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
815 QTreePushButton* rButton = new QTreePushButton;
816 rButton->setItem(item);
817 rButton->setColumn(COLUMN_RELOAD_IMAGE);
818 rButton->setToolTip(tr("reload image"));
819 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
820 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
821 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
823 DataTree->addTopLevelItem(item);
824 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
825 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
827 //set the id of the image
828 QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1);
829 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
830 mSlicerManagers.back()->SetId(id.toStdString());
832 linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
834 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
835 this,SLOT(CurrentImageChanged(std::string)));
836 connect(mSlicerManagers.back(),SIGNAL(
837 UpdatePosition(int, double, double, double, double, double, double, double)),this,
838 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
839 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
840 this, SLOT(VectorChanged(int,double,double,double, double)));
841 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
842 this, SLOT(OverlayChanged(int,double,double)));
843 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
844 this, SLOT(FusionChanged(int,double)));
845 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
846 this,SLOT(WindowsChanged(int, int, int)));
847 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
848 this,SLOT(WindowLevelChanged(double, double, int, int)));
849 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
850 this,SLOT(UpdateSlice(int,int)));
851 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
852 this,SLOT(UpdateTSlice(int, int)));
853 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
854 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
855 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
856 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
857 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
859 numberofsuccesulreads++;
862 if (numberofsuccesulreads)
864 NOViewWidget->show();
865 NEViewWidget->show();
866 SOViewWidget->show();
867 SEViewWidget->show();
872 QApplication::restoreOverrideCursor();
875 // vvToolManager::GetInstance()->UpdateEnabledTool();
876 // emit SlicerManagersHasChanged();
878 //------------------------------------------------------------------------------
880 //------------------------------------------------------------------------------
881 void vvMainWindow::UpdateTree() {
882 DataTree->resizeColumnToContents(COLUMN_TREE);
883 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
884 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
885 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
886 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
887 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
888 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
889 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
891 //------------------------------------------------------------------------------
893 //------------------------------------------------------------------------------
894 void vvMainWindow::CurrentImageChanged(std::string id) {
896 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
898 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id)
904 DataTree->topLevelItem(i)->setSelected(0);
906 for (int child = 0; child < DataTree->topLevelItem(i)->childCount();child++)
907 DataTree->topLevelItem(i)->child(child)->setSelected(0);
910 DataTree->topLevelItem(selected)->setSelected(1);
912 //------------------------------------------------------------------------------
914 //------------------------------------------------------------------------------
915 void vvMainWindow::ImageInfoChanged() {
916 contextActions[7]->setEnabled(1);
917 contextActions[6]->setEnabled(1);
918 actionSave_As->setEnabled(1);
919 actionAdd_VF_to_current_Image->setEnabled(1);
920 actionAdd_fusion_image->setEnabled(1);
921 actionNorth_East_Window->setEnabled(1);
922 actionNorth_West_Window->setEnabled(1);
923 actionSouth_East_Window->setEnabled(1);
924 actionSouth_West_Window->setEnabled(1);
925 inverseButton->setEnabled(1);
927 goToCursorPushButton->setEnabled(1);
929 if (DataTree->selectedItems().size()) {
930 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
932 colorMapComboBox->setEnabled(1);
933 for (int i = 0; i < DataTree->topLevelItem(index)->childCount();i++)
935 if (DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "overlay" ||
936 DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion")
938 colorMapComboBox->setEnabled(0);
943 std::vector<double> origin;
944 std::vector<double> inputSpacing;
945 std::vector<int> inputSize;
946 std::vector<double> sizeMM;
949 QString inputSizeInBytes;
950 QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
952 if (mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size() > 1 || playMode == 1)
954 playButton->setEnabled(1);
955 frameRateLabel->setEnabled(1);
956 frameRateSpinBox->setEnabled(1);
960 playButton->setEnabled(0);
961 frameRateLabel->setEnabled(0);
962 frameRateSpinBox->setEnabled(0);
968 if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0])
970 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
971 dimension = imageSelected->GetNumberOfDimensions();
972 origin.resize(dimension);
973 inputSpacing.resize(dimension);
974 inputSize.resize(dimension);
975 sizeMM.resize(dimension);
976 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
977 for (int i = 0;i < dimension;i++)
979 origin[i] = imageSelected->GetOrigin()[i];
980 inputSpacing[i] = imageSelected->GetSpacing()[i];
981 inputSize[i] = imageSelected->GetSize()[i];
982 sizeMM[i] = inputSize[i]*inputSpacing[i];
983 NPixel *= inputSize[i];
985 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
987 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
989 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF();
990 dimension = imageSelected->GetNumberOfDimensions();
991 origin.resize(dimension);
992 inputSpacing.resize(dimension);
993 inputSize.resize(dimension);
994 sizeMM.resize(dimension);
995 pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsString().c_str();
996 for (int i = 0;i < dimension;i++)
998 origin[i] = imageSelected->GetOrigin()[i];
999 inputSpacing[i] = imageSelected->GetSpacing()[i];
1000 inputSize[i] = imageSelected->GetSize()[i];
1001 sizeMM[i] = inputSize[i]*inputSpacing[i];
1002 NPixel *= inputSize[i];
1004 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1006 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay")
1008 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay();
1009 dimension = imageSelected->GetNumberOfDimensions();
1010 origin.resize(dimension);
1011 inputSpacing.resize(dimension);
1012 inputSize.resize(dimension);
1013 sizeMM.resize(dimension);
1014 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1015 for (int i = 0;i < dimension;i++)
1017 origin[i] = imageSelected->GetOrigin()[i];
1018 inputSpacing[i] = imageSelected->GetSpacing()[i];
1019 inputSize[i] = imageSelected->GetSize()[i];
1020 sizeMM[i] = inputSize[i]*inputSpacing[i];
1021 NPixel *= inputSize[i];
1023 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1025 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion")
1027 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
1028 dimension = imageSelected->GetNumberOfDimensions();
1029 origin.resize(dimension);
1030 inputSpacing.resize(dimension);
1031 inputSize.resize(dimension);
1032 sizeMM.resize(dimension);
1033 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1034 for (int i = 0;i < dimension;i++)
1036 origin[i] = imageSelected->GetOrigin()[i];
1037 inputSpacing[i] = imageSelected->GetSpacing()[i];
1038 inputSize[i] = imageSelected->GetSize()[i];
1039 sizeMM[i] = inputSize[i]*inputSpacing[i];
1040 NPixel *= inputSize[i];
1042 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1045 QString dim = QString::number(dimension) + " (";
1046 dim += pixelType + ")";
1048 infoPanel->setFileName(image);
1049 infoPanel->setDimension(dim);
1050 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1051 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1052 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1053 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1054 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1056 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1057 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1058 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1059 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1061 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1062 for (int i = 0; i < 4;i++)
1064 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1066 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1070 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1071 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1072 DD(mSlicerManagers[index]->GetColorMap());
1073 DD(mSlicerManagers[index]->GetPreset());
1074 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1075 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1077 infoPanel->setFileName(image);
1078 infoPanel->setDimension(dim);
1079 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1080 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1081 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1082 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1083 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1085 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1086 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1087 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1088 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1090 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1091 for (int i = 0; i < 4;i++)
1093 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1095 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1099 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1100 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1101 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1102 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1104 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
1106 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1107 overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
1108 mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
1109 mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
1113 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1114 overlayPanel->getVFProperty(-1,-1,-1);
1116 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
1118 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1119 overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor());
1123 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1124 overlayPanel->getOverlayProperty(-1);
1126 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
1128 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1129 overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
1130 mSlicerManagers[index]->GetFusionColorMap(),
1131 mSlicerManagers[index]->GetFusionWindow(),
1132 mSlicerManagers[index]->GetFusionLevel());
1136 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1137 overlayPanel->getFusionProperty(-1, -1,-1,-1);
1141 //------------------------------------------------------------------------------
1143 //------------------------------------------------------------------------------
1144 void vvMainWindow::ShowDocumentation() {
1145 documentation->show();
1147 //------------------------------------------------------------------------------
1148 void vvMainWindow::ShowHelpDialog() {
1149 help_dialog->show();
1151 //------------------------------------------------------------------------------
1153 //------------------------------------------------------------------------------
1154 void vvMainWindow::ChangeViewMode() {
1155 QListIterator<int> it0(splitter_3->sizes());
1156 QListIterator<int> it1(splitter_3->sizes());
1159 while (it0.hasNext())
1163 while (it1.hasNext())
1172 size0.push_back(max0);
1174 size1.push_back(max1);
1176 splitter_3->setSizes(size0);
1177 OSplitter->setSizes(size1);
1178 DataTree->setColumnHidden(2,1);
1179 DataTree->setColumnHidden(3,1);
1180 DataTree->setColumnHidden(4,1);
1185 size0.push_back(int(max0/2));
1186 size0.push_back(int(max0/2));
1187 size1.push_back(int(max1/2));
1188 size1.push_back(int(max1/2));
1189 splitter_3->setSizes(size0);
1190 OSplitter->setSizes(size1);
1191 DataTree->setColumnHidden(2,0);
1192 DataTree->setColumnHidden(3,0);
1193 DataTree->setColumnHidden(4,0);
1196 //------------------------------------------------------------------------------
1198 //------------------------------------------------------------------------------
1199 QString vvMainWindow::GetSizeInBytes(unsigned long size) {
1200 QString result = "";// QString::number(size);
1201 //result += " bytes (";
1202 if (size > 1000000000)
1205 result += QString::number(size);
1206 result += "Gb";//)";
1208 else if (size > 1000000)
1211 result += QString::number(size);
1212 result += "Mb";//)";
1214 else if (size > 1000)
1217 result += QString::number(size);
1218 result += "kb";//)";
1222 //------------------------------------------------------------------------------
1224 //------------------------------------------------------------------------------
1225 QString vvMainWindow::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
1227 for (unsigned int i= 0; i < vectorDouble.size(); i++)
1231 result += QString::number(vectorDouble[i]);
1235 //------------------------------------------------------------------------------
1237 //------------------------------------------------------------------------------
1238 QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt) {
1240 for (unsigned int i= 0; i < vectorInt.size(); i++)
1244 result += QString::number(vectorInt[i]);
1248 //------------------------------------------------------------------------------
1250 //------------------------------------------------------------------------------
1251 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item) {
1252 QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1253 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1255 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString() == id)
1260 //------------------------------------------------------------------------------
1262 //------------------------------------------------------------------------------
1263 void vvMainWindow::DisplayChanged(QTreeWidgetItem *clicked_item, int column) {
1264 int index = GetSlicerIndexFromItem(clicked_item);
1265 if ( column >= COLUMN_CLOSE_IMAGE or column <= 0)
1267 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1269 QTreeWidgetItem* current_row=DataTree->topLevelItem(i);
1270 if (DataTree->topLevelItem(index) == current_row)
1272 vvSlicer* clicked_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1273 if (current_row == clicked_item)
1275 //If we just activated a slicer
1276 if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1278 mSlicerManagers[i]->UpdateSlicer(column-1,clicked_item->data(column,Qt::CheckStateRole).toInt());
1279 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1280 DisplaySliders(i,column-1);
1281 std::map<std::string,int> overlay_counts;
1282 for (int child = 0; child < current_row->childCount(); child++)
1284 std::string overlay_type =
1285 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1286 overlay_counts[overlay_type]++;
1287 current_row->child(child)->setData(column,Qt::CheckStateRole,
1288 current_row->data(column,Qt::CheckStateRole));
1289 clicked_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,true);
1292 else //We don't allow simply desactivating a slicer
1294 clicked_item->setData(column,Qt::CheckStateRole,2);
1298 //if we clicked on the vector(or overlay) and not the image
1301 if (clicked_item->data(column,Qt::CheckStateRole).toInt())
1303 current_row->setData(column,Qt::CheckStateRole,2);
1304 mSlicerManagers[i]->UpdateSlicer(column-1,2);
1305 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1306 DisplaySliders(i,column-1);
1308 int vis = clicked_item->data(column,Qt::CheckStateRole).toInt();
1309 std::string overlay_type = clicked_item->data(1,Qt::UserRole).toString().toStdString();
1310 int overlay_index=0;
1311 for (int child = 0; child < current_row->childCount(); child++)
1313 if (current_row->child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1315 if (current_row->child(child) == clicked_item) break;
1317 clicked_slicer->SetActorVisibility(
1318 clicked_item->data(1,Qt::UserRole).toString().toStdString(), overlay_index-1,vis);
1321 else if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1323 current_row->setData(column,Qt::CheckStateRole,0);
1324 mSlicerManagers[i]->UpdateSlicer(column-1,0);
1325 std::map<std::string,int> overlay_counts;
1326 for (int child = 0; child < current_row->childCount(); child++)
1328 std::string overlay_type =
1329 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1330 overlay_counts[overlay_type]++;
1331 current_row->child(child)->setData(column,Qt::CheckStateRole,0);
1332 vvSlicer * current_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1333 current_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,false);
1336 //mSlicerManagers[i]->SetColorMap(-1);
1337 mSlicerManagers[i]->SetColorMap();
1339 mSlicerManagers[index]->GetSlicer(column-1)->Render();
1341 //------------------------------------------------------------------------------
1343 void vvMainWindow::InitSlicers()
1345 if (mSlicerManagers.size())
1347 mSlicerManagers.back()->GenerateDefaultLookupTable();
1349 mSlicerManagers.back()->SetSlicerWindow(0,NOViewWidget->GetRenderWindow());
1350 mSlicerManagers.back()->SetSlicerWindow(1,NEViewWidget->GetRenderWindow());
1351 mSlicerManagers.back()->SetSlicerWindow(2,SOViewWidget->GetRenderWindow());
1352 mSlicerManagers.back()->SetSlicerWindow(3,SEViewWidget->GetRenderWindow());
1356 //------------------------------------------------------------------------------
1357 void vvMainWindow::InitDisplay() {
1358 if (mSlicerManagers.size())
1360 //BE CAREFUL : this is absolutely necessary to set the interactor style
1361 //in order to have the same style instanciation for all SlicerManagers in
1363 for (int j = 0; j < 4; j++)
1365 vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
1366 style->SetAutoAdjustCameraClippingRange(1);
1367 bool AlreadySelected = false;
1368 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1370 mSlicerManagers[i]->SetInteractorStyleNavigator(j,style);
1372 //select the image only if previous are not selected
1373 if (DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 1)
1375 mSlicerManagers[i]->UpdateSlicer(j,1);
1376 AlreadySelected = true;
1378 else if (i == DataTree->topLevelItemCount()-1 && !AlreadySelected)
1380 if (DataTree->selectedItems().size() == 0)
1381 DataTree->topLevelItem(i)->setSelected(1);
1382 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,2);
1383 mSlicerManagers[i]->UpdateSlicer(j,1);
1384 DisplaySliders(i,j);
1388 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,0);
1389 mSlicerManagers[i]->UpdateSlicer(j,0);
1396 //------------------------------------------------------------------------------
1398 //------------------------------------------------------------------------------
1399 void vvMainWindow::DisplaySliders(int slicer, int window) {
1401 mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
1402 int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
1406 tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
1407 int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
1408 bool showHorizontal = false;
1409 bool showVertical = false;
1410 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1411 || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
1412 && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME
1413 && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME))
1414 showVertical = true;
1415 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1416 || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME
1417 || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME)
1418 showHorizontal = true;
1421 verticalSliders[window]->show();
1423 verticalSliders[window]->hide();
1424 verticalSliders[window]->setRange(range[0],range[1]);
1425 verticalSliders[window]->setValue(position);
1428 horizontalSliders[window]->show();
1430 horizontalSliders[window]->hide();
1431 horizontalSliders[window]->setRange(tRange[0],tRange[1]);
1432 horizontalSliders[window]->setValue(tPosition);
1434 //------------------------------------------------------------------------------
1436 //------------------------------------------------------------------------------
1437 void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) {
1438 int index = GetSlicerIndexFromItem(item);
1440 if (DataTree->topLevelItem(index) != item)
1442 QString warning = "Do you really want to close the overlay : ";
1443 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1444 QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
1446 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1447 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1448 if (msgBox.exec() == QMessageBox::AcceptRole)
1450 std::string overlay_type=item->data(1,Qt::UserRole).toString().toStdString();
1451 int overlay_index=0;
1452 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1454 if (DataTree->topLevelItem(index)->\
1455 child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1457 if (DataTree->topLevelItem(index)->child(child) == item) break;
1459 mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
1460 mSlicerManagers[index]->SetColorMap(0);
1461 DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
1462 mSlicerManagers[index]->Render();
1465 else if (DataTree->topLevelItemCount() <= 1)
1467 QString warning = "Do you really want to close the image : ";
1468 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1469 warning += "\nThis is the last image, you're about to close vv !!!";
1470 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1472 msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
1473 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1474 if (msgBox.exec() == QMessageBox::AcceptRole)
1481 QString warning = "Do you really want to close the image : ";
1482 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1483 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1485 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1486 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1487 if (msgBox.exec() == QMessageBox::AcceptRole)
1489 std::vector<vvSlicerManager*>::iterator Manageriter = mSlicerManagers.begin();
1490 DataTree->takeTopLevelItem(index);
1491 for (int i = 0; i < index; i++)
1495 linkPanel->removeImage(index);
1496 mSlicerManagers[index]->RemoveActors();
1497 delete mSlicerManagers[index];
1498 mSlicerManagers.erase(Manageriter);
1503 // vvToolManager::GetInstance()->UpdateEnabledTool();
1504 // emit SlicerManagersHasChanged();
1506 //------------------------------------------------------------------------------
1508 //------------------------------------------------------------------------------
1509 void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) {
1510 // int index = GetSlicerIndexFromItem(item);
1511 // QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1512 // if (item->data(1,Qt::UserRole).toString() == "vector")
1513 // mSlicerManagers[index]->ReloadVF();
1515 // mSlicerManagers[index]->Reload();
1517 // QApplication::restoreOverrideCursor();
1518 int index = GetSlicerIndexFromItem(item);
1519 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1520 QString role=item->data(1,Qt::UserRole).toString();
1521 if ( role == "vector")
1522 mSlicerManagers[index]->ReloadVF();
1523 else if (role == "overlay")
1524 mSlicerManagers[index]->ReloadOverlay();
1525 else if (role == "fusion")
1526 mSlicerManagers[index]->ReloadFusion();
1528 mSlicerManagers[index]->Reload();
1529 QApplication::restoreOverrideCursor();
1531 //------------------------------------------------------------------------------
1533 void vvMainWindow::CropImage()
1535 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1536 vvCropDialog crop(mSlicerManagers,index);
1538 AddImage(crop.GetOutput(),"cropped.mhd");
1541 //------------------------------------------------------------------------------
1542 void vvMainWindow::SplitImage() {
1543 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1544 int dim = mSlicerManagers[index]->GetDimension();
1545 QString warning = "Do you really want to split the ";
1546 warning += QString::number(dim) + "D image ";
1547 warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into ";
1548 warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " ";
1549 warning += QString::number(dim-1) + "D images.";
1550 QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"),
1552 msgBox.addButton(tr("Split"), QMessageBox::AcceptRole);
1553 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1554 if (msgBox.exec() == QMessageBox::AcceptRole)
1556 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1559 std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString();
1560 int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1];
1561 std::string path = itksys::SystemTools::GetFilenamePath(
1564 path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString();
1566 path += itksys::SystemTools::GetFilenameLastExtension(
1569 typedef itk::NumericSeriesFileNames NameGeneratorType;
1570 NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
1571 nameGenerator->SetSeriesFormat(path.c_str());
1572 nameGenerator->SetStartIndex(0);
1573 nameGenerator->SetEndIndex(numberOfSlice-1);
1574 nameGenerator->SetIncrementIndex(1);
1576 for (int i = 0; i < numberOfSlice; i++)
1578 vvSlicerManager* imageManager = new vvSlicerManager(4);
1579 imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i],
1580 mSlicerManagers[index]->GetSlicer(0)->GetImage(), i);
1581 mSlicerManagers.push_back(imageManager);
1583 //create an item in the tree with good settings
1584 QTreeWidgetItem *item = new QTreeWidgetItem();
1585 item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str());
1586 std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension(
1587 nameGenerator->GetFileNames()[i]).c_str();
1588 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str());
1589 for (int j = 1; j <= 4; j++)
1591 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1593 DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0);
1595 item->setData(j,Qt::CheckStateRole,2);
1598 //Create the buttons for reload and close
1599 QTreePushButton* cButton = new QTreePushButton;
1600 cButton->setItem(item);
1601 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1602 cButton->setToolTip(tr("close image"));
1603 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1604 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1605 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1607 QTreePushButton* rButton = new QTreePushButton;
1608 rButton->setItem(item);
1609 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1610 rButton->setToolTip(tr("reload image"));
1611 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1612 rButton->setEnabled(false);
1613 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1614 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1616 DataTree->addTopLevelItem(item);
1617 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1618 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1620 //set the id of the image
1621 QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1);
1622 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1623 mSlicerManagers.back()->SetId(id.toStdString());
1624 linkPanel->addImage(fileI, id.toStdString());
1625 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
1626 this,SLOT(CurrentImageChanged(std::string)));
1627 connect(mSlicerManagers.back(),SIGNAL(
1628 UpdatePosition(int, double, double, double, double, double, double, double)),this,
1629 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
1630 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
1631 this, SLOT(VectorChanged(int,double,double,double, double)));
1632 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
1633 this, SLOT(OverlayChanged(int,double,double)));
1634 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
1635 this, SLOT(FusionChanged(int,double)));
1636 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
1637 this,SLOT(WindowsChanged(int, int, int)));
1638 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
1639 this,SLOT(WindowLevelChanged(double, double, int, int)));
1640 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
1641 this,SLOT(UpdateSlice(int,int)));
1642 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
1643 this,SLOT(UpdateTSlice(int, int)));
1644 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
1645 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
1646 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
1647 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
1648 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
1650 qApp->processEvents();
1653 qApp->processEvents();
1655 QApplication::restoreOverrideCursor();
1659 QApplication::restoreOverrideCursor();
1660 QString error = "Cannot split file (dimensions must be greater than 2) ";
1661 QMessageBox::information(this,tr("Splitting problem"),error);
1665 //------------------------------------------------------------------------------
1667 //------------------------------------------------------------------------------
1668 void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) {
1669 infoPanel->setCurrentInfo(visibility,x,y,z,X,Y,Z,value);
1671 //------------------------------------------------------------------------------
1673 //------------------------------------------------------------------------------
1674 void vvMainWindow::VectorChanged(int visibility,double x, double y, double z, double value) {
1675 overlayPanel->getCurrentVectorInfo(visibility,x,y,z,value);
1677 //------------------------------------------------------------------------------
1679 //------------------------------------------------------------------------------
1680 void vvMainWindow::OverlayChanged(int visibility, double valueOver, double valueRef) {
1681 overlayPanel->getCurrentOverlayInfo(visibility,valueOver, valueRef);
1683 //------------------------------------------------------------------------------
1685 //------------------------------------------------------------------------------
1686 void vvMainWindow::FusionChanged(int visibility, double value) {
1687 overlayPanel->getCurrentFusionInfo(visibility,value);
1689 //------------------------------------------------------------------------------
1691 //------------------------------------------------------------------------------
1692 void vvMainWindow::WindowsChanged(int window, int view, int slice) {
1693 infoPanel->setViews(window, view, slice);
1695 //------------------------------------------------------------------------------
1697 //------------------------------------------------------------------------------
1698 void vvMainWindow::WindowLevelChanged(double window, double level,int preset,int colormap) {
1699 windowSpinBox->setValue(window);
1700 levelSpinBox->setValue(level);
1701 colorMapComboBox->setCurrentIndex(colormap);
1702 presetComboBox->setCurrentIndex(preset);
1704 //------------------------------------------------------------------------------
1706 //------------------------------------------------------------------------------
1707 void vvMainWindow::WindowLevelEdited() {
1708 presetComboBox->setCurrentIndex(6);
1709 UpdateWindowLevel();
1711 //------------------------------------------------------------------------------
1713 //------------------------------------------------------------------------------
1714 void vvMainWindow::UpdateWindowLevel() {
1715 if (DataTree->selectedItems().size())
1717 if (presetComboBox->currentIndex() == 7) //For ventilation
1718 colorMapComboBox->setCurrentIndex(5);
1719 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1720 mSlicerManagers[index]->SetColorWindow(windowSpinBox->value());
1721 mSlicerManagers[index]->SetColorLevel(levelSpinBox->value());
1722 mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex());
1723 mSlicerManagers[index]->Render();
1726 //------------------------------------------------------------------------------
1728 //------------------------------------------------------------------------------
1729 void vvMainWindow::UpdateColorMap() {
1730 if (DataTree->selectedItems().size())
1732 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1733 mSlicerManagers[index]->SetColorMap(colorMapComboBox->currentIndex());
1734 mSlicerManagers[index]->Render();
1737 //------------------------------------------------------------------------------
1738 void vvMainWindow::SwitchWindowLevel() {
1739 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1740 int window = mSlicerManagers[index]->GetColorWindow();
1741 presetComboBox->setCurrentIndex(6);
1742 windowSpinBox->setValue(-window);
1743 UpdateWindowLevel();
1745 //------------------------------------------------------------------------------
1747 //------------------------------------------------------------------------------
1748 void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) {
1749 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1751 if (mSlicerManagers[i]->GetId() == id)
1753 //mSlicerManagers[i]->SetTSlice(temps);
1754 mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
1755 mSlicerManagers[i]->UpdateViews(0,slicer);
1760 //------------------------------------------------------------------------------
1762 //------------------------------------------------------------------------------
1763 void vvMainWindow::ShowContextMenu(QPoint point) {
1764 if (!DataTree->selectedItems().size())
1766 contextActions[1]->setEnabled(0);
1767 contextActions[2]->setEnabled(0);
1768 contextActions[3]->setEnabled(0);
1769 contextActions[4]->setEnabled(0);
1770 contextActions[5]->setEnabled(0);
1771 contextActions[6]->setEnabled(0);
1772 contextActions[7]->setEnabled(0);
1776 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1777 contextActions[1]->setEnabled(1);
1778 contextActions[2]->setEnabled(
1779 DataTree->itemWidget(DataTree->selectedItems()[0],
1780 COLUMN_RELOAD_IMAGE)->isEnabled());
1781 contextActions[3]->setEnabled(1);
1782 contextActions[5]->setEnabled(1);
1783 contextActions[6]->setEnabled(1);
1784 contextActions[7]->setEnabled(1);
1786 if (mSlicerManagers[index]->GetDimension() < 3)
1787 contextActions[4]->setEnabled(0);
1789 contextActions[4]->setEnabled(1);
1791 contextMenu.exec(QCursor::pos());
1793 //------------------------------------------------------------------------------
1795 //------------------------------------------------------------------------------
1796 void vvMainWindow::CloseImage() {
1797 CloseImage(DataTree->selectedItems()[0],0);
1799 //------------------------------------------------------------------------------
1801 //------------------------------------------------------------------------------
1802 void vvMainWindow::ReloadImage() {
1803 ReloadImage(DataTree->selectedItems()[0],0);
1805 //------------------------------------------------------------------------------
1807 //------------------------------------------------------------------------------
1808 void vvMainWindow::SelectOverlayImage() {
1809 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1811 //check if one overlay image is added
1812 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1813 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "overlay")
1815 QString error = "Cannot add more than one compared image\n";
1816 error += "Please remove first ";
1817 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1818 QMessageBox::information(this,tr("Problem adding compared image !"),error);
1822 QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
1823 Extensions += ";;All Files (*)";
1824 QString file = QFileDialog::getOpenFileName(this,tr("Load Overlay image"),mInputPathName,Extensions);
1825 if (!file.isEmpty())
1826 AddOverlayImage(index,file);
1828 //------------------------------------------------------------------------------
1830 //------------------------------------------------------------------------------
1831 void vvMainWindow::AddOverlayImage(int index, QString file) {
1832 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1833 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1834 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1835 reader->SetFileName(file.toStdString().c_str());
1836 reader->ReadImageInformation();
1837 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1838 int dimension = reader->GetNumberOfDimensions();
1839 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1840 vvProgressDialog progress("Opening " + file.toStdString());
1841 qApp->processEvents();
1843 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1844 if (mSlicerManagers[index]->SetOverlay(file.toStdString(),dimension, component))
1846 //create an item in the tree with good settings
1847 QTreeWidgetItem *item = new QTreeWidgetItem();
1848 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1849 item->setData(1,Qt::UserRole,tr("overlay"));
1850 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1851 qApp->processEvents();
1853 for (int j = 1; j <= 4; j++)
1855 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1856 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("overlay",0,
1857 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1860 //Create the buttons for reload and close
1861 qApp->processEvents();
1862 QTreePushButton* cButton = new QTreePushButton;
1863 cButton->setItem(item);
1864 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1865 cButton->setToolTip(tr("close image"));
1866 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1867 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1868 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1870 QTreePushButton* rButton = new QTreePushButton;
1871 rButton->setItem(item);
1872 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1873 rButton->setToolTip(tr("reload image"));
1874 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1875 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1876 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1878 DataTree->topLevelItem(index)->setExpanded(1);
1879 DataTree->topLevelItem(index)->addChild(item);
1880 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1881 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1883 //set the id of the image
1884 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1885 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1887 qApp->processEvents();
1889 QApplication::restoreOverrideCursor();
1893 QApplication::restoreOverrideCursor();
1894 QString error = "Cannot import the new image.\n";
1895 error += mSlicerManagers[index]->GetLastError().c_str();
1896 QMessageBox::information(this,tr("Problem reading image !"),error);
1900 void vvMainWindow::AddFusionImage()
1902 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1904 //check if one fusion image is added
1905 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1906 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion")
1908 QString error = "Cannot add more than one fusion image\n";
1909 error += "Please remove first ";
1910 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1911 QMessageBox::information(this,tr("Problem adding fusion image !"),error);
1915 QString Extensions = "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox)";
1916 Extensions += ";;All Files (*)";
1917 QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
1918 if (!file.isEmpty())
1920 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1921 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1922 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1923 reader->SetFileName(file.toStdString().c_str());
1924 reader->ReadImageInformation();
1925 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1928 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1929 vvProgressDialog progress("Opening fusion");
1930 qApp->processEvents();
1932 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1933 if (mSlicerManagers[index]->SetFusion(file.toStdString(),
1934 reader->GetNumberOfDimensions(), component))
1936 //create an item in the tree with good settings
1937 QTreeWidgetItem *item = new QTreeWidgetItem();
1938 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1939 item->setData(1,Qt::UserRole,tr("fusion"));
1940 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1941 qApp->processEvents();
1943 for (int j = 1; j <= 4; j++)
1945 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1946 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0,
1947 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1950 //Create the buttons for reload and close
1951 qApp->processEvents();
1952 QTreePushButton* cButton = new QTreePushButton;
1953 cButton->setItem(item);
1954 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1955 cButton->setToolTip(tr("close image"));
1956 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1957 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1958 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1960 QTreePushButton* rButton = new QTreePushButton;
1961 rButton->setItem(item);
1962 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1963 rButton->setToolTip(tr("reload image"));
1964 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1965 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1966 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1968 DataTree->topLevelItem(index)->setExpanded(1);
1969 DataTree->topLevelItem(index)->addChild(item);
1970 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1971 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1973 //set the id of the image
1974 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1975 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1977 qApp->processEvents();
1979 QApplication::restoreOverrideCursor();
1983 QApplication::restoreOverrideCursor();
1984 QString error = "Cannot import the new image.\n";
1985 error += mSlicerManagers[index]->GetLastError().c_str();
1986 QMessageBox::information(this,tr("Problem reading image !"),error);
1991 QString error = "Cannot import the new image.\n";
1992 QMessageBox::information(this,tr("Problem reading image !"),error);
1998 void vvMainWindow::OpenField()
2000 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2001 //check if a vector field has already been added
2002 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
2003 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "vector")
2005 QString error = "Cannot add more than one vector field\n";
2006 error += "Please remove first ";
2007 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
2008 QMessageBox::information(this,tr("Problem adding vector field!"),error);
2012 QString Extensions = "Images ( *.mhd)";
2013 Extensions += ";;Images ( *.vf)";
2014 QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
2015 if (!file.isEmpty())
2016 AddField(file,index);
2019 void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
2021 //create an item in the tree with good settings
2022 QTreeWidgetItem *item = new QTreeWidgetItem();
2023 item->setData(0,Qt::UserRole,filename.toStdString().c_str());
2024 item->setData(1,Qt::UserRole,tr("vector"));
2025 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename);
2026 qApp->processEvents();
2028 for (int j = 1; j <= 4; j++)
2030 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
2031 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("vector",0,
2032 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
2035 //Create the buttons for reload and close
2036 qApp->processEvents();
2037 QTreePushButton* cButton = new QTreePushButton;
2038 cButton->setItem(item);
2039 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2040 cButton->setToolTip(tr("close vector field"));
2041 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2042 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2043 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2045 QTreePushButton* rButton = new QTreePushButton;
2046 rButton->setItem(item);
2047 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2048 rButton->setToolTip(tr("reload vector field"));
2049 rButton->setEnabled(from_disk);
2050 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2051 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2052 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2054 DataTree->topLevelItem(index)->setExpanded(1);
2055 DataTree->topLevelItem(index)->addChild(item);
2056 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2057 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2059 //set the id of the image
2060 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
2061 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2063 qApp->processEvents();
2065 QApplication::restoreOverrideCursor();
2068 void vvMainWindow::AddField(vvImage::Pointer vf,QString file,int index)
2070 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2071 vvSlicerManager* imageManager = mSlicerManagers[index];
2072 if (imageManager->SetVF(vf,file.toStdString()))
2074 AddFieldEntry(file,index,false);
2078 QString error = "Cannot import the vector field for this image.\n";
2079 error += imageManager->GetLastError().c_str();
2080 QMessageBox::information(this,tr("Problem reading VF !"),error);
2082 QApplication::restoreOverrideCursor();
2085 void vvMainWindow::AddField(QString file,int index)
2087 if (QFile::exists(file))
2089 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
2091 //init the progress events
2092 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2093 vvProgressDialog progress("Opening " + file.toStdString());
2094 qApp->processEvents();
2096 //read the vector and put it in the current mSlicerManager
2097 vvSlicerManager* imageManager = mSlicerManagers[index];
2098 qApp->processEvents();
2100 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
2101 if (imageManager->SetVF(file.toStdString()))
2103 imageManager->Render();
2104 AddFieldEntry(file,index,true);
2108 QApplication::restoreOverrideCursor();
2109 QString error = "Cannot import the vector field for this image.\n";
2110 error += imageManager->GetLastError().c_str();
2111 QMessageBox::information(this,tr("Problem reading VF !"),error);
2115 QMessageBox::information(this,tr("Problem reading VF !"),"File doesn't exist!");
2118 //------------------------------------------------------------------------------
2120 //------------------------------------------------------------------------------
2121 void vvMainWindow::SetVFProperty(int subsampling, int scale, int log) {
2122 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2123 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
2125 for (int i = 0; i < 4; i++)
2127 mSlicerManagers[index]->GetSlicer(i)->SetVFSubSampling(subsampling);
2128 mSlicerManagers[index]->GetSlicer(i)->SetVFScale(scale);
2130 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(1);
2132 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(0);
2136 //------------------------------------------------------------------------------
2138 //------------------------------------------------------------------------------
2139 void vvMainWindow::SetOverlayProperty(int color) {
2140 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2141 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
2143 mSlicerManagers[index]->SetOverlayColor(color);
2144 mSlicerManagers[index]->SetColorMap(0);
2145 mSlicerManagers[index]->Render();
2148 //------------------------------------------------------------------------------
2150 //------------------------------------------------------------------------------
2151 void vvMainWindow::SetFusionProperty(int opacity, int colormap,double window, double level) {
2152 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2153 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
2155 mSlicerManagers[index]->SetFusionOpacity(opacity);
2156 mSlicerManagers[index]->SetFusionColorMap(colormap);
2157 mSlicerManagers[index]->SetFusionWindow(window);
2158 mSlicerManagers[index]->SetFusionLevel(level);
2159 mSlicerManagers[index]->SetColorMap(0);
2160 mSlicerManagers[index]->Render();
2163 //------------------------------------------------------------------------------
2165 //------------------------------------------------------------------------------
2166 void vvMainWindow::SaveAs() {
2167 if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
2169 QMessageBox::warning(this,tr("Unsupported type"),tr("Sorry, saving a vector field is unsupported for the moment"));
2173 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2174 int dimension = mSlicerManagers[index]->GetDimension();
2175 QStringList OutputListeFormat;
2176 OutputListeFormat.clear();
2179 OutputListeFormat.push_back(".mhd");
2183 OutputListeFormat.push_back(".bmp");
2184 OutputListeFormat.push_back(".png");
2185 OutputListeFormat.push_back(".jpeg");
2186 OutputListeFormat.push_back(".tif");
2187 OutputListeFormat.push_back(".mhd");
2188 OutputListeFormat.push_back(".hdr");
2189 OutputListeFormat.push_back(".vox");
2191 else if (dimension == 3)
2193 OutputListeFormat.push_back(".mhd");
2194 OutputListeFormat.push_back(".hdr");
2195 OutputListeFormat.push_back(".vox");
2197 else if (dimension == 4)
2199 OutputListeFormat.push_back(".mhd");
2201 QString Extensions = "AllFiles(*.*)";
2202 for (int i = 0; i < OutputListeFormat.count(); i++)
2204 Extensions += ";;Images ( *";
2205 Extensions += OutputListeFormat[i];
2208 QString fileName = QFileDialog::getSaveFileName(this,
2210 mSlicerManagers[index]->GetFileName().c_str(),
2212 if (!fileName.isEmpty())
2214 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
2215 if (OutputListeFormat.contains(
2216 fileformat.c_str()))
2218 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2219 std::string action = "Saving";
2220 vvProgressDialog progress("Saving "+fileName.toStdString());
2221 qApp->processEvents();
2222 vvImageWriter *writer = new vvImageWriter;
2223 writer->SetOutputFileName(fileName.toStdString());
2224 writer->SetInput(mSlicerManagers[index]->GetImage());
2226 QApplication::restoreOverrideCursor();
2227 if (writer->GetLastError().size())
2229 QString error = "Saving did not succeed\n";
2230 error += writer->GetLastError().c_str();
2231 QMessageBox::information(this,tr("Saving Problem"),error);
2237 QString error = fileformat.c_str();
2238 if (error.isEmpty())
2239 error += "no file format specified !";
2241 error += " format unknown !!!\n";
2242 QMessageBox::information(this,tr("Saving Problem"),error);
2247 //------------------------------------------------------------------------------
2249 //------------------------------------------------------------------------------
2250 void vvMainWindow::AddLink(QString image1,QString image2) {
2251 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2253 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2255 mSlicerManagers[i]->AddLink(image2.toStdString());
2257 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2259 mSlicerManagers[i]->AddLink(image1.toStdString());
2263 //------------------------------------------------------------------------------
2265 //------------------------------------------------------------------------------
2266 void vvMainWindow::RemoveLink(QString image1,QString image2) {
2267 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2269 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2271 mSlicerManagers[i]->RemoveLink(image2.toStdString());
2273 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2275 mSlicerManagers[i]->RemoveLink(image1.toStdString());
2279 //------------------------------------------------------------------------------
2281 void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
2283 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2285 if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1)
2287 for (int j = 0; j < 4; j++)
2289 mSlicerManagers[i]->SetTSliceInSlicer(value,j);
2290 //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
2291 //UpdateTSlice(j,value);
2293 mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
2299 //------------------------------------------------------------------------------
2300 void vvMainWindow::NOHorizontalSliderMoved() {
2301 HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
2303 //------------------------------------------------------------------------------
2305 //------------------------------------------------------------------------------
2306 void vvMainWindow::NEHorizontalSliderMoved() {
2307 HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
2309 //------------------------------------------------------------------------------
2311 //------------------------------------------------------------------------------
2312 void vvMainWindow::SOHorizontalSliderMoved() {
2313 HorizontalSliderMoved(SOHorizontalSlider->value(),COLUMN_DL_VIEW,2);
2315 //------------------------------------------------------------------------------
2317 //------------------------------------------------------------------------------
2318 void vvMainWindow::SEHorizontalSliderMoved() {
2319 HorizontalSliderMoved(SEHorizontalSlider->value(),COLUMN_DR_VIEW,3);
2321 //------------------------------------------------------------------------------
2323 //------------------------------------------------------------------------------
2324 void vvMainWindow::NOVerticalSliderChanged() {
2325 int value = NOVerticalSlider->value();
2326 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2328 if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
2330 mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
2335 //------------------------------------------------------------------------------
2337 //------------------------------------------------------------------------------
2338 void vvMainWindow::NEVerticalSliderChanged() {
2339 int value = NEVerticalSlider->value();
2340 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2342 if (DataTree->topLevelItem(i)->data(COLUMN_UR_VIEW,Qt::CheckStateRole).toInt() > 1)
2344 mSlicerManagers[i]->GetSlicer(1)->SetSlice(value);
2349 //------------------------------------------------------------------------------
2351 //------------------------------------------------------------------------------
2352 void vvMainWindow::SOVerticalSliderChanged() {
2353 int value = SOVerticalSlider->value();
2354 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2356 if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
2358 mSlicerManagers[i]->GetSlicer(2)->SetSlice(value);
2363 //------------------------------------------------------------------------------
2365 //------------------------------------------------------------------------------
2366 void vvMainWindow::SEVerticalSliderChanged() {
2367 int value = SEVerticalSlider->value();
2368 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2370 if (DataTree->topLevelItem(i)->data(COLUMN_DR_VIEW,Qt::CheckStateRole).toInt() > 1)
2372 mSlicerManagers[i]->GetSlicer(3)->SetSlice(value);
2377 //------------------------------------------------------------------------------
2379 //------------------------------------------------------------------------------
2380 void vvMainWindow::UpdateSlice(int slicer, int slice) {
2382 NOVerticalSlider->setValue(slice);
2383 else if (slicer == 1)
2384 NEVerticalSlider->setValue(slice);
2385 else if (slicer == 2)
2386 SOVerticalSlider->setValue(slice);
2387 else if (slicer == 3)
2388 SEVerticalSlider->setValue(slice);
2390 //------------------------------------------------------------------------------
2392 //------------------------------------------------------------------------------
2393 void vvMainWindow::UpdateTSlice(int slicer, int slice) {
2397 NOHorizontalSlider->setValue(slice);
2400 NEHorizontalSlider->setValue(slice);
2403 SOHorizontalSlider->setValue(slice);
2406 SEHorizontalSlider->setValue(slice);
2410 //------------------------------------------------------------------------------
2412 //------------------------------------------------------------------------------
2413 void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax) {
2414 int position = int((min+max)/2);
2415 int tPosition = int((tmin+tmax)/2);
2418 NOVerticalSlider->setValue(position);
2419 NOVerticalSlider->setRange(min,max);
2420 NOHorizontalSlider->setRange(tmin,tmax);
2421 NOHorizontalSlider->setValue(tPosition);
2423 else if (slicer == 1)
2425 NEVerticalSlider->setValue(position);
2426 NEVerticalSlider->setRange(min,max);
2427 NEHorizontalSlider->setRange(tmin,tmax);
2428 NEHorizontalSlider->setValue(tPosition);
2430 else if (slicer == 2)
2432 SOVerticalSlider->setValue(position);
2433 SOVerticalSlider->setRange(min,max);
2434 SOHorizontalSlider->setRange(tmin,tmax);
2435 SOHorizontalSlider->setValue(tPosition);
2437 else if (slicer == 3)
2439 SEVerticalSlider->setValue(position);
2440 SEVerticalSlider->setRange(min,max);
2441 SEHorizontalSlider->setRange(tmin,tmax);
2442 SEHorizontalSlider->setValue(tPosition);
2445 //------------------------------------------------------------------------------
2447 //------------------------------------------------------------------------------
2448 void vvMainWindow::SaveNOScreenshot() {
2449 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2450 w2i->SetInput(NOViewWidget->GetRenderWindow());
2452 SaveScreenshot(w2i->GetOutput());
2455 //------------------------------------------------------------------------------
2457 //------------------------------------------------------------------------------
2458 void vvMainWindow::SaveNEScreenshot() {
2459 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2460 w2i->SetInput(NEViewWidget->GetRenderWindow());
2462 SaveScreenshot(w2i->GetOutput());
2465 //------------------------------------------------------------------------------
2467 //------------------------------------------------------------------------------
2468 void vvMainWindow::SaveSOScreenshot() {
2469 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2470 w2i->SetInput(SOViewWidget->GetRenderWindow());
2472 SaveScreenshot(w2i->GetOutput());
2475 //------------------------------------------------------------------------------
2477 //------------------------------------------------------------------------------
2478 void vvMainWindow::SaveSEScreenshot() {
2479 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2480 w2i->SetInput(SEViewWidget->GetRenderWindow());
2482 SaveScreenshot(w2i->GetOutput());
2485 //------------------------------------------------------------------------------
2487 //------------------------------------------------------------------------------
2488 void vvMainWindow::SaveScreenshot(vtkImageData* image) {
2489 QString Extensions = "Images( *.png);;";
2490 Extensions += "Images( *.jpg);;";
2491 Extensions += "Images( *.bmp);;";
2492 Extensions += "Images( *.tif);;";
2493 Extensions += "Images( *.ppm)";
2494 QString fileName = QFileDialog::getSaveFileName(this,
2496 itksys::SystemTools::GetFilenamePath(
2497 mSlicerManagers[0]->GetFileName()).c_str(),
2499 if (!fileName.isEmpty())
2501 const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
2502 if (!strcmp(ext, ".bmp"))
2504 vtkBMPWriter *bmp = vtkBMPWriter::New();
2505 bmp->SetInput(image);
2506 bmp->SetFileName(fileName.toStdString().c_str());
2510 else if (!strcmp(ext, ".tif"))
2512 vtkTIFFWriter *tif = vtkTIFFWriter::New();
2513 tif->SetInput(image);
2514 tif->SetFileName(fileName.toStdString().c_str());
2518 else if (!strcmp(ext, ".ppm"))
2520 vtkPNMWriter *pnm = vtkPNMWriter::New();
2521 pnm->SetInput(image);
2522 pnm->SetFileName(fileName.toStdString().c_str());
2526 else if (!strcmp(ext, ".png"))
2528 vtkPNGWriter *png = vtkPNGWriter::New();
2529 png->SetInput(image);
2530 png->SetFileName(fileName.toStdString().c_str());
2534 else if (!strcmp(ext, ".jpg"))
2536 vtkJPEGWriter *jpg = vtkJPEGWriter::New();
2537 jpg->SetInput(image);
2538 jpg->SetFileName(fileName.toStdString().c_str());
2544 QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!"));
2549 //------------------------------------------------------------------------------
2551 //------------------------------------------------------------------------------
2552 void vvMainWindow::GoToCursor() {
2553 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2554 for (int column = 1; column < 5; column++)
2556 if (DataTree->selectedItems()[0]->data(column,Qt::CheckStateRole).toInt() > 1)
2558 double* cursorPos = mSlicerManagers[index]->GetSlicer(column-1)->GetCursorPosition();
2559 mSlicerManagers[index]->GetSlicer(column-1)->SetCurrentPosition(
2560 cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
2561 mSlicerManagers[index]->UpdateViews(1,column-1);
2562 mSlicerManagers[index]->UpdateLinked(column-1);
2567 //------------------------------------------------------------------------------
2569 //------------------------------------------------------------------------------
2570 void vvMainWindow::PlayPause() {
2574 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_play.png")));
2580 int image_number=DataTree->topLevelItemCount();
2582 for (int i=0;i<image_number;i++)
2583 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1)
2591 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_pause.png")));
2592 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2596 //------------------------------------------------------------------------------
2598 //------------------------------------------------------------------------------
2599 void vvMainWindow::PlayNext() {
2600 if (playMode && !this->isHidden())
2602 int image_number=DataTree->topLevelItemCount();
2603 ///Only play one slicer per SM, and only if the SM is being displayed
2604 for (int i=0;i<image_number;i++)
2605 for (int j=0;j<4;j++)
2606 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1 and
2607 DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0)
2609 mSlicerManagers[i]->SetNextTSlice(j);
2612 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2615 //------------------------------------------------------------------------------
2617 void vvMainWindow::ShowLastImage()
2619 if (mSlicerManagers.size() > 1)
2621 QTreeWidgetItem * item=DataTree->topLevelItem(DataTree->topLevelItemCount()-1);
2622 CurrentImageChanged(mSlicerManagers.back()->GetId()); //select new image
2623 item->setData(1,Qt::CheckStateRole,2); //show the new image in the first panel
2624 DisplayChanged(item,1);
2628 //------------------------------------------------------------------------------
2629 void vvMainWindow::UpdateRenderWindows() {
2630 if (NOViewWidget->GetRenderWindow()) NOViewWidget->GetRenderWindow()->Render();
2631 if (NEViewWidget->GetRenderWindow()) NEViewWidget->GetRenderWindow()->Render();
2632 if (SOViewWidget->GetRenderWindow()) SOViewWidget->GetRenderWindow()->Render();
2633 if (SEViewWidget->GetRenderWindow()) SEViewWidget->GetRenderWindow()->Render();
2635 //------------------------------------------------------------------------------
2637 //------------------------------------------------------------------------------
2638 void vvMainWindow::ResampleCurrentImage() {
2639 vvResamplerDialog resampler;
2640 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2641 resampler.SetSlicerManagers(mSlicerManagers,index);
2642 if (resampler.exec())
2643 AddImage(resampler.GetOutput(),resampler.GetOutputFileName());
2645 //------------------------------------------------------------------------------
2647 //------------------------------------------------------------------------------
2648 void vvMainWindow::SegmentationOnCurrentImage() {
2649 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2651 vvSegmentationDialog segmentation;
2652 segmentation.SetImage(mSlicerManagers[index]->GetSlicer(0)->GetImage());
2653 segmentation.exec();
2655 //------------------------------------------------------------------------------
2657 void vvMainWindow::SurfaceViewerLaunch()
2659 vvSurfaceViewerDialog surfaceViewer;
2660 surfaceViewer.exec();
2663 //------------------------------------------------------------------------------
2664 void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
2666 vvSlicerManager* m = new vvSlicerManager(4);
2668 m->SetFilename(filename);
2672 //------------------------------------------------------------------------------
2673 void vvMainWindow::AddImage(vvSlicerManager * slicer_manager) {
2674 mSlicerManagers.push_back(slicer_manager);
2676 std::string filename = slicer_manager->GetFileName();
2678 //create an item in the tree with good settings
2679 QTreeWidgetItem *item = new QTreeWidgetItem();
2680 item->setData(0,Qt::UserRole,slicer_manager->GetFileName().c_str());//files[i].c_str());
2681 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
2682 qApp->processEvents();
2684 for (int j = 1; j <= 4; j++) item->setData(j,Qt::CheckStateRole,1);
2686 //Create the buttons for reload and close
2687 qApp->processEvents();
2688 QTreePushButton* cButton = new QTreePushButton;
2689 cButton->setItem(item);
2690 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2691 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2692 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2693 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2695 QTreePushButton* rButton = new QTreePushButton;
2696 rButton->setItem(item);
2697 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2698 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2699 rButton->setEnabled(0);
2700 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2701 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2703 DataTree->addTopLevelItem(item);
2704 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2705 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2707 //set the id of the image
2708 QString id = slicer_manager->GetFileName().c_str() + QString::number(mSlicerManagers.size()-1);
2709 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2710 mSlicerManagers.back()->SetId(id.toStdString());
2712 linkPanel->addImage(filename, id.toStdString());
2714 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
2715 this,SLOT(CurrentImageChanged(std::string)));
2716 connect(mSlicerManagers.back(),SIGNAL(
2717 UpdatePosition(int, double, double, double, double, double, double, double)),this,
2718 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
2719 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
2720 this, SLOT(VectorChanged(int,double,double,double, double)));
2721 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
2722 this, SLOT(OverlayChanged(int,double,double)));
2723 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
2724 this, SLOT(FusionChanged(int,double)));
2725 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
2726 this,SLOT(WindowsChanged(int, int, int)));
2727 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
2728 this,SLOT(WindowLevelChanged(double, double, int, int)));
2729 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
2730 this,SLOT(UpdateSlice(int,int)));
2731 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
2732 this,SLOT(UpdateTSlice(int, int)));
2733 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
2734 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
2735 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
2736 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
2737 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
2739 qApp->processEvents();
2743 qApp->processEvents();
2745 // vvToolManager::GetInstance()->UpdateEnabledTool();
2746 // emit SlicerManagersHasChanged();
2748 //------------------------------------------------------------------------------
2751 //------------------------------------------------------------------------------
2752 vvMainWindowToolInfo * vvMainWindow::GetInfoForTool() {
2753 DD("GetInfoForTool");
2754 if (mCurrentToolInfo ==0) mCurrentToolInfo = new vvMainWindowToolInfo;
2756 mCurrentToolInfo->mMenuTools = menuTools;
2757 mCurrentToolInfo->mSlicerManagers = &mSlicerManagers;
2759 DD(DataTree->selectedItems().size());
2760 if (DataTree->selectedItems().size() > 0) {
2761 index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2762 DD(DataTree->selectedItems()[0]);
2765 mCurrentToolInfo->mSlicerManagerCurrentIndex = index;
2767 return mCurrentToolInfo;
2769 //------------------------------------------------------------------------------