]> Creatis software - clitk.git/commitdiff
Merge branch 'master' of /home/dsarrut/clitk3.server
authordsarrut <david.sarrut@gmail.com>
Thu, 26 May 2011 14:15:29 +0000 (16:15 +0200)
committerdsarrut <david.sarrut@gmail.com>
Thu, 26 May 2011 14:15:29 +0000 (16:15 +0200)
12 files changed:
license-header.txt
tools/CMakeLists.txt
tools/clitkBinaryImageToMesh.cxx [new file with mode: 0644]
tools/clitkBinaryImageToMesh.ggo [new file with mode: 0644]
tools/clitkMeshViewer.cxx [new file with mode: 0644]
tools/clitkMeshViewer.ggo [new file with mode: 0644]
vv/vvMainWindow.cxx
vv/vvMeshReader.cxx
vv/vvSlicer.cxx
vv/vvSlicer.h
vv/vvToolCropImage.cxx
vv/vvToolCropImage.h

index d567eacfca753909136f9e0422718210626e3234..72e4e03defe168886b506594c00e47bf86147ba4 100644 (file)
@@ -14,5 +14,4 @@
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-===========================================================================*/
-
+==========================================================================*/
index c46ba3a0ec806a420f0819ad9c94bcfbc7c781e3..cc56a6dd1d4054080d2d162044b961f4a3cec8a7 100644 (file)
@@ -25,236 +25,247 @@ WRAP_GGO(clitkMedianImageFilter_GGO_C clitkMedianImageFilter.ggo)
 ADD_LIBRARY(clitkMedianImageFilterLib clitkMedianImageGenericFilter.cxx ${clitkMedianImageFilter_GGO_C})
 
 IF (CLITK_BUILD_TOOLS)
-    WRAP_GGO(clitkDicomInfo_GGO_C clitkDicomInfo.ggo)
-    ADD_EXECUTABLE(clitkDicomInfo clitkDicomInfo.cxx ${clitkDicomInfo_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkDicomInfo clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkDicomInfo_GGO_C clitkDicomInfo.ggo)
+  ADD_EXECUTABLE(clitkDicomInfo clitkDicomInfo.cxx ${clitkDicomInfo_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkDicomInfo clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkDicom2Image_GGO_C clitkDicom2Image.ggo)
-    ADD_EXECUTABLE(clitkDicom2Image clitkDicom2Image.cxx ${clitkDicom2Image_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkDicom2Image clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkDicom2Image_GGO_C clitkDicom2Image.ggo)
+  ADD_EXECUTABLE(clitkDicom2Image clitkDicom2Image.cxx ${clitkDicom2Image_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkDicom2Image clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkImageInfo_GGO_C clitkImageInfo.ggo)
-    ADD_EXECUTABLE(clitkImageInfo clitkImageInfo.cxx ${clitkImageInfo_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkImageInfo clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkImageInfo_GGO_C clitkImageInfo.ggo)
+  ADD_EXECUTABLE(clitkImageInfo clitkImageInfo.cxx ${clitkImageInfo_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageInfo clitkCommon ${ITK_LIBRARIES})
 
-    ADD_EXECUTABLE(clitkImageConvert clitkImageConvert.cxx)
-    TARGET_LINK_LIBRARIES(clitkImageConvert clitkImageConvertLib clitkCommon ${ITK_LIBRARIES})
+  ADD_EXECUTABLE(clitkImageConvert clitkImageConvert.cxx)
+  TARGET_LINK_LIBRARIES(clitkImageConvert clitkImageConvertLib clitkCommon ${ITK_LIBRARIES})
 
-    ADD_EXECUTABLE(clitkBinarizeImage clitkBinarizeImage.cxx)
-    TARGET_LINK_LIBRARIES(clitkBinarizeImage clitkBinarizeImageLib clitkCommon ${ITK_LIBRARIES})
+  ADD_EXECUTABLE(clitkBinarizeImage clitkBinarizeImage.cxx)
+  TARGET_LINK_LIBRARIES(clitkBinarizeImage clitkBinarizeImageLib clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkVFResample_GGO_C clitkVFResample.ggo)
-    ADD_EXECUTABLE(clitkVFResample clitkVFResample.cxx clitkVFResampleGenericFilter.cxx ${clitkVFResample_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkVFResample clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkVFResample_GGO_C clitkVFResample.ggo)
+  ADD_EXECUTABLE(clitkVFResample clitkVFResample.cxx clitkVFResampleGenericFilter.cxx ${clitkVFResample_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkVFResample clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkImageCreate_GGO_C clitkImageCreate.ggo)
-    ADD_EXECUTABLE(clitkImageCreate clitkImageCreate.cxx ${clitkImageCreate_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkImageCreate clitkCommon  ${ITK_LIBRARIES})
+  WRAP_GGO(clitkImageCreate_GGO_C clitkImageCreate.ggo)
+  ADD_EXECUTABLE(clitkImageCreate clitkImageCreate.cxx ${clitkImageCreate_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageCreate clitkCommon  ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkZeroVF_GGO_C clitkZeroVF.ggo)
-    ADD_EXECUTABLE(clitkZeroVF clitkZeroVF.cxx ${clitkZeroVF_GGO_C} clitkZeroVFGenericFilter.cxx)
-    TARGET_LINK_LIBRARIES(clitkZeroVF clitkCommon  ${ITK_LIBRARIES})
+  WRAP_GGO(clitkZeroVF_GGO_C clitkZeroVF.ggo)
+  ADD_EXECUTABLE(clitkZeroVF clitkZeroVF.cxx ${clitkZeroVF_GGO_C} clitkZeroVFGenericFilter.cxx)
+  TARGET_LINK_LIBRARIES(clitkZeroVF clitkCommon  ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkImageExtractLine_GGO_C clitkImageExtractLine.ggo)
-    ADD_EXECUTABLE(clitkImageExtractLine clitkImageExtractLine.cxx ${clitkImageExtractLine_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkImageExtractLine clitkCommon  ${ITK_LIBRARIES})
+  WRAP_GGO(clitkImageExtractLine_GGO_C clitkImageExtractLine.ggo)
+  ADD_EXECUTABLE(clitkImageExtractLine clitkImageExtractLine.cxx ${clitkImageExtractLine_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageExtractLine clitkCommon  ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkSplitImage_GGO_C clitkSplitImage.ggo)
-    ADD_EXECUTABLE(clitkSplitImage clitkSplitImage.cxx clitkSplitImageGenericFilter.cxx ${clitkSplitImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkSplitImage clitkCommon ${ITK_LIBRARIES} )
+  WRAP_GGO(clitkSplitImage_GGO_C clitkSplitImage.ggo)
+  ADD_EXECUTABLE(clitkSplitImage clitkSplitImage.cxx clitkSplitImageGenericFilter.cxx ${clitkSplitImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkSplitImage clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkVFMerge_GGO_C clitkVFMerge.ggo)
-    ADD_EXECUTABLE(clitkVFMerge clitkVFMerge.cxx ${clitkVFMerge_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkVFMerge clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkVFMerge_GGO_C clitkVFMerge.ggo)
+  ADD_EXECUTABLE(clitkVFMerge clitkVFMerge.cxx ${clitkVFMerge_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkVFMerge clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkWriteDicomSeries_GGO_C clitkWriteDicomSeries.ggo)
-    ADD_EXECUTABLE(clitkWriteDicomSeries clitkWriteDicomSeries.cxx ${clitkWriteDicomSeries_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkWriteDicomSeries clitkCommon ${ITK_LIBRARIES} )
+  WRAP_GGO(clitkWriteDicomSeries_GGO_C clitkWriteDicomSeries.ggo)
+  ADD_EXECUTABLE(clitkWriteDicomSeries clitkWriteDicomSeries.cxx ${clitkWriteDicomSeries_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkWriteDicomSeries clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkAverageTemporalDimension_GGO_C clitkAverageTemporalDimension.ggo)
-    ADD_EXECUTABLE(clitkAverageTemporalDimension clitkAverageTemporalDimension.cxx ${clitkAverageTemporalDimension_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkAverageTemporalDimension clitkCommon ${ITK_LIBRARIES} )
+  WRAP_GGO(clitkAverageTemporalDimension_GGO_C clitkAverageTemporalDimension.ggo)
+  ADD_EXECUTABLE(clitkAverageTemporalDimension clitkAverageTemporalDimension.cxx ${clitkAverageTemporalDimension_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkAverageTemporalDimension clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkMedianTemporalDimension_GGO_C clitkMedianTemporalDimension.ggo)
-    ADD_EXECUTABLE(clitkMedianTemporalDimension clitkMedianTemporalDimension.cxx
-        ${clitkMedianTemporalDimension_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkMedianTemporalDimension clitkCommon ${ITK_LIBRARIES} )
+  WRAP_GGO(clitkMedianTemporalDimension_GGO_C clitkMedianTemporalDimension.ggo)
+  ADD_EXECUTABLE(clitkMedianTemporalDimension clitkMedianTemporalDimension.cxx
+      ${clitkMedianTemporalDimension_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkMedianTemporalDimension clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkWarpImage_GGO_C clitkWarpImage.ggo)
-    ADD_EXECUTABLE(clitkWarpImage clitkWarpImage.cxx ${clitkWarpImage_GGO_C} clitkWarpImageGenericFilter.cxx)
-    TARGET_LINK_LIBRARIES(clitkWarpImage clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkWarpImage_GGO_C clitkWarpImage.ggo)
+  ADD_EXECUTABLE(clitkWarpImage clitkWarpImage.cxx ${clitkWarpImage_GGO_C} clitkWarpImageGenericFilter.cxx)
+  TARGET_LINK_LIBRARIES(clitkWarpImage clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkInvertVF_GGO_C clitkInvertVF.ggo)
-    ADD_EXECUTABLE(clitkInvertVF clitkInvertVF.cxx ${clitkInvertVF_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkInvertVF clitkCommon ${ITK_LIBRARIES} )
+  WRAP_GGO(clitkInvertVF_GGO_C clitkInvertVF.ggo)
+  ADD_EXECUTABLE(clitkInvertVF clitkInvertVF.cxx ${clitkInvertVF_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkInvertVF clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkAffineTransform_GGO_C clitkAffineTransform.ggo)
-    ADD_EXECUTABLE(clitkAffineTransform clitkAffineTransform.cxx ${clitkAffineTransform_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkAffineTransform clitkCommon ${ITK_LIBRARIES} )
+  WRAP_GGO(clitkAffineTransform_GGO_C clitkAffineTransform.ggo)
+  ADD_EXECUTABLE(clitkAffineTransform clitkAffineTransform.cxx ${clitkAffineTransform_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkAffineTransform clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkSetBackground_GGO_C clitkSetBackground.ggo)
-    ADD_EXECUTABLE(clitkSetBackground clitkSetBackground.cxx clitkSetBackgroundGenericFilter.cxx ${clitkSetBackground_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkSetBackground clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkSetBackground_GGO_C clitkSetBackground.ggo)
+  ADD_EXECUTABLE(clitkSetBackground clitkSetBackground.cxx clitkSetBackgroundGenericFilter.cxx ${clitkSetBackground_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkSetBackground clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkGuerreroVentilation_GGO_C clitkGuerreroVentilation.ggo)
-    ADD_EXECUTABLE(clitkGuerreroVentilation clitkGuerreroVentilation.cxx clitkGuerreroVentilationGenericFilter.cxx ${clitkGuerreroVentilation_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkGuerreroVentilation clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkGuerreroVentilation_GGO_C clitkGuerreroVentilation.ggo)
+  ADD_EXECUTABLE(clitkGuerreroVentilation clitkGuerreroVentilation.cxx clitkGuerreroVentilationGenericFilter.cxx ${clitkGuerreroVentilation_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkGuerreroVentilation clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkGammaIndex_GGO_C clitkGammaIndex.ggo)
-    ADD_EXECUTABLE(clitkGammaIndex clitkGammaIndex.cxx ${clitkGammaIndex_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkGammaIndex vtkCommon vtkFiltering vtkGraphics vtkIO vtkImaging)
+  WRAP_GGO(clitkGammaIndex_GGO_C clitkGammaIndex.ggo)
+  ADD_EXECUTABLE(clitkGammaIndex clitkGammaIndex.cxx ${clitkGammaIndex_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkGammaIndex vtkCommon vtkFiltering vtkGraphics vtkIO vtkImaging)
 
-    ADD_EXECUTABLE(clitkImageArithm clitkImageArithm.cxx)
-    TARGET_LINK_LIBRARIES(clitkImageArithm clitkImageArithmImageLib clitkCommon ${ITK_LIBRARIES} )
+  ADD_EXECUTABLE(clitkImageArithm clitkImageArithm.cxx)
+  TARGET_LINK_LIBRARIES(clitkImageArithm clitkImageArithmImageLib clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkUnsharpMask_GGO_C clitkUnsharpMask.ggo)
-    ADD_EXECUTABLE(clitkUnsharpMask clitkUnsharpMask.cxx ${clitkUnsharpMask_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkUnsharpMask clitkCommon ${ITK_LIBRARIES} ) 
+  WRAP_GGO(clitkUnsharpMask_GGO_C clitkUnsharpMask.ggo)
+  ADD_EXECUTABLE(clitkUnsharpMask clitkUnsharpMask.cxx ${clitkUnsharpMask_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkUnsharpMask clitkCommon ${ITK_LIBRARIES} ) 
 
-    WRAP_GGO(clitkFooImage_GGO_C clitkFooImage.ggo)
-    ADD_EXECUTABLE(clitkFooImage clitkFooImage.cxx ${clitkFooImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkFooImage clitkCommon ${ITK_LIBRARIES} ) 
+  WRAP_GGO(clitkFooImage_GGO_C clitkFooImage.ggo)
+  ADD_EXECUTABLE(clitkFooImage clitkFooImage.cxx ${clitkFooImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkFooImage clitkCommon ${ITK_LIBRARIES} ) 
 
-    WRAP_GGO(clitkMedianImageFilter_GGO_C clitkMedianImageFilter.ggo)
-    ADD_EXECUTABLE(clitkMedianImageFilter clitkMedianImageFilter.cxx ${clitkMedianImageFilter_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkMedianImageFilter clitkCommon ${ITK_LIBRARIES})
+  WRAP_GGO(clitkMedianImageFilter_GGO_C clitkMedianImageFilter.ggo)
+  ADD_EXECUTABLE(clitkMedianImageFilter clitkMedianImageFilter.cxx ${clitkMedianImageFilter_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkMedianImageFilter clitkCommon ${ITK_LIBRARIES})
 
-    ADD_EXECUTABLE(clitkResampleImage clitkResampleImage.cxx)
-    TARGET_LINK_LIBRARIES(clitkResampleImage clitkResampleImageLib clitkCommon ${ITK_LIBRARIES})
+  ADD_EXECUTABLE(clitkResampleImage clitkResampleImage.cxx)
+  TARGET_LINK_LIBRARIES(clitkResampleImage clitkResampleImageLib clitkCommon ${ITK_LIBRARIES})
 
-    WRAP_GGO(clitkMinMaxMask_GGO_C clitkMinMaxMask.ggo)
-    ADD_EXECUTABLE(clitkMinMaxMask clitkMinMaxMask.cxx ${clitkMinMaxMask_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkMinMaxMask clitkCommon ${ITK_LIBRARIES}  )
+  WRAP_GGO(clitkMinMaxMask_GGO_C clitkMinMaxMask.ggo)
+  ADD_EXECUTABLE(clitkMinMaxMask clitkMinMaxMask.cxx ${clitkMinMaxMask_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkMinMaxMask clitkCommon ${ITK_LIBRARIES}  )
 
-    # WRAP_GGO(clitkAutoCrop_GGO_C clitkAutoCrop.ggo)
-    # ADD_EXECUTABLE(clitkAutoCrop clitkAutoCrop.cxx ${clitkAutoCrop_GGO_C})
-    # TARGET_LINK_LIBRARIES(clitkAutoCrop clitkCommon ${ITK_LIBRARIES} )
+  # WRAP_GGO(clitkAutoCrop_GGO_C clitkAutoCrop.ggo)
+  # ADD_EXECUTABLE(clitkAutoCrop clitkAutoCrop.cxx ${clitkAutoCrop_GGO_C})
+  # TARGET_LINK_LIBRARIES(clitkAutoCrop clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkDicomRTStruct2BinaryImage_GGO_C clitkDicomRTStruct2BinaryImage.ggo)
-    ADD_EXECUTABLE(clitkDicomRTStruct2BinaryImage clitkDicomRTStruct2BinaryImage.cxx ${clitkDicomRTStruct2BinaryImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkDicomRTStruct2BinaryImage clitkDicomRTStruct clitkCommon ${ITK_LIBRARIES} )
+  WRAP_GGO(clitkDicomRTStruct2BinaryImage_GGO_C clitkDicomRTStruct2BinaryImage.ggo)
+  ADD_EXECUTABLE(clitkDicomRTStruct2BinaryImage clitkDicomRTStruct2BinaryImage.cxx ${clitkDicomRTStruct2BinaryImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkDicomRTStruct2BinaryImage clitkDicomRTStruct clitkCommon ${ITK_LIBRARIES} )
 
-    WRAP_GGO(clitkImageLog_GGO_C clitkImageLog.ggo)
-    ADD_EXECUTABLE(clitkImageLog clitkImageLog.cxx ${clitkImageLog_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkImageLog  ${ITK_LIBRARIES} clitkCommon)
+  WRAP_GGO(clitkImageLog_GGO_C clitkImageLog.ggo)
+  ADD_EXECUTABLE(clitkImageLog clitkImageLog.cxx ${clitkImageLog_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageLog  ${ITK_LIBRARIES} clitkCommon)
 
-    WRAP_GGO(clitkFilter_GGO_C clitkFilter.ggo)
-    ADD_EXECUTABLE(clitkFilter clitkFilter.cxx clitkFilterGenericFilter.cxx ${clitkFilter_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkFilter ${ITK_LIBRARIES} clitkCommon)
+  WRAP_GGO(clitkFilter_GGO_C clitkFilter.ggo)
+  ADD_EXECUTABLE(clitkFilter clitkFilter.cxx clitkFilterGenericFilter.cxx ${clitkFilter_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkFilter ${ITK_LIBRARIES} clitkCommon)
 
-    WRAP_GGO(clitkConeBeamProjectImage_GGO_C clitkConeBeamProjectImage.ggo)
-    ADD_EXECUTABLE(clitkConeBeamProjectImage clitkConeBeamProjectImage.cxx clitkConeBeamProjectImageGenericFilter.cxx ${clitkConeBeamProjectImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkConeBeamProjectImage  ${ITK_LIBRARIES} clitkCommon )
+  WRAP_GGO(clitkConeBeamProjectImage_GGO_C clitkConeBeamProjectImage.ggo)
+  ADD_EXECUTABLE(clitkConeBeamProjectImage clitkConeBeamProjectImage.cxx clitkConeBeamProjectImageGenericFilter.cxx ${clitkConeBeamProjectImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkConeBeamProjectImage  ${ITK_LIBRARIES} clitkCommon )
 
-    WRAP_GGO(clitkComposeVF_GGO_C clitkComposeVF.ggo)
-    ADD_EXECUTABLE(clitkComposeVF clitkComposeVFGenericFilter.cxx clitkComposeVF.cxx ${clitkComposeVF_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkComposeVF ${ITK_LIBRARIES} clitkCommon)
+  WRAP_GGO(clitkComposeVF_GGO_C clitkComposeVF.ggo)
+  ADD_EXECUTABLE(clitkComposeVF clitkComposeVFGenericFilter.cxx clitkComposeVF.cxx ${clitkComposeVF_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkComposeVF ${ITK_LIBRARIES} clitkCommon)
 
-    WRAP_GGO(clitkMergeSequence_GGO_C clitkMergeSequence.ggo)
-    ADD_EXECUTABLE(clitkMergeSequence clitkMergeSequence.cxx clitkMergeSequenceGenericFilter.cxx ${clitkMergeSequence_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkMergeSequence ${ITK_LIBRARIES} clitkCommon)
+  WRAP_GGO(clitkMergeSequence_GGO_C clitkMergeSequence.ggo)
+  ADD_EXECUTABLE(clitkMergeSequence clitkMergeSequence.cxx clitkMergeSequenceGenericFilter.cxx ${clitkMergeSequence_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkMergeSequence ${ITK_LIBRARIES} clitkCommon)
 
-    WRAP_GGO(clitkBackProjectImage_GGO_C clitkBackProjectImage.ggo)
-    ADD_EXECUTABLE(clitkBackProjectImage clitkBackProjectImage.cxx clitkBackProjectImageGenericFilter.cxx ${clitkBackProjectImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkBackProjectImage ${ITK_LIBRARIES} clitkCommon )
+  WRAP_GGO(clitkBackProjectImage_GGO_C clitkBackProjectImage.ggo)
+  ADD_EXECUTABLE(clitkBackProjectImage clitkBackProjectImage.cxx clitkBackProjectImageGenericFilter.cxx ${clitkBackProjectImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkBackProjectImage ${ITK_LIBRARIES} clitkCommon )
 
-    ADD_EXECUTABLE(clitkCropImage clitkCropImage.cxx ${clitkCropImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkCropImage clitkCropImageLib clitkCommon ${ITK_LIBRARIES})
+  ADD_EXECUTABLE(clitkCropImage clitkCropImage.cxx ${clitkCropImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkCropImage clitkCropImageLib clitkCommon ${ITK_LIBRARIES})
+
+  # WRAP_GGO(clitkExtractSlice_GGO_C clitkExtractSlice.ggo)
+  # ADD_EXECUTABLE(clitkExtractSlice clitkExtractSlice.cxx clitkExtractSliceGenericFilter.cxx ${clitkExtractSlice_GGO_C})
+  # TARGET_LINK_LIBRARIES(clitkExtractSlice clitkCommon ${ITK_LIBRARIES})
+  
+  WRAP_GGO(clitkFlipImage_GGO_C clitkFlipImage.ggo)
+  ADD_EXECUTABLE(clitkFlipImage clitkFlipImage.cxx clitkFlipImageGenericFilter.cxx ${clitkFlipImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkFlipImage clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkMirrorPadImage_GGO_C clitkMirrorPadImage.ggo)
+  ADD_EXECUTABLE(clitkMirrorPadImage clitkMirrorPadImage.cxx clitkMirrorPadImageGenericFilter.cxx ${clitkMirrorPadImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkMirrorPadImage clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkImageMoment_GGO_C clitkImageMoment.ggo)
+  ADD_EXECUTABLE(clitkImageMoment clitkImageMoment.cxx clitkImageMomentGenericFilter.cxx ${clitkImageMoment_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageMoment clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkImageStatistics_GGO_C clitkImageStatistics.ggo)
+  ADD_EXECUTABLE(clitkImageStatistics clitkImageStatistics.cxx clitkImageStatisticsGenericFilter.cxx ${clitkImageStatistics_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageStatistics clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkSetOrigin_GGO_C clitkSetOrigin.ggo)
+  ADD_EXECUTABLE(clitkSetOrigin clitkSetOrigin.cxx clitkSetOriginGenericFilter.cxx ${clitkSetOrigin_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkSetOrigin clitkCommon ${ITK_LIBRARIES} )
+    
+  WRAP_GGO(clitkGetOrigin_GGO_C clitkGetOrigin.ggo)
+  ADD_EXECUTABLE(clitkGetOrigin clitkGetOrigin.cxx clitkGetOriginGenericFilter.cxx ${clitkGetOrigin_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkGetOrigin clitkCommon ${ITK_LIBRARIES} )
+
+  WRAP_GGO(clitkGetDirection_GGO_C clitkGetDirection.ggo)
+  ADD_EXECUTABLE(clitkGetDirection clitkGetDirection.cxx clitkGetDirectionGenericFilter.cxx ${clitkGetDirection_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkGetDirection clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkSetDirection_GGO_C clitkSetDirection.ggo)
+  ADD_EXECUTABLE(clitkSetDirection clitkSetDirection.cxx clitkSetDirectionGenericFilter.cxx ${clitkSetDirection_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkSetDirection clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkGetSize_GGO_C clitkGetSize.ggo)
+  ADD_EXECUTABLE(clitkGetSize  clitkGetSize.cxx clitkGetSizeGenericFilter.cxx ${clitkGetSize_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkGetSize  clitkCommon   ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkGetSpacing_GGO_C clitkGetSpacing.ggo)
+  ADD_EXECUTABLE(clitkGetSpacing  clitkGetSpacing.cxx clitkGetSpacingGenericFilter.cxx ${clitkGetSpacing_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkGetSpacing  clitkCommon   ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkSetSpacing_GGO_C clitkSetSpacing.ggo)
+  ADD_EXECUTABLE(clitkSetSpacing  clitkSetSpacing.cxx clitkSetSpacingGenericFilter.cxx ${clitkSetSpacing_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkSetSpacing  clitkCommon   ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkCombineImage_GGO_C clitkCombineImage.ggo)
+  ADD_EXECUTABLE(clitkCombineImage clitkCombineImage.cxx clitkCombineImageGenericFilter.cxx ${clitkCombineImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkCombineImage clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkPermuteAxes_GGO_C clitkPermuteAxes.ggo)
+  ADD_EXECUTABLE(clitkPermuteAxes clitkPermuteAxes.cxx clitkPermuteAxesGenericFilter.cxx ${clitkPermuteAxes_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkPermuteAxes clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkChangeImageOrientation_GGO_C clitkChangeImageOrientation.ggo)
+  ADD_EXECUTABLE(clitkChangeImageOrientation clitkChangeImageOrientation.cxx clitkChangeImageOrientationGenericFilter.cxx ${clitkChangeImageOrientation_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkChangeImageOrientation clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkVFConvert_GGO_C clitkVFConvert.ggo)
+  ADD_EXECUTABLE(clitkVFConvert clitkVFConvert.cxx clitkVFConvertGenericFilter.cxx ${clitkVFConvert_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkVFConvert ${ITK_LIBRARIES} clitkCommon )
+
+  WRAP_GGO(clitkImageToVectorImage_GGO_C clitkImageToVectorImage.ggo)
+  ADD_EXECUTABLE(clitkImageToVectorImage  clitkImageToVectorImage.cxx clitkImageToVectorImageGenericFilter.cxx ${clitkImageToVectorImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageToVectorImage  clitkCommon   ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkVectorImageToImage_GGO_C clitkVectorImageToImage.ggo)
+  ADD_EXECUTABLE(clitkVectorImageToImage  clitkVectorImageToImage.cxx clitkVectorImageToImageGenericFilter.cxx ${clitkVectorImageToImage_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkVectorImageToImage  clitkCommon   ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkBSplineCoefficientsToValues_GGO_C clitkBSplineCoefficientsToValues.ggo)
+  ADD_EXECUTABLE(clitkBSplineCoefficientsToValues  clitkBSplineCoefficientsToValues.cxx clitkBSplineCoefficientsToValuesGenericFilter.cxx ${clitkBSplineCoefficientsToValues_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkBSplineCoefficientsToValues clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkValuesToBSplineCoefficients_GGO_C clitkValuesToBSplineCoefficients.ggo)
+  ADD_EXECUTABLE(clitkValuesToBSplineCoefficients  clitkValuesToBSplineCoefficients.cxx clitkValuesToBSplineCoefficientsGenericFilter.cxx ${clitkValuesToBSplineCoefficients_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkValuesToBSplineCoefficients clitkCommon ${ITK_LIBRARIES})
+
+  ADD_EXECUTABLE(clitkMIP clitkMIP.cxx clitkMIPGenericFilter.cxx)
+  TARGET_LINK_LIBRARIES(clitkMIP clitkMIPLib clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkRelativePosition_GGO_C clitkRelativePosition.ggo)
+  ADD_EXECUTABLE(clitkRelativePosition  clitkRelativePosition.cxx ${clitkRelativePosition_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkRelativePosition clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkTransformLandmarks_GGO_C clitkTransformLandmarks.ggo)
+  ADD_EXECUTABLE(clitkTransformLandmarks clitkTransformLandmarks.cxx ${clitkTransformLandmarks_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkTransformLandmarks clitkCommon ${ITK_LIBRARIES})
+
+  WRAP_GGO(clitkLineProfile_GGO_C clitkLineProfile.ggo)
+  ADD_EXECUTABLE(clitkLineProfile clitkLineProfile.cxx clitkLineProfileGenericFilter.cxx ${clitkLineProfile_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkLineProfile clitkCommon ${ITK_LIBRARIES})
 
-    # WRAP_GGO(clitkExtractSlice_GGO_C clitkExtractSlice.ggo)
-    # ADD_EXECUTABLE(clitkExtractSlice clitkExtractSlice.cxx clitkExtractSliceGenericFilter.cxx ${clitkExtractSlice_GGO_C})
-    # TARGET_LINK_LIBRARIES(clitkExtractSlice clitkCommon ${ITK_LIBRARIES})
+  IF(CLITK_EXPERIMENTAL)
     
-    WRAP_GGO(clitkFlipImage_GGO_C clitkFlipImage.ggo)
-    ADD_EXECUTABLE(clitkFlipImage clitkFlipImage.cxx clitkFlipImageGenericFilter.cxx ${clitkFlipImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkFlipImage clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkMirrorPadImage_GGO_C clitkMirrorPadImage.ggo)
-    ADD_EXECUTABLE(clitkMirrorPadImage clitkMirrorPadImage.cxx clitkMirrorPadImageGenericFilter.cxx ${clitkMirrorPadImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkMirrorPadImage clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkImageMoment_GGO_C clitkImageMoment.ggo)
-    ADD_EXECUTABLE(clitkImageMoment clitkImageMoment.cxx clitkImageMomentGenericFilter.cxx ${clitkImageMoment_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkImageMoment clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkImageStatistics_GGO_C clitkImageStatistics.ggo)
-    ADD_EXECUTABLE(clitkImageStatistics clitkImageStatistics.cxx clitkImageStatisticsGenericFilter.cxx ${clitkImageStatistics_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkImageStatistics clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkSetOrigin_GGO_C clitkSetOrigin.ggo)
-    ADD_EXECUTABLE(clitkSetOrigin clitkSetOrigin.cxx clitkSetOriginGenericFilter.cxx ${clitkSetOrigin_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkSetOrigin clitkCommon ${ITK_LIBRARIES} )
-     
-    WRAP_GGO(clitkGetOrigin_GGO_C clitkGetOrigin.ggo)
-    ADD_EXECUTABLE(clitkGetOrigin clitkGetOrigin.cxx clitkGetOriginGenericFilter.cxx ${clitkGetOrigin_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkGetOrigin clitkCommon ${ITK_LIBRARIES} )
-
-    WRAP_GGO(clitkGetDirection_GGO_C clitkGetDirection.ggo)
-    ADD_EXECUTABLE(clitkGetDirection clitkGetDirection.cxx clitkGetDirectionGenericFilter.cxx ${clitkGetDirection_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkGetDirection clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkSetDirection_GGO_C clitkSetDirection.ggo)
-    ADD_EXECUTABLE(clitkSetDirection clitkSetDirection.cxx clitkSetDirectionGenericFilter.cxx ${clitkSetDirection_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkSetDirection clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkGetSize_GGO_C clitkGetSize.ggo)
-    ADD_EXECUTABLE(clitkGetSize  clitkGetSize.cxx clitkGetSizeGenericFilter.cxx ${clitkGetSize_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkGetSize  clitkCommon   ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkGetSpacing_GGO_C clitkGetSpacing.ggo)
-    ADD_EXECUTABLE(clitkGetSpacing  clitkGetSpacing.cxx clitkGetSpacingGenericFilter.cxx ${clitkGetSpacing_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkGetSpacing  clitkCommon   ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkSetSpacing_GGO_C clitkSetSpacing.ggo)
-    ADD_EXECUTABLE(clitkSetSpacing  clitkSetSpacing.cxx clitkSetSpacingGenericFilter.cxx ${clitkSetSpacing_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkSetSpacing  clitkCommon   ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkCombineImage_GGO_C clitkCombineImage.ggo)
-    ADD_EXECUTABLE(clitkCombineImage clitkCombineImage.cxx clitkCombineImageGenericFilter.cxx ${clitkCombineImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkCombineImage clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkPermuteAxes_GGO_C clitkPermuteAxes.ggo)
-    ADD_EXECUTABLE(clitkPermuteAxes clitkPermuteAxes.cxx clitkPermuteAxesGenericFilter.cxx ${clitkPermuteAxes_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkPermuteAxes clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkChangeImageOrientation_GGO_C clitkChangeImageOrientation.ggo)
-    ADD_EXECUTABLE(clitkChangeImageOrientation clitkChangeImageOrientation.cxx clitkChangeImageOrientationGenericFilter.cxx ${clitkChangeImageOrientation_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkChangeImageOrientation clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkVFConvert_GGO_C clitkVFConvert.ggo)
-    ADD_EXECUTABLE(clitkVFConvert clitkVFConvert.cxx clitkVFConvertGenericFilter.cxx ${clitkVFConvert_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkVFConvert ${ITK_LIBRARIES} clitkCommon )
-
-    WRAP_GGO(clitkImageToVectorImage_GGO_C clitkImageToVectorImage.ggo)
-    ADD_EXECUTABLE(clitkImageToVectorImage  clitkImageToVectorImage.cxx clitkImageToVectorImageGenericFilter.cxx ${clitkImageToVectorImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkImageToVectorImage  clitkCommon   ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkVectorImageToImage_GGO_C clitkVectorImageToImage.ggo)
-    ADD_EXECUTABLE(clitkVectorImageToImage  clitkVectorImageToImage.cxx clitkVectorImageToImageGenericFilter.cxx ${clitkVectorImageToImage_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkVectorImageToImage  clitkCommon   ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkBSplineCoefficientsToValues_GGO_C clitkBSplineCoefficientsToValues.ggo)
-    ADD_EXECUTABLE(clitkBSplineCoefficientsToValues  clitkBSplineCoefficientsToValues.cxx clitkBSplineCoefficientsToValuesGenericFilter.cxx ${clitkBSplineCoefficientsToValues_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkBSplineCoefficientsToValues clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkValuesToBSplineCoefficients_GGO_C clitkValuesToBSplineCoefficients.ggo)
-    ADD_EXECUTABLE(clitkValuesToBSplineCoefficients  clitkValuesToBSplineCoefficients.cxx clitkValuesToBSplineCoefficientsGenericFilter.cxx ${clitkValuesToBSplineCoefficients_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkValuesToBSplineCoefficients clitkCommon ${ITK_LIBRARIES})
-
-    ADD_EXECUTABLE(clitkMIP clitkMIP.cxx clitkMIPGenericFilter.cxx)
-    TARGET_LINK_LIBRARIES(clitkMIP clitkMIPLib clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkRelativePosition_GGO_C clitkRelativePosition.ggo)
-    ADD_EXECUTABLE(clitkRelativePosition  clitkRelativePosition.cxx ${clitkRelativePosition_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkRelativePosition clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkTransformLandmarks_GGO_C clitkTransformLandmarks.ggo)
-    ADD_EXECUTABLE(clitkTransformLandmarks clitkTransformLandmarks.cxx ${clitkTransformLandmarks_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkTransformLandmarks clitkCommon ${ITK_LIBRARIES})
-
-    WRAP_GGO(clitkLineProfile_GGO_C clitkLineProfile.ggo)
-    ADD_EXECUTABLE(clitkLineProfile clitkLineProfile.cxx clitkLineProfileGenericFilter.cxx ${clitkLineProfile_GGO_C})
-    TARGET_LINK_LIBRARIES(clitkLineProfile clitkCommon ${ITK_LIBRARIES})
+    WRAP_GGO(clitkBinaryImageToMesh_GGO_C clitkBinaryImageToMesh.ggo)
+    ADD_EXECUTABLE(clitkBinaryImageToMesh clitkBinaryImageToMesh.cxx ${clitkBinaryImageToMesh_GGO_C})
+    TARGET_LINK_LIBRARIES(clitkBinaryImageToMesh ${ITK_LIBRARIES} vtkCommon vtkRendering)
+
+    WRAP_GGO(clitkMeshViewer_GGO_C clitkMeshViewer.ggo)
+    ADD_EXECUTABLE(clitkMeshViewer clitkMeshViewer.cxx ${clitkMeshViewer_GGO_C})
+    TARGET_LINK_LIBRARIES(clitkMeshViewer vtkCommon vtkRendering)
+  ENDIF(CLITK_EXPERIMENTAL)
 
 ENDIF(CLITK_BUILD_TOOLS)
 
diff --git a/tools/clitkBinaryImageToMesh.cxx b/tools/clitkBinaryImageToMesh.cxx
new file mode 100644 (file)
index 0000000..463fa45
--- /dev/null
@@ -0,0 +1,122 @@
+/*=========================================================================
+  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
+===========================================================================*/
+#include "clitkBinaryImageToMesh_ggo.h"
+#include "clitkImageToImageGenericFilter.h"
+
+#include "vtkMetaImageReader.h"
+#include "vtkContourFilter.h"
+#include "vtkDecimatePro.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkActor.h"
+#include "vtkCamera.h"
+#include "vtkOBJExporter.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkSmartPointer.h"
+
+#include "itksys/SystemTools.hxx"
+
+void run(const args_info_clitkBinaryImageToMesh& argsInfo);
+
+int main(int argc, char** argv)
+{
+  GGO(clitkBinaryImageToMesh, args_info);
+
+  run(args_info);
+  
+  return EXIT_SUCCESS;
+}
+
+void run(const args_info_clitkBinaryImageToMesh& argsInfo)
+{
+    std::string file = argsInfo.input_arg;
+   
+    vtkSmartPointer<vtkMetaImageReader> pbmp_reader = vtkMetaImageReader::New();
+    pbmp_reader->SetFileName(file.c_str());
+    pbmp_reader->Update();
+
+    printf("Filtering...\n");
+    vtkSmartPointer<vtkContourFilter> pcontour = vtkContourFilter::New();
+    pcontour->SetValue(0, 0.5);
+    pcontour->SetInputConnection(pbmp_reader->GetOutputPort());
+    
+    vtkSmartPointer<vtkDecimatePro> psurface = vtkDecimatePro::New();
+    psurface->SetInputConnection(pcontour->GetOutputPort());
+
+    vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkPolyDataMapper::New();
+      skinMapper->SetInputConnection(psurface->GetOutputPort());
+      skinMapper->ScalarVisibilityOff();
+    
+    vtkSmartPointer<vtkActor> skin = vtkActor::New();
+      skin->SetMapper(skinMapper);
+    
+    vtkSmartPointer<vtkCamera> aCamera = vtkCamera::New();
+      aCamera->SetViewUp (0, 0, -1);
+      aCamera->SetPosition (0, 1, 0);
+      aCamera->SetFocalPoint (0, 0, 0);
+      aCamera->ComputeViewPlaneNormal();
+    aCamera->Dolly(1.5);
+
+    vtkSmartPointer<vtkRenderer> aRenderer = vtkRenderer::New();
+    aRenderer->AddActor(skin);
+    aRenderer->SetActiveCamera(aCamera);
+    aRenderer->ResetCamera ();
+    aRenderer->SetBackground(0,0,0);
+    aRenderer->ResetCameraClippingRange ();
+
+    vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New();
+      renWin->AddRenderer(aRenderer);
+    renWin->SetSize(640, 480);
+    
+    vtkSmartPointer<vtkOBJExporter> pwriter2 = vtkOBJExporter::New();
+    pwriter2->SetRenderWindow(renWin);
+
+    std::string output;
+    if (argsInfo.output_given) {
+      output = argsInfo.output_arg;
+      if (itksys::SystemTools::FileIsDirectory(output.c_str())) {
+        file = itksys::SystemTools::GetFilenameName(file.c_str());
+        file = itksys::SystemTools::GetFilenameWithoutExtension(file.c_str());
+        file = itksys::SystemTools::CollapseFullPath(file.c_str(), output.c_str());
+      }
+      else {
+        file = output;
+      }
+    }
+    else { 
+      file = itksys::SystemTools::GetFilenameWithoutExtension(file);
+    }
+    pwriter2->SetFilePrefix(file.c_str());
+    pwriter2->Write();
+
+    vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkRenderWindowInteractor::New();
+      iren->SetRenderWindow(renWin);
+
+    skinMapper->Update();
+    bool interact = argsInfo.view_flag;
+    if (interact)
+    {
+      iren->Initialize();
+      iren->Start(); 
+    }
+    else
+      renWin->Render();
+}
+
+
diff --git a/tools/clitkBinaryImageToMesh.ggo b/tools/clitkBinaryImageToMesh.ggo
new file mode 100644 (file)
index 0000000..d04462d
--- /dev/null
@@ -0,0 +1,11 @@
+#File clitkBinaryImageToMesh.ggo
+package "clitkBinaryImageToMesh"
+version "1.0"
+purpose "Get the HU profile along the given line. Output to stdout."
+
+option "config"   - "Config file"   string  no
+option "verbose"  v     "Verbose"   flag  off
+
+option "input"    i "Input image"   string  yes
+option "output"    o "Output mesh file prefix (if empty, use input file's base name as prefix; if a directoy, output to it using input file's base name as prefix; otherwise, use given name as prefix"  string  no
+option "view"   - "View result"        flag    off
diff --git a/tools/clitkMeshViewer.cxx b/tools/clitkMeshViewer.cxx
new file mode 100644 (file)
index 0000000..3cfffbb
--- /dev/null
@@ -0,0 +1,318 @@
+/*=========================================================================
+  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
+===========================================================================*/
+
+#include "vtkOBJReader.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+#include "vtkActor.h"
+#include "vtkCamera.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkSmartPointer.h"
+#include "vtkCommand.h"
+#include "vtkAnimationCue.h"
+#include "vtkAnimationScene.h"
+#include "vtkProperty.h"
+#include "vtkInteractorStyle.h"
+
+#include "clitkCommon.h"
+#include "clitkMeshViewer_ggo.h"
+
+#include <string>
+#include <iostream>
+#include <vector>
+
+typedef vtkSmartPointer<vtkOBJReader> ObjReaderType;
+typedef vtkSmartPointer<vtkPolyDataMapper> MapperType;
+typedef vtkSmartPointer<vtkActor> ActorType;
+
+
+long run(const args_info_clitkMeshViewer& argsInfo);
+
+// Adapted from vtkAnimationCue example...
+class CueAnimator
+{
+public:
+  CueAnimator(std::vector<ActorType>& rActors) : m_Fps(1), m_CurrentActor(0), m_rActors(rActors) {
+    m_rActors[0]->SetVisibility(1);
+    for (unsigned int i = 1; i < m_rActors.size(); i++) {
+      m_rActors[i]->SetVisibility(0);
+    }
+  }
+  
+  ~CueAnimator() {
+   }
+  
+  void SetFps(double fps) {
+    m_Fps = fps;
+  }
+  
+  void StartCue(vtkAnimationCue::AnimationCueInfo *vtkNotUsed(info),
+                vtkRenderer *ren)
+    {
+      //std::cout << "StartCue" << std::endl;
+    }
+  
+  void Tick(vtkAnimationCue::AnimationCueInfo *info,
+            vtkRenderer *ren)
+    {
+      //std::cout << "Tick AT:" << info->AnimationTime << " DT:" << info->DeltaTime << " CT:" << info->ClockTime << std::endl;
+      
+      m_rActors[m_CurrentActor]->SetVisibility(0);
+      
+      int step = round(m_Fps * info->AnimationTime);
+      int actor = step % m_rActors.size();
+      
+      //if (actor != m_CurrentActor) std::cout << "Showing frame: " << m_CurrentActor << std::endl;
+      m_CurrentActor = actor;
+      m_rActors[m_CurrentActor]->SetVisibility(1);
+      
+      ren->Render();
+    }
+  
+  void EndCue(vtkAnimationCue::AnimationCueInfo *info,
+              vtkRenderer *ren)
+    {
+      //std::cout << "EndCue" << std::endl;
+    }
+  
+protected:
+  
+  double m_Fps;
+  clock_t m_LastTick;
+  double m_TotalTicks;
+  int m_CurrentActor;
+  std::vector<ActorType>& m_rActors;
+};
+
+class vtkAnimationCueObserver : public vtkCommand
+{
+public:
+  static vtkAnimationCueObserver *New()
+    {
+      return new vtkAnimationCueObserver;
+    }
+  
+  virtual void Execute(vtkObject *vtkNotUsed(caller),
+                       unsigned long event,
+                       void *calldata)
+    {
+      if(this->Animator!=0 && this->Renderer!=0)
+        {
+        vtkAnimationCue::AnimationCueInfo *info=
+          static_cast<vtkAnimationCue::AnimationCueInfo *>(calldata);
+        switch(event)
+          {
+          case vtkCommand::StartAnimationCueEvent:
+            this->Animator->StartCue(info,this->Renderer);
+            break;
+          case vtkCommand::EndAnimationCueEvent:
+            this->Animator->EndCue(info,this->Renderer);
+            break;
+          case vtkCommand::AnimationCueTickEvent:
+            this->Animator->Tick(info,this->Renderer);
+            break;
+          }
+        }
+      if(this->RenWin!=0)
+        {
+        this->RenWin->Render();
+        }
+    }
+  
+  vtkRenderer *Renderer;
+  vtkRenderWindow *RenWin;
+  CueAnimator *Animator;
+  
+protected:
+  vtkAnimationCueObserver()
+    {
+      this->Renderer=0;
+      this->Animator=0;
+      this->RenWin=0;
+    }
+};
+
+class vtkWindowObserver : public vtkCommand
+{
+public:
+  static vtkWindowObserver *New()
+    {
+      return new vtkWindowObserver;
+    }
+
+  virtual void Execute(vtkObject *caller,
+                       unsigned long event,
+                       void *calldata)
+    {
+      vtkRenderWindowInteractor *isi = dynamic_cast<vtkRenderWindowInteractor *>(caller);
+      //std::cout << "Execute" << std::endl;
+      switch (event)
+      {
+        case vtkCommand::KeyPressEvent:
+        {
+          std::string key = isi->GetKeySym();
+          //std::cout << key[0] << std::endl;
+          switch (key[0])
+          {
+            case 'P':
+            case 'p':
+              if (this->m_Scene)
+                this->m_Scene->Play();
+              break;
+          
+            case 'M':
+            case 'm':
+              if (this->m_Scene)
+                this->m_Scene->Stop();
+              break;
+          
+            default:
+              break;
+          }
+        }
+          
+        default:
+          break;
+          
+      }
+      
+    }
+    
+    vtkAnimationScene* m_Scene;
+    
+  protected:
+    
+    vtkWindowObserver() : m_Scene(0) {}
+};
+
+int main(int argc, char** argv)
+{
+  GGO(clitkMeshViewer, args_info);
+
+  return run(args_info);
+}
+
+long run(const args_info_clitkMeshViewer& argsInfo)
+{
+  std::vector<ObjReaderType> objs;
+  std::vector<MapperType> mappers;
+  std::vector<ActorType> actors;
+  
+  bool verbose = argsInfo.verbose_flag;
+
+  int nfiles = argsInfo.inputs_num;
+  if (nfiles == 0)
+  {
+    std::cout << "At leas one mesh (.OBJ) file must be given. See clitkMeshViewer -h." << std::endl;
+    return -1;
+  }
+  
+  if (verbose) 
+    std::cout << nfiles << " file(s) to be loaded..." << std::endl;
+  
+  vtkSmartPointer<vtkRenderer> aRenderer = vtkRenderer::New();
+  for (int i = 0; i < nfiles; i++) {    
+    std::string file = argsInfo.inputs[i];
+    if (verbose)
+      std::cout << "Reading " << file << std::endl;
+    
+    vtkSmartPointer<vtkOBJReader> preader = vtkOBJReader::New();
+    preader->SetFileName(file.c_str());
+    preader->Update();
+    objs.push_back(preader);
+    
+    vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkPolyDataMapper::New();
+    skinMapper->SetInputConnection(preader->GetOutputPort());
+    skinMapper->ScalarVisibilityOff();
+    mappers.push_back(skinMapper);
+
+    vtkSmartPointer<vtkActor> skin = vtkActor::New();
+    skin->SetMapper(skinMapper);
+    actors.push_back(skin);
+
+    aRenderer->AddActor(skin);
+  }
+
+  vtkSmartPointer<vtkCamera> aCamera = vtkCamera::New();
+  aCamera->SetViewUp (0, 0, -1);
+  aCamera->SetPosition (0, 1, 0);
+  aCamera->SetFocalPoint (0, 0, 0);
+  aCamera->ComputeViewPlaneNormal();
+  aCamera->Dolly(1.5);
+
+  aRenderer->SetActiveCamera(aCamera);
+  aRenderer->ResetCamera ();
+  aRenderer->SetBackground(0,0,0);
+  aRenderer->ResetCameraClippingRange ();
+
+  vtkSmartPointer<vtkRenderWindow> renWin = vtkRenderWindow::New();
+  renWin->AddRenderer(aRenderer);
+  renWin->SetSize(640, 480);
+  
+  vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkRenderWindowInteractor::New();
+  iren->SetRenderWindow(renWin);
+  iren->Initialize();
+  
+  vtkSmartPointer<vtkAnimationScene> scene;
+  vtkSmartPointer<vtkAnimationCue> cue1;
+  vtkSmartPointer<vtkAnimationCueObserver> anim_observer;
+  vtkSmartPointer<vtkWindowObserver> window_observer;
+  CueAnimator animator(actors);
+  
+  bool animate = argsInfo.animate_flag;
+  if (animate) {
+    double fps = argsInfo.fps_arg;
+    animator.SetFps(fps);
+
+    // Create an Animation Scene
+    scene=vtkAnimationScene::New();
+    scene->SetModeToRealTime();
+
+    scene->SetLoop(1);
+    scene->SetTimeModeToRelative();
+    scene->SetStartTime(0);
+    scene->SetEndTime(actors.size()/fps);
+    
+    // Create an Animation Cue.
+    cue1=vtkAnimationCue::New();
+    cue1->SetTimeModeToRelative();
+    cue1->SetStartTime(0);
+    cue1->SetEndTime(actors.size()/fps);
+    scene->AddCue(cue1);
+    
+    // Create Cue anim_observer.
+    anim_observer=vtkAnimationCueObserver::New();
+    anim_observer->Renderer=aRenderer;
+    anim_observer->Animator=&animator;
+    anim_observer->RenWin=renWin;
+    cue1->AddObserver(vtkCommand::StartAnimationCueEvent,anim_observer);
+    cue1->AddObserver(vtkCommand::EndAnimationCueEvent,anim_observer);
+    cue1->AddObserver(vtkCommand::AnimationCueTickEvent,anim_observer);
+
+    window_observer = vtkWindowObserver::New();
+    window_observer->m_Scene = scene;
+    iren->AddObserver(vtkCommand::KeyPressEvent, window_observer);
+    
+  }
+
+  iren->Start(); 
+  return 0;
+}
+
+
diff --git a/tools/clitkMeshViewer.ggo b/tools/clitkMeshViewer.ggo
new file mode 100644 (file)
index 0000000..b990d7a
--- /dev/null
@@ -0,0 +1,11 @@
+#File clitkMeshViewer.ggo
+package "clitkMeshViewer"
+version "1.0"
+purpose "Visualize a set of meshes"
+usage "clitkMeshViewer FILE1 FILE2 ... [OPTIONS]"
+
+option "config"   - "Config file"   string  no
+option "verbose"  v     "Verbose"   flag  off
+
+option "animate"    - "Enable animation mode (type p/m to start/stop animation)"  flag  off
+option "fps"    - "Set the animation's frame rate (in fps)"    double  default="4.0"   no
index 995d3dee38a3cd2671a852619c5183acaa4b2c65..43dcff1d3f11acc4ff4f4213ad116c0ae9101e93 100644 (file)
@@ -1064,70 +1064,35 @@ void vvMainWindow::ImageInfoChanged()
     vvImage::Pointer imageSelected;
     if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0]) {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
-      dimension = imageSelected->GetNumberOfDimensions();
-      origin.resize(dimension);
-      inputSpacing.resize(dimension);
-      inputSize.resize(dimension);
-      sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str();
-      for (int i = 0; i < dimension; i++) {
-        origin[i] = imageSelected->GetOrigin()[i];
-        inputSpacing[i] = imageSelected->GetSpacing()[i];
-        inputSize[i] = imageSelected->GetSize()[i];
-        sizeMM[i] = inputSize[i]*inputSpacing[i];
-        NPixel *= inputSize[i];
-      }
-      inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
     } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF();
-      dimension = imageSelected->GetNumberOfDimensions();
-      origin.resize(dimension);
-      inputSpacing.resize(dimension);
-      inputSize.resize(dimension);
-      sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetVF()->GetScalarTypeAsITKString().c_str();
-      for (int i = 0; i < dimension; i++) {
-        origin[i] = imageSelected->GetOrigin()[i];
-        inputSpacing[i] = imageSelected->GetSpacing()[i];
-        inputSize[i] = imageSelected->GetSize()[i];
-        sizeMM[i] = inputSize[i]*inputSpacing[i];
-        NPixel *= inputSize[i];
-      }
-      inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
     } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay();
-      dimension = imageSelected->GetNumberOfDimensions();
-      origin.resize(dimension);
-      inputSpacing.resize(dimension);
-      inputSize.resize(dimension);
-      sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str();
-      for (int i = 0; i < dimension; i++) {
-        origin[i] = imageSelected->GetOrigin()[i];
-        inputSpacing[i] = imageSelected->GetSpacing()[i];
-        inputSize[i] = imageSelected->GetSize()[i];
-        sizeMM[i] = inputSize[i]*inputSpacing[i];
-        NPixel *= inputSize[i];
-      }
-      inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
     } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
-      dimension = imageSelected->GetNumberOfDimensions();
-      origin.resize(dimension);
-      inputSpacing.resize(dimension);
-      inputSize.resize(dimension);
-      sizeMM.resize(dimension);
-      pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str();
-      for (int i = 0; i < dimension; i++) {
-        origin[i] = imageSelected->GetOrigin()[i];
-        inputSpacing[i] = imageSelected->GetSpacing()[i];
-        inputSize[i] = imageSelected->GetSize()[i];
-        sizeMM[i] = inputSize[i]*inputSpacing[i];
-        NPixel *= inputSize[i];
-      }
-      inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
+    }
+    else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "contour") {
+      imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
+    }
+    else {
+      imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
     }
 
+    dimension = imageSelected->GetNumberOfDimensions();
+    origin.resize(dimension);
+    inputSpacing.resize(dimension);
+    inputSize.resize(dimension);
+    sizeMM.resize(dimension);
+    pixelType = mSlicerManagers[index]->GetImage()->GetScalarTypeAsITKString().c_str();
+    for (int i = 0; i < dimension; i++) {
+      origin[i] = imageSelected->GetOrigin()[i];
+      inputSpacing[i] = imageSelected->GetSpacing()[i];
+      inputSize[i] = imageSelected->GetSize()[i];
+      sizeMM[i] = inputSize[i]*inputSpacing[i];
+      NPixel *= inputSize[i];
+    }
+    inputSizeInBytes = GetSizeInBytes(imageSelected->GetActualMemorySize()*1000);
+    
     QString dim = QString::number(dimension) + " (";
     dim += pixelType + ")";
 
@@ -1614,15 +1579,18 @@ void vvMainWindow::ReloadImage(QTreeWidgetItem* item, int column)
   int index = GetSlicerIndexFromItem(item);
   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   QString role=item->data(1,Qt::UserRole).toString();
-  if ( role == "vector")
+  if ( role == "vector"){
     mSlicerManagers[index]->ReloadVF();
-  else if (role == "overlay")
+  }
+  else if (role == "overlay"){
     mSlicerManagers[index]->ReloadOverlay();
-  else if (role == "fusion")
+  }
+  else if (role == "fusion"){
     mSlicerManagers[index]->ReloadFusion();
-  else
+  }
+  else{
     mSlicerManagers[index]->Reload();
-
+  }
   // Update view and info
   ImageInfoChanged();
   mSlicerManagers[index]->Render();
index fb0baf47a10c0edd5cd9ef7edb01dbab36db1bf6..1da14a15b4e6eabd5f9eed4e1d307917b9b05273 100644 (file)
@@ -137,6 +137,90 @@ std::vector<vvMesh::Pointer> vvMeshReader::readSelectedContours()
 {
   std::vector<vvMesh::Pointer> result;
 #if GDCM_MAJOR_VERSION == 2
+  gdcm::Reader reader;
+  reader.SetFileName(filename.c_str());
+  reader.Read();
+
+  const gdcm::DataSet &ds = reader.GetFile().GetDataSet();
+
+  gdcm::SmartPointer<gdcm::SequenceOfItems> rois = ds.GetDataElement(gdcm::Tag(0x3006,0x39)).GetValueAsSQ();
+  gdcm::SmartPointer<gdcm::SequenceOfItems> roi_info = ds.GetDataElement(gdcm::Tag(0x3006,0x20)).GetValueAsSQ();
+  assert(rois); // TODO error message
+  assert(roi_info); // TODO error message
+  assert(rois->GetNumberOfItems() == roi_info->GetNumberOfItems());
+
+  for (unsigned ridx = 0; ridx < rois->GetNumberOfItems(); ++ridx)
+  {
+    vtkSmartPointer<vtkAppendPolyData> append=vtkSmartPointer<vtkAppendPolyData>::New();
+    const gdcm::DataSet& ds_rois = rois->GetItem( ridx + 1).GetNestedDataSet();
+    const gdcm::DataSet& ds_roi_info = roi_info->GetItem( ridx + 1).GetNestedDataSet();
+
+    gdcm::Attribute<0x3006,0x84> roinumber;
+    roinumber.SetFromDataSet(ds_rois);
+    if (std::find(selected_contours.begin(), selected_contours.end(), roinumber.GetValue()) != selected_contours.end()) //Only read selected ROIs
+    {
+      gdcm::Attribute<0x3006,0x2a> trgb;
+      trgb.SetFromDataSet(ds_rois);
+      vvMesh::Pointer current_roi=vvMesh::New();
+      current_roi->r = trgb[0] / 255;
+      current_roi->g = trgb[1] / 255;
+      current_roi->b = trgb[2] / 255;
+
+      gdcm::Attribute<0x3006,0x26> tstructure_name;
+      tstructure_name.SetFromDataSet(ds_roi_info);
+      current_roi->structure_name = tstructure_name.GetValue();
+
+      gdcm::SmartPointer<gdcm::SequenceOfItems> roi_seq = ds_rois.GetDataElement(gdcm::Tag(0x3006,0x40)).GetValueAsSQ();
+      double z0=-1; //Used to determine spacing between slices, assumed to be constant
+      for (unsigned j = 0; j < roi_seq->GetNumberOfItems(); ++j)
+      {
+        gdcm::Item & item_roi_seq = roi_seq->GetItem(j + 1); // Item starts at 1
+        const gdcm::DataSet& ds_roi_seq = item_roi_seq.GetNestedDataSet();
+        gdcm::Attribute<0x3006,0x42> tcontour_type;
+        tcontour_type.SetFromDataSet(ds_roi_seq);
+        std::string contour_type = tcontour_type.GetValue();
+        if (contour_type=="CLOSED_PLANAR ")
+        {
+          gdcm::Attribute<0x3006,0x46> tpoint_number;
+          tpoint_number.SetFromDataSet(ds_roi_seq);
+          const gdcm::DataElement & points_data = ds_roi_seq.GetDataElement(gdcm::Tag(0x3006,0x50));
+          gdcm::Attribute<0x3006,0x50> tpoints;
+          tpoints.SetFromDataElement(points_data);
+          assert(tpoints.GetNumberOfValues() == static_cast<unsigned int>(tpoint_number.GetValue()) * 3);
+          const double* points = tpoints.GetValues();
+          if (z0 == -1) //First contour
+            z0=points[2];
+          else
+            if (current_roi->GetSpacing()==-1 && points[2] != z0 )
+              current_roi->SetSpacing(points[2]-z0);
+          vtkPolyData * contour=vtkPolyData::New();
+          contour->Allocate(); //for cell structures
+          contour->SetPoints(vtkPoints::New());
+          vtkIdType ids[2];
+          for (unsigned idx = 0; idx < tpoints.GetNumberOfValues(); idx += 3)
+          {
+            contour->GetPoints()->InsertNextPoint(points[idx], points[idx+1], points[idx+2]);
+            ids[0] = idx / 3;
+            ids[1] = (ids[0] + 1) % tpoint_number.GetValue(); //0-1,1-2,...,n-1-0
+            contour->GetLines()->InsertNextCell(2, ids);
+          }
+          append->AddInput(contour);
+        }
+        else
+          if (contour_type == "POINT ")
+          ; // silently ignore POINT type since we don't need them at the moment
+          else
+            std::cerr << "Warning: contour type " << contour_type << " not handled!" << std::endl;
+      }
+      append->Update();
+      current_roi->AddMesh(append->GetOutput());
+      result.push_back(current_roi);
+    }
+    else
+    {
+    //std::cerr << "Warning: ignoring ROI #" << roi_number << std::endl;
+    }
+  }
 #else
   gdcm::File reader;
   reader.SetFileName(filename.c_str());
index 9809b06ddc771b574d4de2923c2a750ad11e1f67..30e8ccbf2f7a31478d41672e6fd08d013c0ef28d 100644 (file)
 #include <vtkImageAccumulate.h>
 #include <vtkImageReslice.h>
 
-// template <class T, unsigned int dim>
-// void print_vector(const char* pmsg, T* pvec)
-// {
-//   std::cout << pmsg << ": ";
-//   for (unsigned int i = 0; i < dim; i++)
-//     std::cout << pvec[i] << " ";
-//   std::cout << std::endl;
-// }
-
-
 vtkCxxRevisionMacro(vvSlicer, "DummyRevision");
 vtkStandardNewMacro(vvSlicer);
-
+static void copyExtent(int* in, int* to){
+ for(int i=0; i<6; ++i) to[i]=in[i]; 
+}
 //------------------------------------------------------------------------------
 vvSlicer::vvSlicer()
 {
   this->UnInstallPipeline();
   mImage = NULL;
+  mReducedExtent = new int[6];
   mCurrentTSlice = 0;
   mUseReducedExtent = false;
 
@@ -221,7 +214,7 @@ void vvSlicer::EnableReducedExtent(bool b)
 //------------------------------------------------------------------------------
 void vvSlicer::SetReducedExtent(int * ext)
 {
-  mReducedExtent = ext;
+  copyExtent(ext, mReducedExtent);
 }
 //------------------------------------------------------------------------------
 
@@ -299,6 +292,7 @@ vvSlicer::~vvSlicer()
   for (std::vector<vvMeshActor*>::iterator i=mSurfaceCutActors.begin();
        i!=mSurfaceCutActors.end(); i++)
     delete (*i);
+  delete [] mReducedExtent;
 }
 //------------------------------------------------------------------------------
 
@@ -337,7 +331,7 @@ void vvSlicer::SetImage(vvImage::Pointer image)
 
     // Prevent crash when reload -> change slice if outside extent
     if (Slice < extent[SliceOrientation*2] || Slice>=extent[SliceOrientation*2+1]) {
-      Slice = (extent[SliceOrientation*2+1]-extent[SliceOrientation*2])/2.0;
+      Slice = (extent[SliceOrientation*2+1]+extent[SliceOrientation*2])/2.0;
     }
 
     // Make sure that the required part image has been computed
@@ -771,8 +765,7 @@ void vvSlicer::AdjustResliceToSliceOrientation(vtkImageReslice *reslice)
 //------------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
-int * vvSlicer::GetExtent()
-{
+int * vvSlicer::GetExtent(){
   int *w_ext;
   if (mUseReducedExtent) {
     w_ext = mReducedExtent;
@@ -801,13 +794,7 @@ void vvSlicer::UpdateDisplayExtent()
 
   // Local copy of extent
   int w_ext[6];
-  for(unsigned int i=0; i<6; i++){
-    if (mUseReducedExtent)
-      w_ext[i] = mReducedExtent[i];
-    else  
-      w_ext[i] = input->GetWholeExtent()[i];
-  }
-
+  copyExtent(GetExtent(), w_ext);
   // Set slice value
   w_ext[ this->SliceOrientation*2   ] = this->Slice;
   w_ext[ this->SliceOrientation*2+1 ] = this->Slice;
@@ -1345,9 +1332,12 @@ void vvSlicer::SetContourSlice()
 {
   if (mSurfaceCutActors.size() > 0)
     for (std::vector<vvMeshActor*>::iterator i=mSurfaceCutActors.begin();
-         i!=mSurfaceCutActors.end(); i++)
+         i!=mSurfaceCutActors.end(); i++) {
+         
+      (*i)->SetSlicingOrientation(this->SliceOrientation);
       (*i)->SetCutSlice((this->Slice)*this->GetImage()->GetSpacing()[this->SliceOrientation]+
                         this->GetImage()->GetOrigin()[this->SliceOrientation]);
+    }
 }
 //----------------------------------------------------------------------------
 
index 0246723ad1b69837694dccc6fd1b32b39cc13730..95ec75e80438d4b5d4e6185f2bca504fc31c09fb 100644 (file)
@@ -166,7 +166,11 @@ public:
   virtual void SetColorWindow(double s);
   virtual void SetColorLevel(double s);
 
-    
+  /**
+   * When it is enabled, beware of a call to GetExtent.
+   * we must have setted mReducedExtent otherwhise random values
+   * are returned by GetExtent
+   * */
   void EnableReducedExtent(bool b);
   void SetReducedExtent(int * ext);
 
index 2030407b614cfcc2df3d1b16607779e1fef99151..9d6d891bbadd2bafe01892278c72ffc2f1d09738 100644 (file)
@@ -30,6 +30,7 @@
 #include <QCursor>
 #include <QApplication>
 #include <QMessageBox>
+#include <QSignalMapper>
 
 // vtk
 #include <vtkImageClip.h>
 ADD_TOOL(vvToolCropImage);
 //------------------------------------------------------------------------------
 
-
+//same order of int* returned by VtkImageData::WholeExtent
+enum sliderId {xmin, xmax, ymin, ymax, zmin, zmax, tmin, tmax};
 //------------------------------------------------------------------------------
 vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f):
   vvToolWidgetBase(parent, f),
   vvToolBase<vvToolCropImage>(parent),
-  Ui::vvToolCropImage()
+  Ui::vvToolCropImage(),mSliders(8)
 {
 
   // GUI Initialization
   Ui_vvToolCropImage::setupUi(mToolWidget);
-  // mTLabel2->setHidden(false);
-  // tminSlider->setHidden(false);
-  // tmaxSlider->setHidden(false);
-  // spin_tmin->setHidden(false);
-  // spin_tmax->setHidden(false);
-  // mLabelTimeCropping->setHidden(false);
   mTLabel1->setHidden(true);
   mTLabel2->setHidden(true);
   tminSlider->setHidden(true);
@@ -69,6 +65,19 @@ vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f):
 
   // Set how many inputs are needed for this tool
   AddInputSelector("Select one image");
+  
+  mSliders[xmin]=xminSlider;
+  mSliders[xmax]=xmaxSlider;
+  mSliders[ymin]=yminSlider;
+  mSliders[ymax]=ymaxSlider;
+  mSliders[zmin]=zminSlider;
+  mSliders[zmax]=zmaxSlider;
+  mSliders[tmin]=tminSlider;
+  mSliders[tmax]=tmaxSlider;
+  
+  // Record initial extend
+  mReducedExtent = new int[6];
+  mInitialExtent = new int[6];
 }
 //------------------------------------------------------------------------------
 
@@ -76,7 +85,8 @@ vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f):
 //------------------------------------------------------------------------------
 vvToolCropImage::~vvToolCropImage()
 {
-
+  delete [] mReducedExtent;
+  delete [] mInitialExtent;
 }
 //------------------------------------------------------------------------------
 
@@ -84,12 +94,14 @@ vvToolCropImage::~vvToolCropImage()
 //------------------------------------------------------------------------------
 void vvToolCropImage::closeEvent(QCloseEvent *event)
 {
-  // Reset extends
-  for(int i=0; i<mExtentSize; i++) mReducedExtent[i] = mInitialExtent[i];
   if(mCurrentSlicerManager){
+//     Reset extends
+    for(int i=0; i<mExtentSize; i++){
+      mReducedExtent[i] = mInitialExtent[i];
+    }
     UpdateExtent();
   }
-  event->accept();
+  vvToolWidgetBase::closeEvent(event);
 }
 //------------------------------------------------------------------------------
 
@@ -113,78 +125,15 @@ void vvToolCropImage::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)
+void vvToolCropImage::sliderValueChanged(int dim)
 {
-  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();
+  int dimMin = dim;
+  if(dim%2==0){//case we are minimum
+    mSliders[dim+1]->setMinimum(mSliders[dim]->value());
+  }else {
+    mSliders[--dimMin]->setMaximum(mSliders[dim]->value());
+  }
+  mReducedExtent[dim] = mSliders[dim]->value() + mInitialExtent[dimMin];
   UpdateExtent();
 }
 //------------------------------------------------------------------------------
@@ -205,7 +154,6 @@ void vvToolCropImage::UpdateExtent()
 //------------------------------------------------------------------------------
 void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer)
 {
-
   // Change interface according to number of dimension
   mExtentSize = 2*slicer->GetDimension();
    if (slicer->GetDimension()<4) {
@@ -226,37 +174,23 @@ void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer)
     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<mExtentSize; i++) mInitialExtent[i] = mReducedExtent[i];
+  int *a = mCurrentImage->GetFirstVTKImageData()->GetWholeExtent();
+  for(int i=0; i<6; i++){
+    mInitialExtent[i] = a[i];
+    mReducedExtent[i] = a[i];
+  }
   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
     mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true);
+    mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mInitialExtent);
   }
 
-  // Set initial sliders values
+//   Set initial sliders values
   std::vector<int> 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);
+  for(int dim=0; dim<slicer->GetDimension() && dim<3; ++dim){
+    mSliders[dim*2]->setMaximum(imsize[dim]-1);
+    mSliders[dim*2+1]->setMaximum(imsize[dim]-1);
+    mSliders[dim*2+1]->setValue(imsize[dim]-1);
   }
-
   spin_xmin->setMaximum(imsize[0]-1);
   spin_xmax->setMaximum(imsize[0]-1);
   spin_xmax->setValue(imsize[0]-1);
@@ -277,20 +211,12 @@ void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer)
     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(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateExtent()));
-  //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateExtent()));
-
-  //  connect(mIntensitySlider, SIGNAL(valueChanged(double)), this, SLOT(autoCropValueChanged(double)));
+  QSignalMapper* signalMapper = new QSignalMapper(this);
+  connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(sliderValueChanged(int)));
+  for(unsigned int i=0; i<mSliders.size(); ++i){
+    signalMapper->setMapping(mSliders[i], i);
+    connect(mSliders[i], SIGNAL(valueChanged(int)), signalMapper, SLOT(map()));
+  }
   UpdateExtent();
 }
 //------------------------------------------------------------------------------
@@ -320,30 +246,22 @@ void vvToolCropImage::apply()
   int n = mCurrentSlicerManager->GetDimension()*2;  // 2D and 3D only
   mArgsInfo.boundingBox_given = n;
   mArgsInfo.boundingBox_arg = new int[n];
-  mArgsInfo.boundingBox_arg[0] = xminSlider->value();
-  mArgsInfo.boundingBox_arg[1] = xmaxSlider->value();
-  mArgsInfo.boundingBox_arg[2] = yminSlider->value();
-  mArgsInfo.boundingBox_arg[3] = ymaxSlider->value();
-  if (n>3) { // 3D
-    mArgsInfo.boundingBox_arg[4] = zminSlider->value();
-    mArgsInfo.boundingBox_arg[5] = zmaxSlider->value();
+  
+  for(int dim=0; dim<mCurrentSlicerManager->GetDimension() && dim<3; ++dim){
+    mArgsInfo.boundingBox_arg[dim*2] = mSliders[dim*2]->value();
+    mArgsInfo.boundingBox_arg[dim*2+1] = mSliders[dim*2+1]->value();
   }
-
   if (n>6) { // 4D
-    // mArgsInfo.boundingBox_arg[6] = tminSlider->value();
-    // mArgsInfo.boundingBox_arg[7] = tmaxSlider->value();
     mArgsInfo.boundingBox_arg[6] = 0;
     mArgsInfo.boundingBox_arg[7] = mCurrentImage->GetSize()[3]-1;
   }
-
   // We MUST reset initial extend to input image before using the
   // filter to retrieve the correct image size
   for(int i=0; i<mExtentSize; i++) {
     mReducedExtent[i] = mInitialExtent[i];
-    // DD(mArgsInfo.boundingBox_arg[i]);
   }
+  
   UpdateExtent();
-
   // Main filter
   CropFilterType::Pointer filter = CropFilterType::New();
   filter->SetInputVVImage(mCurrentImage);
@@ -358,48 +276,14 @@ void vvToolCropImage::apply()
     QApplication::restoreOverrideCursor();
     close();
   }
-
+  std::ostringstream croppedImageName;
+  croppedImageName << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
   // Retrieve result and display it
   vvImage::Pointer output = filter->GetOutputVVImage();
-  std::ostringstream osstream;
-  osstream << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
-  AddImage(output,osstream.str());
-
+  AddImage(output,croppedImageName.str());
   // End
   QApplication::restoreOverrideCursor();
   close();
-
-  /** 
-      // OLD approach with VTK
-
-  QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
-  vvImage::Pointer mResult=vvImage::New();
-  vvImage::Pointer image= mCurrentSlicerManager->GetImage();
-  for (std::vector<vtkImageData*>::const_iterator i=image->GetVTKImages().begin();
-       i!=image->GetVTKImages().end(); i++) {
-    vtkSmartPointer<vtkImageClip> filter=vtkSmartPointer<vtkImageClip>::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<vtkImageTranslateExtent> translate=vtkSmartPointer<vtkImageTranslateExtent>::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();
-
-  **/
 }
 //------------------------------------------------------------------------------
 
index 76e5b6f5e58e613d5caba160edc52c3b5c445798..27a334c3de83c5b7d4e3db96bc0abeda7261b182 100644 (file)
@@ -21,7 +21,7 @@
 //qt
 #include <QtDesigner/QDesignerExportWidget>
 #include <QDialog>
-
+#include <QSlider>
 // vv
 #include "vvToolBase.h"
 #include "vvToolWidgetBase.h"
@@ -45,15 +45,9 @@ public slots:
   virtual void apply();
   virtual bool close();
   virtual void reject();
-  void sliderXMinValueChanged(int s);
-  void sliderXMaxValueChanged(int s);
-  void sliderYMinValueChanged(int s);
-  void sliderYMaxValueChanged(int s);
-  void sliderZMinValueChanged(int s);
-  void sliderZMaxValueChanged(int s);
-  void sliderTMinValueChanged(int s);
-  void sliderTMaxValueChanged(int s);
   void autoCropValueChanged(double v);
+  void sliderValueChanged(int id);
+
 
   //-----------------------------------------------------
   static void Initialize() {
@@ -71,6 +65,7 @@ public slots:
   void UpdateExtent();
   virtual void closeEvent(QCloseEvent *event);
 
+  std::vector<QSlider*> mSliders;
 }; // end class vvToolCropImage
 //------------------------------------------------------------------------------