]> Creatis software - clitk.git/blobdiff - vv/vvToolROIManager.cxx
Add RemoveActors
[clitk.git] / vv / vvToolROIManager.cxx
index 87419389e89ba735ef10f13ac5ec8df4759fa79b..7f544a5e31f8d1493b21fa080daa66ca1f4bc845 100644 (file)
@@ -22,6 +22,8 @@
 #include "vvROIActor.h"
 #include "vvSlicer.h"
 #include "vvROIActor.h"
+#include "vvMeshReader.h"
+#include "vvStructSelector.h"
 
 // Qt
 #include <QFileDialog>
@@ -41,34 +43,48 @@ ADD_TOOL(vvToolROIManager);
 
 //------------------------------------------------------------------------------
 vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f):
-  // vvToolWidgetBase(parent, f), 
-  // if Qt::Widget -> No dialog in this case (in tab) ; PB = "invisible widget on menu" !
-  // if "f" normal widget
-  QWidget(parent->GetTab()->widget(4)), 
+  QWidget(parent->GetTab()), 
   vvToolBase<vvToolROIManager>(parent),
   Ui::vvToolROIManager()
 {
-  //  Insert the current QWidget into the tab layout (required)
-  QWidget * mother = qFindChild<QWidget*>(parent->GetTab(), "ROItab");
-  mother->layout()->addWidget(this);
+  // Store parent
   mMainWindow = parent;
   
+  // Assume the initial tab ROI index is 2
+  mIndexFirstTab = 2;
+
+  // Get the ROI Tab
+  QWidget * tab = qFindChild<QWidget*>(parent->GetTab(), "ROItab");
+  
+  // Set it as current
+  parent->GetTab()->setCurrentIndex(mIndexFirstTab);
+  
+  // Check if widget already used
+  if (tab->layout()->isEmpty()) {
+    tab->layout()->addWidget(this);
+  }
+  else {
+    close();
+    return;
+  }
+  
   // Build the UI
   Ui_vvToolROIManager::setupUi(this);
   setAttribute(Qt::WA_DeleteOnClose);
   mTree->clear();
   mTree->header()->resizeSection(0, 30);
-  parent->GetTab()->setCurrentIndex(2);
+  mGroupBoxROI->setEnabled(false);
+  
+  // Temporary disable "Load dicom" button
+  frame_4->hide();
 
   // Set default LUT
   mDefaultLUTColor = vtkSmartPointer<vtkLookupTable>::New();
-  DD(mDefaultLUTColor->GetNumberOfTableValues());
   for(int i=0; i<mDefaultLUTColor->GetNumberOfTableValues(); i++) {
     double r = (rand()/(RAND_MAX+1.0));
     double v = (rand()/(RAND_MAX+1.0));
     double b = (rand()/(RAND_MAX+1.0));
     mDefaultLUTColor->SetTableValue(i, r, v, b);
-    //    std::cout << "mDefaultLUTColor->SetTableValue(" << i << ", " << r << ", " << v << ", " << b << ");" << std::endl;
   }
 #include "vvDefaultLut.h"
 
@@ -86,6 +102,7 @@ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f)
   connect(parent, SIGNAL(SelectedImageHasChanged(vvSlicerManager *)), 
           this, SLOT(SelectedImageHasChanged(vvSlicerManager *)));
   connect(mOpenBinaryButton, SIGNAL(clicked()), this, SLOT(OpenBinaryImage()));
+  connect(mOpenDicomButton, SIGNAL(clicked()), this, SLOT(OpenDicomImage()));
   connect(mTree, SIGNAL(itemSelectionChanged()), this, SLOT(SelectedItemChangedInTree()));
   connect(mCheckBoxShow, SIGNAL(toggled(bool)), this, SLOT(VisibleROIToggled(bool)));
   connect(mOpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(OpacityChanged(int)));
@@ -97,8 +114,7 @@ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f)
   connect(mReloadButton, SIGNAL(clicked()), this, SLOT(ReloadCurrentROI()));
   connect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int)));
   connect(mContourCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleContourROIToggled(bool)));
-
-  // mMainWindowBase->GetTab()->setTabIcon(mTabNumber, GetToolIcon());
+  connect(mCloseButton, SIGNAL(clicked()), this, SLOT(close()));
 }
 //------------------------------------------------------------------------------
 
@@ -106,7 +122,6 @@ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f)
 //------------------------------------------------------------------------------
 vvToolROIManager::~vvToolROIManager()
 {
-  std::cout << "vvToolROIManager::~vvToolROIManager()" << std::endl;
 }
 //------------------------------------------------------------------------------
 
@@ -126,12 +141,8 @@ void vvToolROIManager::Initialize() {
 //------------------------------------------------------------------------------
 void vvToolROIManager::InputIsSelected(vvSlicerManager *m)
 {
-  std::cout << "vvToolROIManager::InputIsSelected()" << std::endl;
   mSlicerManager = m;
 
-  // Signal/slot
-  connect(mCloseButton, SIGNAL(clicked()), this, SLOT(close()));
-
   // Initialization
   mSlicerManager = m;
   mCurrentImage = mSlicerManager->GetImage();
@@ -143,7 +154,10 @@ void vvToolROIManager::InputIsSelected(vvSlicerManager *m)
     return;
   }
 
-  // Auto diusplay browser to select new contours 
+  // Change gui
+  mLabelInputInfo->setText(QString("%1").arg(m->GetFileName().c_str()));
+
+  // Auto display browser to select new contours 
   OpenBinaryImage();
 }
 //------------------------------------------------------------------------------
@@ -152,15 +166,30 @@ void vvToolROIManager::InputIsSelected(vvSlicerManager *m)
 //------------------------------------------------------------------------------
 void vvToolROIManager::AnImageIsBeingClosed(vvSlicerManager * m)
 {
-  if (m == mSlicerManager) close();
+  if (m == mSlicerManager) { 
+    close();
+    return;
+  }
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvToolROIManager::close()
+{
+  // Update to delete actors
+  UpdateAllContours();
+  QWidget::close();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
 void vvToolROIManager::SelectedImageHasChanged(vvSlicerManager * m) {
-  if (m != mSlicerManager) hide();
-  else show();
+  if (m != mSlicerManager) hide(); 
+  else {
+    show();
+  }
 }
 //------------------------------------------------------------------------------
 
@@ -206,12 +235,49 @@ void vvToolROIManager::OpenBinaryImage()
 //------------------------------------------------------------------------------
 
 
+//------------------------------------------------------------------------------
+void vvToolROIManager::OpenDicomImage() 
+{
+  DD("OpenDicomImage");
+  QString Extensions = "Dicom Files ( *.dcm RS*)";
+  Extensions += ";;All Files (*)";
+  QString file = QFileDialog::getOpenFileName(this,tr("Merge Images"), 
+                                              mMainWindow->GetInputPathName(), 
+                                              Extensions);
+  if (file.isNull()) return;
+
+  //  AddDCStructContour(index, file);
+  vvMeshReader reader;
+  reader.SetFilename(file.toStdString());
+  vvStructSelector selector;
+  selector.SetStructures(reader.GetROINames());
+  // selector.EnablePropagationCheckBox(); FIXME Disable
+
+  // FIXME : change text -> allow to save binary image
+
+  if (selector.exec()) {
+    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+    reader.SetSelectedItems(selector.getSelectedItems());
+    reader.SetImage(mSlicerManager->GetImage());
+    reader.Update();
+
+    // std::vector<vvMesh::Pointer> contours=reader.GetOutput();
+    // for (std::vector<vvMesh::Pointer>::iterator i=contours.begin();
+    //      i!=contours.end(); i++)
+    //   AddContour(index,*i,selector.PropagationEnabled());
+    QApplication::restoreOverrideCursor();
+  }
+
+
+
+}
+//------------------------------------------------------------------------------
+
+
 //------------------------------------------------------------------------------
 void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, 
                                 double BG, bool modeBG) 
 {
-  DD(modeBG);
-
   // Check Dimension
   int dim = mCurrentImage->GetNumberOfDimensions();
   int bin_dim = binaryImage->GetNumberOfDimensions();
@@ -225,13 +291,11 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename,
   
   // Compute roi index
   int n = mROIList.size();
-  DD(n);
   
   // Compute the name of the new ROI
   std::ostringstream oss;
   oss << vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
   std::string name = oss.str();
-  DD(name);
   
   // Set color
   std::vector<double> color;
@@ -253,7 +317,6 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename,
     roi->SetForegroundValueLabelImage(BG);
   
   // Change color
-  DD("color");
   if (n<mDefaultLUTColor->GetNumberOfTableValues ()) {
     double * color = mDefaultLUTColor->GetTableValue(n % mDefaultLUTColor->GetNumberOfTableValues ());
     roi->SetDisplayColor(color[0], color[1], color[2]);
@@ -316,7 +379,6 @@ void vvToolROIManager::UpdateAllROIStatus() {
       nbVisible++;
     }
   }
-  DD(nbVisible);
 
   // change the states
   disconnect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int)));  
@@ -334,7 +396,6 @@ void vvToolROIManager::UpdateAllROIStatus() {
 
 //------------------------------------------------------------------------------
 void vvToolROIManager::SelectedItemChangedInTree() {
-  
   // Search which roi is selected
   QList<QTreeWidgetItem *> l = mTree->selectedItems();
   if (l.size() == 0) {
@@ -344,17 +405,18 @@ void vvToolROIManager::SelectedItemChangedInTree() {
     return;
   }
   QTreeWidgetItem * w = l[0];
-  //std::cout << "selected item -> " << w->text(1).toStdString() << std::endl;
-  //std::cout << "m_NumberOfTool -> " << m_NumberOfTool << std::endl;
   if (mMapTreeWidgetToROI.find(w) == mMapTreeWidgetToROI.end()) {
     //    mCurrentROIActor = 0;
     mCurrentROI = NULL;
     mGroupBoxROI->setEnabled(false);
     return;
   }
+  if (w == NULL) return;
   clitk::DicomRT_ROI * roi = mMapTreeWidgetToROI[w];
+  if (roi == NULL) return; // sometimes it is called while there is no roi anymore
   // Get selected roi actor
-  QSharedPointer<vvROIActor> actor = mROIActorsList[roi->GetROINumber()];
+  int n = roi->GetROINumber();
+  QSharedPointer<vvROIActor> actor = mROIActorsList[n];
   mCurrentROI = roi;
   mCurrentROIActor = actor;
 
@@ -388,6 +450,18 @@ void vvToolROIManager::SelectedItemChangedInTree() {
   connect(mContourWidthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeContourWidth(int)));
   connect(mDepthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeDepth(int)));
 
+  
+  // Set the current color to the selected ROI name
+  mROInameLabel->setAutoFillBackground(true);// # This is important!!
+  mROInameLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");
+  QColor color = QColor(mCurrentROI->GetDisplayColor()[0]*255,
+                        mCurrentROI->GetDisplayColor()[1]*255,
+                        mCurrentROI->GetDisplayColor()[2]*255);
+  QString values = QString("%1, %2, %3").arg(color.red()).arg(color.green()).arg(color.blue());
+  mROInameLabel->setStyleSheet("QLabel { background-color: rgb("+values+"); }");
+
+
+  mGroupBoxROI->setEnabled(true);
   // is this needed ?
   //  actor->Update(); 
   // Final rendering
@@ -465,6 +539,7 @@ void vvToolROIManager::AllVisibleContourROIToggled(bool b) {
 
 //------------------------------------------------------------------------------
 void vvToolROIManager::ChangeColor() {
+  if (mCurrentROIActor == NULL) return;
   QColor color;
   color.setRgbF(mCurrentROIActor->GetROI()->GetDisplayColor()[0],
                 mCurrentROIActor->GetROI()->GetDisplayColor()[1],
@@ -487,6 +562,7 @@ void vvToolROIManager::ChangeColor() {
 
 //------------------------------------------------------------------------------
 void vvToolROIManager::ChangeContourColor() {
+  if (mCurrentROIActor == NULL) return;
   QColor color;
   color.setRgbF(mCurrentROIActor->GetContourColor()[0], 
                mCurrentROIActor->GetContourColor()[1], 
@@ -501,6 +577,7 @@ void vvToolROIManager::ChangeContourColor() {
 
 //------------------------------------------------------------------------------
 void vvToolROIManager::ChangeContourWidth(int n) {
+  if (mCurrentROIActor == NULL) return;
   mCurrentROIActor->SetContourWidth(n);
   mCurrentROIActor->UpdateColor();
   mSlicerManager->Render();
@@ -510,6 +587,7 @@ void vvToolROIManager::ChangeContourWidth(int n) {
 
 //------------------------------------------------------------------------------
 void vvToolROIManager::ChangeDepth(int n) {
+  if (mCurrentROIActor == NULL) return;
   mCurrentROIActor->SetDepth(n);
   mCurrentROIActor->UpdateImage();
   mSlicerManager->Render();
@@ -522,6 +600,14 @@ void vvToolROIManager::ChangeDepth(int n) {
 
 //------------------------------------------------------------------------------
 void vvToolROIManager::ReloadCurrentROI() {
+
+  // Remove all contours/overlay first
+  bool visible = mCurrentROIActor->IsVisible();
+  bool cvisible = mCurrentROIActor->IsContourVisible();
+  mCurrentROIActor->SetVisible(false);
+  mCurrentROIActor->SetContourVisible(false);
+  mSlicerManager->Render();
+  
   // Reload image
   vvImageReader::Pointer reader = vvImageReader::New();
   reader->SetInputFilename(mCurrentROI->GetFilename());
@@ -531,13 +617,14 @@ void vvToolROIManager::ReloadCurrentROI() {
                              reader->GetLastError().c_str());
     return;
   }
-  mCurrentROI->GetImage()->GetFirstVTKImageData()->ReleaseData();
+
+  mCurrentROI->GetImage()->Reset();//GetFirstVTKImageData()->ReleaseData();
   mCurrentROI->SetImage(reader->GetOutput());
   
-  // Update visu"
+  // Update visu
   mCurrentROIActor->UpdateImage();
+  mCurrentROIActor->SetVisible(visible);
+  mCurrentROIActor->SetContourVisible(cvisible);
   mSlicerManager->Render();    
 }
 //------------------------------------------------------------------------------
-
-