]> Creatis software - clitk.git/blobdiff - vv/vvMainWindow.cxx
Parsing fusion image from command line
[clitk.git] / vv / vvMainWindow.cxx
index c0abea3568925f6f8d698f48b143de4f20ee854f..4c8564f0697b78e7731293d41a72a448eedc03ca 100644 (file)
@@ -79,7 +79,7 @@
 #define COLUMN_RELOAD_IMAGE 6
 #define COLUMN_IMAGE_NAME 7
 
-#define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr)"
+#define EXTENSIONS "Images ( *.bmp *.png *.jpeg *.jpg *.tif *.mhd *.hdr *.vox *.his *.xdr *.SCAN )"
 
 /*Data Tree values
   0,Qt::UserRole full filename
@@ -98,10 +98,12 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
 
   mInputPathName = "";
   mMenuTools = menuTools;
+  //  mMenuSegmentation = menuSegmentation;
   mContextMenu = &contextMenu;
   mMenuExperimentalTools = menuExperimental;
   mMainWidget = this;
   mCurrentTime = -1;
+  mCurrentSelectedImageId = "";
 
   //Init the contextMenu
   this->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -439,7 +441,7 @@ void vvMainWindow::OpenVTKContour()
 void vvMainWindow::OpenDCStructContour()
 {
   if (mSlicerManagers.size() > 0) {
-    QString Extensions = "Dicom Files ( *.dcm; RS*)";
+    QString Extensions = "Dicom Files ( *.dcm RS*)";
     Extensions += ";;All Files (*)";
     QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"),mInputPathName,Extensions);
     if (file.isNull())
@@ -753,7 +755,7 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, LoadedImageType fi
   //open images as 1 or multiples
   for (int i = 0; i < fileSize; i++) {
 
-    progress.Update("Opening " + files[i]);
+    progress.SetText("Opening " + files[i]);
     progress.SetProgress(i,fileSize);
     qApp->processEvents();
 
@@ -764,18 +766,7 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, LoadedImageType fi
     bool SetImageSucceed=false;
 
     // Change filename if an image with the same already exist
-    //    DD(files[i]);
-    int number=0;
-    for(unsigned int l=0; l<mSlicerManagers.size(); l++) {
-      vvSlicerManager * v = mSlicerManagers[l];
-      //      DD(v->GetBaseFileName());
-      // DD(v->GetFileName());
-      if (v->GetBaseFileName() ==
-          vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(files[i]))) {
-        number = std::max(number, v->GetBaseFileNameNumber()+1);
-      }
-    }
-
+    int number = GetImageDuplicateFilenameNumber(files[i]);
 
     if (filetype == IMAGE || filetype == IMAGEWITHTIME)
       SetImageSucceed = imageManager->SetImage(files[i],filetype, number);
@@ -849,6 +840,8 @@ void vvMainWindow::LoadImages(std::vector<std::string> 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(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
               this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
       connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
@@ -897,7 +890,10 @@ void vvMainWindow::UpdateTree()
 //------------------------------------------------------------------------------
 void vvMainWindow::CurrentImageChanged(std::string id)
 {
-  //  DD("CurrentImageChanged");
+  // DD("CurrentImageChanged");
+//   DD(id);
+//   DD(mCurrentSelectedImageId);
+  if (id == mCurrentSelectedImageId) return; // Do nothing
   int selected = 0;
   for (int i = 0; i < DataTree->topLevelItemCount(); i++) {
     if (DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString().toStdString() == id) {
@@ -910,7 +906,8 @@ void vvMainWindow::CurrentImageChanged(std::string id)
 
   }
   DataTree->topLevelItem(selected)->setSelected(1);
-  //  DD(mSlicerManagers[selected]->GetFileName());
+  // DD(mSlicerManagers[selected]->GetFileName());
+  mCurrentSelectedImageId = id;
   emit SelectedImageHasChanged(mSlicerManagers[selected]);
 }
 //------------------------------------------------------------------------------
@@ -972,7 +969,7 @@ void vvMainWindow::ImageInfoChanged()
       inputSpacing.resize(dimension);
       inputSize.resize(dimension);
       sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
+      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str();
       for (int i = 0; i < dimension; i++) {
         origin[i] = imageSelected->GetOrigin()[i];
         inputSpacing[i] = imageSelected->GetSpacing()[i];
@@ -988,7 +985,7 @@ void vvMainWindow::ImageInfoChanged()
       inputSpacing.resize(dimension);
       inputSize.resize(dimension);
       sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsString().c_str();
+      pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsITKString().c_str();
       for (int i = 0; i < dimension; i++) {
         origin[i] = imageSelected->GetOrigin()[i];
         inputSpacing[i] = imageSelected->GetSpacing()[i];
@@ -1004,7 +1001,7 @@ void vvMainWindow::ImageInfoChanged()
       inputSpacing.resize(dimension);
       inputSize.resize(dimension);
       sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
+      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str();
       for (int i = 0; i < dimension; i++) {
         origin[i] = imageSelected->GetOrigin()[i];
         inputSpacing[i] = imageSelected->GetSpacing()[i];
@@ -1020,7 +1017,7 @@ void vvMainWindow::ImageInfoChanged()
       inputSpacing.resize(dimension);
       inputSize.resize(dimension);
       sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsString().c_str();
+      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str();
       for (int i = 0; i < dimension; i++) {
         origin[i] = imageSelected->GetOrigin()[i];
         inputSpacing[i] = imageSelected->GetSpacing()[i];
@@ -1606,6 +1603,8 @@ void vvMainWindow::SplitImage()
                 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(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
         UpdateTree();
         qApp->processEvents();
@@ -1725,6 +1724,17 @@ void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, doubl
 }
 //------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
+void vvMainWindow::UpdateLinkedNavigation(std::string id, vvSlicerManager * sm)
+{
+  for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
+    if (id == mSlicerManagers[i]->GetId()) {
+      mSlicerManagers[i]->UpdateLinkedNavigation(sm->GetSlicer(0));
+    }
+  }
+}
+//------------------------------------------------------------------------------
+
 //------------------------------------------------------------------------------
 void vvMainWindow::ShowContextMenu(QPoint point)
 {
@@ -1860,10 +1870,42 @@ void vvMainWindow::AddOverlayImage(int index, QString file)
     QMessageBox::information(this,tr("Problem reading image !"),error);
   }
 }
+//------------------------------------------------------------------------------
 
-void vvMainWindow::AddFusionImage()
+
+//------------------------------------------------------------------------------
+void vvMainWindow::AddROI(int index, QString file)
 {
-  int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
+  DD("AddImageAndROI");
+  /*
+  // Get slice manager
+
+  // Load image
+
+  vvImageReader * mReader = new vvImageReader;
+  mReader->SetInputFilename(filename.toStdString());
+  mReader->Update(IMAGE);
+  if (mReader->GetLastError().size() != 0) {
+    std::cerr << "Error while reading " << filename.toStdString() << std::endl;
+    QString error = "Cannot open file \n";
+    error += mReader->GetLastError().c_str();
+    QMessageBox::information(this,tr("Reading problem"),error);
+    delete mReader;
+    return;
+  }
+  vvImage::Pointer roi = mReader->GetOutput();
+
+  // Create roi in new tool
+  vvToolStructureSetManager::AddImage(mCurrentSlicerManager, roi);
+*/
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvMainWindow::AddFusionImage(int index, QString file)
+{
+  if (index==-1)
+    index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]);
 
   //check if one fusion image is added
   for (int child = 0; child < DataTree->topLevelItem(index)->childCount(); child++)
@@ -1877,7 +1919,8 @@ void vvMainWindow::AddFusionImage()
 
   QString Extensions = EXTENSIONS;
   Extensions += ";;All Files (*)";
-  QString file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
+  if(file.isEmpty())
+    file = QFileDialog::getOpenFileName(this,tr("Load Fusion image"),mInputPathName,Extensions);
   if (!file.isEmpty()) {
     mInputPathName = itksys::SystemTools::GetFilenamePath(file.toStdString()).c_str();
     itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(
@@ -2301,23 +2344,21 @@ void vvMainWindow::NOVerticalSliderChanged()
   if (value == NOVerticalSlider->value()) return;
   else value = NOVerticalSlider->value();
   //  int value = NOVerticalSlider->value();
-  for (unsigned int i = 0; i < mSlicerManagers.size(); i++)
-    {
-      if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
-        {
-          if (mSlicerManagers[i]->GetSlicer(0)->GetSlice() != value) {
-            mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
-            mSlicerManagers[i]->VerticalSliderHasChanged(0, value);
-            
-            // If nor Update/Render -> slider not work
-            // only render = ok navigation, but for contour Update needed but slower ? 
-
-            mSlicerManagers[i]->UpdateSlice(0);  // <-- DS add this. Not too much update ? YES. but needed for ImageContour ...
-            //mSlicerManagers[i]->GetSlicer(0)->Render(); // <-- DS add this, needed for contour, seems ok ? not too slow ? 
-          }
-          break;
-        }
+  for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
+    if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1) {
+      if (mSlicerManagers[i]->GetSlicer(0)->GetSlice() != value) {
+        mSlicerManagers[i]->GetSlicer(0)->SetSlice(value);
+        mSlicerManagers[i]->VerticalSliderHasChanged(0, value);
+
+        // If nor Update/Render -> slider not work
+        // only render = ok navigation, but for contour Update needed but slower ?
+
+        mSlicerManagers[i]->UpdateSlice(0);  // <-- DS add this. Not too much update ? YES. but needed for ImageContour ...
+        //mSlicerManagers[i]->GetSlicer(0)->Render(); // <-- DS add this, needed for contour, seems ok ? not too slow ?
+      }
+      break;
     }
+  }
 }
 //------------------------------------------------------------------------------
 
@@ -2347,7 +2388,6 @@ void vvMainWindow::NEVerticalSliderChanged()
 //------------------------------------------------------------------------------
 void vvMainWindow::SOVerticalSliderChanged()
 {
-  // DD("SOVerticalSliderChanged");
   static int value=-1;
   // DD(value);
 //   DD(SOVerticalSlider->value());
@@ -2667,13 +2707,36 @@ void vvMainWindow::SurfaceViewerLaunch()
   vvSurfaceViewerDialog surfaceViewer;
   surfaceViewer.exec();
 }
+//------------------------------------------------------------------------------
+
 
 //------------------------------------------------------------------------------
-void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
+int vvMainWindow::GetImageDuplicateFilenameNumber(std::string filename)
 {
+  int number=0;
+  for(unsigned int l=0; l<mSlicerManagers.size(); l++) {
+    vvSlicerManager * v = mSlicerManagers[l];
+    if (v->GetBaseFileName() ==
+       vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename))) {
+      number = std::max(number, v->GetBaseFileNameNumber()+1);
+    }
+  }
+  return number;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
+{
+  // Change filename if another image exist with the same name
+  int number = GetImageDuplicateFilenameNumber(filename);
+
+  // Create new SliceManager
   vvSlicerManager* slicer_manager = new vvSlicerManager(4);
-  slicer_manager->SetImage(image);
-  slicer_manager->SetFilename(filename);
+  slicer_manager->SetImage(image);//, IMAGE, number);
+  //  filename = filename+"_"+clitk::toString(number);
+  slicer_manager->SetFilename(filename, number);
   mSlicerManagers.push_back(slicer_manager);
 
   //create an item in the tree with good settings
@@ -2734,6 +2797,8 @@ void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
           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(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
           this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
   connect(mSlicerManagers.back(), SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
@@ -2743,6 +2808,9 @@ void vvMainWindow::AddImage(vvImage::Pointer image,std::string filename)
   ShowLastImage();
   InitDisplay();
   qApp->processEvents();
+  
+  // End
+  return slicer_manager;
 }
 //------------------------------------------------------------------------------