X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvMainWindow.cxx;h=acbb7d4621a05f3fbf5c0ac240c6c1c1ee755917;hb=8eaf0a647fec2440abf6064d78d3eab735aa90c6;hp=760fa758558712aa798d07847b614a2ffd5f569f;hpb=d2da68d0db9e40a3053d8482aecabf08d6a56cc0;p=clitk.git diff --git a/vv/vvMainWindow.cxx b/vv/vvMainWindow.cxx index 760fa75..acbb7d4 100644 --- a/vv/vvMainWindow.cxx +++ b/vv/vvMainWindow.cxx @@ -3,7 +3,7 @@ Authors belong to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -14,17 +14,20 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ #include #include #include #include #include "QTreePushButton.h" +#include +#include // VV include #include "vvMainWindow.h" #include "vvHelpDialog.h" +#include "vvRegisterForm.h" #include "vvDocumentation.h" #include "vvProgressDialog.h" #include "vvQDicomSeriesSelector.h" @@ -42,32 +45,35 @@ #include "vvMesh.h" #include "vvStructSelector.h" #include "vvMeshReader.h" -#include "vvConstants.h" #include "clitkConfiguration.h" // ITK include -#include "itkImage.h" -#include "itkImageFileReader.h" -#include "itkByteSwapper.h" -#include "itkCommand.h" -#include "itkNumericSeriesFileNames.h" +#include +#include +#include +#include +#include // VTK include -#include "vtkImageData.h" -#include "vtkImageActor.h" -#include "vtkCornerAnnotation.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkRendererCollection.h" -#include "vtkWindowToImageFilter.h" -#include "vtkBMPWriter.h" -#include "vtkTIFFWriter.h" -#include "vtkPNMWriter.h" -#include "vtkPNGWriter.h" -#include "vtkJPEGWriter.h" -#include "vtkMatrix4x4.h" -#include "vtkTransform.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef VTK_USE_MPEG2_ENCODER + #include +#endif +#include +#include // Standard includes #include @@ -83,7 +89,7 @@ #define COLUMN_RELOAD_IMAGE 6 #define COLUMN_IMAGE_NAME 7 -#define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr *.SCAN )" +#define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.mha *.hdr *.vox *.his *.xdr *.SCAN )" /*Data Tree values 0,Qt::UserRole full filename @@ -246,6 +252,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() connect(actionAdd_VF_to_current_Image,SIGNAL(triggered()),this,SLOT(OpenField())); connect(actionNavigation_Help,SIGNAL(triggered()),this,SLOT(ShowHelpDialog())); connect(actionDocumentation,SIGNAL(triggered()),this,SLOT(ShowDocumentation())); + connect(actionRegister_vv,SIGNAL(triggered()),this,SLOT(PopupRegisterForm())); /////////////////////////////////////////////// connect(actionSegmentation,SIGNAL(triggered()),this,SLOT(SegmentationOnCurrentImage())); @@ -303,17 +310,10 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() //Recently opened files std::list recent_files = GetRecentlyOpenedImages(); + recentlyOpenedFilesMenu=NULL; if ( !recent_files.empty() ) { - QMenu * rmenu = new QMenu("Recently opened files..."); - rmenu->setIcon(QIcon(QString::fromUtf8(":/common/icons/open.png"))); - menuFile->insertMenu(actionOpen_Image_With_Time,rmenu); - menuFile->insertSeparator(actionOpen_Image_With_Time); - for (std::list::iterator i = recent_files.begin(); i!=recent_files.end(); i++) { - QAction* current=new QAction(QIcon(QString::fromUtf8(":/common/icons/open.png")), - (*i).c_str(),this); - rmenu->addAction(current); - connect(current,SIGNAL(triggered()),this,SLOT(OpenRecentImage())); - } + createRecentlyOpenedFilesMenu(); + updateRecentlyOpenedFilesMenu(recent_files); } // Adding all new tools (insertion in the menu) @@ -327,11 +327,13 @@ vvMainWindow::vvMainWindow():vvMainWindowBase() //timerMemory->setInterval(5); connect(timerMemory, SIGNAL(timeout()), this, SLOT(UpdateMemoryUsage())); timerMemory->start(2000); - } //------------------------------------------------------------------------------ - +void vvMainWindow::show(){ + vvMainWindowBase::show(); + PopupRegisterForm(true); +} //------------------------------------------------------------------------------ void vvMainWindow::UpdateMemoryUsage() { @@ -342,6 +344,35 @@ void vvMainWindow::UpdateMemoryUsage() //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvMainWindow::createRecentlyOpenedFilesMenu() +{ + recentlyOpenedFilesMenu = new QMenu("Recently opened files..."); + recentlyOpenedFilesMenu->setIcon(QIcon(QString::fromUtf8(":/common/icons/open.png"))); + menuFile->insertMenu(actionOpen_Image_With_Time,recentlyOpenedFilesMenu); + menuFile->insertSeparator(actionOpen_Image_With_Time); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ + +void vvMainWindow::updateRecentlyOpenedFilesMenu(const std::list &recent_files) +{ + if(recentlyOpenedFilesMenu==NULL){ + createRecentlyOpenedFilesMenu(); + }else{ + recentlyOpenedFilesMenu->clear(); + } + for (std::list::const_iterator i = recent_files.begin(); i!=recent_files.end(); i++) { + QAction* current=new QAction(QIcon(QString::fromUtf8(":/common/icons/open.png")), i->c_str(),this); + recentlyOpenedFilesMenu->addAction(current); + connect(current,SIGNAL(triggered()),this,SLOT(OpenRecentImage())); + } +} +//------------------------------------------------------------------------------ + + //------------------------------------------------------------------------------ void vvMainWindow::ComputeMidPosition() { @@ -601,7 +632,7 @@ void vvMainWindow::MergeImages() } } if (vector.size() > 0) - LoadImages(vector, MERGED); + LoadImages(vector, vvImageReader::MERGED); } //------------------------------------------------------------------------------ @@ -618,7 +649,7 @@ void vvMainWindow::SliceImages() std::vector vector; for (int i = 0; i < files.size(); i++) vector.push_back(files[i].toStdString()); - LoadImages(vector, SLICED); + LoadImages(vector, vvImageReader::SLICED); } //------------------------------------------------------------------------------ @@ -680,7 +711,7 @@ void vvMainWindow::MergeImagesWithTime() } sort(vector.begin(),vector.end()); if (vector.size() > 1) - LoadImages(vector, MERGEDWITHTIME); + LoadImages(vector, vvImageReader::MERGEDWITHTIME); else 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."); } @@ -695,7 +726,7 @@ void vvMainWindow::OpenDicom() std::cout << "dicomSeriesSelector " << std::endl; if (dicomSeriesSelector->exec() == QDialog::Accepted) { files = *(dicomSeriesSelector->GetFilenames()); - LoadImages(files,DICOM); + LoadImages(files, vvImageReader::DICOM); } } //------------------------------------------------------------------------------ @@ -713,7 +744,7 @@ void vvMainWindow::OpenImages() std::vector vector; for (int i = 0; i < files.size(); i++) vector.push_back(files[i].toStdString()); - LoadImages(vector, IMAGE); + LoadImages(vector, vvImageReader::IMAGE); } //------------------------------------------------------------------------------ void vvMainWindow::OpenRecentImage() @@ -722,7 +753,7 @@ void vvMainWindow::OpenRecentImage() std::vector images; images.push_back(caller->text().toStdString()); mInputPathName = itksys::SystemTools::GetFilenamePath(images[0]).c_str(); - LoadImages(images,IMAGE); + LoadImages(images, vvImageReader::IMAGE); } //------------------------------------------------------------------------------ @@ -741,17 +772,17 @@ void vvMainWindow::OpenImageWithTime() for (int i = 0; i < files.size(); i++) { vector.push_back(files[i].toStdString()); } - LoadImages(vector, IMAGEWITHTIME); + LoadImages(vector, vvImageReader::IMAGEWITHTIME); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvMainWindow::LoadImages(std::vector files, LoadedImageType filetype) +void vvMainWindow::LoadImages(std::vector files, vvImageReader::LoadedImageType filetype) { //Separate the way to open images and dicoms int fileSize; - if (filetype == IMAGE || filetype == IMAGEWITHTIME) + if (filetype == vvImageReader::IMAGE || filetype == vvImageReader::IMAGEWITHTIME) fileSize = files.size(); else fileSize = 1; @@ -760,7 +791,7 @@ void vvMainWindow::LoadImages(std::vector files, LoadedImageType fi std::vector nSlices; nSlices.resize(files.size()); std::fill(nSlices.begin(), nSlices.end(), 1); - if (filetype == SLICED) { + if (filetype == vvImageReader::SLICED) { for (int i = 0; i < fileSize; i++) { itk::ImageIOBase::Pointer header = clitk::readImageHeader(files[i]); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); @@ -787,6 +818,7 @@ void vvMainWindow::LoadImages(std::vector files, LoadedImageType fi if (files.size() == 1) { QFileInfo finfo=tr(files[0].c_str()); AddToRecentlyOpenedImages(finfo.absoluteFilePath().toStdString()); + updateRecentlyOpenedFilesMenu(GetRecentlyOpenedImages()); } //init the progress events QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); @@ -811,7 +843,7 @@ void vvMainWindow::LoadImages(std::vector files, LoadedImageType fi // Change filename if an image with the same already exist int number = GetImageDuplicateFilenameNumber(files[i] + std::string("_slice")); - if (filetype == IMAGE || filetype == IMAGEWITHTIME || filetype == SLICED) + if (filetype == vvImageReader::IMAGE || filetype == vvImageReader::IMAGEWITHTIME || filetype == vvImageReader::SLICED) SetImageSucceed = imageManager->SetImage(files[i],filetype, number, j); else { SetImageSucceed = imageManager->SetImages(files,filetype, number); @@ -886,8 +918,8 @@ void vvMainWindow::LoadImages(std::vector files, LoadedImageType fi this,SLOT(UpdateSliceRange(int,int,int,int,int))); connect(mSlicerManagers.back(), SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)), this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int))); - connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*)), - this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*))); + connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)), + this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*))); connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)), this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int))); connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint())); @@ -1182,6 +1214,23 @@ void vvMainWindow::ShowDocumentation() { documentation->show(); } +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +void vvMainWindow::PopupRegisterForm(bool checkCanPush) +{ + vvRegisterForm* registerForm = new vvRegisterForm(QUrl("http://www.creatis.insa-lyon.fr/~dsarrut/vvregister/write.php"), getVVSettingsPath(), getSettingsOptionFormat()); + if(!checkCanPush){ + registerForm->show(); + }else{ + if(registerForm->canPush()){ + registerForm->show(); + registerForm->acquitPushed();//too bad if there is not internet connection anymore. + } + } +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvMainWindow::ShowHelpDialog() { @@ -1192,41 +1241,27 @@ void vvMainWindow::ShowHelpDialog() //------------------------------------------------------------------------------ void vvMainWindow::ChangeViewMode() { - QListIterator it0(splitter_3->sizes()); - QListIterator it1(splitter_3->sizes()); - int max0 = 0; - int max1 = 1; - while (it0.hasNext()) { - max0 += it0.next(); - } - while (it1.hasNext()) { - max1 += it1.next(); - } - QList size0; - QList size1; + QList size; if (viewMode == 1) { viewMode = 0; - size0.push_back(max0); - size0.push_back(0); - size1.push_back(max1); - size1.push_back(0); - splitter_3->setSizes(size0); - OSplitter->setSizes(size1); + size.push_back(1); + size.push_back(0); + splitter_3->setSizes(size); + OSplitter->setSizes(size); DataTree->setColumnHidden(2,1); DataTree->setColumnHidden(3,1); DataTree->setColumnHidden(4,1); } else { viewMode = 1; - size0.push_back(int(max0/2)); - size0.push_back(int(max0/2)); - size1.push_back(int(max1/2)); - size1.push_back(int(max1/2)); - splitter_3->setSizes(size0); - OSplitter->setSizes(size1); + size.push_back(1); + size.push_back(1); + splitter_3->setSizes(size); + OSplitter->setSizes(size); DataTree->setColumnHidden(2,0); DataTree->setColumnHidden(3,0); DataTree->setColumnHidden(4,0); } + UpdateRenderWindows(); } //------------------------------------------------------------------------------ @@ -1459,12 +1494,12 @@ void vvMainWindow::DisplaySliders(int slicer, int window) bool showVertical = false; if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3 || (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 2 - && mSlicerManagers[slicer]->GetType() != IMAGEWITHTIME - && mSlicerManagers[slicer]->GetType() != MERGEDWITHTIME)) + && mSlicerManagers[slicer]->GetType() != vvImageReader::IMAGEWITHTIME + && mSlicerManagers[slicer]->GetType() != vvImageReader::MERGEDWITHTIME)) showVertical = true; if (mSlicerManagers[slicer]->GetSlicer(window)->GetImage()->GetNumberOfDimensions() > 3 - || mSlicerManagers[slicer]->GetType() == IMAGEWITHTIME - || mSlicerManagers[slicer]->GetType() == MERGEDWITHTIME) + || mSlicerManagers[slicer]->GetType() == vvImageReader::IMAGEWITHTIME + || mSlicerManagers[slicer]->GetType() == vvImageReader::MERGEDWITHTIME) showHorizontal = true; if (showVertical) @@ -1699,11 +1734,11 @@ void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, doubl //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvMainWindow::UpdateLinkedNavigation(std::string id, vvSlicerManager * sm) +void vvMainWindow::UpdateLinkedNavigation(std::string id, vvSlicerManager * sm, vvSlicer* refSlicer) { for (unsigned int i = 0; i < mSlicerManagers.size(); i++) { if (id == mSlicerManagers[i]->GetId()) { - mSlicerManagers[i]->UpdateLinkedNavigation(sm->GetSlicer(0)); + mSlicerManagers[i]->UpdateLinkedNavigation(refSlicer); } } } @@ -2193,7 +2228,7 @@ void vvMainWindow::SaveAs() std::string action = "Saving"; vvProgressDialog progress("Saving "+fileName.toStdString()); qApp->processEvents(); - vvImageWriter *writer = new vvImageWriter; + vvImageWriter::Pointer writer = vvImageWriter::New(); writer->SetOutputFileName(fileName.toStdString()); writer->SetInput(mSlicerManagers[index]->GetImage()); writer->Update(); @@ -2236,11 +2271,11 @@ void vvMainWindow::AddLink(QString image1,QString image2) } if (linkPanel->isLinkAll()) { - emit UpdateLinkedNavigation(mSlicerManagers[sm1]->GetId(), mSlicerManagers[mCurrentPickedImageIndex]); - emit UpdateLinkedNavigation(mSlicerManagers[sm2]->GetId(), mSlicerManagers[mCurrentPickedImageIndex]); + emit UpdateLinkedNavigation(mSlicerManagers[sm1]->GetId(), mSlicerManagers[mCurrentPickedImageIndex], mSlicerManagers[mCurrentPickedImageIndex]->GetSlicer(0)); + emit UpdateLinkedNavigation(mSlicerManagers[sm2]->GetId(), mSlicerManagers[mCurrentPickedImageIndex], mSlicerManagers[mCurrentPickedImageIndex]->GetSlicer(0)); } else { - emit UpdateLinkedNavigation(mSlicerManagers[sm2]->GetId(), mSlicerManagers[sm1]); + emit UpdateLinkedNavigation(mSlicerManagers[sm2]->GetId(), mSlicerManagers[sm1], mSlicerManagers[sm1]->GetSlicer(0)); } } @@ -2505,11 +2540,7 @@ void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int //------------------------------------------------------------------------------ void vvMainWindow::SaveNOScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(NOViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(NOViewWidget); } //------------------------------------------------------------------------------ @@ -2517,11 +2548,7 @@ void vvMainWindow::SaveNOScreenshot() //------------------------------------------------------------------------------ void vvMainWindow::SaveNEScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(NEViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(NEViewWidget); } //------------------------------------------------------------------------------ @@ -2529,11 +2556,7 @@ void vvMainWindow::SaveNEScreenshot() //------------------------------------------------------------------------------ void vvMainWindow::SaveSOScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(SOViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(SOViewWidget); } //------------------------------------------------------------------------------ @@ -2541,29 +2564,38 @@ void vvMainWindow::SaveSOScreenshot() //------------------------------------------------------------------------------ void vvMainWindow::SaveSEScreenshot() { - vtkWindowToImageFilter *w2i = vtkWindowToImageFilter::New(); - w2i->SetInput(SEViewWidget->GetRenderWindow()); - w2i->Update(); - SaveScreenshot(w2i->GetOutput()); - w2i->Delete(); + SaveScreenshot(SEViewWidget); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvMainWindow::SaveScreenshot(vtkImageData* image) +void vvMainWindow::SaveScreenshot(QVTKWidget *widget) { QString Extensions = "Images( *.png);;"; Extensions += "Images( *.jpg);;"; Extensions += "Images( *.bmp);;"; Extensions += "Images( *.tif);;"; Extensions += "Images( *.ppm)"; +#ifdef VTK_USE_FFMPEG_ENCODER + Extensions += "Images( *.avi)"; +#endif +#ifdef VTK_USE_MPEG2_ENCODER + Extensions += "Images( *.mpg)"; +#endif + + int smIndex=GetSlicerIndexFromItem(DataTree->selectedItems()[0]); QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), - itksys::SystemTools::GetFilenamePath( - mSlicerManagers[0]->GetFileName()).c_str(), + itksys::SystemTools::GetFilenamePath(mSlicerManagers[smIndex]->GetFileName()).c_str(), Extensions); + if (!fileName.isEmpty()) { + vtkSmartPointer w2i = vtkSmartPointer::New(); + w2i->SetInput(widget->GetRenderWindow()); + w2i->Update(); + vtkImageData *image = w2i->GetOutput(); + const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4; if (!strcmp(ext, ".bmp")) { vtkBMPWriter *bmp = vtkBMPWriter::New(); @@ -2595,11 +2627,54 @@ void vvMainWindow::SaveScreenshot(vtkImageData* image) jpg->SetFileName(fileName.toStdString().c_str()); jpg->Write(); jpg->Delete(); +#ifdef VTK_USE_FFMPEG_ENCODER + } else if (!strcmp(ext, ".avi")) { + vtkFFMPEGWriter *mpg = vtkFFMPEGWriter::New(); + mpg->SetInput(image); + mpg->SetFileName(fileName.toStdString().c_str()); + mpg->SetQuality(2); + mpg->SetRate(5); + mpg->Start(); + + vvImage * vvImg = mSlicerManagers[smIndex]->GetImage(); + int nSlice = vvImg->GetVTKImages().size(); + for(int i=0; iSetNextTSlice(0); + vtkSmartPointer w2i = vtkSmartPointer::New(); + w2i->SetInput(widget->GetRenderWindow()); + w2i->Update(); + mpg->SetInput(w2i->GetOutput()); + mpg->Write(); + } + mpg->End(); + mpg->Delete(); +#endif +#ifdef VTK_USE_MPEG2_ENCODER + } else if (!strcmp(ext, ".mpg")) { + vtkMPEG2Writer *mpg = vtkMPEG2Writer::New(); + mpg->SetInput(image); + mpg->SetFileName(fileName.toStdString().c_str()); + mpg->Start(); + + vvImage * vvImg = mSlicerManagers[smIndex]->GetImage(); + int nSlice = vvImg->GetVTKImages().size(); + for(int i=0; iSetNextTSlice(0); + vtkSmartPointer w2i = vtkSmartPointer::New(); + w2i->SetInput(widget->GetRenderWindow()); + w2i->Update(); + mpg->SetInput(w2i->GetOutput()); + mpg->Write(); + } + mpg->End(); + mpg->Delete(); +#endif } else { QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!")); } } - } //------------------------------------------------------------------------------ @@ -2793,8 +2868,8 @@ vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filen this,SLOT(UpdateSliceRange(int,int,int,int,int))); connect(mSlicerManagers.back(), SIGNAL(UpdateLinkManager(std::string,int,double,double,double,int)), this,SLOT(UpdateLinkManager(std::string,int,double,double,double,int))); - connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*)), - this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*))); + connect(mSlicerManagers.back(), SIGNAL(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*)), + this,SLOT(UpdateLinkedNavigation(std::string,vvSlicerManager*,vvSlicer*))); connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)), this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int))); connect(mSlicerManagers.back(), SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));