X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolROIManager.cxx;h=00eff1df1472e45fef50c19338c488d03c4eacc2;hb=HEAD;hp=e1d2e5c534e2f586d45657d3911a14417d6e6641;hpb=03fe0552e60847627ebbab852acf1d997379f1e9;p=clitk.git diff --git a/vv/vvToolROIManager.cxx b/vv/vvToolROIManager.cxx index e1d2e5c..00eff1d 100644 --- a/vv/vvToolROIManager.cxx +++ b/vv/vvToolROIManager.cxx @@ -22,7 +22,6 @@ #include "vvImageWriter.h" #include "vvROIActor.h" #include "vvSlicer.h" -#include "vvROIActor.h" #include "vvMeshReader.h" #include "vvStructSelector.h" #include "vvToolManager.h" @@ -38,7 +37,7 @@ #include #include #include - + // vtk #include #include @@ -49,15 +48,17 @@ ADD_TOOL(vvToolROIManager); //------------------------------------------------------------------------------ +int vvToolROIManager::nbTotalROI = 0; + //------------------------------------------------------------------------------ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f): - QWidget(parent->GetTab()), + QWidget(parent->GetTab()), vvToolBase(parent), Ui::vvToolROIManager() { // Store parent mMainWindow = parent; - + // Assume the initial tab ROI index is 2 mIndexFirstTab = 2; @@ -67,7 +68,7 @@ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f) mTree->clear(); mTree->header()->resizeSection(0, 30); mGroupBoxROI->setEnabled(false); - + // Disable "Load dicom" button -> not useful frame_4->hide(); @@ -102,11 +103,12 @@ vvToolROIManager::~vvToolROIManager() //------------------------------------------------------------------------------ // STATIC -void vvToolROIManager::Initialize() { +void vvToolROIManager::Initialize() +{ SetToolName("ROIManager"); - SetToolMenuName("Display ROI (binary image)"); + SetToolMenuName("Open ROI (binary image or RT-STRUCT)"); SetToolIconFilename(":/common/icons/tool-roi.png"); - SetToolTip("Display ROI from a binary image."); + SetToolTip("Display ROI from a binary image or a RT-struct file."); SetToolExperimental(false); } //------------------------------------------------------------------------------ @@ -114,7 +116,7 @@ void vvToolROIManager::Initialize() { //------------------------------------------------------------------------------ -void vvToolROIManager::InitializeNewTool(bool ReadStateFlag) +void vvToolROIManager::InitializeNewTool(bool ReadStateFlag) { // Check if we need to start a new tool or read in the state file to load if (ReadStateFlag == false) { @@ -132,21 +134,21 @@ void vvToolROIManager::InitializeNewTool(bool ReadStateFlag) // Read all information in the XML ReadXMLInformation(); - - // Check that a ROI is not already present + + // Check that a ROI is not already present mInitialImageIndex += mImageIndex; if (mInitialImageIndex >= mMainWindow->GetSlicerManagers().size()) { QMessageBox::warning(this, "ROIManager tool", QString("Image index %1 not found, abort.").arg(mInitialImageIndex)); close(); return; } - + // Set the attached image mCurrentSlicerManager = mMainWindow->GetSlicerManagers()[mInitialImageIndex]; } // Tab insertion, check that another tool does not already exist for this image - std::vector & tools = + std::vector & tools = vvToolManager::GetInstance()->GetToolCreatorFromName(GetToolName())->GetListOfTool(); if (tools.size() > 0) { for(uint i=0; i(mMainWindow->GetTab(), "ROItab"); + QWidget * tab = mMainWindow->GetTab()->findChild("ROItab"); tab->layout()->addWidget(this); - + // If not read in a file we start automatically the browser to load // a roi file (binary image) - if (ReadStateFlag) { + if (ReadStateFlag) { mOpenFileBrowserFlag = false; InputIsSelected(mCurrentSlicerManager); mOpenFileBrowserFlag = true; @@ -188,18 +190,18 @@ void vvToolROIManager::InitializeNewTool(bool ReadStateFlag) roi->GetROI()->GetDisplayColor()[2]*255)); brush.setStyle(Qt::SolidPattern); w->setBackground(2, brush); - w->setText(3, QString("%1").arg(roi->GetDepth())); + w->setText(3, QString("%1").arg(roi->GetDepth())); roi->UpdateColor(); } // Display the ROI UpdateAllContours(); - UpdateAllROIStatus(); + UpdateAllROIStatus(); // Connect event from mainwindow to this widget - connect(mMainWindow, SIGNAL(AnImageIsBeingClosed(vvSlicerManager *)), + connect(mMainWindow, SIGNAL(AnImageIsBeingClosed(vvSlicerManager *)), this, SLOT(AnImageIsBeingClosed(vvSlicerManager *))); - connect(mMainWindow, SIGNAL(SelectedImageHasChanged(vvSlicerManager *)), + connect(mMainWindow, SIGNAL(SelectedImageHasChanged(vvSlicerManager *)), this, SLOT(SelectedImageHasChanged(vvSlicerManager *))); connect(mOpenBinaryButton, SIGNAL(clicked()), this, SLOT(Open())); // connect(mOpenDicomButton, SIGNAL(clicked()), this, SLOT(OpenDicomImage())); @@ -207,14 +209,15 @@ void vvToolROIManager::InitializeNewTool(bool ReadStateFlag) 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(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(mContourCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleContourROIToggled(int))); connect(mCloseButton, SIGNAL(clicked()), this, SLOT(close())); + connect(mRemoveButton, SIGNAL(clicked()), this, SLOT(RemoveROI())); } //------------------------------------------------------------------------------ @@ -226,17 +229,10 @@ void vvToolROIManager::InputIsSelected(vvSlicerManager *m) mCurrentSlicerManager = m; mCurrentImage = mCurrentSlicerManager->GetImage(); - // Refuse if non 3D image - if (mCurrentImage->GetNumberOfDimensions() != 3) { - QMessageBox::information(this,tr("Sorry only 3D yet"), tr("Sorry only 3D yet")); - close(); - return; - } - // Change gui mLabelInputInfo->setText(QString("%1").arg(m->GetFileName().c_str())); - // Auto display browser to select new contours + // Auto display browser to select new contours if (mOpenFileBrowserFlag) Open(); } //------------------------------------------------------------------------------ @@ -245,13 +241,50 @@ void vvToolROIManager::InputIsSelected(vvSlicerManager *m) //------------------------------------------------------------------------------ void vvToolROIManager::AnImageIsBeingClosed(vvSlicerManager * m) { - if (m == mCurrentSlicerManager) { + if (m == mCurrentSlicerManager) { close(); return; } } //------------------------------------------------------------------------------ +void vvToolROIManager::RemoveROI() +{ + + // Search the indice of the selected ROI + QList l = mTree->selectedItems(); + if (l.size() == 0) + return; + + QTreeWidgetItem * w = l[0]; + if (w == NULL) return; + if (w == 0) return; + if (mMapTreeWidgetToROI.find(w) == mMapTreeWidgetToROI.end()) { + return; + } + + clitk::DicomRT_ROI * roi = mMapTreeWidgetToROI[w]; + if (roi == NULL) return; + + // Get selected roi actor + int n = roi->GetROINumber(); + + disconnect(mTree, SIGNAL(itemSelectionChanged()), this, SLOT(SelectedItemChangedInTree())); + mROIActorsList[n]->RemoveActors(); + mROIActorsList.erase(mROIActorsList.begin()+n); + mROIList.erase(mROIList.begin()+n); + mTreeWidgetList.erase(mTreeWidgetList.begin()+n); + + for (int i = n; i < mROIActorsList.size(); ++i) { + mROIList[i]->SetROINumber(i); + mTreeWidgetList[i].data()->setText(0, QString("%1").arg(mROIList[i]->GetROINumber())); + } + connect(mTree, SIGNAL(itemSelectionChanged()), this, SLOT(SelectedItemChangedInTree())); + for(int i=0; iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->Render(); + } +} +//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvToolROIManager::close() @@ -260,10 +293,11 @@ void vvToolROIManager::close() 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(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))); + disconnect(mRemoveButton, SIGNAL(clicked()), this, SLOT(RemoveROI())); // Remove actors for (unsigned int i = 0; i < mROIActorsList.size(); i++) { @@ -280,11 +314,11 @@ void vvToolROIManager::close() //------------------------------------------------------------------------------ -void vvToolROIManager::SelectedImageHasChanged(vvSlicerManager * m) { - +void vvToolROIManager::SelectedImageHasChanged(vvSlicerManager * m) +{ if (mCurrentSlicerManager == NULL) return; if (m == NULL) return; - if (m != mCurrentSlicerManager) hide(); + if (m != mCurrentSlicerManager) hide(); else { show(); } @@ -293,7 +327,7 @@ void vvToolROIManager::SelectedImageHasChanged(vvSlicerManager * m) { //------------------------------------------------------------------------------ -void vvToolROIManager::Open() +void vvToolROIManager::Open() { // Open images QString Extensions = "Images or Dicom-Struct files ( *.mha *.mhd *.hdr *.his *.dcm RS*)"; @@ -314,16 +348,16 @@ void vvToolROIManager::Open() //------------------------------------------------------------------------------ -void vvToolROIManager::OpenBinaryImage(QStringList & filename) +void vvToolROIManager::OpenBinaryImage(QStringList & filename) { if (filename.size() == 0) return; - + vvProgressDialog p("Reading ROI ...", true); p.SetCancelButtonEnabled(false); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - + // For each selected file, open the image - for(int i=0; iSetInputFilenames(filenames); reader->Update(vvImageReader::IMAGE); - + if (reader->GetLastError().size() != 0) { std::cerr << "Error while reading " << filename[i].toStdString() << std::endl; QString error = "Cannot open file \n"; @@ -341,69 +375,79 @@ void vvToolROIManager::OpenBinaryImage(QStringList & filename) return; } vvImage::Pointer binaryImage = reader->GetOutput(); - AddImage(binaryImage, filename[i].toStdString(), mBackgroundValueSpinBox->value(), + std::ostringstream oss; + oss << vtksys::SystemTools:: + GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename[i].toStdString())); + std::string name = oss.str(); + AddImage(binaryImage, name, filename[i].toStdString(), mBackgroundValueSpinBox->value(), (!mBGModeCheckBox->isChecked())); mOpenedBinaryImageFilenames.push_back(filename[i]); } QApplication::restoreOverrideCursor(); // Update the contours - UpdateAllContours(); + UpdateAllContours(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::OpenDicomImage(std::string filename) +void vvToolROIManager::OpenDicomImage(std::string filename) { // GUI selector of roi vvMeshReader reader; reader.SetFilename(filename); + vvStructSelector selector; selector.SetStructures(reader.GetROINames()); selector.SetPropagationCheckBoxFlag(false); - - if (selector.exec()) { + + if (selector.exec()) { vvProgressDialog p("Reading ROI...", true); p.SetCancelButtonEnabled(false); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); // Read information clitk::DicomRT_StructureSet::Pointer s = clitk::DicomRT_StructureSet::New(); + vtkSmartPointer transformMatrix = vtkSmartPointer::New(); + transformMatrix = mCurrentImage->GetTransform()[0]->GetMatrix(); + s->SetTransformMatrix(transformMatrix); s->Read(filename); // Loop on selected struct std::vector list = selector.getSelectedItems(); for (uint i=0; iGetROIFromROINumber(list[i])); + filter.SetROI(s->GetROIFromROINumber(list[i])); filter.SetWriteOutputFlag(false); - filter.Update(); + filter.Update(); // Get image vvImage::Pointer binaryImage = vvImage::New(); binaryImage->AddVtkImage(filter.GetOutput()); - + // Add to gui - AddImage(binaryImage, s->GetROIFromROINumber(list[i])->GetName(), 0, true); + AddImage(binaryImage, s->GetROIFromROINumber(list[i])->GetName(), "", 0, true); // "" = no filename mOpenedBinaryImageFilenames.push_back(filename.c_str()); } QApplication::restoreOverrideCursor(); } // Update the contours - UpdateAllContours(); + UpdateAllContours(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, - double BG, bool modeBG) +void vvToolROIManager::AddImage(vvImage * binaryImage, + std::string name, + std::string filename, + double BG, bool modeBG) { // Check Dimension int dim = mCurrentImage->GetNumberOfDimensions(); @@ -415,15 +459,16 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, QMessageBox::information(this,tr("Reading problem"),os.str().c_str()); return; } - + // Compute roi index - int n = mROIList.size(); + int n = nbTotalROI; + ++nbTotalROI; // Compute the name of the new ROI - std::ostringstream oss; - oss << vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename)); - std::string name = oss.str(); - + // std::ostringstream oss; + // oss << vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename)); + // std::string name = oss.str(); + // Set color std::vector color; color.push_back(1); @@ -432,23 +477,23 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, // Create ROI clitk::DicomRT_ROI::Pointer roi = clitk::DicomRT_ROI::New(); - roi->SetFromBinaryImage(binaryImage, n, name, color, filename); + roi->SetFromBinaryImage(binaryImage, mROIList.size(), name, color, filename); // Add a new roi to the list mROIList.push_back(roi); - + // Set BG or FG mode - if (modeBG) + if (modeBG) roi->SetBackgroundValueLabelImage(BG); - else + else roi->SetForegroundValueLabelImage(BG); - + // Change color if (nGetNumberOfTableValues ()) { double * color = mDefaultLUTColor->GetTableValue(n % mDefaultLUTColor->GetNumberOfTableValues ()); roi->SetDisplayColor(color[0], color[1], color[2]); } - + // Add a new roi actor QSharedPointer actor = QSharedPointer(new vvROIActor); actor->SetBGMode(modeBG); @@ -456,19 +501,20 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, actor->SetSlicerManager(mCurrentSlicerManager); actor->Initialize(n+1); // depth is n+1 to start at 1 mROIActorsList.push_back(actor); - + // CheckBox for "All" if (actor->IsVisible()) mNumberOfVisibleROI++; if (actor->IsContourVisible()) mNumberOfVisibleContourROI++; + AllVisibleContourROIToggled(1); // Add ROI in tree mTreeWidgetList.push_back(QSharedPointer(new QTreeWidgetItem(mTree))); QTreeWidgetItem * w = mTreeWidgetList.back().data(); w->setText(0, QString("%1").arg(roi->GetROINumber())); w->setText(1, QString("%1").arg(roi->GetName().c_str())); - w->setText(3, QString("%1").arg(actor->GetDepth())); - QBrush brush(QColor(roi->GetDisplayColor()[0]*255, - roi->GetDisplayColor()[1]*255, + 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); @@ -477,51 +523,81 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, mTree->resizeColumnToContents(0); mTree->resizeColumnToContents(1); - // Update - UpdateAllROIStatus(); + // Update + UpdateAllROIStatus(); + + if (mCurrentImage->GetNumberOfDimensions() > 3) { + + //Modifications to avoid display bug with a 4D image + QSharedPointer CurrentROIActorTemp; + CurrentROIActorTemp = mCurrentROIActor; + mCurrentROIActor = actor; + + int VisibleInWindow(0); + mCurrentSlicerManager->GetSlicer(VisibleInWindow)->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,mCurrentSlicerManager->GetSlicer(VisibleInWindow)->GetMaxCurrentTSlice()); + mCurrentSlicerManager->GetSlicer(VisibleInWindow)->Render(); + + VisibleROIToggled(false); + VisibleROIToggled(true); + + mCurrentROIActor = CurrentROIActorTemp; + + } + } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::UpdateAllContours() +void vvToolROIManager::UpdateAllContours() { if (mCurrentSlicerManager == NULL) return; // Render loaded ROIs (the first is sufficient) for(unsigned int i=0; iUpdate(); } - mCurrentSlicerManager->Render(); + //mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::UpdateAllROIStatus() { +void vvToolROIManager::UpdateAllROIStatus() +{ int nbVisible = 0; + int nbContourVisible = 0; int nb = mROIList.size(); for(int i=0; iIsVisible()) { nbVisible++; } + if (mROIActorsList[i]->IsContourVisible()) { + nbContourVisible++; + } } // change the states - disconnect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int))); - disconnect(mContourCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleContourROIToggled(bool))); + disconnect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int))); + disconnect(mContourCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleContourROIToggled(int))); if (nbVisible == nb) mCheckBoxShowAll->setCheckState(Qt::Checked); else { if (nbVisible == 0) mCheckBoxShowAll->setCheckState(Qt::Unchecked); else mCheckBoxShowAll->setCheckState(Qt::PartiallyChecked); } - connect(mContourCheckBoxShowAll, SIGNAL(toggled(bool)), this, SLOT(AllVisibleContourROIToggled(bool))); + if (nbContourVisible == nb) mContourCheckBoxShowAll->setCheckState(Qt::Checked); + else { + if (nbContourVisible == 0) mContourCheckBoxShowAll->setCheckState(Qt::Unchecked); + else mContourCheckBoxShowAll->setCheckState(Qt::PartiallyChecked); + } + connect(mContourCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleContourROIToggled(int))); connect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int))); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::SelectedItemChangedInTree() { +void vvToolROIManager::SelectedItemChangedInTree() +{ // Search which roi is selected QList l = mTree->selectedItems(); if (l.size() == 0) { @@ -549,16 +625,17 @@ void vvToolROIManager::SelectedItemChangedInTree() { mCurrentROI = roi; mCurrentROIActor = actor; - // Warning -> avoid unuseful Render here by disconnect slider + // 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(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))); + disconnect(mRemoveButton, SIGNAL(clicked()), this, SLOT(RemoveROI())); mROInameLabel->setText(roi->GetName().c_str()); mCheckBoxShow->setChecked(actor->IsVisible()); @@ -573,12 +650,13 @@ void vvToolROIManager::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(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(mRemoveButton, SIGNAL(clicked()), this, SLOT(RemoveROI())); + - // Set the current color to the selected ROI name mROInameLabel->setAutoFillBackground(true);// # This is important!! // mROInameLabel->setStyleSheet("QLabel { background-color : red; color : blue; }"); @@ -594,7 +672,7 @@ void vvToolROIManager::SelectedItemChangedInTree() { (1-mCurrentROI->GetDisplayColor()[2])*255); palette->setColor(QPalette::WindowText,colorFG); palette->setColor(QPalette::Background, color); - mROInameLabel->setPalette(*palette); + mROInameLabel->setPalette(*palette); // Enable the group box (in case no selection before) mGroupBoxROI->setEnabled(true); @@ -603,39 +681,45 @@ void vvToolROIManager::SelectedItemChangedInTree() { //------------------------------------------------------------------------------ -void vvToolROIManager::VisibleROIToggled(bool b) { +void vvToolROIManager::VisibleROIToggled(bool b) +{ if (mCurrentROIActor == NULL) return; if (b == mCurrentROIActor->IsVisible()) return; // nothing to do mCurrentROIActor->SetVisible(b); UpdateAllROIStatus(); - mCurrentSlicerManager->Render(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::VisibleContourROIToggled(bool b) { +void vvToolROIManager::VisibleContourROIToggled(bool b) +{ if (mCurrentROIActor == NULL) return; if (mCurrentROIActor->IsContourVisible() == b) return; // nothing to do mCurrentROIActor->SetContourVisible(b); mCurrentROIActor->UpdateColor(); - mCurrentSlicerManager->Render(); + UpdateAllROIStatus(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::OpacityChanged(int v) { +void vvToolROIManager::OpacityChanged(int v) +{ if (mCurrentROIActor == NULL) return; mCurrentROIActor->SetOpacity((double)v/100.0); mCurrentROIActor->UpdateColor(); - mCurrentSlicerManager->Render(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::AllVisibleROIToggled(int b) { +void vvToolROIManager::AllVisibleROIToggled(int b) +{ + disconnect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int))); bool status = false; if ((mCheckBoxShowAll->checkState() == Qt::Checked) || (mCheckBoxShowAll->checkState() == Qt::PartiallyChecked)) status = true; @@ -646,17 +730,20 @@ void vvToolROIManager::AllVisibleROIToggled(int b) { if (status) mCheckBoxShowAll->setCheckState(Qt::Checked); else mCheckBoxShowAll->setCheckState(Qt::Unchecked); mCheckBoxShow->setChecked(status); - mCurrentSlicerManager->Render(); + mCurrentSlicerManager->Render(); + connect(mCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleROIToggled(int))); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::AllVisibleContourROIToggled(bool b) { +void vvToolROIManager::AllVisibleContourROIToggled(int b) +{ + disconnect(mContourCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleContourROIToggled(int))); bool status = false; if ((mContourCheckBoxShowAll->checkState() == Qt::Checked) || (mContourCheckBoxShowAll->checkState() == Qt::PartiallyChecked)) status = true; - // Update current + // Update current for(uint i=0; iSetContourVisible(status); } @@ -664,13 +751,15 @@ void vvToolROIManager::AllVisibleContourROIToggled(bool b) { if (status) mContourCheckBoxShowAll->setCheckState(Qt::Checked); else mContourCheckBoxShowAll->setCheckState(Qt::Unchecked); mContourCheckBoxShow->setChecked(status); - mCurrentSlicerManager->Render(); + mCurrentSlicerManager->Render(); + connect(mContourCheckBoxShowAll, SIGNAL(stateChanged(int)), this, SLOT(AllVisibleContourROIToggled(int))); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::ChangeColor() { +void vvToolROIManager::ChangeColor() +{ if (mCurrentROIActor == NULL) return; QColor color; color.setRgbF(mCurrentROIActor->GetROI()->GetDisplayColor()[0], @@ -695,11 +784,12 @@ void vvToolROIManager::ChangeColor() { //------------------------------------------------------------------------------ -void vvToolROIManager::ChangeContourColor() { +void vvToolROIManager::ChangeContourColor() +{ if (mCurrentROIActor == NULL) return; QColor color; - color.setRgbF(mCurrentROIActor->GetContourColor()[0], - mCurrentROIActor->GetContourColor()[1], + color.setRgbF(mCurrentROIActor->GetContourColor()[0], + mCurrentROIActor->GetContourColor()[1], mCurrentROIActor->GetContourColor()[2]); // QColorDialog d(color); QColor c = QColorDialog::getColor(color, this, "Choose the contour color"); @@ -712,7 +802,8 @@ void vvToolROIManager::ChangeContourColor() { //------------------------------------------------------------------------------ -void vvToolROIManager::ChangeContourWidth(int n) { +void vvToolROIManager::ChangeContourWidth(int n) +{ if (mCurrentROIActor == NULL) return; mCurrentROIActor->SetContourWidth(n); mCurrentROIActor->UpdateColor(); @@ -722,10 +813,11 @@ void vvToolROIManager::ChangeContourWidth(int n) { //------------------------------------------------------------------------------ -void vvToolROIManager::ChangeDepth(int n) { +void vvToolROIManager::ChangeDepth(int n) +{ if (mCurrentROIActor == NULL) return; mCurrentROIActor->SetDepth(n); - // mCurrentROIActor->UpdateImage(); // FIXME + // mCurrentROIActor->UpdateImage(); // FIXME mCurrentSlicerManager->Render(); QList l = mTree->selectedItems(); QTreeWidgetItem * w = l[0]; @@ -735,7 +827,11 @@ void vvToolROIManager::ChangeDepth(int n) { //------------------------------------------------------------------------------ -void vvToolROIManager::ReloadCurrentROI() { +void vvToolROIManager::ReloadCurrentROI() +{ + if (mCurrentROI->GetFilename() == "") { + return; // do nothing (contour from rt struct do not reload) + } // Remove all contours/overlay first bool visible = mCurrentROIActor->IsVisible(); @@ -743,14 +839,14 @@ void vvToolROIManager::ReloadCurrentROI() { mCurrentROIActor->SetVisible(false); mCurrentROIActor->SetContourVisible(false); mCurrentSlicerManager->Render(); - + // Reload image vvImageReader::Pointer reader = vvImageReader::New(); reader->SetInputFilename(mCurrentROI->GetFilename()); reader->Update(vvImageReader::IMAGE); if (reader->GetLastError() != "") { // No message just ignore (because can be from dicom) - // QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), + // QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), // reader->GetLastError().c_str()); return; } @@ -766,13 +862,17 @@ void vvToolROIManager::ReloadCurrentROI() { mCurrentROIActor->UpdateImage(); mCurrentROIActor->SetVisible(visible); mCurrentROIActor->SetContourVisible(cvisible); - mCurrentSlicerManager->Render(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ +#if __cplusplus > 199711L +void vvToolROIManager::SaveState(std::shared_ptr & m_XmlWriter) +#else void vvToolROIManager::SaveState(std::auto_ptr & m_XmlWriter) +#endif { // Get index of the image int n = mMainWindow->GetSlicerManagers().size(); @@ -802,7 +902,7 @@ void vvToolROIManager::SaveState(std::auto_ptr & m_XmlWriter) m_XmlWriter->writeAttribute("Opacity", QString("%1").arg(roi->GetOpacity())); m_XmlWriter->writeAttribute("Depth", QString("%1").arg(roi->GetDepth())); m_XmlWriter->writeEndElement(); - + m_XmlWriter->writeStartElement("Contour"); m_XmlWriter->writeAttribute("Red", QString("%1").arg(roi->GetContourColor()[0])); m_XmlWriter->writeAttribute("Green",QString("%1").arg(roi->GetContourColor()[1])); @@ -818,21 +918,21 @@ void vvToolROIManager::SaveState(std::auto_ptr & m_XmlWriter) //------------------------------------------------------------------------------ -void vvToolROIManager::ReadXMLInformation() +void vvToolROIManager::ReadXMLInformation() { std::string value=""; mInitialImageIndex = -1; - while (!(m_XmlReader->isEndElement() && value == GetToolName().toStdString())) { + while (!(m_XmlReader->isEndElement() && value == GetToolName().toStdString())) { m_XmlReader->readNext(); value = m_XmlReader->qualifiedName().toString().toStdString(); - - if (value == "Image_Index") + + if (value == "Image_Index") mInitialImageIndex = m_XmlReader->readElementText().toInt(); - + if (m_XmlReader->isStartElement()) { if (value == "ROI") { ReadXMLInformation_ROI(); - } + } } } } @@ -840,7 +940,7 @@ void vvToolROIManager::ReadXMLInformation() //------------------------------------------------------------------------------ -void vvToolROIManager::ReadXMLInformation_ROI() +void vvToolROIManager::ReadXMLInformation_ROI() { QString s; std::string value=""; @@ -858,13 +958,13 @@ void vvToolROIManager::ReadXMLInformation_ROI() int width = 1; int depth=1; - while (!(m_XmlReader->isEndElement() && value == "ROI")) { + while (!(m_XmlReader->isEndElement() && value == "ROI")) { m_XmlReader->readNext(); value = m_XmlReader->qualifiedName().toString().toStdString(); if (value == "Image") { s = m_XmlReader->readElementText(); } - + if (value == "Overlay" && m_XmlReader->isStartElement()) { QXmlStreamAttributes attributes = m_XmlReader->attributes(); if (!m_XmlReader->hasError()) @@ -897,8 +997,8 @@ void vvToolROIManager::ReadXMLInformation_ROI() } param->SetOverlayColor(r,g,b); param->SetVisible(visible); - param->SetOpacity(opacity); - param->SetDepth(depth); + param->SetOpacity(opacity); + param->SetDepth(depth); param->SetContourColor(cr,cg,cb); param->SetContourVisible(cvisible);