3 #include <QInputDialog>
5 #include "QTreePushButton.h"
8 #include "vvMainWindow.h"
9 #include "vvHelpDialog.h"
10 #include "vvDocumentation.h"
11 #include "vvProgressDialog.h"
12 #include "vvQDicomSeriesSelector.h"
13 #include "vvSlicerManager.h"
14 #include "clitkImageCommon.h"
16 #include "vvInteractorStyleNavigator.h"
17 #include "vvImageWriter.h"
18 #include "vvResamplerDialog.h"
19 #include "vvSegmentationDialog.h"
20 #include "vvSurfaceViewerDialog.h"
21 #include "vvDeformationDialog.h"
22 #include "vvImageWarp.h"
24 #include "vvMaximumIntensityProjection.h"
25 #include "vvMidPosition.h"
27 #include "vvStructSelector.h"
28 #include "vvMeshReader.h"
29 #include "vvConstants.h"
31 #ifdef CLITK_VV_USE_BDCM
32 #include <bdcmDicomFilesSelectorDialog.h>
37 #include "itkImageFileReader.h"
38 #include "itkByteSwapper.h"
39 #include "itkCommand.h"
40 #include "itkNumericSeriesFileNames.h"
43 #include "vtkImageData.h"
44 #include "vtkImageActor.h"
45 #include "vtkCornerAnnotation.h"
46 #include "vtkRenderWindow.h"
47 #include "vtkRenderWindowInteractor.h"
48 #include "vtkRenderer.h"
49 #include "vtkRendererCollection.h"
50 #include "vtkWindowToImageFilter.h"
51 #include "vtkBMPWriter.h"
52 #include "vtkTIFFWriter.h"
53 #include "vtkPNMWriter.h"
54 #include "vtkPNGWriter.h"
55 #include "vtkJPEGWriter.h"
61 #define COLUMN_UL_VIEW 1
62 #define COLUMN_UR_VIEW 2
63 #define COLUMN_DL_VIEW 3
64 #define COLUMN_DR_VIEW 4
65 #define COLUMN_CLOSE_IMAGE 5
66 #define COLUMN_RELOAD_IMAGE 6
67 #define COLUMN_IMAGE_NAME 7
69 #define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr)"
72 0,Qt::UserRole full filename
73 1,Qt::CheckStateRole checkbutton UL View
74 1,Qt::UserRole overlay, fusion or vector
75 2,Qt::CheckStateRole checkbutton UR View
76 3,Qt::CheckStateRole checkbutton DL View
77 4,Qt::CheckStateRole checkbutton DR View
79 5,Qt::UserRole mSlicerManager id*/
81 //------------------------------------------------------------------------------
82 vvMainWindow::vvMainWindow():vvMainWindowBase() {
83 setupUi(this); // this sets up the GUI
86 mMenuTools = menuTools;
87 mMenuExperimentalTools = menuExperimental;
90 //Init the contextMenu
91 this->setContextMenuPolicy(Qt::CustomContextMenu);
92 contextActions.resize(0);
93 QAction* actionOpen_new_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/fileopen.png")),
94 tr("O&pen new Image"));
95 actionOpen_new_image->setShortcut(QKeySequence(tr("Ctrl+O")));
96 connect(actionOpen_new_image,SIGNAL(triggered()),this,SLOT(OpenImages()));
97 contextActions.push_back(actionOpen_new_image);
98 contextMenu.addSeparator();
100 QAction* actionClose_Image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")),
101 tr("Close Current Image"));
102 connect(actionClose_Image,SIGNAL(triggered()),this,SLOT(CloseImage()));
103 contextActions.push_back(actionClose_Image);
105 QAction* actionReload_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")),
106 tr("Reload Current Image"));
107 connect(actionReload_image,SIGNAL(triggered()),this,SLOT(ReloadImage()));
108 contextActions.push_back(actionReload_image);
110 QAction* actionSave_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/filesave.png")),
111 tr("Save Current Image"));
112 connect(actionSave_image,SIGNAL(triggered()),this,SLOT(SaveAs()));
113 contextActions.push_back(actionSave_image);
115 contextMenu.addSeparator();
117 // QAction* actionCrop_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/crop.png")),
118 // tr("Crop Current Image"));
119 // connect(actionCrop_image,SIGNAL(triggered()),this,SLOT(CropImage()));
120 // contextActions.push_back(actionCrop_image);
122 QAction* actionSplit_image = contextMenu.addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/cut.png")),
123 tr("Split Current Image"));
124 connect(actionSplit_image,SIGNAL(triggered()),this,SLOT(SplitImage()));
125 contextActions.push_back(actionSplit_image);
127 contextMenu.addSeparator();
129 contextMenu.addAction(actionAdd_VF_to_current_Image);
130 contextActions.push_back(actionAdd_VF_to_current_Image);
132 QAction* actionAdd_Overlay_to_current_Image = menuOverlay->addAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/GPSup.png")),
133 tr("Add overlay image to current image"));
134 contextMenu.addAction(actionAdd_Overlay_to_current_Image);
135 contextActions.push_back(actionAdd_Overlay_to_current_Image);
137 connect(actionAdd_Overlay_to_current_Image,SIGNAL(triggered()), this,SLOT(SelectOverlayImage()));
139 contextMenu.addAction(actionAdd_fusion_image);
140 connect(actionAdd_fusion_image,SIGNAL(triggered()),this,SLOT(AddFusionImage()));
141 contextActions.push_back(actionAdd_fusion_image);
144 mSlicerManagers.resize(0);
154 header.append("Name");
156 DataTree->setHeaderLabels(header);
157 DataTree->resizeColumnToContents(COLUMN_TREE);
158 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
159 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
160 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
161 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
162 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
163 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
164 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
167 documentation = new vvDocumentation();
168 help_dialog = new vvHelpDialog();
169 dicomSeriesSelector = new vvDicomSeriesSelector();
171 inverseButton->setEnabled(0);
172 actionAdd_Overlay_to_current_Image->setEnabled(0);
173 actionSave_As->setEnabled(0);
174 actionAdd_VF_to_current_Image->setEnabled(0);
175 actionAdd_fusion_image->setEnabled(0);
178 verticalSliders.push_back(NOVerticalSlider);
179 verticalSliders.push_back(NEVerticalSlider);
180 verticalSliders.push_back(SOVerticalSlider);
181 verticalSliders.push_back(SEVerticalSlider);
183 for (int i =0; i < 4; i++)
184 verticalSliders[i]->hide();
186 horizontalSliders.push_back(NOHorizontalSlider);
187 horizontalSliders.push_back(NEHorizontalSlider);
188 horizontalSliders.push_back(SOHorizontalSlider);
189 horizontalSliders.push_back(SEHorizontalSlider);
191 for (int i =0; i < 4; i++)
192 horizontalSliders[i]->hide();
195 connect(NOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOVerticalSliderChanged()));
196 connect(NEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEVerticalSliderChanged()));
197 connect(SOVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOVerticalSliderChanged()));
198 connect(SEVerticalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEVerticalSliderChanged()));
200 connect(NOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NOHorizontalSliderMoved()));
201 connect(NEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(NEHorizontalSliderMoved()));
202 connect(SOHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SOHorizontalSliderMoved()));
203 connect(SEHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(SEHorizontalSliderMoved()));
206 connect(actionMaximum_Intensity_Projection,SIGNAL(triggered()),this,SLOT(ComputeMIP()));
207 connect(actionCompute_mid_position_image,SIGNAL(triggered()),this,SLOT(ComputeMidPosition()));
208 connect(actionDeformable_Registration,SIGNAL(triggered()),this,SLOT(ComputeDeformableRegistration()));
209 connect(actionWarp_image_with_vector_field,SIGNAL(triggered()),this,SLOT(WarpImage()));
210 connect(actionLoad_images,SIGNAL(triggered()),this,SLOT(OpenImages()));
211 connect(actionOpen_Dicom,SIGNAL(triggered()),this,SLOT(OpenDicom()));
212 connect(actionOpen_Dicom_Struct,SIGNAL(triggered()),this,SLOT(OpenDCStructContour()));
213 connect(actionOpen_VTK_contour,SIGNAL(triggered()),this,SLOT(OpenVTKContour()));
214 connect(actionOpen_Multiple_Images_As_One,SIGNAL(triggered()),this,SLOT(MergeImages()));
215 connect(actionOpen_Image_With_Time,SIGNAL(triggered()),this,SLOT(OpenImageWithTime()));
216 connect(actionMerge_images_as_n_dim_t, SIGNAL(triggered()), this, SLOT(MergeImagesWithTime()));
217 connect(actionSave_As,SIGNAL(triggered()),this,SLOT(SaveAs()));
218 connect(actionExit,SIGNAL(triggered()),this,SLOT(close()));
219 connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField()));
220 connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog()));
221 connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation()));
223 ///////////////////////////////////////////////
224 contextMenu.addAction(actionResampler);
225 connect(actionResampler,SIGNAL(triggered()),this,SLOT(ResampleCurrentImage()));
226 connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage()));
227 connect(actionSurface_Viewer,SIGNAL(triggered()),this,SLOT(SurfaceViewerLaunch()));
228 ///////////////////////////////////////////////
230 actionNorth_East_Window->setEnabled(0);
231 actionNorth_West_Window->setEnabled(0);
232 actionSouth_East_Window->setEnabled(0);
233 actionSouth_West_Window->setEnabled(0);
235 connect(actionNorth_East_Window,SIGNAL(triggered()),this,SLOT(SaveNEScreenshot()));
236 connect(actionNorth_West_Window,SIGNAL(triggered()),this,SLOT(SaveNOScreenshot()));
237 connect(actionSouth_East_Window,SIGNAL(triggered()),this,SLOT(SaveSEScreenshot()));
238 connect(actionSouth_West_Window,SIGNAL(triggered()),this,SLOT(SaveSOScreenshot()));
240 connect(DataTree,SIGNAL(itemSelectionChanged()),this,SLOT(ImageInfoChanged()));
241 connect(DataTree,SIGNAL(itemClicked(QTreeWidgetItem*, int)),this,
242 SLOT(DisplayChanged(QTreeWidgetItem*, int)));
244 connect(viewButton,SIGNAL(clicked()),this, SLOT(ChangeViewMode()) );
245 connect(windowSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
246 connect(levelSpinBox,SIGNAL(editingFinished()),this,SLOT(WindowLevelEdited()));
247 connect(colorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateColorMap()));
248 connect(presetComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(UpdateWindowLevel()));
249 connect(inverseButton,SIGNAL(clicked()),this,SLOT(SwitchWindowLevel()));
252 connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowContextMenu(QPoint)));
254 connect(linkPanel,SIGNAL(addLink(QString,QString)),this,SLOT(AddLink(QString,QString)));
255 connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString)));
256 connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int)),this,SLOT(SetVFProperty(int,int,int)));
257 connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int)),this,SLOT(SetOverlayProperty(int)));
258 connect(overlayPanel,SIGNAL(FusionPropertyUpdated(int,int,double,double)),
259 this,SLOT(SetFusionProperty(int,int,double,double)));
260 connect(landmarksPanel,SIGNAL(UpdateRenderWindows()),this,SLOT(UpdateRenderWindows()));
264 playButton->setEnabled(0);
265 frameRateLabel->setEnabled(0);
266 frameRateSpinBox->setEnabled(0);
267 connect(playButton, SIGNAL(clicked()),this,SLOT(PlayPause()));
268 connect(frameRateSpinBox, SIGNAL(valueChanged(int)),this,SLOT(ChangeFrameRate(int)));
270 goToCursorPushButton->setEnabled(0);
271 connect(goToCursorPushButton, SIGNAL(clicked()),this,SLOT(GoToCursor()));
273 NOViewWidget->hide();
274 NEViewWidget->hide();
275 SOViewWidget->hide();
276 SEViewWidget->hide();
278 //Recently opened files
279 std::list<std::string> recent_files = GetRecentlyOpenedImages();
280 if ( !recent_files.empty() )
282 QMenu * rmenu = new QMenu("Recently opened files...");
283 rmenu->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")));
284 menuFile->insertMenu(actionOpen_Image_With_Time,rmenu);
285 for (std::list<std::string>::iterator i = recent_files.begin();i!=recent_files.end();i++)
287 QAction* current=new QAction(QIcon(QString::fromUtf8(":/new/prefix1/icons/open.png")),
289 rmenu->addAction(current);
290 connect(current,SIGNAL(triggered()),this,SLOT(OpenRecentImage()));
294 // Adding all new tools (insertion in the menu)
295 vvToolManager::GetInstance()->InsertToolsInMenu(this);
297 if (!CLITK_EXPERIMENTAL)
298 menuExperimental->menuAction()->setVisible(false);
300 //------------------------------------------------------------------------------
303 //------------------------------------------------------------------------------
304 void vvMainWindow::ComputeMIP()
306 vvMaximumIntensityProjection mip;
307 vvSlicerManager* selected_slicer = mSlicerManagers[GetSlicerIndexFromItem(DataTree->selectedItems()[0])];
308 QFileInfo info(selected_slicer->GetFileName().c_str());
309 mip.Compute(selected_slicer);
310 AddImage(mip.GetOutput(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_mip.mhd");
312 //------------------------------------------------------------------------------
315 //------------------------------------------------------------------------------
316 void vvMainWindow::ComputeMidPosition()
319 int index=GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
320 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
321 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
325 midp.slicer_manager = mSlicerManagers[index];
326 midp.reference_image_index = ref;
327 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
330 QMessageBox::warning(this, "Error computing midposition image",midp.error_message.c_str());
333 QFileInfo info(midp.slicer_manager->GetFileName().c_str());
334 AddImage(midp.output,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_midposition.mhd");
336 QApplication::restoreOverrideCursor();
339 //------------------------------------------------------------------------------
342 //------------------------------------------------------------------------------
343 void vvMainWindow::AddContour(int image_index, vvMesh::Pointer contour, bool propagation)
345 QTreeWidgetItem *item = new QTreeWidgetItem();
346 item->setData(0,Qt::UserRole,"filename.vtk");
347 item->setData(1,Qt::UserRole,tr("contour"));
349 brush.setColor(QColor(contour->r*255,contour->g*255,contour->b*255));
350 brush.setStyle(Qt::SolidPattern);
351 item->setData(COLUMN_IMAGE_NAME,Qt::BackgroundRole,brush);
352 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,contour->structure_name.c_str());
354 for (int j = 1; j <= 4; j++)
355 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(image_index)->data(j,Qt::CheckStateRole));
357 QTreePushButton* cButton = new QTreePushButton;
358 cButton->setItem(item);
359 cButton->setColumn(COLUMN_CLOSE_IMAGE);
360 cButton->setToolTip(tr("close image"));
361 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
362 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
363 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
365 QTreePushButton* rButton = new QTreePushButton;
366 rButton->setItem(item);
367 rButton->setColumn(COLUMN_RELOAD_IMAGE);
368 rButton->setToolTip(tr("reload image"));
369 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
370 rButton->setEnabled(false);
372 //connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
373 //this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
375 DataTree->topLevelItem(image_index)->setExpanded(1);
376 DataTree->topLevelItem(image_index)->addChild(item);
377 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
378 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
379 QString id = DataTree->topLevelItem(image_index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
380 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
383 mSlicerManagers[image_index]->AddContour(contour,propagation);
384 mSlicerManagers[image_index]->Render();
386 //------------------------------------------------------------------------------
389 //------------------------------------------------------------------------------
390 void vvMainWindow::OpenVTKContour()
392 if (mSlicerManagers.size() > 0)
394 QString Extensions = "Images ( *.vtk; *.obj)";
395 Extensions += ";;All Files (*)";
396 QString file = QFileDialog::getOpenFileName(this,tr("Open vtkPolyData"),mInputPathName,Extensions);
399 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
400 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
402 reader.SetImage(mSlicerManagers[index]->GetImage());
403 reader.SetModeToVTK();
404 reader.SetFilename(file.toStdString());
406 AddContour(index,reader.GetOutput()[0],false);
407 QApplication::restoreOverrideCursor();
410 //------------------------------------------------------------------------------
413 //------------------------------------------------------------------------------
414 void vvMainWindow::OpenDCStructContour()
416 if (mSlicerManagers.size() > 0)
418 QString Extensions = "Dicom Files ( *.dcm; RS*)";
419 Extensions += ";;All Files (*)";
420 QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"),mInputPathName,Extensions);
423 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
425 reader.SetFilename(file.toStdString());
426 vvStructSelector selector;
427 selector.SetStructures(reader.GetROINames());
428 if (!mSlicerManagers[index]->GetVF().IsNull())
429 selector.EnablePropagationCheckBox();
432 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
433 reader.SetSelectedItems(selector.getSelectedItems());
434 reader.SetImage(mSlicerManagers[index]->GetImage());
435 if (selector.PropagationEnabled())
436 reader.SetPropagationVF(mSlicerManagers[index]->GetVF());
438 std::vector<vvMesh::Pointer> contours=reader.GetOutput();
439 for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
440 i!=contours.end();i++)
441 AddContour(index,*i,selector.PropagationEnabled());
442 QApplication::restoreOverrideCursor();
446 //------------------------------------------------------------------------------
449 //------------------------------------------------------------------------------
450 void vvMainWindow::ComputeDeformableRegistration()
452 if (mSlicerManagers.size() > 0)
454 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
455 vvDeformationDialog dialog(index,mSlicerManagers);
458 std::string base_name=itksys::SystemTools::GetFilenameWithoutExtension(mSlicerManagers[dialog.GetInputFileIndex()]->GetFileName());
459 AddField(dialog.GetOutput(),dialog.getFieldFile(),dialog.GetInputFileIndex());
460 WarpImage(dialog.GetSelectedSlicer(),dialog.GetReferenceFrameIndex());
463 std::cout << "Error or user cancellation while computing deformation field..." << std::endl;
465 else QMessageBox::information(this, "Need to open image","You must open an image first.");
467 //------------------------------------------------------------------------------
470 //------------------------------------------------------------------------------
471 void vvMainWindow::WarpImage()
473 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
474 if (!mSlicerManagers[index]->GetVF().IsNull())
477 int ref = QInputDialog::getInteger(this,"Chose reference phase","Reference phase",0,0,\
478 mSlicerManagers[index]->GetImage()->GetVTKImages().size()-1,1,&ok);
481 WarpImage(mSlicerManagers[index],ref);
485 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field"));
487 //------------------------------------------------------------------------------
490 //------------------------------------------------------------------------------
491 void vvMainWindow::WarpImage(vvSlicerManager* selected_slicer,int reference_phase)
493 if (!selected_slicer->GetVF().IsNull())
495 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
496 QFileInfo info(selected_slicer->GetFileName().c_str());
497 vvImageWarp warp(selected_slicer->GetImage(),selected_slicer->GetVF(),
498 reference_phase,this);
499 if (warp.ComputeWarpedImage())
501 AddImage(warp.GetWarpedImage(),info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_warped.mhd");
502 AddImage(warp.GetDiffImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_diff.mhd");
503 AddImage(warp.GetJacobianImage() ,info.path().toStdString()+"/"+info.completeBaseName().toStdString()+"_jacobian.mhd");
504 QApplication::restoreOverrideCursor();
508 QApplication::restoreOverrideCursor();
509 QMessageBox::warning(this,tr("Different spacings"),tr("The vector field and image spacings must be the same in order to warp."));
513 QMessageBox::warning(this,tr("No vector field"),tr("Sorry, can't warp without a vector field."));
515 //------------------------------------------------------------------------------
518 //------------------------------------------------------------------------------
519 vvMainWindow::~vvMainWindow() {
520 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
522 if (mSlicerManagers[i] != NULL)
523 delete mSlicerManagers[i];
526 //------------------------------------------------------------------------------
529 //------------------------------------------------------------------------------
530 void vvMainWindow::MergeImages() {
531 QString Extensions = EXTENSIONS;
532 Extensions += ";;All Files (*)";
533 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images"),mInputPathName,Extensions);
536 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
537 std::vector<std::string> vector;
539 unsigned int currentDim = 0;
540 std::vector<double> currentSpacing;
541 std::vector<int> currentSize;
542 std::vector<double> currentOrigin;
544 for (int i = 0; i < files.size(); i++)
546 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
547 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
548 reader->SetFileName(files[i].toStdString().c_str());
549 reader->ReadImageInformation();
551 //NOViewWidget->hide();
552 //NEViewWidget->hide();
553 //SOViewWidget->hide();
554 //SEViewWidget->hide();
556 currentDim = reader->GetNumberOfDimensions();
558 for (unsigned int j = 0;j < currentDim; j++)
564 currentSpacing.resize(currentDim);
565 currentSize.resize(currentDim);
566 currentOrigin.resize(currentDim);
568 currentOrigin[j] = reader->GetOrigin(j);
569 currentSpacing[j] = reader->GetSpacing(j);
570 currentSize[j] = reader->GetDimensions(j);
572 else if (currentDim != reader->GetNumberOfDimensions()
573 || currentSpacing[j] != reader->GetSpacing(j)
574 || currentSize[j] != (int)reader->GetDimensions(j)
575 || currentOrigin[j] != reader->GetOrigin(j))
577 QString error = "Cannot read file (too different from others ";
578 error += files[i].toStdString().c_str();
579 QMessageBox::information(this,tr("Reading problem"),error);
585 vector.push_back(files[i].toStdString());
588 if (vector.size() > 0)
589 LoadImages(vector, MERGED);
591 //------------------------------------------------------------------------------
594 //------------------------------------------------------------------------------
595 void vvMainWindow::MergeImagesWithTime() {
596 QString Extensions = EXTENSIONS;
597 Extensions += ";;All Files (*)";
598 QStringList files = QFileDialog::getOpenFileNames(this,tr("Merge Images With Time"),mInputPathName,Extensions);
601 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
602 std::vector<std::string> vector;
604 unsigned int currentDim = 0;
605 std::vector<double> currentSpacing;
606 std::vector<int> currentSize;
607 std::vector<double> currentOrigin;
609 for (int i = 0; i < files.size(); i++)
611 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
612 files[i].toStdString().c_str(), itk::ImageIOFactory::ReadMode);
615 reader->SetFileName(files[i].toStdString().c_str());
616 reader->ReadImageInformation();
618 currentDim = reader->GetNumberOfDimensions();
620 for (unsigned int j = 0;j < currentDim; j++)
626 currentSpacing.resize(currentDim);
627 currentSize.resize(currentDim);
628 currentOrigin.resize(currentDim);
630 currentOrigin[j] = reader->GetOrigin(j);
631 currentSpacing[j] = reader->GetSpacing(j);
632 currentSize[j] = reader->GetDimensions(j);
634 else if (currentDim != reader->GetNumberOfDimensions()
635 || currentSpacing[j] != reader->GetSpacing(j)
636 || currentSize[j] != (int)reader->GetDimensions(j)
637 || currentOrigin[j] != reader->GetOrigin(j))
639 QString error = "Cannot read file (too different from others ";
640 error += files[i].toStdString().c_str();
641 QMessageBox::information(this,tr("Reading problem"),error);
647 vector.push_back(files[i].toStdString());
651 QString error = "Cannot read file info for ";
652 error += files[i].toStdString().c_str();
654 error += "Maybe you're trying to open an image in an unsupported format?\n";
655 QMessageBox::information(this,tr("Reading problem"),error);
658 sort(vector.begin(),vector.end());
659 if (vector.size() > 1)
660 LoadImages(vector, MERGEDWITHTIME);
662 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.");
664 //------------------------------------------------------------------------------
667 //------------------------------------------------------------------------------
668 void vvMainWindow::OpenDicom() {
669 std::vector<std::string> files;
671 #ifdef CLITK_VV_USE_BDCM
672 bool r = bdcm::OpenDicomFilesSelectorDialog(files,
673 "DicomFilesSelectorDialog test",
677 std::cout << "$$$$ main : user clicked 'OK' $$$$"<<std::endl;
678 std::cout << "$$$$ selected files : "<<std::endl;
679 std::vector<std::string>::iterator i;
680 for (i=files.begin();i!=files.end();++i) {
681 std::cout << *i << std::endl;
683 std::cout << "$$$$ "<<std::endl;
685 LoadImages(files,DICOM);
688 std::cout << "$$$$ main : user clicked 'CANCEL' $$$$"<<std::endl;
691 std::cout << "dicomSeriesSelector " << std::endl;
692 if (dicomSeriesSelector->exec() == QDialog::Accepted) {
693 files = *(dicomSeriesSelector->GetFilenames());
694 LoadImages(files,DICOM);
699 //------------------------------------------------------------------------------
701 //------------------------------------------------------------------------------
702 void vvMainWindow::OpenImages() {
703 QString Extensions = EXTENSIONS;
704 Extensions += ";;All Files (*)";
706 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images"),mInputPathName,Extensions);
709 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
710 std::vector<std::string> vector;
711 for (int i = 0; i < files.size(); i++)
712 vector.push_back(files[i].toStdString());
713 LoadImages(vector, IMAGE);
715 //------------------------------------------------------------------------------
716 void vvMainWindow::OpenRecentImage()
718 QAction * caller = qobject_cast<QAction*>(sender());
719 std::vector<std::string> images;
720 images.push_back(caller->text().toStdString());
721 mInputPathName = itksys::SystemTools::GetFilenamePath(images[0]).c_str();
722 LoadImages(images,IMAGE);
725 //------------------------------------------------------------------------------
726 void vvMainWindow::OpenImageWithTime() {
727 QString Extensions = EXTENSIONS;
728 Extensions += ";;All Files (*)";
730 QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Images With Time"),mInputPathName,Extensions);
733 mInputPathName = itksys::SystemTools::GetFilenamePath(files[0].toStdString()).c_str();
734 std::vector<std::string> vector;
735 for (int i = 0; i < files.size(); i++)
737 vector.push_back(files[i].toStdString());
739 LoadImages(vector, IMAGEWITHTIME);
741 //------------------------------------------------------------------------------
743 //------------------------------------------------------------------------------
744 void vvMainWindow::LoadImages(std::vector<std::string> files, LoadedImageType filetype) {
745 //Separate the way to open images and dicoms
747 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
748 fileSize = files.size();
752 //Only add to the list of recently opened files when a single file is opened,
753 //to avoid polluting the list of recently opened files
754 if (files.size() == 1)
756 QFileInfo finfo=tr(files[0].c_str());
757 AddToRecentlyOpenedImages(finfo.absoluteFilePath().toStdString());
759 //init the progress events
760 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
761 vvProgressDialog progress("Opening " + files[0],fileSize>1);
762 qApp->processEvents();
764 int numberofsuccesulreads=0;
765 //open images as 1 or multiples
766 for (int i = 0; i < fileSize; i++) {
768 progress.Update("Opening " + files[i]);
769 progress.SetProgress(i,fileSize);
770 qApp->processEvents();
772 //read the image and put it in mSlicerManagers
773 vvSlicerManager* imageManager = new vvSlicerManager(4);
774 qApp->processEvents();
776 bool SetImageSucceed=false;
778 if (filetype == IMAGE || filetype == IMAGEWITHTIME)
779 SetImageSucceed = imageManager->SetImage(files[i],filetype);
782 SetImageSucceed = imageManager->SetImages(files,filetype);
784 if (SetImageSucceed == false)
786 QApplication::restoreOverrideCursor();
787 QString error = "Cannot open file \n";
788 error += imageManager->GetLastError().c_str();
789 QMessageBox::information(this,tr("Reading problem"),error);
794 mSlicerManagers.push_back(imageManager);
796 //create an item in the tree with good settings
797 QTreeWidgetItem *item = new QTreeWidgetItem();
798 item->setData(0,Qt::UserRole,files[i].c_str());
799 QFileInfo fileinfo(imageManager->GetFileName().c_str()); //Do not show the path
800 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileinfo.fileName());
801 qApp->processEvents();
803 //Create the buttons for reload and close
804 qApp->processEvents();
805 QTreePushButton* cButton = new QTreePushButton;
806 cButton->setItem(item);
807 cButton->setColumn(COLUMN_CLOSE_IMAGE);
808 cButton->setToolTip(tr("close image"));
809 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
810 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
811 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
813 QTreePushButton* rButton = new QTreePushButton;
814 rButton->setItem(item);
815 rButton->setColumn(COLUMN_RELOAD_IMAGE);
816 rButton->setToolTip(tr("reload image"));
817 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
818 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
819 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
821 DataTree->addTopLevelItem(item);
822 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
823 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
825 //set the id of the image
826 QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1);
827 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
828 mSlicerManagers.back()->SetId(id.toStdString());
830 linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
832 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
833 this,SLOT(CurrentImageChanged(std::string)));
834 connect(mSlicerManagers.back(),SIGNAL(
835 UpdatePosition(int, double, double, double, double, double, double, double)),this,
836 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
837 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
838 this, SLOT(VectorChanged(int,double,double,double, double)));
839 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
840 this, SLOT(OverlayChanged(int,double,double)));
841 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
842 this, SLOT(FusionChanged(int,double)));
843 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
844 this,SLOT(WindowsChanged(int, int, int)));
845 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
846 this,SLOT(WindowLevelChanged(double, double, int, int)));
847 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
848 this,SLOT(UpdateSlice(int,int)));
849 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
850 this,SLOT(UpdateTSlice(int, int)));
851 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
852 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
853 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
854 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
855 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
857 numberofsuccesulreads++;
860 if (numberofsuccesulreads)
862 NOViewWidget->show();
863 NEViewWidget->show();
864 SOViewWidget->show();
865 SEViewWidget->show();
870 QApplication::restoreOverrideCursor();
873 //------------------------------------------------------------------------------
875 //------------------------------------------------------------------------------
876 void vvMainWindow::UpdateTree() {
877 DataTree->resizeColumnToContents(COLUMN_TREE);
878 DataTree->resizeColumnToContents(COLUMN_UL_VIEW);
879 DataTree->resizeColumnToContents(COLUMN_UR_VIEW);
880 DataTree->resizeColumnToContents(COLUMN_DL_VIEW);
881 DataTree->resizeColumnToContents(COLUMN_DR_VIEW);
882 DataTree->resizeColumnToContents(COLUMN_IMAGE_NAME);
883 DataTree->resizeColumnToContents(COLUMN_CLOSE_IMAGE);
884 DataTree->resizeColumnToContents(COLUMN_RELOAD_IMAGE);
886 //------------------------------------------------------------------------------
888 //------------------------------------------------------------------------------
889 void vvMainWindow::CurrentImageChanged(std::string id) {
891 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
893 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id)
899 DataTree->topLevelItem(i)->setSelected(0);
901 for (int child = 0; child < DataTree->topLevelItem(i)->childCount();child++)
902 DataTree->topLevelItem(i)->child(child)->setSelected(0);
905 DataTree->topLevelItem(selected)->setSelected(1);
907 //------------------------------------------------------------------------------
909 //------------------------------------------------------------------------------
910 void vvMainWindow::ImageInfoChanged() {
911 contextActions[7]->setEnabled(1);
912 contextActions[6]->setEnabled(1);
913 actionSave_As->setEnabled(1);
914 actionAdd_VF_to_current_Image->setEnabled(1);
915 actionAdd_fusion_image->setEnabled(1);
916 actionNorth_East_Window->setEnabled(1);
917 actionNorth_West_Window->setEnabled(1);
918 actionSouth_East_Window->setEnabled(1);
919 actionSouth_West_Window->setEnabled(1);
920 inverseButton->setEnabled(1);
922 goToCursorPushButton->setEnabled(1);
924 if (DataTree->selectedItems().size()) {
925 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
927 colorMapComboBox->setEnabled(1);
928 for (int i = 0; i < DataTree->topLevelItem(index)->childCount();i++)
930 if (DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "overlay" ||
931 DataTree->topLevelItem(index)->child(i)->data(1,Qt::UserRole).toString() == "fusion")
933 colorMapComboBox->setEnabled(0);
938 std::vector<double> origin;
939 std::vector<double> inputSpacing;
940 std::vector<int> inputSize;
941 std::vector<double> sizeMM;
944 QString inputSizeInBytes;
945 QString image = DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
947 if (mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size() > 1 || playMode == 1)
949 playButton->setEnabled(1);
950 frameRateLabel->setEnabled(1);
951 frameRateSpinBox->setEnabled(1);
955 playButton->setEnabled(0);
956 frameRateLabel->setEnabled(0);
957 frameRateSpinBox->setEnabled(0);
963 if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0])
965 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
966 dimension = imageSelected->GetNumberOfDimensions();
967 origin.resize(dimension);
968 inputSpacing.resize(dimension);
969 inputSize.resize(dimension);
970 sizeMM.resize(dimension);
971 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
972 for (int i = 0;i < dimension;i++)
974 origin[i] = imageSelected->GetOrigin()[i];
975 inputSpacing[i] = imageSelected->GetSpacing()[i];
976 inputSize[i] = imageSelected->GetSize()[i];
977 sizeMM[i] = inputSize[i]*inputSpacing[i];
978 NPixel *= inputSize[i];
980 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
982 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
984 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF();
985 dimension = imageSelected->GetNumberOfDimensions();
986 origin.resize(dimension);
987 inputSpacing.resize(dimension);
988 inputSize.resize(dimension);
989 sizeMM.resize(dimension);
990 pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsString().c_str();
991 for (int i = 0;i < dimension;i++)
993 origin[i] = imageSelected->GetOrigin()[i];
994 inputSpacing[i] = imageSelected->GetSpacing()[i];
995 inputSize[i] = imageSelected->GetSize()[i];
996 sizeMM[i] = inputSize[i]*inputSpacing[i];
997 NPixel *= inputSize[i];
999 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1001 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay")
1003 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay();
1004 dimension = imageSelected->GetNumberOfDimensions();
1005 origin.resize(dimension);
1006 inputSpacing.resize(dimension);
1007 inputSize.resize(dimension);
1008 sizeMM.resize(dimension);
1009 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1010 for (int i = 0;i < dimension;i++)
1012 origin[i] = imageSelected->GetOrigin()[i];
1013 inputSpacing[i] = imageSelected->GetSpacing()[i];
1014 inputSize[i] = imageSelected->GetSize()[i];
1015 sizeMM[i] = inputSize[i]*inputSpacing[i];
1016 NPixel *= inputSize[i];
1018 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1020 else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion")
1022 vvImage::Pointer imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
1023 dimension = imageSelected->GetNumberOfDimensions();
1024 origin.resize(dimension);
1025 inputSpacing.resize(dimension);
1026 inputSize.resize(dimension);
1027 sizeMM.resize(dimension);
1028 pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
1029 for (int i = 0;i < dimension;i++)
1031 origin[i] = imageSelected->GetOrigin()[i];
1032 inputSpacing[i] = imageSelected->GetSpacing()[i];
1033 inputSize[i] = imageSelected->GetSize()[i];
1034 sizeMM[i] = inputSize[i]*inputSpacing[i];
1035 NPixel *= inputSize[i];
1037 inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
1040 QString dim = QString::number(dimension) + " (";
1041 dim += pixelType + ")";
1043 infoPanel->setFileName(image);
1044 infoPanel->setDimension(dim);
1045 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1046 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1047 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1048 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1049 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1051 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1052 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1053 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1054 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1056 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1057 for (int i = 0; i < 4;i++)
1059 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1061 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1065 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1066 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1067 // DD(mSlicerManagers[index]->GetColorMap());
1068 // DD(mSlicerManagers[index]->GetPreset());
1069 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1070 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1072 infoPanel->setFileName(image);
1073 infoPanel->setDimension(dim);
1074 infoPanel->setSizePixel(GetVectorIntAsString(inputSize));
1075 infoPanel->setSizeMM(GetVectorDoubleAsString(sizeMM));
1076 infoPanel->setOrigin(GetVectorDoubleAsString(origin));
1077 infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
1078 infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
1080 landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
1081 mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetVTKImages().size());
1082 landmarksPanel->SetCurrentPath(mInputPathName.toStdString());
1083 landmarksPanel->SetCurrentImage(mSlicerManagers[index]->GetFileName().c_str());
1085 overlayPanel->getCurrentImageName(mSlicerManagers[index]->GetFileName().c_str());
1086 for (int i = 0; i < 4;i++)
1088 if (DataTree->selectedItems()[0]->data(i+1,Qt::CheckStateRole).toInt() > 0 || i == 3)
1090 mSlicerManagers[index]->UpdateInfoOnCursorPosition(i);
1094 windowSpinBox->setValue(mSlicerManagers[index]->GetColorWindow());
1095 levelSpinBox->setValue(mSlicerManagers[index]->GetColorLevel());
1096 presetComboBox->setCurrentIndex(mSlicerManagers[index]->GetPreset());
1097 colorMapComboBox->setCurrentIndex(mSlicerManagers[index]->GetColorMap());
1099 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
1101 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1102 overlayPanel->getVFProperty(mSlicerManagers[index]->GetSlicer(0)->GetVFSubSampling(),
1103 mSlicerManagers[index]->GetSlicer(0)->GetVFScale(),
1104 mSlicerManagers[index]->GetSlicer(0)->GetVFLog());
1108 overlayPanel->getVFName(mSlicerManagers[index]->GetVFName().c_str());
1109 overlayPanel->getVFProperty(-1,-1,-1);
1111 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
1113 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1114 overlayPanel->getOverlayProperty(mSlicerManagers[index]->GetOverlayColor());
1118 overlayPanel->getOverlayName(mSlicerManagers[index]->GetOverlayName().c_str());
1119 overlayPanel->getOverlayProperty(-1);
1121 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
1123 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1124 overlayPanel->getFusionProperty(mSlicerManagers[index]->GetFusionOpacity(),
1125 mSlicerManagers[index]->GetFusionColorMap(),
1126 mSlicerManagers[index]->GetFusionWindow(),
1127 mSlicerManagers[index]->GetFusionLevel());
1131 overlayPanel->getFusionName(mSlicerManagers[index]->GetFusionName().c_str());
1132 overlayPanel->getFusionProperty(-1, -1,-1,-1);
1136 //------------------------------------------------------------------------------
1138 //------------------------------------------------------------------------------
1139 void vvMainWindow::ShowDocumentation() {
1140 documentation->show();
1142 //------------------------------------------------------------------------------
1143 void vvMainWindow::ShowHelpDialog() {
1144 help_dialog->show();
1146 //------------------------------------------------------------------------------
1148 //------------------------------------------------------------------------------
1149 void vvMainWindow::ChangeViewMode() {
1150 QListIterator<int> it0(splitter_3->sizes());
1151 QListIterator<int> it1(splitter_3->sizes());
1154 while (it0.hasNext())
1158 while (it1.hasNext())
1167 size0.push_back(max0);
1169 size1.push_back(max1);
1171 splitter_3->setSizes(size0);
1172 OSplitter->setSizes(size1);
1173 DataTree->setColumnHidden(2,1);
1174 DataTree->setColumnHidden(3,1);
1175 DataTree->setColumnHidden(4,1);
1180 size0.push_back(int(max0/2));
1181 size0.push_back(int(max0/2));
1182 size1.push_back(int(max1/2));
1183 size1.push_back(int(max1/2));
1184 splitter_3->setSizes(size0);
1185 OSplitter->setSizes(size1);
1186 DataTree->setColumnHidden(2,0);
1187 DataTree->setColumnHidden(3,0);
1188 DataTree->setColumnHidden(4,0);
1191 //------------------------------------------------------------------------------
1193 //------------------------------------------------------------------------------
1194 QString vvMainWindow::GetSizeInBytes(unsigned long size) {
1195 QString result = "";// QString::number(size);
1196 //result += " bytes (";
1197 if (size > 1000000000)
1200 result += QString::number(size);
1201 result += "Gb";//)";
1203 else if (size > 1000000)
1206 result += QString::number(size);
1207 result += "Mb";//)";
1209 else if (size > 1000)
1212 result += QString::number(size);
1213 result += "kb";//)";
1217 //------------------------------------------------------------------------------
1219 //------------------------------------------------------------------------------
1220 QString vvMainWindow::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
1222 for (unsigned int i= 0; i < vectorDouble.size(); i++)
1226 result += QString::number(vectorDouble[i]);
1230 //------------------------------------------------------------------------------
1232 //------------------------------------------------------------------------------
1233 QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt) {
1235 for (unsigned int i= 0; i < vectorInt.size(); i++)
1239 result += QString::number(vectorInt[i]);
1243 //------------------------------------------------------------------------------
1245 //------------------------------------------------------------------------------
1246 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item) {
1247 QString id = item->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1248 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1250 if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString() == id)
1255 //------------------------------------------------------------------------------
1257 //------------------------------------------------------------------------------
1258 void vvMainWindow::DisplayChanged(QTreeWidgetItem *clicked_item, int column) {
1259 int index = GetSlicerIndexFromItem(clicked_item);
1260 if ( column >= COLUMN_CLOSE_IMAGE || column <= 0)
1262 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1264 QTreeWidgetItem* current_row=DataTree->topLevelItem(i);
1265 if (DataTree->topLevelItem(index) == current_row)
1267 vvSlicer* clicked_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1268 if (current_row == clicked_item)
1270 //If we just activated a slicer
1271 if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1273 mSlicerManagers[i]->UpdateSlicer(column-1,clicked_item->data(column,Qt::CheckStateRole).toInt());
1274 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1275 DisplaySliders(i,column-1);
1276 std::map<std::string,int> overlay_counts;
1277 for (int child = 0; child < current_row->childCount(); child++)
1279 std::string overlay_type =
1280 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1281 overlay_counts[overlay_type]++;
1282 current_row->child(child)->setData(column,Qt::CheckStateRole,
1283 current_row->data(column,Qt::CheckStateRole));
1284 clicked_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,true);
1287 else //We don't allow simply desactivating a slicer
1289 clicked_item->setData(column,Qt::CheckStateRole,2);
1293 //if we clicked on the vector(or overlay) and not the image
1296 if (clicked_item->data(column,Qt::CheckStateRole).toInt())
1298 current_row->setData(column,Qt::CheckStateRole,2);
1299 mSlicerManagers[i]->UpdateSlicer(column-1,2);
1300 mSlicerManagers[i]->UpdateInfoOnCursorPosition(column-1);
1301 DisplaySliders(i,column-1);
1303 int vis = clicked_item->data(column,Qt::CheckStateRole).toInt();
1304 std::string overlay_type = clicked_item->data(1,Qt::UserRole).toString().toStdString();
1305 int overlay_index=0;
1306 for (int child = 0; child < current_row->childCount(); child++)
1308 if (current_row->child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1310 if (current_row->child(child) == clicked_item) break;
1312 clicked_slicer->SetActorVisibility(
1313 clicked_item->data(1,Qt::UserRole).toString().toStdString(), overlay_index-1,vis);
1316 else if (current_row->data(column,Qt::CheckStateRole).toInt() > 0)
1318 current_row->setData(column,Qt::CheckStateRole,0);
1319 mSlicerManagers[i]->UpdateSlicer(column-1,0);
1320 std::map<std::string,int> overlay_counts;
1321 for (int child = 0; child < current_row->childCount(); child++)
1323 std::string overlay_type =
1324 current_row->child(child)->data(1,Qt::UserRole).toString().toStdString();
1325 overlay_counts[overlay_type]++;
1326 current_row->child(child)->setData(column,Qt::CheckStateRole,0);
1327 vvSlicer * current_slicer=mSlicerManagers[i]->GetSlicer(column-1);
1328 current_slicer->SetActorVisibility(overlay_type,overlay_counts[overlay_type]-1,false);
1331 //mSlicerManagers[i]->SetColorMap(-1);
1332 mSlicerManagers[i]->SetColorMap();
1334 mSlicerManagers[index]->GetSlicer(column-1)->Render();
1336 //------------------------------------------------------------------------------
1338 void vvMainWindow::InitSlicers()
1340 if (mSlicerManagers.size())
1342 mSlicerManagers.back()->GenerateDefaultLookupTable();
1344 mSlicerManagers.back()->SetSlicerWindow(0,NOViewWidget->GetRenderWindow());
1345 mSlicerManagers.back()->SetSlicerWindow(1,NEViewWidget->GetRenderWindow());
1346 mSlicerManagers.back()->SetSlicerWindow(2,SOViewWidget->GetRenderWindow());
1347 mSlicerManagers.back()->SetSlicerWindow(3,SEViewWidget->GetRenderWindow());
1351 //------------------------------------------------------------------------------
1352 void vvMainWindow::InitDisplay() {
1353 if (mSlicerManagers.size())
1355 //BE CAREFUL : this is absolutely necessary to set the interactor style
1356 //in order to have the same style instanciation for all SlicerManagers in
1358 for (int j = 0; j < 4; j++)
1360 vvInteractorStyleNavigator* style = vvInteractorStyleNavigator::New();
1361 style->SetAutoAdjustCameraClippingRange(1);
1362 bool AlreadySelected = false;
1363 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1365 mSlicerManagers[i]->SetInteractorStyleNavigator(j,style);
1367 //select the image only if previous are not selected
1368 if (DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 1)
1370 mSlicerManagers[i]->UpdateSlicer(j,1);
1371 AlreadySelected = true;
1373 else if (i == DataTree->topLevelItemCount()-1 && !AlreadySelected)
1375 if (DataTree->selectedItems().size() == 0)
1376 DataTree->topLevelItem(i)->setSelected(1);
1377 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,2);
1378 mSlicerManagers[i]->UpdateSlicer(j,1);
1379 DisplaySliders(i,j);
1383 DataTree->topLevelItem(i)->setData(j+1,Qt::CheckStateRole,0);
1384 mSlicerManagers[i]->UpdateSlicer(j,0);
1391 //------------------------------------------------------------------------------
1393 //------------------------------------------------------------------------------
1394 void vvMainWindow::DisplaySliders(int slicer, int window) {
1396 mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
1397 int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
1401 tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
1402 int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetTSlice();
1403 bool showHorizontal = false;
1404 bool showVertical = false;
1405 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1406 || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2
1407 && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME
1408 && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME))
1409 showVertical = true;
1410 if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3
1411 || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME
1412 || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME)
1413 showHorizontal = true;
1416 verticalSliders[window]->show();
1418 verticalSliders[window]->hide();
1419 verticalSliders[window]->setRange(range[0],range[1]);
1420 verticalSliders[window]->setValue(position);
1423 horizontalSliders[window]->show();
1425 horizontalSliders[window]->hide();
1426 horizontalSliders[window]->setRange(tRange[0],tRange[1]);
1427 horizontalSliders[window]->setValue(tPosition);
1429 //------------------------------------------------------------------------------
1431 //------------------------------------------------------------------------------
1432 void vvMainWindow::CloseImage(QTreeWidgetItem* item, int column) {
1433 int index = GetSlicerIndexFromItem(item);
1435 if (DataTree->topLevelItem(index) != item)
1437 QString warning = "Do you really want to close the overlay : ";
1438 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1439 QMessageBox msgBox(QMessageBox::Warning, tr("Close Overlay"),
1441 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1442 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1443 if (msgBox.exec() == QMessageBox::AcceptRole)
1445 std::string overlay_type=item->data(1,Qt::UserRole).toString().toStdString();
1446 int overlay_index=0;
1447 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1449 if (DataTree->topLevelItem(index)->\
1450 child(child)->data(1,Qt::UserRole).toString().toStdString() == overlay_type)
1452 if (DataTree->topLevelItem(index)->child(child) == item) break;
1454 mSlicerManagers[index]->RemoveActor(overlay_type, overlay_index-1);
1455 mSlicerManagers[index]->SetColorMap(0);
1456 DataTree->topLevelItem(index)->takeChild(DataTree->topLevelItem(index)->indexOfChild(item));
1457 mSlicerManagers[index]->Render();
1460 else if (DataTree->topLevelItemCount() <= 1)
1462 QString warning = "Do you really want to close the image : ";
1463 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1464 warning += "\nThis is the last image, you're about to close vv !!!";
1465 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1467 msgBox.addButton(tr("Close vv"), QMessageBox::AcceptRole);
1468 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1469 if (msgBox.exec() == QMessageBox::AcceptRole)
1476 QString warning = "Do you really want to close the image : ";
1477 warning += item->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1478 QMessageBox msgBox(QMessageBox::Warning, tr("Close Image"),
1480 msgBox.addButton(tr("Close"), QMessageBox::AcceptRole);
1481 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1482 if (msgBox.exec() == QMessageBox::AcceptRole)
1485 // Tell tools that we close an image
1486 emit AnImageIsBeingClosed(mSlicerManagers[index]);
1488 std::vector<vvSlicerManager*>::iterator Manageriter = mSlicerManagers.begin();
1489 DataTree->takeTopLevelItem(index);
1490 for (int i = 0; i < index; i++)
1494 linkPanel->removeImage(index);
1495 mSlicerManagers[index]->RemoveActors();
1496 delete mSlicerManagers[index];
1497 mSlicerManagers.erase(Manageriter);
1504 //------------------------------------------------------------------------------
1506 //------------------------------------------------------------------------------
1507 void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column) {
1508 // int index = GetSlicerIndexFromItem(item);
1509 // QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1510 // if (item->data(1,Qt::UserRole).toString() == "vector")
1511 // mSlicerManagers[index]->ReloadVF();
1513 // mSlicerManagers[index]->Reload();
1515 // QApplication::restoreOverrideCursor();
1516 int index = GetSlicerIndexFromItem(item);
1517 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1518 QString role=item->data(1,Qt::UserRole).toString();
1519 if ( role == "vector")
1520 mSlicerManagers[index]->ReloadVF();
1521 else if (role == "overlay")
1522 mSlicerManagers[index]->ReloadOverlay();
1523 else if (role == "fusion")
1524 mSlicerManagers[index]->ReloadFusion();
1526 mSlicerManagers[index]->Reload();
1527 QApplication::restoreOverrideCursor();
1529 //------------------------------------------------------------------------------
1531 // void vvMainWindow::CropImage()
1533 // int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1534 // vvCropDialog crop(mSlicerManagers,index);
1536 // AddImage(crop.GetOutput(),"cropped.mhd");
1539 //------------------------------------------------------------------------------
1540 void vvMainWindow::SplitImage() {
1541 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1542 int dim = mSlicerManagers[index]->GetDimension();
1543 QString warning = "Do you really want to split the ";
1544 warning += QString::number(dim) + "D image ";
1545 warning += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString() + " into ";
1546 warning += QString::number(mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1]) + " ";
1547 warning += QString::number(dim-1) + "D images.";
1548 QMessageBox msgBox(QMessageBox::Warning, tr("Split Image"),
1550 msgBox.addButton(tr("Split"), QMessageBox::AcceptRole);
1551 msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
1552 if (msgBox.exec() == QMessageBox::AcceptRole)
1554 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1557 std::string filename = DataTree->selectedItems()[0]->data(0,Qt::UserRole).toString().toStdString();
1558 int numberOfSlice = mSlicerManagers[index]->GetSlicer(0)->GetImage()->GetSize()[dim-1];
1559 std::string path = itksys::SystemTools::GetFilenamePath(
1562 path += DataTree->selectedItems()[0]->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString().toStdString();
1564 path += itksys::SystemTools::GetFilenameLastExtension(
1567 typedef itk::NumericSeriesFileNames NameGeneratorType;
1568 NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
1569 nameGenerator->SetSeriesFormat(path.c_str());
1570 nameGenerator->SetStartIndex(0);
1571 nameGenerator->SetEndIndex(numberOfSlice-1);
1572 nameGenerator->SetIncrementIndex(1);
1574 for (int i = 0; i < numberOfSlice; i++)
1576 vvSlicerManager* imageManager = new vvSlicerManager(4);
1577 imageManager->SetExtractedImage(nameGenerator->GetFileNames()[i],
1578 mSlicerManagers[index]->GetSlicer(0)->GetImage(), i);
1579 mSlicerManagers.push_back(imageManager);
1581 //create an item in the tree with good settings
1582 QTreeWidgetItem *item = new QTreeWidgetItem();
1583 item->setData(0,Qt::UserRole,nameGenerator->GetFileNames()[i].c_str());
1584 std::string fileI = itksys::SystemTools::GetFilenameWithoutLastExtension(
1585 nameGenerator->GetFileNames()[i]).c_str();
1586 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,fileI.c_str());
1587 for (int j = 1; j <= 4; j++)
1589 for (int i = 0; i < DataTree->topLevelItemCount(); i++)
1591 DataTree->topLevelItem(i)->setData(j,Qt::CheckStateRole,0);
1593 item->setData(j,Qt::CheckStateRole,2);
1596 //Create the buttons for reload and close
1597 QTreePushButton* cButton = new QTreePushButton;
1598 cButton->setItem(item);
1599 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1600 cButton->setToolTip(tr("close image"));
1601 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1602 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1603 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1605 QTreePushButton* rButton = new QTreePushButton;
1606 rButton->setItem(item);
1607 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1608 rButton->setToolTip(tr("reload image"));
1609 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1610 rButton->setEnabled(false);
1611 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1612 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1614 DataTree->addTopLevelItem(item);
1615 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1616 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1618 //set the id of the image
1619 QString id = nameGenerator->GetFileNames()[i].c_str() + QString::number(mSlicerManagers.size()-1);
1620 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1621 mSlicerManagers.back()->SetId(id.toStdString());
1622 linkPanel->addImage(fileI, id.toStdString());
1623 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
1624 this,SLOT(CurrentImageChanged(std::string)));
1625 connect(mSlicerManagers.back(),SIGNAL(
1626 UpdatePosition(int, double, double, double, double, double, double, double)),this,
1627 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
1628 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
1629 this, SLOT(VectorChanged(int,double,double,double, double)));
1630 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
1631 this, SLOT(OverlayChanged(int,double,double)));
1632 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
1633 this, SLOT(FusionChanged(int,double)));
1634 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
1635 this,SLOT(WindowsChanged(int, int, int)));
1636 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
1637 this,SLOT(WindowLevelChanged(double, double, int, int)));
1638 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
1639 this,SLOT(UpdateSlice(int,int)));
1640 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
1641 this,SLOT(UpdateTSlice(int, int)));
1642 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
1643 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
1644 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
1645 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
1646 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
1648 qApp->processEvents();
1651 qApp->processEvents();
1653 QApplication::restoreOverrideCursor();
1657 QApplication::restoreOverrideCursor();
1658 QString error = "Cannot split file (dimensions must be greater than 2) ";
1659 QMessageBox::information(this,tr("Splitting problem"),error);
1663 //------------------------------------------------------------------------------
1665 //------------------------------------------------------------------------------
1666 void vvMainWindow::MousePositionChanged(int visibility,double x, double y, double z, double X, double Y, double Z , double value) {
1667 infoPanel->setCurrentInfo(visibility,x,y,z,X,Y,Z,value);
1669 //------------------------------------------------------------------------------
1671 //------------------------------------------------------------------------------
1672 void vvMainWindow::VectorChanged(int visibility,double x, double y, double z, double value) {
1673 overlayPanel->getCurrentVectorInfo(visibility,x,y,z,value);
1675 //------------------------------------------------------------------------------
1677 //------------------------------------------------------------------------------
1678 void vvMainWindow::OverlayChanged(int visibility, double valueOver, double valueRef) {
1679 overlayPanel->getCurrentOverlayInfo(visibility,valueOver, valueRef);
1681 //------------------------------------------------------------------------------
1683 //------------------------------------------------------------------------------
1684 void vvMainWindow::FusionChanged(int visibility, double value) {
1685 overlayPanel->getCurrentFusionInfo(visibility,value);
1687 //------------------------------------------------------------------------------
1689 //------------------------------------------------------------------------------
1690 void vvMainWindow::WindowsChanged(int window, int view, int slice) {
1691 infoPanel->setViews(window, view, slice);
1693 //------------------------------------------------------------------------------
1695 //------------------------------------------------------------------------------
1696 void vvMainWindow::WindowLevelChanged(double window, double level,int preset,int colormap) {
1697 windowSpinBox->setValue(window);
1698 levelSpinBox->setValue(level);
1699 colorMapComboBox->setCurrentIndex(colormap);
1700 presetComboBox->setCurrentIndex(preset);
1702 //------------------------------------------------------------------------------
1704 //------------------------------------------------------------------------------
1705 void vvMainWindow::WindowLevelEdited() {
1706 presetComboBox->setCurrentIndex(6);
1707 UpdateWindowLevel();
1709 //------------------------------------------------------------------------------
1711 //------------------------------------------------------------------------------
1712 void vvMainWindow::UpdateWindowLevel() {
1713 if (DataTree->selectedItems().size())
1715 if (presetComboBox->currentIndex() == 7) //For ventilation
1716 colorMapComboBox->setCurrentIndex(5);
1717 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1718 mSlicerManagers[index]->SetColorWindow(windowSpinBox->value());
1719 mSlicerManagers[index]->SetColorLevel(levelSpinBox->value());
1720 mSlicerManagers[index]->SetPreset(presetComboBox->currentIndex());
1721 mSlicerManagers[index]->Render();
1724 //------------------------------------------------------------------------------
1726 //------------------------------------------------------------------------------
1727 void vvMainWindow::UpdateColorMap() {
1728 if (DataTree->selectedItems().size())
1730 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1731 mSlicerManagers[index]->SetColorMap(colorMapComboBox->currentIndex());
1732 mSlicerManagers[index]->Render();
1735 //------------------------------------------------------------------------------
1736 void vvMainWindow::SwitchWindowLevel() {
1737 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1738 int window = mSlicerManagers[index]->GetColorWindow();
1739 presetComboBox->setCurrentIndex(6);
1740 windowSpinBox->setValue(-window);
1741 UpdateWindowLevel();
1743 //------------------------------------------------------------------------------
1745 //------------------------------------------------------------------------------
1746 void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps) {
1747 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
1749 if (mSlicerManagers[i]->GetId() == id)
1751 //mSlicerManagers[i]->SetTSlice(temps);
1752 mSlicerManagers[i]->GetSlicer(slicer)->SetCurrentPosition(x,y,z,temps);
1753 mSlicerManagers[i]->UpdateViews(0,slicer);
1758 //------------------------------------------------------------------------------
1760 //------------------------------------------------------------------------------
1761 void vvMainWindow::ShowContextMenu(QPoint point) {
1762 if (!DataTree->selectedItems().size())
1764 contextActions[1]->setEnabled(0);
1765 contextActions[2]->setEnabled(0);
1766 contextActions[3]->setEnabled(0);
1767 contextActions[4]->setEnabled(0);
1768 contextActions[5]->setEnabled(0);
1769 contextActions[6]->setEnabled(0);
1770 contextActions[7]->setEnabled(0);
1774 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1775 contextActions[1]->setEnabled(1);
1776 contextActions[2]->setEnabled(
1777 DataTree->itemWidget(DataTree->selectedItems()[0],
1778 COLUMN_RELOAD_IMAGE)->isEnabled());
1779 contextActions[3]->setEnabled(1);
1780 contextActions[5]->setEnabled(1);
1781 contextActions[6]->setEnabled(1);
1782 contextActions[7]->setEnabled(1);
1784 if (mSlicerManagers[index]->GetDimension() < 3)
1785 contextActions[4]->setEnabled(0);
1787 contextActions[4]->setEnabled(1);
1789 contextMenu.exec(QCursor::pos());
1791 //------------------------------------------------------------------------------
1793 //------------------------------------------------------------------------------
1794 void vvMainWindow::CloseImage() {
1795 CloseImage(DataTree->selectedItems()[0],0);
1797 //------------------------------------------------------------------------------
1799 //------------------------------------------------------------------------------
1800 void vvMainWindow::ReloadImage() {
1801 ReloadImage(DataTree->selectedItems()[0],0);
1803 //------------------------------------------------------------------------------
1805 //------------------------------------------------------------------------------
1806 void vvMainWindow::SelectOverlayImage() {
1807 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1809 //check if one overlay image is added
1810 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1811 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "overlay")
1813 QString error = "Cannot add more than one compared image\n";
1814 error += "Please remove first ";
1815 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1816 QMessageBox::information(this,tr("Problem adding compared image !"),error);
1820 QString Extensions = EXTENSIONS;
1821 Extensions += ";;All Files (*)";
1822 QString file = QFileDialog::getOpenFileName(this,tr("Load Overlay image"),mInputPathName,Extensions);
1823 if (!file.isEmpty())
1824 AddOverlayImage(index,file);
1826 //------------------------------------------------------------------------------
1828 //------------------------------------------------------------------------------
1829 void vvMainWindow::AddOverlayImage(int index, QString file) {
1830 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1831 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1832 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1833 reader->SetFileName(file.toStdString().c_str());
1834 reader->ReadImageInformation();
1835 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1836 int dimension = reader->GetNumberOfDimensions();
1837 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1838 vvProgressDialog progress("Opening " + file.toStdString());
1839 qApp->processEvents();
1841 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1842 if (mSlicerManagers[index]->SetOverlay(file.toStdString(),dimension, component))
1844 //create an item in the tree with good settings
1845 QTreeWidgetItem *item = new QTreeWidgetItem();
1846 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1847 item->setData(1,Qt::UserRole,tr("overlay"));
1848 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1849 qApp->processEvents();
1851 for (int j = 1; j <= 4; j++)
1853 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1854 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("overlay",0,
1855 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1858 //Create the buttons for reload and close
1859 qApp->processEvents();
1860 QTreePushButton* cButton = new QTreePushButton;
1861 cButton->setItem(item);
1862 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1863 cButton->setToolTip(tr("close image"));
1864 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1865 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1866 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1868 QTreePushButton* rButton = new QTreePushButton;
1869 rButton->setItem(item);
1870 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1871 rButton->setToolTip(tr("reload image"));
1872 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1873 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1874 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1876 DataTree->topLevelItem(index)->setExpanded(1);
1877 DataTree->topLevelItem(index)->addChild(item);
1878 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1879 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1881 //set the id of the image
1882 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1883 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1885 qApp->processEvents();
1887 QApplication::restoreOverrideCursor();
1891 QApplication::restoreOverrideCursor();
1892 QString error = "Cannot import the new image.\n";
1893 error += mSlicerManagers[index]->GetLastError().c_str();
1894 QMessageBox::information(this,tr("Problem reading image !"),error);
1898 void vvMainWindow::AddFusionImage()
1900 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1902 //check if one fusion image is added
1903 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
1904 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "fusion")
1906 QString error = "Cannot add more than one fusion image\n";
1907 error += "Please remove first ";
1908 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
1909 QMessageBox::information(this,tr("Problem adding fusion image !"),error);
1913 QString Extensions = EXTENSIONS;
1914 Extensions += ";;All Files (*)";
1915 QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
1916 if (!file.isEmpty())
1918 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
1919 itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
1920 file.toStdString().c_str(), itk::ImageIOFactory::ReadMode);
1921 reader->SetFileName(file.toStdString().c_str());
1922 reader->ReadImageInformation();
1923 std::string component = reader->GetComponentTypeAsString(reader->GetComponentType());
1926 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
1927 vvProgressDialog progress("Opening fusion");
1928 qApp->processEvents();
1930 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
1931 if (mSlicerManagers[index]->SetFusion(file.toStdString(),
1932 reader->GetNumberOfDimensions(), component))
1934 //create an item in the tree with good settings
1935 QTreeWidgetItem *item = new QTreeWidgetItem();
1936 item->setData(0,Qt::UserRole,file.toStdString().c_str());
1937 item->setData(1,Qt::UserRole,tr("fusion"));
1938 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
1939 qApp->processEvents();
1941 for (int j = 1; j <= 4; j++)
1943 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
1944 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("fusion",0,
1945 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
1948 //Create the buttons for reload and close
1949 qApp->processEvents();
1950 QTreePushButton* cButton = new QTreePushButton;
1951 cButton->setItem(item);
1952 cButton->setColumn(COLUMN_CLOSE_IMAGE);
1953 cButton->setToolTip(tr("close image"));
1954 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
1955 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1956 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
1958 QTreePushButton* rButton = new QTreePushButton;
1959 rButton->setItem(item);
1960 rButton->setColumn(COLUMN_RELOAD_IMAGE);
1961 rButton->setToolTip(tr("reload image"));
1962 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
1963 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
1964 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
1966 DataTree->topLevelItem(index)->setExpanded(1);
1967 DataTree->topLevelItem(index)->addChild(item);
1968 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
1969 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
1971 //set the id of the image
1972 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
1973 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
1975 qApp->processEvents();
1977 QApplication::restoreOverrideCursor();
1981 QApplication::restoreOverrideCursor();
1982 QString error = "Cannot import the new image.\n";
1983 error += mSlicerManagers[index]->GetLastError().c_str();
1984 QMessageBox::information(this,tr("Problem reading image !"),error);
1989 QString error = "Cannot import the new image.\n";
1990 QMessageBox::information(this,tr("Problem reading image !"),error);
1996 void vvMainWindow::OpenField()
1998 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
1999 //check if a vector field has already been added
2000 for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
2001 if (DataTree->topLevelItem(index)->child(child)->data(1,Qt::UserRole).toString() == "vector")
2003 QString error = "Cannot add more than one vector field\n";
2004 error += "Please remove first ";
2005 error += DataTree->topLevelItem(index)->child(child)->data(COLUMN_IMAGE_NAME,Qt::DisplayRole).toString();
2006 QMessageBox::information(this,tr("Problem adding vector field!"),error);
2010 QString Extensions = "Images ( *.mhd)";
2011 Extensions += ";;Images ( *.vf)";
2012 QString file = QFileDialog::getOpenFileName(this,tr("Load deformation field"),mInputPathName,Extensions);
2013 if (!file.isEmpty())
2014 AddField(file,index);
2017 void vvMainWindow::AddFieldEntry(QString filename,int index,bool from_disk)
2019 //create an item in the tree with good settings
2020 QTreeWidgetItem *item = new QTreeWidgetItem();
2021 item->setData(0,Qt::UserRole,filename.toStdString().c_str());
2022 item->setData(1,Qt::UserRole,tr("vector"));
2023 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename);
2024 qApp->processEvents();
2026 for (int j = 1; j <= 4; j++)
2028 item->setData(j,Qt::CheckStateRole,DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole));
2029 mSlicerManagers[index]->GetSlicer(j-1)->SetActorVisibility("vector",0,
2030 DataTree->topLevelItem(index)->data(j,Qt::CheckStateRole).toInt());
2033 //Create the buttons for reload and close
2034 qApp->processEvents();
2035 QTreePushButton* cButton = new QTreePushButton;
2036 cButton->setItem(item);
2037 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2038 cButton->setToolTip(tr("close vector field"));
2039 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2040 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2041 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2043 QTreePushButton* rButton = new QTreePushButton;
2044 rButton->setItem(item);
2045 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2046 rButton->setToolTip(tr("reload vector field"));
2047 rButton->setEnabled(from_disk);
2048 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2049 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2050 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2052 DataTree->topLevelItem(index)->setExpanded(1);
2053 DataTree->topLevelItem(index)->addChild(item);
2054 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2055 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2057 //set the id of the image
2058 QString id = DataTree->topLevelItem(index)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString();
2059 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2061 qApp->processEvents();
2063 QApplication::restoreOverrideCursor();
2066 void vvMainWindow::AddField(vvImage::Pointer vf,QString file,int index)
2068 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2069 vvSlicerManager* imageManager = mSlicerManagers[index];
2070 if (imageManager->SetVF(vf,file.toStdString()))
2072 AddFieldEntry(file,index,false);
2076 QString error = "Cannot import the vector field for this image.\n";
2077 error += imageManager->GetLastError().c_str();
2078 QMessageBox::information(this,tr("Problem reading VF !"),error);
2080 QApplication::restoreOverrideCursor();
2083 void vvMainWindow::AddField(QString file,int index)
2085 if (QFile::exists(file))
2087 mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
2089 //init the progress events
2090 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2091 vvProgressDialog progress("Opening " + file.toStdString());
2092 qApp->processEvents();
2094 //read the vector and put it in the current mSlicerManager
2095 vvSlicerManager* imageManager = mSlicerManagers[index];
2096 qApp->processEvents();
2098 std::string filename = itksys::SystemTools::GetFilenameWithoutExtension(file.toStdString()).c_str();
2099 if (imageManager->SetVF(file.toStdString()))
2101 imageManager->Render();
2102 AddFieldEntry(file,index,true);
2106 QApplication::restoreOverrideCursor();
2107 QString error = "Cannot import the vector field for this image.\n";
2108 error += imageManager->GetLastError().c_str();
2109 QMessageBox::information(this,tr("Problem reading VF !"),error);
2113 QMessageBox::information(this,tr("Problem reading VF !"),"File doesn't exist!");
2116 //------------------------------------------------------------------------------
2118 //------------------------------------------------------------------------------
2119 void vvMainWindow::SetVFProperty(int subsampling, int scale, int log) {
2120 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2121 if (mSlicerManagers[index]->GetSlicer(0)->GetVF())
2123 for (int i = 0; i < 4; i++)
2125 mSlicerManagers[index]->GetSlicer(i)->SetVFSubSampling(subsampling);
2126 mSlicerManagers[index]->GetSlicer(i)->SetVFScale(scale);
2128 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(1);
2130 mSlicerManagers[index]->GetSlicer(i)->SetVFLog(0);
2134 //------------------------------------------------------------------------------
2136 //------------------------------------------------------------------------------
2137 void vvMainWindow::SetOverlayProperty(int color) {
2138 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2139 if (mSlicerManagers[index]->GetSlicer(0)->GetOverlay())
2141 mSlicerManagers[index]->SetOverlayColor(color);
2142 mSlicerManagers[index]->SetColorMap(0);
2143 mSlicerManagers[index]->Render();
2146 //------------------------------------------------------------------------------
2148 //------------------------------------------------------------------------------
2149 void vvMainWindow::SetFusionProperty(int opacity, int colormap,double window, double level) {
2150 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2151 if (mSlicerManagers[index]->GetSlicer(0)->GetFusion())
2153 mSlicerManagers[index]->SetFusionOpacity(opacity);
2154 mSlicerManagers[index]->SetFusionColorMap(colormap);
2155 mSlicerManagers[index]->SetFusionWindow(window);
2156 mSlicerManagers[index]->SetFusionLevel(level);
2157 mSlicerManagers[index]->SetColorMap(0);
2158 mSlicerManagers[index]->Render();
2161 //------------------------------------------------------------------------------
2163 //------------------------------------------------------------------------------
2164 void vvMainWindow::SaveAs() {
2165 if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector")
2167 QMessageBox::warning(this,tr("Unsupported type"),tr("Sorry, saving a vector field is unsupported for the moment"));
2171 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2172 int dimension = mSlicerManagers[index]->GetDimension();
2173 QStringList OutputListeFormat;
2174 OutputListeFormat.clear();
2177 OutputListeFormat.push_back(".mhd");
2181 OutputListeFormat.push_back(".bmp");
2182 OutputListeFormat.push_back(".png");
2183 OutputListeFormat.push_back(".jpeg");
2184 OutputListeFormat.push_back(".tif");
2185 OutputListeFormat.push_back(".mhd");
2186 OutputListeFormat.push_back(".hdr");
2187 OutputListeFormat.push_back(".vox");
2189 else if (dimension == 3)
2191 OutputListeFormat.push_back(".mhd");
2192 OutputListeFormat.push_back(".hdr");
2193 OutputListeFormat.push_back(".vox");
2195 else if (dimension == 4)
2197 OutputListeFormat.push_back(".mhd");
2199 QString Extensions = "AllFiles(*.*)";
2200 for (int i = 0; i < OutputListeFormat.count(); i++)
2202 Extensions += ";;Images ( *";
2203 Extensions += OutputListeFormat[i];
2206 QString fileName = QFileDialog::getSaveFileName(this,
2208 mSlicerManagers[index]->GetFileName().c_str(),
2210 if (!fileName.isEmpty())
2212 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
2213 if (OutputListeFormat.contains(
2214 fileformat.c_str()))
2216 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2217 std::string action = "Saving";
2218 vvProgressDialog progress("Saving "+fileName.toStdString());
2219 qApp->processEvents();
2220 vvImageWriter *writer = new vvImageWriter;
2221 writer->SetOutputFileName(fileName.toStdString());
2222 writer->SetInput(mSlicerManagers[index]->GetImage());
2224 QApplication::restoreOverrideCursor();
2225 if (writer->GetLastError().size())
2227 QString error = "Saving did not succeed\n";
2228 error += writer->GetLastError().c_str();
2229 QMessageBox::information(this,tr("Saving Problem"),error);
2235 QString error = fileformat.c_str();
2236 if (error.isEmpty())
2237 error += "no file format specified !";
2239 error += " format unknown !!!\n";
2240 QMessageBox::information(this,tr("Saving Problem"),error);
2245 //------------------------------------------------------------------------------
2247 //------------------------------------------------------------------------------
2248 void vvMainWindow::AddLink(QString image1,QString image2) {
2249 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2251 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2253 mSlicerManagers[i]->AddLink(image2.toStdString());
2255 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2257 mSlicerManagers[i]->AddLink(image1.toStdString());
2261 //------------------------------------------------------------------------------
2263 //------------------------------------------------------------------------------
2264 void vvMainWindow::RemoveLink(QString image1,QString image2) {
2265 for (unsigned int i = 0; i < mSlicerManagers.size();i++)
2267 if (image1.toStdString() == mSlicerManagers[i]->GetId())
2269 mSlicerManagers[i]->RemoveLink(image2.toStdString());
2271 if (image2.toStdString() == mSlicerManagers[i]->GetId())
2273 mSlicerManagers[i]->RemoveLink(image1.toStdString());
2277 //------------------------------------------------------------------------------
2279 void vvMainWindow::HorizontalSliderMoved(int value,int column, int slicer_index)
2281 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2283 if (DataTree->topLevelItem(i)->data(column,Qt::CheckStateRole).toInt() > 1)
2285 for (int j = 0; j < 4; j++)
2287 mSlicerManagers[i]->SetTSliceInSlicer(value,j);
2288 //if (mSlicerManagers[i]->GetSlicer(j)->GetImageActor()->GetVisibility())
2289 //UpdateTSlice(j,value);
2291 mSlicerManagers[i]->GetSlicer(slicer_index)->Render();
2297 //------------------------------------------------------------------------------
2298 void vvMainWindow::NOHorizontalSliderMoved() {
2299 HorizontalSliderMoved(NOHorizontalSlider->value(),COLUMN_UL_VIEW,0);
2301 //------------------------------------------------------------------------------
2303 //------------------------------------------------------------------------------
2304 void vvMainWindow::NEHorizontalSliderMoved() {
2305 HorizontalSliderMoved(NEHorizontalSlider->value(),COLUMN_UR_VIEW,1);
2307 //------------------------------------------------------------------------------
2309 //------------------------------------------------------------------------------
2310 void vvMainWindow::SOHorizontalSliderMoved() {
2311 HorizontalSliderMoved(SOHorizontalSlider->value(),COLUMN_DL_VIEW,2);
2313 //------------------------------------------------------------------------------
2315 //------------------------------------------------------------------------------
2316 void vvMainWindow::SEHorizontalSliderMoved() {
2317 HorizontalSliderMoved(SEHorizontalSlider->value(),COLUMN_DR_VIEW,3);
2319 //------------------------------------------------------------------------------
2321 //------------------------------------------------------------------------------
2322 void vvMainWindow::NOVerticalSliderChanged() {
2323 int value = NOVerticalSlider->value();
2324 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2326 if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
2328 mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
2329 mSlicerManagers[i]->UpdateSlice(0); // <-- DS add this. Not too much update ?
2334 //------------------------------------------------------------------------------
2336 //------------------------------------------------------------------------------
2337 void vvMainWindow::NEVerticalSliderChanged() {
2338 int value = NEVerticalSlider->value();
2339 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2341 if (DataTree->topLevelItem(i)->data(COLUMN_UR_VIEW,Qt::CheckStateRole).toInt() > 1)
2343 mSlicerManagers[i]->GetSlicer(1)->SetSlice(value);
2348 //------------------------------------------------------------------------------
2350 //------------------------------------------------------------------------------
2351 void vvMainWindow::SOVerticalSliderChanged() {
2352 int value = SOVerticalSlider->value();
2353 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2355 if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
2357 mSlicerManagers[i]->GetSlicer(2)->SetSlice(value);
2362 //------------------------------------------------------------------------------
2364 //------------------------------------------------------------------------------
2365 void vvMainWindow::SEVerticalSliderChanged() {
2366 int value = SEVerticalSlider->value();
2367 for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
2369 if (DataTree->topLevelItem(i)->data(COLUMN_DR_VIEW,Qt::CheckStateRole).toInt() > 1)
2371 mSlicerManagers[i]->GetSlicer(3)->SetSlice(value);
2376 //------------------------------------------------------------------------------
2378 //------------------------------------------------------------------------------
2379 void vvMainWindow::UpdateSlice(int slicer, int slice) {
2381 if (slice != NOVerticalSlider->value())
2382 NOVerticalSlider->setValue(slice);
2384 else if (slicer == 1)
2385 NEVerticalSlider->setValue(slice);
2386 else if (slicer == 2)
2387 SOVerticalSlider->setValue(slice);
2388 else if (slicer == 3)
2389 SEVerticalSlider->setValue(slice);
2391 //------------------------------------------------------------------------------
2393 //------------------------------------------------------------------------------
2394 void vvMainWindow::UpdateTSlice(int slicer, int slice) {
2398 NOHorizontalSlider->setValue(slice);
2401 NEHorizontalSlider->setValue(slice);
2404 SOHorizontalSlider->setValue(slice);
2407 SEHorizontalSlider->setValue(slice);
2411 //------------------------------------------------------------------------------
2413 //------------------------------------------------------------------------------
2414 void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax) {
2415 int position = int((min+max)/2);
2416 int tPosition = int((tmin+tmax)/2);
2419 NOVerticalSlider->setValue(position);
2420 NOVerticalSlider->setRange(min,max);
2421 NOHorizontalSlider->setRange(tmin,tmax);
2422 NOHorizontalSlider->setValue(tPosition);
2424 else if (slicer == 1)
2426 NEVerticalSlider->setValue(position);
2427 NEVerticalSlider->setRange(min,max);
2428 NEHorizontalSlider->setRange(tmin,tmax);
2429 NEHorizontalSlider->setValue(tPosition);
2431 else if (slicer == 2)
2433 SOVerticalSlider->setValue(position);
2434 SOVerticalSlider->setRange(min,max);
2435 SOHorizontalSlider->setRange(tmin,tmax);
2436 SOHorizontalSlider->setValue(tPosition);
2438 else if (slicer == 3)
2440 SEVerticalSlider->setValue(position);
2441 SEVerticalSlider->setRange(min,max);
2442 SEHorizontalSlider->setRange(tmin,tmax);
2443 SEHorizontalSlider->setValue(tPosition);
2446 //------------------------------------------------------------------------------
2448 //------------------------------------------------------------------------------
2449 void vvMainWindow::SaveNOScreenshot() {
2450 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2451 w2i->SetInput(NOViewWidget->GetRenderWindow());
2453 SaveScreenshot(w2i->GetOutput());
2456 //------------------------------------------------------------------------------
2458 //------------------------------------------------------------------------------
2459 void vvMainWindow::SaveNEScreenshot() {
2460 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2461 w2i->SetInput(NEViewWidget->GetRenderWindow());
2463 SaveScreenshot(w2i->GetOutput());
2466 //------------------------------------------------------------------------------
2468 //------------------------------------------------------------------------------
2469 void vvMainWindow::SaveSOScreenshot() {
2470 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2471 w2i->SetInput(SOViewWidget->GetRenderWindow());
2473 SaveScreenshot(w2i->GetOutput());
2476 //------------------------------------------------------------------------------
2478 //------------------------------------------------------------------------------
2479 void vvMainWindow::SaveSEScreenshot() {
2480 vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New();
2481 w2i->SetInput(SEViewWidget->GetRenderWindow());
2483 SaveScreenshot(w2i->GetOutput());
2486 //------------------------------------------------------------------------------
2488 //------------------------------------------------------------------------------
2489 void vvMainWindow::SaveScreenshot(vtkImageData* image) {
2490 QString Extensions = "Images( *.png);;";
2491 Extensions += "Images( *.jpg);;";
2492 Extensions += "Images( *.bmp);;";
2493 Extensions += "Images( *.tif);;";
2494 Extensions += "Images( *.ppm)";
2495 QString fileName = QFileDialog::getSaveFileName(this,
2497 itksys::SystemTools::GetFilenamePath(
2498 mSlicerManagers[0]->GetFileName()).c_str(),
2500 if (!fileName.isEmpty())
2502 const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
2503 if (!strcmp(ext, ".bmp"))
2505 vtkBMPWriter *bmp = vtkBMPWriter::New();
2506 bmp->SetInput(image);
2507 bmp->SetFileName(fileName.toStdString().c_str());
2511 else if (!strcmp(ext, ".tif"))
2513 vtkTIFFWriter *tif = vtkTIFFWriter::New();
2514 tif->SetInput(image);
2515 tif->SetFileName(fileName.toStdString().c_str());
2519 else if (!strcmp(ext, ".ppm"))
2521 vtkPNMWriter *pnm = vtkPNMWriter::New();
2522 pnm->SetInput(image);
2523 pnm->SetFileName(fileName.toStdString().c_str());
2527 else if (!strcmp(ext, ".png"))
2529 vtkPNGWriter *png = vtkPNGWriter::New();
2530 png->SetInput(image);
2531 png->SetFileName(fileName.toStdString().c_str());
2535 else if (!strcmp(ext, ".jpg"))
2537 vtkJPEGWriter *jpg = vtkJPEGWriter::New();
2538 jpg->SetInput(image);
2539 jpg->SetFileName(fileName.toStdString().c_str());
2545 QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!"));
2550 //------------------------------------------------------------------------------
2552 //------------------------------------------------------------------------------
2553 void vvMainWindow::GoToCursor() {
2554 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2555 for (int column = 1; column < 5; column++)
2557 if (DataTree->selectedItems()[0]->data(column,Qt::CheckStateRole).toInt() > 1)
2559 double* cursorPos = mSlicerManagers[index]->GetSlicer(column-1)->GetCursorPosition();
2560 mSlicerManagers[index]->GetSlicer(column-1)->SetCurrentPosition(
2561 cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
2562 mSlicerManagers[index]->UpdateViews(1,column-1);
2563 mSlicerManagers[index]->UpdateLinked(column-1);
2568 //------------------------------------------------------------------------------
2570 //------------------------------------------------------------------------------
2571 void vvMainWindow::PlayPause() {
2575 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_play.png")));
2581 int image_number=DataTree->topLevelItemCount();
2583 for (int i=0;i<image_number;i++)
2584 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1)
2592 playButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/player_pause.png")));
2593 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2597 //------------------------------------------------------------------------------
2599 //------------------------------------------------------------------------------
2600 void vvMainWindow::PlayNext() {
2601 if (playMode && !this->isHidden())
2603 int image_number=DataTree->topLevelItemCount();
2604 ///Only play one slicer per SM, and only if the SM is being displayed
2605 for (int i=0;i<image_number;i++)
2606 for (int j=0;j<4;j++)
2607 if (mSlicerManagers[i]->GetImage()->GetVTKImages().size() > 1 &&
2608 DataTree->topLevelItem(i)->data(j+1,Qt::CheckStateRole).toInt() > 0)
2610 mSlicerManagers[i]->SetNextTSlice(j);
2613 QTimer::singleShot(1000/mFrameRate, this, SLOT(PlayNext()));
2616 //------------------------------------------------------------------------------
2618 void vvMainWindow::ShowLastImage()
2620 if (mSlicerManagers.size() > 1)
2622 QTreeWidgetItem * item=DataTree->topLevelItem(DataTree->topLevelItemCount()-1);
2623 CurrentImageChanged(mSlicerManagers.back()->GetId()); //select new image
2624 item->setData(1,Qt::CheckStateRole,2); //show the new image in the first panel
2625 DisplayChanged(item,1);
2629 //------------------------------------------------------------------------------
2630 void vvMainWindow::UpdateRenderWindows() {
2631 if (NOViewWidget->GetRenderWindow()) NOViewWidget->GetRenderWindow()->Render();
2632 if (NEViewWidget->GetRenderWindow()) NEViewWidget->GetRenderWindow()->Render();
2633 if (SOViewWidget->GetRenderWindow()) SOViewWidget->GetRenderWindow()->Render();
2634 if (SEViewWidget->GetRenderWindow()) SEViewWidget->GetRenderWindow()->Render();
2636 //------------------------------------------------------------------------------
2638 //------------------------------------------------------------------------------
2639 void vvMainWindow::ResampleCurrentImage() {
2640 vvResamplerDialog resampler;
2641 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2642 resampler.SetSlicerManagers(mSlicerManagers,index);
2643 if (resampler.exec())
2644 AddImage(resampler.GetOutput(),resampler.GetOutputFileName());
2646 //------------------------------------------------------------------------------
2648 //------------------------------------------------------------------------------
2649 void vvMainWindow::SegmentationOnCurrentImage() {
2650 int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2652 vvSegmentationDialog segmentation;
2653 segmentation.SetImage(mSlicerManagers[index]->GetSlicer(0)->GetImage());
2654 segmentation.exec();
2656 //------------------------------------------------------------------------------
2658 void vvMainWindow::SurfaceViewerLaunch()
2660 vvSurfaceViewerDialog surfaceViewer;
2661 surfaceViewer.exec();
2664 //------------------------------------------------------------------------------
2665 void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
2667 vvSlicerManager* m = new vvSlicerManager(4);
2669 m->SetFilename(filename);
2673 //------------------------------------------------------------------------------
2674 void vvMainWindow::AddImage(vvSlicerManager * slicer_manager) {
2675 mSlicerManagers.push_back(slicer_manager);
2677 std::string filename = slicer_manager->GetFileName();
2679 //create an item in the tree with good settings
2680 QTreeWidgetItem *item = new QTreeWidgetItem();
2681 item->setData(0,Qt::UserRole,slicer_manager->GetFileName().c_str());//files[i].c_str());
2682 item->setData(COLUMN_IMAGE_NAME,Qt::DisplayRole,filename.c_str());
2683 qApp->processEvents();
2685 for (int j = 1; j <= 4; j++) item->setData(j,Qt::CheckStateRole,1);
2687 //Create the buttons for reload and close
2688 qApp->processEvents();
2689 QTreePushButton* cButton = new QTreePushButton;
2690 cButton->setItem(item);
2691 cButton->setColumn(COLUMN_CLOSE_IMAGE);
2692 cButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/exit.png")));
2693 connect(cButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2694 this,SLOT(CloseImage(QTreeWidgetItem*, int)));
2696 QTreePushButton* rButton = new QTreePushButton;
2697 rButton->setItem(item);
2698 rButton->setColumn(COLUMN_RELOAD_IMAGE);
2699 rButton->setIcon(QIcon(QString::fromUtf8(":/new/prefix1/icons/rotateright.png")));
2700 rButton->setEnabled(0);
2701 connect(rButton,SIGNAL(clickedInto(QTreeWidgetItem*, int)),
2702 this,SLOT(ReloadImage(QTreeWidgetItem*, int)));
2704 DataTree->addTopLevelItem(item);
2705 DataTree->setItemWidget(item, COLUMN_CLOSE_IMAGE, cButton);
2706 DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
2708 //set the id of the image
2709 QString id = slicer_manager->GetFileName().c_str() + QString::number(mSlicerManagers.size()-1);
2710 item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
2711 mSlicerManagers.back()->SetId(id.toStdString());
2713 linkPanel->addImage(filename, id.toStdString());
2715 connect(mSlicerManagers.back(),SIGNAL(currentImageChanged(std::string)),
2716 this,SLOT(CurrentImageChanged(std::string)));
2717 connect(mSlicerManagers.back(),SIGNAL(
2718 UpdatePosition(int, double, double, double, double, double, double, double)),this,
2719 SLOT(MousePositionChanged(int,double, double, double, double, double, double, double)));
2720 connect(mSlicerManagers.back(),SIGNAL(UpdateVector(int, double, double, double, double)),
2721 this, SLOT(VectorChanged(int,double,double,double, double)));
2722 connect(mSlicerManagers.back(),SIGNAL(UpdateOverlay(int, double, double)),
2723 this, SLOT(OverlayChanged(int,double,double)));
2724 connect(mSlicerManagers.back(),SIGNAL(UpdateFusion(int, double)),
2725 this, SLOT(FusionChanged(int,double)));
2726 connect(mSlicerManagers.back(),SIGNAL(UpdateWindows(int, int, int)),
2727 this,SLOT(WindowsChanged(int, int, int)));
2728 connect(mSlicerManagers.back(),SIGNAL(WindowLevelChanged(double, double,int, int)),
2729 this,SLOT(WindowLevelChanged(double, double, int, int)));
2730 connect(mSlicerManagers.back(),SIGNAL(UpdateSlice(int,int)),
2731 this,SLOT(UpdateSlice(int,int)));
2732 connect(mSlicerManagers.back(),SIGNAL(UpdateTSlice(int, int)),
2733 this,SLOT(UpdateTSlice(int, int)));
2734 connect(mSlicerManagers.back(),SIGNAL(UpdateSliceRange(int,int,int,int,int)),
2735 this,SLOT(UpdateSliceRange(int,int,int,int,int)));
2736 connect(mSlicerManagers.back(),SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)),
2737 this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int)));
2738 connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
2740 qApp->processEvents();
2744 qApp->processEvents();
2746 //------------------------------------------------------------------------------
2749 //------------------------------------------------------------------------------
2750 void vvMainWindow::UpdateCurrentSlicer() {
2752 if (DataTree->selectedItems().size() > 0) {
2753 index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
2755 mSlicerManagerCurrentIndex = index;
2757 //------------------------------------------------------------------------------