X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolCropImage.cxx;h=ba97489b8da372479c7c35aa9a8c755e5ab8331f;hb=10ec7dc09aeea303fdc6a30449ec69de2f2ccd88;hp=126a46f5f35882f23c5669dda8d02a2e73215f54;hpb=0a85e47a06c7d046d06a4645b724c4e81b19998d;p=clitk.git diff --git a/vv/vvToolCropImage.cxx b/vv/vvToolCropImage.cxx index 126a46f..ba97489 100644 --- a/vv/vvToolCropImage.cxx +++ b/vv/vvToolCropImage.cxx @@ -3,8 +3,8 @@ Program: vv Module: $RCSfile: vvToolCropImage.cxx,v $ Language: C++ - Date: $Date: 2010/02/24 11:43:37 $ - Version: $Revision: 1.1 $ + Date: $Date: 2010/03/01 15:38:09 $ + Version: $Revision: 1.3 $ Author : David Sarrut (david.sarrut@creatis.insa-lyon.fr) Copyright (C) 2008 @@ -26,6 +26,14 @@ =========================================================================*/ #include "vvToolCropImage.h" +#include +#include +#include +#include +#include +#include +#include +#include "vvSlicer.h" //------------------------------------------------------------------------------ // Create the tool and automagically (I like this word) insert it in @@ -39,13 +47,10 @@ vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f): vvToolWidgetBase(parent, f), vvToolBase(parent), Ui::vvToolCropImage() { + // GUI Initialization Ui_vvToolCropImage::setupUi(mToolWidget); - // Initialize the input selection - //UpdateInfoFromMainWindow(); - // InitializeListOfInputImages(*mMainWindowToolInfo->mSlicerManagers, -// mMainWindowToolInfo->mSlicerManagerCurrentIndex); } //------------------------------------------------------------------------------ @@ -57,8 +62,239 @@ vvToolCropImage::~vvToolCropImage() { //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +bool vvToolCropImage::close() { + for(int i=0; i<6; i++) mReducedExtent[i] = mInitialExtent[i]; + UpdateExtent(); + return vvToolWidgetBase::close(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::reject() { + for(int i=0; i<6; i++) mReducedExtent[i] = mInitialExtent[i]; + UpdateExtent(); + return vvToolWidgetBase::reject(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::sliderXMinValueChanged(int s) { + xmaxSlider->setMinimum(xminSlider->value()); + mReducedExtent[0] = xminSlider->value(); + UpdateExtent(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::sliderXMaxValueChanged(int s) { + xminSlider->setMaximum(xmaxSlider->value()); + mReducedExtent[1] = xmaxSlider->value(); + UpdateExtent(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::sliderYMinValueChanged(int s) { + ymaxSlider->setMinimum(yminSlider->value()); + mReducedExtent[2] = yminSlider->value(); + UpdateExtent(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::sliderYMaxValueChanged(int s) { + yminSlider->setMaximum(ymaxSlider->value()); + mReducedExtent[3] = ymaxSlider->value(); + UpdateExtent(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::sliderZMinValueChanged(int s) { + zmaxSlider->setMinimum(zminSlider->value()); + mReducedExtent[4] = zminSlider->value(); + UpdateExtent(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::sliderZMaxValueChanged(int s) { + zminSlider->setMaximum(zmaxSlider->value()); + mReducedExtent[5] = zmaxSlider->value(); + UpdateExtent(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +// void vvToolCropImage::sliderTMinValueChanged(int s) { +// tmaxSlider->setMinimum(tminSlider->value()); +// mReducedExtent[6] = tminSlider->value(); +// UpdateExtent(); +// } +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +// void vvToolCropImage::sliderTMaxValueChanged(int s) { +// tminSlider->setMaximum(tmaxSlider->value()); +// mReducedExtent[7] = tmaxSlider->value(); +// UpdateExtent(); +// } +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::UpdateExtent() { + for(int i=0; iNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent); + mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); + mCurrentSlicerManager->GetSlicer(i)->Render(); + } +} +//------------------------------------------------------------------------------ + + //------------------------------------------------------------------------------ void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) { - DD("InputIsSelected"); + + // Change interface according to number of dimension + mExtentSize = 2*slicer->GetDimension(); + // if (slicer->GetDimension()<4) { + // mTLabel1->setHidden(true); + // mTLabel2->setHidden(true); + // tminSlider->setHidden(true); + // tmaxSlider->setHidden(true); + // spin_tmin->setHidden(true); + // spin_tmax->setHidden(true); + // } + if (slicer->GetDimension()<3) { + mZLabel1->setHidden(true); + mZLabel2->setHidden(true); + zminSlider->setHidden(true); + zmaxSlider->setHidden(true); + spin_zmin->setHidden(true); + spin_zmax->setHidden(true); + } + + // Record initial extend + mReducedExtent = new int[mExtentSize]; + mInitialExtent = new int[mExtentSize]; + mReducedExtent = mCurrentSlicerManager->GetImage()->GetFirstVTKImageData()->GetWholeExtent(); + for(int i=0; i<6; i++) mInitialExtent[i] = mReducedExtent[i]; + for(int i=0; iNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true); + } + + // Not now .... + // mIntensitySlider->SetImage(mCurrentImage); + //mIntensitySlider->setEnabled(false); + + // Set initial sliders values + std::vector imsize = mCurrentSlicerManager->GetImage()->GetSize(); + xminSlider->setMaximum(imsize[0]-1); + xmaxSlider->setMaximum(imsize[0]-1); + xmaxSlider->setValue(imsize[0]-1); + + yminSlider->setMaximum(imsize[1]-1); + ymaxSlider->setMaximum(imsize[1]-1); + ymaxSlider->setValue(imsize[1]-1); + + if (slicer->GetDimension() >2) { + zminSlider->setMaximum(imsize[2]-1); + zmaxSlider->setMaximum(imsize[2]-1); + zmaxSlider->setValue(imsize[2]-1); + } + + // if (slicer->GetDimension() >3) { + // tminSlider->setMaximum(imsize[3]-1); + // tmaxSlider->setMaximum(imsize[3]-1); + // tmaxSlider->setValue(imsize[3]-1); + // } + + spin_xmin->setMaximum(imsize[0]-1); + spin_xmax->setMaximum(imsize[0]-1); + spin_xmax->setValue(imsize[0]-1); + + spin_ymin->setMaximum(imsize[1]-1); + spin_ymax->setMaximum(imsize[1]-1); + spin_ymax->setValue(imsize[1]-1); + + if (slicer->GetDimension() >2) { + spin_zmin->setMaximum(imsize[2]-1); + spin_zmax->setMaximum(imsize[2]-1); + spin_zmax->setValue(imsize[2]-1); + } + + // if (slicer->GetDimension() >3) { + // spin_tmin->setMaximum(imsize[3]-1); + // spin_tmax->setMaximum(imsize[3]-1); + // spin_tmax->setValue(imsize[3]-1); + // } + + // Connect + connect(xminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderXMinValueChanged(int))); + connect(xmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderXMaxValueChanged(int))); + connect(yminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderYMinValueChanged(int))); + connect(ymaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderYMaxValueChanged(int))); + connect(zminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderZMinValueChanged(int))); + connect(zmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderZMaxValueChanged(int))); + // connect(tminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMinValueChanged(int))); + // connect(tmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMaxValueChanged(int))); + + // connect(mIntensitySlider, SIGNAL(valueChanged(double)), this, SLOT(autoCropValueChanged(double))); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::autoCropValueChanged(double v) { + // DD(v); + // vvImageToITKImageVector -> TODO a generic method + // then sliceriterator on each dimension from in to max + // ==> make a clitkGenericFilter even for the regular apply ... } //------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::apply() { + + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + vvImage::Pointer mResult=vvImage::New(); + vvImage::Pointer image= mCurrentSlicerManager->GetImage(); + for (std::vector::const_iterator i=image->GetVTKImages().begin(); + i!=image->GetVTKImages().end();i++) + { + vtkSmartPointer filter=vtkSmartPointer::New(); + ///Vtk is very weird, you need to "translate the extent" to get the correct origin + //http://markmail.org/message/vndc2tr6kcabiakp#query:vtkImageClip%20origin+page:1+mid:6na7y57floutklvz+state:results + vtkSmartPointer translate=vtkSmartPointer::New(); + filter->SetInput(*i); + filter->SetOutputWholeExtent(xminSlider->value(),xmaxSlider->value(), + yminSlider->value(),ymaxSlider->value(), + zminSlider->value(),zmaxSlider->value()); + translate->SetTranslation(-xminSlider->value(),-yminSlider->value(),-zminSlider->value()); + translate->SetInput(filter->GetOutput()); + filter->ClipDataOn(); //Really create a cropped copy of the image + translate->Update(); + vtkImageData* output=vtkImageData::New(); + output->ShallowCopy(translate->GetOutput()); + mResult->AddImage(output); + } + QApplication::restoreOverrideCursor(); + std::ostringstream osstream; + osstream << "Crop_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; + AddImage(mResult, osstream.str()); + close(); +} +//------------------------------------------------------------------------------ +