]> Creatis software - clitk.git/blob - vv/vvToolStructureSetManager.cxx
release memory when overlay and fusion images are closed
[clitk.git] / vv / vvToolStructureSetManager.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ======================================================================-====*/
18
19 // vv
20 #include "vvToolStructureSetManager.h"
21 #include "vvImageReader.h"
22 #include "vvStructureSetActor.h"
23 #include "vvSlicer.h"
24 #include "vvROIActor.h"
25
26 // Qt
27 #include <QFileDialog>
28 #include <QMessageBox>
29 #include <QColorDialog>
30
31 // vtk
32 #include <vtkLookupTable.h>
33 #include <vtkRenderWindow.h>
34
35 //------------------------------------------------------------------------------
36 // Create the tool and automagically (I like this word) insert it in
37 // the main window menu.
38 ADD_TOOL(vvToolStructureSetManager);
39 //------------------------------------------------------------------------------
40
41 int vvToolStructureSetManager::m_NumberOfTool = 0;
42 std::vector<vvSlicerManager*> vvToolStructureSetManager::mListOfInputs;
43 std::map<vvSlicerManager*, vvToolStructureSetManager*> vvToolStructureSetManager::mListOfOpenTool;
44
45 //------------------------------------------------------------------------------
46 vvToolStructureSetManager::vvToolStructureSetManager(vvMainWindowBase * parent, 
47                                                      Qt::WindowFlags f, 
48                                                      vvSlicerManager * current):
49   vvToolWidgetBase(parent, f), 
50   // if Qt::Widget -> No dialog in this case (in tab) ; PB = "invisible widget on menu" !
51   // if "f" normal widget
52   vvToolBase<vvToolStructureSetManager>(parent),
53   Ui::vvToolStructureSetManager()
54 {
55   Ui_vvToolStructureSetManager::setupUi(mToolWidget);
56
57   //  this->setFixedWidth(120);
58   m_NumberOfTool++;
59   mCurrentStructureSetActor = 0;
60   connect(mCloseButton, SIGNAL(clicked()), this, SLOT(close()));
61   mCloseButton->setVisible(false);
62   mTree->clear();
63   mTree->header()->resizeSection(0, 30);
64   mMainWindowBase->GetTab()->setTabIcon(mTabNumber, GetToolIcon());
65   mCurrentStructureSet = NULL;
66   mCurrentStructureSetIndex = -1;
67   mGroupBoxROI->setEnabled(false);
68   mCurrentROIActor = NULL;
69   mIsAllVisibleEnabled = false;
70   mNumberOfVisibleROI = 0;
71   mNumberOfVisibleContourROI = 0;
72   mDefaultLUTColor = vtkLookupTable::New();
73   for(int i=0; i<mDefaultLUTColor->GetNumberOfTableValues(); i++) {
74     double r = (rand()/(RAND_MAX+1.0));
75     double v = (rand()/(RAND_MAX+1.0));
76     double b = (rand()/(RAND_MAX+1.0));
77     mDefaultLUTColor->SetTableValue(i, r, v, b);
78     //    std::cout << "mDefaultLUTColor->SetTableValue(" << i << ", " << r << ", " << v << ", " << b << ");" << std::endl;
79   }
80 #include "vvDefaultLut.h"
81
82   // Add input selector
83   if (current == NULL) {
84     MustOpenDialogWhenCreated = true;
85     AddInputSelector("Select image");
86   }
87   else {
88     MustOpenDialogWhenCreated = false;
89     mMainButtonBox->setEnabled(true);
90     mCurrentSlicerManager = current;
91     mCurrentImage = mCurrentSlicerManager->GetImage();
92     mToolWidget->setEnabled(true);
93     InputIsSelected(mCurrentSlicerManager);
94   }
95 }
96 //------------------------------------------------------------------------------
97
98
99 //------------------------------------------------------------------------------
100 vvToolStructureSetManager::~vvToolStructureSetManager()
101 {
102   m_NumberOfTool--;
103   // DD(mStructureSetsList.size());
104   // DD(mStructureSetActorsList.size());
105   for(uint i=0; i<mStructureSetsList.size();i++) {
106     //    DD(i);
107     delete mStructureSetsList[i];
108     delete mStructureSetActorsList[i];
109   }
110 }
111 //------------------------------------------------------------------------------
112
113
114 //------------------------------------------------------------------------------
115 // STATIC
116 void vvToolStructureSetManager::Initialize() {
117   SetToolName("ROIManager");
118   SetToolMenuName("Display ROI");
119   SetToolIconFilename(":/common/icons/tool-roi.png");
120   SetToolTip("Display ROI from label image.");
121   SetToolExperimental(true);
122 }
123 //------------------------------------------------------------------------------
124
125
126 //------------------------------------------------------------------------------
127 void vvToolStructureSetManager::InputIsSelected(vvSlicerManager *m)
128 {
129   //int mTabNumber = parent->GetTab()->addTab(this, "");
130   //  this->setFixedWidth(120);
131   //this->setPreferedHeight(441);  
132   // Refuse if 4D
133   if (mCurrentImage->GetNumberOfDimensions() != 3) {
134     QMessageBox::information(this,tr("Sorry only 3D yet"), tr("Sorry only 3D yet"));
135     close();
136   }
137   // Hide selector
138   HideInputSelector(); // splitter
139   mToolInputSelectionWidget->hide();
140   mLabelInputInfo->setText(QString("%1").arg(m->GetFileName().c_str()));
141
142   // add to instance
143   // if (!isWindow()) {
144   mListOfInputs.push_back(mCurrentSlicerManager);
145   mListOfOpenTool[mCurrentSlicerManager] = this;
146   // }
147
148   // Connect open menus
149   connect(mOpenBinaryButton, SIGNAL(clicked()), this, SLOT(OpenBinaryImage()));
150   connect(mTree, SIGNAL(itemSelectionChanged()), this, SLOT(SelectedItemChangedInTree()));
151   connect(mCheckBoxShow, SIGNAL(toggled(bool)), this, SLOT(VisibleROIToggled(bool)));
152   connect(mOpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(OpacityChanged(int)));
153   connect(mChangeColorButton, SIGNAL(clicked()), this, SLOT(ChangeColor()));
154   connect(mContourCheckBoxShow, SIGNAL(toggled(bool)), this, SLOT(VisibleContourROIToggled(bool)));  
155   connect(mChangeContourColorButton, SIGNAL(clicked()), this, SLOT(ChangeContourColor()));
156   connect(mContourWidthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeContourWidth(int)));
157   connect(mReloadButton, SIGNAL(clicked()), this, SLOT(ReloadCurrentROI()));
158   connect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int)));
159   connect(mContourCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleContourROIToggled(bool)));
160
161   // Browse to load image
162   if (MustOpenDialogWhenCreated)
163     OpenBinaryImage();
164 }
165 //------------------------------------------------------------------------------
166
167
168 //------------------------------------------------------------------------------
169 void vvToolStructureSetManager::Open(int type) {
170   switch (type) {
171   case 0: OpenBinaryImage(); return; // Open binary image;
172   case 1: DD("TODO"); return; // Open DICOM RT
173   case 2: DD("TODO"); return; // Open mesh
174   default: std::cerr << "Error ????" << std::endl; exit(0);
175   }
176 }
177 //------------------------------------------------------------------------------
178
179
180 //------------------------------------------------------------------------------
181 void vvToolStructureSetManager::AddRoiInTreeWidget(clitk::DicomRT_ROI * roi, QTreeWidget * ww) {
182   QTreeWidgetItem * w = new QTreeWidgetItem(ww);
183   w->setText(0, QString("%1").arg(roi->GetROINumber()));
184   w->setText(1, QString("%1").arg(roi->GetName().c_str()));
185   QBrush brush(QColor(roi->GetDisplayColor()[0]*255, roi->GetDisplayColor()[1]*255, roi->GetDisplayColor()[2]*255));
186   brush.setStyle(Qt::SolidPattern);
187   w->setBackground(2, brush);
188   mMapROIToTreeWidget[roi] = w;
189   mMapTreeWidgetToROI[w] = roi;
190   mTree->resizeColumnToContents(0);
191   mTree->resizeColumnToContents(1);
192 }
193 //------------------------------------------------------------------------------
194
195
196 //------------------------------------------------------------------------------
197 void vvToolStructureSetManager::UpdateStructureSetInTreeWidget(int index, clitk::DicomRT_StructureSet * s) {
198   // Insert ROI
199   const std::vector<clitk::DicomRT_ROI*> & rois = s->GetListOfROI();
200   for(unsigned int i=0; i<rois.size(); i++) {
201     if (mMapROIToTreeWidget.find(rois[i]) == mMapROIToTreeWidget.end())
202       AddRoiInTreeWidget(rois[i], mTree); // replace mTree with ss if several SS
203   }
204 }
205 //------------------------------------------------------------------------------
206
207
208 //------------------------------------------------------------------------------
209 int vvToolStructureSetManager::AddStructureSet(clitk::DicomRT_StructureSet * mStructureSet) {
210   // Create actor for this SS
211
212   vvStructureSetActor * mStructureSetActor =  new vvStructureSetActor;
213   
214   mStructureSetActor->SetStructureSet(mStructureSet);
215   mStructureSetActor->SetSlicerManager(mCurrentSlicerManager);
216   // Insert in lists and get index
217   mStructureSetsList.push_back(mStructureSet);
218   mStructureSetActorsList.push_back(mStructureSetActor);
219   int index = mStructureSetsList.size()-1;
220   // Return index
221   return index;
222 }
223 //------------------------------------------------------------------------------
224
225
226 //------------------------------------------------------------------------------
227 void vvToolStructureSetManager::OpenBinaryImage() 
228 {
229   int index;
230   if (mCurrentStructureSet == NULL) {
231     if (mStructureSetsList.size() == 0) { // Create a default SS
232       clitk::DicomRT_StructureSet * mStructureSet = new clitk::DicomRT_StructureSet;
233       index = AddStructureSet(mStructureSet);
234     }
235     else { // Get first SS
236       index = 0;
237     }
238   } else {
239     index = mCurrentStructureSetIndex;
240   }
241   mCurrentStructureSet = mStructureSetsList[index];
242   mCurrentStructureSetActor = mStructureSetActorsList[index];
243   mCurrentStructureSetIndex = index;
244   // Open images
245   QString Extensions = "Images files ( *.mhd *.hdr *.his)";
246   Extensions += ";;All Files (*)";
247   QStringList filename =
248     QFileDialog::getOpenFileNames(this,tr("Open binary image"),
249                                   mMainWindowBase->GetInputPathName(),Extensions);
250   if (filename.size() == 0) return;
251   mLoadedROIIndex.clear();
252   for(int i=0; i<filename.size(); i++) {
253     // Open Image
254     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
255     vvImageReader * mReader = new vvImageReader;
256     std::vector<std::string> filenames;
257     filenames.push_back(filename[i].toStdString());
258     mReader->SetInputFilenames(filenames);
259     mReader->Update(IMAGE);
260     QApplication::restoreOverrideCursor();
261
262     if (mReader->GetLastError().size() != 0) {
263       std::cerr << "Error while reading " << filename[i].toStdString() << std::endl;
264       QString error = "Cannot open file \n";
265       error += mReader->GetLastError().c_str();
266       QMessageBox::information(this,tr("Reading problem"),error);
267       delete mReader;
268       return;
269     }
270     vvImage::Pointer binaryImage = mReader->GetOutput();
271     AddImage(binaryImage, filename[i].toStdString(), mBackgroundValueSpinBox->value());
272     delete mReader;
273   }
274   UpdateImage();
275 }
276 //------------------------------------------------------------------------------
277
278
279 //------------------------------------------------------------------------------
280 void vvToolStructureSetManager::UpdateImage() 
281 {
282   // Update the TreeWidget
283   UpdateStructureSetInTreeWidget(mCurrentStructureSetIndex, mCurrentStructureSet);
284   // Render loaded ROIs (the first is sufficient)
285   for(unsigned int i=0; i<mLoadedROIIndex.size(); i++) {
286     mCurrentStructureSetActor->GetROIActor(mLoadedROIIndex[i])->Update();
287   }
288   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
289     mCurrentSlicerManager->GetSlicer(i)->Render();
290   }  
291 }
292 //------------------------------------------------------------------------------
293
294
295 //------------------------------------------------------------------------------
296 void vvToolStructureSetManager::AddImage(vvImage * binaryImage, std::string filename, 
297                                          double BG, bool m_modeBG) 
298 {
299   // Check current structure set
300   int index;
301   if (mCurrentStructureSet == NULL) {
302     if (mStructureSetsList.size() == 0) { // Create a default SS
303       clitk::DicomRT_StructureSet * mStructureSet = new clitk::DicomRT_StructureSet;
304       index = AddStructureSet(mStructureSet);
305     }
306     else { // Get first SS
307       index = 0;
308     }
309   } else {
310     index = mCurrentStructureSetIndex;
311   }
312   mCurrentStructureSet = mStructureSetsList[index];
313   mCurrentStructureSetActor = mStructureSetActorsList[index];
314   mCurrentStructureSetIndex = index;
315
316   // Check Dimension
317   int dim = mCurrentImage->GetNumberOfDimensions();
318   int bin_dim = binaryImage->GetNumberOfDimensions();
319   if (dim < bin_dim) {  ////////// TO CHANGE FOR 3D/4D
320     std::ostringstream os;
321     os << "Error. Loaded binary image is " << bin_dim
322        << "D while selected image is " << dim << "D" << std::endl;
323     QMessageBox::information(this,tr("Reading problem"),os.str().c_str());
324     return;
325   }
326   
327   // Add a new roi to the structure
328   int n = mCurrentStructureSet->AddBinaryImageAsNewROI(binaryImage, filename);
329   mLoadedROIIndex.push_back(n);
330   if (m_modeBG) 
331     mCurrentStructureSet->GetROI(n)->SetBackgroundValueLabelImage(BG);
332   else 
333     mCurrentStructureSet->GetROI(n)->SetForegroundValueLabelImage(BG);
334   
335   // Change color
336   if (n<mDefaultLUTColor->GetNumberOfTableValues ()) {
337     double * color = mDefaultLUTColor->GetTableValue(n % mDefaultLUTColor->GetNumberOfTableValues ());
338     mCurrentStructureSet->GetROI(n)->SetDisplayColor(color[0], color[1], color[2]);
339   }
340   
341   // Add a new roi actor
342   mCurrentStructureSetActor->CreateNewROIActor(n, m_modeBG);
343   
344   // CheckBox for "All"
345   if (mCurrentStructureSetActor->GetROIActor(n)->IsVisible())
346     mNumberOfVisibleROI++;
347   if (mCurrentStructureSetActor->GetROIActor(n)->IsContourVisible())
348     mNumberOfVisibleContourROI++;
349   UpdateAllROIStatus();
350 }
351 //------------------------------------------------------------------------------
352
353
354 //------------------------------------------------------------------------------
355 void vvToolStructureSetManager::apply() 
356 {
357   close();
358 }
359 //------------------------------------------------------------------------------
360
361
362 //------------------------------------------------------------------------------
363 bool vvToolStructureSetManager::close()
364 {
365   return vvToolWidgetBase::close();
366 }
367 //------------------------------------------------------------------------------
368
369
370 //------------------------------------------------------------------------------
371 void vvToolStructureSetManager::closeEvent(QCloseEvent *event) 
372 {
373   // DD("vvToolStructureSetManager::closeEvent()");
374   std::vector<vvSlicerManager*>::iterator iter = std::find(mListOfInputs.begin(), mListOfInputs.end(), mCurrentSlicerManager);
375   if (iter != mListOfInputs.end()) mListOfInputs.erase(iter);
376   
377   //  DD("how delete mListOfOpenTool ???");
378   mListOfOpenTool.erase(mCurrentSlicerManager);
379
380   mCheckBoxShowAll->setCheckState(Qt::Unchecked);
381   mContourCheckBoxShowAll->setCheckState(Qt::Unchecked);
382   if (mCurrentSlicerManager != 0) mCurrentSlicerManager->Render();
383   if (mCurrentStructureSetActor) {
384     for(int i=0; i<mCurrentStructureSetActor->GetNumberOfROIs(); i++) {
385       // DD(i);
386       mCurrentStructureSetActor->GetROIList()[i]->SetVisible(false);
387       mCurrentStructureSetActor->GetROIList()[i]->SetContourVisible(false);
388       delete mCurrentStructureSetActor->GetROIList()[i];
389     }
390   }
391
392   if (!isWindow()) {
393     if (m_NumberOfTool == 1) {
394       mMainWindow->GetTab()->removeTab(mTabNumber);
395     }
396   } 
397
398   event->accept();
399 }
400 //------------------------------------------------------------------------------
401
402
403 //------------------------------------------------------------------------------
404 // CURRENT ROI INTERACTION
405 //------------------------------------------------------------------------------
406
407
408 //------------------------------------------------------------------------------
409 void vvToolStructureSetManager::SelectedItemChangedInTree() {
410   // Search which roi is selected
411   QList<QTreeWidgetItem *> l = mTree->selectedItems();
412   if (l.size() == 0) {
413     mCurrentROIActor = NULL;
414     mCurrentROI = NULL;
415     mGroupBoxROI->setEnabled(false);
416     return;
417   }
418   QTreeWidgetItem * w = l[0];
419   if (mMapTreeWidgetToROI.find(w) == mMapTreeWidgetToROI.end()) {
420     mCurrentROIActor = NULL;
421     mCurrentROI = NULL;
422     mGroupBoxROI->setEnabled(false);
423     return;
424   }
425   clitk::DicomRT_ROI * roi = mMapTreeWidgetToROI[w];
426   // Get selected roi actor
427   vvROIActor * actor = mStructureSetActorsList[mCurrentStructureSetIndex]->GetROIActor(roi->GetROINumber());
428   mCurrentROI = roi;
429   mCurrentROIActor = actor;
430
431   // Update GUI
432   mGroupBoxROI->setEnabled(true);
433   mROInameLabel->setText(roi->GetName().c_str());
434   mCheckBoxShow->setChecked(actor->IsVisible());
435   mContourCheckBoxShow->setChecked(actor->IsContourVisible());
436   mContourWidthSpinBox->setValue(actor->GetContourWidth());
437   
438   // Warning -> avoir unuseful Render here by disconnect slider 
439   disconnect(mOpacitySlider, SIGNAL(valueChanged(int)), 
440              this, SLOT(OpacityChanged(int)));
441   mOpacitySlider->setValue((int)lrint(actor->GetOpacity()*100));
442   mOpacitySpinBox->setValue((int)lrint(actor->GetOpacity()*100));
443   connect(mOpacitySlider, SIGNAL(valueChanged(int)), 
444           this, SLOT(OpacityChanged(int)));
445   actor->Update(); 
446
447   // Final rendering
448   mCurrentSlicerManager->Render();
449 }
450 //------------------------------------------------------------------------------
451
452
453 //------------------------------------------------------------------------------
454 void vvToolStructureSetManager::UpdateAllROIStatus() {
455   int nbVisible = 0;
456   int nb = mCurrentStructureSetActor->GetROIList().size();
457   for(int i=0; i<nb; i++) {
458     if (mCurrentStructureSetActor->GetROIList()[i]->IsVisible()) {
459       nbVisible++;
460     }
461   }
462
463   disconnect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int)));  
464   disconnect(mContourCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleContourROIToggled(bool)));
465   if (nbVisible == nb) mCheckBoxShowAll->setCheckState(Qt::Checked);
466   else {
467     if (nbVisible == 0) mCheckBoxShowAll->setCheckState(Qt::Unchecked);
468     else mCheckBoxShowAll->setCheckState(Qt::PartiallyChecked);
469   }
470   connect(mContourCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleContourROIToggled(bool)));
471   connect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int)));
472 }
473 //------------------------------------------------------------------------------
474
475 //------------------------------------------------------------------------------
476 void vvToolStructureSetManager::VisibleROIToggled(bool b) {
477   if (mCurrentROIActor == NULL) return;
478   if (b == mCurrentROIActor->IsVisible()) return; // nothing to do
479   mCurrentROIActor->SetVisible(b);
480   UpdateAllROIStatus();
481   mCurrentSlicerManager->Render(); 
482 }
483 //------------------------------------------------------------------------------
484
485
486 //------------------------------------------------------------------------------
487 void vvToolStructureSetManager::VisibleContourROIToggled(bool b) {
488   if (mCurrentROIActor == NULL) return;
489   if (mCurrentROIActor->IsContourVisible() == b) return; // nothing to do
490   mCurrentROIActor->SetContourVisible(b);
491   mCurrentROIActor->UpdateColor();
492   mCurrentSlicerManager->Render(); 
493 }
494 //------------------------------------------------------------------------------
495
496
497 //------------------------------------------------------------------------------
498 void vvToolStructureSetManager::OpacityChanged(int v) {
499   if (mCurrentROIActor == NULL) return;
500   mCurrentROIActor->SetOpacity((double)v/100.0);
501   mCurrentROIActor->UpdateColor();
502   mCurrentSlicerManager->Render(); 
503 }
504 //------------------------------------------------------------------------------
505
506
507 //------------------------------------------------------------------------------
508 void vvToolStructureSetManager::AllVisibleROIToggled(int b) {
509   bool status = false;
510   if ((mCheckBoxShowAll->checkState() == Qt::Checked) ||
511       (mCheckBoxShowAll->checkState() == Qt::PartiallyChecked))  status = true;
512
513   for(int i=0; i<mCurrentStructureSetActor->GetNumberOfROIs(); i++) {
514     mCurrentStructureSetActor->GetROIList()[i]->SetVisible(status);
515   }
516   if (status) mCheckBoxShowAll->setCheckState(Qt::Checked);
517   else  mCheckBoxShowAll->setCheckState(Qt::Unchecked);
518   mCheckBoxShow->setChecked(status);
519   mCurrentSlicerManager->Render(); 
520 }
521 //------------------------------------------------------------------------------
522
523
524 //------------------------------------------------------------------------------
525 void vvToolStructureSetManager::AllVisibleContourROIToggled(bool b) {
526   bool status = false;
527   if ((mContourCheckBoxShowAll->checkState() == Qt::Checked) ||
528       (mContourCheckBoxShowAll->checkState() == Qt::PartiallyChecked))  status = true;
529   // Update current 
530   for(int i=0; i<mCurrentStructureSetActor->GetNumberOfROIs(); i++) {
531     mCurrentStructureSetActor->GetROIList()[i]->SetContourVisible(status);
532   }
533   // Update current selection
534   if (status) mContourCheckBoxShowAll->setCheckState(Qt::Checked);
535   else  mContourCheckBoxShowAll->setCheckState(Qt::Unchecked);
536   mContourCheckBoxShow->setChecked(status);
537   mCurrentSlicerManager->Render(); 
538 }
539 //------------------------------------------------------------------------------
540
541
542 //------------------------------------------------------------------------------
543 void vvToolStructureSetManager::ChangeColor() {
544   QColor color;
545   color.setRgbF(mCurrentROIActor->GetROI()->GetDisplayColor()[0],
546                 mCurrentROIActor->GetROI()->GetDisplayColor()[1],
547                 mCurrentROIActor->GetROI()->GetDisplayColor()[2]);
548   QColor c = QColorDialog::getColor(color, this, "Choose the ROI color");
549   mCurrentROIActor->GetROI()->SetDisplayColor(c.redF(), c.greenF(), c.blueF());
550   mCurrentROIActor->UpdateColor();
551
552   QTreeWidgetItem * w = mMapROIToTreeWidget[mCurrentROI];
553   QBrush brush(QColor(mCurrentROI->GetDisplayColor()[0]*255,
554                       mCurrentROI->GetDisplayColor()[1]*255,
555                       mCurrentROI->GetDisplayColor()[2]*255));
556   brush.setStyle(Qt::SolidPattern);
557   w->setBackground(2, brush);
558   // Render
559   mCurrentSlicerManager->Render();
560 }
561 //------------------------------------------------------------------------------
562
563
564 //------------------------------------------------------------------------------
565 void vvToolStructureSetManager::ChangeContourColor() {
566   QColor color;
567   color.setRgbF(mCurrentROIActor->GetContourColor()[0], 
568                 mCurrentROIActor->GetContourColor()[1], 
569                 mCurrentROIActor->GetContourColor()[2]);
570   QColor c = QColorDialog::getColor(color, this, "Choose the contour color");
571   mCurrentROIActor->SetContourColor(c.redF(), c.greenF(), c.blueF());
572   mCurrentROIActor->UpdateColor();
573   mCurrentSlicerManager->Render();
574 }
575 //------------------------------------------------------------------------------
576
577
578 //------------------------------------------------------------------------------
579 void vvToolStructureSetManager::ChangeContourWidth(int n) {
580   mCurrentROIActor->SetContourWidth(n);
581   mCurrentROIActor->UpdateColor();
582   mCurrentSlicerManager->Render();
583 }
584 //------------------------------------------------------------------------------
585
586
587 //------------------------------------------------------------------------------
588 void vvToolStructureSetManager::ReloadCurrentROI() {
589   // Reload image
590   vvImageReader * mReader = new vvImageReader;
591   mReader->SetInputFilename(mCurrentROI->GetFilename());
592   mReader->Update(IMAGE);
593   if (mReader->GetLastError() != "") {
594     QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), mReader->GetLastError().c_str());
595     return;
596   }
597   //  delete mCurrentROI->GetImage();
598   // DD(mCurrentROI->GetImage()->GetFirstVTKImageData()->GetDataReleased());
599   //   DD(mCurrentROI->GetImage()->GetFirstVTKImageData()->GetReferenceCount());
600   mCurrentROI->GetImage()->GetFirstVTKImageData()->ReleaseData();
601   // DD(mCurrentROI->GetImage()->GetFirstVTKImageData()->GetDataReleased());
602   mCurrentROI->SetImage(mReader->GetOutput());
603   
604   // Update visu"
605   mCurrentROIActor->UpdateImage();
606   mCurrentSlicerManager->Render();    
607 }
608 //------------------------------------------------------------------------------
609
610
611 //------------------------------------------------------------------------------
612 void vvToolStructureSetManager::CheckInputList(std::vector<vvSlicerManager*> & l, int & index) 
613 {
614   for(unsigned int i=0; i<l.size(); i++) {
615     std::vector<vvSlicerManager*>::iterator iter = std::find(mListOfInputs.begin(), mListOfInputs.end(), l[i]);
616     if (iter != mListOfInputs.end()) {
617       for(unsigned int j=i;j<l.size(); j++) l[j] = l[j+1];
618       l.pop_back();
619       if (index == (int)i) index = 0;
620       i--;
621     }
622   }
623 }
624 //------------------------------------------------------------------------------
625
626
627 //------------------------------------------------------------------------------
628 // STATIC
629 vvToolStructureSetManager * vvToolStructureSetManager::AddImage(vvSlicerManager * m, std::string name, vvImage::Pointer image, double BG, bool m_modeBG)
630 {
631   // If the tool is open for this vvSlicerManager, use it and return
632   if (mListOfOpenTool[m]) {
633     vvToolStructureSetManager * tool = mListOfOpenTool[m];
634     tool->AddImage(image, name, BG, m_modeBG);
635     tool->UpdateImage();
636     return tool;
637   }
638
639   // If the tool is not open, create it
640   vvToolStructureSetManager * tool = new vvToolStructureSetManager
641     (CREATOR(vvToolStructureSetManager)->GetMainWindow(), Qt::Dialog, m);
642   tool->AddImage(image, name, BG, m_modeBG);
643   tool->UpdateImage();
644   tool->show();
645   return tool;
646 }
647 //------------------------------------------------------------------------------