X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=vv%2FvvToolROIManager.cxx;h=7f544a5e31f8d1493b21fa080daa66ca1f4bc845;hb=a56f215a4841302d682fba51ad71e831aa501460;hp=b681fc79298078be55c8e392ef957576b43b3847;hpb=d99d09e51a413d4b093cb809726c97f6a0e6f0ab;p=clitk.git diff --git a/vv/vvToolROIManager.cxx b/vv/vvToolROIManager.cxx index b681fc7..7f544a5 100644 --- a/vv/vvToolROIManager.cxx +++ b/vv/vvToolROIManager.cxx @@ -22,6 +22,8 @@ #include "vvROIActor.h" #include "vvSlicer.h" #include "vvROIActor.h" +#include "vvMeshReader.h" +#include "vvStructSelector.h" // Qt #include @@ -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(parent), Ui::vvToolROIManager() { - // Insert the current QWidget into the tab layout (required) - QWidget * mother = qFindChild(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(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::New(); - DD(mDefaultLUTColor->GetNumberOfTableValues()); for(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); - // std::cout << "mDefaultLUTColor->SetTableValue(" << i << ", " << r << ", " << v << ", " << b << ");" << std::endl; } #include "vvDefaultLut.h" @@ -85,8 +101,20 @@ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f) this, SLOT(AnImageIsBeingClosed(vvSlicerManager *))); connect(parent, SIGNAL(SelectedImageHasChanged(vvSlicerManager *)), this, SLOT(SelectedImageHasChanged(vvSlicerManager *))); - - // mMainWindowBase->GetTab()->setTabIcon(mTabNumber, GetToolIcon()); + 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))); + 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))); + 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))); + connect(mCloseButton, SIGNAL(clicked()), this, SLOT(close())); } //------------------------------------------------------------------------------ @@ -94,7 +122,6 @@ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f) //------------------------------------------------------------------------------ vvToolROIManager::~vvToolROIManager() { - std::cout << "vvToolROIManager::~vvToolROIManager()" << std::endl; } //------------------------------------------------------------------------------ @@ -114,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(); @@ -131,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(); } //------------------------------------------------------------------------------ @@ -140,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(); + } } //------------------------------------------------------------------------------ @@ -194,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 contours=reader.GetOutput(); + // for (std::vector::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(); @@ -213,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 color; @@ -241,7 +317,6 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, roi->SetForegroundValueLabelImage(BG); // Change color - DD("color"); if (nGetNumberOfTableValues ()) { double * color = mDefaultLUTColor->GetTableValue(n % mDefaultLUTColor->GetNumberOfTableValues ()); roi->SetDisplayColor(color[0], color[1], color[2]); @@ -304,7 +379,6 @@ void vvToolROIManager::UpdateAllROIStatus() { nbVisible++; } } - DD(nbVisible); // change the states disconnect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int))); @@ -319,3 +393,238 @@ void vvToolROIManager::UpdateAllROIStatus() { } //------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +void vvToolROIManager::SelectedItemChangedInTree() { + // Search which roi is selected + QList l = mTree->selectedItems(); + if (l.size() == 0) { + // mCurrentROIActor = 0; + mCurrentROI = NULL; + mGroupBoxROI->setEnabled(false); + return; + } + QTreeWidgetItem * w = l[0]; + 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 + int n = roi->GetROINumber(); + QSharedPointer actor = mROIActorsList[n]; + 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()); + 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(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))); + + + // 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 + // mCurrentSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::VisibleROIToggled(bool b) { + if (mCurrentROIActor == NULL) return; + if (b == mCurrentROIActor->IsVisible()) return; // nothing to do + mCurrentROIActor->SetVisible(b); + UpdateAllROIStatus(); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::VisibleContourROIToggled(bool b) { + if (mCurrentROIActor == NULL) return; + if (mCurrentROIActor->IsContourVisible() == b) return; // nothing to do + mCurrentROIActor->SetContourVisible(b); + mCurrentROIActor->UpdateColor(); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::OpacityChanged(int v) { + if (mCurrentROIActor == NULL) return; + mCurrentROIActor->SetOpacity((double)v/100.0); + mCurrentROIActor->UpdateColor(); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::AllVisibleROIToggled(int b) { + bool status = false; + if ((mCheckBoxShowAll->checkState() == Qt::Checked) || + (mCheckBoxShowAll->checkState() == Qt::PartiallyChecked)) status = true; + + for(uint i=0; iSetVisible(status); + } + if (status) mCheckBoxShowAll->setCheckState(Qt::Checked); + else mCheckBoxShowAll->setCheckState(Qt::Unchecked); + mCheckBoxShow->setChecked(status); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::AllVisibleContourROIToggled(bool b) { + bool status = false; + if ((mContourCheckBoxShowAll->checkState() == Qt::Checked) || + (mContourCheckBoxShowAll->checkState() == Qt::PartiallyChecked)) status = true; + // Update current + for(uint i=0; iSetContourVisible(status); + } + // Update current selection + if (status) mContourCheckBoxShowAll->setCheckState(Qt::Checked); + else mContourCheckBoxShowAll->setCheckState(Qt::Unchecked); + mContourCheckBoxShow->setChecked(status); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::ChangeColor() { + if (mCurrentROIActor == NULL) return; + QColor color; + 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)); + brush.setStyle(Qt::SolidPattern); + w->setBackground(2, brush); + // Render + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::ChangeContourColor() { + if (mCurrentROIActor == NULL) return; + 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(); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::ChangeContourWidth(int n) { + if (mCurrentROIActor == NULL) return; + mCurrentROIActor->SetContourWidth(n); + mCurrentROIActor->UpdateColor(); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolROIManager::ChangeDepth(int n) { + if (mCurrentROIActor == NULL) return; + mCurrentROIActor->SetDepth(n); + mCurrentROIActor->UpdateImage(); + mSlicerManager->Render(); + QList l = mTree->selectedItems(); + QTreeWidgetItem * w = l[0]; + w->setText(3, QString("%1").arg(mCurrentROIActor->GetDepth())); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +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()); + reader->Update(vvImageReader::IMAGE); + if (reader->GetLastError() != "") { + QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), + reader->GetLastError().c_str()); + return; + } + + mCurrentROI->GetImage()->Reset();//GetFirstVTKImageData()->ReleaseData(); + mCurrentROI->SetImage(reader->GetOutput()); + + // Update visu + mCurrentROIActor->UpdateImage(); + mCurrentROIActor->SetVisible(visible); + mCurrentROIActor->SetContourVisible(cvisible); + mSlicerManager->Render(); +} +//------------------------------------------------------------------------------