]> Creatis software - clitk.git/commitdiff
Merge branch 'master' of git://git.creatis.insa-lyon.fr/clitk
authorBenoît Presles <benoit.presles@netcourrier.com>
Tue, 23 Oct 2012 17:02:58 +0000 (19:02 +0200)
committerBenoît Presles <benoit.presles@netcourrier.com>
Tue, 23 Oct 2012 17:02:58 +0000 (19:02 +0200)
116 files changed:
cmake/FindGengetopt.cmake
segmentation/clitkExtractLungFilter.txx
superbuild/CMakeLists.txt [new file with mode: 0644]
tools/clitkWriteDicomSeries.ggo
tools/clitkWriteDicomSeriesGenericFilter.txx
utilities/gengetopt/CMakeLists.txt [moved from cmake/gengetopt/CMakeLists.txt with 100% similarity]
utilities/gengetopt/Makefile.am [moved from cmake/gengetopt/Makefile.am with 100% similarity]
utilities/gengetopt/acceptedvalues.cpp [moved from cmake/gengetopt/acceptedvalues.cpp with 100% similarity]
utilities/gengetopt/acceptedvalues.h [moved from cmake/gengetopt/acceptedvalues.h with 100% similarity]
utilities/gengetopt/argsdef.c [moved from cmake/gengetopt/argsdef.c with 100% similarity]
utilities/gengetopt/argsdef.h [moved from cmake/gengetopt/argsdef.h with 100% similarity]
utilities/gengetopt/cmdline.c [moved from cmake/gengetopt/cmdline.c with 100% similarity]
utilities/gengetopt/cmdline.ggo [moved from cmake/gengetopt/cmdline.ggo with 100% similarity]
utilities/gengetopt/cmdline.h [moved from cmake/gengetopt/cmdline.h with 100% similarity]
utilities/gengetopt/errorcodes.h [moved from cmake/gengetopt/errorcodes.h with 100% similarity]
utilities/gengetopt/fileutils.cpp [moved from cmake/gengetopt/fileutils.cpp with 100% similarity]
utilities/gengetopt/fileutils.h [moved from cmake/gengetopt/fileutils.h with 100% similarity]
utilities/gengetopt/gengetopt.cc [moved from cmake/gengetopt/gengetopt.cc with 100% similarity]
utilities/gengetopt/gengetopt.h [moved from cmake/gengetopt/gengetopt.h with 100% similarity]
utilities/gengetopt/getopt.c [moved from cmake/gengetopt/getopt.c with 100% similarity]
utilities/gengetopt/getopt.h [moved from cmake/gengetopt/getopt.h with 100% similarity]
utilities/gengetopt/getopt1.c [moved from cmake/gengetopt/getopt1.c with 100% similarity]
utilities/gengetopt/ggo_options.h [moved from cmake/gengetopt/ggo_options.h with 100% similarity]
utilities/gengetopt/ggos.cpp [moved from cmake/gengetopt/ggos.cpp with 100% similarity]
utilities/gengetopt/ggos.h [moved from cmake/gengetopt/ggos.h with 100% similarity]
utilities/gengetopt/global_opts.h [moved from cmake/gengetopt/global_opts.h with 100% similarity]
utilities/gengetopt/globals.cpp [moved from cmake/gengetopt/globals.cpp with 100% similarity]
utilities/gengetopt/globals.h [moved from cmake/gengetopt/globals.h with 100% similarity]
utilities/gengetopt/gm.cc [moved from cmake/gengetopt/gm.cc with 100% similarity]
utilities/gengetopt/gm.h [moved from cmake/gengetopt/gm.h with 100% similarity]
utilities/gengetopt/gm_utils.cpp [moved from cmake/gengetopt/gm_utils.cpp with 100% similarity]
utilities/gengetopt/gm_utils.h [moved from cmake/gengetopt/gm_utils.h with 100% similarity]
utilities/gengetopt/groups.h [moved from cmake/gengetopt/groups.h with 100% similarity]
utilities/gengetopt/my_map.h [moved from cmake/gengetopt/my_map.h with 100% similarity]
utilities/gengetopt/my_sstream.h [moved from cmake/gengetopt/my_sstream.h with 100% similarity]
utilities/gengetopt/my_string.h [moved from cmake/gengetopt/my_string.h with 100% similarity]
utilities/gengetopt/parser.cc [moved from cmake/gengetopt/parser.cc with 100% similarity]
utilities/gengetopt/parser.h [moved from cmake/gengetopt/parser.h with 100% similarity]
utilities/gengetopt/parser.yy [moved from cmake/gengetopt/parser.yy with 100% similarity]
utilities/gengetopt/scanner.cc [moved from cmake/gengetopt/scanner.cc with 100% similarity]
utilities/gengetopt/skels/Makefile.am [moved from cmake/gengetopt/skels/Makefile.am with 100% similarity]
utilities/gengetopt/skels/c_source.cc [moved from cmake/gengetopt/skels/c_source.cc with 100% similarity]
utilities/gengetopt/skels/c_source.h [moved from cmake/gengetopt/skels/c_source.h with 100% similarity]
utilities/gengetopt/skels/check_modes.cc [moved from cmake/gengetopt/skels/check_modes.cc with 100% similarity]
utilities/gengetopt/skels/check_modes.h [moved from cmake/gengetopt/skels/check_modes.h with 100% similarity]
utilities/gengetopt/skels/clear_arg.cc [moved from cmake/gengetopt/skels/clear_arg.cc with 100% similarity]
utilities/gengetopt/skels/clear_arg.h [moved from cmake/gengetopt/skels/clear_arg.h with 100% similarity]
utilities/gengetopt/skels/clear_given.cc [moved from cmake/gengetopt/skels/clear_given.cc with 100% similarity]
utilities/gengetopt/skels/clear_given.h [moved from cmake/gengetopt/skels/clear_given.h with 100% similarity]
utilities/gengetopt/skels/copyright.cc [moved from cmake/gengetopt/skels/copyright.cc with 100% similarity]
utilities/gengetopt/skels/copyright.h [moved from cmake/gengetopt/skels/copyright.h with 100% similarity]
utilities/gengetopt/skels/custom_getopt_gen.cc [moved from cmake/gengetopt/skels/custom_getopt_gen.cc with 100% similarity]
utilities/gengetopt/skels/custom_getopt_gen.h [moved from cmake/gengetopt/skels/custom_getopt_gen.h with 100% similarity]
utilities/gengetopt/skels/dependant_option.cc [moved from cmake/gengetopt/skels/dependant_option.cc with 100% similarity]
utilities/gengetopt/skels/dependant_option.h [moved from cmake/gengetopt/skels/dependant_option.h with 100% similarity]
utilities/gengetopt/skels/enum_decl.cc [moved from cmake/gengetopt/skels/enum_decl.cc with 100% similarity]
utilities/gengetopt/skels/enum_decl.h [moved from cmake/gengetopt/skels/enum_decl.h with 100% similarity]
utilities/gengetopt/skels/exit_failure.cc [moved from cmake/gengetopt/skels/exit_failure.cc with 100% similarity]
utilities/gengetopt/skels/exit_failure.h [moved from cmake/gengetopt/skels/exit_failure.h with 100% similarity]
utilities/gengetopt/skels/file_save.cc [moved from cmake/gengetopt/skels/file_save.cc with 100% similarity]
utilities/gengetopt/skels/file_save.h [moved from cmake/gengetopt/skels/file_save.h with 100% similarity]
utilities/gengetopt/skels/file_save_multiple.cc [moved from cmake/gengetopt/skels/file_save_multiple.cc with 100% similarity]
utilities/gengetopt/skels/file_save_multiple.h [moved from cmake/gengetopt/skels/file_save_multiple.h with 100% similarity]
utilities/gengetopt/skels/free_list.cc [moved from cmake/gengetopt/skels/free_list.cc with 100% similarity]
utilities/gengetopt/skels/free_list.h [moved from cmake/gengetopt/skels/free_list.h with 100% similarity]
utilities/gengetopt/skels/free_multiple.cc [moved from cmake/gengetopt/skels/free_multiple.cc with 100% similarity]
utilities/gengetopt/skels/free_multiple.h [moved from cmake/gengetopt/skels/free_multiple.h with 100% similarity]
utilities/gengetopt/skels/free_string.cc [moved from cmake/gengetopt/skels/free_string.cc with 100% similarity]
utilities/gengetopt/skels/free_string.h [moved from cmake/gengetopt/skels/free_string.h with 100% similarity]
utilities/gengetopt/skels/generic_option.cc [moved from cmake/gengetopt/skels/generic_option.cc with 100% similarity]
utilities/gengetopt/skels/generic_option.h [moved from cmake/gengetopt/skels/generic_option.h with 100% similarity]
utilities/gengetopt/skels/given_field.cc [moved from cmake/gengetopt/skels/given_field.cc with 100% similarity]
utilities/gengetopt/skels/given_field.h [moved from cmake/gengetopt/skels/given_field.h with 100% similarity]
utilities/gengetopt/skels/group_counter.cc [moved from cmake/gengetopt/skels/group_counter.cc with 100% similarity]
utilities/gengetopt/skels/group_counter.h [moved from cmake/gengetopt/skels/group_counter.h with 100% similarity]
utilities/gengetopt/skels/group_option.cc [moved from cmake/gengetopt/skels/group_option.cc with 100% similarity]
utilities/gengetopt/skels/group_option.h [moved from cmake/gengetopt/skels/group_option.h with 100% similarity]
utilities/gengetopt/skels/handle_help.cc [moved from cmake/gengetopt/skels/handle_help.cc with 100% similarity]
utilities/gengetopt/skels/handle_help.h [moved from cmake/gengetopt/skels/handle_help.h with 100% similarity]
utilities/gengetopt/skels/handle_version.cc [moved from cmake/gengetopt/skels/handle_version.cc with 100% similarity]
utilities/gengetopt/skels/handle_version.h [moved from cmake/gengetopt/skels/handle_version.h with 100% similarity]
utilities/gengetopt/skels/header.cc [moved from cmake/gengetopt/skels/header.cc with 100% similarity]
utilities/gengetopt/skels/header.h [moved from cmake/gengetopt/skels/header.h with 100% similarity]
utilities/gengetopt/skels/init_args_info.cc [moved from cmake/gengetopt/skels/init_args_info.cc with 100% similarity]
utilities/gengetopt/skels/init_args_info.h [moved from cmake/gengetopt/skels/init_args_info.h with 100% similarity]
utilities/gengetopt/skels/multiple_fill_array.cc [moved from cmake/gengetopt/skels/multiple_fill_array.cc with 100% similarity]
utilities/gengetopt/skels/multiple_fill_array.h [moved from cmake/gengetopt/skels/multiple_fill_array.h with 100% similarity]
utilities/gengetopt/skels/multiple_opt_list.cc [moved from cmake/gengetopt/skels/multiple_opt_list.cc with 100% similarity]
utilities/gengetopt/skels/multiple_opt_list.h [moved from cmake/gengetopt/skels/multiple_opt_list.h with 100% similarity]
utilities/gengetopt/skels/option_arg.cc [moved from cmake/gengetopt/skels/option_arg.cc with 100% similarity]
utilities/gengetopt/skels/option_arg.h [moved from cmake/gengetopt/skels/option_arg.h with 100% similarity]
utilities/gengetopt/skels/print_help_string.cc [moved from cmake/gengetopt/skels/print_help_string.cc with 100% similarity]
utilities/gengetopt/skels/print_help_string.h [moved from cmake/gengetopt/skels/print_help_string.h with 100% similarity]
utilities/gengetopt/skels/required_option.cc [moved from cmake/gengetopt/skels/required_option.cc with 100% similarity]
utilities/gengetopt/skels/required_option.h [moved from cmake/gengetopt/skels/required_option.h with 100% similarity]
utilities/gengetopt/skels/reset_group.cc [moved from cmake/gengetopt/skels/reset_group.cc with 100% similarity]
utilities/gengetopt/skels/reset_group.h [moved from cmake/gengetopt/skels/reset_group.h with 100% similarity]
utilities/gengetopt/skels/update_given.cc [moved from cmake/gengetopt/skels/update_given.cc with 100% similarity]
utilities/gengetopt/skels/update_given.h [moved from cmake/gengetopt/skels/update_given.h with 100% similarity]
utilities/gengetopt/yyerror.cc [moved from cmake/gengetopt/yyerror.cc with 100% similarity]
utilities/gengetopt/yyerror.h [moved from cmake/gengetopt/yyerror.h with 100% similarity]
utilities/gengetopt/yywrap.c [moved from cmake/gengetopt/yywrap.c with 100% similarity]
vv/CMakeLists.txt
vv/vv.cxx
vv/vvInteractorStyleNavigator.cxx
vv/vvLinkPanel.cxx
vv/vvLinkPanel.h
vv/vvMainWindow.cxx
vv/vvMainWindow.h
vv/vvReadState.cxx
vv/vvReadState.h
vv/vvSaveState.cxx
vv/vvSaveState.h
vv/vvSlicer.cxx
vv/vvSlicerManager.cxx
vv/vvSlicerManager.h

index 77665420bac997f7b3cf40031890c18912b161bb..95f2a474897059f2a7248f1b80267c053b84c268 100644 (file)
@@ -3,7 +3,7 @@
 FIND_PROGRAM(GENGETOPT gengetopt)
 IF (GENGETOPT STREQUAL "GENGETOPT-NOTFOUND")
   GET_FILENAME_COMPONENT(CLITK_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
-  ADD_SUBDIRECTORY(${CLITK_CMAKE_DIR}/gengetopt ${CMAKE_CURRENT_BINARY_DIR}/gengetopt)
+  ADD_SUBDIRECTORY(${CLITK_CMAKE_DIR}/../utilities/gengetopt ${CMAKE_CURRENT_BINARY_DIR}/gengetopt)
 ELSE(GENGETOPT STREQUAL "GENGETOPT-NOTFOUND")
   ADD_EXECUTABLE(gengetopt IMPORTED)
   SET_PROPERTY(TARGET gengetopt PROPERTY IMPORTED_LOCATION ${GENGETOPT})
@@ -32,4 +32,11 @@ MACRO (WRAP_GGO GGO_SRCS)
     INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
   ENDFOREACH(GGO_FILE)
   SET_SOURCE_FILES_PROPERTIES(${${GGO_SRCS}} PROPERTIES GENERATED TRUE)
+  IF(CMAKE_COMPILER_IS_GNUCXX)
+    FIND_PROGRAM(DEFAULT_GCC gcc)
+    EXEC_PROGRAM(${DEFAULT_GCC} ARGS "-dumpversion" OUTPUT_VARIABLE GCCVER)
+    IF("${GCCVER}" VERSION_GREATER "4.5.2")
+      SET_SOURCE_FILES_PROPERTIES(${${GGO_SRCS}} PROPERTIES COMPILE_FLAGS "-Wno-unused-but-set-variable")
+    ENDIF("${GCCVER}" VERSION_GREATER "4.5.2")
+  ENDIF(CMAKE_COMPILER_IS_GNUCXX)
 ENDMACRO (WRAP_GGO)
index 8dcdb5b04dffcffa4118269abee862c31742b53a..ffca1df50276062599cbcd22e76666cc25ce9a07 100644 (file)
@@ -812,7 +812,7 @@ TracheaRegionGrowing()
   f->SetUpper(GetUpperThresholdForTrachea());
   f->SetMinimumLowerThreshold(-2000);
   //  f->SetMaximumUpperThreshold(0); // MAYBE TO CHANGE ???
-  f->SetMaximumUpperThreshold(-700); // MAYBE TO CHANGE ???
+  f->SetMaximumUpperThreshold(-300); // MAYBE TO CHANGE ???
   f->SetAdaptLowerBorder(false);
   f->SetAdaptUpperBorder(true);
   f->SetMinimumSize(5000); 
diff --git a/superbuild/CMakeLists.txt b/superbuild/CMakeLists.txt
new file mode 100644 (file)
index 0000000..08e85ed
--- /dev/null
@@ -0,0 +1,175 @@
+cmake_minimum_required(VERSION 2.8)
+cmake_policy(VERSION 2.8)
+
+# set a default build type if it is undefined, then make sure it goes in the cache
+if(NOT CMAKE_BUILD_TYPE)
+  set(CMAKE_BUILD_TYPE Release)
+endif()
+set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Build configuration type" FORCE)
+set(build_type ${CMAKE_BUILD_TYPE})
+
+#=========================================================
+MACRO (DD in)
+    MESSAGE(${in}=${${in}})
+ENDMACRO(DD)
+#=========================================================
+
+project(SuperBuild_VV)
+
+if(MSVC)
+  set(CMAKE_C_FLAGS_DEBUG          "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1" CACHE STRING "" FORCE)
+  set(CMAKE_C_FLAGS_MINSIZEREL     "/MT /O1 /Ob1 /D NDEBUG" CACHE STRING "" FORCE)
+  set(CMAKE_C_FLAGS_RELEASE        "/MT /O2 /Ob2 /D NDEBUG" CACHE STRING "" FORCE)
+  set(CMAKE_C_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG" CACHE STRING "" FORCE)
+
+  set(CMAKE_CXX_FLAGS_DEBUG          "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1" CACHE STRING "" FORCE)
+  set(CMAKE_CXX_FLAGS_MINSIZEREL     "/MT /O1 /Ob1 /D NDEBUG" CACHE STRING "" FORCE)
+  set(CMAKE_CXX_FLAGS_RELEASE        "/MT /O2 /Ob2 /D NDEBUG" CACHE STRING "" FORCE)
+  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG" CACHE STRING "" FORCE)
+endif(MSVC)
+
+include(ExternalProject)
+
+set(base "${CMAKE_BINARY_DIR}")
+set_property(DIRECTORY PROPERTY EP_BASE ${base})
+set(source_prefix ${base}/Source)
+set(build_prefix ${base}/Build)
+set(install_prefix ${base}/Install)
+
+find_package(Git REQUIRED)
+
+#=========================================================
+# QT
+SET(QtWinSpecFiles "${source_prefix}/qt/mkspecs/win32-msvc2003/qmake.conf";
+                   "${source_prefix}/qt/mkspecs/win32-msvc2005/qmake.conf";
+                   "${source_prefix}/qt/mkspecs/win32-msvc2008/qmake.conf";
+                   "${source_prefix}/qt/mkspecs/win32-msvc2010/qmake.conf")
+ExternalProject_Add(
+  QT
+  SOURCE_DIR ${source_prefix}/qt
+  GIT_REPOSITORY git://gitorious.org/qt/qt.git
+  GIT_TAG v4.8.3
+  PATCH_COMMAND sed -i "s/\\-MD/-MT/g" ${QtWinSpecFiles}
+  CONFIGURE_COMMAND ${source_prefix}/qt/configure -confirm-license
+                                                  -static 
+                                                  -fast
+                                                  -opensource
+                                                  -release
+                                                  -prefix ${build_prefix}/QT
+                                                  -nomake examples
+                                                  -nomake demos
+                                                  -qt-libpng
+                                                  -no-libtiff
+                                                  -no-libjpeg
+                                                  -no-libmng
+  INSTALL_COMMAND ""
+)
+SET(qmake_executable "${build_prefix}/QT/bin/qmake")
+#=========================================================
+
+#=========================================================
+# VTK
+SET(VTK_CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}")
+IF(MSVC)
+  SET(VTK_CMAKE_CXX_STANDARD_LIBRARIES "${VTK_CMAKE_CXX_STANDARD_LIBRARIES} Imm32.lib Winmm.lib Ws2_32.lib")
+ENDIF(MSVC)
+ExternalProject_Add(
+  VTK 
+  DEPENDS QT
+  SOURCE_DIR ${source_prefix}/vtk
+  GIT_REPOSITORY git://vtk.org/VTK.git
+  GIT_TAG v5.10.0
+  INSTALL_COMMAND ""
+  CMAKE_ARGS
+    -DQT_QMAKE_EXECUTABLE:FILEPATH=${qmake_executable}
+    -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG}
+    -DCMAKE_C_FLAGS_MINSIZEREL:STRING=${CMAKE_C_FLAGS_MINSIZEREL}
+    -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE}
+    -DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING=${CMAKE_C_FLAGS_RELWITHDEBINFO}
+    -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG}
+    -DCMAKE_CXX_FLAGS_MINSIZEREL:STRING=${CMAKE_CXX_FLAGS_MINSIZEREL}
+    -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE}
+    -DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
+    -DCMAKE_INSTALL_PREFIX:PATH=${install_prefix}/${proj}
+    -DCMAKE_BUILD_TYPE:STRING=${build_type}
+    -DBUILD_SHARED_LIBS:BOOL=OFF
+    -DBUILD_EXAMPLES:BOOL=OFF
+    -DBUILD_TESTING:BOOL=OFF
+    -DVTK_USE_QT:BOOL=ON
+    -DVTK_USE_QVTK_QTOPENGL:BOOL=ON
+    -DCMAKE_CXX_STANDARD_LIBRARIES:STRING=${VTK_CMAKE_CXX_STANDARD_LIBRARIES}
+)
+SET(VTK_DIR ${build_prefix}/VTK)
+#=========================================================
+
+#=========================================================
+# ITK
+ExternalProject_Add(
+  ITK
+  SOURCE_DIR ${source_prefix}/itk
+  GIT_REPOSITORY git://itk.org/ITK.git
+  GIT_TAG v4.2.0
+  INSTALL_COMMAND ""
+  CMAKE_ARGS
+    -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG}
+    -DCMAKE_C_FLAGS_MINSIZEREL:STRING=${CMAKE_C_FLAGS_MINSIZEREL}
+    -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE}
+    -DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING=${CMAKE_C_FLAGS_RELWITHDEBINFO}
+    -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG}
+    -DCMAKE_CXX_FLAGS_MINSIZEREL:STRING=${CMAKE_CXX_FLAGS_MINSIZEREL}
+    -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE}
+    -DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
+    -DCMAKE_INSTALL_PREFIX:PATH=${install_prefix}/${proj}
+    -DCMAKE_BUILD_TYPE:STRING=${build_type}
+    -DBUILD_SHARED_LIBS:BOOL=OFF
+    -DBUILD_EXAMPLES:BOOL=OFF
+    -DBUILD_TESTING:BOOL=OFF
+)
+SET(ITK_DIR ${build_prefix}/ITK)
+#=========================================================
+
+#=========================================================
+# VV
+SET(VV_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+if(MSVC)
+  SET(VV_CMAKE_CXX_FLAGS "${VV_CMAKE_CXX_FLAGS} /bigobj")
+endif(MSVC)
+
+SET(VV_CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS})
+if(CMAKE_COMPILER_IS_GNUCXX)
+  SET(VV_CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
+endif(CMAKE_COMPILER_IS_GNUCXX)
+
+SET(MAKE_COMMAND "make")
+if(MSVC)
+  SET(MAKE_COMMAND "nmake")
+endif(MSVC)
+
+ExternalProject_Add(
+  VV
+  DEPENDS QT VTK ITK
+  SOURCE_DIR ${source_prefix}/vv
+  GIT_REPOSITORY git://git.creatis.insa-lyon.fr/clitk
+  GIT_TAG v1.3.0
+  INSTALL_COMMAND ${MAKE_COMMAND} package
+  CMAKE_ARGS
+    -DQT_QMAKE_EXECUTABLE:FILEPATH=${qmake_executable}
+    -DITK_DIR:PATH=${ITK_DIR}
+    -DVTK_DIR:PATH=${VTK_DIR}
+    -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG}
+    -DCMAKE_C_FLAGS_MINSIZEREL:STRING=${CMAKE_C_FLAGS_MINSIZEREL}
+    -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE}
+    -DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING=${CMAKE_C_FLAGS_RELWITHDEBINFO}
+    -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG}
+    -DCMAKE_CXX_FLAGS_MINSIZEREL:STRING=${CMAKE_CXX_FLAGS_MINSIZEREL}
+    -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE}
+    -DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
+    -DCMAKE_CXX_FLAGS:STRING=${VV_CMAKE_CXX_FLAGS}
+    -DCMAKE_EXE_LINKER_FLAGS:STRING=${VV_CMAKE_EXE_LINKER_FLAGS}
+    -DCMAKE_INSTALL_PREFIX:PATH=${install_prefix}/${proj}
+    -DCMAKE_BUILD_TYPE:STRING=${build_type}
+    -DBUILD_SHARED_LIBS:BOOL=OFF
+    -DBUILD_TESTING:BOOL=OFF
+)
+#=========================================================
+
index f6bccde1ad9563bda2d9a10d8a75896928d44dbb..faa08cb44492dad8574303acf3f5d89bcc40a08f 100644 (file)
@@ -11,4 +11,6 @@ option "inputDir"     d       "Input dicom directory"           string        yes
 option "outputDir"     o       "Output dicom directory"          string        yes 
 option "key"           k       "Keys of tags to modify"          string        no multiple default="0008|103e"
 option "tag"           t       "Tags values"                    string         no multiple default="MIDPOSITION"
-option "useSizeAsReference"            s       "Use the size of the dicom image as reference for an occasional resampling"     flag    off
\ No newline at end of file
+option "newSeriesUID"          e       "Write the series with a new series UID (ignored if given in key/tag option)"   flag    off
+option "newStudyUID"           u       "Write the series with a new study UID (ignored if given in key/tag option; forces newSeriesUID = true)"        flag    off
+option "useSizeAsReference"            s       "Use the size of the dicom image as reference for an occasional resampling"     flag    off
index 6f09ba9ea4fb48aef5b3b673b49c955a0dbfac40..480e4969847db27b312e63f59f5b6214ed184fbb 100644 (file)
 
 // clitk
 #include "clitkResampleImageWithOptionsFilter.h"
+#if GDCM_MAJOR_VERSION >= 2
+#include "gdcmUIDGenerator.h"
+#else
+#include "gdcmFile.h"
+#include "gdcmUtil.h"
+#endif
 
 
 namespace clitk
@@ -133,7 +139,7 @@ WriteDicomSeriesGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
   namesGenerator->SetInputDirectory( m_ArgsInfo.inputDir_arg );
   namesGenerator->SetOutputDirectory( m_ArgsInfo.outputDir_arg  );
   typename   ReaderType::FileNamesContainer filenames_in = namesGenerator->GetInputFileNames();
-  typename   ReaderType::FileNamesContainer filenames_out = namesGenerator->GetOutputFileNames();
+  typename   ReaderType::FileNamesContainer filenames_out;
 
   // Output the dicom files
   unsigned int numberOfFilenames =  filenames_in.size();
@@ -235,16 +241,157 @@ WriteDicomSeriesGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
 
   // Get keys
   unsigned int numberOfKeysGiven=m_ArgsInfo.key_given;
+    if (m_ArgsInfo.verbose_flag) 
+      DD(numberOfKeysGiven);
 
+  std::string seriesUID;
+  std::string frameOfReferenceUID;
+  std::string studyUID;
+  
+  // one pass through the keys given on the cmd-line, to check what will be recreated
+  std::string seriesUIDkey = "0020|000e";
+  std::string seriesNumberKey = "0020|0011";
+  std::string seriesDescriptionKey = "0008|103e";
+  std::string frameOfReferenceUIDKey = "0020|0052";
+  std::string studyUIDKey = "0020|000d";
+  std::string studyIDKey = "0020|0010";
+  std::string studyDescriptionKey = "0008|1030";
+  bool seriesUIDGiven = false;
+  bool seriesNumberGiven = false;
+  bool seriesDescriptionGiven = false;
+  bool studyUIDGiven = false;
+  bool studyIDGiven = false;
+  bool studyDescriptionGiven = false;
   for (unsigned int i = 0; i < numberOfKeysGiven; i++) {
-    std::string entryId(m_ArgsInfo.key_arg[i]  );
-    std::string value( m_ArgsInfo.tag_arg[i] );
-    std::cout << entryId << " " << value << std::endl;
-    for(unsigned int fni = 0; fni<numberOfFilenames; fni++)
-      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), entryId, value );
+    std::string entryId( m_ArgsInfo.key_arg[i] );
+    if (m_ArgsInfo.verbose_flag) 
+      DD(entryId);
+    
+    seriesUIDGiven |= (entryId ==  seriesUIDkey || entryId ==  frameOfReferenceUIDKey);
+    seriesNumberGiven |= (entryId == seriesNumberKey);
+    seriesDescriptionGiven |= (entryId == seriesDescriptionKey);
+    studyUIDGiven |= (entryId == studyUIDKey);
+    studyIDGiven |= (entryId == studyIDKey);
+    studyDescriptionGiven |= (entryId == studyDescriptionKey);
+  }
+
+  // force the creation of a new series if a new study was specified
+  if (!studyUIDGiven && m_ArgsInfo.newStudyUID_flag) {
+    m_ArgsInfo.newSeriesUID_flag = true;
+#if GDCM_MAJOR_VERSION >= 2
+    gdcm::UIDGenerator suid;
+    studyUID = suid.Generate();
+#else
+    studyUID = gdcm::Util::CreateUniqueUID( gdcmIO->GetUIDPrefix());
+#endif
+  }
+    
+  if (!seriesUIDGiven && m_ArgsInfo.newSeriesUID_flag) {
+#if GDCM_MAJOR_VERSION >= 2
+    gdcm::UIDGenerator suid;
+    seriesUID = suid.Generate();
+    gdcm::UIDGenerator fuid;
+    frameOfReferenceUID = fuid.Generate();
+#else
+    seriesUID = gdcm::Util::CreateUniqueUID( gdcmIO->GetUIDPrefix());
+    frameOfReferenceUID = gdcm::Util::CreateUniqueUID( gdcmIO->GetUIDPrefix());
+#endif
+  }
+
+  if (m_ArgsInfo.verbose_flag) {
+    DD(seriesUID);
+    DD(frameOfReferenceUID);
+    DD(studyUID);
+  }
+
+  // check if file UIDs will be be preserved
+  bool useInputFileUID = true;
+  if (m_ArgsInfo.newSeriesUID_flag || m_ArgsInfo.newStudyUID_flag || seriesUIDGiven || studyUIDGiven) {
+    useInputFileUID = false;
+  }
+  else {
+#if GDCM_MAJOR_VERSION < 2
+    gdcmIO->SetKeepOriginalUID(true);
+#endif
+    namesGenerator->SetOutputDirectory( m_ArgsInfo.outputDir_arg  );
+    filenames_out = namesGenerator->GetOutputFileNames();
   }
   
+  filenames_out.resize(numberOfFilenames);
+  
+  time_t t;
+  t = time(&t);
+  struct tm* instanceDateTimeTm = localtime(&t);
+  char datetime[16];
+  strftime(datetime, 16, "%Y%m%d", instanceDateTimeTm);
+  std::ostringstream instanceDate;
+  instanceDate << datetime;
+  std::ostringstream instanceTime;
+  strftime(datetime, 16, "%H%M%S", instanceDateTimeTm);
+  instanceTime << datetime;
+  
+  // update output dicom keys/tags
+  for(unsigned int fni = 0; fni<numberOfFilenames; fni++) {
+    for (unsigned int i = 0; i < numberOfKeysGiven; i++) {
+      std::string entryId(m_ArgsInfo.key_arg[i]  );
+      std::string value( m_ArgsInfo.tag_arg[i] );
+
+      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), entryId, value );
+    }
 
+    // series UID
+    if (!seriesUIDGiven) {
+      if (m_ArgsInfo.newSeriesUID_flag) {
+        itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), seriesUIDkey, seriesUID );
+        itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), frameOfReferenceUIDKey, frameOfReferenceUID );
+      }
+    }
+    
+    // study UID
+    if (!studyUIDGiven) {
+      if (m_ArgsInfo.newStudyUID_flag) 
+        itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), studyUIDKey, studyUID );
+    }
+    
+    // study description
+    if (studyUIDGiven || m_ArgsInfo.newStudyUID_flag) {
+      if (!studyIDGiven)
+        itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), studyIDKey,itksys::SystemTools::GetFilenameName( m_ArgsInfo.outputDir_arg ));
+      if (!studyDescriptionGiven)
+        itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), studyDescriptionKey,itksys::SystemTools::GetFilenameName( m_ArgsInfo.outputDir_arg ));
+      
+      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), "0008|0020", instanceDate.str() );
+      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), "0008|0030", instanceTime.str() );
+    }
+    
+    // series description/number
+    if (seriesUIDGiven || m_ArgsInfo.newSeriesUID_flag) {
+      if (!seriesDescriptionGiven)
+        itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), seriesDescriptionKey, itksys::SystemTools::GetFilenameName(m_ArgsInfo.outputDir_arg) );
+      if (!seriesNumberGiven)
+        itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), seriesNumberKey, itksys::SystemTools::GetFilenameName(m_ArgsInfo.outputDir_arg) );
+
+      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), "0008|0012", instanceDate.str() );
+      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), "0008|0013", instanceTime.str() );
+    }
+
+    // file UIDs are recreated for new studies or series
+    if (!useInputFileUID)
+    {
+      std::string fileUID;
+#if GDCM_MAJOR_VERSION >= 2
+      gdcm::UIDGenerator fid;
+      fileUID = fid.Generate();
+#else
+      fileUID = gdcm::Util::CreateUniqueUID( gdcmIO->GetUIDPrefix());
+#endif
+      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), "0008|0018", fileUID );
+      itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), "0002|0003", fileUID );
+      
+      filenames_out[fni] = itksys::SystemTools::CollapseFullPath(fileUID.c_str(), m_ArgsInfo.outputDir_arg) + std::string(".dcm"); 
+    }
+  }
+  
   // Output directory and filenames
   itksys::SystemTools::MakeDirectory( m_ArgsInfo.outputDir_arg ); // create if it doesn't exist
   typedef itk::ImageSeriesWriter<InputImageType, OutputImageType >  SeriesWriterType;
index e280cfc14a52223ca1f9bbca93d11bb0267e08e7..3a12e03553284530d580793a9b541624a0319982 100644 (file)
@@ -253,7 +253,7 @@ ENDIF(UNIX OR APPLE)
 
 IF(WIN32)
   #INCLUDE(InstallRequiredSystemLibraries)
-  INSTALL(FILES ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_BUILD_TYPE}/vv.exe DESTINATION .)
+  INSTALL(FILES ${EXECUTABLE_OUTPUT_PATH}/vv.exe DESTINATION .)
   #INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/icons/ducky.png DESTINATION .)
 ENDIF(WIN32)
 #=========================================================
@@ -267,8 +267,8 @@ SET(CPACK_PACKAGE_VENDOR "Creatis-CLB")
 SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
 SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
 SET(CPACK_PACKAGE_VERSION_MAJOR "1")
-SET(CPACK_PACKAGE_VERSION_MINOR "2")
-SET(CPACK_PACKAGE_VERSION_PATCH "2")
+SET(CPACK_PACKAGE_VERSION_MINOR "3")
+SET(CPACK_PACKAGE_VERSION_PATCH "0")
 SET(CPACK_PACKAGE_INSTALL_DIRECTORY "vv")
 SET(CPACK_STRIP_FILES TRUE)
 
@@ -276,7 +276,7 @@ IF(WIN32)
   # There is a bug in NSI that does not handle full unix paths properly. Make
   # sure there is at least one set of four (4) backlasshes.
   SET(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\icons\\\\ducky.ico")
-  SET(CPACK_NSIS_INSTALLED_ICON_NAME "${CMAKE_BUILD_TYPE}\\\\vv.exe")
+  SET(CPACK_NSIS_INSTALLED_ICON_NAME "vv.exe")
   SET(CPACK_NSIS_DISPLAY_NAME "vv - The 4D slicer")
   SET(CPACK_NSIS_HELP_LINK "http://www.creatis.insa-lyon.fr/rio/vv")
   SET(CPACK_NSIS_URL_INFO_ABOUT "http://www.creatis.insa-lyon.fr/rio")
index 133d9dc9232c8b6fb8888066d034aff7c036bab8..47057e4a0ed335cc3720cec279c5ffcfab6f9c29 100644 (file)
--- a/vv/vv.cxx
+++ b/vv/vv.cxx
@@ -140,13 +140,28 @@ int main( int argc, char** argv )
   int n_image_loaded=0;
   std::string win(""), lev("");
 
+  int first_of_wl_set = -1;
+  bool new_wl_set = false;
        bool link_images = false;
   if (argc >1) {
     for (int i = 1; i < argc; i++) {
       std::string current = argv[i];
-      if (!current.compare(0,2,"--")) { //We are parsing an option
+      if (!current.compare(0,1,"-")) { // && !current.compare(0,2,"--")) { //We are parsing an option
         if (parse_mode == P_SEQUENCE) {//First finish the current sequence
           open_sequence(window, open_mode, parse_mode, sequence_filenames, n_image_loaded);
+        } 
+        else if (parse_mode == P_WINDOW) { // handle negative window values
+          win=current;
+          window.ApplyWindowToSetOfImages(atof(win.c_str()), first_of_wl_set, n_image_loaded-1);
+          parse_mode=P_NORMAL;
+          new_wl_set = false;
+          continue;
+        } else if (parse_mode == P_LEVEL) { // handle negative level values
+          lev=current;
+          window.ApplyLevelToSetOfImages(atof(lev.c_str()), first_of_wl_set, n_image_loaded-1);
+          parse_mode=P_NORMAL;
+          new_wl_set = false;
+          continue;
         }
         if ((current=="--help") || (current=="-h")) {
           std::cout << "vv " << VV_VERSION << ", the 2D, 2D+t, 3D and 3D+t (or 4D) image viewer" << std::endl << std::endl
@@ -154,8 +169,8 @@ int main( int argc, char** argv )
                     << "Open file(s) for visualization." << std::endl << std::endl
                     << "OPTIONS may be:" << std::endl
                     << "--help         \t Print command line help and exit." << std::endl
-                    << "--window number\t Gray scale window width for all images." << std::endl
-                    << "--level number \t Gray scale window level for all images." << std::endl
+                    << "--window number\t Gray scale window width for set of images appearing before in the cmd line (may appear more than once)." << std::endl
+                    << "--level number \t Gray scale window level for set of images appearing before in the cmd line (may appear more than once)." << std::endl
                     << "--linkall      \t Link pan, zoom and spatial position of crosshair in images." << std::endl
                     << "--log          \t Log output messages in vv-log directory." << std::endl
                     << "--state file   \t Read display parameters from file." << std::endl
@@ -168,8 +183,7 @@ int main( int argc, char** argv )
                     //<< "--roi file     \t Overlay binary mask images. Option may be repeated on a single base image." << std::endl
                     << "--contour file \t Overlay DICOM RT-STRUCT contours." << std::endl;
           exit(0);
-        }
-        if (current=="--vf") {
+        } else if (current=="--vf") {
           if (!n_image_loaded) load_image_first_error();
           open_mode = O_VF;
         } else if (current=="--overlay") {
@@ -184,14 +198,18 @@ int main( int argc, char** argv )
         } else if (current == "--sequence") {
           if(open_mode==O_BASE) n_image_loaded++; //count only one for the whole sequence
           parse_mode=P_SEQUENCE;
+          if (!new_wl_set) {
+            new_wl_set = true;
+            first_of_wl_set = n_image_loaded-1;
+          }
         } else if (current == "--window") {
           parse_mode=P_WINDOW;
         } else if (current == "--level") {
           parse_mode=P_LEVEL;
         } else if (current == "--linkall") {
-         link_images = true;
-       }
-       else if (current == "--log") {
+          link_images = true;
+        }
+        else if (current == "--log") {
           std::string log_dir = QDir::tempPath().toStdString() + std::string("/vv-log");
 
           if(itksys::SystemTools::FileExists(log_dir.c_str()) &&
@@ -228,16 +246,24 @@ int main( int argc, char** argv )
         sequence_filenames.push_back(current);
       } else if (parse_mode == P_WINDOW) {
         win=current;
+        window.ApplyWindowToSetOfImages(atof(win.c_str()), first_of_wl_set, n_image_loaded-1);
         parse_mode=P_NORMAL;
+        new_wl_set = false;
       } else if (parse_mode == P_LEVEL) {
         lev=current;
+        window.ApplyLevelToSetOfImages(atof(lev.c_str()), first_of_wl_set, n_image_loaded-1);
         parse_mode=P_NORMAL;
+        new_wl_set = false;
       } else {
         std::vector<std::string> image;
         image.push_back(current);
         if(open_mode==O_BASE) {
           window.LoadImages(image, vvImageReader::IMAGE);
           n_image_loaded++;
+          if (!new_wl_set) {
+            new_wl_set = true;
+            first_of_wl_set = n_image_loaded-1;
+          }
         }
         else if (open_mode==O_VF)
           window.AddField(current.c_str(), n_image_loaded-1);
@@ -255,10 +281,10 @@ int main( int argc, char** argv )
     }
   }
 
-  if(win!="" && lev!="") {
-    window.SetWindowLevel(atof(win.c_str()), atof(lev.c_str()));
-    window.ApplyWindowLevelToAllImages();
-  }
+//   if(win!="" && lev!="") {
+//     window.SetWindowLevel(atof(win.c_str()), atof(lev.c_str()));
+//     window.ApplyWindowLevelToAllImages();
+//   }
 
   if (link_images)
     window.LinkAllImages();
index 712e069672eb324d1f883a2a3e03bcebee8d0214..ac37a8fd22c95442157365a2a03ad3409d662ed1 100644 (file)
@@ -249,7 +249,10 @@ void vvInteractorStyleNavigator::OnLeftButtonDown()
 
   // Redefine this button to handle pick
   this->GrabFocus(this->EventCallbackCommand);
-  if (!this->Interactor->GetShiftKey() && !this->Interactor->GetControlKey()) {
+  if (this->Interactor->GetShiftKey()) {
+    this->OnMiddleButtonDown();
+  }
+  else if (!this->Interactor->GetControlKey()) {
     this->StartPick();
   }
 
@@ -271,6 +274,9 @@ void vvInteractorStyleNavigator::OnLeftButtonUp()
       this->ReleaseFocus();
     }
     break;
+  case VTKIS_PAN:
+    this->OnMiddleButtonUp();
+    break;
   }
 
   // Call parent to handle all other states and perform additional work
index 87f3a0fcae8fc364a7d61b04aec414fe30256a5e..5b890d1057de1c5d55bde8edfdd0a1ead29bd9af 100644 (file)
@@ -152,6 +152,29 @@ void vvLinkPanel::linkAll()
 }
 //------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
+void vvLinkPanel::addLinkFromIds(QString id1, QString id2)
+{
+  int index1 = -1, index2 = -1;
+  size_t s1 = image1Ids.size();
+  size_t s2 = image2Ids.size();
+  for (size_t i = 0; i < s1 && index1 == -1; i++)
+    if (image1Ids[i] == id1.toStdString())
+      index1 = i;
+
+  if (index1 >= 0)
+    image1ComboBox->setCurrentIndex(index1);
+    
+  for (size_t i = 0; i < s2 && index2 == -1; i++)
+    if (image2Ids[i] == id2.toStdString())
+      index2 = i;
+  
+  if (index1 >= 0 && index2 >= 0) {
+    image2ComboBox->setCurrentIndex(index2);
+    addLink();
+  }
+}
+//------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 void vvLinkPanel::addLink()
@@ -182,7 +205,9 @@ void vvLinkPanel::addLink()
     linkTableWidget->setRowHeight(row,17);
 
     emit addLink(image1Ids[image1ComboBox->currentIndex()].c_str(),
-                 image2Ids[image2ComboBox->currentIndex()].c_str());
+                 image2Ids[image2ComboBox->currentIndex()].c_str(),
+                 true
+                );
     UpdateComboBox2(image1ComboBox->currentIndex());
   }
 
index 2302407bdba3c6c062a96f9d9349e018494185ca..c73cde4966b59045c64d9a4fcfbd3327d3374ba4 100644 (file)
@@ -34,6 +34,7 @@ public:
     ~vvLinkPanel() {}
 
     void addImage(std::string name, std::string id);
+    void addLinkFromIds(QString id1, QString id2);
     void removeImage(int i);
     bool isLinkAll();
 
@@ -44,7 +45,7 @@ public slots :
     void linkAll();
 
 signals:
-    void addLink(QString image1,QString image2);
+    void addLink(QString image1,QString image2,bool);
     void removeLink(QString image1,QString image2);
 
 private:
index 1432b16c02ff5e68e1c43e0f28c89f6f6f812051..ddc38fba97e5be92d50da869c7386002f346bec3 100644 (file)
@@ -315,7 +315,7 @@ vvMainWindow::vvMainWindow():vvMainWindowBase()
 
   connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(ShowContextMenu(QPoint)));
 
-  connect(linkPanel,SIGNAL(addLink(QString,QString)),this,SLOT(AddLink(QString,QString)));
+  connect(linkPanel,SIGNAL(addLink(QString,QString,bool)),this,SLOT(AddLink(QString,QString,bool)));
   connect(linkPanel,SIGNAL(removeLink(QString,QString)),this,SLOT(RemoveLink(QString,QString)));
   connect(overlayPanel,SIGNAL(VFPropertyUpdated(int,int,int,int,double,double,double)),this,SLOT(SetVFProperty(int,int,int,int,double,double,double)));
   connect(overlayPanel,SIGNAL(OverlayPropertyUpdated(int,int,double,double)),
@@ -928,7 +928,7 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
         DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
 
         //set the id of the image
-        QString id = files[i].c_str() + QString::number(mSlicerManagers.size()-1);
+        QString id = QDir::current().absoluteFilePath(files[i].c_str()) + QString::number(mSlicerManagers.size()-1);
         item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
         mSlicerManagers.back()->SetId(id.toStdString());
 
@@ -1100,21 +1100,28 @@ void vvMainWindow::ImageInfoChanged()
     //read image header
     int NPixel = 1;
 
+    int tSlice = 0;
     vvImage::Pointer imageSelected;
     if (DataTree->topLevelItem(index) == DataTree->selectedItems()[0]) {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
+      tSlice = mSlicerManagers[index]->GetSlicer(0)->GetTSlice();
     } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "vector") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetVF();
+      tSlice = mSlicerManagers[index]->GetSlicer(0)->GetOverlayTSlice();
     } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "overlay") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetOverlay();
+      tSlice = mSlicerManagers[index]->GetSlicer(0)->GetOverlayTSlice();
     } else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "fusion") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetFusion();
+      tSlice = mSlicerManagers[index]->GetSlicer(0)->GetFusionTSlice();
     }
     else if (DataTree->selectedItems()[0]->data(1,Qt::UserRole).toString() == "contour") {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
+      tSlice = mSlicerManagers[index]->GetSlicer(0)->GetTSlice();
     }
     else {
       imageSelected = mSlicerManagers[index]->GetSlicer(0)->GetImage();
+      tSlice = mSlicerManagers[index]->GetSlicer(0)->GetTSlice();
     }
 
     dimension = imageSelected->GetNumberOfDimensions();
@@ -1142,7 +1149,7 @@ void vvMainWindow::ImageInfoChanged()
     infoPanel->setOrigin(GetVectorDoubleAsString(origin));
     infoPanel->setSpacing(GetVectorDoubleAsString(inputSpacing));
     infoPanel->setNPixel(QString::number(NPixel)+" ("+inputSizeInBytes+")");
-    transformation = imageSelected->GetTransform()[mSlicerManagers[index]->GetTSlice()]->GetMatrix();
+    transformation = imageSelected->GetTransform()[tSlice]->GetMatrix();
     infoPanel->setTransformation(Get4x4MatrixDoubleAsString(transformation));
 
     landmarksPanel->SetCurrentLandmarks(mSlicerManagers[index]->GetLandmarks(),
@@ -1237,25 +1244,70 @@ void vvMainWindow::ShowHelpDialog()
 //------------------------------------------------------------------------------
 void vvMainWindow::ChangeViewMode()
 {
-  QList<int> size;
+  typedef struct _SIZE{
+    QSplitter* splitter;
+    QList<int> size1, size2;
+    int cols[3];
+  }SplitterSize;
+  SplitterSize sizes[4];
+  sizes[0].splitter = OSplitter;
+  sizes[0].size1.push_back(1);
+  sizes[0].size1.push_back(0);
+  sizes[0].size2.push_back(1);
+  sizes[0].size2.push_back(0);
+  sizes[0].cols[0] = 2;
+  sizes[0].cols[1] = 3;
+  sizes[0].cols[2] = 4;
+
+  sizes[1].splitter = ESplitter;
+  sizes[1].size1.push_back(0);
+  sizes[1].size1.push_back(1);
+  sizes[1].size2.push_back(1);
+  sizes[1].size2.push_back(0);
+  sizes[1].cols[0] = 1;
+  sizes[1].cols[1] = 3;
+  sizes[1].cols[2] = 4;
+
+  sizes[2].splitter = OSplitter;
+  sizes[2].size1.push_back(1);
+  sizes[2].size1.push_back(0);
+  sizes[2].size2.push_back(0);
+  sizes[2].size2.push_back(1);
+  sizes[2].cols[0] = 1;
+  sizes[2].cols[1] = 2;
+  sizes[2].cols[2] = 4;
+
+  sizes[3].splitter = ESplitter;
+  sizes[3].size1.push_back(0);
+  sizes[3].size1.push_back(1);
+  sizes[3].size2.push_back(0);
+  sizes[3].size2.push_back(1);
+  sizes[3].cols[0] = 1;
+  sizes[3].cols[1] = 2;
+  sizes[3].cols[2] = 3;
+  
+  int slicer = mSlicerManagers[mCurrentPickedImageIndex]->GetSelectedSlicer();
   if (viewMode == 1) {
-    viewMode = 0;
-    size.push_back(1);
-    size.push_back(0);
-    splitter_3->setSizes(size);
-    OSplitter->setSizes(size);
-    DataTree->setColumnHidden(2,1);
-    DataTree->setColumnHidden(3,1);
-    DataTree->setColumnHidden(4,1);
+    if (slicer >= 0) {
+      viewMode = 0;
+      splitter_3->setSizes(sizes[slicer].size1);
+      sizes[slicer].splitter->setSizes(sizes[slicer].size2);
+      DataTree->setColumnHidden(sizes[slicer].cols[0],1);
+      DataTree->setColumnHidden(sizes[slicer].cols[1],1);
+      DataTree->setColumnHidden(sizes[slicer].cols[2],1);
+    }
   } else {
-    viewMode = 1;
-    size.push_back(1);
-    size.push_back(1);
-    splitter_3->setSizes(size);
-    OSplitter->setSizes(size);
-    DataTree->setColumnHidden(2,0);
-    DataTree->setColumnHidden(3,0);
-    DataTree->setColumnHidden(4,0);
+    QList<int> size;
+    if (slicer >= 0) {
+      viewMode = 1;
+      size.push_back(1);
+      size.push_back(1);
+      splitter_3->setSizes(size);
+      sizes[slicer].splitter->setSizes(size);
+      DataTree->setColumnHidden(sizes[slicer].cols[0],0);
+      DataTree->setColumnHidden(sizes[slicer].cols[1],0);
+      DataTree->setColumnHidden(sizes[slicer].cols[2],0);
+    }
   }
   UpdateRenderWindows();
   /*
@@ -1263,10 +1315,12 @@ void vvMainWindow::ChangeViewMode()
   ** the associated Slicer to redraw crosses.
   */
   for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
-    if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
+//     if (DataTree->topLevelItem(i)->data(COLUMN_UL_VIEW,Qt::CheckStateRole).toInt() > 1)
       mSlicerManagers[i]->GetSlicer(0)->Render();
-    if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
+      mSlicerManagers[i]->GetSlicer(1)->Render();
+//     if (DataTree->topLevelItem(i)->data(COLUMN_DL_VIEW,Qt::CheckStateRole).toInt() > 1)
       mSlicerManagers[i]->GetSlicer(2)->Render();
+      mSlicerManagers[i]->GetSlicer(3)->Render();
   }
 }
 //------------------------------------------------------------------------------
@@ -1494,33 +1548,28 @@ void vvMainWindow::InitDisplay()
 //------------------------------------------------------------------------------
 void vvMainWindow::DisplaySliders(int slicer, int window)
 {
+  if(!mSlicerManagers[slicer]->GetSlicer(window)->GetRenderer()->GetDraw())
+    return;
+
   int range[2];
   mSlicerManagers[slicer]->GetSlicer(window)->GetSliceRange(range);
   int position = mSlicerManagers[slicer]->GetSlicer(window)->GetSlice();
-
-  int tRange[2];
-  tRange[0] = 0;
-  tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
-  int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetMaxCurrentTSlice();
-  bool showHorizontal = false;
-  bool showVertical = false;
   if (range[1]>0)
-    showVertical = true;
-  if (tRange[1]>0)
-    showHorizontal = true;
-
-  if (showVertical)
     verticalSliders[window]->show();
   else
     verticalSliders[window]->hide();
   verticalSliders[window]->setRange(range[0],range[1]);
   verticalSliders[window]->setValue(position);
 
-  if (showHorizontal)
+  int tRange[2];
+  tRange[0] = 0;
+  tRange[1] = mSlicerManagers[slicer]->GetSlicer(window)->GetTMax();
+  if (tRange[1]>0)
     horizontalSliders[window]->show();
   else
     horizontalSliders[window]->hide();
   horizontalSliders[window]->setRange(tRange[0],tRange[1]);
+  int tPosition = mSlicerManagers[slicer]->GetSlicer(window)->GetMaxCurrentTSlice();
   horizontalSliders[window]->setValue(tPosition);
 }
 //------------------------------------------------------------------------------
@@ -1769,6 +1818,32 @@ void vvMainWindow::ApplyWindowLevelToAllImages()
 }
 //------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
+void vvMainWindow::ApplyWindowToSetOfImages(double window, unsigned int indexMin, unsigned int indexMax)
+{
+  for (unsigned int i = indexMin; i <= indexMax && i < mSlicerManagers.size(); i++) {
+    if (mSlicerManagers[i] == NULL)
+      continue;
+    mSlicerManagers[i]->SetColorWindow(window);
+    mSlicerManagers[i]->SetPreset(6);
+    mSlicerManagers[i]->Render();
+  }
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvMainWindow::ApplyLevelToSetOfImages(double level, unsigned int indexMin, unsigned int indexMax)
+{
+  for (unsigned int i = indexMin; i <= indexMax && i < mSlicerManagers.size(); i++) {
+    if (mSlicerManagers[i] == NULL)
+      continue;
+    mSlicerManagers[i]->SetColorLevel(level);
+    mSlicerManagers[i]->SetPreset(6);
+    mSlicerManagers[i]->Render();
+  }
+}
+//------------------------------------------------------------------------------
+
 //------------------------------------------------------------------------------
 void vvMainWindow::UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps)
 {
@@ -2413,8 +2488,14 @@ void vvMainWindow::LinkAllImages()
 }
 
 //------------------------------------------------------------------------------
-void vvMainWindow::AddLink(QString image1,QString image2)
+void vvMainWindow::AddLink(QString image1,QString image2,bool fromPanel)
 {
+  if (!fromPanel) {
+    // delegate to linkPanel if call came from elsewhere...
+    linkPanel->addLinkFromIds(image1, image2);
+    return;
+  }
+  
   unsigned int sm1 = 0;
   unsigned int sm2 = 0;
 
@@ -2671,23 +2752,24 @@ void vvMainWindow::UpdateTSlice(int slicer, int slice)
 //------------------------------------------------------------------------------
 void vvMainWindow::UpdateSliceRange(int slicer, int min, int max, int tmin, int tmax)
 {
-  int position = int((min+max)/2);
+  //int position = int((min+max)/2);
+  int position = mSlicerManagers[mCurrentPickedImageIndex]->GetSlicer(slicer)->GetSlice();
   if (slicer == 0) {
-    NOVerticalSlider->setValue(position);
     NOVerticalSlider->setRange(min,max);
     NOHorizontalSlider->setRange(tmin,tmax);
+    NOVerticalSlider->setValue(position);
   } else if (slicer == 1) {
-    NEVerticalSlider->setValue(position);
     NEVerticalSlider->setRange(min,max);
     NEHorizontalSlider->setRange(tmin,tmax);
+    NEVerticalSlider->setValue(position);
   } else if (slicer == 2) {
-    SOVerticalSlider->setValue(position);
     SOVerticalSlider->setRange(min,max);
     SOHorizontalSlider->setRange(tmin,tmax);
+    SOVerticalSlider->setValue(position);
   } else if (slicer == 3) {
-    SEVerticalSlider->setValue(position);
     SEVerticalSlider->setRange(min,max);
     SEHorizontalSlider->setRange(tmin,tmax);
+    SEVerticalSlider->setValue(position);
   }
 }
 //------------------------------------------------------------------------------
@@ -3074,7 +3156,7 @@ vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filen
   DataTree->setItemWidget(item, COLUMN_RELOAD_IMAGE, rButton);
 
   //set the id of the image
-  QString id = slicer_manager->GetFileName().c_str() + QString::number(mSlicerManagers.size()-1);
+  QString id = QDir::current().absoluteFilePath(slicer_manager->GetFileName().c_str()) + QString::number(mSlicerManagers.size()-1);
   item->setData(COLUMN_IMAGE_NAME,Qt::UserRole,id.toStdString().c_str());
   mSlicerManagers.back()->SetId(id.toStdString());
 
index 015a468924ec6a1e9836d24aeae884352cd781b5..e308314c59620094e59ac7bb778856154089283c 100644 (file)
@@ -121,9 +121,11 @@ public slots:
   void UpdateSlicingPreset();
   void SwitchWindowLevel();
   void ApplyWindowLevelToAllImages();
+  void ApplyWindowToSetOfImages(double window, unsigned int indexMin, unsigned int indexMax);
+  void ApplyLevelToSetOfImages(double level, unsigned int indexMin, unsigned int indexMax);
   void UpdateLinkManager(std::string id, int slicer, double x, double y, double z, int temps);
   void UpdateLinkedNavigation(std::string id, vvSlicerManager *sm, vvSlicer* refSlicer);
-  void AddLink(QString image1,QString image2);
+  void AddLink(QString image1,QString image2,bool fromPanel = true);
   void RemoveLink(QString image1,QString image2);
   void ChangeImageWithIndexOffset(vvSlicerManager *sm, int slicer, int offset);
 
index 6d61ca5df6b8d0132fb75be64459bfe18bac46fe..980bbf1ffeac7a832fc086265f68f14a05911dd0 100644 (file)
@@ -73,6 +73,7 @@ void vvReadState::ReadTree()
 {
   std::string value;
   
+  // read images
   while (!m_XmlReader->isEndElement() || value != "Images") { 
     m_XmlReader->readNext();
     value = m_XmlReader->qualifiedName().toString().toStdString();
@@ -81,6 +82,15 @@ void vvReadState::ReadTree()
     } 
   }
   
+  // read links
+  while (!m_XmlReader->isEndElement() || value != "Links") { 
+    m_XmlReader->readNext();
+    value = m_XmlReader->qualifiedName().toString().toStdString();
+    if (m_XmlReader->isStartElement()) {
+      if (value == "LinkedFrom") value = ReadLink();
+    } 
+  }
+
   if (m_XmlReader->hasError())
     std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
 }
@@ -111,7 +121,23 @@ std::string  vvReadState::ReadImage()
         }
       }
       else if (current_index >= 0) {
-        if (value == "Fusion")
+        vvSlicerManager* slicerManager = m_Window->GetSlicerManagers()[current_index];
+        if (value == "Preset") {
+          double vali = m_XmlReader->readElementText().toInt();
+          if (!m_XmlReader->hasError())
+            slicerManager->SetPreset(vali);
+        }
+        else if (value == "Window") {
+          double vald = m_XmlReader->readElementText().toDouble();
+          if (!m_XmlReader->hasError())
+            slicerManager->SetColorWindow(vald);
+        }
+        else if (value == "Level") {
+          double vald = m_XmlReader->readElementText().toDouble();
+          if (!m_XmlReader->hasError())
+            slicerManager->SetColorLevel(vald);
+        }
+        else if (value == "Fusion")
           value = ReadFusion(current_index);
         else if (value == "Overlay")
           value = ReadOverlay(current_index);
@@ -246,6 +272,33 @@ std::string vvReadState::ReadVector(int index)
 //------------------------------------------------------------------------------
 
 
+//------------------------------------------------------------------------------
+std::string  vvReadState::ReadLink()
+{
+  std::string id_from, id_to, value;
+  
+  QXmlStreamAttributes attributes = m_XmlReader->attributes();
+  if (!m_XmlReader->hasError()) {
+    id_from = attributes.value("Id").toString().toStdString();
+  }
+
+  while (!m_XmlReader->isEndElement() || value != "LinkedFrom") { 
+    m_XmlReader->readNext();
+    value = m_XmlReader->qualifiedName().toString().toStdString();
+    if (m_XmlReader->isStartElement()) {
+      if (value == "LinkedTo") {
+        id_to = m_XmlReader->readElementText().toStdString();
+        if (!m_XmlReader->hasError()) {
+          m_Window->AddLink(id_from.c_str(), id_to.c_str(), false);
+        }
+      }
+    }
+  }
+  
+  return value;
+}
+//------------------------------------------------------------------------------
+
 //------------------------------------------------------------------------------
 void vvReadState::ReadGUI()
 {
index 04607f68790bfa4261145f0526abf7b55a774502..a34c464cfa2bd17a7e0063ba5c54ee7ab50da967 100644 (file)
@@ -27,6 +27,7 @@ protected:
   std::string ReadFusion(int index);
   std::string ReadOverlay(int index);
   std::string ReadVector(int index);
+  std::string ReadLink();
 
   std::auto_ptr<QXmlStreamReader> m_XmlReader;
   std::auto_ptr<QFile> m_File;
index 71e22ef0cff854e7305484255b83e23a0e0deba1..ecf29da4b5939ff784f4b73eaa84a529ea7e8e61 100644 (file)
@@ -72,6 +72,13 @@ void vvSaveState::SaveTree()
     SaveImage(item, i);
   }
   m_XmlWriter->writeEndElement();
+
+  m_XmlWriter->writeStartElement("Links");
+  for (int i = 0; i < tree->topLevelItemCount(); i++) {
+    const vvSlicerManager * slicerManager = m_Window->GetSlicerManagers()[i];
+    SaveLink(slicerManager);
+  }
+  m_XmlWriter->writeEndElement();
 }
 //------------------------------------------------------------------------------
 
@@ -82,14 +89,20 @@ void vvSaveState::SaveImage(const QTreeWidgetItem* item, int index)
   const vvSlicerManager * slicerManager = m_Window->GetSlicerManagers()[index];
   m_XmlWriter->writeStartElement("Image");
 
-  std::ostringstream indexStr;
-  indexStr.str("");
-  indexStr << index;
-  m_XmlWriter->writeAttribute("Index", indexStr.str().c_str());
+  std::ostringstream valueStr;
+  valueStr.str("");
+  valueStr << index;
+  m_XmlWriter->writeAttribute("Index", valueStr.str().c_str());
 
   std::string filename = item->data(0, Qt::UserRole).toString().toStdString();
   m_XmlWriter->writeTextElement("FileName", QDir::current().absoluteFilePath(filename.c_str()));
-
+  int preset = slicerManager->GetPreset();
+  m_XmlWriter->writeTextElement("Preset", QString::number(preset));
+  if (preset == 6) {
+    m_XmlWriter->writeTextElement("Window", QString::number(slicerManager->GetColorWindow()));
+    m_XmlWriter->writeTextElement("Level", QString::number(slicerManager->GetColorLevel()));
+  }
+  
   QTreeWidgetItem* item_child;
   std::string role;
   for (int i = 0; i < item->childCount(); i++) {
@@ -150,6 +163,24 @@ void vvSaveState::SaveVector(const QTreeWidgetItem* item)
 }
 //------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
+void vvSaveState::SaveLink(const vvSlicerManager* vvManager)
+{
+  typedef std::list<std::string> LinkListType;
+  LinkListType links = vvManager->GetLinks();
+  if (!links.empty()) {
+    std::string my_id = vvManager->GetId();
+    m_XmlWriter->writeStartElement("LinkedFrom");
+    m_XmlWriter->writeAttribute("Id", my_id.c_str());
+    typename LinkListType::iterator i;
+    for (i = links.begin(); i != links.end(); i++) {
+      std::string link_id = *i;
+      m_XmlWriter->writeTextElement("LinkedTo", link_id.c_str());
+    }
+    m_XmlWriter->writeEndElement();
+  }
+}
+//------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 void vvSaveState::SaveGUI()
index 29a0e405803fc64fbec339bd6c69dc2855e21132..4f96c063e15a61e413fa1bbb531422111603ff6f 100644 (file)
@@ -28,6 +28,7 @@ protected:
   void SaveFusion(const QTreeWidgetItem* item, const vvSlicerManager* slicerManager);
   void SaveOverlay(const QTreeWidgetItem* item, const vvSlicerManager* slicerManager);
   void SaveVector(const QTreeWidgetItem* item);
+  void SaveLink(const vvSlicerManager* slicerManager);
 
   std::auto_ptr<QXmlStreamWriter> m_XmlWriter;
   std::auto_ptr<QFile> m_File;
index 548d0f366d5fbb5ffb1e6ef4546b6888b98a44f8..924eb1d8161d096452e7849df145da07c17fa1d9 100644 (file)
@@ -91,10 +91,10 @@ vvSlicer::vvSlicer()
   mCurrent[1] = -VTK_DOUBLE_MAX;
   mCurrent[2] = -VTK_DOUBLE_MAX;
 
-  mCursor[0] = -VTK_DOUBLE_MAX;
-  mCursor[1] = -VTK_DOUBLE_MAX;
-  mCursor[2] = -VTK_DOUBLE_MAX;
-  mCursor[3] = -VTK_DOUBLE_MAX;
+  mCursor[0] = 0;//-VTK_DOUBLE_MAX;
+  mCursor[1] = 0;//-VTK_DOUBLE_MAX;
+  mCursor[2] = 0;//-VTK_DOUBLE_MAX;
+  mCursor[3] = 0;//-VTK_DOUBLE_MAX;
 
   mSubSampling = 5;
   mScale = 1;
@@ -818,15 +818,22 @@ void vvSlicer::SetSliceOrientation(int orientation)
     AdjustResliceToSliceOrientation(mOverlayReslice);
 
   // Update the viewer
-  int *range = this->GetSliceRange();
-  if (range)
-    this->Slice = static_cast<int>((range[0] + range[1]) * 0.5);
-
+  
   // Go to current cursor position
   // double* cursorPos = GetCursorPosition();
   // DDV(cursorPos, 3);
   // SetCurrentPosition(cursorPos[0],cursorPos[1],cursorPos[2],cursorPos[3]);
 
+  if (this->Renderer && this->GetInput()) {
+    double s = mCursor[orientation];
+    double sCursor = (s - this->GetInput()->GetOrigin()[orientation])/this->GetInput()->GetSpacing()[orientation];
+    this->Slice = static_cast<int>(sCursor);
+  }
+  
+//   int *range = this->GetSliceRange();
+//   if (range)
+//     this->Slice = static_cast<int>((range[0] + range[1]) * 0.5);
+
   this->UpdateOrientation();
   this->UpdateDisplayExtent();
 
index c0e652de2317cafdfa07eb976a46f893b228c6a4..9331bf1ab78a859dcfaf96c4b092c8f4ce3f7454 100644 (file)
@@ -69,7 +69,8 @@ vvSlicerManager::vvSlicerManager(int numberOfSlicers)
 
   for ( int i = 0; i < numberOfSlicers; i++)
     mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());
-
+  mSelectedSlicer = -1;
+  
   mPreviousSlice.resize(numberOfSlicers);
   mPreviousTSlice.resize(numberOfSlicers);
   mSlicingPreset = WORLD_SLICING;
@@ -605,6 +606,7 @@ void vvSlicerManager::UpdateViews(int current,int slicer)
       z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {
     mSlicers[slicer]->UpdateCursorPosition();
     mSlicers[slicer]->SetCursorColor(10,212,255);
+    mSelectedSlicer = slicer;
 
     switch (mSlicers[slicer]->GetSliceOrientation()) {
     case vtkImageViewer2::SLICE_ORIENTATION_XY:
@@ -735,7 +737,7 @@ void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagat
 //----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
-double vvSlicerManager::GetColorWindow()
+double vvSlicerManager::GetColorWindow() const
 {
   if (mSlicers.size())
     return mSlicers[0]->GetColorWindow();
@@ -745,7 +747,7 @@ double vvSlicerManager::GetColorWindow()
 
 
 //----------------------------------------------------------------------------
-double vvSlicerManager::GetColorLevel()
+double vvSlicerManager::GetColorLevel() const
 {
   if (mSlicers.size())
     return mSlicers[0]->GetColorLevel();
@@ -1110,9 +1112,9 @@ void vvSlicerManager::SetPreset(int preset)
     window = 400;
     level = 20;
     break;
-  case 3:
-    window = 1500;
-    level = -500;
+  case 3: // lungs (same as FOCAL)
+    window = 1700;
+    level = -300;
     break;
   case 4:
     window = 1000;
index 088df6171a39d2fa7467b63ff42843d86e448271..dcac673216f1af7eef36b8394dfa32bb6dbbf8f9 100644 (file)
@@ -86,6 +86,10 @@ class vvSlicerManager : public QObject {
   ///Switch between nearest neighbor and linear interpolation
   void ToggleInterpolation();
   vvSlicer* GetSlicer(int i);
+  int GetSelectedSlicer() {
+    return mSelectedSlicer;
+  }
+  
   void UpdateSlicer(int num, bool state);
   void SetSlicerWindow(int i, vtkRenderWindow* RW);
   void SetInteractorStyleNavigator(int i,vtkInteractorStyle* style);
@@ -95,7 +99,7 @@ class vvSlicerManager : public QObject {
   vvImage::Pointer GetVF()     { return mVF; }
   int GetType()                { return mType; }
   void SetId(std::string id)   { mId = id; }
-  std::string GetId()          { return mId; }
+  std::string GetId()  const        { return mId; }
   int GetDimension() {
     if (mImage) return mImage->GetNumberOfDimensions();
     else return -1;
@@ -142,15 +146,15 @@ class vvSlicerManager : public QObject {
     mFusionShowLegend = show;
   }
 
-  double GetColorWindow();
-  double GetColorLevel();
+  double GetColorWindow() const;
+  double GetColorLevel() const;
   double GetOverlayColorWindow() const;
   double GetOverlayColorLevel() const;
   bool GetLinkOverlayWindowLevel() const;
   int GetColorMap() {
     return mColorMap;
   }
-  int GetPreset() {
+  int GetPreset() const {
     return mPreset;
   }
   SlicingPresetType GetSlicingPreset() {
@@ -189,6 +193,10 @@ class vvSlicerManager : public QObject {
     mLinkedId.remove(oldId); 
   }
   
+  std::list<std::string> GetLinks() const {
+    return mLinkedId;
+  }
+  
   bool IsLinked() {
     return mLinkedId.size() > 0;
   }
@@ -240,6 +248,7 @@ signals :
 
 protected:
   std::vector< vtkSmartPointer<vvSlicer> > mSlicers;
+  int mSelectedSlicer;
   vvImageReader::Pointer mReader;
   vvImageReader::Pointer mOverlayReader;
   vvImageReader::Pointer mFusionReader;