X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolROIManager.cxx;h=c02516f94dde6c9cca9cff898d4543ab1cdfccb7;hb=1bd2bf8d3ee24d10708d27d1347eab8467318c94;hp=809a3c54512ac9a3b3da8cb49e15c31e7f3bd451;hpb=d6819bb51fcfa132af7e5d4253470ccf79db035e;p=clitk.git diff --git a/vv/vvToolROIManager.cxx b/vv/vvToolROIManager.cxx index 809a3c5..c02516f 100644 --- a/vv/vvToolROIManager.cxx +++ b/vv/vvToolROIManager.cxx @@ -26,6 +26,7 @@ #include "vvMeshReader.h" #include "vvStructSelector.h" #include "vvToolManager.h" +#include "vvProgressDialog.h" // clitk #include "clitkDicomRTStruct2ImageFilter.h" @@ -67,8 +68,8 @@ vvToolROIManager::vvToolROIManager(vvMainWindowBase * parent, Qt::WindowFlags f) mTree->header()->resizeSection(0, 30); mGroupBoxROI->setEnabled(false); - // Temporary disable "Load dicom" button - // frame_4->hide(); + // Disable "Load dicom" button -> not useful + frame_4->hide(); // Set default LUT mDefaultLUTColor = vtkSmartPointer::New(); @@ -103,9 +104,9 @@ vvToolROIManager::~vvToolROIManager() // STATIC 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); } //------------------------------------------------------------------------------ @@ -200,8 +201,8 @@ void vvToolROIManager::InitializeNewTool(bool ReadStateFlag) this, SLOT(AnImageIsBeingClosed(vvSlicerManager *))); connect(mMainWindow, SIGNAL(SelectedImageHasChanged(vvSlicerManager *)), this, SLOT(SelectedImageHasChanged(vvSlicerManager *))); - connect(mOpenBinaryButton, SIGNAL(clicked()), this, SLOT(OpenBinaryImage())); - connect(mOpenDicomButton, SIGNAL(clicked()), this, SLOT(OpenDicomImage())); + connect(mOpenBinaryButton, SIGNAL(clicked()), this, SLOT(Open())); + // 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))); @@ -236,7 +237,7 @@ void vvToolROIManager::InputIsSelected(vvSlicerManager *m) mLabelInputInfo->setText(QString("%1").arg(m->GetFileName().c_str())); // Auto display browser to select new contours - if (mOpenFileBrowserFlag) OpenBinaryImage(); + if (mOpenFileBrowserFlag) Open(); } //------------------------------------------------------------------------------ @@ -292,17 +293,22 @@ void vvToolROIManager::SelectedImageHasChanged(vvSlicerManager * m) { //------------------------------------------------------------------------------ -void vvToolROIManager::OpenBinaryImage() +void vvToolROIManager::Open() { // Open images QString Extensions = "Images or Dicom-Struct files ( *.mha *.mhd *.hdr *.his *.dcm RS*)"; Extensions += ";;All Files (*)"; QStringList filename = - QFileDialog::getOpenFileNames(this,tr("Open binary image"), + QFileDialog::getOpenFileNames(this,tr("Open binary image or DICOM RT Struct"), mMainWindowBase->GetInputPathName(),Extensions); - if (filename.size() > 1) OpenBinaryImage(filename); if (filename.size() == 0) return; - + if (filename.size() > 1) { OpenBinaryImage(filename); return; } + + // Try to read dicom rt ? + clitk::DicomRT_StructureSet::Pointer s = clitk::DicomRT_StructureSet::New(); + if (s->IsDicomRTStruct(filename[0].toStdString())) OpenDicomImage(filename[0].toStdString()); + else OpenBinaryImage(filename); + } //------------------------------------------------------------------------------ @@ -311,18 +317,22 @@ void vvToolROIManager::OpenBinaryImage() 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; i filenames; filenames.push_back(filename[i].toStdString()); reader->SetInputFilenames(filenames); reader->Update(vvImageReader::IMAGE); - QApplication::restoreOverrideCursor(); - + if (reader->GetLastError().size() != 0) { std::cerr << "Error while reading " << filename[i].toStdString() << std::endl; QString error = "Cannot open file \n"; @@ -331,12 +341,15 @@ 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())); - // mOpenedBinaryImage.push_back(binaryImage); mOpenedBinaryImageFilenames.push_back(filename[i]); - //mMapImageToIndex[binaryImage]=mOpenedBinaryImageFilenames.size()-1; } + QApplication::restoreOverrideCursor(); // Update the contours UpdateAllContours(); @@ -345,87 +358,58 @@ void vvToolROIManager::OpenBinaryImage(QStringList & filename) //------------------------------------------------------------------------------ -void vvToolROIManager::OpenDicomImage() +void vvToolROIManager::OpenDicomImage(std::string filename) { - 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); + // GUI selector of roi vvMeshReader reader; - reader.SetFilename(file.toStdString()); + reader.SetFilename(filename); + vvStructSelector selector; selector.SetStructures(reader.GetROINames()); - // selector.EnablePropagationCheckBox(); FIXME Disable - - // FIXME : change text -> allow to save binary image - - if (selector.exec()) { + selector.SetPropagationCheckBoxFlag(false); + + if (selector.exec()) { + vvProgressDialog p("Reading ROI...", true); + p.SetCancelButtonEnabled(false); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - reader.SetSelectedItems(selector.getSelectedItems()); - reader.SetImage(mCurrentSlicerManager->GetImage()); - // reader.Update(); - - // Read and display information + + // Read information clitk::DicomRT_StructureSet::Pointer s = clitk::DicomRT_StructureSet::New(); - s->Read(file.toStdString()); - s->Print(std::cout); - - // FIXME -> selection - - DD("here"); - clitk::DicomRTStruct2ImageFilter filter; - filter.SetCropMaskEnabled(true); // FIXME - filter.SetImage(mCurrentImage); // Used FIXME -> change to set IMAGE - filter.SetROI(s->GetROIFromROINumber(1)); // FIXME selection - filter.SetWriteOutputFlag(false); - filter.Update(); - - DD("debug"); - typedef itk::Image ImageType; - typedef itk::VTKImageToImageFilter ConnectorType; - ConnectorType::Pointer connector = ConnectorType::New(); - connector->SetInput(filter.GetOutput()); - connector->Update(); - clitk::writeImage(connector->GetOutput(), "toto.mha"); - - // Get image - DD("filter done"); - vvImage::Pointer binaryImage = vvImage::New(); - binaryImage->AddVtkImage(filter.GetOutput()); + s->Read(filename); + + // Loop on selected struct + std::vector list = selector.getSelectedItems(); + for (uint i=0; iGetROIFromROINumber(list[i])); + filter.SetWriteOutputFlag(false); + filter.Update(); + + // Get image + vvImage::Pointer binaryImage = vvImage::New(); + binaryImage->AddVtkImage(filter.GetOutput()); - // DEBUG write image - DD("write debug"); - vvImageWriter::Pointer writer = vvImageWriter::New(); - writer->SetOutputFileName("bidon.mha"); - writer->SetInput(binaryImage); - writer->Update(); - - // Add to gui - DD("gui"); - AddImage(binaryImage, file.toStdString(), mBackgroundValueSpinBox->value(), - (!mBGModeCheckBox->isChecked())); - mOpenedBinaryImageFilenames.push_back(file); + // Add to gui + AddImage(binaryImage, s->GetROIFromROINumber(list[i])->GetName(), "", 0, true); // "" = no filename + mOpenedBinaryImageFilenames.push_back(filename.c_str()); + } - // std::vector contours=reader.GetOutput(); - // for (std::vector::iterator i=contours.begin(); - // i!=contours.end(); i++) - // AddContour(index,*i,selector.PropagationEnabled()); QApplication::restoreOverrideCursor(); } - - - + // Update the contours + UpdateAllContours(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, +void vvToolROIManager::AddImage(vvImage * binaryImage, + std::string name, + std::string filename, double BG, bool modeBG) { // Check Dimension @@ -443,9 +427,9 @@ void vvToolROIManager::AddImage(vvImage * binaryImage, std::string filename, int n = mROIList.size(); // 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; @@ -514,9 +498,7 @@ void vvToolROIManager::UpdateAllContours() for(unsigned int i=0; iUpdate(); } - for(int i=0; iGetNumberOfSlicers(); i++) { - mCurrentSlicerManager->GetSlicer(i)->Render(); - } + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ @@ -702,6 +684,8 @@ void vvToolROIManager::ChangeColor() { mCurrentROIActor->GetROI()->GetDisplayColor()[1], mCurrentROIActor->GetROI()->GetDisplayColor()[2]); QColor c = QColorDialog::getColor(color, this, "Choose the ROI color"); + if (!c.isValid()) return;// User cancel + mCurrentROIActor->GetROI()->SetDisplayColor(c.redF(), c.greenF(), c.blueF()); mCurrentROIActor->UpdateColor(); @@ -737,9 +721,9 @@ void vvToolROIManager::ChangeContourColor() { //------------------------------------------------------------------------------ void vvToolROIManager::ChangeContourWidth(int n) { if (mCurrentROIActor == NULL) return; - mCurrentROIActor->SetContourWidth(n); - mCurrentROIActor->UpdateColor(); - mCurrentSlicerManager->Render(); + mCurrentROIActor->SetContourWidth(n); + mCurrentROIActor->UpdateColor(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ @@ -759,6 +743,9 @@ void vvToolROIManager::ChangeDepth(int n) { //------------------------------------------------------------------------------ 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(); @@ -772,8 +759,9 @@ void vvToolROIManager::ReloadCurrentROI() { reader->SetInputFilename(mCurrentROI->GetFilename()); reader->Update(vvImageReader::IMAGE); if (reader->GetLastError() != "") { - QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), - reader->GetLastError().c_str()); + // No message just ignore (because can be from dicom) + // QMessageBox::information(mMainWindowBase, tr("Sorry, error. Could not reload"), + // reader->GetLastError().c_str()); return; } @@ -890,32 +878,32 @@ void vvToolROIManager::ReadXMLInformation_ROI() if (value == "Overlay" && m_XmlReader->isStartElement()) { QXmlStreamAttributes attributes = m_XmlReader->attributes(); if (!m_XmlReader->hasError()) - r = attributes.value("Red").toString().toFloat(); + r = attributes.value("Red").toString().toFloat(); + if (!m_XmlReader->hasError()) + g = attributes.value("Green").toString().toFloat(); if (!m_XmlReader->hasError()) - g = attributes.value("Green").toString().toFloat(); + b = attributes.value("Blue").toString().toFloat(); if (!m_XmlReader->hasError()) - b = attributes.value("Blue").toString().toFloat(); + visible = attributes.value("Visible").toString().toInt(); if (!m_XmlReader->hasError()) - visible = attributes.value("Visible").toString().toInt(); + opacity = attributes.value("Opacity").toString().toFloat(); if (!m_XmlReader->hasError()) - opacity = attributes.value("Opacity").toString().toFloat(); - if (!m_XmlReader->hasError()) - depth = attributes.value("Depth").toString().toFloat(); + depth = attributes.value("Depth").toString().toFloat(); } if (value == "Contour" && m_XmlReader->isStartElement()) { QXmlStreamAttributes attributes = m_XmlReader->attributes(); if (!m_XmlReader->hasError()) - cr = attributes.value("Red").toString().toFloat(); + cr = attributes.value("Red").toString().toFloat(); if (!m_XmlReader->hasError()) - cg = attributes.value("Green").toString().toFloat(); + cg = attributes.value("Green").toString().toFloat(); if (!m_XmlReader->hasError()) - cb = attributes.value("Blue").toString().toFloat(); + cb = attributes.value("Blue").toString().toFloat(); if (!m_XmlReader->hasError()) - cvisible = attributes.value("Visible").toString().toInt(); + cvisible = attributes.value("Visible").toString().toInt(); if (!m_XmlReader->hasError()) - width = attributes.value("Width").toString().toFloat(); + width = attributes.value("Width").toString().toFloat(); } param->SetOverlayColor(r,g,b); param->SetVisible(visible);