From: David Sarrut Date: Tue, 29 Jan 2013 07:55:18 +0000 (+0100) Subject: Merge branch 'master' of git.creatis.insa-lyon.fr:clitk X-Git-Tag: v1.4.0~254 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=e64bc938065fef91ca19fb4b5f4f3bb973bc6f81;hp=3d3a49fd5446f30d0eeff47e4a99ba4a9e29d85d;p=clitk.git Merge branch 'master' of git.creatis.insa-lyon.fr:clitk --- diff --git a/registration/clitkConvertBLUTCoeffsToVFFilter.txx b/registration/clitkConvertBLUTCoeffsToVFFilter.txx index 491d049..ae1f9d5 100644 --- a/registration/clitkConvertBLUTCoeffsToVFFilter.txx +++ b/registration/clitkConvertBLUTCoeffsToVFFilter.txx @@ -162,8 +162,23 @@ namespace clitk component_filter[i]->Update(); coefficient_images[i] = component_filter[i]->GetOutput(); } + #if ITK_VERSION_MAJOR >= 4 - m_ITKTransform->SetCoefficientImages(coefficient_images); + // RP: 16/01/2013 + // ATTENTION: Apparently, there's a bug in the SetCoefficientImages function of ITK 4.x + // I needed to use SetParametersByValue instead. + // + typename ITKTransformType::ParametersType params(input->GetPixelContainer()->Size() * BLUTCoefficientImageType::ImageDimension); + for (unsigned int i=0; i < BLUTCoefficientImageType::ImageDimension; i++) { + for (unsigned int j=0; j < coefficient_images[i]->GetPixelContainer()->Size(); j++) + params[input->GetPixelContainer()->Size() * i + j] = coefficient_images[i]->GetPixelContainer()->GetBufferPointer()[j]; + } + + m_ITKTransform->SetGridOrigin(input->GetOrigin()); + m_ITKTransform->SetGridDirection(input->GetDirection()); + m_ITKTransform->SetGridRegion(input->GetLargestPossibleRegion()); + m_ITKTransform->SetGridSpacing(input->GetSpacing()); + m_ITKTransform->SetParametersByValue(params); #else m_ITKTransform->SetCoefficientImage(coefficient_images); #endif diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 505c210..36fb8d9 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -54,6 +54,11 @@ IF (CLITK_BUILD_TOOLS) TARGET_LINK_LIBRARIES(clitkVFResample clitkCommon ${ITK_LIBRARIES}) SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkVFResample) + WRAP_GGO(clitkVFInterpolate_GGO_C clitkVFInterpolate.ggo) + ADD_EXECUTABLE(clitkVFInterpolate clitkVFInterpolate.cxx clitkVFInterpolateGenericFilter.cxx ${clitkVFInterpolate_GGO_C}) + TARGET_LINK_LIBRARIES(clitkVFInterpolate clitkCommon ${ITK_LIBRARIES}) + SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkVFInterpolate) + WRAP_GGO(clitkImageCreate_GGO_C clitkImageCreate.ggo) ADD_EXECUTABLE(clitkImageCreate clitkImageCreate.cxx ${clitkImageCreate_GGO_C}) TARGET_LINK_LIBRARIES(clitkImageCreate clitkCommon ${ITK_LIBRARIES}) diff --git a/tools/clitkVFInterpolate.cxx b/tools/clitkVFInterpolate.cxx new file mode 100644 index 0000000..eaff9b1 --- /dev/null +++ b/tools/clitkVFInterpolate.cxx @@ -0,0 +1,78 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ +#ifndef CLITKVFRESAMPLE_CXX +#define CLITKVFRESAMPLE_CXX + +// clitk +#include "clitkVFInterpolate_ggo.h" +#include "clitkIO.h" +#include "clitkVFInterpolateGenericFilter.h" + +//-------------------------------------------------------------------- +int main(int argc, char * argv[]) +{ + + // Init command line + GGO(clitkVFInterpolate, args_info); + CLITK_INIT; + + // Read input image header to check image dimension + itk::ImageIOBase::Pointer header = clitk::readImageHeader(args_info.input1_arg); + unsigned int dim = header->GetNumberOfDimensions(); + std::string pixelTypeName = header->GetComponentTypeAsString(header->GetComponentType()); + + // Print image info if verbose + if (args_info.verbose_flag) { + std::cout << "Input image <" << args_info.input1_arg << "> is "; + clitk::printImageHeader(header, std::cout); + std::cout << std::endl; + } + + // Get input size/spacing + std::vector inputSize; + std::vector inputSpacing; + inputSize.resize(dim); + inputSpacing.resize(dim); + for (unsigned int i=0; iGetSpacing(i); + inputSize[i] = header->GetDimensions(i); + } + + if (args_info.verbose_flag) { + std::cout << "Output image will be : " << std::endl; + } + + // Create a filter + clitk::VFInterpolateGenericFilter::Pointer filter = clitk::VFInterpolateGenericFilter::New(); + filter->SetInputFilename(args_info.input1_arg); + filter->SetInputFilename2(args_info.input2_arg); + filter->SetInterpolationName(args_info.interp_arg); + filter->SetDistance(args_info.distance_arg); +// filter->SetBSplineOrder(args_info.order_arg); +// filter->SetBLUTSampling(args_info.sampling_arg); + filter->SetOutputFilename(args_info.output_arg); + + // Go ! + filter->Update(); + + // this is the end my friend + return 0; +}// end main +//-------------------------------------------------------------------- + +#endif /* end #define CLITKVFRESAMPLE_CXX */ diff --git a/tools/clitkVFInterpolate.ggo b/tools/clitkVFInterpolate.ggo new file mode 100644 index 0000000..f6e0c1b --- /dev/null +++ b/tools/clitkVFInterpolate.ggo @@ -0,0 +1,15 @@ +#File clitkImageInterpolate.ggo +package "clitkImageInterpolate" +version "1.0" +purpose "Interpolate an image. You can specify the interpolation, you can apply a Gaussian filter before." + +option "config" - "Config file" string no +option "input1" i "Input image filename" string yes +option "input2" j "Input image filename" string yes +option "output" o "Output image filename" string yes +option "distance" d "Distance (d in [0,1])" float yes +option "verbose" v "Verbose" flag off +option "interp" - "Interpolation type: {nn, linear}" string no default="nn" +#option "order" b "BSpline ordre (range 0-5)" int no default="3" +#option "sampling" s "BLUT sampling value" int no default="30" + diff --git a/tools/clitkVFInterpolateGenericFilter.cxx b/tools/clitkVFInterpolateGenericFilter.cxx new file mode 100644 index 0000000..777bb13 --- /dev/null +++ b/tools/clitkVFInterpolateGenericFilter.cxx @@ -0,0 +1,181 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ +#ifndef CLITKVFRESAMPLEGENERICFILTER_CXX +#define CLITKVFRESAMPLEGENERICFILTER_CXX + +#include "clitkVFInterpolateGenericFilter.h" +#include "itkInterpolateImageFilter.h" +#include "itkLinearInterpolateImageFunction.h" +#include "itkNearestNeighborInterpolateImageFunction.h" +#include "itkNthElementImageAdaptor.h" + +//-------------------------------------------------------------------- +clitk::VFInterpolateGenericFilter::VFInterpolateGenericFilter(): + clitk::ImageToImageGenericFilter("VFInterpolate") +{ + //InitializeImageType<2>(); + InitializeImageType<3>(); + // InitializeImageType<4>(); + mInterpolatorName = "nn"; + mBSplineOrder=3; + mDistance=0; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void clitk::VFInterpolateGenericFilter::InitializeImageType() +{ + //typedef itk::Vector v3f; + //ADD_IMAGE_TYPE(Dim, v3f); +// ADD_VEC_IMAGE_TYPE(Dim,2,double) + ADD_VEC_IMAGE_TYPE(Dim,3,float) + ADD_VEC_IMAGE_TYPE(Dim,3,double) + +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void clitk::VFInterpolateGenericFilter::UpdateWithInputImageType() +{ + + if (m_NbOfComponents == 1) { + std::cerr << "Error, only one components ? Use clitkImageInterpolate instead." << std::endl; + exit(0); + } + typedef typename ImageType::PixelType PixelType; +// if (m_NbOfComponents == 2) Update_WithDimAndPixelTypeAndComponent(); + if (m_NbOfComponents == 3) Update_WithDimAndPixelTypeAndComponent(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void clitk::VFInterpolateGenericFilter::Update_WithDimAndPixelTypeAndComponent() +{ + // Reading input + // typedef itk::Vector DisplacementType; + typedef PixelType DisplacementType; + typedef itk::Image< DisplacementType, Dim > ImageType; + + typename ImageType::Pointer input1 = clitk::readImage(m_InputFilenames[0], m_IOVerbose); + typename ImageType::Pointer input2 = clitk::readImage(mInputFilename2, m_IOVerbose); + + // Main filter + typename ImageType::Pointer outputImage = ComputeImage(input1, input2); + + // Write results + SetNextOutput(outputImage); +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +typename ImageType::Pointer +clitk::VFInterpolateGenericFilter::ComputeImage(typename ImageType::Pointer inputImage1, typename ImageType::Pointer inputImage2) +{ + + // Some typedefs + typedef itk::Image ScalarImageType; + typedef itk::Image InterpolationImageType; + typedef itk::NthElementImageAdaptor ImageAdaptorType; + typename ImageAdaptorType::Pointer adaptor1 = ImageAdaptorType::New(); + typename ImageAdaptorType::Pointer adaptor2 = ImageAdaptorType::New(); + adaptor1->SetImage(inputImage1); + adaptor2->SetImage(inputImage2); + + // Create Image Filter + typedef itk::InterpolateImageFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput1(adaptor1); + filter->SetInput2(adaptor2); + filter->SetDistance(mDistance); + + // Select interpolator + if (mInterpolatorName == "nn") { + typedef itk::NearestNeighborInterpolateImageFunction InterpolatorType; + typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); + filter->SetInterpolator(interpolator); + } else { + if (mInterpolatorName == "linear") { + typedef itk::LinearInterpolateImageFunction InterpolatorType; + typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); + filter->SetInterpolator(interpolator); + } else { + std::cerr << "Sorry, I do not know the interpolator (for vector field) '" << mInterpolatorName + << "'. Known interpolators are : nn, linear" << std::endl; + exit(0); + } + } + + typename ImageType::Pointer output = ImageType::New(); + typename ImageAdaptorType::Pointer adaptorOutput = ImageAdaptorType::New(); + output->CopyInformation(inputImage1); + output->SetRegions(inputImage1->GetLargestPossibleRegion()); + output->Allocate(); + + typedef itk::ImageRegionIterator IteratorType1; + typedef itk::ImageRegionIterator IteratorType2; + + for (unsigned int i = 0; i < ImageType::PixelType::Dimension; i++) { + adaptor1->SelectNthElement(i); + adaptor2->SelectNthElement(i); + + // Go ! + try { + filter->Update(); + } catch( itk::ExceptionObject & err ) { + std::cerr << "Error while filtering " << m_InputFilenames[0].c_str() + << " " << err << std::endl; + exit(0); + } + + adaptorOutput->SelectNthElement(i); + adaptorOutput->SetImage(output); + + IteratorType1 it1(filter->GetOutput(), filter->GetOutput()->GetLargestPossibleRegion()); + IteratorType2 it2(adaptorOutput, adaptorOutput->GetLargestPossibleRegion()); + + it1.GoToBegin(); + it2.GoToBegin(); + while ( ! it1.IsAtEnd() ) { + it2.Set(it1.Get()); + ++it1; + ++it2; + } + } + + // Return result + return output; + +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +void clitk::VFInterpolateGenericFilter::SetInterpolationName(const std::string & inter) +{ + mInterpolatorName = inter; +} +//-------------------------------------------------------------------- + +#endif + diff --git a/tools/clitkVFInterpolateGenericFilter.h b/tools/clitkVFInterpolateGenericFilter.h new file mode 100644 index 0000000..2d84dcf --- /dev/null +++ b/tools/clitkVFInterpolateGenericFilter.h @@ -0,0 +1,102 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ +#ifndef CLITKIMAGERESAMPLEGENERICFILTER_H +#define CLITKIMAGERESAMPLEGENERICFILTER_H +/** + ------------------------------------------------------------------- + * @file clitkVFInterpolateGenericFilter.h + * @author David Sarrut + * @date 23 Feb 2008 08:37:53 + + * @brief + -------------------------------------------------------------------*/ + +// clitk include +#include "clitkCommon.h" +#include "clitkImageCommon.h" +#include "clitkImageToImageGenericFilter.h" + +// itk include +#include "itkImage.h" +#include "itkVectorImage.h" +#include "itkFixedArray.h" +#include "itkImageFileReader.h" +#include "itkImageSeriesReader.h" +#include "itkImageFileWriter.h" +#include "itkRecursiveGaussianImageFilter.h" +#include "itkInterpolateImageFilter.h" +#include "itkAffineTransform.h" +#include "itkVectorNearestNeighborInterpolateImageFunction.h" +#include "itkVectorLinearInterpolateImageFunction.h" +#include "itkBSplineInterpolateImageFunction.h" +#include "itkBSplineInterpolateImageFunctionWithLUT.h" +#include "itkCommand.h" + +namespace clitk { + + //-------------------------------------------------------------------- + class VFInterpolateGenericFilter: + public clitk::ImageToImageGenericFilter { + + public: + // constructor + VFInterpolateGenericFilter(); + + // Types + typedef VFInterpolateGenericFilter Self; + typedef itk::SmartPointer Pointer; + typedef itk::SmartPointer ConstPointer; + + // New + itkNewMacro(Self); + + void SetInputFilename1(const std::string& file) { mInputFilename1 = file; } + void SetInputFilename2(const std::string& file) { mInputFilename2 = file; } + void SetInterpolationName(const std::string & inter); + void SetDistance(double distance) { mDistance = distance; } + void SetBSplineOrder(int o) { mBSplineOrder = o; } + void SetBLUTSampling(int b) { mSamplingFactors.resize(1); mSamplingFactors[0] = b; } + + //-------------------------------------------------------------------- + // Main function called each time the filter is updated + template + void UpdateWithInputImageType(); + + protected: + template void InitializeImageType(); + //-------------------------------------------------------------------- + std::string mInputFilename1, mInputFilename2; + std::string mInterpolatorName; + int mBSplineOrder; + std::vector mSamplingFactors; + double mDistance; + + //-------------------------------------------------------------------- + template + void Update_WithDimAndPixelTypeAndComponent(); + template + typename ImageType::Pointer ComputeImage(typename ImageType::Pointer inputImage1, typename ImageType::Pointer inputImage2); + + }; // end class VFInterpolateGenericFilter + //-------------------------------------------------------------------- + +} // end namespace +//-------------------------------------------------------------------- + +#endif /* end #define CLITKIMAGERESAMPLEGENERICFILTER_H */ + diff --git a/tools/clitkVFInterpolateGenericFilter.txx b/tools/clitkVFInterpolateGenericFilter.txx new file mode 100644 index 0000000..7b4aea1 --- /dev/null +++ b/tools/clitkVFInterpolateGenericFilter.txx @@ -0,0 +1,34 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ +#ifndef CLITKVFRESAMPLEGENERICFILTER_TXX +#define CLITKVFRESAMPLEGENERICFILTER_TXX +/** + ------------------------------------------------= + * @file clitkVFInterpolateGenericFilter.txx + * @author David Sarrut + * @date 23 Feb 2008 08:40:11 + * + * @brief + * + * + ------------------------------------------------=*/ + +//-------------------------------------------------------------------- + +#endif /* end #define CLITKVFRESAMPLEGENERICFILTER_TXX */ + diff --git a/vv/qt_ui/vvMainWindow.ui b/vv/qt_ui/vvMainWindow.ui index 07ddeb2..67a467d 100644 --- a/vv/qt_ui/vvMainWindow.ui +++ b/vv/qt_ui/vvMainWindow.ui @@ -254,6 +254,11 @@ Bones + + + Head/Brain + + [0,1] Scale @@ -805,7 +810,7 @@ 0 0 1008 - 29 + 18 diff --git a/vv/vvMainWindow.cxx b/vv/vvMainWindow.cxx index eb5fe7e..5c7bbfd 100644 --- a/vv/vvMainWindow.cxx +++ b/vv/vvMainWindow.cxx @@ -958,7 +958,7 @@ void vvMainWindow::LoadImages(std::vector files, vvImageReader::Loa double range[2]; mSlicerManagers.back()->GetImage()->GetFirstVTKImageData()->GetScalarRange(range); if ((range[0] == 0) && (range[1] == 1)) { - presetComboBox->setCurrentIndex(5);// binary + presetComboBox->setCurrentIndex(WL_BINARY);// binary } else { // TODO } @@ -1797,7 +1797,7 @@ void vvMainWindow::WindowLevelChanged() //------------------------------------------------------------------------------ void vvMainWindow::WindowLevelEdited() { - presetComboBox->setCurrentIndex(6); + presetComboBox->setCurrentIndex(WL_USER); UpdateWindowLevel(); } //------------------------------------------------------------------------------ @@ -1807,7 +1807,7 @@ void vvMainWindow::SetWindowLevel(double w, double l) { windowSpinBox->setValue(w); levelSpinBox->setValue(l); - presetComboBox->setCurrentIndex(6); + presetComboBox->setCurrentIndex(WL_USER); colorMapComboBox->setCurrentIndex(0); UpdateWindowLevel(); } @@ -1817,7 +1817,7 @@ void vvMainWindow::SetWindowLevel(double w, double l) void vvMainWindow::UpdateWindowLevel() { if (DataTree->selectedItems().size()) { - if (presetComboBox->currentIndex() == 7) //For ventilation + if (presetComboBox->currentIndex() == WL_VENTILATION) //For ventilation colorMapComboBox->setCurrentIndex(5); int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]); mSlicerManagers[index]->SetColorWindow(windowSpinBox->value()); @@ -1853,7 +1853,7 @@ void vvMainWindow::SwitchWindowLevel() { int index = GetSlicerIndexFromItem(DataTree->selectedItems()[0]); int window = mSlicerManagers[index]->GetColorWindow(); - presetComboBox->setCurrentIndex(6); + presetComboBox->setCurrentIndex(WL_USER); windowSpinBox->setValue(-window); UpdateWindowLevel(); } @@ -1872,7 +1872,7 @@ void vvMainWindow::ApplyWindowLevelToAllImages() continue; mSlicerManagers[i]->SetColorWindow(window); mSlicerManagers[i]->SetColorLevel(level); - mSlicerManagers[i]->SetPreset(6); + mSlicerManagers[i]->SetPreset(WL_USER); mSlicerManagers[i]->Render(); } } @@ -1885,7 +1885,7 @@ void vvMainWindow::ApplyWindowToSetOfImages(double window, unsigned int indexMin if (mSlicerManagers[i] == NULL) continue; mSlicerManagers[i]->SetColorWindow(window); - mSlicerManagers[i]->SetPreset(6); + mSlicerManagers[i]->SetPreset(WL_USER); mSlicerManagers[i]->Render(); } } @@ -1898,7 +1898,7 @@ void vvMainWindow::ApplyLevelToSetOfImages(double level, unsigned int indexMin, if (mSlicerManagers[i] == NULL) continue; mSlicerManagers[i]->SetColorLevel(level); - mSlicerManagers[i]->SetPreset(6); + mSlicerManagers[i]->SetPreset(WL_USER); mSlicerManagers[i]->Render(); } } diff --git a/vv/vvSlicerManager.cxx b/vv/vvSlicerManager.cxx index 67f78bc..e975da2 100644 --- a/vv/vvSlicerManager.cxx +++ b/vv/vvSlicerManager.cxx @@ -1244,41 +1244,46 @@ void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset) //---------------------------------------------------------------------------- void vvSlicerManager::SetPreset(int preset) { + //vtkLookupTable* LUT = static_cast(mSlicers[0]->GetWindowLevel()->GetLookupTable()); double window = mSlicers[0]->GetColorWindow(); double level = mSlicers[0]->GetColorLevel(); std::string component_type=mImage->GetScalarTypeAsITKString(); switch (preset) { - case 0: + case WL_AUTO: double range[2]; mImage->GetScalarRange(range); window = range[1] - range[0]; level = (range[1] + range[0])* 0.5; break; - case 1: + case WL_HOUNSFIELD: window = 2000; level = 0; break; - case 2: + case WL_SOFTTISSUE: window = 400; level = 20; break; - case 3: // lungs (same as FOCAL) + case WL_LUNGS: // lungs (same as FOCAL) window = 1700; level = -300; break; - case 4: + case WL_BONES: window = 1000; level = 500; break; - case 5: + case WL_HEAD: + window = 200; + level = 70; + break; + case WL_BINARY: window = 1; level = 0.5; break; - case 6: + case WL_USER: break; - case 7: + case WL_VENTILATION: window=1.; level=0.; break; @@ -1328,7 +1333,7 @@ void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlK this->mSlicers[slicer]->GetConcatenatedTransform()); this->SetColorWindow(max-min); this->SetColorLevel(0.5*(min+max)); - this->SetPreset(6); + this->SetPreset(WL_USER); } this->Render(); this->UpdateWindowLevel(); diff --git a/vv/vvSlicerManager.h b/vv/vvSlicerManager.h index d634fbd..3479dc6 100644 --- a/vv/vvSlicerManager.h +++ b/vv/vvSlicerManager.h @@ -47,6 +47,18 @@ class vvImageReader; class vvImageReader; class vvLandmarks; +enum WindowLevelPreset { + WL_AUTO, + WL_HOUNSFIELD, + WL_SOFTTISSUE, + WL_LUNGS, + WL_BONES, + WL_HEAD, + WL_BINARY, + WL_USER, + WL_VENTILATION +}; + //------------------------------------------------------------------------------ class vvSlicerManager : public QObject { Q_OBJECT diff --git a/vv/vvSlicerManagerCommand.cxx b/vv/vvSlicerManagerCommand.cxx index ad80b92..f5d2b69 100644 --- a/vv/vvSlicerManagerCommand.cxx +++ b/vv/vvSlicerManagerCommand.cxx @@ -113,33 +113,33 @@ void vvSlicerManagerCommand::Execute(vtkObject *caller, return; } if (KeyPress == "0") { - this->SM->SetPreset(0); + this->SM->SetPreset(WL_AUTO); this->SM->UpdateWindowLevel(); return; } if (KeyPress == "1") { - this->SM->SetPreset(1); + this->SM->SetPreset(WL_HOUNSFIELD); this->SM->UpdateWindowLevel(); return; } if (KeyPress == "2") { - this->SM->SetPreset(2); + this->SM->SetPreset(WL_SOFTTISSUE); this->SM->UpdateWindowLevel(); return; } if (KeyPress == "3") { - this->SM->SetPreset(3); + this->SM->SetPreset(WL_LUNGS); this->SM->UpdateWindowLevel(); return; } if (KeyPress == "4") { - this->SM->SetPreset(4); + this->SM->SetPreset(WL_BONES); this->SM->UpdateWindowLevel(); return; } if (KeyPress == "5") { - this->SM->SetPreset(5); + this->SM->SetPreset(WL_HEAD); this->SM->UpdateWindowLevel(); return; } @@ -164,7 +164,7 @@ void vvSlicerManagerCommand::Execute(vtkObject *caller, return; } if (KeyPress == "equal") { //keycodes are in vtkWin32RenderWindowInteractor - this->SM->SetPreset(7); + this->SM->SetPreset(WL_VENTILATION); //this->SM->SetColorMap(1); this->SM->UpdateWindowLevel(); return; @@ -420,7 +420,7 @@ void vvSlicerManagerCommand::Execute(vtkObject *caller, this->SM->SetColorWindow(window*dx); this->SM->SetColorLevel(level-dy); - this->SM->SetPreset(6); + this->SM->SetPreset(WL_USER); this->SM->Render(); this->SM->UpdateWindowLevel(); return;