X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolStructureSetManager.cxx;h=f311abcd2e51f8b5b447a9396ecd4fa52076a698;hb=3008a38da6740858582a298adeebef88e03cde04;hp=ea24ca6c06d3b8ecc924423b85d68170a1ddbc59;hpb=5a80d16b4dc2ad2d825c443f39ae6276786e72e4;p=clitk.git diff --git a/vv/vvToolStructureSetManager.cxx b/vv/vvToolStructureSetManager.cxx index ea24ca6..f311abc 100644 --- a/vv/vvToolStructureSetManager.cxx +++ b/vv/vvToolStructureSetManager.cxx @@ -1,7 +1,7 @@ /*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Authors belong to: + Authors belong to: - University of LYON http://www.universite-lyon.fr/ - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr @@ -14,7 +14,7 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ + ======================================================================-====*/ #include "vvToolStructureSetManager.h" #include "vvImageReader.h" @@ -37,9 +37,10 @@ ADD_TOOL(vvToolStructureSetManager); //------------------------------------------------------------------------------ vvToolStructureSetManager::vvToolStructureSetManager(vvMainWindowBase * parent, Qt::WindowFlags f) - :vvToolWidgetBase(parent, f), - vvToolBase(parent), - Ui::vvToolStructureSetManager() { + :vvToolWidgetBase(parent, f), + vvToolBase(parent), + Ui::vvToolStructureSetManager() +{ // Setup the UI Ui_vvToolStructureSetManager::setupUi(mToolWidget); mTree->clear(); @@ -47,16 +48,16 @@ vvToolStructureSetManager::vvToolStructureSetManager(vvMainWindowBase * parent, mCurrentStructureSetIndex = -1; mGroupBoxROI->setEnabled(false); mCurrentROIActor = NULL; - + mIsAllVisibleEnabled = false; mDefaultLUTColor = vtkLookupTable::New(); for(unsigned int i=0; iGetNumberOfTableValues(); 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); + mDefaultLUTColor->SetTableValue(i, r, v, b); // std::cout << "mDefaultLUTColor->SetTableValue(" << i << ", " << r << ", " << v << ", " << b << ");" << std::endl; } - #include "vvDefaultLut.h" +#include "vvDefaultLut.h" // Add input selector AddInputSelector("Select image"); @@ -65,7 +66,8 @@ vvToolStructureSetManager::vvToolStructureSetManager(vvMainWindowBase * parent, //------------------------------------------------------------------------------ -vvToolStructureSetManager::~vvToolStructureSetManager() { +vvToolStructureSetManager::~vvToolStructureSetManager() +{ DD("vvToolStructureSetManager DESTRUCTOR"); } //------------------------------------------------------------------------------ @@ -73,17 +75,18 @@ vvToolStructureSetManager::~vvToolStructureSetManager() { //------------------------------------------------------------------------------ void vvToolStructureSetManager::Initialize() { - SetToolName("StructureSetManager"); - SetToolMenuName("StructureSet"); + SetToolName("ROIManager"); + SetToolMenuName("Display ROI"); SetToolIconFilename(":/common/icons/ducky.png"); - SetToolTip("Display Structure Set."); + SetToolTip("Display ROI from label image."); SetToolExperimental(true); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolStructureSetManager::InputIsSelected(vvSlicerManager *m) { +void vvToolStructureSetManager::InputIsSelected(vvSlicerManager *m) +{ // Hide the input selector QList s; s.push_back(0); @@ -91,24 +94,30 @@ void vvToolStructureSetManager::InputIsSelected(vvSlicerManager *m) { splitter->setSizes(s); // Connect open menus // connect(mOpenComboBox, SIGNAL(activated(int)), this, SLOT(open(int))); - - connect(mOpenBinaryButton, SIGNAL(clicked()), this, SLOT(openBinaryImage())); - + connect(mOpenBinaryButton, SIGNAL(clicked()), this, SLOT(OpenBinaryImage())); DD(mCurrentImage->GetNumberOfDimensions()); // Seems that the following is not needed to refresh ... // connect(m, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int))); - 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(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(mCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleROIToggled(bool))); + connect(mOpacitySliderAll, SIGNAL(valueChanged(int)), this, SLOT(AllOpacityChanged(int))); + connect(mContourCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleContourROIToggled(bool))); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolStructureSetManager::LeftButtonReleaseEvent(int slicer) { +void vvToolStructureSetManager::LeftButtonReleaseEvent(int slicer) +{ DD("vvToolStructureSetManager::UpdateSlice"); //DD(slicer); //DD(view); @@ -122,10 +131,9 @@ void vvToolStructureSetManager::LeftButtonReleaseEvent(int slicer) { //------------------------------------------------------------------------------ -void vvToolStructureSetManager::open(int type) { - DD(type); +void vvToolStructureSetManager::Open(int type) { switch (type) { - case 0: openBinaryImage(); return; // Open binary image; + case 0: OpenBinaryImage(); return; // Open binary image; case 1: DD("TODO"); return; // Open DICOM RT case 2: DD("TODO"); return; // Open mesh default: std::cerr << "Error ????" << std::endl; exit(0); @@ -135,15 +143,16 @@ void vvToolStructureSetManager::open(int type) { //------------------------------------------------------------------------------ -void vvToolStructureSetManager::addRoiInTreeWidget(clitk::DicomRT_ROI * roi, QTreeWidgetItem * ww) { +void vvToolStructureSetManager::AddRoiInTreeWidget(clitk::DicomRT_ROI * roi, QTreeWidget * ww) { QTreeWidgetItem * w = new QTreeWidgetItem(ww); w->setText(0, QString("%1").arg(roi->GetROINumber())); w->setText(1, QString("%1").arg(roi->GetName().c_str())); + // w->setText(1, QString("%1").arg(roi->GetName().c_str())); QBrush brush(QColor(roi->GetDisplayColor()[0]*255, roi->GetDisplayColor()[1]*255, roi->GetDisplayColor()[2]*255)); brush.setStyle(Qt::SolidPattern); - for(int i=0; icolumnCount (); i++) { - w->setBackground(i, brush); - } + // for(int i=0; icolumnCount (); i++) { + w->setBackground(2, brush); + //} mMapROIToTreeWidget[roi] = w; mMapTreeWidgetToROI[w] = roi; // Connect ROI TreeWidget @@ -153,34 +162,37 @@ void vvToolStructureSetManager::addRoiInTreeWidget(clitk::DicomRT_ROI * roi, QTr //------------------------------------------------------------------------------ -void vvToolStructureSetManager::updateStructureSetInTreeWidget(int index, clitk::DicomRT_StructureSet * s) { - QTreeWidgetItem * ss; - if (mMapStructureSetIndexToTreeWidget.find(index) == mMapStructureSetIndexToTreeWidget.end()) { - // Main row item - ss = new QTreeWidgetItem(mTree); - // ss->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsTristate); - ss->setText(0, QString("S%1").arg(index)); - ss->setText(1, QString("%1").arg(s->GetLabel().c_str())); - // Insert in list - mMapStructureSetIndexToTreeWidget[index] = ss; +void vvToolStructureSetManager::UpdateStructureSetInTreeWidget(int index, clitk::DicomRT_StructureSet * s) { + + /* ==> Please, keep this comment (if need several SS) + QTreeWidgetItem * ss; + if (mMapStructureSetIndexToTreeWidget.find(index) == mMapStructureSetIndexToTreeWidget.end()) { + // Main row item + ss = new QTreeWidgetItem(mTree); + // ss->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsTristate); + ss->setText(0, QString("S%1").arg(index)); + ss->setText(1, QString("%1").arg(s->GetLabel().c_str())); + // Insert in list + mMapStructureSetIndexToTreeWidget[index] = ss; - // Connect Structure TreeWidget - // TODO - } - else ss = mMapStructureSetIndexToTreeWidget[index]; + // Connect Structure TreeWidget + // TODO + } + else ss = mMapStructureSetIndexToTreeWidget[index]; + */ // Insert ROI const std::vector & rois = s->GetListOfROI(); for(unsigned int i=0; i SET THIS SS AS CURRENT mCurrentStructureSet = mStructureSetsList[index]; mCurrentStructureSetActor = mStructureSetActorsList[index]; mCurrentStructureSetIndex = index; - DD(mCurrentStructureSetIndex); - DD(mCurrentStructureSet->GetName()); + // DD(mCurrentStructureSetIndex); + //DD(mCurrentStructureSet->GetName()); // Open images QString Extensions = "Images files ( *.mhd *.hdr *.his)"; Extensions += ";;All Files (*)"; - QStringList filename = + QStringList filename = QFileDialog::getOpenFileNames(this,tr("Open binary image"), - mMainWindowBase->GetInputPathName(),Extensions); + mMainWindowBase->GetInputPathName(),Extensions); if (filename.size() == 0) return; std::vector mLoadedROIIndex; for(int i=0; iSetInputFilenames(filenames); mReader->Update(IMAGE); QApplication::restoreOverrideCursor(); - + if (mReader->GetLastError().size() != 0) { std::cerr << "Error while reading " << filename[i].toStdString() << std::endl; QString error = "Cannot open file \n"; @@ -260,48 +271,52 @@ void vvToolStructureSetManager::openBinaryImage() { // Check Dimension int dim = mCurrentImage->GetNumberOfDimensions(); - DD(dim); + //DD(dim); int bin_dim = binaryImage->GetNumberOfDimensions(); - DD(bin_dim); + //DD(bin_dim); if (dim < bin_dim) { ////////// TO CHANGE FOR 3D/4D std::ostringstream os; - os << "Error. Loaded binary image is " << bin_dim - << "D while selected image is " << dim << "D" << std::endl; + os << "Error. Loaded binary image is " << bin_dim + << "D while selected image is " << dim << "D" << std::endl; QMessageBox::information(this,tr("Reading problem"),os.str().c_str()); return; } - + // Add a new roi to the structure int n = mCurrentStructureSet->AddBinaryImageAsNewROI(binaryImage, filename[i].toStdString()); //DD(n); mLoadedROIIndex.push_back(n); mCurrentStructureSet->GetROI(n)->SetBackgroundValueLabelImage(mBackgroundValueSpinBox->value()); - + // Change color NEED DEFAULT COLOR LIST - DD(mDefaultLUTColor->GetNumberOfTableValues ()); + //DD(mDefaultLUTColor->GetNumberOfTableValues ()); if (nGetNumberOfTableValues ()) { double * color = mDefaultLUTColor->GetTableValue(n % mDefaultLUTColor->GetNumberOfTableValues ()); - DD(color[0]); - DD(color[1]); - DD(color[2]); + //DD(color[0]); + //DD(color[1]); + //DD(color[2]); mCurrentStructureSet->GetROI(n)->SetDisplayColor(color[0], color[1], color[2]); } - + // Add a new roi actor mCurrentStructureSetActor->CreateNewROIActor(n); + + // CheckBox for "All" + if (mCurrentStructureSetActor->GetROIActor(n)->IsVisible()) + mNumberOfVisibleROI++; } // end loop on n selected filenames // Update the TreeWidget - updateStructureSetInTreeWidget(index, mCurrentStructureSet); - + UpdateStructureSetInTreeWidget(index, mCurrentStructureSet); // Render loaded ROIs (the first is sufficient) for(unsigned int i=0; iGetROIActor(mLoadedROIIndex[i])->Update(); } for(int i=0; iNumberOfSlicers(); i++) { - mCurrentSlicerManager->GetSlicer(i)->Render(); + mCurrentSlicerManager->GetSlicer(i)->Render(); } + } //------------------------------------------------------------------------------ @@ -313,19 +328,16 @@ void vvToolStructureSetManager::apply() { //------------------------------------------------------------------------------ - //------------------------------------------------------------------------------ // CURRENT ROI INTERACTION //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolStructureSetManager::selectedItemChangedInTree() { - DD("selectedItemChangedInTree"); - +void vvToolStructureSetManager::SelectedItemChangedInTree() { // Search which roi is selected QList l = mTree->selectedItems(); - DD(l.size()); + if (l.size() == 0) return; QTreeWidgetItem * w = l[0]; if (mMapTreeWidgetToROI.find(w) == mMapTreeWidgetToROI.end()) { mCurrentROIActor = NULL; @@ -350,21 +362,24 @@ void vvToolStructureSetManager::selectedItemChangedInTree() { 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 - // + // Warning -> avoir unuseful Render here by disconnect slider disconnect(mOpacitySlider, SIGNAL(valueChanged(int)), - this, SLOT(opacityChanged(int))); + this, SLOT(OpacityChanged(int))); mOpacitySlider->setValue((int)lrint(actor->GetOpacity()*100)); mOpacitySpinBox->setValue((int)lrint(actor->GetOpacity()*100)); connect(mOpacitySlider, SIGNAL(valueChanged(int)), - this, SLOT(opacityChanged(int))); + this, SLOT(OpacityChanged(int))); + + // Temporary disable selection + // actor->SetSelected(true); // remove old selection - actor->SetSelected(true); // remove old selection // The following must not render !! - DD("before update"); + // DD("before update"); actor->Update(); // To change in UpdateSelecte - DD("after update"); + //DD("after update"); mCurrentSlicerManager->Render(); } @@ -372,14 +387,28 @@ void vvToolStructureSetManager::selectedItemChangedInTree() { //------------------------------------------------------------------------------ -void vvToolStructureSetManager::visibleROIToggled(bool b) { +void vvToolStructureSetManager::VisibleROIToggled(bool b) { mCurrentROIActor->SetVisible(b); + if (b) mNumberOfVisibleROI++; + else mNumberOfVisibleROI--; + //mNumberOfVisibleROI; + // if (mNumberOfVisibleROI == mCurrentStructureSetIndex } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolStructureSetManager::opacityChanged(int v) { +void vvToolStructureSetManager::VisibleContourROIToggled(bool b) { + mCurrentROIActor->SetContourVisible(b); + mCurrentROIActor->UpdateColor(); + mCurrentSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolStructureSetManager::OpacityChanged(int v) { + if (mCurrentROIActor == NULL) return; mCurrentROIActor->SetOpacity((double)v/100.0); mCurrentROIActor->UpdateColor(); mCurrentSlicerManager->Render(); @@ -388,27 +417,91 @@ void vvToolStructureSetManager::opacityChanged(int v) { //------------------------------------------------------------------------------ -void vvToolStructureSetManager::changeColor() { +void vvToolStructureSetManager::AllVisibleROIToggled(bool b) { + DD(b); + DD(mIsAllVisibleEnabled); + DD(mNumberOfVisibleROI); + if (b == mIsAllVisibleEnabled) return; + if (b) mCheckBoxShowAll->setCheckState(Qt::Checked); + else mCheckBoxShowAll->setCheckState(Qt::Unchecked); + mIsAllVisibleEnabled = b; + for(int i=0; iGetNumberOfROIs(); i++) { + mCurrentStructureSetActor->GetROIList()[i]->SetVisible(b); + } + // Update current selection + mCheckBoxShow->setChecked(b); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolStructureSetManager::AllVisibleContourROIToggled(bool b) { + /*mCurrentROIActor->SetContourVisible(b); + mCurrentROIActor->UpdateColor(); + mCurrentSlicerManager->Render(); + */ +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolStructureSetManager::AllOpacityChanged(int v) { + /*if (mCurrentROIActor == NULL) return; + mCurrentROIActor->SetOpacity((double)v/100.0); + mCurrentROIActor->UpdateColor(); + mCurrentSlicerManager->Render(); + */ +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolStructureSetManager::ChangeColor() { QColor color; - color.setRgbF(mCurrentROIActor->GetROI()->GetDisplayColor()[0], - mCurrentROIActor->GetROI()->GetDisplayColor()[1], - mCurrentROIActor->GetROI()->GetDisplayColor()[2]); + color.setRgbF(mCurrentROIActor->GetROI()->GetDisplayColor()[0], + mCurrentROIActor->GetROI()->GetDisplayColor()[1], + mCurrentROIActor->GetROI()->GetDisplayColor()[2]); QColor c = QColorDialog::getColor(color, this, "Choose the ROI color"); mCurrentROIActor->GetROI()->SetDisplayColor(c.redF(), c.greenF(), c.blueF()); mCurrentROIActor->UpdateColor(); - QTreeWidgetItem * w = mMapROIToTreeWidget[mCurrentROI]; - QBrush brush(QColor(mCurrentROI->GetDisplayColor()[0]*255, - mCurrentROI->GetDisplayColor()[1]*255, - mCurrentROI->GetDisplayColor()[2]*255)); + QTreeWidgetItem * w = mMapROIToTreeWidget[mCurrentROI]; + QBrush brush(QColor(mCurrentROI->GetDisplayColor()[0]*255, + mCurrentROI->GetDisplayColor()[1]*255, + mCurrentROI->GetDisplayColor()[2]*255)); brush.setStyle(Qt::SolidPattern); - for(int i=0; icolumnCount (); i++) { - w->setBackground(i, brush); - } + // for(int i=0; icolumnCount (); i++) { + w->setBackground(2, brush); + //} + + // Render + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvToolStructureSetManager::ChangeContourColor() { + QColor color; + color.setRgbF(mCurrentROIActor->GetContourColor()[0], + mCurrentROIActor->GetContourColor()[1], + mCurrentROIActor->GetContourColor()[2]); + QColor c = QColorDialog::getColor(color, this, "Choose the contour color"); + mCurrentROIActor->SetContourColor(c.redF(), c.greenF(), c.blueF()); + mCurrentROIActor->UpdateColor(); + mCurrentSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolStructureSetManager::ChangeContourWidth(int n) { + mCurrentROIActor->SetContourWidth(n); + mCurrentROIActor->UpdateColor(); + mCurrentSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ //void vvToolStructureSetManager::getActorFromROI() {