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
- BSD See included LICENSE.txt file
- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
- ======================================================================-====*/
+ ===========================================================================**/
// vv
#include "vvToolStructureSetManager.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QColorDialog>
-
+#include <QAbstractEventDispatcher>
+
// vtk
#include <vtkLookupTable.h>
#include <vtkRenderWindow.h>
mIsAllVisibleEnabled = false;
mNumberOfVisibleROI = 0;
mNumberOfVisibleContourROI = 0;
- mDefaultLUTColor = vtkLookupTable::New();
- for(unsigned int i=0; i<mDefaultLUTColor->GetNumberOfTableValues(); i++) {
+ mDefaultLUTColor = vtkSmartPointer<vtkLookupTable>::New();
+ 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));
vvToolStructureSetManager::~vvToolStructureSetManager()
{
m_NumberOfTool--;
+
+ // clearing the list at this point avoids
+ // segfaulting due to events being dispatched
+ // after object destruction
+ mTreeWidgetList.clear();
+ mTree->clearSelection();
+
+ //std::cout << "vvToolStructureSetManager::~vvToolStructureSetManager()" << std::endl;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// STATIC
void vvToolStructureSetManager::Initialize() {
- SetToolName("ROIManager");
- SetToolMenuName("Display ROI");
+ SetToolName("ROIManager_OLD");
+ SetToolMenuName("Display ROI (binary image)");
SetToolIconFilename(":/common/icons/tool-roi.png");
- SetToolTip("Display ROI from label image.");
+ SetToolTip("Display ROI from a binary image.");
SetToolExperimental(true);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void vvToolStructureSetManager::InputIsSelected(vvSlicerManager *m)
{
+ //std::cout << "vvToolStructureSetManager::InputIsSelected()" << std::endl;
+
//int mTabNumber = parent->GetTab()->addTab(this, "");
// this->setFixedWidth(120);
//this->setPreferedHeight(441);
if (mCurrentImage->GetNumberOfDimensions() != 3) {
QMessageBox::information(this,tr("Sorry only 3D yet"), tr("Sorry only 3D yet"));
close();
+ return;
}
// Hide selector
HideInputSelector(); // splitter
connect(mContourCheckBoxShow, SIGNAL(toggled(bool)), this, SLOT(VisibleContourROIToggled(bool)));
connect(mChangeContourColorButton, SIGNAL(clicked()), this, SLOT(ChangeContourColor()));
connect(mContourWidthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeContourWidth(int)));
+ connect(mDepthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeDepth(int)));
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)));
//------------------------------------------------------------------------------
void vvToolStructureSetManager::AddRoiInTreeWidget(clitk::DicomRT_ROI * roi, QTreeWidget * ww) {
- QTreeWidgetItem * w = new QTreeWidgetItem(ww);
+ mTreeWidgetList.push_back(QSharedPointer<QTreeWidgetItem>(new QTreeWidgetItem(ww)));
+ QTreeWidgetItem * w = mTreeWidgetList.back().data();
w->setText(0, QString("%1").arg(roi->GetROINumber()));
w->setText(1, QString("%1").arg(roi->GetName().c_str()));
+ vvROIActor * actor = mStructureSetActorsList[0]->GetROIActor(roi->GetROINumber());
+ w->setText(3, QString("%1").arg(actor->GetDepth()));
QBrush brush(QColor(roi->GetDisplayColor()[0]*255, roi->GetDisplayColor()[1]*255, roi->GetDisplayColor()[2]*255));
brush.setStyle(Qt::SolidPattern);
w->setBackground(2, brush);
//------------------------------------------------------------------------------
void vvToolStructureSetManager::UpdateStructureSetInTreeWidget(int index, clitk::DicomRT_StructureSet * s) {
// Insert ROI
- const std::vector<clitk::DicomRT_ROI*> & rois = s->GetListOfROI();
+ /*
+ const std::vector<clitk::DicomRT_ROI::Pointer> & rois = s->GetListOfROI();
for(unsigned int i=0; i<rois.size(); i++) {
if (mMapROIToTreeWidget.find(rois[i]) == mMapROIToTreeWidget.end())
AddRoiInTreeWidget(rois[i], mTree); // replace mTree with ss if several SS
}
+ */
+ clitk::DicomRT_StructureSet::ROIConstIteratorType iter;
+ for(iter = s->GetROIs().begin(); iter != s->GetROIs().end(); iter++) {
+ clitk::DicomRT_ROI::Pointer roi = iter->second;
+ if (mMapROIToTreeWidget.find(roi) == mMapROIToTreeWidget.end())
+ AddRoiInTreeWidget(roi, mTree); // replace mTree with ss if several SS
+ }
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
int vvToolStructureSetManager::AddStructureSet(clitk::DicomRT_StructureSet * mStructureSet) {
// Create actor for this SS
- vvStructureSetActor * mStructureSetActor = new vvStructureSetActor;
+
+ QSharedPointer<vvStructureSetActor> mStructureSetActor(new vvStructureSetActor);
+
mStructureSetActor->SetStructureSet(mStructureSet);
mStructureSetActor->SetSlicerManager(mCurrentSlicerManager);
// Insert in lists and get index
int index;
if (mCurrentStructureSet == NULL) {
if (mStructureSetsList.size() == 0) { // Create a default SS
- clitk::DicomRT_StructureSet * mStructureSet = new clitk::DicomRT_StructureSet;
+ clitk::DicomRT_StructureSet::Pointer mStructureSet = clitk::DicomRT_StructureSet::New();
index = AddStructureSet(mStructureSet);
}
else { // Get first SS
index = mCurrentStructureSetIndex;
}
mCurrentStructureSet = mStructureSetsList[index];
- mCurrentStructureSetActor = mStructureSetActorsList[index];
+ mCurrentStructureSetActor = mStructureSetActorsList[index].data();
mCurrentStructureSetIndex = index;
// Open images
- QString Extensions = "Images files ( *.mhd *.hdr *.his)";
+ QString Extensions = "Images files ( *.mha *.mhd *.hdr *.his)";
Extensions += ";;All Files (*)";
QStringList filename =
QFileDialog::getOpenFileNames(this,tr("Open binary image"),
for(int i=0; i<filename.size(); i++) {
// Open Image
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
- vvImageReader * mReader = new vvImageReader;
+ vvImageReader::Pointer reader = vvImageReader::New();
std::vector<std::string> filenames;
filenames.push_back(filename[i].toStdString());
- mReader->SetInputFilenames(filenames);
- mReader->Update(IMAGE);
+ reader->SetInputFilenames(filenames);
+ reader->Update(vvImageReader::IMAGE);
QApplication::restoreOverrideCursor();
- if (mReader->GetLastError().size() != 0) {
+ if (reader->GetLastError().size() != 0) {
std::cerr << "Error while reading " << filename[i].toStdString() << std::endl;
QString error = "Cannot open file \n";
- error += mReader->GetLastError().c_str();
+ error += reader->GetLastError().c_str();
QMessageBox::information(this,tr("Reading problem"),error);
- delete mReader;
return;
}
- vvImage::Pointer binaryImage = mReader->GetOutput();
+ vvImage::Pointer binaryImage = reader->GetOutput();
AddImage(binaryImage, filename[i].toStdString(), mBackgroundValueSpinBox->value());
+ mOpenedBinaryImage.push_back(binaryImage);
}
+
UpdateImage();
}
//------------------------------------------------------------------------------
for(unsigned int i=0; i<mLoadedROIIndex.size(); i++) {
mCurrentStructureSetActor->GetROIActor(mLoadedROIIndex[i])->Update();
}
- for(int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
+ for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
mCurrentSlicerManager->GetSlicer(i)->Render();
}
}
//------------------------------------------------------------------------------
-void vvToolStructureSetManager::AddImage(vvImage::Pointer binaryImage, std::string filename, double BG, bool m_modeBG)
+void vvToolStructureSetManager::AddImage(vvImage * binaryImage, std::string filename,
+ double BG, bool m_modeBG)
{
// Check current structure set
int index;
if (mCurrentStructureSet == NULL) {
if (mStructureSetsList.size() == 0) { // Create a default SS
- clitk::DicomRT_StructureSet * mStructureSet = new clitk::DicomRT_StructureSet;
+ clitk::DicomRT_StructureSet::Pointer mStructureSet = clitk::DicomRT_StructureSet::New();
index = AddStructureSet(mStructureSet);
}
else { // Get first SS
index = mCurrentStructureSetIndex;
}
mCurrentStructureSet = mStructureSetsList[index];
- mCurrentStructureSetActor = mStructureSetActorsList[index];
+ mCurrentStructureSetActor = mStructureSetActorsList[index].data();
mCurrentStructureSetIndex = index;
// Check Dimension
int n = mCurrentStructureSet->AddBinaryImageAsNewROI(binaryImage, filename);
mLoadedROIIndex.push_back(n);
if (m_modeBG)
- mCurrentStructureSet->GetROI(n)->SetBackgroundValueLabelImage(BG);
+ mCurrentStructureSet->GetROIFromROINumber(n)->SetBackgroundValueLabelImage(BG);
else
- mCurrentStructureSet->GetROI(n)->SetForegroundValueLabelImage(BG);
+ mCurrentStructureSet->GetROIFromROINumber(n)->SetForegroundValueLabelImage(BG);
// Change color
if (n<mDefaultLUTColor->GetNumberOfTableValues ()) {
double * color = mDefaultLUTColor->GetTableValue(n % mDefaultLUTColor->GetNumberOfTableValues ());
- mCurrentStructureSet->GetROI(n)->SetDisplayColor(color[0], color[1], color[2]);
+ mCurrentStructureSet->GetROIFromROINumber(n)->SetDisplayColor(color[0], color[1], color[2]);
}
// Add a new roi actor
//------------------------------------------------------------------------------
bool vvToolStructureSetManager::close()
{
+ //std::cout << "vvToolStructureSetManager::close()" << std::endl;
+
return vvToolWidgetBase::close();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void vvToolStructureSetManager::closeEvent(QCloseEvent *event)
{
- // DD("vvToolStructureSetManager::closeEvent()");
+ //std::cout << "vvToolStructureSetManager::closeEvent()" << std::endl;
+
std::vector<vvSlicerManager*>::iterator iter = std::find(mListOfInputs.begin(), mListOfInputs.end(), mCurrentSlicerManager);
if (iter != mListOfInputs.end()) mListOfInputs.erase(iter);
mCheckBoxShowAll->setCheckState(Qt::Unchecked);
mContourCheckBoxShowAll->setCheckState(Qt::Unchecked);
- if (mCurrentSlicerManager != 0) mCurrentSlicerManager->Render();
- if (mCurrentStructureSetActor) {
- for(int i=0; i<mCurrentStructureSetActor->GetNumberOfROIs(); i++) {
- // DD(i);
- mCurrentStructureSetActor->GetROIList()[i]->SetVisible(false);
- mCurrentStructureSetActor->GetROIList()[i]->SetContourVisible(false);
- delete mCurrentStructureSetActor->GetROIList()[i];
- }
- }
+ if (mCurrentSlicerManager != 0)
+ mCurrentSlicerManager->Render();
if (!isWindow()) {
if (m_NumberOfTool == 1) {
//------------------------------------------------------------------------------
void vvToolStructureSetManager::SelectedItemChangedInTree() {
+
// Search which roi is selected
QList<QTreeWidgetItem *> l = mTree->selectedItems();
if (l.size() == 0) {
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 = NULL;
mCurrentROI = NULL;
mCurrentROI = roi;
mCurrentROIActor = actor;
+ // Warning -> avoid unuseful Render here by disconnect slider
// Update GUI
+ disconnect(mTree, SIGNAL(itemSelectionChanged()), this, SLOT(SelectedItemChangedInTree()));
+ disconnect(mCheckBoxShow, SIGNAL(toggled(bool)), this, SLOT(VisibleROIToggled(bool)));
+ disconnect(mOpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(OpacityChanged(int)));
+ disconnect(mChangeColorButton, SIGNAL(clicked()), this, SLOT(ChangeColor()));
+ disconnect(mContourCheckBoxShow, SIGNAL(toggled(bool)), this, SLOT(VisibleContourROIToggled(bool)));
+ disconnect(mChangeContourColorButton, SIGNAL(clicked()), this, SLOT(ChangeContourColor()));
+ disconnect(mContourWidthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeContourWidth(int)));
+ disconnect(mDepthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeDepth(int)));
+
mGroupBoxROI->setEnabled(true);
mROInameLabel->setText(roi->GetName().c_str());
mCheckBoxShow->setChecked(actor->IsVisible());
mContourCheckBoxShow->setChecked(actor->IsContourVisible());
mContourWidthSpinBox->setValue(actor->GetContourWidth());
-
- // Warning -> avoir unuseful Render here by disconnect slider
- disconnect(mOpacitySlider, SIGNAL(valueChanged(int)),
- this, SLOT(OpacityChanged(int)));
+ mDepthSpinBox->setValue(actor->GetDepth());
+ w->setText(3, QString("%1").arg(actor->GetDepth()));
mOpacitySlider->setValue((int)lrint(actor->GetOpacity()*100));
mOpacitySpinBox->setValue((int)lrint(actor->GetOpacity()*100));
- connect(mOpacitySlider, SIGNAL(valueChanged(int)),
- this, SLOT(OpacityChanged(int)));
- actor->Update();
+ 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)));
+ connect(mChangeColorButton, SIGNAL(clicked()), this, SLOT(ChangeColor()));
+ connect(mContourCheckBoxShow, SIGNAL(toggled(bool)), this, SLOT(VisibleContourROIToggled(bool)));
+ connect(mChangeContourColorButton, SIGNAL(clicked()), this, SLOT(ChangeContourColor()));
+ connect(mContourWidthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeContourWidth(int)));
+ connect(mDepthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(ChangeDepth(int)));
+
+ // is this needed ?
+ // actor->Update();
// Final rendering
- mCurrentSlicerManager->Render();
+ // mCurrentSlicerManager->Render();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+void vvToolStructureSetManager::ChangeDepth(int n) {
+ mCurrentROIActor->SetDepth(n);
+ mCurrentROIActor->UpdateImage();
+ mCurrentSlicerManager->Render();
+ QList<QTreeWidgetItem *> l = mTree->selectedItems();
+ QTreeWidgetItem * w = l[0];
+ w->setText(3, QString("%1").arg(mCurrentROIActor->GetDepth()));
+}
+//------------------------------------------------------------------------------
+
+
//------------------------------------------------------------------------------
void vvToolStructureSetManager::ReloadCurrentROI() {
// Reload image
- vvImageReader * mReader = new vvImageReader;
- mReader->SetInputFilename(mCurrentROI->GetFilename());
- mReader->Update(IMAGE);
- if (mReader->GetLastError() != "") {
- QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), mReader->GetLastError().c_str());
+ vvImageReader::Pointer reader = vvImageReader::New();
+ reader->SetInputFilename(mCurrentROI->GetFilename());
+ reader->Update(vvImageReader::IMAGE);
+ if (reader->GetLastError() != "") {
+ QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), reader->GetLastError().c_str());
return;
}
- // delete mCurrentROI->GetImage();
- // DD(mCurrentROI->GetImage()->GetFirstVTKImageData()->GetDataReleased());
- // DD(mCurrentROI->GetImage()->GetFirstVTKImageData()->GetReferenceCount());
mCurrentROI->GetImage()->GetFirstVTKImageData()->ReleaseData();
- // DD(mCurrentROI->GetImage()->GetFirstVTKImageData()->GetDataReleased());
- mCurrentROI->SetImage(mReader->GetOutput());
+ mCurrentROI->SetImage(reader->GetOutput());
// Update visu"
mCurrentROIActor->UpdateImage();