diff --git a/CMakeLists.txt b/CMakeLists.txt index c97fa0868e..53d8af39f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,1392 +1,1391 @@ set(MITK_CMAKE_MINIMUM_REQUIRED_VERSION 3.5) cmake_minimum_required(VERSION ${MITK_CMAKE_MINIMUM_REQUIRED_VERSION}) #----------------------------------------------------------------------------- # See http://www.cmake.org/cmake/help/v3.5/manual/cmake-policies.7.html for details #----------------------------------------------------------------------------- set(project_policies ) foreach(policy ${project_policies}) if(POLICY ${policy}) cmake_policy(SET ${policy} NEW) endif() endforeach() #----------------------------------------------------------------------------- # Superbuild Option - Enabled by default #----------------------------------------------------------------------------- option(MITK_USE_SUPERBUILD "Build MITK and the projects it depends on via SuperBuild.cmake." ON) if(MITK_USE_SUPERBUILD) project(MITK-superbuild) set(MITK_SOURCE_DIR ${PROJECT_SOURCE_DIR}) set(MITK_BINARY_DIR ${PROJECT_BINARY_DIR}) else() project(MITK VERSION 2016.11.99) endif() #----------------------------------------------------------------------------- # Update CMake module path #------------------------------------------------------------------------------ set(MITK_CMAKE_DIR ${MITK_SOURCE_DIR}/CMake) set(CMAKE_MODULE_PATH ${MITK_CMAKE_DIR} ${CMAKE_MODULE_PATH} ) #----------------------------------------------------------------------------- # CMake function(s) and macro(s) #----------------------------------------------------------------------------- # Standard CMake macros include(FeatureSummary) include(CTestUseLaunchers) include(CMakeParseArguments) include(FindPackageHandleStandardArgs) # MITK macros include(mitkFunctionGetGccVersion) include(mitkFunctionCheckCompilerFlags) include(mitkFunctionSuppressWarnings) # includes several functions include(mitkMacroEmptyExternalProject) include(mitkFunctionGenerateProjectXml) include(mitkFunctionEnableBuildConfiguration) include(mitkFunctionWhitelists) include(mitkFunctionAddExternalProject) SUPPRESS_VC_DEPRECATED_WARNINGS() #----------------------------------------------------------------------------- # Set a default build type if none was specified #----------------------------------------------------------------------------- if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Debug' as none was specified.") set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() #----------------------------------------------------------------------------- # Check miminum Mac OS X version #----------------------------------------------------------------------------- # The minimum supported Mac OS X version is 10.9. If you use a version less than 10.9, there is no guarantee that the build still works. if(APPLE) exec_program(sw_vers ARGS -productVersion OUTPUT_VARIABLE osx_version) if (osx_version VERSION_LESS "10.9") message(WARNING "Detected OS X version \"${osx_version}\" is not supported anymore. Minimum required OS X version is 10.9 or greater.") endif() if (CMAKE_OSX_DEPLOYMENT_TARGET AND CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 10.9) message(WARNING "Detected OS X deployment target \"${CMAKE_OSX_DEPLOYMENT_TARGET}\" is not supported anymore. Minimum required OS X version is 10.9 or greater.") endif() endif() #----------------------------------------------------------------------------- # Check miminum compiler versions #----------------------------------------------------------------------------- if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # require at least gcc 4.9 as provided by ppa:ubuntu-toolchain-r/test for Ubuntu 14.04 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) message(FATAL_ERROR "GCC version must be at least 4.9 If you are using Ubuntu 14.04, you can easily install gcc and g++ 4.9 (or any later version available) in addition to your version ${CMAKE_CXX_COMPILER_VERSION}: sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install gcc-4.9 g++-4.9 Make sure to explicitly specify these compilers when configuring MITK: CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc-4.9 CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++-4.9 For more information on the proposed PPA see the Toolchain Updates section of https://wiki.ubuntu.com/ToolChain.") endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # require at least clang 3.4 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4) message(FATAL_ERROR "Clang version must be at least 3.4") endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") # require at least clang 5.0 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) message(FATAL_ERROR "Apple Clang version must be at least 5.0") endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # require at least Visual Studio 2013 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0.40629.0) message(FATAL_ERROR "Microsoft Visual Studio 2013 Update 5 or newer required (MSVC 18.0.40629.0)") endif() else() message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang (Linux or Apple), GCC and MSVC.") endif() if(CMAKE_COMPILER_IS_GNUCXX) mitkFunctionGetGccVersion(${CMAKE_CXX_COMPILER} GCC_VERSION) else() set(GCC_VERSION 0) endif() set(MITK_CXX_STANDARD 14) set(CMAKE_CXX_EXTENSIONS 0) set(CMAKE_CXX_STANDARD ${MITK_CXX_STANDARD}) set(CMAKE_CXX_STANDARD_REQUIRED 1) # This is necessary to avoid problems with compile feature checks. # CMAKE_CXX_STANDARD seems to only set the -std=c++14 flag for targets. # However, compile flag checks also need to be done with -std=c++14. # The MITK_CXX14_FLAG variable is also used for external projects # build during the MITK super-build. mitkFunctionCheckCompilerFlags("-std=c++14" MITK_CXX14_FLAG) #----------------------------------------------------------------------------- # Warn if source or build path is too long #----------------------------------------------------------------------------- if(WIN32) set(_src_dir_length_max 50) set(_bin_dir_length_max 50) if(MITK_USE_SUPERBUILD) set(_src_dir_length_max 34) # _src_dir_length_max - strlen(ep/src/ITK-build) set(_bin_dir_length_max 40) # _bin_dir_length_max - strlen(MITK-build) endif() string(LENGTH "${MITK_SOURCE_DIR}" _src_n) string(LENGTH "${MITK_BINARY_DIR}" _bin_n) # The warnings should be converted to errors if(_src_n GREATER _src_dir_length_max) message(WARNING "MITK source code directory path length is too long (${_src_n} > ${_src_dir_length_max})." "Please move the MITK source code directory to a directory with a shorter path." ) endif() if(_bin_n GREATER _bin_dir_length_max) message(WARNING "MITK build directory path length is too long (${_bin_n} > ${_bin_dir_length_max})." "Please move the MITK build directory to a directory with a shorter path." ) endif() endif() #----------------------------------------------------------------------------- # Additional MITK Options (also shown during superbuild) #----------------------------------------------------------------------------- macro(env_option name doc value) set(_value $ENV{${name}}) if("${_value}" STREQUAL "") set(_value ${value}) endif() option(${name} "${doc}" ${_value}) endmacro() # ----------------------------------------- # General build options option(BUILD_SHARED_LIBS "Build MITK with shared libraries" ON) option(WITH_COVERAGE "Enable/Disable coverage" OFF) option(BUILD_TESTING "Test the project" ON) env_option(MITK_BUILD_ALL_APPS "Build all MITK applications" OFF) env_option(MITK_BUILD_EXAMPLES "Build the MITK Examples" OFF) option(MITK_ENABLE_PIC_READER "Enable support for reading the DKFZ pic file format." ON) mark_as_advanced(MITK_BUILD_ALL_APPS MITK_ENABLE_PIC_READER ) # ----------------------------------------- # Qt version related variables env_option(MITK_USE_Qt5 "Use Qt 5 library" ON) env_option(MITK_USE_Qt5_WebEngine "Use Qt 5 WebEngine library" ON) if(MITK_USE_Qt5) set(MITK_QT5_MINIMUM_VERSION 5.6.0) set(MITK_QT5_COMPONENTS Concurrent OpenGL PrintSupport Script Sql Svg Widgets Xml XmlPatterns UiTools Help LinguistTools) if(MITK_USE_Qt5_WebEngine) set(MITK_QT5_COMPONENTS ${MITK_QT5_COMPONENTS} WebEngineWidgets) endif() if(APPLE) set(MITK_QT5_COMPONENTS ${MITK_QT5_COMPONENTS} DBus) endif() find_package(Qt5 ${MITK_QT5_MINIMUM_VERSION} COMPONENTS ${MITK_QT5_COMPONENTS} REQUIRED) if(Qt5_DIR) get_filename_component(_Qt5_DIR "${Qt5_DIR}/../../../" ABSOLUTE) list(FIND CMAKE_PREFIX_PATH "${_Qt5_DIR}" _result) if(_result LESS 0) set(CMAKE_PREFIX_PATH "${_Qt5_DIR};${CMAKE_PREFIX_PATH}" CACHE PATH "" FORCE) endif() endif() elseif(MITK_USE_Qt5_WebEngine) set(MITK_USE_Qt5_WebEngine OFF) endif() # ------------------------------------------------------------------------ # Register external projects which can be build with the MITK superbuild # system. Each mitkFunctionAddExternalProject() call registers an external # project for which a CMakeExternals/.cmake file must exist. The # call also creates a MITK_USE_ variable (appearing in the CMake # UI if the NO_CACHE option is *not* given). # ----------------------------------------- # Optional external projects with no # inter-dependencies set_property(GLOBAL PROPERTY MITK_EXTERNAL_PROJECTS "") mitkFunctionAddExternalProject(NAME Poco ON COMPONENTS Foundation Net Util XML Zip) mitkFunctionAddExternalProject(NAME DCMTK ON DOC "EXPERIMENTAL, superbuild only: Use DCMTK in MITK") mitkFunctionAddExternalProject(NAME OpenIGTLink OFF) mitkFunctionAddExternalProject(NAME tinyxml ON ADVANCED) mitkFunctionAddExternalProject(NAME GDCM ON ADVANCED) mitkFunctionAddExternalProject(NAME GLUT OFF ADVANCED) mitkFunctionAddExternalProject(NAME Raptor2 OFF ADVANCED) mitkFunctionAddExternalProject(NAME Eigen ON ADVANCED DOC "Use the Eigen library") mitkFunctionAddExternalProject(NAME GLEW ON ADVANCED DOC "Use the GLEW library") mitkFunctionAddExternalProject(NAME ANN ON ADVANCED DOC "Use Approximate Nearest Neighbor Library") mitkFunctionAddExternalProject(NAME CppUnit ON ADVANCED DOC "Use CppUnit for unit tests") mitkFunctionAddExternalProject(NAME PCRE OFF ADVANCED NO_PACKAGE) mitkFunctionAddExternalProject(NAME ZLIB OFF ADVANCED NO_PACKAGE NO_CACHE) mitkFunctionAddExternalProject(NAME HDF5 OFF ADVANCED) # ----------------------------------------- # The following external projects must be # ordered according to their # inter-dependencies mitkFunctionAddExternalProject(NAME SWIG OFF ADVANCED NO_PACKAGE DEPENDS PCRE) mitkFunctionAddExternalProject(NAME Python OFF NO_PACKAGE DEPENDS SWIG DOC "Use Python wrapping in MITK") mitkFunctionAddExternalProject(NAME Numpy OFF ADVANCED NO_PACKAGE) mitkFunctionAddExternalProject(NAME OpenCV OFF) mitkFunctionAddExternalProject(NAME Vigra OFF DEPENDS HDF5) # These are "hard" dependencies and always set to ON mitkFunctionAddExternalProject(NAME ITK ON NO_CACHE) mitkFunctionAddExternalProject(NAME VTK ON NO_CACHE) mitkFunctionAddExternalProject(NAME Boost ON NO_CACHE) mitkFunctionAddExternalProject(NAME SimpleITK OFF DEPENDS ITK GDCM SWIG) mitkFunctionAddExternalProject(NAME ACVD OFF DOC "Use Approximated Centroidal Voronoi Diagrams") mitkFunctionAddExternalProject(NAME CTK ON DEPENDS Qt5 DCMTK DOC "Use CTK in MITK") mitkFunctionAddExternalProject(NAME Rasqal OFF DEPENDS Raptor2 PCRE ADVANCED) mitkFunctionAddExternalProject(NAME Redland OFF DEPENDS Rasqal DOC "Use the Redland RDF library") mitkFunctionAddExternalProject(NAME SOFA OFF DEPENDS GLUT Eigen Boost DOC "Use Simulation Open Framework Architecture") mitkFunctionAddExternalProject(NAME VMTK OFF DEPENDS ITK VTK) mitkFunctionAddExternalProject(NAME DCMQI OFF DEPENDS DCMTK ITK DOC "Use dcmqi in MITK") mitkFunctionAddExternalProject(NAME MatchPoint OFF ADVANCED DEPENDS ITK DOC "Use the MatchPoint translation image registration library") if(MITK_USE_Qt5) mitkFunctionAddExternalProject(NAME Qwt ON ADVANCED DEPENDS Qt5) endif() # ----------------------------------------- # Other MITK_USE_* options not related to # external projects build via the # MITK superbuild env_option(MITK_USE_BLUEBERRY "Build the BlueBerry platform" ON) env_option(MITK_USE_OpenCL "Use OpenCL GPU-Computing library" OFF) #----------------------------------------------------------------------------- # Build configurations #----------------------------------------------------------------------------- set(_buildConfigs "Custom") file(GLOB _buildConfigFiles CMake/BuildConfigurations/*.cmake) foreach(_buildConfigFile ${_buildConfigFiles}) get_filename_component(_buildConfigFile ${_buildConfigFile} NAME_WE) list(APPEND _buildConfigs ${_buildConfigFile}) endforeach() set(MITK_BUILD_CONFIGURATION "Custom" CACHE STRING "Use pre-defined MITK configurations") set_property(CACHE MITK_BUILD_CONFIGURATION PROPERTY STRINGS ${_buildConfigs}) mitkFunctionEnableBuildConfiguration() mitkFunctionCreateWhitelistPaths(MITK) mitkFunctionFindWhitelists(MITK) # ----------------------------------------- # Custom dependency logic option(MITK_USE_SYSTEM_Boost "Use the system Boost" OFF) set(MITK_USE_Boost_LIBRARIES "" CACHE STRING "A semi-colon separated list of required Boost libraries") if(MITK_USE_SOFA) # SOFA requires boost system library list(FIND MITK_USE_Boost_LIBRARIES system _result) if(_result LESS 0) message("> Adding 'system' to MITK_USE_Boost_LIBRARIES.") list(APPEND MITK_USE_Boost_LIBRARIES system) endif() # SOFA requires boost thread library list(FIND MITK_USE_Boost_LIBRARIES thread _result) if(_result LESS 0) message("> Adding 'thread' to MITK_USE_Boost_LIBRARIES.") list(APPEND MITK_USE_Boost_LIBRARIES thread) endif() # Simulation plugin requires boost chrono library list(FIND MITK_USE_Boost_LIBRARIES chrono _result) if(_result LESS 0) message("> Adding 'chrono' to MITK_USE_Boost_LIBRARIES.") list(APPEND MITK_USE_Boost_LIBRARIES chrono) endif() set(MITK_USE_Boost_LIBRARIES ${MITK_USE_Boost_LIBRARIES} CACHE STRING "" FORCE) # Allow setting external SOFA plugins directory and SOFA plugins set(MITK_USE_SOFA_PLUGINS_DIR ${MITK_USE_SOFA_PLUGINS_DIR} CACHE PATH "External SOFA plugins directory" FORCE) set(MITK_USE_SOFA_PLUGINS ${MITK_USE_SOFA_PLUGINS} CACHE PATH "List of semicolon-separated plugin names" FORCE) endif() # only windows can't build python in debug mode if(MITK_USE_Python AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" AND WIN32) message(WARNING "Disabling Python support. Building MITK Python in debug mode on Windowsis not supported!") set(MITK_USE_Python OFF CACHE BOOL "Use python wrapping in MITK" FORCE) set(MITK_USE_Numpy OFF CACHE BOOL "Use Numpy" FORCE) set(MITK_USE_SimpleITK OFF CACHE BOOL "Use SimpleITK" FORCE) elseif(MITK_USE_Python) set(MITK_USE_ZLIB ON) if(NOT MITK_USE_Numpy) message("> Forcing MITK_USE_Numpy to ON because of MITK_USE_Python") set(MITK_USE_Numpy ON CACHE BOOL "Use Numpy" FORCE) endif() if(NOT MITK_USE_SimpleITK) message("> Forcing MITK_USE_SimpleITK to ON because of MITK_USE_Python") set(MITK_USE_SimpleITK ON CACHE BOOL "Use SimpleITK" FORCE) endif() option(MITK_USE_SYSTEM_PYTHON "Use the system python runtime" OFF) if(MITK_USE_SYSTEM_PYTHON) find_package(PythonLibs REQUIRED) find_package(PythonInterp REQUIRED) endif() elseif(MITK_USE_Python AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" AND WIN32) message(WARNING "Disabling Python support. Building MITK Python in debug mode on Windowsis not supported!") set(MITK_USE_Python OFF CACHE BOOL "Use python wrapping in MITK" FORCE) endif() if(BUILD_TESTING AND NOT MITK_USE_CppUnit) message("> Forcing MITK_USE_CppUnit to ON because BUILD_TESTING=ON") set(MITK_USE_CppUnit ON CACHE BOOL "Use CppUnit for unit tests" FORCE) endif() if(MITK_USE_BLUEBERRY) option(MITK_BUILD_ALL_PLUGINS "Build all MITK plugins" OFF) mark_as_advanced(MITK_BUILD_ALL_PLUGINS) if(NOT MITK_USE_CTK) message("> Forcing MITK_USE_CTK to ON because of MITK_USE_BLUEBERRY") set(MITK_USE_CTK ON CACHE BOOL "Use CTK in MITK" FORCE) endif() endif() #----------------------------------------------------------------------------- # Pixel type multiplexing #----------------------------------------------------------------------------- # Customize the default pixel types for multiplex macros set(MITK_ACCESSBYITK_INTEGRAL_PIXEL_TYPES "int, unsigned int, short, unsigned short, char, unsigned char" CACHE STRING "List of integral pixel types used in AccessByItk and InstantiateAccessFunction macros") set(MITK_ACCESSBYITK_FLOATING_PIXEL_TYPES "double, float" CACHE STRING "List of floating pixel types used in AccessByItk and InstantiateAccessFunction macros") set(MITK_ACCESSBYITK_COMPOSITE_PIXEL_TYPES "itk::RGBPixel, itk::RGBAPixel" CACHE STRING "List of composite pixel types used in AccessByItk and InstantiateAccessFunction macros") set(MITK_ACCESSBYITK_DIMENSIONS "2,3" CACHE STRING "List of dimensions used in AccessByItk and InstantiateAccessFunction macros") mark_as_advanced(MITK_ACCESSBYITK_INTEGRAL_PIXEL_TYPES MITK_ACCESSBYITK_FLOATING_PIXEL_TYPES MITK_ACCESSBYITK_COMPOSITE_PIXEL_TYPES MITK_ACCESSBYITK_DIMENSIONS ) # consistency checks if(NOT MITK_ACCESSBYITK_INTEGRAL_PIXEL_TYPES) set(MITK_ACCESSBYITK_INTEGRAL_PIXEL_TYPES "int, unsigned int, short, unsigned short, char, unsigned char" CACHE STRING "List of integral pixel types used in AccessByItk and InstantiateAccessFunction macros" FORCE) endif() if(NOT MITK_ACCESSBYITK_FLOATING_PIXEL_TYPES) set(MITK_ACCESSBYITK_FLOATING_PIXEL_TYPES "double, float" CACHE STRING "List of floating pixel types used in AccessByItk and InstantiateAccessFunction macros" FORCE) endif() if(NOT MITK_ACCESSBYITK_COMPOSITE_PIXEL_TYPES) set(MITK_ACCESSBYITK_COMPOSITE_PIXEL_TYPES "itk::RGBPixel, itk::RGBAPixel" CACHE STRING "List of composite pixel types used in AccessByItk and InstantiateAccessFunction macros" FORCE) endif() if(NOT MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES) string(REPLACE "," ";" _integral_types ${MITK_ACCESSBYITK_INTEGRAL_PIXEL_TYPES}) string(REPLACE "," ";" _floating_types ${MITK_ACCESSBYITK_FLOATING_PIXEL_TYPES}) foreach(_scalar_type ${_integral_types} ${_floating_types}) set(MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES "${MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES}itk::VariableLengthVector<${_scalar_type}>,") endforeach() string(LENGTH "${MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES}" _length) math(EXPR _length "${_length} - 1") string(SUBSTRING "${MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES}" 0 ${_length} MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES) set(MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES ${MITK_ACCESSBYITK_VECTOR_PIXEL_TYPES} CACHE STRING "List of vector pixel types used in AccessByItk and InstantiateAccessFunction macros for itk::VectorImage types" FORCE) endif() if(NOT MITK_ACCESSBYITK_DIMENSIONS) set(MITK_ACCESSBYITK_DIMENSIONS "2,3" CACHE STRING "List of dimensions used in AccessByItk and InstantiateAccessFunction macros") endif() #----------------------------------------------------------------------------- # Project.xml #----------------------------------------------------------------------------- # A list of topologically ordered targets set(CTEST_PROJECT_SUBPROJECTS) list(APPEND CTEST_PROJECT_SUBPROJECTS MITK-Core MITK-CoreUI MITK-IGT MITK-ToF MITK-DTI - MITK-Registration MITK-Modules # all modules not contained in a specific subproject MITK-Plugins # all plugins not contained in a specific subproject MITK-Examples Unlabeled # special "subproject" catching all unlabeled targets and tests ) # Configure CTestConfigSubProject.cmake that could be used by CTest scripts configure_file(${MITK_SOURCE_DIR}/CTestConfigSubProject.cmake.in ${MITK_BINARY_DIR}/CTestConfigSubProject.cmake) if(CTEST_PROJECT_ADDITIONAL_TARGETS) # those targets will be executed at the end of the ctest driver script # and they also get their own subproject label set(subproject_list "${CTEST_PROJECT_SUBPROJECTS};${CTEST_PROJECT_ADDITIONAL_TARGETS}") else() set(subproject_list "${CTEST_PROJECT_SUBPROJECTS}") endif() # Generate Project.xml file expected by the CTest driver script mitkFunctionGenerateProjectXml(${MITK_BINARY_DIR} MITK "${subproject_list}" ${MITK_USE_SUPERBUILD}) #----------------------------------------------------------------------------- # Superbuild script #----------------------------------------------------------------------------- if(MITK_USE_SUPERBUILD) include("${CMAKE_CURRENT_SOURCE_DIR}/SuperBuild.cmake") # Print configuration summary message("\n\n") feature_summary( DESCRIPTION "------- FEATURE SUMMARY FOR ${PROJECT_NAME} -------" WHAT ALL) return() endif() #***************************************************************************** #**************************** END OF SUPERBUILD **************************** #***************************************************************************** #----------------------------------------------------------------------------- # CMake function(s) and macro(s) #----------------------------------------------------------------------------- include(WriteBasicConfigVersionFile) include(CheckCXXSourceCompiles) include(GenerateExportHeader) include(mitkFunctionAddCustomModuleTest) include(mitkFunctionCheckModuleDependencies) include(mitkFunctionCompileSnippets) include(mitkFunctionConfigureVisualStudioUserProjectFile) include(mitkFunctionConvertXPSchema) include(mitkFunctionCreateBlueBerryApplication) include(mitkFunctionCreateCommandLineApp) include(mitkFunctionCreateModule) include(mitkFunctionCreatePlugin) include(mitkFunctionCreateProvisioningFile) include(mitkFunctionGetLibrarySearchPaths) include(mitkFunctionGetVersion) include(mitkFunctionGetVersionDescription) include(mitkFunctionInstallAutoLoadModules) include(mitkFunctionInstallCTKPlugin) include(mitkFunctionInstallProvisioningFiles) include(mitkFunctionInstallThirdPartyCTKPlugins) include(mitkFunctionOrganizeSources) include(mitkFunctionTestPlugin) include(mitkFunctionUseModules) if( ${MITK_USE_MatchPoint} ) include(mitkFunctionCreateMatchPointDeployedAlgorithm) endif() include(mitkMacroConfigureItkPixelTypes) include(mitkMacroCreateExecutable) include(mitkMacroCreateModuleTests) include(mitkMacroGenerateToolsLibrary) include(mitkMacroGetLinuxDistribution) include(mitkMacroGetPMDPlatformString) include(mitkMacroInstall) include(mitkMacroInstallHelperApp) include(mitkMacroInstallTargets) include(mitkMacroMultiplexPicType) # Deprecated include(mitkMacroCreateCTKPlugin) #----------------------------------------------------------------------------- # Global CMake variables #----------------------------------------------------------------------------- # Required and enabled C++14 features for all MITK code. # These are added as PUBLIC compile features to all MITK modules. set(MITK_CXX_FEATURES cxx_auto_type cxx_decltype cxx_enum_forward_declarations cxx_extended_friend_declarations cxx_extern_templates cxx_final cxx_lambdas cxx_local_type_template_args cxx_long_long_type cxx_nullptr cxx_override cxx_range_for cxx_right_angle_brackets cxx_rvalue_references cxx_static_assert cxx_strong_enums cxx_template_template_parameters cxx_trailing_return_types cxx_variadic_macros ) if(NOT DEFINED CMAKE_DEBUG_POSTFIX) # We can't do this yet because the CTK Plugin Framework # cannot cope with a postfix yet. #set(CMAKE_DEBUG_POSTFIX d) endif() #----------------------------------------------------------------------------- # Output directories. #----------------------------------------------------------------------------- set(_default_LIBRARY_output_dir lib) set(_default_RUNTIME_output_dir bin) set(_default_ARCHIVE_output_dir lib) foreach(type LIBRARY RUNTIME ARCHIVE) # Make sure the directory exists if(MITK_CMAKE_${type}_OUTPUT_DIRECTORY AND NOT EXISTS ${MITK_CMAKE_${type}_OUTPUT_DIRECTORY}) message("Creating directory MITK_CMAKE_${type}_OUTPUT_DIRECTORY: ${MITK_CMAKE_${type}_OUTPUT_DIRECTORY}") file(MAKE_DIRECTORY "${MITK_CMAKE_${type}_OUTPUT_DIRECTORY}") endif() if(MITK_CMAKE_${type}_OUTPUT_DIRECTORY) set(CMAKE_${type}_OUTPUT_DIRECTORY ${MITK_CMAKE_${type}_OUTPUT_DIRECTORY}) else() set(CMAKE_${type}_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${_default_${type}_output_dir}) set(MITK_CMAKE_${type}_OUTPUT_DIRECTORY ${CMAKE_${type}_OUTPUT_DIRECTORY}) endif() set(CMAKE_${type}_OUTPUT_DIRECTORY ${CMAKE_${type}_OUTPUT_DIRECTORY} CACHE INTERNAL "Output directory for ${type} files.") mark_as_advanced(CMAKE_${type}_OUTPUT_DIRECTORY) endforeach() #----------------------------------------------------------------------------- # Set MITK specific options and variables (NOT available during superbuild) #----------------------------------------------------------------------------- # Look for optional Doxygen package find_package(Doxygen) option(BLUEBERRY_DEBUG_SMARTPOINTER "Enable code for debugging smart pointers" OFF) mark_as_advanced(BLUEBERRY_DEBUG_SMARTPOINTER) # ASK THE USER TO SHOW THE CONSOLE WINDOW FOR CoreApp and mitkWorkbench option(MITK_SHOW_CONSOLE_WINDOW "Use this to enable or disable the console window when starting MITK GUI Applications" ON) mark_as_advanced(MITK_SHOW_CONSOLE_WINDOW) # TODO: check if necessary option(USE_ITKZLIB "Use the ITK zlib for pic compression." ON) mark_as_advanced(USE_ITKZLIB) if(NOT MITK_FAST_TESTING) if(DEFINED MITK_CTEST_SCRIPT_MODE AND (MITK_CTEST_SCRIPT_MODE STREQUAL "continuous" OR MITK_CTEST_SCRIPT_MODE STREQUAL "experimental") ) set(MITK_FAST_TESTING 1) endif() endif() if(NOT UNIX AND NOT MINGW) set(MITK_WIN32_FORCE_STATIC "STATIC" CACHE INTERNAL "Use this variable to always build static libraries on non-unix platforms") endif() if(MITK_BUILD_ALL_PLUGINS) set(MITK_BUILD_ALL_PLUGINS_OPTION "FORCE_BUILD_ALL") endif() # Configure pixel types used for ITK image access multiplexing mitkMacroConfigureItkPixelTypes() # Configure module naming conventions set(MITK_MODULE_NAME_REGEX_MATCH "^[A-Z].*$") set(MITK_MODULE_NAME_REGEX_NOT_MATCH "^[Mm][Ii][Tt][Kk].*$") set(MITK_MODULE_NAME_PREFIX "Mitk") set(MITK_MODULE_NAME_DEFAULTS_TO_DIRECTORY_NAME 1) #----------------------------------------------------------------------------- # Get MITK version info #----------------------------------------------------------------------------- mitkFunctionGetVersion(${MITK_SOURCE_DIR} MITK) mitkFunctionGetVersionDescription(${MITK_SOURCE_DIR} MITK) # MITK_VERSION set(MITK_VERSION_STRING "${MITK_VERSION_MAJOR}.${MITK_VERSION_MINOR}.${MITK_VERSION_PATCH}") if(MITK_VERSION_PATCH STREQUAL "99") set(MITK_VERSION_STRING "${MITK_VERSION_STRING}-${MITK_REVISION_SHORTID}") endif() #----------------------------------------------------------------------------- # Installation preparation # # These should be set before any MITK install macros are used #----------------------------------------------------------------------------- # on Mac OSX all BlueBerry plugins get copied into every # application bundle (.app directory) specified here if(MITK_USE_BLUEBERRY AND APPLE) include("${CMAKE_CURRENT_SOURCE_DIR}/Applications/AppList.cmake") foreach(mitk_app ${MITK_APPS}) # extract option_name string(REPLACE "^^" "\\;" target_info ${mitk_app}) set(target_info_list ${target_info}) list(GET target_info_list 1 option_name) list(GET target_info_list 0 app_name) # check if the application is enabled if(${option_name} OR MITK_BUILD_ALL_APPS) set(MACOSX_BUNDLE_NAMES ${MACOSX_BUNDLE_NAMES} Mitk${app_name}) endif() endforeach() endif() #----------------------------------------------------------------------------- # Set coverage Flags #----------------------------------------------------------------------------- if(WITH_COVERAGE) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set(coverage_flags "-g -fprofile-arcs -ftest-coverage -O0 -DNDEBUG") set(COVERAGE_CXX_FLAGS ${coverage_flags}) set(COVERAGE_C_FLAGS ${coverage_flags}) endif() endif() #----------------------------------------------------------------------------- # MITK C/CXX Flags #----------------------------------------------------------------------------- set(MITK_C_FLAGS "${COVERAGE_C_FLAGS}") set(MITK_C_FLAGS_DEBUG ) set(MITK_C_FLAGS_RELEASE ) set(MITK_CXX_FLAGS "${COVERAGE_CXX_FLAGS} ${MITK_CXX14_FLAG}") set(MITK_CXX_FLAGS_DEBUG ) set(MITK_CXX_FLAGS_RELEASE ) set(MITK_EXE_LINKER_FLAGS ) set(MITK_SHARED_LINKER_FLAGS ) find_package(OpenMP) if (OPENMP_FOUND) set(MITK_C_FLAGS "${MITK_C_FLAGS} ${OpenMP_C_FLAGS}") set(MITK_CXX_FLAGS "${MITK_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") endif() if(WIN32) set(MITK_CXX_FLAGS "${MITK_CXX_FLAGS} -D_WIN32_WINNT=0x0501 -DPOCO_NO_UNWINDOWS -DWIN32_LEAN_AND_MEAN -DNOMINMAX") mitkFunctionCheckCompilerFlags("/wd4005" MITK_CXX_FLAGS) # warning C4005: macro redefinition mitkFunctionCheckCompilerFlags("/wd4231" MITK_CXX_FLAGS) # warning C4231: nonstandard extension used : 'extern' before template explicit instantiation # the following line should be removed after fixing bug 17637 mitkFunctionCheckCompilerFlags("/wd4316" MITK_CXX_FLAGS) # warning C4316: object alignment on heap mitkFunctionCheckCompilerFlags("/wd4180" MITK_CXX_FLAGS) # warning C4180: qualifier applied to function type has no meaning endif() if(NOT MSVC_VERSION) foreach(_flag -Wall -Wextra -Wpointer-arith -Winvalid-pch -Wcast-align -Wwrite-strings -Wno-error=gnu -Wno-error=unknown-pragmas # The strict-overflow warning is generated by ITK template code -Wno-error=strict-overflow -Woverloaded-virtual -Wstrict-null-sentinel #-Wold-style-cast #-Wsign-promo -Wno-array-bounds -fdiagnostics-show-option ) mitkFunctionCheckCAndCXXCompilerFlags(${_flag} MITK_C_FLAGS MITK_CXX_FLAGS) endforeach() endif() if(CMAKE_COMPILER_IS_GNUCXX AND NOT APPLE) mitkFunctionCheckCompilerFlags("-Wl,--no-undefined" MITK_SHARED_LINKER_FLAGS) mitkFunctionCheckCompilerFlags("-Wl,--as-needed" MITK_SHARED_LINKER_FLAGS) endif() if(CMAKE_COMPILER_IS_GNUCXX) mitkFunctionCheckCAndCXXCompilerFlags("-fstack-protector-all" MITK_C_FLAGS MITK_CXX_FLAGS) if(MINGW) # suppress warnings about auto imported symbols set(MITK_SHARED_LINKER_FLAGS "-Wl,--enable-auto-import ${MITK_SHARED_LINKER_FLAGS}") endif() set(MITK_CXX_FLAGS_RELEASE "-U_FORTIFY_SOURCES -D_FORTIFY_SOURCE=2 ${MITK_CXX_FLAGS_RELEASE}") endif() set(MITK_MODULE_LINKER_FLAGS ${MITK_SHARED_LINKER_FLAGS}) set(MITK_EXE_LINKER_FLAGS ${MITK_SHARED_LINKER_FLAGS}) #----------------------------------------------------------------------------- # MITK Packages #----------------------------------------------------------------------------- set(MITK_MODULES_PACKAGE_DEPENDS_DIR ${MITK_SOURCE_DIR}/CMake/PackageDepends) set(MODULES_PACKAGE_DEPENDS_DIRS ${MITK_MODULES_PACKAGE_DEPENDS_DIR}) if(NOT MITK_USE_SYSTEM_Boost) set(Boost_NO_SYSTEM_PATHS 1) endif() set(Boost_USE_MULTITHREADED 1) set(Boost_USE_STATIC_LIBS 0) set(Boost_USE_STATIC_RUNTIME 0) set(Boost_ADDITIONAL_VERSIONS "1.60" "1.60.0") # We need this later for a DCMTK workaround set(_dcmtk_dir_orig ${DCMTK_DIR}) # This property is populated at the top half of this file get_property(MITK_EXTERNAL_PROJECTS GLOBAL PROPERTY MITK_EXTERNAL_PROJECTS) foreach(ep ${MITK_EXTERNAL_PROJECTS}) get_property(_package GLOBAL PROPERTY MITK_${ep}_PACKAGE) get_property(_components GLOBAL PROPERTY MITK_${ep}_COMPONENTS) if(MITK_USE_${ep} AND _package) if(_components) find_package(${_package} COMPONENTS ${_components} REQUIRED CONFIG) else() # Prefer config mode first because it finds external # Config.cmake files pointed at by _DIR variables. # Otherwise, existing Find.cmake files could fail. # (e.g. in the case of GLEW and the FindGLEW.cmake file shipped # with CMake). find_package(${_package} QUIET CONFIG) string(TOUPPER "${_package}" _package_uc) if(NOT (${_package}_FOUND OR ${_package_uc}_FOUND)) find_package(${_package} REQUIRED) endif() endif() endif() endforeach() # Ensure that the MITK CMake module path comes first set(CMAKE_MODULE_PATH ${MITK_CMAKE_DIR} ${CMAKE_MODULE_PATH} ) if(MITK_USE_DCMTK) # Due to the preferred CONFIG mode in find_package calls above, # the DCMTKConfig.cmake file is read, which does not provide useful # package information. We explictly need MODULE mode to find DCMTK. if(${_dcmtk_dir_orig} MATCHES "${MITK_EXTERNAL_PROJECT_PREFIX}.*") # Help our FindDCMTK.cmake script find our super-build DCMTK set(DCMTK_DIR ${MITK_EXTERNAL_PROJECT_PREFIX}) else() # Use the original value set(DCMTK_DIR ${_dcmtk_dir_orig}) endif() find_package(DCMTK REQUIRED MODULE) endif() if(MITK_USE_DCMQI) # Due to the preferred CONFIG mode in find_package calls above, # the DCMQIConfig.cmake file is read, which does not provide useful # package information. We explictly need MODULE mode to find DCMQI. # Help our FindDCMQI.cmake script find our super-build DCMQI set(DCMQI_DIR ${MITK_EXTERNAL_PROJECT_PREFIX}) find_package(DCMQI REQUIRED) endif() if(MITK_USE_Python) find_package(PythonLibs REQUIRED) find_package(PythonInterp REQUIRED) if(MITK_USE_Numpy) find_package(Numpy REQUIRED) endif() endif() if(MITK_USE_SOFA) # The SOFAConfig.cmake file does not provide exported targets or # libraries with absolute paths, hence we need to make the link # directories globally available until the SOFAConfig.cmake file # supports a proper mechanism for handling targets. # The same code is needed in MITKConfig.cmake. link_directories(${SOFA_LIBRARY_DIRS}) endif() # Same as SOFA above link_directories(${Boost_LIBRARY_DIRS}) if(MITK_USE_OpenIGTLink) # Same as SOFA above link_directories(${OpenIGTLink_LIBRARY_DIRS}) endif() if(MITK_USE_SimpleITK) link_directories(${SimpleITK_LIBRARY_DIRS}) endif() if(MITK_USE_OpenCL) find_package(OpenCL REQUIRED) endif() # Qt support if(MITK_USE_Qt5) find_package(Qt5Core ${MITK_QT5_MINIMUM_VERSION} REQUIRED) # at least Core required get_target_property(_qmake_exec Qt5::qmake LOCATION) execute_process(COMMAND ${_qmake_exec} -query QT_INSTALL_BINS RESULT_VARIABLE _result OUTPUT_VARIABLE QT_BINARY_DIR ERROR_VARIABLE _error ) string(STRIP "${QT_BINARY_DIR}" QT_BINARY_DIR) if(_result OR NOT EXISTS "${QT_BINARY_DIR}") message(FATAL_ERROR "Could not determine Qt binary directory: ${_result} ${QT_BINARY_DIR} ${_error}") endif() find_program(QT_HELPGENERATOR_EXECUTABLE NAMES qhelpgenerator qhelpgenerator-qt5 qhelpgenerator5 PATHS ${QT_BINARY_DIR} NO_DEFAULT_PATH ) find_program(QT_COLLECTIONGENERATOR_EXECUTABLE NAMES qcollectiongenerator qcollectiongenerator-qt5 qcollectiongenerator5 PATHS ${QT_BINARY_DIR} NO_DEFAULT_PATH ) find_program(QT_ASSISTANT_EXECUTABLE NAMES assistant assistant-qt5 assistant5 PATHS ${QT_BINARY_DIR} NO_DEFAULT_PATH ) find_program(QT_XMLPATTERNS_EXECUTABLE NAMES xmlpatterns PATHS ${QT_BINARY_DIR} NO_DEFAULT_PATH ) mark_as_advanced(QT_HELPGENERATOR_EXECUTABLE QT_COLLECTIONGENERATOR_EXECUTABLE QT_ASSISTANT_EXECUTABLE QT_XMLPATTERNS_EXECUTABLE ) if(MITK_USE_BLUEBERRY) option(BLUEBERRY_USE_QT_HELP "Enable support for integrating plugin documentation into Qt Help" ${DOXYGEN_FOUND}) mark_as_advanced(BLUEBERRY_USE_QT_HELP) # Sanity checks for in-application BlueBerry plug-in help generation if(BLUEBERRY_USE_QT_HELP) set(_force_blueberry_use_qt_help_to_off 0) if(NOT DOXYGEN_FOUND) message("> Forcing BLUEBERRY_USE_QT_HELP to OFF because Doxygen was not found.") set(_force_blueberry_use_qt_help_to_off 1) endif() if(DOXYGEN_FOUND AND DOXYGEN_VERSION VERSION_LESS 1.8.7) message("> Forcing BLUEBERRY_USE_QT_HELP to OFF because Doxygen version 1.8.7 or newer not found.") set(_force_blueberry_use_qt_help_to_off 1) endif() if(NOT QT_HELPGENERATOR_EXECUTABLE) message("> Forcing BLUEBERRY_USE_QT_HELP to OFF because QT_HELPGENERATOR_EXECUTABLE is empty.") set(_force_blueberry_use_qt_help_to_off 1) endif() if(NOT MITK_USE_Qt5_WebEngine) message("> Forcing BLUEBERRY_USE_QT_HELP to OFF because MITK_USE_Qt5_WebEngine is OFF.") set(_force_blueberry_use_qt_help_to_off 1) endif() if(NOT QT_XMLPATTERNS_EXECUTABLE) message("You have enabled Qt Help support, but QT_XMLPATTERNS_EXECUTABLE is empty") set(_force_blueberry_use_qt_help_to_off 1) endif() if(_force_blueberry_use_qt_help_to_off) set(BLUEBERRY_USE_QT_HELP OFF CACHE BOOL "Enable support for integrating plugin documentation into Qt Help" FORCE) endif() endif() if(BLUEBERRY_QT_HELP_REQUIRED AND NOT BLUEBERRY_USE_QT_HELP) message(FATAL_ERROR "BLUEBERRY_USE_QT_HELP is required to be set to ON") endif() endif() endif() #----------------------------------------------------------------------------- # Testing #----------------------------------------------------------------------------- if(BUILD_TESTING) enable_testing() include(CTest) mark_as_advanced(TCL_TCLSH DART_ROOT) option(MITK_ENABLE_RENDERING_TESTING OFF "Enable the MITK rendering tests. Requires x-server in Linux.") #Rendering testing does not work for Linux nightlies, thus it is disabled per default #and activated for Mac and Windows. if(WIN32 OR APPLE) set(MITK_ENABLE_RENDERING_TESTING ON) endif() mark_as_advanced( MITK_ENABLE_RENDERING_TESTING ) # Setup file for setting custom ctest vars configure_file( CMake/CTestCustom.cmake.in ${MITK_BINARY_DIR}/CTestCustom.cmake @ONLY ) # Initial cache for ProjectTemplate and PluginGenerator tests configure_file( CMake/mitkTestInitialCache.txt.in ${MITK_BINARY_DIR}/mitkTestInitialCache.txt @ONLY ) # Configuration for the CMake-generated test driver set(CMAKE_TESTDRIVER_EXTRA_INCLUDES "#include ") set(CMAKE_TESTDRIVER_BEFORE_TESTMAIN " try {") set(CMAKE_TESTDRIVER_AFTER_TESTMAIN " } catch( std::exception & excp ) { fprintf(stderr,\"%s\\n\",excp.what()); return EXIT_FAILURE; } catch( ... ) { printf(\"Exception caught in the test driver\\n\"); return EXIT_FAILURE; } ") set(MITK_TEST_OUTPUT_DIR "${MITK_BINARY_DIR}/test_output") if(NOT EXISTS ${MITK_TEST_OUTPUT_DIR}) file(MAKE_DIRECTORY ${MITK_TEST_OUTPUT_DIR}) endif() # Test the external project template if(MITK_USE_BLUEBERRY) include(mitkTestProjectTemplate) endif() # Test the package target include(mitkPackageTest) endif() configure_file(mitkTestingConfig.h.in ${MITK_BINARY_DIR}/mitkTestingConfig.h) #----------------------------------------------------------------------------- # MITK_SUPERBUILD_BINARY_DIR #----------------------------------------------------------------------------- # If MITK_SUPERBUILD_BINARY_DIR isn't defined, it means MITK is *NOT* build using Superbuild. # In that specific case, MITK_SUPERBUILD_BINARY_DIR should default to MITK_BINARY_DIR if(NOT DEFINED MITK_SUPERBUILD_BINARY_DIR) set(MITK_SUPERBUILD_BINARY_DIR ${MITK_BINARY_DIR}) endif() #----------------------------------------------------------------------------- # Set C/CXX and linker flags for MITK code #----------------------------------------------------------------------------- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MITK_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${MITK_CXX_FLAGS_DEBUG}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MITK_CXX_FLAGS_RELEASE}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MITK_C_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${MITK_C_FLAGS_DEBUG}") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${MITK_C_FLAGS_RELEASE}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MITK_EXE_LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${MITK_SHARED_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${MITK_MODULE_LINKER_FLAGS}") #----------------------------------------------------------------------------- # Add custom targets representing CDash subprojects #----------------------------------------------------------------------------- foreach(subproject ${CTEST_PROJECT_SUBPROJECTS}) if(NOT TARGET ${subproject} AND NOT subproject MATCHES "Unlabeled") add_custom_target(${subproject}) endif() endforeach() #----------------------------------------------------------------------------- # Add subdirectories #----------------------------------------------------------------------------- add_subdirectory(Utilities) add_subdirectory(Modules) if(MITK_USE_BLUEBERRY) set(BLUEBERRY_XPDOC_OUTPUT_DIR ${MITK_DOXYGEN_OUTPUT_DIR}/html/extension-points/html/) set(MITK_DEFAULT_SUBPROJECTS MITK-Plugins) # Plug-in testing (needs some work to be enabled again) if(BUILD_TESTING) set(BLUEBERRY_UI_TEST_APP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CoreApp") if(TARGET CoreApp) get_target_property(_is_macosx_bundle CoreApp MACOSX_BUNDLE) if(APPLE AND _is_macosx_bundle) set(BLUEBERRY_UI_TEST_APP "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CoreApp.app/Contents/MacOS/CoreApp") endif() endif() set(BLUEBERRY_TEST_APP_ID "org.mitk.qt.coreapplication") endif() include("${CMAKE_CURRENT_SOURCE_DIR}/Plugins/PluginList.cmake") mitkFunctionWhitelistPlugins(MITK MITK_PLUGINS) set(mitk_plugins_fullpath "") foreach(mitk_plugin ${MITK_PLUGINS}) list(APPEND mitk_plugins_fullpath Plugins/${mitk_plugin}) endforeach() if(EXISTS ${MITK_PRIVATE_MODULES}/PluginList.cmake) include(${MITK_PRIVATE_MODULES}/PluginList.cmake) foreach(mitk_plugin ${MITK_PRIVATE_PLUGINS}) list(APPEND mitk_plugins_fullpath ${MITK_PRIVATE_MODULES}/${mitk_plugin}) endforeach() endif() if(MITK_BUILD_EXAMPLES) include("${CMAKE_CURRENT_SOURCE_DIR}/Examples/Plugins/PluginList.cmake") set(mitk_example_plugins_fullpath ) foreach(mitk_example_plugin ${MITK_EXAMPLE_PLUGINS}) list(APPEND mitk_example_plugins_fullpath Examples/Plugins/${mitk_example_plugin}) list(APPEND mitk_plugins_fullpath Examples/Plugins/${mitk_example_plugin}) endforeach() endif() # Specify which plug-ins belong to this project macro(GetMyTargetLibraries all_target_libraries varname) set(re_ctkplugin_mitk "^org_mitk_[a-zA-Z0-9_]+$") set(re_ctkplugin_bb "^org_blueberry_[a-zA-Z0-9_]+$") set(_tmp_list) list(APPEND _tmp_list ${all_target_libraries}) ctkMacroListFilter(_tmp_list re_ctkplugin_mitk re_ctkplugin_bb OUTPUT_VARIABLE ${varname}) endmacro() # Get infos about application directories and build options include("${CMAKE_CURRENT_SOURCE_DIR}/Applications/AppList.cmake") set(mitk_apps_fullpath ) foreach(mitk_app ${MITK_APPS}) # extract option_name string(REPLACE "^^" "\\;" target_info ${mitk_app}) set(target_info_list ${target_info}) list(GET target_info_list 0 directory_name) list(GET target_info_list 1 option_name) if(${option_name}) list(APPEND mitk_apps_fullpath "${CMAKE_CURRENT_SOURCE_DIR}/Applications/${directory_name}^^${option_name}") endif() endforeach() if (mitk_plugins_fullpath) ctkMacroSetupPlugins(${mitk_plugins_fullpath} BUILD_OPTION_PREFIX MITK_BUILD_ APPS ${mitk_apps_fullpath} BUILD_ALL ${MITK_BUILD_ALL_PLUGINS} COMPACT_OPTIONS) endif() set(MITK_PLUGIN_USE_FILE "${MITK_BINARY_DIR}/MitkPluginUseFile.cmake") if(${PROJECT_NAME}_PLUGIN_LIBRARIES) ctkFunctionGeneratePluginUseFile(${MITK_PLUGIN_USE_FILE}) else() file(REMOVE ${MITK_PLUGIN_USE_FILE}) set(MITK_PLUGIN_USE_FILE ) endif() endif() #----------------------------------------------------------------------------- # Documentation #----------------------------------------------------------------------------- if(DOXYGEN_FOUND) add_subdirectory(Documentation) endif() #----------------------------------------------------------------------------- # Installation #----------------------------------------------------------------------------- # set MITK cpack variables # These are the default variables, which can be overwritten ( see below ) include(mitkSetupCPack) set(use_default_config ON) # MITK_APPS is set in Applications/AppList.cmake (included somewhere above # if MITK_USE_BLUEBERRY is set to ON). if(MITK_APPS) set(activated_apps_no 0) list(LENGTH MITK_APPS app_count) # Check how many apps have been enabled # If more than one app has been activated, the we use the # default CPack configuration. Otherwise that apps configuration # will be used, if present. foreach(mitk_app ${MITK_APPS}) # extract option_name string(REPLACE "^^" "\\;" target_info ${mitk_app}) set(target_info_list ${target_info}) list(GET target_info_list 1 option_name) # check if the application is enabled if(${option_name} OR MITK_BUILD_ALL_APPS) MATH(EXPR activated_apps_no "${activated_apps_no} + 1") endif() endforeach() if(app_count EQUAL 1 AND (activated_apps_no EQUAL 1 OR MITK_BUILD_ALL_APPS)) # Corner case if there is only one app in total set(use_project_cpack ON) elseif(activated_apps_no EQUAL 1 AND NOT MITK_BUILD_ALL_APPS) # Only one app is enabled (no "build all" flag set) set(use_project_cpack ON) else() # Less or more then one app is enabled set(use_project_cpack OFF) endif() foreach(mitk_app ${MITK_APPS}) # extract target_dir and option_name string(REPLACE "^^" "\\;" target_info ${mitk_app}) set(target_info_list ${target_info}) list(GET target_info_list 0 target_dir) list(GET target_info_list 1 option_name) list(GET target_info_list 2 executable_name) # check if the application is enabled if(${option_name} OR MITK_BUILD_ALL_APPS) # check whether application specific configuration files will be used if(use_project_cpack) # use files if they exist if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/Applications/${target_dir}/CPackOptions.cmake") include("${CMAKE_CURRENT_SOURCE_DIR}/Applications/${target_dir}/CPackOptions.cmake") endif() if(EXISTS "${PROJECT_SOURCE_DIR}/Applications/${target_dir}/CPackConfig.cmake.in") set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/Applications/${target_dir}/CPackConfig.cmake") configure_file(${PROJECT_SOURCE_DIR}/Applications/${target_dir}/CPackConfig.cmake.in ${CPACK_PROJECT_CONFIG_FILE} @ONLY) set(use_default_config OFF) endif() endif() # add link to the list list(APPEND CPACK_CREATE_DESKTOP_LINKS "${executable_name}") endif() endforeach() endif() # if no application specific configuration file was used, use default if(use_default_config) configure_file(${MITK_SOURCE_DIR}/MITKCPackOptions.cmake.in ${MITK_BINARY_DIR}/MITKCPackOptions.cmake @ONLY) set(CPACK_PROJECT_CONFIG_FILE "${MITK_BINARY_DIR}/MITKCPackOptions.cmake") endif() # include CPack model once all variables are set include(CPack) # Additional installation rules include(mitkInstallRules) #----------------------------------------------------------------------------- # Last configuration steps #----------------------------------------------------------------------------- # ---------------- Export targets ----------------- set(MITK_EXPORTS_FILE "${MITK_BINARY_DIR}/MitkExports.cmake") file(REMOVE ${MITK_EXPORTS_FILE}) set(targets_to_export) get_property(module_targets GLOBAL PROPERTY MITK_MODULE_TARGETS) if(module_targets) list(APPEND targets_to_export ${module_targets}) endif() if(MITK_USE_BLUEBERRY) if(MITK_PLUGIN_LIBRARIES) list(APPEND targets_to_export ${MITK_PLUGIN_LIBRARIES}) endif() endif() export(TARGETS ${targets_to_export} APPEND FILE ${MITK_EXPORTS_FILE}) set(MITK_EXPORTED_TARGET_PROPERTIES ) foreach(target_to_export ${targets_to_export}) get_target_property(autoload_targets ${target_to_export} MITK_AUTOLOAD_TARGETS) if(autoload_targets) set(MITK_EXPORTED_TARGET_PROPERTIES "${MITK_EXPORTED_TARGET_PROPERTIES} set_target_properties(${target_to_export} PROPERTIES MITK_AUTOLOAD_TARGETS \"${autoload_targets}\")") endif() get_target_property(autoload_dir ${target_to_export} MITK_AUTOLOAD_DIRECTORY) if(autoload_dir) set(MITK_EXPORTED_TARGET_PROPERTIES "${MITK_EXPORTED_TARGET_PROPERTIES} set_target_properties(${target_to_export} PROPERTIES MITK_AUTOLOAD_DIRECTORY \"${autoload_dir}\")") endif() get_target_property(deprecated_module ${target_to_export} MITK_MODULE_DEPRECATED_SINCE) if(deprecated_module) set(MITK_EXPORTED_TARGET_PROPERTIES "${MITK_EXPORTED_TARGET_PROPERTIES} set_target_properties(${target_to_export} PROPERTIES MITK_MODULE_DEPRECATED_SINCE \"${deprecated_module}\")") endif() endforeach() # ---------------- External projects ----------------- get_property(MITK_ADDITIONAL_LIBRARY_SEARCH_PATHS_CONFIG GLOBAL PROPERTY MITK_ADDITIONAL_LIBRARY_SEARCH_PATHS) set(MITK_CONFIG_EXTERNAL_PROJECTS ) #string(REPLACE "^^" ";" _mitk_external_projects ${MITK_EXTERNAL_PROJECTS}) foreach(ep ${MITK_EXTERNAL_PROJECTS}) get_property(_components GLOBAL PROPERTY MITK_${ep}_COMPONENTS) set(MITK_CONFIG_EXTERNAL_PROJECTS "${MITK_CONFIG_EXTERNAL_PROJECTS} set(MITK_USE_${ep} ${MITK_USE_${ep}}) set(MITK_${ep}_DIR \"${${ep}_DIR}\") set(MITK_${ep}_COMPONENTS ${_components}) ") endforeach() foreach(ep ${MITK_EXTERNAL_PROJECTS}) get_property(_package GLOBAL PROPERTY MITK_${ep}_PACKAGE) get_property(_components GLOBAL PROPERTY MITK_${ep}_COMPONENTS) if(_components) set(_components_arg COMPONENTS \${_components}) else() set(_components_arg) endif() if(_package) set(MITK_CONFIG_EXTERNAL_PROJECTS "${MITK_CONFIG_EXTERNAL_PROJECTS} if(MITK_USE_${ep}) set(${ep}_DIR \${MITK_${ep}_DIR}) if(MITK_${ep}_COMPONENTS) mitkMacroFindDependency(${_package} COMPONENTS \${MITK_${ep}_COMPONENTS}) else() mitkMacroFindDependency(${_package}) endif() endif()") endif() endforeach() # ---------------- Tools ----------------- configure_file(${MITK_SOURCE_DIR}/CMake/ToolExtensionITKFactory.cpp.in ${MITK_BINARY_DIR}/ToolExtensionITKFactory.cpp.in COPYONLY) configure_file(${MITK_SOURCE_DIR}/CMake/ToolExtensionITKFactoryLoader.cpp.in ${MITK_BINARY_DIR}/ToolExtensionITKFactoryLoader.cpp.in COPYONLY) configure_file(${MITK_SOURCE_DIR}/CMake/ToolGUIExtensionITKFactory.cpp.in ${MITK_BINARY_DIR}/ToolGUIExtensionITKFactory.cpp.in COPYONLY) # ---------------- Configure files ----------------- configure_file(mitkVersion.h.in ${MITK_BINARY_DIR}/mitkVersion.h) configure_file(mitkConfig.h.in ${MITK_BINARY_DIR}/mitkConfig.h) set(IPFUNC_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/ipFunc) set(UTILITIES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities) configure_file(mitkConfig.h.in ${MITK_BINARY_DIR}/mitkConfig.h) configure_file(MITKConfig.cmake.in ${MITK_BINARY_DIR}/MITKConfig.cmake @ONLY) write_basic_config_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake VERSION ${MITK_VERSION_STRING} COMPATIBILITY AnyNewerVersion) #----------------------------------------------------------------------------- # MITK Applications #----------------------------------------------------------------------------- # This must come after MITKConfig.h was generated, since applications # might do a find_package(MITK REQUIRED). add_subdirectory(Applications) #----------------------------------------------------------------------------- # MITK Examples #----------------------------------------------------------------------------- if(MITK_BUILD_EXAMPLES) # This must come after MITKConfig.h was generated, since applications # might do a find_package(MITK REQUIRED). add_subdirectory(Examples) endif() #----------------------------------------------------------------------------- # Print configuration summary #----------------------------------------------------------------------------- message("\n\n") feature_summary( DESCRIPTION "------- FEATURE SUMMARY FOR ${PROJECT_NAME} -------" WHAT ALL ) diff --git a/Modules/DeformableRegistration/CMakeLists.txt b/Modules/DeformableRegistration/CMakeLists.txt deleted file mode 100644 index 0c6bd23af8..0000000000 --- a/Modules/DeformableRegistration/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -MITK_CREATE_MODULE( - SUBPROJECTS MITK-Registration - DEPENDS MitkRigidRegistration - PACKAGE_DEPENDS PUBLIC ITK|ITKPDEDeformableRegistration -) - -add_subdirectory(Testing) diff --git a/Modules/DeformableRegistration/Testing/CMakeLists.txt b/Modules/DeformableRegistration/Testing/CMakeLists.txt deleted file mode 100644 index 153cd81e2e..0000000000 --- a/Modules/DeformableRegistration/Testing/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -MITK_CREATE_MODULE_TESTS() diff --git a/Modules/DeformableRegistration/Testing/files.cmake b/Modules/DeformableRegistration/Testing/files.cmake deleted file mode 100644 index 8dab4479ca..0000000000 --- a/Modules/DeformableRegistration/Testing/files.cmake +++ /dev/null @@ -1,5 +0,0 @@ -set(MODULE_TESTS - mitkDemonsRegistrationTest.cpp - mitkHistogramMatchingTest.cpp - mitkSymmetricForcesDemonsRegistrationTest.cpp -) \ No newline at end of file diff --git a/Modules/DeformableRegistration/Testing/mitkDemonsRegistrationTest.cpp b/Modules/DeformableRegistration/Testing/mitkDemonsRegistrationTest.cpp deleted file mode 100644 index 0626bbc855..0000000000 --- a/Modules/DeformableRegistration/Testing/mitkDemonsRegistrationTest.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkDemonsRegistration.h" -#include "mitkImage.h" -#include "mitkImageWriteAccessor.h" - -int mitkDemonsRegistrationTest(int /*argc*/, char * /*argv*/ []) -{ - // Create Image out of nowhere - mitk::Image::Pointer image; - mitk::PixelType pt(mitk::MakeScalarPixelType()); - unsigned int dim[] = {100, 100, 20}; - - std::cout << "Creating image: "; - image = mitk::Image::New(); - // image->DebugOn(); - image->Initialize(mitk::MakeScalarPixelType(), 3, dim); - - try - { - mitk::ImageWriteAccessor imgB(image); - int *p = (int *)imgB.GetData(); - - int size = dim[0] * dim[1] * dim[2]; - int i; - for (i = 0; i < size; ++i, ++p) - *p = i; - std::cout << "[PASSED]" << std::endl; - } - catch (mitk::Exception &e) - { - // we don't have image access, set test to failed - std::cout << "[FAILED] creation of the image" << std::endl; - return EXIT_FAILURE; - } - - // Create second Image out of nowhere - mitk::Image::Pointer image2; - mitk::PixelType pt2(mitk::MakeScalarPixelType()); - unsigned int dim2[] = {100, 100, 20}; - - std::cout << "Creating image: "; - image2 = mitk::Image::New(); - // image->DebugOn(); - image2->Initialize(mitk::MakeScalarPixelType(), 3, dim2); - - try - { - mitk::ImageWriteAccessor imgB(image2); - int *p2 = (int *)imgB.GetData(); - - int size2 = dim2[0] * dim2[1] * dim2[2]; - int i2; - for (i2 = 0; i2 < size2; ++i2, ++p2) - *p2 = i2; - std::cout << "[PASSED]" << std::endl; - } - catch (mitk::Exception &e) - { - // we don't have image access, set test to failed - std::cout << "[FAILED] creation of the image2" << std::endl; - return EXIT_FAILURE; - } - - std::cout << "Constructor: "; - mitk::DemonsRegistration::Pointer demonsRegistration = mitk::DemonsRegistration::New(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set Reference Image: "; - demonsRegistration->SetReferenceImage(image); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set Moving Image: "; - demonsRegistration->SetInput(image2); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set number of iterations: "; - demonsRegistration->SetNumberOfIterations(5); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set standard deviation: "; - demonsRegistration->SetStandardDeviation(1.0); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set save deformation field: "; - demonsRegistration->SetSaveDeformationField(false); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set deformation field file name: "; - demonsRegistration->SetDeformationFieldFileName("TestField.mhd"); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set save result image: "; - demonsRegistration->SetSaveResult(false); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set result image file name: "; - demonsRegistration->SetResultFileName("TestResult.mhd"); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Perform registration: "; - demonsRegistration->Update(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Get the result image: "; - mitk::Image::Pointer resultImage = demonsRegistration->GetOutput(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Get the deformation field: "; - itk::Image, 3>::Pointer deformationField = demonsRegistration->GetDeformationField(); - std::cout << "[PASSED]" << std::endl; - - return EXIT_SUCCESS; -} diff --git a/Modules/DeformableRegistration/Testing/mitkHistogramMatchingTest.cpp b/Modules/DeformableRegistration/Testing/mitkHistogramMatchingTest.cpp deleted file mode 100644 index 05234de8e3..0000000000 --- a/Modules/DeformableRegistration/Testing/mitkHistogramMatchingTest.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkHistogramMatching.h" -#include "mitkImage.h" -#include "mitkImageWriteAccessor.h" - -int mitkHistogramMatchingTest(int /*argc*/, char * /*argv*/ []) -{ - // Create Image out of nowhere - mitk::Image::Pointer image; - mitk::PixelType pt(mitk::MakeScalarPixelType()); - unsigned int dim[] = {100, 100, 20}; - - std::cout << "Creating image: "; - image = mitk::Image::New(); - // image->DebugOn(); - image->Initialize(mitk::MakeScalarPixelType(), 3, dim); - - try - { - mitk::ImageWriteAccessor imgB(image); - int *p = (int *)imgB.GetData(); - - int size = dim[0] * dim[1] * dim[2]; - int i; - for (i = 0; i < size; ++i, ++p) - *p = i; - std::cout << "[PASSED]" << std::endl; - } - catch (const mitk::Exception &) - { - // we don't have image access, set test to failed - std::cout << "[FAILED] creation of the image" << std::endl; - return EXIT_FAILURE; - } - - // Create second Image out of nowhere - mitk::Image::Pointer image2; - mitk::PixelType pt2(mitk::MakeScalarPixelType()); - unsigned int dim2[] = {100, 100, 20}; - - std::cout << "Creating image: "; - image2 = mitk::Image::New(); - // image->DebugOn(); - image2->Initialize(mitk::MakeScalarPixelType(), 3, dim2); - - try - { - mitk::ImageWriteAccessor imgB(image2); - int *p2 = (int *)imgB.GetData(); - - int size2 = dim2[0] * dim2[1] * dim2[2]; - int i2; - for (i2 = 0; i2 < size2; ++i2, ++p2) - *p2 = i2; - std::cout << "[PASSED]" << std::endl; - } - catch (const mitk::Exception &) - { - // we don't have image access, set test to failed - std::cout << "[FAILED] creation of the image" << std::endl; - return EXIT_FAILURE; - } - - std::cout << "Constructor: "; - mitk::HistogramMatching::Pointer histogramMatching = mitk::HistogramMatching::New(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set Reference Image: "; - histogramMatching->SetReferenceImage(image); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set Moving Image: "; - histogramMatching->SetInput(image2); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set number of match points: "; - histogramMatching->SetNumberOfMatchPoints(100); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set number of histogram levels: "; - histogramMatching->SetNumberOfHistogramLevels(8); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set threshold at mean intensity: "; - histogramMatching->SetThresholdAtMeanIntensity(true); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Perform histogram matching: "; - histogramMatching->Update(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Get the result image: "; - mitk::Image::Pointer histimage = histogramMatching->GetOutput(); - std::cout << "[PASSED]" << std::endl; - - return EXIT_SUCCESS; -} diff --git a/Modules/DeformableRegistration/Testing/mitkSymmetricForcesDemonsRegistrationTest.cpp b/Modules/DeformableRegistration/Testing/mitkSymmetricForcesDemonsRegistrationTest.cpp deleted file mode 100644 index 6104ec2e05..0000000000 --- a/Modules/DeformableRegistration/Testing/mitkSymmetricForcesDemonsRegistrationTest.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkImage.h" -#include "mitkImageWriteAccessor.h" -#include "mitkSymmetricForcesDemonsRegistration.h" - -int mitkSymmetricForcesDemonsRegistrationTest(int /*argc*/, char * /*argv*/ []) -{ - // Create Image out of nowhere - mitk::Image::Pointer image; - mitk::PixelType pt(mitk::MakeScalarPixelType()); - unsigned int dim[] = {100, 100, 20}; - - std::cout << "Creating image: "; - image = mitk::Image::New(); - // image->DebugOn(); - image->Initialize(mitk::MakeScalarPixelType(), 3, dim); - - try - { - mitk::ImageWriteAccessor imgB(image); - int *p = (int *)imgB.GetData(); - int size = dim[0] * dim[1] * dim[2]; - int i; - for (i = 0; i < size; ++i, ++p) - *p = i; - std::cout << "[PASSED]" << std::endl; - } - catch (mitk::Exception &e) - { - // we don't have image access, set test to failed - std::cout << "[FAILED] creation of the image" << std::endl; - return EXIT_FAILURE; - } - - // Create second Image out of nowhere - mitk::Image::Pointer image2; - mitk::PixelType pt2(mitk::MakeScalarPixelType()); - unsigned int dim2[] = {100, 100, 20}; - - std::cout << "Creating image: "; - image2 = mitk::Image::New(); - // image->DebugOn(); - image2->Initialize(mitk::MakeScalarPixelType(), 3, dim2); - - try - { - mitk::ImageWriteAccessor imgB(image2); - int *p2 = (int *)imgB.GetData(); - int size2 = dim2[0] * dim2[1] * dim2[2]; - int i2; - for (i2 = 0; i2 < size2; ++i2, ++p2) - *p2 = i2; - - std::cout << "[PASSED]" << std::endl; - } - catch (mitk::Exception &e) - { - // we don't have image access, set test to failed - std::cout << "[FAILED] creation of the image2" << std::endl; - return EXIT_FAILURE; - } - - std::cout << "Constructor: "; - mitk::SymmetricForcesDemonsRegistration::Pointer symmetricForcesDemonsRegistration = - mitk::SymmetricForcesDemonsRegistration::New(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set Reference Image: "; - symmetricForcesDemonsRegistration->SetReferenceImage(image); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set Moving Image: "; - symmetricForcesDemonsRegistration->SetInput(image2); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set number of iterations: "; - symmetricForcesDemonsRegistration->SetNumberOfIterations(5); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set standard deviation: "; - symmetricForcesDemonsRegistration->SetStandardDeviation(1.0); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set save deformation field: "; - symmetricForcesDemonsRegistration->SetSaveDeformationField(false); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set deformation field file name: "; - symmetricForcesDemonsRegistration->SetDeformationFieldFileName("TestField.mhd"); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set save result image: "; - symmetricForcesDemonsRegistration->SetSaveResult(false); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Set result image file name: "; - symmetricForcesDemonsRegistration->SetResultFileName("TestResult.mhd"); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Perform registration: "; - symmetricForcesDemonsRegistration->Update(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Get the result image: "; - mitk::Image::Pointer resultImage = symmetricForcesDemonsRegistration->GetOutput(); - std::cout << "[PASSED]" << std::endl; - - std::cout << "Get the deformation field: "; - itk::Image, 3>::Pointer deformationField = - symmetricForcesDemonsRegistration->GetDeformationField(); - std::cout << "[PASSED]" << std::endl; - - return EXIT_SUCCESS; -} diff --git a/Modules/DeformableRegistration/files.cmake b/Modules/DeformableRegistration/files.cmake deleted file mode 100644 index b466cea186..0000000000 --- a/Modules/DeformableRegistration/files.cmake +++ /dev/null @@ -1,7 +0,0 @@ -set(CPP_FILES - mitkBSplineRegistration.cpp - mitkDemonsRegistration.cpp - mitkSymmetricForcesDemonsRegistration.cpp - mitkRegistrationBase.cpp - mitkHistogramMatching.cpp -) \ No newline at end of file diff --git a/Modules/DeformableRegistration/itkBSplineDeformableTransformInitializer.h b/Modules/DeformableRegistration/itkBSplineDeformableTransformInitializer.h deleted file mode 100644 index 7990b02e76..0000000000 --- a/Modules/DeformableRegistration/itkBSplineDeformableTransformInitializer.h +++ /dev/null @@ -1,122 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef __itkBSplineDeformableTransformInitializer_h -#define __itkBSplineDeformableTransformInitializer_h - -#include "itkObject.h" -#include "itkObjectFactory.h" - -#include - -namespace itk -{ - /** \class BSplineDeformableTransformInitializer - * \brief BSplineDeformableTransformInitializer is a helper class intended to - * initialize the grid parameters of a BSplineDeformableTransform based on the - * parameters of an image. - * - * In the context of image registration, the image to be used are reference will - * be the fixed image. The BSpline grid will use the fixed image as a base for - * computing the grid spacing, orientation and origin, among other things. - * - * - * \ingroup Transforms - */ - template - class ITK_EXPORT BSplineDeformableTransformInitializer : public Object - { - public: - /** Standard class typedefs. */ - typedef BSplineDeformableTransformInitializer Self; - typedef Object Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; - - /** New macro for creation of through a Smart Pointer. */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /** Run-time type information (and related methods). */ - itkTypeMacro(BSplineDeformableTransformInitializer, Object); - - /** Type of the transform to initialize */ - typedef TTransform TransformType; - - /** Types defined from transform traits */ - typedef typename TransformType::Pointer TransformPointer; - typedef typename TransformType::RegionType TransformRegionType; - typedef typename TransformRegionType::SizeType TransformSizeType; - - /** Dimension of parameters. */ - itkStaticConstMacro(SpaceDimension, unsigned int, TransformType::InputSpaceDimension); - - /** Image Types to use in the initialization of the transform */ - typedef TImage ImageType; - typedef typename ImageType::ConstPointer ImagePointer; - - /** Set the transform to be initialized */ - itkSetObjectMacro(Transform, TransformType); - - /** Set the fixed image used in the registration process */ - itkSetConstObjectMacro(Image, ImageType); - - /** Set the number of grid nodes that we want to place inside the image. This - * method will override the settings of any previous call to - * SetNumberOfGridNodesInsideTheImage().*/ - itkSetMacro(GridSizeInsideTheImage, TransformSizeType); - - /** Set the number of grid nodes that we want to place inside the image. This - * number of node is used along one dimension of the image. Therefore, if - * you pass the number 5 as argument of this method, in a 3D space, then the - * total number of grid nodes inside the image will be \$ 5 x 5 x 5 \$ . - * This method will override the settings of any previous call to - * SetGridSizeInsideTheImage().*/ - void SetNumberOfGridNodesInsideTheImage(unsigned int numberOfNodes) - { - this->m_GridSizeInsideTheImage.Fill(numberOfNodes); - this->Modified(); - } - - /** Initialize the transform using data from the images */ - virtual void InitializeTransform() const; - - protected: - BSplineDeformableTransformInitializer(); - ~BSplineDeformableTransformInitializer(){}; - - void PrintSelf(std::ostream &os, Indent indent) const override; - - private: - BSplineDeformableTransformInitializer(const Self &); // purposely not implemented - void operator=(const Self &); // purposely not implemented - - TransformPointer m_Transform; - - ImagePointer m_Image; - - TransformSizeType m_GridSizeInsideTheImage; - - unsigned int m_NumberOfGridNodesInsideTheImage; - - }; // class BSplineDeformableTransformInitializer - -} // namespace itk - -#ifndef ITK_MANUAL_INSTANTIATION -#include "itkBSplineDeformableTransformInitializer.txx" -#endif - -#endif /* __itkBSplineDeformableTransformInitializer_h */ diff --git a/Modules/DeformableRegistration/itkBSplineDeformableTransformInitializer.txx b/Modules/DeformableRegistration/itkBSplineDeformableTransformInitializer.txx deleted file mode 100644 index 060b9b06e7..0000000000 --- a/Modules/DeformableRegistration/itkBSplineDeformableTransformInitializer.txx +++ /dev/null @@ -1,146 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -/*=================================================================== - -This file is based heavily on a corresponding ITK filter. - -===================================================================*/ - -#ifndef __itkBSplineDeformableTransformInitializer_txx -#define __itkBSplineDeformableTransformInitializer_txx - -#include "itkBSplineDeformableTransformInitializer.h" - -namespace itk -{ - template - BSplineDeformableTransformInitializer::BSplineDeformableTransformInitializer() - { - this->m_GridSizeInsideTheImage.Fill(5); - } - - template - void BSplineDeformableTransformInitializer::InitializeTransform() const - { - // Sanity check - if (!this->m_Image) - { - itkExceptionMacro("Reference Image has not been set"); - return; - } - - if (!this->m_Transform) - { - itkExceptionMacro("Transform has not been set"); - return; - } - - // If the image come from a filter, then update that filter. - if (this->m_Image->GetSource()) - { - this->m_Image->GetSource()->Update(); - } - - typedef typename TransformType::RegionType RegionType; - - typename RegionType::SizeType numberOfGridNodesOutsideTheImageSupport; - typename RegionType::SizeType totalGridSize; - - numberOfGridNodesOutsideTheImageSupport.Fill(TransformType::SplineOrder); - - totalGridSize = this->m_GridSizeInsideTheImage; - totalGridSize += numberOfGridNodesOutsideTheImageSupport; - - RegionType gridRegion; - gridRegion.SetSize(totalGridSize); - - typedef typename TransformType::SpacingType SpacingType; - const SpacingType &imageSpacing = this->m_Image->GetSpacing(); - - typedef typename TransformType::OriginType OriginType; - const OriginType &imageOrigin = this->m_Image->GetOrigin(); - ; - - const typename TransformType::RegionType &imageRegion = this->m_Image->GetLargestPossibleRegion(); - - typename ImageType::SizeType fixedImageSize = imageRegion.GetSize(); - - SpacingType gridSpacing; - SpacingType gridOriginShift; - - const unsigned int orderShift = TransformType::SplineOrder / 2; - - for (unsigned int r = 0; r < SpaceDimension; r++) - { - const unsigned int numberOfGridCells = this->m_GridSizeInsideTheImage[r] - 1; - const unsigned int numberOfImagePixels = fixedImageSize[r]; - - gridSpacing[r] = - imageSpacing[r] * static_cast(numberOfImagePixels) / static_cast(numberOfGridCells); - - // Shift half image pixel to cover the image support - const double imageSupportShift = -imageSpacing[r] / 2.0; - - // Shift by the number of extra grid cells required by - // the BSpline order. - const double gridSupportShift = -1.0 * gridSpacing[r] * orderShift; - - // Combine both shifts. They are both aligned with the coordinate - // system of the grid. Direction has not been considered so far. - gridOriginShift[r] = gridSupportShift + imageSupportShift; - } - - typename ImageType::DirectionType gridDirection = this->m_Image->GetDirection(); - SpacingType gridOriginOffset = gridDirection * gridOriginShift; - - OriginType gridOrigin = imageOrigin + gridOriginOffset; - - this->m_Transform->SetGridRegion(gridRegion); - this->m_Transform->SetGridOrigin(gridOrigin); - this->m_Transform->SetGridSpacing(gridSpacing); - this->m_Transform->SetGridDirection(gridDirection); - } - - template - void BSplineDeformableTransformInitializer::PrintSelf(std::ostream &os, Indent indent) const - { - Superclass::PrintSelf(os, indent); - - os << indent << "Transform = " << std::endl; - if (this->m_Transform) - { - os << indent << this->m_Transform << std::endl; - } - else - { - os << indent << "None" << std::endl; - } - - os << indent << "Image = " << std::endl; - if (this->m_Image) - { - os << indent << this->m_Image << std::endl; - } - else - { - os << indent << "None" << std::endl; - } - } - -} // namespace itk - -#endif diff --git a/Modules/DeformableRegistration/mitkBSplineRegistration.cpp b/Modules/DeformableRegistration/mitkBSplineRegistration.cpp deleted file mode 100644 index d4c876624b..0000000000 --- a/Modules/DeformableRegistration/mitkBSplineRegistration.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include - -#include "itkImageFileWriter.h" -#include "itkImageRegionIterator.h" -#include "itkWarpImageFilter.h" - -#include "itkBSplineDeformableTransform.h" -#include "mitkBSplineRegistration.h" -//#include "itkLBFGSOptimizer.h" -#include "itkImageRegistrationMethod.h" -#include "itkMattesMutualInformationImageToImageMetric.h" -#include "itkMeanSquaresImageToImageMetric.h" -#include "itkResampleImageFilter.h" - -#include "itkBSplineDeformableTransformInitializer.h" - -#include "mitkMetricFactory.h" -#include "mitkOptimizerFactory.h" - -#include -#include - -namespace mitk -{ - BSplineRegistration::BSplineRegistration() - : m_Iterations(50), - m_ResultName("deformedImage.mhd"), - m_SaveResult(true), - m_SaveDeformationField(false), - m_UpdateInputImage(false), - m_MatchHistograms(true), - m_Metric(0) - { - m_Observer = mitk::RigidRegistrationObserver::New(); - } - - BSplineRegistration::~BSplineRegistration() {} - void BSplineRegistration::SetNumberOfIterations(int iterations) { m_Iterations = iterations; } - void BSplineRegistration::SetSaveResult(bool saveResult) { m_SaveResult = saveResult; } - void BSplineRegistration::SetResultFileName(const char *resultName) { m_ResultName = resultName; } - template - void BSplineRegistration::GenerateData2(const itk::Image *itkImage1) - { - std::cout << "start bspline registration" << std::endl; - - // Typedefs - typedef typename itk::Image InternalImageType; - - typedef typename itk::Vector VectorPixelType; - typedef typename itk::Image DeformationFieldType; - - typedef itk::BSplineDeformableTransform TransformType; - - typedef typename TransformType::ParametersType ParametersType; - - // typedef itk::LBFGSOptimizer OptimizerType; - typedef itk::SingleValuedNonLinearOptimizer OptimizerType; - // typedef itk::SingleValuedCostFunction MetricType; - - typedef itk::MattesMutualInformationImageToImageMetric MetricType; - - typedef itk::MeanSquaresImageToImageMetric MetricTypeMS; - - typedef itk::LinearInterpolateImageFunction InterpolatorType; - - typedef itk::ImageRegistrationMethod RegistrationType; - - typedef typename itk::WarpImageFilter WarperType; - - typedef typename TransformType::SpacingType SpacingType; - - typedef typename TransformType::OriginType OriginType; - - typedef itk::ResampleImageFilter ResampleFilterType; - - typedef itk::Image OutputImageType; - - // Sample new image with the same image type as the fixed image - typedef itk::CastImageFilter CastFilterType; - - typedef itk::Vector VectorType; - typedef itk::Image DeformationFieldType; - - typedef itk::BSplineDeformableTransformInitializer InitializerType; - - typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); - typename RegistrationType::Pointer registration = RegistrationType::New(); - typename InitializerType::Pointer initializer = InitializerType::New(); - typename TransformType::Pointer transform = TransformType::New(); - - if (m_Metric == 0 || m_Metric == 1) - { - typename MetricType::Pointer metric = MetricType::New(); - metric->SetNumberOfHistogramBins(32); - metric->SetNumberOfSpatialSamples(90000); - registration->SetMetric(metric); - } - else - { - typename MetricTypeMS::Pointer metric = MetricTypeMS::New(); - registration->SetMetric(metric); - } - - typename OptimizerFactory::Pointer optFac = OptimizerFactory::New(); - optFac->SetOptimizerParameters(m_OptimizerParameters); - optFac->SetNumberOfTransformParameters(transform->GetNumberOfParameters()); - OptimizerType::Pointer optimizer = optFac->GetOptimizer(); - - optimizer->AddObserver(itk::AnyEvent(), m_Observer); - - // typedef mitk::MetricFactory MetricFactoryType; - // typename MetricFactoryType::Pointer metricFac = MetricFactoryType::New(); - // metricFac->SetMetricParameters(m_MetricParameters); - ////MetricType::Pointer metric = metricFac->GetMetric(); - - typename InternalImageType::Pointer fixedImage = InternalImageType::New(); - mitk::CastToItkImage(m_ReferenceImage, fixedImage); - typename InternalImageType::ConstPointer movingImage = itkImage1; - typename InternalImageType::RegionType fixedRegion = fixedImage->GetBufferedRegion(); - typename InternalImageType::RegionType movingRegion = movingImage->GetBufferedRegion(); - - if (m_MatchHistograms) - { - typedef itk::RescaleIntensityImageFilter FilterType; - typedef itk::HistogramMatchingImageFilter HEFilterType; - - typename FilterType::Pointer inputRescaleFilter = FilterType::New(); - typename FilterType::Pointer referenceRescaleFilter = FilterType::New(); - - referenceRescaleFilter->SetInput(fixedImage); - inputRescaleFilter->SetInput(movingImage); - - TPixel desiredMinimum = 0; - TPixel desiredMaximum = 255; - - referenceRescaleFilter->SetOutputMinimum(desiredMinimum); - referenceRescaleFilter->SetOutputMaximum(desiredMaximum); - referenceRescaleFilter->UpdateLargestPossibleRegion(); - inputRescaleFilter->SetOutputMinimum(desiredMinimum); - inputRescaleFilter->SetOutputMaximum(desiredMaximum); - inputRescaleFilter->UpdateLargestPossibleRegion(); - - // Histogram match the images - typename HEFilterType::Pointer intensityEqualizeFilter = HEFilterType::New(); - - intensityEqualizeFilter->SetReferenceImage(inputRescaleFilter->GetOutput()); - intensityEqualizeFilter->SetInput(referenceRescaleFilter->GetOutput()); - intensityEqualizeFilter->SetNumberOfHistogramLevels(64); - intensityEqualizeFilter->SetNumberOfMatchPoints(12); - intensityEqualizeFilter->ThresholdAtMeanIntensityOn(); - intensityEqualizeFilter->Update(); - - // fixedImage = referenceRescaleFilter->GetOutput(); - // movingImage = IntensityEqualizeFilter->GetOutput(); - - fixedImage = intensityEqualizeFilter->GetOutput(); - movingImage = inputRescaleFilter->GetOutput(); - } - - // - registration->SetOptimizer(optimizer); - registration->SetInterpolator(interpolator); - registration->SetFixedImage(fixedImage); - registration->SetMovingImage(movingImage); - registration->SetFixedImageRegion(fixedRegion); - - initializer->SetTransform(transform); - initializer->SetImage(fixedImage); - initializer->SetNumberOfGridNodesInsideTheImage(m_NumberOfGridPoints); - initializer->InitializeTransform(); - - registration->SetTransform(transform); - - const unsigned int numberOfParameters = transform->GetNumberOfParameters(); - - typename itk::BSplineDeformableTransform::ParametersType parameters; - - parameters.set_size(numberOfParameters); - parameters.Fill(0.0); - transform->SetParameters(parameters); - - // We now pass the parameters of the current transform as the initial - // parameters to be used when the registration process starts. - registration->SetInitialTransformParameters(transform->GetParameters()); - - std::cout << "Intial Parameters = " << std::endl; - std::cout << transform->GetParameters() << std::endl; - - std::cout << std::endl << "Starting Registration" << std::endl; - - try - { - double tstart(clock()); - registration->Update(); - double time = clock() - tstart; - time = time / CLOCKS_PER_SEC; - MITK_INFO << "Registration time: " << time; - } - catch (itk::ExceptionObject &err) - { - std::cerr << "ExceptionObject caught !" << std::endl; - std::cerr << err << std::endl; - } - - typename OptimizerType::ParametersType finalParameters = registration->GetLastTransformParameters(); - - std::cout << "Last Transform Parameters" << std::endl; - std::cout << finalParameters << std::endl; - - transform->SetParameters(finalParameters); - - /* - ResampleFilterType::Pointer resampler = ResampleFilterType::New(); - resampler->SetTransform( transform ); - resampler->SetInput( movingImage ); - resampler->SetSize( fixedImage->GetLargestPossibleRegion().GetSize() ); - resampler->SetOutputOrigin( fixedImage->GetOrigin() ); - resampler->SetOutputSpacing( fixedImage->GetSpacing() ); - resampler->SetOutputDirection( fixedImage->GetDirection() ); - resampler->SetDefaultPixelValue( 100 ); - resampler->SetInterpolator( interpolator); - resampler->Update();*/ - - // Generate deformation field - typename DeformationFieldType::Pointer field = DeformationFieldType::New(); - field->SetRegions(movingRegion); - field->SetOrigin(movingImage->GetOrigin()); - field->SetSpacing(movingImage->GetSpacing()); - field->SetDirection(movingImage->GetDirection()); - field->Allocate(); - - typedef itk::ImageRegionIterator FieldIterator; - FieldIterator fi(field, movingRegion); - fi.GoToBegin(); - - typename TransformType::InputPointType fixedPoint; - typename TransformType::OutputPointType movingPoint; - typename DeformationFieldType::IndexType index; - - VectorType displacement; - - while (!fi.IsAtEnd()) - { - index = fi.GetIndex(); - field->TransformIndexToPhysicalPoint(index, fixedPoint); - movingPoint = transform->TransformPoint(fixedPoint); - displacement = movingPoint - fixedPoint; - fi.Set(displacement); - ++fi; - } - - // Use the deformation field to warp the moving image - typename WarperType::Pointer warper = WarperType::New(); - warper->SetInput(movingImage); - warper->SetInterpolator(interpolator); - warper->SetOutputSpacing(movingImage->GetSpacing()); - warper->SetOutputOrigin(movingImage->GetOrigin()); - warper->SetOutputDirection(movingImage->GetDirection()); - warper->SetDisplacementField(field); - warper->Update(); - - typename InternalImageType::Pointer result = warper->GetOutput(); - - if (m_UpdateInputImage) - { - Image::Pointer outputImage = this->GetOutput(); - mitk::CastToMitkImage(result, outputImage); - } - - // Save the deformationfield resulting from the registration - if (m_SaveDeformationField) - { - typedef itk::ImageFileWriter FieldWriterType; - typename FieldWriterType::Pointer fieldWriter = FieldWriterType::New(); - - fieldWriter->SetInput(field); - - fieldWriter->SetFileName(m_DeformationFileName); - try - { - fieldWriter->Update(); - } - catch (itk::ExceptionObject &excp) - { - std::cerr << "Exception thrown " << std::endl; - std::cerr << excp << std::endl; - // return EXIT_FAILURE; - } - } - } -} // end namespace diff --git a/Modules/DeformableRegistration/mitkBSplineRegistration.h b/Modules/DeformableRegistration/mitkBSplineRegistration.h deleted file mode 100644 index 820e212fee..0000000000 --- a/Modules/DeformableRegistration/mitkBSplineRegistration.h +++ /dev/null @@ -1,138 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKBSPLINEREGISTRATION_H -#define MITKBSPLINEREGISTRATION_H - -#include "MitkDeformableRegistrationExports.h" -#include "mitkImageAccessByItk.h" -#include "mitkRegistrationBase.h" -#include -//#include -#include "mitkRigidRegistrationObserver.h" - -namespace mitk -{ - /*! - \brief This class performes a b-spline registration between two images. - - \ingroup DeformableRegistration - - \author Thomas van Bruggen - */ - - class MITKDEFORMABLEREGISTRATION_EXPORT BSplineRegistration : public RegistrationBase - { - public: - mitkClassMacro(BSplineRegistration, RegistrationBase); - - /*! - * \brief Method for creation through the object factory. - */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /*! - * \brief Sets the number of iterations which will be performed during the registration process. - */ - void SetNumberOfIterations(int iterations); - - /*! - * \brief Sets whether the result should be saved or not. - */ - void SetSaveResult(bool saveResult); - - /*! - * \brief Sets the filename for the resulting deformed image. - */ - void SetResultFileName(const char *resultName); - - /*! - * \brief Starts the B-Spline registration. - */ - virtual void GenerateData() override - { - if (this->GetInput()) - { - AccessByItk(this->GetInput(), GenerateData2); - } - } - - /*! - \brief Set the optimizer parameters - */ - - void SetOptimizerParameters(mitk::OptimizerParameters::Pointer optimizerParameters) - { - m_OptimizerParameters = optimizerParameters; - } - - /* void SetMetricParameters(mitk::MetricParameters::Pointer metricParameters) - { - m_MetricParameters = metricParameters; - }*/ - - /* void SetParameters(mitk::OptimizerParameters::Pointer optimizerParameters, mitk::MetricParameters::Pointer - metricParameters) - { - m_OptimizerParameters = optimizerParameters; - m_MetricParameters = metricParameters; - }*/ - - itkSetMacro(NumberOfGridPoints, int); - itkSetMacro(SaveDeformationField, bool); - itkSetMacro(UpdateInputImage, bool); - itkSetMacro(DeformationFileName, std::string); - itkSetMacro(Metric, int); - itkSetMacro(MatchHistograms, bool); - - protected: - /*! - * \brief Default constructor - */ - BSplineRegistration(); - - /*! - * \brief Default destructor - */ - virtual ~BSplineRegistration(); - - /*! - * \brief Template class to perform the demons registration with any kind of image. Called by GenerateData(). - */ - template - void GenerateData2(const itk::Image *itkImage1); - - int m_Iterations; - const char *m_ResultName; - bool m_SaveResult; - - mitk::OptimizerParameters::Pointer m_OptimizerParameters; - // mitk::MetricParameters::Pointer m_MetricParameters; - - int m_NumberOfGridPoints; - bool m_SaveDeformationField; - bool m_UpdateInputImage; - std::string m_DeformationFileName; - - bool m_MatchHistograms; - - int m_Metric; - - RigidRegistrationObserver::Pointer m_Observer; - }; -} - -#endif // MITKDEMONSREGISTRATION_H diff --git a/Modules/DeformableRegistration/mitkDemonsRegistration.cpp b/Modules/DeformableRegistration/mitkDemonsRegistration.cpp deleted file mode 100644 index a03f1b16fb..0000000000 --- a/Modules/DeformableRegistration/mitkDemonsRegistration.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include - -#include "itkImageFileWriter.h" -#include "itkImageRegionIterator.h" -#include "itkWarpImageFilter.h" - -#include "mitkDemonsRegistration.h" - -namespace mitk -{ - DemonsRegistration::DemonsRegistration() - : m_Iterations(50), - m_StandardDeviation(1.0), - m_FieldName("newField.mhd"), - m_ResultName("deformedImage.mhd"), - m_SaveField(true), - m_SaveResult(true), - m_DeformationField(nullptr) - { - } - - DemonsRegistration::~DemonsRegistration() {} - void DemonsRegistration::SetNumberOfIterations(int iterations) { m_Iterations = iterations; } - void DemonsRegistration::SetStandardDeviation(float deviation) { m_StandardDeviation = deviation; } - void DemonsRegistration::SetSaveDeformationField(bool saveField) { m_SaveField = saveField; } - void DemonsRegistration::SetDeformationFieldFileName(const char *fieldName) { m_FieldName = fieldName; } - void DemonsRegistration::SetSaveResult(bool saveResult) { m_SaveResult = saveResult; } - void DemonsRegistration::SetResultFileName(const char *resultName) { m_ResultName = resultName; } - itk::Image, 3>::Pointer DemonsRegistration::GetDeformationField() { return m_DeformationField; } - template - void DemonsRegistration::GenerateData2(const itk::Image *itkImage1) - { - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - - typedef float InternalPixelType; - typedef typename itk::Image InternalImageType; - typedef typename itk::CastImageFilter FixedImageCasterType; - typedef typename itk::CastImageFilter MovingImageCasterType; - typedef typename itk::Image InternalImageType; - typedef typename itk::Vector VectorPixelType; - typedef typename itk::Image DeformationFieldType; - typedef typename itk::DemonsRegistrationFilter - RegistrationFilterType; - typedef typename itk::WarpImageFilter WarperType; - typedef typename itk::LinearInterpolateImageFunction InterpolatorType; - - typedef TPixel OutputPixelType; - typedef typename itk::Image OutputImageType; - typedef typename itk::CastImageFilter CastFilterType; - typedef typename itk::ImageFileWriter WriterType; - typedef typename itk::ImageFileWriter FieldWriterType; - - typename FixedImageType::Pointer fixedImage = FixedImageType::New(); - mitk::CastToItkImage(m_ReferenceImage, fixedImage); - typename MovingImageType::ConstPointer movingImage = itkImage1; - - if (fixedImage.IsNotNull() && movingImage.IsNotNull()) - { - typename RegistrationFilterType::Pointer filter = RegistrationFilterType::New(); - - this->AddStepsToDo(4); - typename itk::ReceptorMemberCommand::Pointer command = - itk::ReceptorMemberCommand::New(); - command->SetCallbackFunction(this, &DemonsRegistration::SetProgress); - filter->AddObserver(itk::IterationEvent(), command); - - typename FixedImageCasterType::Pointer fixedImageCaster = FixedImageCasterType::New(); - fixedImageCaster->SetInput(fixedImage); - filter->SetFixedImage(fixedImageCaster->GetOutput()); - typename MovingImageCasterType::Pointer movingImageCaster = MovingImageCasterType::New(); - movingImageCaster->SetInput(movingImage); - filter->SetMovingImage(movingImageCaster->GetOutput()); - filter->SetNumberOfIterations(m_Iterations); - filter->SetStandardDeviations(m_StandardDeviation); - filter->Update(); - - typename WarperType::Pointer warper = WarperType::New(); - typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); - - warper->SetInput(movingImage); - warper->SetInterpolator(interpolator); - warper->SetOutputSpacing(fixedImage->GetSpacing()); - warper->SetOutputOrigin(fixedImage->GetOrigin()); - warper->SetOutputDirection(fixedImage->GetDirection()); - warper->SetDisplacementField(filter->GetOutput()); - warper->Update(); - Image::Pointer outputImage = this->GetOutput(); - mitk::CastToMitkImage(warper->GetOutput(), outputImage); - - typename WriterType::Pointer writer = WriterType::New(); - typename CastFilterType::Pointer caster = CastFilterType::New(); - - writer->SetFileName(m_ResultName); - - caster->SetInput(warper->GetOutput()); - writer->SetInput(caster->GetOutput()); - if (m_SaveResult) - { - writer->Update(); - } - - if (VImageDimension == 2) - { - typedef DeformationFieldType VectorImage2DType; - typedef typename DeformationFieldType::PixelType Vector2DType; - - typename VectorImage2DType::ConstPointer vectorImage2D = filter->GetOutput(); - - typename VectorImage2DType::RegionType region2D = vectorImage2D->GetBufferedRegion(); - typename VectorImage2DType::IndexType index2D = region2D.GetIndex(); - typename VectorImage2DType::SizeType size2D = region2D.GetSize(); - - typedef typename itk::Vector Vector3DType; - typedef typename itk::Image VectorImage3DType; - - typedef typename itk::ImageFileWriter WriterType; - - typename WriterType::Pointer writer3D = WriterType::New(); - - typename VectorImage3DType::Pointer vectorImage3D = VectorImage3DType::New(); - - typename VectorImage3DType::RegionType region3D; - typename VectorImage3DType::IndexType index3D; - typename VectorImage3DType::SizeType size3D; - - index3D[0] = index2D[0]; - index3D[1] = index2D[1]; - index3D[2] = 0; - - size3D[0] = size2D[0]; - size3D[1] = size2D[1]; - size3D[2] = 1; - - region3D.SetSize(size3D); - region3D.SetIndex(index3D); - - typename VectorImage2DType::SpacingType spacing2D = vectorImage2D->GetSpacing(); - typename VectorImage3DType::SpacingType spacing3D; - - spacing3D[0] = spacing2D[0]; - spacing3D[1] = spacing2D[1]; - spacing3D[2] = 1.0; - - vectorImage3D->SetSpacing(spacing3D); - - vectorImage3D->SetRegions(region3D); - vectorImage3D->Allocate(); - - typedef typename itk::ImageRegionConstIterator Iterator2DType; - - typedef typename itk::ImageRegionIterator Iterator3DType; - - Iterator2DType it2(vectorImage2D, region2D); - Iterator3DType it3(vectorImage3D, region3D); - - it2.GoToBegin(); - it3.GoToBegin(); - - Vector2DType vector2D; - Vector3DType vector3D; - - vector3D[2] = 0; // set Z component to zero. - - while (!it2.IsAtEnd()) - { - vector2D = it2.Get(); - vector3D[0] = vector2D[0]; - vector3D[1] = vector2D[1]; - it3.Set(vector3D); - ++it2; - ++it3; - } - - writer3D->SetInput(vectorImage3D); - m_DeformationField = vectorImage3D; - - writer3D->SetFileName(m_FieldName); - - try - { - if (m_SaveField) - { - writer3D->Update(); - } - } - catch (itk::ExceptionObject &excp) - { - MITK_ERROR << excp << std::endl; - } - } - else - { - typename FieldWriterType::Pointer fieldwriter = FieldWriterType::New(); - fieldwriter->SetFileName(m_FieldName); - fieldwriter->SetInput(filter->GetOutput()); - m_DeformationField = (itk::Image, 3> *)(filter->GetOutput()); - if (m_SaveField) - { - fieldwriter->Update(); - } - } - this->SetRemainingProgress(4); - } - } -} // end namespace diff --git a/Modules/DeformableRegistration/mitkDemonsRegistration.h b/Modules/DeformableRegistration/mitkDemonsRegistration.h deleted file mode 100644 index 59436f44e0..0000000000 --- a/Modules/DeformableRegistration/mitkDemonsRegistration.h +++ /dev/null @@ -1,119 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKDEMONSREGISTRATION_H -#define MITKDEMONSREGISTRATION_H - -#include "MitkDeformableRegistrationExports.h" -#include "itkDemonsRegistrationFilter.h" - -#include "mitkImageAccessByItk.h" -#include "mitkRegistrationBase.h" - -namespace mitk -{ - /*! - \brief This class performes a demons registration between two images with the same modality.. - - \ingroup DeformableRegistration - - \author Daniel Stein - */ - - class MITKDEFORMABLEREGISTRATION_EXPORT DemonsRegistration : public RegistrationBase - { - public: - mitkClassMacro(DemonsRegistration, RegistrationBase); - - /*! - * \brief Method for creation through the object factory. - */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /*! - * \brief Sets the number of iterations which will be performed during the registration process. - */ - void SetNumberOfIterations(int iterations); - - /*! - * \brief Sets the standard deviation used by the demons registration. - */ - void SetStandardDeviation(float deviation); - - /*! - * \brief Sets whether the resulting deformation field should be saved or not. - */ - void SetSaveDeformationField(bool saveField); - - /*! - * \brief Sets the filename for the resulting deformation field. - */ - void SetDeformationFieldFileName(const char *fieldName); - - /*! - * \brief Sets whether the result should be saved or not. - */ - void SetSaveResult(bool saveResult); - - /*! - * \brief Sets the filename for the resulting deformed image. - */ - void SetResultFileName(const char *resultName); - - /*! - * \brief Returns the deformation field, which results by the registration. - */ - itk::Image, 3>::Pointer GetDeformationField(); - - /*! - * \brief Starts the demons registration. - */ - virtual void GenerateData() override - { - if (this->GetInput()) - { - AccessByItk(this->GetInput(), GenerateData2); - } - } - - protected: - /*! - * \brief Default constructor - */ - DemonsRegistration(); - - /*! - * \brief Default destructor - */ - virtual ~DemonsRegistration(); - - /*! - * \brief Template class to perform the demons registration with any kind of image. Called by GenerateData(). - */ - template - void GenerateData2(const itk::Image *itkImage1); - - int m_Iterations; - float m_StandardDeviation; - const char *m_FieldName; - const char *m_ResultName; - bool m_SaveField; - bool m_SaveResult; - itk::Image, 3>::Pointer m_DeformationField; - }; -} - -#endif // MITKDEMONSREGISTRATION_H diff --git a/Modules/DeformableRegistration/mitkHistogramMatching.cpp b/Modules/DeformableRegistration/mitkHistogramMatching.cpp deleted file mode 100644 index 379ee31584..0000000000 --- a/Modules/DeformableRegistration/mitkHistogramMatching.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkHistogramMatching.h" - -#include - -namespace mitk -{ - HistogramMatching::HistogramMatching() - { - m_ThresholdAtMeanIntensity = true; - m_NumberOfHistogramLevels = 1024; - m_NumberOfMatchPoints = 7; - } - - HistogramMatching::~HistogramMatching() {} - void HistogramMatching::SetNumberOfHistogramLevels(int histogrammLevels) - { - m_NumberOfHistogramLevels = histogrammLevels; - } - - void HistogramMatching::SetNumberOfMatchPoints(int matchPoints) { m_NumberOfMatchPoints = matchPoints; } - void HistogramMatching::SetThresholdAtMeanIntensity(bool on) { m_ThresholdAtMeanIntensity = on; } - template - void HistogramMatching::GenerateData2(const itk::Image *itkImage1) - { - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - - typedef float InternalPixelType; - typedef typename itk::Image InternalImageType; - typedef typename itk::CastImageFilter FixedImageCasterType; - typedef typename itk::CastImageFilter MovingImageCasterType; - typedef typename itk::HistogramMatchingImageFilter MatchingFilterType; - - typename FixedImageType::Pointer fixedImage = FixedImageType::New(); - mitk::CastToItkImage(m_ReferenceImage, fixedImage); - typename MovingImageType::ConstPointer movingImage = itkImage1; - if (fixedImage.IsNotNull() && movingImage.IsNotNull()) - { - typename FixedImageCasterType::Pointer fixedImageCaster = FixedImageCasterType::New(); - fixedImageCaster->SetInput(fixedImage); - typename MovingImageCasterType::Pointer movingImageCaster = MovingImageCasterType::New(); - movingImageCaster->SetInput(movingImage); - typename MatchingFilterType::Pointer matcher = MatchingFilterType::New(); - matcher->SetInput(movingImageCaster->GetOutput()); - matcher->SetReferenceImage(fixedImageCaster->GetOutput()); - matcher->SetNumberOfHistogramLevels(m_NumberOfHistogramLevels); - matcher->SetNumberOfMatchPoints(m_NumberOfMatchPoints); - matcher->SetThresholdAtMeanIntensity(m_ThresholdAtMeanIntensity); - matcher->Update(); - Image::Pointer outputImage = this->GetOutput(); - mitk::CastToMitkImage(matcher->GetOutput(), outputImage); - } - } -} // end namespace diff --git a/Modules/DeformableRegistration/mitkHistogramMatching.h b/Modules/DeformableRegistration/mitkHistogramMatching.h deleted file mode 100644 index c4483f59f0..0000000000 --- a/Modules/DeformableRegistration/mitkHistogramMatching.h +++ /dev/null @@ -1,96 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKHISTOGRAMMATCHING_H -#define MITKHISTOGRAMMATCHING_H - -#include "MitkDeformableRegistrationExports.h" -#include "itkHistogramMatchingImageFilter.h" - -#include "mitkImageAccessByItk.h" -#include "mitkRegistrationBase.h" - -namespace mitk -{ - /*! - \brief This class performes a histogram matching between the fixed image and moving image to improve the registration - results. - - \ingroup DeformableRegistration - - \author Daniel Stein - */ - - class MITKDEFORMABLEREGISTRATION_EXPORT HistogramMatching : public RegistrationBase - { - public: - mitkClassMacro(HistogramMatching, RegistrationBase); - - /*! - * \brief Method for creation through the object factory. - */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /*! - * \brief Sets the number of match points for the histogram generation. - */ - void SetNumberOfMatchPoints(int matchPoints); - - /*! - * \brief Sets the number of histogram levels for the histogram generation. - */ - void SetNumberOfHistogramLevels(int histogrammLevels); - - /*! - * \brief Sets whether a threshold at mean intensity should be used for the histogram generation. - */ - void SetThresholdAtMeanIntensity(bool on); - - /*! - * \brief Starts the histogram matching. - */ - virtual void GenerateData() override - { - if (this->GetInput()) - { - AccessByItk(this->GetInput(), GenerateData2); - } - } - - protected: - /*! - * \brief Default constructor - */ - HistogramMatching(); - - /*! - * \brief Default destructor - */ - virtual ~HistogramMatching(); - - /*! - * \brief Template class to perform the histogram matching with any kind of image. Called by GenerateData(). - */ - template - void GenerateData2(const itk::Image *itkImage1); - - bool m_ThresholdAtMeanIntensity; - int m_NumberOfHistogramLevels; - int m_NumberOfMatchPoints; - }; - -} // end namespace -#endif // MITKHISTOGRAMMATCHING_H diff --git a/Modules/DeformableRegistration/mitkRegistrationBase.cpp b/Modules/DeformableRegistration/mitkRegistrationBase.cpp deleted file mode 100644 index 63e8e032d0..0000000000 --- a/Modules/DeformableRegistration/mitkRegistrationBase.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkRegistrationBase.h" -#include "mitkProgressBar.h" - -namespace mitk -{ - RegistrationBase::RegistrationBase() { m_ReferenceImage = Image::New(); } - RegistrationBase::~RegistrationBase() {} - void RegistrationBase::SetReferenceImage(Image::Pointer fixedImage) - { - m_ReferenceImage = fixedImage; - SetNthInput(1, m_ReferenceImage); - Modified(); - } - - void RegistrationBase::SetProgress(const itk::EventObject &) - { - ProgressBar::GetInstance()->AddStepsToDo(1); - ProgressBar::GetInstance()->Progress(); - } - - void RegistrationBase::AddStepsToDo(int steps) { ProgressBar::GetInstance()->AddStepsToDo(steps); } - void RegistrationBase::SetRemainingProgress(int steps) { ProgressBar::GetInstance()->Progress(steps); } -} diff --git a/Modules/DeformableRegistration/mitkRegistrationBase.h b/Modules/DeformableRegistration/mitkRegistrationBase.h deleted file mode 100644 index d7834c1cd6..0000000000 --- a/Modules/DeformableRegistration/mitkRegistrationBase.h +++ /dev/null @@ -1,82 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKREGISTRATIONBASE_H -#define MITKREGISTRATIONBASE_H - -#include "MitkDeformableRegistrationExports.h" -#include "mitkImageToImageFilter.h" - -namespace mitk -{ - /*! - \brief This class handles the images for the registration as well as taking care of the progress bar during the - registration process. - It is the base class for the registration classes. - - \ingroup DeformableRegistration - - \author Daniel Stein - */ - - class MITKDEFORMABLEREGISTRATION_EXPORT RegistrationBase : public ImageToImageFilter - { - public: - mitkClassMacro(RegistrationBase, ImageToImageFilter); - - /*! - * \brief Method for creation through the object factory. - */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /*! - * \brief Sets the reference image (fixed image) for the registration. - */ - virtual void SetReferenceImage(Image::Pointer fixedImage); - - protected: - /*! - * \brief Default constructor - */ - RegistrationBase(); - - /*! - * \brief Default destructor - */ - virtual ~RegistrationBase(); - - /*! - * \brief Adds steps to the progress bar, which will be done with AddStepsToDo(int steps) and - * SetRemainingProgress(int steps) - */ - virtual void AddStepsToDo(int steps); - - /*! - * \brief Sets one step of progress to the progress bar - */ - virtual void SetProgress(const itk::EventObject &); - - /*! - * \brief Sets the remaining progress to the progress bar - */ - virtual void SetRemainingProgress(int steps); - - Image::Pointer m_ReferenceImage; - }; - -} // namespace mitk - -#endif // MITKREGISTRATIONBASE_H diff --git a/Modules/DeformableRegistration/mitkSymmetricForcesDemonsRegistration.cpp b/Modules/DeformableRegistration/mitkSymmetricForcesDemonsRegistration.cpp deleted file mode 100644 index 264f608446..0000000000 --- a/Modules/DeformableRegistration/mitkSymmetricForcesDemonsRegistration.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include - -#include "itkImageFileWriter.h" -#include "itkWarpImageFilter.h" - -#include "itkInverseDisplacementFieldImageFilter.h" - -#include "mitkSymmetricForcesDemonsRegistration.h" - -namespace mitk -{ - SymmetricForcesDemonsRegistration::SymmetricForcesDemonsRegistration() - : m_Iterations(50), - m_StandardDeviation(1.0), - m_FieldName("newField.mhd"), - m_ResultName("deformedImage.mhd"), - m_SaveField(true), - m_SaveResult(true), - m_DeformationField(nullptr) - { - } - - SymmetricForcesDemonsRegistration::~SymmetricForcesDemonsRegistration() {} - void SymmetricForcesDemonsRegistration::SetNumberOfIterations(int iterations) { m_Iterations = iterations; } - void SymmetricForcesDemonsRegistration::SetStandardDeviation(float deviation) { m_StandardDeviation = deviation; } - void SymmetricForcesDemonsRegistration::SetSaveDeformationField(bool saveField) { m_SaveField = saveField; } - void SymmetricForcesDemonsRegistration::SetDeformationFieldFileName(const char *fieldName) - { - m_FieldName = fieldName; - } - - void SymmetricForcesDemonsRegistration::SetSaveResult(bool saveResult) { m_SaveResult = saveResult; } - void SymmetricForcesDemonsRegistration::SetResultFileName(const char *resultName) { m_ResultName = resultName; } - itk::Image, 3>::Pointer SymmetricForcesDemonsRegistration::GetDeformationField() - { - return m_DeformationField; - } - - template - void SymmetricForcesDemonsRegistration::GenerateData2(const itk::Image *itkImage1) - { - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - - typedef float InternalPixelType; - typedef typename itk::Image InternalImageType; - typedef typename itk::CastImageFilter FixedImageCasterType; - typedef typename itk::CastImageFilter MovingImageCasterType; - typedef typename itk::Vector VectorPixelType; - typedef typename itk::Image DeformationFieldType; - typedef - typename itk::SymmetricForcesDemonsRegistrationFilter - RegistrationFilterType; - typedef typename itk::WarpImageFilter WarperType; - typedef typename itk::LinearInterpolateImageFunction InterpolatorType; - - typedef TPixel OutputPixelType; - typedef typename itk::Image OutputImageType; - typedef typename itk::CastImageFilter CastFilterType; - typedef typename itk::ImageFileWriter WriterType; - typedef typename itk::ImageFileWriter FieldWriterType; - - typename FixedImageType::Pointer fixedImage = FixedImageType::New(); - mitk::CastToItkImage(m_ReferenceImage, fixedImage); - typename MovingImageType::ConstPointer movingImage = itkImage1; - - if (fixedImage.IsNotNull() && movingImage.IsNotNull()) - { - typename RegistrationFilterType::Pointer filter = RegistrationFilterType::New(); - - this->AddStepsToDo(4); - itk::ReceptorMemberCommand::Pointer command = - itk::ReceptorMemberCommand::New(); - command->SetCallbackFunction(this, &SymmetricForcesDemonsRegistration::SetProgress); - filter->AddObserver(itk::IterationEvent(), command); - - typename FixedImageCasterType::Pointer fixedImageCaster = FixedImageCasterType::New(); - fixedImageCaster->SetInput(fixedImage); - filter->SetFixedImage(fixedImageCaster->GetOutput()); - typename MovingImageCasterType::Pointer movingImageCaster = MovingImageCasterType::New(); - movingImageCaster->SetInput(movingImage); - filter->SetMovingImage(movingImageCaster->GetOutput()); - filter->SetNumberOfIterations(m_Iterations); - filter->SetStandardDeviations(m_StandardDeviation); - filter->Update(); - - typename WarperType::Pointer warper = WarperType::New(); - typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); - - warper->SetInput(movingImage); - warper->SetInterpolator(interpolator); - warper->SetOutputSpacing(fixedImage->GetSpacing()); - warper->SetOutputOrigin(fixedImage->GetOrigin()); - warper->SetDisplacementField(filter->GetOutput()); - warper->Update(); - typename WriterType::Pointer writer = WriterType::New(); - typename CastFilterType::Pointer caster = CastFilterType::New(); - - writer->SetFileName(m_ResultName); - - caster->SetInput(warper->GetOutput()); - writer->SetInput(caster->GetOutput()); - if (m_SaveResult) - { - writer->Update(); - } - Image::Pointer outputImage = this->GetOutput(); - mitk::CastToMitkImage(warper->GetOutput(), outputImage); - - if (VImageDimension == 2) - { - typedef DeformationFieldType VectorImage2DType; - typedef typename DeformationFieldType::PixelType Vector2DType; - - typename VectorImage2DType::ConstPointer vectorImage2D = filter->GetOutput(); - - typename VectorImage2DType::RegionType region2D = vectorImage2D->GetBufferedRegion(); - typename VectorImage2DType::IndexType index2D = region2D.GetIndex(); - typename VectorImage2DType::SizeType size2D = region2D.GetSize(); - - typedef typename itk::Vector Vector3DType; - typedef typename itk::Image VectorImage3DType; - - typedef typename itk::ImageFileWriter WriterType; - - WriterType::Pointer writer3D = WriterType::New(); - - VectorImage3DType::Pointer vectorImage3D = VectorImage3DType::New(); - - VectorImage3DType::RegionType region3D; - VectorImage3DType::IndexType index3D; - VectorImage3DType::SizeType size3D; - - index3D[0] = index2D[0]; - index3D[1] = index2D[1]; - index3D[2] = 0; - - size3D[0] = size2D[0]; - size3D[1] = size2D[1]; - size3D[2] = 1; - - region3D.SetSize(size3D); - region3D.SetIndex(index3D); - - typename VectorImage2DType::SpacingType spacing2D = vectorImage2D->GetSpacing(); - VectorImage3DType::SpacingType spacing3D; - - spacing3D[0] = spacing2D[0]; - spacing3D[1] = spacing2D[1]; - spacing3D[2] = 1.0; - - vectorImage3D->SetSpacing(spacing3D); - - vectorImage3D->SetRegions(region3D); - vectorImage3D->Allocate(); - - typedef typename itk::ImageRegionConstIterator Iterator2DType; - - typedef typename itk::ImageRegionIterator Iterator3DType; - - Iterator2DType it2(vectorImage2D, region2D); - Iterator3DType it3(vectorImage3D, region3D); - - it2.GoToBegin(); - it3.GoToBegin(); - - Vector2DType vector2D; - Vector3DType vector3D; - - vector3D[2] = 0; // set Z component to zero. - - while (!it2.IsAtEnd()) - { - vector2D = it2.Get(); - vector3D[0] = vector2D[0]; - vector3D[1] = vector2D[1]; - it3.Set(vector3D); - ++it2; - ++it3; - } - - writer3D->SetInput(vectorImage3D); - m_DeformationField = vectorImage3D; - - writer3D->SetFileName(m_FieldName); - - try - { - if (m_SaveField) - { - writer3D->Update(); - } - } - catch (itk::ExceptionObject &excp) - { - MITK_ERROR << excp << std::endl; - } - } - else - { - typename FieldWriterType::Pointer fieldwriter = FieldWriterType::New(); - fieldwriter->SetFileName(m_FieldName); - fieldwriter->SetInput(filter->GetOutput()); - // m_DeformationField = filter->GetOutput(); - m_DeformationField = (itk::Image, 3> *)(filter->GetOutput()); // see BUG #3732 - if (m_SaveField) - { - fieldwriter->Update(); - } - } - this->SetRemainingProgress(4); - } - } -} // end namespace diff --git a/Modules/DeformableRegistration/mitkSymmetricForcesDemonsRegistration.h b/Modules/DeformableRegistration/mitkSymmetricForcesDemonsRegistration.h deleted file mode 100644 index 8574e450a8..0000000000 --- a/Modules/DeformableRegistration/mitkSymmetricForcesDemonsRegistration.h +++ /dev/null @@ -1,120 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKSYMMETRICFORCESDEMONSREGISTRATION_H -#define MITKSYMMETRICFORCESDEMONSREGISTRATION_H - -#include "MitkDeformableRegistrationExports.h" -#include "itkSymmetricForcesDemonsRegistrationFilter.h" - -#include "mitkImageAccessByItk.h" -#include "mitkRegistrationBase.h" - -namespace mitk -{ - /*! - \brief This class performes a symmetric forces demons registration between two images with the same modality. - - \ingroup DeformableRegistration - - \author Daniel Stein - */ - - class MITKDEFORMABLEREGISTRATION_EXPORT SymmetricForcesDemonsRegistration : public RegistrationBase - { - public: - mitkClassMacro(SymmetricForcesDemonsRegistration, RegistrationBase); - - /*! - * \brief Method for creation through the object factory. - */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /*! - * \brief Sets the number of iterations which will be performed during the registration process. - */ - void SetNumberOfIterations(int iterations); - - /*! - * \brief Sets the standard deviation used by the symmetric forces demons registration. - */ - void SetStandardDeviation(float deviation); - - /*! - * \brief Sets whether the resulting deformation field should be saved or not. - */ - void SetSaveDeformationField(bool saveField); - - /*! - * \brief Sets the filename for the resulting deformation field. - */ - void SetDeformationFieldFileName(const char *fieldName); - - /*! - * \brief Sets whether the result should be saved or not. - */ - void SetSaveResult(bool saveResult); - - /*! - * \brief Sets the filename for the resulting deformed image. - */ - void SetResultFileName(const char *resultName); - - /*! - * \brief Returns the deformation field, which results by the registration. - */ - itk::Image, 3>::Pointer GetDeformationField(); - - /*! - * \brief Starts the symmetric forces demons registration. - */ - virtual void GenerateData() override - { - if (this->GetInput()) - { - AccessByItk(this->GetInput(), GenerateData2); - } - } - - protected: - /*! - * \brief Default constructor - */ - SymmetricForcesDemonsRegistration(); - - /*! - * \brief Default destructor - */ - virtual ~SymmetricForcesDemonsRegistration(); - - /*! - * \brief Template class to perform the symmetric forces demons registration with any kind of image. Called by - * GenerateData(). - */ - template - void GenerateData2(const itk::Image *itkImage1); - - int m_Iterations; - float m_StandardDeviation; - const char *m_FieldName; - const char *m_ResultName; - bool m_SaveField; - bool m_SaveResult; - itk::Image, 3>::Pointer m_DeformationField; - }; -} - -#endif // MITKSYMMETRICFORCESDEMONSREGISTRATION_H diff --git a/Modules/DeformableRegistrationUI/CMakeLists.txt b/Modules/DeformableRegistrationUI/CMakeLists.txt deleted file mode 100644 index 5c1db39d4a..0000000000 --- a/Modules/DeformableRegistrationUI/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -MITK_CREATE_MODULE( - SUBPROJECTS MITK-Registration - DEPENDS MitkQtWidgets MitkDeformableRegistration -) diff --git a/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationView.cpp b/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationView.cpp deleted file mode 100644 index df50cad512..0000000000 --- a/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationView.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkBSplineRegistrationView.h" -#include "itkImageFileReader.h" -#include "itkRegularStepGradientDescentOptimizer.h" -#include "mitkBSplineRegistration.h" -#include "ui_QmitkBSplineRegistrationViewControls.h" -#include -#include -#include -#include -#include -#include -#include -#include - -typedef itk::Vector VectorType; -typedef itk::Image DeformationFieldType; - -typedef itk::ImageFileReader ImageReaderType; - -QmitkBSplineRegistrationView::QmitkBSplineRegistrationView(QWidget *parent, Qt::WindowFlags f) - : QWidget(parent, f), m_FixedNode(nullptr), m_MovingNode(nullptr) -{ - m_Controls.setupUi(parent); - - QObject::connect( - (QObject *)(m_Controls.m_PrintDeformField), SIGNAL(clicked()), (QObject *)this, SLOT(PrintDeformationField())); - - QObject::connect((QObject *)(m_Controls.m_BrowseDeformationField), - SIGNAL(clicked()), - (QObject *)this, - SLOT(SelectDeformationField())); - - connect(m_Controls.m_OptimizerSelector, - SIGNAL(activated(int)), - m_Controls.m_OptimizerWidgetStack, - SLOT(setCurrentIndex(int))); - connect(m_Controls.m_OptimizerSelector, SIGNAL(activated(int)), this, SLOT(OptimizerSelected(int))); -} - -QmitkBSplineRegistrationView::~QmitkBSplineRegistrationView() -{ -} - -void QmitkBSplineRegistrationView::OptimizerSelected(int optimizer) -{ - HideAllOptimizerFrames(); - if (optimizer == 0) - { - m_Controls.m_LBFGSFrame->show(); - } - else if (optimizer == 1) - { - m_Controls.m_GradientDescentFrame->show(); - } -} - -void QmitkBSplineRegistrationView::HideAllOptimizerFrames() -{ - m_Controls.m_LBFGSFrame->hide(); - m_Controls.m_GradientDescentFrame->hide(); -} - -void QmitkBSplineRegistrationView::SelectDeformationField() -{ - // SELECT FOLDER DIALOG - QFileDialog *w = new QFileDialog(this, "Select Deformation Field"); - w->setFileMode(QFileDialog::ExistingFiles); - w->setNameFilter("Images (*.mhd)"); - w->setDirectory("G:\\home\\vanbrugg\\testimages\\deformable"); - - // RETRIEVE SELECTION - if (w->exec() != QDialog::Accepted) - { - return; - cout << "Failed to load" << endl; - } - - QStringList filenames = w->selectedFiles(); - QStringList::Iterator it = filenames.begin(); - if (it != filenames.end()) - { - std::string filename = (*it).toStdString(); - ++it; - QString qStr = QString(filename.c_str()); - m_Controls.m_DeformationField->setText(qStr); - } -} - -void QmitkBSplineRegistrationView::PrintDeformationField() -{ - ImageReaderType::Pointer reader = ImageReaderType::New(); - reader->SetFileName(m_Controls.m_DeformationField->text().toStdString()); - reader->Update(); - - DeformationFieldType::Pointer deformationField = reader->GetOutput(); - - typedef itk::ImageRegionIterator IteratorType; - IteratorType deformIter(deformationField, deformationField->GetRequestedRegion()); - - for (deformIter.GoToBegin(); !deformIter.IsAtEnd(); ++deformIter) - { - std::cout << deformIter.Get() << std::endl; - } -} - -void QmitkBSplineRegistrationView::CalculateTransformation() -{ - if (m_FixedNode != nullptr && m_MovingNode != nullptr) - { - mitk::Image::Pointer fimage = dynamic_cast(m_FixedNode->GetData()); - mitk::Image::Pointer mimage = dynamic_cast(m_MovingNode->GetData()); - - mitk::BSplineRegistration::Pointer registration = mitk::BSplineRegistration::New(); - - registration->SetSaveResult(false); - registration->SetReferenceImage(fimage); - registration->SetInput(mimage); - - // Read out optimizer parameters from the interface - setOptimizerParameters(); - - registration->SetNumberOfGridPoints(m_Controls.m_NumberOfGridNodes->text().toInt()); - registration->SetOptimizerParameters(m_OptimizerParameters); - registration->SetUpdateInputImage(true); - - if (m_Controls.m_SaveDeformFieldCheck->isChecked()) - { - // Set some parameters to save the deformation field - registration->SetSaveDeformationField(true); - registration->SetDeformationFileName(m_Controls.m_DeformationField->text().toStdString()); - } - - try - { - registration->Update(); - } - catch (itk::ExceptionObject &excpt) - { - QMessageBox::information(this, "Registration exception", excpt.GetDescription(), QMessageBox::Ok); - } - - mitk::Image::Pointer image = registration->GetOutput(); - - if (image.IsNotNull()) - { - m_MovingNode->SetData(image); - mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); - mitk::LevelWindow levelWindow; - levelWindow.SetAuto(image); - levWinProp->SetLevelWindow(levelWindow); - m_MovingNode->GetPropertyList()->SetProperty("levelwindow", levWinProp); - } - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } -} - -void QmitkBSplineRegistrationView::setOptimizerParameters() -{ - m_OptimizerParameters = mitk::OptimizerParameters::New(); - - if (m_Controls.m_OptimizerSelector->currentText() == "LBFGSOptimizer") - { - m_OptimizerParameters->SetOptimizer(mitk::OptimizerParameters::LBFGSOPTIMIZER); - m_OptimizerParameters->SetGradientConvergenceToleranceLBFGS(m_Controls.m_GradConvTolerance->text().toFloat()); - m_OptimizerParameters->SetLineSearchAccuracyLBFGS(m_Controls.m_LineSearchAccuracy->text().toFloat()); - m_OptimizerParameters->SetDefaultStepLengthLBFGS(m_Controls.m_DefaultStepLength->text().toFloat()); - m_OptimizerParameters->SetNumberOfIterationsLBFGS(m_Controls.m_FunctionEvaluations->text().toInt()); - } - else if (m_Controls.m_OptimizerSelector->currentText() == "Gradient Descent") - { - m_OptimizerParameters->SetOptimizer(mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER); - m_OptimizerParameters->SetLearningRateGradientDescent(m_Controls.m_LearningRateGradientDescent->text().toFloat()); - m_OptimizerParameters->SetNumberOfIterationsGradientDescent( - m_Controls.m_NumberOfIterationsGradientDescent->text().toInt()); - } -} - -void QmitkBSplineRegistrationView::SetFixedNode(mitk::DataNode *fixedNode) -{ - m_FixedNode = fixedNode; -} - -void QmitkBSplineRegistrationView::SetMovingNode(mitk::DataNode *movingNode) -{ - m_MovingNode = movingNode; -} diff --git a/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationView.h b/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationView.h deleted file mode 100644 index 55b78f8a2d..0000000000 --- a/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationView.h +++ /dev/null @@ -1,69 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkBSplineRegistrationViewWidgetHIncluded -#define QmitkBSplineRegistrationViewWidgetHIncluded - -#include "MitkDeformableRegistrationUIExports.h" -#include "mitkDataNode.h" -#include "mitkOptimizerParameters.h" -#include "ui_QmitkBSplineRegistrationViewControls.h" - -/*! -* \brief Widget for deformable demons registration -* -* Displays options for demons registration. -*/ -class MITKDEFORMABLEREGISTRATIONUI_EXPORT QmitkBSplineRegistrationView : public QWidget -{ - Q_OBJECT - -public: - QmitkBSplineRegistrationView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkBSplineRegistrationView(); - - int GetNumberOfIterations(); - Ui::QmitkBSplineRegistrationViewControls m_Controls; - - void SetFixedNode(mitk::DataNode *fixedNode); - void SetMovingNode(mitk::DataNode *movingNode); - -public slots: - void CalculateTransformation(); - -protected slots: - /*! - * Prints the values of the deformationfield - */ - void PrintDeformationField(); - - /*! - * Select a deformation field - */ - void SelectDeformationField(); - - void OptimizerSelected(int optimizer); - void HideAllOptimizerFrames(); - -protected: - mitk::DataNode *m_FixedNode; - mitk::DataNode *m_MovingNode; - mitk::OptimizerParameters::Pointer m_OptimizerParameters; - - void setOptimizerParameters(); -}; - -#endif diff --git a/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationViewControls.ui b/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationViewControls.ui deleted file mode 100644 index 9c68a74709..0000000000 --- a/Modules/DeformableRegistrationUI/QmitkBSplineRegistrationViewControls.ui +++ /dev/null @@ -1,411 +0,0 @@ - - - QmitkBSplineRegistrationViewControls - - - - 0 - 0 - 260 - 361 - - - - - 0 - 0 - - - - QmitkBSplineRegistrationViewControls - - - - - - true - - - - 75 - true - - - - Optimizer - - - true - - - - 0 - - - - - - 50 - false - - - - - LBFGSOptimizer - - - - - Gradient Descent - - - - - - - - - 50 - false - - - - QFrame::NoFrame - - - QFrame::Plain - - - 1 - - - 0 - - - - - 0 - - - - - true - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - - - - - - - Gradient Convergence Tolerance - - - - - - - 0.00001 - - - - - - - Line Search Accuracy - - - - - - - 0.9 - - - - - - - Default Step Length - - - - - - - 1.0 - - - - - - - Max # Function Evaluations - - - - - - - 1000 - - - - - - - - - - 50 - false - - - - Print out information on every iteration step - - - - - - - - - - - - - - 0 - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - - - - - - 50 - false - - - - Learning rate - - - - - - - - 50 - false - - - - 0.01 - - - - - - - - 50 - false - - - - Number of iterations - - - - - - - - 50 - false - - - - 100 - - - - - - - - - - - - - - - - - - - - 75 - true - - - - Transform - - - true - - - - 0 - - - - - - - - 50 - false - - - - Number of Grid Nodes Inside Image - - - - - - - - 50 - false - - - - 5 - - - - - - - - - - - - - 75 - true - - - - Deformation Field - - - true - - - - 0 - - - - - - - - 50 - false - - - - Save Deformation Field - - - - - - - - 50 - false - - - - - - - - - 50 - false - - - - Browse - - - - - - - - 50 - false - - - - Apply deformation field - - - - - - - - 50 - false - - - - Print deformation field - - - - - - - - - - - - - diff --git a/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationView.cpp b/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationView.cpp deleted file mode 100644 index dd2acaf172..0000000000 --- a/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationView.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkDemonsRegistrationView.h" -#include "itkRegularStepGradientDescentOptimizer.h" -#include "mitkITKImageImport.h" -#include "mitkProgressBar.h" -#include "ui_QmitkDemonsRegistrationViewControls.h" -#include -#include -#include -#include -#include -#include -#include -#include - -QmitkDemonsRegistrationView::QmitkDemonsRegistrationView(QWidget *parent, Qt::WindowFlags f) - : QWidget(parent, f), - m_FixedNode(nullptr), - m_MovingNode(nullptr), - m_ResultImage(nullptr), - m_ResultDeformationField(nullptr) -{ - m_Controls.setupUi(parent); - - QValidator *validatorHistogramLevels = new QIntValidator(1, 20000000, this); - m_Controls.m_NumberOfHistogramLevels->setValidator(validatorHistogramLevels); - - QValidator *validatorMatchPoints = new QIntValidator(1, 20000000, this); - m_Controls.m_NumberOfMatchPoints->setValidator(validatorMatchPoints); - - QValidator *validatorIterations = new QIntValidator(1, 20000000, this); - m_Controls.m_Iterations->setValidator(validatorIterations); - - QValidator *validatorStandardDeviation = new QDoubleValidator(0, 20000000, 2, this); - m_Controls.m_StandardDeviation->setValidator(validatorStandardDeviation); -} - -QmitkDemonsRegistrationView::~QmitkDemonsRegistrationView() -{ -} - -int QmitkDemonsRegistrationView::GetNumberOfIterations() -{ - return atoi(m_Controls.m_Iterations->text().toLatin1()); -} - -float QmitkDemonsRegistrationView::GetStandardDeviation() -{ - return atof(m_Controls.m_StandardDeviation->text().toLatin1()); -} - -mitk::Image::Pointer QmitkDemonsRegistrationView::GetResultImage() -{ - return m_ResultImage; -} - -mitk::Image::Pointer QmitkDemonsRegistrationView::GetResultDeformationfield() -{ - return m_ResultDeformationField; -} - -void QmitkDemonsRegistrationView::CalculateTransformation() -{ - if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull()) - { - mitk::Image::Pointer fimage = dynamic_cast(m_FixedNode->GetData()); - mitk::Image::Pointer mimage = dynamic_cast(m_MovingNode->GetData()); - // workaround to ensure that fimage covers a bigger region than mimage - mitk::Image::RegionType fimageRegion = fimage->GetLargestPossibleRegion(); - mitk::Image::RegionType mimageRegion = mimage->GetLargestPossibleRegion(); - if (!((fimageRegion.GetSize(0) >= mimageRegion.GetSize(0)) && - (fimageRegion.GetSize(1) >= mimageRegion.GetSize(1)) && (fimageRegion.GetSize(2) >= mimageRegion.GetSize(2)))) - { - QMessageBox::information( - nullptr, "Registration", "Fixed image must be equal or bigger in size than moving image."); - return; - } - if (m_Controls.m_RegistrationSelection->currentIndex() == 0) - { - mitk::DemonsRegistration::Pointer registration = mitk::DemonsRegistration::New(); - registration->SetSaveDeformationField(false); - registration->SetSaveResult(false); - registration->SetReferenceImage(fimage); - registration->SetNumberOfIterations(atoi(m_Controls.m_Iterations->text().toLatin1())); - registration->SetStandardDeviation(atof(m_Controls.m_StandardDeviation->text().toLatin1())); - if (m_Controls.m_UseHistogramMatching->isChecked()) - { - mitk::HistogramMatching::Pointer histogramMatching = mitk::HistogramMatching::New(); - histogramMatching->SetReferenceImage(fimage); - histogramMatching->SetInput(mimage); - histogramMatching->SetNumberOfHistogramLevels(atoi(m_Controls.m_NumberOfHistogramLevels->text().toLatin1())); - histogramMatching->SetNumberOfMatchPoints(atoi(m_Controls.m_NumberOfMatchPoints->text().toLatin1())); - histogramMatching->SetThresholdAtMeanIntensity(m_Controls.m_ThresholdAtMeanIntensity->isChecked()); - histogramMatching->Update(); - mitk::Image::Pointer histimage = histogramMatching->GetOutput(); - if (histimage.IsNotNull()) - { - registration->SetInput(histimage); - } - else - { - registration->SetInput(mimage); - } - } - else - { - registration->SetInput(mimage); - } - try - { - registration->Update(); - } - catch (itk::ExceptionObject &excpt) - { - QMessageBox::information(this, "Registration exception", excpt.GetDescription(), QMessageBox::Ok); - mitk::ProgressBar::GetInstance()->Progress(4); - return; - } - m_ResultImage = registration->GetOutput(); - typedef itk::Image, 3> VectorImageType; - VectorImageType::Pointer deformationField = registration->GetDeformationField(); - m_ResultDeformationField = mitk::ImportItkImage(deformationField)->Clone(); - } - else if (m_Controls.m_RegistrationSelection->currentIndex() == 1) - { - mitk::SymmetricForcesDemonsRegistration::Pointer registration = mitk::SymmetricForcesDemonsRegistration::New(); - registration->SetSaveDeformationField(false); - registration->SetSaveResult(false); - registration->SetReferenceImage(fimage); - registration->SetNumberOfIterations(atoi(m_Controls.m_Iterations->text().toLatin1())); - registration->SetStandardDeviation(atof(m_Controls.m_StandardDeviation->text().toLatin1())); - if (m_Controls.m_UseHistogramMatching->isChecked()) - { - mitk::HistogramMatching::Pointer histogramMatching = mitk::HistogramMatching::New(); - histogramMatching->SetReferenceImage(fimage); - histogramMatching->SetInput(mimage); - histogramMatching->SetNumberOfHistogramLevels(atoi(m_Controls.m_NumberOfHistogramLevels->text().toLatin1())); - histogramMatching->SetNumberOfMatchPoints(atoi(m_Controls.m_NumberOfMatchPoints->text().toLatin1())); - histogramMatching->SetThresholdAtMeanIntensity(m_Controls.m_ThresholdAtMeanIntensity->isChecked()); - histogramMatching->Update(); - mitk::Image::Pointer histimage = histogramMatching->GetOutput(); - if (histimage.IsNotNull()) - { - registration->SetInput(histimage); - } - else - { - registration->SetInput(mimage); - } - } - else - { - registration->SetInput(mimage); - } - try - { - registration->Update(); - } - catch (itk::ExceptionObject &excpt) - { - QMessageBox::information(this, "Registration exception", excpt.GetDescription(), QMessageBox::Ok); - mitk::ProgressBar::GetInstance()->Progress(4); - return; - } - m_ResultImage = registration->GetOutput(); - typedef itk::Image, 3> VectorImageType; - VectorImageType::Pointer deformationField = registration->GetDeformationField(); - m_ResultDeformationField = mitk::ImportItkImage(deformationField)->Clone(); - } - } -} - -void QmitkDemonsRegistrationView::SetFixedNode(mitk::DataNode *fixedNode) -{ - m_FixedNode = fixedNode; -} - -void QmitkDemonsRegistrationView::SetMovingNode(mitk::DataNode *movingNode) -{ - m_MovingNode = movingNode; -} - -void QmitkDemonsRegistrationView::UseHistogramMatching(bool useHM) -{ - if (useHM) - { - m_Controls.numberOfHistogramLevels->setEnabled(true); - m_Controls.m_NumberOfHistogramLevels->setEnabled(true); - m_Controls.numberOfMatchPoints->setEnabled(true); - m_Controls.m_NumberOfMatchPoints->setEnabled(true); - m_Controls.thresholdAtMeanIntensity->setEnabled(true); - m_Controls.m_ThresholdAtMeanIntensity->setEnabled(true); - } - else - { - m_Controls.numberOfHistogramLevels->setEnabled(false); - m_Controls.m_NumberOfHistogramLevels->setEnabled(false); - m_Controls.numberOfMatchPoints->setEnabled(false); - m_Controls.m_NumberOfMatchPoints->setEnabled(false); - m_Controls.thresholdAtMeanIntensity->setEnabled(false); - m_Controls.m_ThresholdAtMeanIntensity->setEnabled(false); - } -} diff --git a/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationView.h b/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationView.h deleted file mode 100644 index 9ff5cb5793..0000000000 --- a/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationView.h +++ /dev/null @@ -1,57 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkDemonsRegistrationViewWidgetHIncluded -#define QmitkDemonsRegistrationViewWidgetHIncluded - -#include "MitkDeformableRegistrationUIExports.h" -#include "mitkDataNode.h" -#include "ui_QmitkDemonsRegistrationViewControls.h" - -/*! -* \brief Widget for deformable demons registration -* -* Displays options for demons registration. -*/ -class MITKDEFORMABLEREGISTRATIONUI_EXPORT QmitkDemonsRegistrationView : public QWidget -{ - Q_OBJECT - -public: - QmitkDemonsRegistrationView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkDemonsRegistrationView(); - - int GetNumberOfIterations(); - float GetStandardDeviation(); - - void SetFixedNode(mitk::DataNode *fixedNode); - void SetMovingNode(mitk::DataNode *movingNode); - void UseHistogramMatching(bool useHM); - mitk::Image::Pointer GetResultImage(); - mitk::Image::Pointer GetResultDeformationfield(); - -public slots: - void CalculateTransformation(); - -protected: - Ui::QmitkDemonsRegistrationViewControls m_Controls; - mitk::DataNode::Pointer m_FixedNode; - mitk::DataNode::Pointer m_MovingNode; - mitk::Image::Pointer m_ResultImage; - mitk::Image::Pointer m_ResultDeformationField; -}; - -#endif diff --git a/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationViewControls.ui b/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationViewControls.ui deleted file mode 100644 index 4f281e8331..0000000000 --- a/Modules/DeformableRegistrationUI/QmitkDemonsRegistrationViewControls.ui +++ /dev/null @@ -1,348 +0,0 @@ - - - QmitkDemonsRegistrationViewControls - - - - 0 - 0 - 271 - 256 - - - - - 0 - 0 - - - - QmitkDemonsRegistrationViewControls - - - - 6 - - - 0 - - - 9 - - - 0 - - - 9 - - - - - - 75 - true - - - - Transform - - - true - - - - 0 - - - - - - Demons Registration - - - - - Symmetric Forces Demons Registration - - - - - - - - - - - - 75 - true - - - - Histogram Matching - - - true - - - - 0 - - - - - - - - - - 50 - false - - - - Use Histogram Matching: - - - false - - - - - - - - 50 - false - - - - Number of Histogram Levels: - - - false - - - - - - - - 50 - false - - - - Number of Match Points: - - - false - - - - - - - - 50 - false - - - - Threshold at Mean Intensity: - - - false - - - - - - - - - - - - 50 - false - - - - - - - true - - - - - - - - 50 - false - - - - 1024 - - - Qt::AlignRight - - - - - - - - 50 - false - - - - 7 - - - Qt::AlignRight - - - - - - - - 50 - false - - - - - - - true - - - - - - - - - - - - - - - 75 - true - - - - Demons Registration - - - true - - - - 0 - - - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - 50 - false - - - - Standard Deviation: - - - false - - - - - - - - - - - - 0 - 0 - - - - - 50 - false - - - - 50 - - - Qt::AlignRight - - - - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - - - - - - - - mitkDataNode.h - mitkDemonsRegistration.h - mitkHistogramMatching.h - mitkSymmetricForcesDemonsRegistration.h - - - - diff --git a/Modules/DeformableRegistrationUI/files.cmake b/Modules/DeformableRegistrationUI/files.cmake deleted file mode 100644 index 24d1c42971..0000000000 --- a/Modules/DeformableRegistrationUI/files.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CPP_FILES - QmitkDemonsRegistrationView.cpp - QmitkBSplineRegistrationView.cpp -) - - -set(UI_FILES - QmitkDemonsRegistrationViewControls.ui - QmitkBSplineRegistrationViewControls.ui -) - -set(MOC_H_FILES - QmitkDemonsRegistrationView.h - QmitkBSplineRegistrationView.h -) \ No newline at end of file diff --git a/Modules/ModuleList.cmake b/Modules/ModuleList.cmake index 9f184cf09e..12dc97e8fe 100644 --- a/Modules/ModuleList.cmake +++ b/Modules/ModuleList.cmake @@ -1,85 +1,81 @@ # The entries in the mitk_modules list must be # ordered according to their dependencies. set(mitk_modules Core CommandLine AppUtil DCMTesting RDF LegacyIO DataTypesExt Annotation LegacyGL AlgorithmsExt MapperExt DICOMReader DICOMReaderServices DICOMTesting SceneSerializationBase PlanarFigure ImageDenoising ImageExtraction LegacyAdaptors SceneSerialization Gizmo GraphAlgorithms Multilabel ImageStatistics ContourModel SurfaceInterpolation Segmentation PlanarFigureSegmentation OpenViewCore QtWidgets QtWidgetsExt C3js QmlItems SegmentationUI Classification DiffusionImaging GPGPU OpenIGTLink IGTBase IGT CameraCalibration - RigidRegistration - RigidRegistrationUI - DeformableRegistration - DeformableRegistrationUI OpenCL OpenCVVideoSupport QtOverlays ToFHardware ToFProcessing ToFUI US USUI DicomUI Simulation Remeshing Python QtPython Persistence OpenIGTLinkUI IGTUI VtkShaders DicomRT RTUI IOExt XNAT TubeGraph BiophotonicsHardware TumorInvasionAnalysis MatchPointRegistration MatchPointRegistrationUI BoundingShape RenderWindowManager RenderWindowManagerUI CEST DICOMQI ) if(MITK_ENABLE_PIC_READER) list(APPEND mitk_modules IpPicSupportIO) endif() diff --git a/Modules/QtWidgetsExt/include/QmitkPointListView.h b/Modules/QtWidgetsExt/include/QmitkPointListView.h index 2a8e70a673..a3ba79ed79 100644 --- a/Modules/QtWidgetsExt/include/QmitkPointListView.h +++ b/Modules/QtWidgetsExt/include/QmitkPointListView.h @@ -1,147 +1,131 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITK_POINTLIST_VIEW_H_INCLUDED #define QMITK_POINTLIST_VIEW_H_INCLUDED #include "MitkQtWidgetsExtExports.h" #include "QmitkPointListModel.h" #include #include #include class QmitkStdMultiWidget; /*! * \brief GUI widget for handling mitk::PointSet * * Displays all the points in a mitk::PointSet graphically. * Reacts automatically to changes in the PointSet's selection status. * Updates PointSet's selection status when this list's selection changes. * * If a QmitkStdMultiWidget is assigned via SetMultiWidget(), the * crosshair of the QmitkStdMultiWidget is moved to the currently selected * point. * */ class MITKQTWIDGETSEXT_EXPORT QmitkPointListView : public QListView { Q_OBJECT public: QmitkPointListView(QWidget *parent = 0); ~QmitkPointListView(); /// assign a point set for observation void SetPointSetNode(mitk::DataNode *pointSetNode); /// which point set to work on const mitk::PointSet *GetPointSet() const; /** * \brief If Multiwidget is set, the crosshair is automatically centering to the selected point * As an alternative, if you dont have a multiwidget, you can call SetSnc1, SetSnc2, SetSnc3 to set the * SliceNavigationControllers directly to enable the focussing feature. */ void SetMultiWidget(QmitkStdMultiWidget *multiWidget); QmitkStdMultiWidget *GetMultiWidget() const; ///< return the QmitkStdMultiWidget that is used for updating render window crosshair void SetTimesStep(int i); ///< which time step to display/model - ///@{ - /** - * \brief Sets the SliceNavigationController of the three 2D Renderwindows. - * If they are defined, they can be used to automatically set the crosshair to the selected point - * - * \deprecatedSince{2013_03} Use AddSliceNavigationController and RemoveSliceNavigationController instead. - */ - DEPRECATED(void SetSnc1(mitk::SliceNavigationController *snc)); - DEPRECATED(void SetSnc2(mitk::SliceNavigationController *snc)); - DEPRECATED(void SetSnc3(mitk::SliceNavigationController *snc)); - ///@} - /** * @brief Add a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method adds \c snc to the set of slice navigation controllers which are * used to navigate to the selected point. */ void AddSliceNavigationController(mitk::SliceNavigationController *snc); /** * @brief Remove a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method removes \c snc from the set of slice navigation controllers which are * used to navigate to the selected point. */ void RemoveSliceNavigationController(mitk::SliceNavigationController *snc); signals: void SignalPointSelectionChanged(); ///< this signal is emmitted, if the selection of a point in the pointset is changed protected slots: /// Filtering double click event for editing point coordinates via a dialog void OnPointDoubleClicked(const QModelIndex &index); /// called when the point set data structure changes void OnPointSetSelectionChanged(); /// called when the selection of the view widget changes void OnListViewSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); /// fade the shown timestep out void fadeTimeStepOut(); /// open ContextMenu void ctxMenu(const QPoint &pos); /// Turn TimeStep Fading On/Off void SetFading(bool onOff); /// Delete all points in the list void ClearPointList(); /// delete all points in the list in the current timestep void ClearPointListTS(); protected: void keyPressEvent(QKeyEvent *e) override; ///< react to F2, F3 and DEL keys void wheelEvent(QWheelEvent *event) override; ///< change timestep of the current pointset by mouse wheel void fadeTimeStepIn(); ///< fade a label with the currently shown timestep in - mitk::SliceNavigationController *m_Snc1; - mitk::SliceNavigationController *m_Snc2; - mitk::SliceNavigationController *m_Snc3; - std::set m_Sncs; QmitkPointListModel *m_PointListModel; bool m_SelfCall; bool m_showFading; /// used to position the planes on a selected point QmitkStdMultiWidget *m_MultiWidget; QLabel *m_TimeStepFaderLabel; }; #endif diff --git a/Modules/QtWidgetsExt/include/QmitkPointListWidget.h b/Modules/QtWidgetsExt/include/QmitkPointListWidget.h index f4f81de1d0..ad1a4e23c4 100644 --- a/Modules/QtWidgetsExt/include/QmitkPointListWidget.h +++ b/Modules/QtWidgetsExt/include/QmitkPointListWidget.h @@ -1,167 +1,150 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkPointListWidget_H #define QmitkPointListWidget_H #include "MitkQtWidgetsExtExports.h" #include #include #include #include #include #include -#include #include /*! * \brief Widget for regular operations on point sets * * Displays a list of point coordinates and a couple of * buttons which * * \li enable point set interaction * \li clear all points from a set * \li load points from file * \li save points to file * * The user/application module of this widget needs to * assign a mitk::PointSet object to this widget. The user * also has to decide whether it wants to put the point set * into (a) DataStorage. This widget will not add/remove * point sets to DataStorage. * * If the render window crosshair should be moved to the * currently selected point, the widget user has to provide * a QmitkStdMultiWidget object. */ class MITKQTWIDGETSEXT_EXPORT QmitkPointListWidget : public QWidget { Q_OBJECT public: QmitkPointListWidget(QWidget *parent = 0, int orientation = 0); ~QmitkPointListWidget(); void SetupConnections(); - ///@{ - /** - * \brief Sets the SliceNavigationController of the three 2D Renderwindows. - * If they are defined, they can be used to automatically set the crosshair to the selected point - * \deprecatedSince{2013_03} Use AddSliceNavigationController and RemoveSliceNavigationController instead. - */ - DEPRECATED(void SetSnc1(mitk::SliceNavigationController *snc)); - DEPRECATED(void SetSnc2(mitk::SliceNavigationController *snc)); - DEPRECATED(void SetSnc3(mitk::SliceNavigationController *snc)); - ///@} - /** * @brief Add a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method adds \c snc to the set of slice navigation controllers which are * used to navigate to the selected point. */ void AddSliceNavigationController(mitk::SliceNavigationController *snc); /** * @brief Remove a mitk::SliceNavigationController instance. * @param snc The mitk::SliceNavigationController instance. * * This method removes \c snc from the set of slice navigation controllers which are * used to navigate to the selected point. */ void RemoveSliceNavigationController(mitk::SliceNavigationController *snc); /** @brief assign a point set (contained in a node of DataStorage) for observation */ void SetPointSet(mitk::PointSet *newPs); mitk::PointSet *GetPointSet(); /** @brief assign a point set (contained in a node of DataStorage) for observation */ void SetPointSetNode(mitk::DataNode *newNode); mitk::DataNode *GetPointSetNode(); /** @brief assign a QmitkStdMultiWidget for updating render window crosshair */ void SetMultiWidget(QmitkStdMultiWidget *multiWidget); /** @brief itk observer for node "delete" events */ void OnNodeDeleted(const itk::EventObject &e); /** @brief Unselects the edit button if it is selected. */ void UnselectEditButton(); public slots: void DeactivateInteractor(bool deactivate); void EnableEditButton(bool enabled); signals: /** @brief signal to inform about the state of the EditPointSetButton, whether an interactor for setting points is * active or not */ void EditPointSets(bool active); /// signal to inform that the selection of a point in the pointset has changed void PointSelectionChanged(); /// signal to inform about cleared or loaded point sets void PointListChanged(); protected slots: void OnBtnSavePoints(); void OnBtnLoadPoints(); void RemoveSelectedPoint(); void MoveSelectedPointDown(); void MoveSelectedPointUp(); void OnBtnAddPoint(bool checked); void OnBtnAddPointManually(); /*! \brief pass through signal from PointListView that point selection has changed */ void OnPointSelectionChanged(); void OnListDoubleClick(); protected: void SetupUi(); void ObserveNewNode(mitk::DataNode *node); QmitkPointListView *m_PointListView; - QmitkStdMultiWidget *m_MultiWidget; mitk::DataNode::Pointer m_PointSetNode; int m_Orientation; QPushButton *m_MovePointUpBtn; QPushButton *m_MovePointDownBtn; QPushButton *m_RemovePointBtn; QPushButton *m_SavePointsBtn; QPushButton *m_LoadPointsBtn; QPushButton *m_ToggleAddPoint; QPushButton *m_AddPoint; - mitk::SliceNavigationController *m_Snc1; - mitk::SliceNavigationController *m_Snc2; - mitk::SliceNavigationController *m_Snc3; - mitk::DataInteractor::Pointer m_DataInteractor; int m_TimeStep; bool m_EditAllowed; unsigned long m_NodeObserverTag; }; #endif diff --git a/Modules/QtWidgetsExt/src/QmitkPointListView.cpp b/Modules/QtWidgetsExt/src/QmitkPointListView.cpp index b8bcba476d..61faec0506 100644 --- a/Modules/QtWidgetsExt/src/QmitkPointListView.cpp +++ b/Modules/QtWidgetsExt/src/QmitkPointListView.cpp @@ -1,408 +1,371 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkPointListView.h" #include "QmitkEditPointDialog.h" #include "QmitkPointListModel.h" #include "QmitkStdMultiWidget.h" #include "mitkRenderingManager.h" #include #include #include #include #include QmitkPointListView::QmitkPointListView(QWidget *parent) : QListView(parent), - m_Snc1(NULL), - m_Snc2(NULL), - m_Snc3(NULL), m_PointListModel(new QmitkPointListModel()), m_SelfCall(false), m_showFading(false), - m_MultiWidget(NULL) + m_MultiWidget(nullptr) { QListView::setAlternatingRowColors(true); QListView::setSelectionBehavior(QAbstractItemView::SelectRows); QListView::setSelectionMode(QAbstractItemView::SingleSelection); QListView::setModel(m_PointListModel); QString tooltip = QString("Use the F2/F3 keys to move a point up/down, the Del key to remove a point\nand the mouse " "wheel to change the timestep.\n\nTimeStep:\t%1") .arg(0); QListView::setToolTip(tooltip); this->setContextMenuPolicy(Qt::CustomContextMenu); m_TimeStepFaderLabel = new QLabel(this); QFont font("Arial", 17); m_TimeStepFaderLabel->setFont(font); this->setMinimumHeight(40); this->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); connect(m_PointListModel, SIGNAL(SignalUpdateSelection()), this, SLOT(OnPointSetSelectionChanged())); connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(OnPointDoubleClicked(const QModelIndex &))); connect(QListView::selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(OnListViewSelectionChanged(const QItemSelection &, const QItemSelection &))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &))); } QmitkPointListView::~QmitkPointListView() { delete m_PointListModel; } void QmitkPointListView::SetPointSetNode(mitk::DataNode *pointSetNode) { m_PointListModel->SetPointSetNode(pointSetNode); } const mitk::PointSet *QmitkPointListView::GetPointSet() const { return m_PointListModel->GetPointSet(); } void QmitkPointListView::SetMultiWidget(QmitkStdMultiWidget *multiWidget) { m_MultiWidget = multiWidget; + this->AddSliceNavigationController(multiWidget->mitkWidget1->GetSliceNavigationController()); + this->AddSliceNavigationController(multiWidget->mitkWidget2->GetSliceNavigationController()); + this->AddSliceNavigationController(multiWidget->mitkWidget3->GetSliceNavigationController()); } QmitkStdMultiWidget *QmitkPointListView::GetMultiWidget() const { return m_MultiWidget; } void QmitkPointListView::OnPointDoubleClicked(const QModelIndex &index) { mitk::PointSet::PointType p; mitk::PointSet::PointIdentifier id; m_PointListModel->GetPointForModelIndex(index, p, id); QmitkEditPointDialog _EditPointDialog(this); _EditPointDialog.SetPoint(m_PointListModel->GetPointSet(), id, m_PointListModel->GetTimeStep()); _EditPointDialog.exec(); } void QmitkPointListView::OnPointSetSelectionChanged() { const mitk::PointSet *pointSet = m_PointListModel->GetPointSet(); - if (pointSet == NULL) + if (pointSet == nullptr) return; // update this view's selection status as a result to changes in the point set data structure m_SelfCall = true; int timeStep = m_PointListModel->GetTimeStep(); if (pointSet->GetNumberOfSelected(timeStep) > 1) { MITK_ERROR << "Point set has multiple selected points. This view is not designed for more than one selected point."; } int selectedIndex = pointSet->SearchSelectedPoint(timeStep); if (selectedIndex == -1) // no selected point is found { m_SelfCall = false; return; } QModelIndex index; bool modelIndexOkay = m_PointListModel->GetModelIndexForPointID(selectedIndex, index); if (modelIndexOkay == true) QListView::selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); emit SignalPointSelectionChanged(); m_SelfCall = false; } void QmitkPointListView::OnListViewSelectionChanged(const QItemSelection &selected, const QItemSelection & /*deselected*/) { if (m_SelfCall) return; mitk::PointSet *pointSet = const_cast(m_PointListModel->GetPointSet()); - if (pointSet == NULL) + if (pointSet == nullptr) return; // (take care that this widget doesn't react to self-induced changes by setting m_SelfCall) m_SelfCall = true; // update selection of all points in pointset: select the one(s) that are selected in the view, deselect all others QModelIndexList selectedIndexes = selected.indexes(); for (mitk::PointSet::PointsContainer::Iterator it = pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->Begin(); it != pointSet->GetPointSet(m_PointListModel->GetTimeStep())->GetPoints()->End(); ++it) { QModelIndex index; if (m_PointListModel->GetModelIndexForPointID(it->Index(), index)) { if (selectedIndexes.indexOf(index) != -1) // index is found in the selected indices list { pointSet->SetSelectInfo(it->Index(), true, m_PointListModel->GetTimeStep()); - // Use Multiwidget or SliceNavigationControllers to set crosshair to selected point - if (m_MultiWidget != NULL) - { - m_MultiWidget->MoveCrossToPosition(pointSet->GetPoint(it->Index(), m_PointListModel->GetTimeStep())); - } - mitk::Point3D p = pointSet->GetPoint(it->Index(), m_PointListModel->GetTimeStep()); - // remove the three ifs below after the SetSnc* methods have been removed - if (m_Snc1 != NULL) - { - m_Snc1->SelectSliceByPoint(p); - } - if (m_Snc2 != NULL) - { - m_Snc2->SelectSliceByPoint(p); - } - if (m_Snc3 != NULL) - { - m_Snc3->SelectSliceByPoint(p); - } - - for (std::set::const_iterator i = m_Sncs.begin(); i != m_Sncs.end(); ++i) - { - (*i)->SelectSliceByPoint(p); - } + for (auto snc : m_Sncs) + snc->SelectSliceByPoint(p); } else { pointSet->SetSelectInfo(it->Index(), false, m_PointListModel->GetTimeStep()); } } } m_SelfCall = false; emit SignalPointSelectionChanged(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPointListView::keyPressEvent(QKeyEvent *e) { - if (m_PointListModel == NULL) + if (m_PointListModel == nullptr) return; int key = e->key(); switch (key) { case Qt::Key_F2: m_PointListModel->MoveSelectedPointUp(); break; case Qt::Key_F3: m_PointListModel->MoveSelectedPointDown(); break; case Qt::Key_Delete: m_PointListModel->RemoveSelectedPoint(); break; default: break; } } void QmitkPointListView::wheelEvent(QWheelEvent *event) { if (!m_PointListModel || !m_PointListModel->GetPointSet() || (int)(m_PointListModel->GetPointSet()->GetTimeSteps()) == 1) return; int whe = event->delta(); mitk::PointSet::Pointer ps = dynamic_cast(m_PointListModel->GetPointSet()); unsigned int numberOfTS = ps->GetTimeSteps(); if (numberOfTS == 1) return; int currentTS = this->m_PointListModel->GetTimeStep(); if (whe > 0) { if ((currentTS + 1 >= (int)numberOfTS)) return; this->m_PointListModel->SetTimeStep(++currentTS); } else { if ((currentTS <= 0)) return; this->m_PointListModel->SetTimeStep(--currentTS); } QString tooltip = QString("Use the F2/F3 keys to move a point up/down, the Del key to remove a point\nand the mouse " "wheel to change the timestep.\n\nTimeStep:\t%1") .arg(currentTS); this->setToolTip(tooltip); fadeTimeStepIn(); } void QmitkPointListView::fadeTimeStepIn() { // Setup Widget QWidget *m_TimeStepFader = new QWidget(this); QHBoxLayout *layout = new QHBoxLayout(m_TimeStepFader); int x = (int)(this->geometry().x() + this->width() * 0.6); int y = (int)(this->geometry().y() + this->height() * 0.8); m_TimeStepFader->move(x, y); m_TimeStepFader->resize(60, 55); m_TimeStepFader->setLayout(layout); m_TimeStepFader->setAttribute(Qt::WA_DeleteOnClose); layout->addWidget(m_TimeStepFaderLabel); m_TimeStepFaderLabel->setAlignment(Qt::AlignCenter); m_TimeStepFaderLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); m_TimeStepFaderLabel->setLineWidth(2); m_TimeStepFaderLabel->setText(QString("%1").arg(this->m_PointListModel->GetTimeStep())); // give the widget opacity and some colour QPalette pal = m_TimeStepFaderLabel->palette(); QColor semiTransparentColor(139, 192, 223, 50); QColor labelTransparentColor(0, 0, 0, 200); pal.setColor(m_TimeStepFaderLabel->backgroundRole(), semiTransparentColor); pal.setColor(m_TimeStepFaderLabel->foregroundRole(), labelTransparentColor); m_TimeStepFaderLabel->setAutoFillBackground(true); m_TimeStepFaderLabel->setPalette(pal); // show the widget m_TimeStepFader->show(); // and start the timer m_TimeStepFaderLabel->setVisible(true); QTimer::singleShot(2000, this, SLOT(fadeTimeStepOut())); } void QmitkPointListView::fadeTimeStepOut() { m_TimeStepFaderLabel->hide(); } void QmitkPointListView::ctxMenu(const QPoint &pos) { QMenu *menu = new QMenu; // add Fading check QAction *showFading = new QAction(this); showFading->setCheckable(false); // TODO: reset when fading is working showFading->setEnabled(false); // TODO: reset when fading is working showFading->setText("Fade TimeStep"); connect(showFading, SIGNAL(triggered(bool)), this, SLOT(SetFading(bool))); menu->addAction(showFading); // add Clear action QAction *clearList = new QAction(this); clearList->setText("Clear List"); connect(clearList, SIGNAL(triggered()), this, SLOT(ClearPointList())); menu->addAction(clearList); // add Clear TimeStep action QAction *clearTS = new QAction(this); clearTS->setText("Clear current time step"); connect(clearTS, SIGNAL(triggered()), this, SLOT(ClearPointListTS())); menu->addAction(clearTS); menu->exec(this->mapToGlobal(pos)); } void QmitkPointListView::SetFading(bool onOff) { m_showFading = onOff; } void QmitkPointListView::ClearPointList() { if (!m_PointListModel->GetPointSet()) return; mitk::PointSet::Pointer curPS = m_PointListModel->GetPointSet(); if (curPS->GetSize() == 0) return; switch (QMessageBox::question(this, tr("Clear Points"), tr("Remove all points from the displayed list?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) { case QMessageBox::Yes: { mitk::PointSet::PointsIterator it; mitk::PointSet::PointsContainer *curPsPoints; while (!curPS->IsEmptyTimeStep(0)) { curPsPoints = curPS->GetPointSet()->GetPoints(); it = curPsPoints->Begin(); curPS->SetSelectInfo(it->Index(), true); m_PointListModel->RemoveSelectedPoint(); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); break; } case QMessageBox::No: default: break; } } void QmitkPointListView::ClearPointListTS() { } -void QmitkPointListView::SetSnc1(mitk::SliceNavigationController *snc) -{ - m_Snc1 = snc; -} - -void QmitkPointListView::SetSnc2(mitk::SliceNavigationController *snc) -{ - m_Snc2 = snc; -} - -void QmitkPointListView::SetSnc3(mitk::SliceNavigationController *snc) -{ - m_Snc3 = snc; -} - void QmitkPointListView::AddSliceNavigationController(mitk::SliceNavigationController *snc) { - if (snc == NULL) + if (snc == nullptr) return; m_Sncs.insert(snc); } void QmitkPointListView::RemoveSliceNavigationController(mitk::SliceNavigationController *snc) { - if (snc == NULL) + if (snc == nullptr) return; m_Sncs.erase(snc); } diff --git a/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp b/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp index 8675d21500..8e4bd1e9eb 100644 --- a/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp +++ b/Modules/QtWidgetsExt/src/QmitkPointListWidget.cpp @@ -1,508 +1,463 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkPointListWidget.h" #include #include #include #include #include #include #include #include QmitkPointListWidget::QmitkPointListWidget(QWidget *parent, int orientation) : QWidget(parent), - m_PointListView(NULL), - m_MultiWidget(NULL), - m_PointSetNode(NULL), + m_PointListView(nullptr), + m_PointSetNode(nullptr), m_Orientation(0), - m_MovePointUpBtn(NULL), - m_MovePointDownBtn(NULL), - m_RemovePointBtn(NULL), - m_SavePointsBtn(NULL), - m_LoadPointsBtn(NULL), - m_ToggleAddPoint(NULL), - m_AddPoint(NULL), - m_Snc1(NULL), - m_Snc2(NULL), - m_Snc3(NULL), - m_DataInteractor(NULL), + m_MovePointUpBtn(nullptr), + m_MovePointDownBtn(nullptr), + m_RemovePointBtn(nullptr), + m_SavePointsBtn(nullptr), + m_LoadPointsBtn(nullptr), + m_ToggleAddPoint(nullptr), + m_AddPoint(nullptr), + m_DataInteractor(nullptr), m_TimeStep(0), m_EditAllowed(true), m_NodeObserverTag(0) { m_PointListView = new QmitkPointListView(); if (orientation != 0) m_Orientation = orientation; SetupUi(); SetupConnections(); - ObserveNewNode(NULL); + ObserveNewNode(nullptr); } QmitkPointListWidget::~QmitkPointListWidget() { - m_DataInteractor = NULL; + m_DataInteractor = nullptr; if (m_PointSetNode && m_NodeObserverTag) { m_PointSetNode->RemoveObserver(m_NodeObserverTag); m_NodeObserverTag = 0; } - m_MultiWidget = NULL; delete m_PointListView; } void QmitkPointListWidget::SetupConnections() { connect(this->m_LoadPointsBtn, SIGNAL(clicked()), this, SLOT(OnBtnLoadPoints())); connect(this->m_SavePointsBtn, SIGNAL(clicked()), this, SLOT(OnBtnSavePoints())); connect(this->m_MovePointUpBtn, SIGNAL(clicked()), this, SLOT(MoveSelectedPointUp())); connect(this->m_MovePointDownBtn, SIGNAL(clicked()), this, SLOT(MoveSelectedPointDown())); connect(this->m_RemovePointBtn, SIGNAL(clicked()), this, SLOT(RemoveSelectedPoint())); connect(this->m_ToggleAddPoint, SIGNAL(toggled(bool)), this, SLOT(OnBtnAddPoint(bool))); connect(this->m_AddPoint, SIGNAL(clicked()), this, SLOT(OnBtnAddPointManually())); connect(this->m_PointListView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(OnListDoubleClick())); connect(this->m_PointListView, SIGNAL(SignalPointSelectionChanged()), this, SLOT(OnPointSelectionChanged())); } void QmitkPointListWidget::SetupUi() { // Setup the buttons m_ToggleAddPoint = new QPushButton(); m_ToggleAddPoint->setMaximumSize(25, 25); m_ToggleAddPoint->setCheckable(true); m_ToggleAddPoint->setToolTip("Toggle point editing (use SHIFT + Left Mouse Button to add Points)"); QIcon iconAdd(":/QtWidgetsExt/btnSetPoints.xpm"); m_ToggleAddPoint->setIcon(iconAdd); m_AddPoint = new QPushButton(); m_AddPoint->setMaximumSize(25, 25); m_AddPoint->setToolTip("Manually add point"); QIcon iconAddManually(":/QtWidgetsExt/btnSetPointsManually.xpm"); m_AddPoint->setIcon(iconAddManually); m_RemovePointBtn = new QPushButton(); m_RemovePointBtn->setMaximumSize(25, 25); const QIcon iconDel(":/QtWidgetsExt/btnClear.xpm"); m_RemovePointBtn->setIcon(iconDel); m_RemovePointBtn->setToolTip("Erase one point from list (Hotkey: DEL)"); m_MovePointUpBtn = new QPushButton(); m_MovePointUpBtn->setMaximumSize(25, 25); const QIcon iconUp(":/QtWidgetsExt/btnUp.xpm"); m_MovePointUpBtn->setIcon(iconUp); m_MovePointUpBtn->setToolTip("Swap selected point upwards (Hotkey: F2)"); m_MovePointDownBtn = new QPushButton(); m_MovePointDownBtn->setMaximumSize(25, 25); const QIcon iconDown(":/QtWidgetsExt/btnDown.xpm"); m_MovePointDownBtn->setIcon(iconDown); m_MovePointDownBtn->setToolTip("Swap selected point downwards (Hotkey: F3)"); m_SavePointsBtn = new QPushButton(); m_SavePointsBtn->setMaximumSize(25, 25); QIcon iconSave(":/QtWidgetsExt/btnSave.xpm"); m_SavePointsBtn->setIcon(iconSave); m_SavePointsBtn->setToolTip("Save points to file"); m_LoadPointsBtn = new QPushButton(); m_LoadPointsBtn->setMaximumSize(25, 25); QIcon iconLoad(":/QtWidgetsExt/btnLoad.xpm"); m_LoadPointsBtn->setIcon(iconLoad); m_LoadPointsBtn->setToolTip("Load list of points from file (REPLACES current content)"); int i; QBoxLayout *lay1; QBoxLayout *lay2; switch (m_Orientation) { case 0: lay1 = new QVBoxLayout(this); lay2 = new QHBoxLayout(); i = 0; break; case 1: lay1 = new QHBoxLayout(this); lay2 = new QVBoxLayout(); i = -1; break; case 2: lay1 = new QHBoxLayout(this); lay2 = new QVBoxLayout(); i = 0; break; default: lay1 = new QVBoxLayout(this); lay2 = new QHBoxLayout(); i = -1; break; } // setup Layouts this->setLayout(lay1); lay1->addLayout(lay2); lay2->stretch(true); lay2->addWidget(m_ToggleAddPoint); lay2->addWidget(m_AddPoint); lay2->addWidget(m_RemovePointBtn); lay2->addWidget(m_MovePointUpBtn); lay2->addWidget(m_MovePointDownBtn); lay2->addWidget(m_SavePointsBtn); lay2->addWidget(m_LoadPointsBtn); lay1->insertWidget(i, m_PointListView); this->setLayout(lay1); } void QmitkPointListWidget::SetPointSet(mitk::PointSet *newPs) { - if (newPs == NULL) + if (newPs == nullptr) return; this->m_PointSetNode->SetData(newPs); dynamic_cast(this->m_PointListView->model())->SetPointSetNode(m_PointSetNode); ObserveNewNode(m_PointSetNode); } void QmitkPointListWidget::SetPointSetNode(mitk::DataNode *newNode) { if (m_DataInteractor.IsNotNull()) m_DataInteractor->SetDataNode(newNode); ObserveNewNode(newNode); dynamic_cast(this->m_PointListView->model())->SetPointSetNode(newNode); } void QmitkPointListWidget::OnBtnSavePoints() { - if ((dynamic_cast(m_PointSetNode->GetData())) == NULL) + if ((dynamic_cast(m_PointSetNode->GetData())) == nullptr) return; // don't write empty point sets. If application logic requires something else then do something else. if ((dynamic_cast(m_PointSetNode->GetData()))->GetSize() == 0) return; // take the previously defined name of node as proposal for filename std::string nodeName = m_PointSetNode->GetName(); nodeName = "/" + nodeName + ".mps"; QString fileNameProposal = QString(); fileNameProposal.append(nodeName.c_str()); QString aFilename = QFileDialog::getSaveFileName( - NULL, "Save point set", QDir::currentPath() + fileNameProposal, "MITK Pointset (*.mps)"); + nullptr, "Save point set", QDir::currentPath() + fileNameProposal, "MITK Pointset (*.mps)"); if (aFilename.isEmpty()) return; try { mitk::IOUtil::Save(m_PointSetNode->GetData(), aFilename.toStdString()); } catch (...) { QMessageBox::warning(this, "Save point set", QString("File writer reported problems writing %1\n\n" "PLEASE CHECK output file!") .arg(aFilename)); } } void QmitkPointListWidget::OnBtnLoadPoints() { // get the name of the file to load - QString filename = QFileDialog::getOpenFileName(NULL, "Open MITK Pointset", "", "MITK Point Sets (*.mps)"); + QString filename = QFileDialog::getOpenFileName(nullptr, "Open MITK Pointset", "", "MITK Point Sets (*.mps)"); if (filename.isEmpty()) return; // attempt to load file try { mitk::PointSet::Pointer pointSet = mitk::IOUtil::LoadPointSet(filename.toStdString()); if (pointSet.IsNull()) { QMessageBox::warning(this, "Load point set", QString("File reader could not read %1").arg(filename)); return; } // loading successful this->SetPointSet(pointSet); } catch (...) { QMessageBox::warning(this, "Load point set", QString("File reader collapsed while reading %1").arg(filename)); } emit PointListChanged(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } mitk::PointSet *QmitkPointListWidget::GetPointSet() { return dynamic_cast(m_PointSetNode->GetData()); } mitk::DataNode *QmitkPointListWidget::GetPointSetNode() { return m_PointSetNode; } void QmitkPointListWidget::SetMultiWidget(QmitkStdMultiWidget *multiWidget) { - this->m_MultiWidget = multiWidget; m_PointListView->SetMultiWidget(multiWidget); } void QmitkPointListWidget::RemoveSelectedPoint() { if (!m_PointSetNode) return; mitk::PointSet *pointSet = dynamic_cast(m_PointSetNode->GetData()); if (!pointSet) return; if (pointSet->GetSize() == 0) return; QmitkPointListModel *pointListModel = dynamic_cast(m_PointListView->model()); pointListModel->RemoveSelectedPoint(); emit PointListChanged(); } void QmitkPointListWidget::MoveSelectedPointDown() { if (!m_PointSetNode) return; mitk::PointSet *pointSet = dynamic_cast(m_PointSetNode->GetData()); if (!pointSet) return; if (pointSet->GetSize() == 0) return; QmitkPointListModel *pointListModel = dynamic_cast(m_PointListView->model()); pointListModel->MoveSelectedPointDown(); emit PointListChanged(); } void QmitkPointListWidget::MoveSelectedPointUp() { if (!m_PointSetNode) return; mitk::PointSet *pointSet = dynamic_cast(m_PointSetNode->GetData()); if (!pointSet) return; if (pointSet->GetSize() == 0) return; QmitkPointListModel *pointListModel = dynamic_cast(m_PointListView->model()); pointListModel->MoveSelectedPointUp(); emit PointListChanged(); } void QmitkPointListWidget::OnBtnAddPoint(bool checked) { if (m_PointSetNode.IsNotNull()) { if (checked) { m_DataInteractor = m_PointSetNode->GetDataInteractor(); // If no data Interactor is present create a new one if (m_DataInteractor.IsNull()) { // Create PointSetData Interactor m_DataInteractor = mitk::PointSetDataInteractor::New(); // Load the according state machine for regular point set interaction m_DataInteractor->LoadStateMachine("PointSet.xml"); // Set the configuration file that defines the triggers for the transitions m_DataInteractor->SetEventConfig("PointSetConfig.xml"); // set the DataNode (which already is added to the DataStorage m_DataInteractor->SetDataNode(m_PointSetNode); } } else { - m_PointSetNode->SetDataInteractor(NULL); - m_DataInteractor = NULL; + m_PointSetNode->SetDataInteractor(nullptr); + m_DataInteractor = nullptr; } emit EditPointSets(checked); } } void QmitkPointListWidget::OnBtnAddPointManually() { mitk::PointSet *pointSet = this->GetPointSet(); QmitkEditPointDialog editPointDialog(this); if (this->GetPointSet()->IsEmpty()) { editPointDialog.SetPoint(pointSet, 0, m_TimeStep); } else { mitk::PointSet::PointsIterator maxIt = pointSet->GetMaxId(); mitk::PointSet::PointIdentifier maxId = maxIt->Index(); editPointDialog.SetPoint(pointSet, maxId + 1, m_TimeStep); } editPointDialog.exec(); } void QmitkPointListWidget::OnListDoubleClick() { } void QmitkPointListWidget::OnPointSelectionChanged() { emit this->PointSelectionChanged(); } void QmitkPointListWidget::DeactivateInteractor(bool) { } void QmitkPointListWidget::EnableEditButton(bool enabled) { m_EditAllowed = enabled; if (enabled == false) m_ToggleAddPoint->setEnabled(false); else m_ToggleAddPoint->setEnabled(true); OnBtnAddPoint(enabled); } void QmitkPointListWidget::ObserveNewNode(mitk::DataNode *node) { if (m_DataInteractor.IsNotNull()) m_DataInteractor->SetDataNode(node); // remove old observer if (m_PointSetNode) { if (m_DataInteractor) { - m_DataInteractor = NULL; + m_DataInteractor = nullptr; m_ToggleAddPoint->setChecked(false); } m_PointSetNode->RemoveObserver(m_NodeObserverTag); m_NodeObserverTag = 0; } m_PointSetNode = node; // add new observer if necessary if (m_PointSetNode) { itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction(this, &QmitkPointListWidget::OnNodeDeleted); m_NodeObserverTag = m_PointSetNode->AddObserver(itk::DeleteEvent(), command); } else { m_NodeObserverTag = 0; } if (m_EditAllowed == true) m_ToggleAddPoint->setEnabled(m_PointSetNode); else m_ToggleAddPoint->setEnabled(false); m_RemovePointBtn->setEnabled(m_PointSetNode); m_LoadPointsBtn->setEnabled(m_PointSetNode); m_SavePointsBtn->setEnabled(m_PointSetNode); m_AddPoint->setEnabled(m_PointSetNode); } void QmitkPointListWidget::OnNodeDeleted(const itk::EventObject &) { if (m_PointSetNode.IsNotNull() && !m_NodeObserverTag) m_PointSetNode->RemoveObserver(m_NodeObserverTag); m_NodeObserverTag = 0; - m_PointSetNode = NULL; - m_PointListView->SetPointSetNode(NULL); + m_PointSetNode = nullptr; + m_PointListView->SetPointSetNode(nullptr); m_ToggleAddPoint->setEnabled(false); m_RemovePointBtn->setEnabled(false); m_LoadPointsBtn->setEnabled(false); m_SavePointsBtn->setEnabled(false); m_AddPoint->setEnabled(false); } -void QmitkPointListWidget::SetSnc1(mitk::SliceNavigationController *snc) -{ - if (snc == NULL) - { - m_PointListView->RemoveSliceNavigationController(m_Snc1); - } - else - { - m_PointListView->AddSliceNavigationController(snc); - } - m_Snc1 = snc; -} - -void QmitkPointListWidget::SetSnc2(mitk::SliceNavigationController *snc) -{ - if (snc == NULL) - { - m_PointListView->RemoveSliceNavigationController(m_Snc2); - } - else - { - m_PointListView->AddSliceNavigationController(snc); - } - m_Snc2 = snc; -} - -void QmitkPointListWidget::SetSnc3(mitk::SliceNavigationController *snc) -{ - if (snc == NULL) - { - m_PointListView->RemoveSliceNavigationController(m_Snc3); - } - else - { - m_PointListView->AddSliceNavigationController(snc); - } - m_Snc3 = snc; -} - void QmitkPointListWidget::AddSliceNavigationController(mitk::SliceNavigationController *snc) { m_PointListView->AddSliceNavigationController(snc); } void QmitkPointListWidget::RemoveSliceNavigationController(mitk::SliceNavigationController *snc) { m_PointListView->RemoveSliceNavigationController(snc); } void QmitkPointListWidget::UnselectEditButton() { m_ToggleAddPoint->setChecked(false); } diff --git a/Modules/RigidRegistration/CMakeLists.txt b/Modules/RigidRegistration/CMakeLists.txt deleted file mode 100644 index 524f6f5b41..0000000000 --- a/Modules/RigidRegistration/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -MITK_CREATE_MODULE( - SUBPROJECTS MITK-Registration - DEPENDS MitkCore - PACKAGE_DEPENDS PUBLIC ITK|ITKRegistrationCommon -) - -add_subdirectory(Testing) diff --git a/Modules/RigidRegistration/Documentation/Doxygen/Modules.dox b/Modules/RigidRegistration/Documentation/Doxygen/Modules.dox deleted file mode 100644 index 9d2e9081ba..0000000000 --- a/Modules/RigidRegistration/Documentation/Doxygen/Modules.dox +++ /dev/null @@ -1,20 +0,0 @@ -/** - \defgroup Registration RigidRegistration - \ingroup MITKModules - - \brief A couple of classes related to registration. -*/ - -/** - \defgroup RigidRegistration Classes related to rigid registration - \ingroup Registration - - \brief A couple of classes related to rigid registration. -*/ - -/** - \defgroup PointBasedRegistration Classes related to point based registration - \ingroup Registration - - \brief A couple of classes related to point based registration. -*/ diff --git a/Modules/RigidRegistration/Resources/mitkRigidRegistrationPresets.xml b/Modules/RigidRegistration/Resources/mitkRigidRegistrationPresets.xml deleted file mode 100644 index 87a898a945..0000000000 --- a/Modules/RigidRegistration/Resources/mitkRigidRegistrationPresets.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistration/Resources/mitkRigidRegistrationTestPresets.xml b/Modules/RigidRegistration/Resources/mitkRigidRegistrationTestPresets.xml deleted file mode 100644 index a4423af0e4..0000000000 --- a/Modules/RigidRegistration/Resources/mitkRigidRegistrationTestPresets.xml +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistration/Testing/CMakeLists.txt b/Modules/RigidRegistration/Testing/CMakeLists.txt deleted file mode 100644 index 153cd81e2e..0000000000 --- a/Modules/RigidRegistration/Testing/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -MITK_CREATE_MODULE_TESTS() diff --git a/Modules/RigidRegistration/Testing/files.cmake b/Modules/RigidRegistration/Testing/files.cmake deleted file mode 100644 index 46ad375f7e..0000000000 --- a/Modules/RigidRegistration/Testing/files.cmake +++ /dev/null @@ -1,4 +0,0 @@ -set(MODULE_TESTS - # mitkRigidRegistrationPresetTest.cpp - # mitkRigidRegistrationTestPresetTest.cpp -) \ No newline at end of file diff --git a/Modules/RigidRegistration/Testing/mitkRigidRegistrationPresetTest.cpp b/Modules/RigidRegistration/Testing/mitkRigidRegistrationPresetTest.cpp deleted file mode 100644 index 41136b950c..0000000000 --- a/Modules/RigidRegistration/Testing/mitkRigidRegistrationPresetTest.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkRigidRegistrationPreset.h" -#include - -int mitkRigidRegistrationPresetTest(int /*argc*/, char * /*argv*/ []) -{ - typedef itk::Array ArrayType; - - mitk::RigidRegistrationPreset *rrp = new mitk::RigidRegistrationPreset; - std::cout << "[PASSED]" << std::endl; - - // Check if the default presets (in the Functionality directory) can be loaded. - std::cout << "Testing default parameter loading...\n"; - if (!rrp->LoadPreset()) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Check if an exemplary parameter set can be extracted from the read presets. - std::cout << "Testing if exemplary default values match default parameters...\n"; - - ArrayType transformValues = rrp->getTransformValues("ITK Image Registration 12"); - ArrayType metricValues = rrp->getMetricValues("ITK Image Registration 12"); - ArrayType optimizerValues = rrp->getOptimizerValues("ITK Image Registration 12"); - ArrayType interpolatorValues = rrp->getInterpolatorValues("ITK Image Registration 12"); - - std::cout << transformValues[5] << metricValues[1] << optimizerValues[4] << interpolatorValues[0] << std::endl; - - if (!(transformValues[5] == 0.001) || !(metricValues[1] == 1) || !(optimizerValues[4] == 0.1) || - !(interpolatorValues[0] == 0)) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Testing if a save operation can be performed. - std::cout << "Testing if saving is possible...\n"; - if (!rrp->newPresets(rrp->getTransformValuesPresets(), - rrp->getMetricValuesPresets(), - rrp->getOptimizerValuesPresets(), - rrp->getInterpolatorValuesPresets(), - "TestPresets.xml")) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Testing what happens if we now repeat the test with the previously written xml file - delete rrp; - - mitk::RigidRegistrationPreset *rrp2 = new mitk::RigidRegistrationPreset; - std::cout << "[PASSED]" << std::endl; - - // Check if the default presets (in the Functionality directory) can be loaded. - std::cout << "Testing default parameter loading, second time...\n"; - if (!rrp2->LoadPreset("TestPresets.xml")) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Check if an exemplary parameter set can be extracted from the read presets. - std::cout << "Testing if exemplary default values match default parameters, second time...\n"; - - transformValues = rrp2->getTransformValues("ITK Image Registration 12"); - metricValues = rrp2->getMetricValues("ITK Image Registration 12"); - optimizerValues = rrp2->getOptimizerValues("ITK Image Registration 12"); - interpolatorValues = rrp2->getInterpolatorValues("ITK Image Registration 12"); - - if (!(transformValues[5] == 0.001) || !(metricValues[1] == 1) || !(optimizerValues[4] == 0.1) || - !(interpolatorValues[0] == 0)) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - delete rrp2; - - std::cout << "[TEST DONE]" << std::endl; - return EXIT_SUCCESS; -} diff --git a/Modules/RigidRegistration/Testing/mitkRigidRegistrationTestPresetTest.cpp b/Modules/RigidRegistration/Testing/mitkRigidRegistrationTestPresetTest.cpp deleted file mode 100644 index f0082102de..0000000000 --- a/Modules/RigidRegistration/Testing/mitkRigidRegistrationTestPresetTest.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkRigidRegistrationTestPreset.h" -#include - -int mitkRigidRegistrationTestPresetTest(int /*argc*/, char * /*argv*/ []) -{ - typedef itk::Array ArrayType; - - mitk::RigidRegistrationTestPreset *rrp = new mitk::RigidRegistrationTestPreset; - std::cout << "[PASSED]" << std::endl; - - // Check if the default presets (in the Functionality directory) can be loaded. - std::cout << "Testing default parameter loading...\n"; - if (!rrp->LoadPreset()) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Check if an exemplary parameter set can be extracted from the read presets. - std::cout << "Testing if exemplary default values match default parameters...\n"; - - ArrayType transformValues = rrp->getTransformValues("ITK Image Registration 12"); - ArrayType metricValues = rrp->getMetricValues("ITK Image Registration 12"); - ArrayType optimizerValues = rrp->getOptimizerValues("ITK Image Registration 12"); - ArrayType interpolatorValues = rrp->getInterpolatorValues("ITK Image Registration 12"); - - std::cout << transformValues[5] << metricValues[1] << optimizerValues[4] << interpolatorValues[0] << std::endl; - - if (!(transformValues[5] == 0.001) || !(metricValues[1] == 1) || !(optimizerValues[4] == 0.1) || - !(interpolatorValues[0] == 0)) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Testing if a save operation can be performed. - std::cout << "Testing if saving is possible...\n"; - if (!rrp->newPresets(rrp->getTransformValuesPresets(), - rrp->getMetricValuesPresets(), - rrp->getOptimizerValuesPresets(), - rrp->getInterpolatorValuesPresets(), - "TestPresets.xml")) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Testing what happens if we now repeat the test with the previously written xml file - delete rrp; - - mitk::RigidRegistrationTestPreset *rrp2 = new mitk::RigidRegistrationTestPreset; - std::cout << "[PASSED]" << std::endl; - - // Check if the default presets (in the Functionality directory) can be loaded. - std::cout << "Testing default parameter loading, second time...\n"; - if (!rrp2->LoadPreset("TestPresets.xml")) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - // Check if an exemplary parameter set can be extracted from the read presets. - std::cout << "Testing if exemplary default values match default parameters, second time...\n"; - - transformValues = rrp2->getTransformValues("ITK Image Registration 12"); - metricValues = rrp2->getMetricValues("ITK Image Registration 12"); - optimizerValues = rrp2->getOptimizerValues("ITK Image Registration 12"); - interpolatorValues = rrp2->getInterpolatorValues("ITK Image Registration 12"); - - if (!(transformValues[5] == 0.001) || !(metricValues[1] == 1) || !(optimizerValues[4] == 0.1) || - !(interpolatorValues[0] == 0)) - { - std::cout << "[FAILED]" << std::endl; - return EXIT_FAILURE; - } - std::cout << "[PASSED]" << std::endl; - - delete rrp2; - - std::cout << "[TEST DONE]" << std::endl; - return EXIT_SUCCESS; -} diff --git a/Modules/RigidRegistration/files.cmake b/Modules/RigidRegistration/files.cmake deleted file mode 100644 index 14735e7ec5..0000000000 --- a/Modules/RigidRegistration/files.cmake +++ /dev/null @@ -1,18 +0,0 @@ -set(CPP_FILES - mitkImageRegistrationMethod.cpp - mitkMetricParameters.cpp - mitkOptimizerFactory.cpp - mitkOptimizerParameters.cpp - mitkRigidRegistrationObserver.cpp - mitkRigidRegistrationPreset.cpp - mitkTransformParameters.cpp - mitkPyramidalRegistrationMethod.cpp -) - -set(RESOURCE_FILES - mitkRigidRegistrationPresets.xml - mitkRigidRegistrationTestPresets.xml -) - -MITK_MULTIPLEX_PICTYPE( mitkImageRegistrationMethod-TYPE.cpp ) -MITK_MULTIPLEX_PICTYPE( mitkPyramidalRegistrationMethod-TYPE.cpp ) diff --git a/Modules/RigidRegistration/mitkImageRegistrationMethod-TYPE.cpp b/Modules/RigidRegistration/mitkImageRegistrationMethod-TYPE.cpp deleted file mode 100644 index ef7a4f12d8..0000000000 --- a/Modules/RigidRegistration/mitkImageRegistrationMethod-TYPE.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include -#include - -#define InstantiateAccessFunction_RegistrationAccessItkImage(pixelType, dim) \ - template void mitk::ImageRegistrationMethodAccessFunctor::AccessItkImage( \ - const itk::Image *itkImage1, mitk::ImageRegistrationMethod *method); - -InstantiateAccessFunctionForFixedPixelType(RegistrationAccessItkImage, (@TYPE@)) diff --git a/Modules/RigidRegistration/mitkImageRegistrationMethod.cpp b/Modules/RigidRegistration/mitkImageRegistrationMethod.cpp deleted file mode 100644 index 2a7281e639..0000000000 --- a/Modules/RigidRegistration/mitkImageRegistrationMethod.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkImageRegistrationMethod.h" -#include "mitkImageRegistrationMethodAccessFunctor.h" - -namespace mitk -{ - ImageRegistrationMethod::ImageRegistrationMethod() : m_Interpolator(0), m_MultiResolutionScales(1) - { - m_ReferenceImage = Image::New(); - m_OptimizerScales.clear(); - } - - ImageRegistrationMethod::~ImageRegistrationMethod() {} - void ImageRegistrationMethod::GenerateData() - { - if (this->GetInput()) - { - ImageRegistrationMethodAccessFunctor()(this->GetInput(), this); - } - } - - void ImageRegistrationMethod::SetObserver(RigidRegistrationObserver::Pointer observer) { m_Observer = observer; } - void ImageRegistrationMethod::SetInterpolator(int interpolator) { m_Interpolator = interpolator; } - void ImageRegistrationMethod::SetReferenceImage(Image::Pointer fixedImage) - { - m_ReferenceImage = fixedImage; - SetNthInput(1, m_ReferenceImage); - Modified(); - } - - void ImageRegistrationMethod::SetMovingMask(Image::Pointer movingMask) - { - m_MovingMask = movingMask; - SetNthInput(3, m_MovingMask); - Modified(); - } - - void ImageRegistrationMethod::SetFixedMask(Image::Pointer FixedMask) - { - m_FixedMask = FixedMask; - SetNthInput(4, m_FixedMask); - Modified(); - } - - void ImageRegistrationMethod::SetTransform(itk::Object::Pointer transform) - { - m_Transform = transform; - - MITK_INFO("Image.Registration.Method") << "Transform : " << m_Transform; - } - - void ImageRegistrationMethod::SetMetric(itk::Object::Pointer metric) { m_Metric = metric; } - void ImageRegistrationMethod::SetOptimizer(itk::Object::Pointer optimizer) { m_Optimizer = optimizer; } - void ImageRegistrationMethod::SetOptimizerScales(itk::Array scales) - { - m_OptimizerScales.set_size(scales.size()); - m_OptimizerScales.copy_in(scales.data_block()); - } - - void ImageRegistrationMethod::SetNumberOfLevels(unsigned int levels) { m_MultiResolutionScales = levels; } -} // end namespace diff --git a/Modules/RigidRegistration/mitkImageRegistrationMethod.h b/Modules/RigidRegistration/mitkImageRegistrationMethod.h deleted file mode 100644 index c4908d9a25..0000000000 --- a/Modules/RigidRegistration/mitkImageRegistrationMethod.h +++ /dev/null @@ -1,99 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKIMAGEREGISTRATIONMETHOD_H -#define MITKIMAGEREGISTRATIONMETHOD_H - -#include "MitkRigidRegistrationExports.h" -#include "itkImageRegistrationMethod.h" -#include "itkSingleValuedNonLinearOptimizer.h" - -#include "mitkCommon.h" -#include "mitkImageAccessByItk.h" -#include "mitkImageToImageFilter.h" -#include "mitkRigidRegistrationObserver.h" - -#include "itkImageMaskSpatialObject.h" -#include "mitkRigidRegistrationPreset.h" - -namespace mitk -{ - /*! - \brief Main class for the rigid registration pipeline. - - \ingroup RigidRegistration - - \author Daniel Stein - */ - class MITKRIGIDREGISTRATION_EXPORT ImageRegistrationMethod : public ImageToImageFilter - { - public: - typedef itk::SingleValuedNonLinearOptimizer OptimizerType; - typedef itk::ImageMaskSpatialObject<3> MaskType; - - mitkClassMacro(ImageRegistrationMethod, ImageToImageFilter); - - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - static const int LINEARINTERPOLATOR = 0; - static const int NEARESTNEIGHBORINTERPOLATOR = 1; - - void SetObserver(RigidRegistrationObserver::Pointer observer); - - void SetInterpolator(int interpolator); - - virtual void GenerateData() override; - - virtual void SetReferenceImage(Image::Pointer fixedImage); - - virtual void SetFixedMask(Image::Pointer fixedMask); - - virtual void SetMovingMask(Image::Pointer movingMask); - - void SetOptimizerScales(itk::Array scales); - - void SetTransform(itk::Object::Pointer transform); - - void SetMetric(itk::Object::Pointer metric); - - void SetOptimizer(itk::Object::Pointer optimizer); - - void SetNumberOfLevels(unsigned int levels); - - protected: - ImageRegistrationMethod(); - virtual ~ImageRegistrationMethod(); - - friend struct ImageRegistrationMethodAccessFunctor; - - RigidRegistrationObserver::Pointer m_Observer; - int m_Interpolator; - Image::Pointer m_ReferenceImage; - Image::Pointer m_FixedMask; - Image::Pointer m_MovingMask; - - virtual void GenerateOutputInformation() override {} - private: - itk::Object::Pointer m_Transform; - itk::Object::Pointer m_Metric; - itk::Object::Pointer m_Optimizer; - itk::Array m_OptimizerScales; - - unsigned int m_MultiResolutionScales; - }; -} - -#endif // MITKIMAGEREGISTRATIONMETHOD_H diff --git a/Modules/RigidRegistration/mitkImageRegistrationMethodAccessFunctor.h b/Modules/RigidRegistration/mitkImageRegistrationMethodAccessFunctor.h deleted file mode 100644 index 98944aa699..0000000000 --- a/Modules/RigidRegistration/mitkImageRegistrationMethodAccessFunctor.h +++ /dev/null @@ -1,40 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKIMAGEREGISTRATIONMETHODACCESSFUNCTOR_H -#define MITKIMAGEREGISTRATIONMETHODACCESSFUNCTOR_H - -#include - -namespace mitk -{ - class ImageRegistrationMethod; - - struct ImageRegistrationMethodAccessFunctor - { - typedef ImageRegistrationMethodAccessFunctor Self; - - void operator()(const mitk::Image *img, ImageRegistrationMethod *method) - { - AccessByItk_1(img, AccessItkImage, method) - } - - template - void AccessItkImage(const itk::Image *itkImage1, ImageRegistrationMethod *method); - }; -} - -#endif // MITKIMAGEREGISTRATIONMETHODACCESSFUNCTOR_H diff --git a/Modules/RigidRegistration/mitkImageRegistrationMethodAccessFunctor.txx b/Modules/RigidRegistration/mitkImageRegistrationMethodAccessFunctor.txx deleted file mode 100644 index f682dd1610..0000000000 --- a/Modules/RigidRegistration/mitkImageRegistrationMethodAccessFunctor.txx +++ /dev/null @@ -1,177 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkImageRegistrationMethod.h" -#include "mitkImageRegistrationMethodAccessFunctor.h" - -#include - -#include -#include - -namespace mitk -{ - template - void ImageRegistrationMethodAccessFunctor::AccessItkImage(const itk::Image *itkImage1, - ImageRegistrationMethod *method) - { - // convert mitk masks to itk masks - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typedef typename itk::Image MaskImageType; - typedef typename itk::ImageMaskSpatialObject ImageMaskType; - typename ImageMaskType::Pointer movingImageMask; - if (method->m_MovingMask.IsNotNull()) - { - typename MovingImageType::Pointer movingMask = MovingImageType::New(); - mitk::CastToItkImage(method->m_MovingMask, movingMask); - typename itk::CastImageFilter::Pointer maskImageCaster = - itk::CastImageFilter::New(); - maskImageCaster->SetInput(movingMask); - maskImageCaster->UpdateLargestPossibleRegion(); - movingImageMask = ImageMaskType::New(); - movingImageMask->SetImage(maskImageCaster->GetOutput()); - } - - typename ImageMaskType::Pointer fixedImageMask; - if (method->m_FixedMask.IsNotNull()) - { - typename FixedImageType::Pointer fixedMask = FixedImageType::New(); - mitk::CastToItkImage(method->m_FixedMask, fixedMask); - typename itk::CastImageFilter::Pointer maskImageCaster = - itk::CastImageFilter::New(); - maskImageCaster->SetInput(fixedMask); - maskImageCaster->UpdateLargestPossibleRegion(); - fixedImageMask = ImageMaskType::New(); - fixedImageMask->SetImage(maskImageCaster->GetOutput()); - } - - // typedefs - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typedef typename itk::LinearInterpolateImageFunction InterpolatorType; - typedef itk::NearestNeighborInterpolateImageFunction InterpolatorType2; - // typedef typename itk::ImageRegistrationMethod RegistrationType; - typedef typename itk::MultiResolutionImageRegistrationMethod RegistrationType; - typedef typename itk::Transform TransformType; - typedef typename itk::MatrixOffsetTransformBase MatrixTransformType; - typedef typename TransformType::Pointer TransformPointer; - typedef typename itk::ImageToImageMetric MetricType; - typedef typename MetricType::Pointer MetricPointer; - typedef typename itk::SingleValuedNonLinearOptimizer OptimizerType; - // the fixed and the moving image - typename FixedImageType::Pointer fixedImage = FixedImageType::New(); - typename MovingImageType::ConstPointer movingImage = itkImage1; - mitk::CastToItkImage(method->m_ReferenceImage, fixedImage); - - // the metric - MetricPointer metric = dynamic_cast(method->m_Metric.GetPointer()); - if (movingImageMask.IsNotNull()) - metric->SetMovingImageMask(movingImageMask); - if (fixedImageMask.IsNotNull()) - metric->SetFixedImageMask(fixedImageMask); - - // the transform - TransformPointer transform = dynamic_cast(method->m_Transform.GetPointer()); - if (transform.IsNull()) - mitkThrow() << "Failed to retrieve registration transform, dynamic cast failed"; - - // the optimizer - typename OptimizerType::Pointer optimizer = dynamic_cast(method->m_Optimizer.GetPointer()); - - // optimizer scales - if (method->m_OptimizerScales.Size() != 0) - { - typename OptimizerType::ScalesType scales(transform->GetNumberOfParameters()); - for (unsigned int i = 0; i < scales.Size(); i++) - { - scales[i] = method->m_OptimizerScales[i]; - } - optimizer->SetScales(scales); - } - // the registration method - typename RegistrationType::Pointer registration = RegistrationType::New(); - registration->SetNumberOfLevels(method->m_MultiResolutionScales); - registration->SetMetric(metric); - registration->SetOptimizer(optimizer); - registration->SetTransform(transform); - registration->SetFixedImage(fixedImage); - registration->SetMovingImage(movingImage); - registration->SetFixedImageRegion(fixedImage->GetBufferedRegion()); - - // set initial position to identity by first setting the transformation to identity - // and then using its parameters - - typename TransformType::ParametersType identityParameters = transform->GetParameters(); - // the SetIdentity avialable only for a transform subset (of type matrix offset) - MatrixTransformType *matrix_transform = dynamic_cast(method->m_Transform.GetPointer()); - if (matrix_transform != nullptr) - { - matrix_transform->SetIdentity(); - identityParameters = matrix_transform->GetParameters(); - } - - registration->SetInitialTransformParameters(identityParameters); - optimizer->SetInitialPosition(identityParameters); - - if (method->m_Interpolator == ImageRegistrationMethod::LINEARINTERPOLATOR) - { - typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); - registration->SetInterpolator(interpolator); - } - else if (method->m_Interpolator == ImageRegistrationMethod::NEARESTNEIGHBORINTERPOLATOR) - { - typename InterpolatorType2::Pointer interpolator = InterpolatorType2::New(); - registration->SetInterpolator(interpolator); - } - - // registering command observer with the optimizer - unsigned int pyramid_observer_tag = 0; - if (method->m_Observer.IsNotNull()) - { - method->m_Observer->AddStepsToDo(20); - optimizer->AddObserver(itk::IterationEvent(), method->m_Observer); - // registration->AddObserver(itk::IterationEvent(), method->m_Observer); - transform->AddObserver(itk::IterationEvent(), method->m_Observer); - - typename mitk::RigidRegistrationPyramidObserver::Pointer pyramid_observer = - mitk::RigidRegistrationPyramidObserver::New(); - - pyramid_observer_tag = registration->AddObserver(itk::IterationEvent(), pyramid_observer); - } - - registration->Update(); - - if (pyramid_observer_tag) - { - registration->RemoveObserver(pyramid_observer_tag); - } - - if (method->m_Observer.IsNotNull()) - { - optimizer->RemoveAllObservers(); - registration->RemoveAllObservers(); - transform->RemoveAllObservers(); - method->m_Observer->SetRemainingProgress(15); - } - - if (method->m_Observer.IsNotNull()) - { - method->m_Observer->SetRemainingProgress(5); - } - } - -} // end namespace diff --git a/Modules/RigidRegistration/mitkMetricFactory.h b/Modules/RigidRegistration/mitkMetricFactory.h deleted file mode 100644 index c7aa0c40a8..0000000000 --- a/Modules/RigidRegistration/mitkMetricFactory.h +++ /dev/null @@ -1,89 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKMETRICFACTORY_H -#define MITKMETRICFACTORY_H - -#include "itkImage.h" -#include "itkImageMaskSpatialObject.h" -#include "itkImageToImageMetric.h" -#include "mitkMetricParameters.h" - -namespace mitk -{ - /*! - \brief This class creates a metric for a rigid registration process. - - This class will e.g. be instantiated by mitkImageRegistrationMethod and a - metric corresponding to the integer value stored in mitkMetricParameters - will be created. Therefore SetMetricParameters() has to be called with an instance - of mitkMetricParameters, which holds all parameter informations for the new - metric. - - GetMetric() returns the metric which then can be used in combination with a - transform, an optimizer and an interpolator within a registration pipeline. - - - \ingroup RigidRegistration - - \author Daniel Stein - */ - - template - class MetricFactory : public itk::Object - { - public: - mitkClassMacroItkParent(MetricFactory, itk::Object); - - /** Method for creation through the object factory. */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - typedef typename itk::Image FixedImageType; - typedef typename itk::Image FixedMaskImageType; - typedef typename itk::ImageMaskSpatialObject FixedImageMaskType; - typedef typename itk::Image MovingImageType; - typedef typename itk::Image MovingMaskImageType; - typedef typename itk::ImageMaskSpatialObject MovingImageMaskType; - - typedef typename itk::ImageToImageMetric MetricType; - typedef typename MetricType::Pointer MetricPointer; - - /** - \brief Returns the metric which then can be used in combination with a transform, an optimizer - and an interpolator within a registration pipeline. - */ - MetricPointer GetMetric(); - - /** - \brief Sets the instance to the metric parameters class which holds all parameters for the new metric. - */ - void SetMetricParameters(MetricParameters::Pointer metricParameters) { m_MetricParameters = metricParameters; } - /** - \brief Returns the instance to the metric parameters class which holds all parameters for the new metric. - */ - MetricParameters::Pointer GetMetricParameters() { return m_MetricParameters; } - protected: - MetricFactory(); - ~MetricFactory(){}; - - MetricParameters::Pointer m_MetricParameters; - }; - -} // namespace mitk - -#include "mitkMetricFactory.txx" - -#endif // MITKMETRICFACTORY_H diff --git a/Modules/RigidRegistration/mitkMetricFactory.txx b/Modules/RigidRegistration/mitkMetricFactory.txx deleted file mode 100644 index 87d489821c..0000000000 --- a/Modules/RigidRegistration/mitkMetricFactory.txx +++ /dev/null @@ -1,196 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkMetricFactory.h" -#include "mitkMetricParameters.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mitk -{ - template - MetricFactory::MetricFactory() : m_MetricParameters(nullptr) - { - } - - template - typename MetricFactory::MetricPointer - MetricFactory::GetMetric() - { - int metric = m_MetricParameters->GetMetric(); - if (metric == MetricParameters::MEANSQUARESIMAGETOIMAGEMETRIC) - { - typename itk::MeanSquaresImageToImageMetric::Pointer MetricPointer = - itk::MeanSquaresImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::NORMALIZEDCORRELATIONIMAGETOIMAGEMETRIC) - { - typename itk::NormalizedCorrelationImageToImageMetric::Pointer MetricPointer = - itk::NormalizedCorrelationImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::GRADIENTDIFFERENCEIMAGETOIMAGEMETRIC) - { - typename itk::GradientDifferenceImageToImageMetric::Pointer MetricPointer = - itk::GradientDifferenceImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::KULLBACKLEIBLERCOMPAREHISTOGRAMIMAGETOIMAGEMETRIC) - { - typename itk::KullbackLeiblerCompareHistogramImageToImageMetric::Pointer - MetricPointer = itk::KullbackLeiblerCompareHistogramImageToImageMetric::New(); - unsigned int nBins = m_MetricParameters->GetNumberOfHistogramBinsKullbackLeiblerCompareHistogram(); - typename itk::KullbackLeiblerCompareHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::CORRELATIONCOEFFICIENTHISTOGRAMIMAGETOIMAGEMETRIC) - { - typename itk::CorrelationCoefficientHistogramImageToImageMetric::Pointer - MetricPointer = itk::CorrelationCoefficientHistogramImageToImageMetric::New(); - unsigned int nBins = m_MetricParameters->GetNumberOfHistogramBinsCorrelationCoefficientHistogram(); - typename itk::CorrelationCoefficientHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::MEANSQUARESHISTOGRAMIMAGETOIMAGEMETRIC) - { - typename itk::MeanSquaresHistogramImageToImageMetric::Pointer MetricPointer = - itk::MeanSquaresHistogramImageToImageMetric::New(); - unsigned int nBins = m_MetricParameters->GetNumberOfHistogramBinsMeanSquaresHistogram(); - typename itk::MeanSquaresHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::MUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC) - { - typename itk::MutualInformationHistogramImageToImageMetric::Pointer - MetricPointer = itk::MutualInformationHistogramImageToImageMetric::New(); - unsigned int nBins = m_MetricParameters->GetNumberOfHistogramBinsMutualInformationHistogram(); - typename itk::MutualInformationHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::NORMALIZEDMUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC) - { - typename itk::NormalizedMutualInformationHistogramImageToImageMetric::Pointer - MetricPointer = - itk::NormalizedMutualInformationHistogramImageToImageMetric::New(); - unsigned int nBins = m_MetricParameters->GetNumberOfHistogramBinsNormalizedMutualInformationHistogram(); - typename itk::NormalizedMutualInformationHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::MATTESMUTUALINFORMATIONIMAGETOIMAGEMETRIC) - { - typename itk::MattesMutualInformationImageToImageMetric::Pointer MetricPointer = - itk::MattesMutualInformationImageToImageMetric::New(); - bool useSampling = m_MetricParameters->GetUseSamplesMattesMutualInformation(); - if (useSampling) - { - // set the number of samples to use - MetricPointer->SetNumberOfSpatialSamples(m_MetricParameters->GetSpatialSamplesMattesMutualInformation()); - } - else - { - MetricPointer->UseAllPixelsOn(); - } - MetricPointer->SetNumberOfHistogramBins(m_MetricParameters->GetNumberOfHistogramBinsMattesMutualInformation()); - MetricPointer->ReinitializeSeed(76926294); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::MEANRECIPROCALSQUAREDIFFERENCEIMAGETOIMAGEMETRIC) - { - typename itk::MeanReciprocalSquareDifferenceImageToImageMetric::Pointer - MetricPointer = itk::MeanReciprocalSquareDifferenceImageToImageMetric::New(); - //------------------------------------------------------------ - // The lambda value is the intensity difference that should - // make the metric drop by 50% - //------------------------------------------------------------ - MetricPointer->SetLambda(m_MetricParameters->GetLambdaMeanReciprocalSquareDifference()); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::MUTUALINFORMATIONIMAGETOIMAGEMETRIC) - { - typename itk::MutualInformationImageToImageMetric::Pointer MetricPointer = - itk::MutualInformationImageToImageMetric::New(); - MetricPointer->SetNumberOfSpatialSamples(m_MetricParameters->GetSpatialSamplesMutualInformation()); - MetricPointer->SetFixedImageStandardDeviation( - m_MetricParameters->GetFixedImageStandardDeviationMutualInformation()); - MetricPointer->SetMovingImageStandardDeviation( - m_MetricParameters->GetMovingImageStandardDeviationMutualInformation()); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::MATCHCARDINALITYIMAGETOIMAGEMETRIC) - { - typename itk::MatchCardinalityImageToImageMetric::Pointer MetricPointer = - itk::MatchCardinalityImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - else if (metric == MetricParameters::KAPPASTATISTICIMAGETOIMAGEMETRIC) - { - typename itk::KappaStatisticImageToImageMetric::Pointer MetricPointer = - itk::KappaStatisticImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_MetricParameters->GetComputeGradient()); - return MetricPointer.GetPointer(); - } - return NULL; - } -} // end namespace diff --git a/Modules/RigidRegistration/mitkMetricParameters.cpp b/Modules/RigidRegistration/mitkMetricParameters.cpp deleted file mode 100644 index aa1c211bf5..0000000000 --- a/Modules/RigidRegistration/mitkMetricParameters.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkMetricParameters.h" - -namespace mitk -{ - MetricParameters::MetricParameters() - : m_Metric(MEANSQUARESIMAGETOIMAGEMETRIC), - m_ComputeGradient(true), - // for itk::KullbackLeiblerCompareHistogramImageToImageMetric - m_NumberOfHistogramBinsKullbackLeiblerCompareHistogram(256), - // for itk::CorrelationCoefficientHistogramImageToImageMetric - m_NumberOfHistogramBinsCorrelationCoefficientHistogram(256), - // for itk::MeanSquaresHistogramImageToImageMetric - m_NumberOfHistogramBinsMeanSquaresHistogram(256), - // for itk::MutualInformationHistogramImageToImageMetric - m_NumberOfHistogramBinsMutualInformationHistogram(256), - // for itk::NormalizedMutualInformationHistogramImageToImageMetric - m_NumberOfHistogramBinsNormalizedMutualInformationHistogram(256), - // for itk::MattesMutualInformationImageToImageMetric - m_NumberOfHistogramBinsMattesMutualInformation(256), - m_UseSamplesMattesMutualInformation(true), - m_SpatialSamplesMattesMutualInformation(500), - // for itk::MeanReciprocalSquareDifferenceImageToImageMetric - m_LambdaMeanReciprocalSquareDifference(10), - // for itk::MutualInformationImageToImageMetric - m_SpatialSamplesMutualInformation(100), - m_FixedImageStandardDeviationMutualInformation(0.4), - m_MovingImageStandardDeviationMutualInformation(0.4), - m_UseNormalizerAndSmootherMutualInformation(true), - m_FixedSmootherVarianceMutualInformation(0.2), - m_MovingSmootherVarianceMutualInformation(0.2) - { - } -} // namespace mitk diff --git a/Modules/RigidRegistration/mitkMetricParameters.h b/Modules/RigidRegistration/mitkMetricParameters.h deleted file mode 100644 index 56cab57c2a..0000000000 --- a/Modules/RigidRegistration/mitkMetricParameters.h +++ /dev/null @@ -1,268 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKMETRICPARAMETERS_H -#define MITKMETRICPARAMETERS_H - -#include "MitkRigidRegistrationExports.h" -#include "mitkCommon.h" -#include - -namespace mitk -{ - /*! - \brief This class is used to hold all metric parameters needed for a rigid registration process. - - To use the rigid registration framework you have to create an instance of this class and fill it with the parameters - belonging to the selected metric. To let the rigid registration work properly, this instance has to be given - to mitkImageRegistrationMethod before calling the update() method in mitkImageRegistrationMethod. - - Also instances of the classes mitkTransformParameters and mitkOptimizerParameters have to be set in - mitkImageRegistrationMethod - before calling the update() method. - - - \ingroup RigidRegistration - - \author Daniel Stein - */ - class MITKRIGIDREGISTRATION_EXPORT MetricParameters : public itk::Object - { - public: - mitkClassMacroItkParent(MetricParameters, ::itk::Object); - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /** - \brief Unique integer value for every metric. - */ - enum MetricType { - MEANSQUARESIMAGETOIMAGEMETRIC = 0, - NORMALIZEDCORRELATIONIMAGETOIMAGEMETRIC = 1, - GRADIENTDIFFERENCEIMAGETOIMAGEMETRIC = 2, - KULLBACKLEIBLERCOMPAREHISTOGRAMIMAGETOIMAGEMETRIC = 3, - CORRELATIONCOEFFICIENTHISTOGRAMIMAGETOIMAGEMETRIC = 4, - MEANSQUARESHISTOGRAMIMAGETOIMAGEMETRIC = 5, - MUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC = 6, - NORMALIZEDMUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC = 7, - MATTESMUTUALINFORMATIONIMAGETOIMAGEMETRIC = 8, - MEANRECIPROCALSQUAREDIFFERENCEIMAGETOIMAGEMETRIC = 9, - MUTUALINFORMATIONIMAGETOIMAGEMETRIC = 10, - MATCHCARDINALITYIMAGETOIMAGEMETRIC = 11, - KAPPASTATISTICIMAGETOIMAGEMETRIC = 12 - }; - - /** - \brief Sets the metric used for registration by its unique integer value. - */ - itkSetMacro(Metric, int); - /** - \brief Returns the metric used for registration by its unique integer value. - */ - itkGetMacro(Metric, int); - - /** - \brief Sets whether a gradient image has to be computed. Some optimizer need this. - */ - itkSetMacro(ComputeGradient, bool); - /** - \brief Returns whether a gradient image has to be computed. - */ - itkGetMacro(ComputeGradient, bool); - - /** - \brief for itk::KullbackLeiblerCompareHistogramImageToImageMetric - */ - itkSetMacro(NumberOfHistogramBinsKullbackLeiblerCompareHistogram, unsigned int); - - /** - \brief for itk::KullbackLeiblerCompareHistogramImageToImageMetric - */ - itkGetMacro(NumberOfHistogramBinsKullbackLeiblerCompareHistogram, unsigned int); - - /** - \brief for itk::CorrelationCoefficientHistogramImageToImageMetric - */ - itkSetMacro(NumberOfHistogramBinsCorrelationCoefficientHistogram, unsigned int); - - /** - \brief for itk::CorrelationCoefficientHistogramImageToImageMetric - */ - itkGetMacro(NumberOfHistogramBinsCorrelationCoefficientHistogram, unsigned int); - - /** - \brief for itk::MeanSquaresHistogramImageToImageMetric - */ - itkSetMacro(NumberOfHistogramBinsMeanSquaresHistogram, unsigned int); - - /** - \brief for itk::MeanSquaresHistogramImageToImageMetric - */ - itkGetMacro(NumberOfHistogramBinsMeanSquaresHistogram, unsigned int); - - /** - \brief for itk::MutualInformationHistogramImageToImageMetric - */ - itkSetMacro(NumberOfHistogramBinsMutualInformationHistogram, unsigned int); - - /** - \brief for itk::MutualInformationHistogramImageToImageMetric - */ - itkGetMacro(NumberOfHistogramBinsMutualInformationHistogram, unsigned int); - - /** - \brief for itk::NormalizedMutualInformationHistogramImageToImageMetric - */ - itkSetMacro(NumberOfHistogramBinsNormalizedMutualInformationHistogram, unsigned int); - - /** - \brief for itk::NormalizedMutualInformationHistogramImageToImageMetric - */ - itkGetMacro(NumberOfHistogramBinsNormalizedMutualInformationHistogram, unsigned int); - - /** - \brief for itk::MattesMutualInformationImageToImageMetric - */ - itkSetMacro(SpatialSamplesMattesMutualInformation, unsigned int); - - /** - \brief for itk::MattesMutualInformationImageToImageMetric - */ - itkGetMacro(SpatialSamplesMattesMutualInformation, unsigned int); - - /** - \brief for itk::MattesMutualInformationImageToImageMetric - */ - itkSetMacro(UseSamplesMattesMutualInformation, bool); - - /** - \brief for itk::MattesMutualInformationImageToImageMetric - */ - itkGetMacro(UseSamplesMattesMutualInformation, bool); - - /** - \brief for itk::MattesMutualInformationImageToImageMetric - */ - itkSetMacro(NumberOfHistogramBinsMattesMutualInformation, unsigned int); - - /** - \brief for itk::MattesMutualInformationImageToImageMetric - */ - itkGetMacro(NumberOfHistogramBinsMattesMutualInformation, unsigned int); - - /** - \brief for itk::MeanReciprocalSquareDifferenceImageToImageMetric - */ - itkSetMacro(LambdaMeanReciprocalSquareDifference, unsigned int); - - /** - \brief for itk::MeanReciprocalSquareDifferenceImageToImageMetric - */ - itkGetMacro(LambdaMeanReciprocalSquareDifference, unsigned int); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkSetMacro(SpatialSamplesMutualInformation, unsigned int); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkGetMacro(SpatialSamplesMutualInformation, unsigned int); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkSetMacro(FixedImageStandardDeviationMutualInformation, float); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkGetMacro(FixedImageStandardDeviationMutualInformation, float); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkSetMacro(MovingImageStandardDeviationMutualInformation, float); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkGetMacro(MovingImageStandardDeviationMutualInformation, float); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkSetMacro(UseNormalizerAndSmootherMutualInformation, bool); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkGetMacro(UseNormalizerAndSmootherMutualInformation, bool); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkSetMacro(FixedSmootherVarianceMutualInformation, float); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkGetMacro(FixedSmootherVarianceMutualInformation, float); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkSetMacro(MovingSmootherVarianceMutualInformation, float); - - /** - \brief for itk::MutualInformationImageToImageMetric - */ - itkGetMacro(MovingSmootherVarianceMutualInformation, float); - - protected: - MetricParameters(); - ~MetricParameters(){}; - - int m_Metric; - bool m_ComputeGradient; - // for itk::KullbackLeiblerCompareHistogramImageToImageMetric - unsigned int m_NumberOfHistogramBinsKullbackLeiblerCompareHistogram; - // for itk::CorrelationCoefficientHistogramImageToImageMetric - unsigned int m_NumberOfHistogramBinsCorrelationCoefficientHistogram; - // for itk::MeanSquaresHistogramImageToImageMetric - unsigned int m_NumberOfHistogramBinsMeanSquaresHistogram; - // for itk::MutualInformationHistogramImageToImageMetric - unsigned int m_NumberOfHistogramBinsMutualInformationHistogram; - // for itk::NormalizedMutualInformationHistogramImageToImageMetric - unsigned int m_NumberOfHistogramBinsNormalizedMutualInformationHistogram; - // for itk::MattesMutualInformationImageToImageMetric - unsigned int m_NumberOfHistogramBinsMattesMutualInformation; - bool m_UseSamplesMattesMutualInformation; - unsigned int m_SpatialSamplesMattesMutualInformation; - // for itk::MeanReciprocalSquareDifferenceImageToImageMetric - unsigned int m_LambdaMeanReciprocalSquareDifference; - // for itk::MutualInformationImageToImageMetric - unsigned int m_SpatialSamplesMutualInformation; - float m_FixedImageStandardDeviationMutualInformation; - float m_MovingImageStandardDeviationMutualInformation; - bool m_UseNormalizerAndSmootherMutualInformation; - float m_FixedSmootherVarianceMutualInformation; - float m_MovingSmootherVarianceMutualInformation; - }; - -} // namespace mitk - -#endif // MITKMETRICPARAMETERS_H diff --git a/Modules/RigidRegistration/mitkOptimizerFactory.cpp b/Modules/RigidRegistration/mitkOptimizerFactory.cpp deleted file mode 100644 index d063c7233f..0000000000 --- a/Modules/RigidRegistration/mitkOptimizerFactory.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkOptimizerFactory.h" -#include "mitkOptimizerParameters.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mitk -{ - OptimizerFactory::OptimizerFactory() : m_OptimizerParameters(nullptr), m_NumberTransformParameters(16) {} - OptimizerFactory::~OptimizerFactory() {} - void OptimizerFactory::SetNumberOfTransformParameters(int numberTransformParameters) - { - m_NumberTransformParameters = numberTransformParameters; - } - - OptimizerFactory::OptimizerType::Pointer OptimizerFactory::GetOptimizer() - { - if (m_OptimizerParameters.IsNull()) - { - MITK_ERROR << "No parameters set! Returning\n"; - return nullptr; - } - int optimizer = m_OptimizerParameters->GetOptimizer(); - if (optimizer == OptimizerParameters::EXHAUSTIVEOPTIMIZER) - { - itk::ExhaustiveOptimizer::Pointer OptimizerPointer = itk::ExhaustiveOptimizer::New(); - OptimizerPointer->SetStepLength(m_OptimizerParameters->GetStepLengthExhaustive()); - itk::ExhaustiveOptimizer::StepsType steps(m_NumberTransformParameters); - for (int i = 0; i < m_NumberTransformParameters; i++) - { - steps[i] = m_OptimizerParameters->GetNumberOfStepsExhaustive(); - } - - OptimizerPointer->SetNumberOfSteps(steps); - - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::GRADIENTDESCENTOPTIMIZER) - { - itk::GradientDescentOptimizer::Pointer OptimizerPointer = itk::GradientDescentOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetLearningRate(m_OptimizerParameters->GetLearningRateGradientDescent()); - OptimizerPointer->SetNumberOfIterations(m_OptimizerParameters->GetNumberOfIterationsGradientDescent()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::QUATERNIONRIGIDTRANSFORMGRADIENTDESCENTOPTIMIZER) - { - itk::QuaternionRigidTransformGradientDescentOptimizer::Pointer OptimizerPointer = - itk::QuaternionRigidTransformGradientDescentOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetLearningRate( - m_OptimizerParameters->GetLearningRateQuaternionRigidTransformGradientDescent()); - OptimizerPointer->SetNumberOfIterations( - m_OptimizerParameters->GetNumberOfIterationsQuaternionRigidTransformGradientDescent()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::LBFGSBOPTIMIZER) - { - itk::LBFGSBOptimizer::Pointer OptimizerPointer = itk::LBFGSBOptimizer::New(); - // Set up boundary conditions - itk::LBFGSBOptimizer::BoundValueType lower(12); - itk::LBFGSBOptimizer::BoundValueType upper(12); - itk::LBFGSBOptimizer::BoundSelectionType select(12); - - lower.Fill(-1); - upper.Fill(10); - select.Fill(2); - - OptimizerPointer->SetLowerBound(lower); - OptimizerPointer->SetUpperBound(upper); - OptimizerPointer->SetBoundSelection(select); - OptimizerPointer->SetCostFunctionConvergenceFactor(1e+1); - OptimizerPointer->SetMaximumNumberOfCorrections(5); - OptimizerPointer->SetProjectedGradientTolerance(1e-5); - OptimizerPointer->SetMaximumNumberOfEvaluations(500); - OptimizerPointer->SetMaximumNumberOfIterations(200); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::ONEPLUSONEEVOLUTIONARYOPTIMIZER) - { - itk::OnePlusOneEvolutionaryOptimizer::Pointer OptimizerPointer = itk::OnePlusOneEvolutionaryOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - itk::Statistics::NormalVariateGenerator::Pointer generator = itk::Statistics::NormalVariateGenerator::New(); - generator->Initialize(12345); - OptimizerPointer->SetNormalVariateGenerator(generator); - OptimizerPointer->SetGrowthFactor(m_OptimizerParameters->GetGrowthFactorOnePlusOneEvolutionary()); - OptimizerPointer->SetShrinkFactor(m_OptimizerParameters->GetShrinkFactorOnePlusOneEvolutionary()); - OptimizerPointer->SetEpsilon(m_OptimizerParameters->GetEpsilonOnePlusOneEvolutionary()); - OptimizerPointer->SetInitialRadius(m_OptimizerParameters->GetInitialRadiusOnePlusOneEvolutionary()); - OptimizerPointer->SetMaximumIteration(m_OptimizerParameters->GetNumberOfIterationsOnePlusOneEvolutionary()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::POWELLOPTIMIZER) - { - itk::PowellOptimizer::Pointer OptimizerPointer = itk::PowellOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetStepLength(m_OptimizerParameters->GetStepLengthPowell()); - OptimizerPointer->SetStepTolerance(m_OptimizerParameters->GetStepTolerancePowell()); - OptimizerPointer->SetValueTolerance(m_OptimizerParameters->GetValueTolerancePowell()); - OptimizerPointer->SetMaximumIteration(m_OptimizerParameters->GetNumberOfIterationsPowell()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::FRPROPTIMIZER) - { - itk::FRPROptimizer::Pointer OptimizerPointer = itk::FRPROptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetStepLength(m_OptimizerParameters->GetStepLengthFRPR()); - if (m_OptimizerParameters->GetFletchReevesFRPR()) - { - OptimizerPointer->SetToFletchReeves(); - } - else if (m_OptimizerParameters->GetPolakRibiereFRPR()) - { - OptimizerPointer->SetToPolakRibiere(); - } - OptimizerPointer->SetMaximumIteration(m_OptimizerParameters->GetNumberOfIterationsFRPR()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::REGULARSTEPGRADIENTDESCENTOPTIMIZER) - { - itk::RegularStepGradientDescentOptimizer::Pointer OptimizerPointer = - itk::RegularStepGradientDescentOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetGradientMagnitudeTolerance( - m_OptimizerParameters->GetGradientMagnitudeToleranceRegularStepGradientDescent()); - OptimizerPointer->SetMinimumStepLength(m_OptimizerParameters->GetMinimumStepLengthRegularStepGradientDescent()); - OptimizerPointer->SetMaximumStepLength(m_OptimizerParameters->GetMaximumStepLengthRegularStepGradientDescent()); - OptimizerPointer->SetNumberOfIterations(m_OptimizerParameters->GetNumberOfIterationsRegularStepGradientDescent()); - OptimizerPointer->SetRelaxationFactor(m_OptimizerParameters->GetRelaxationFactorRegularStepGradientDescent()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::VERSORRIGID3DTRANSFORMOPTIMIZER) - { - itk::VersorRigid3DTransformOptimizer::Pointer OptimizerPointer = itk::VersorRigid3DTransformOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetGradientMagnitudeTolerance( - m_OptimizerParameters->GetGradientMagnitudeToleranceVersorRigid3DTransform()); - OptimizerPointer->SetMinimumStepLength(m_OptimizerParameters->GetMinimumStepLengthVersorRigid3DTransform()); - OptimizerPointer->SetMaximumStepLength(m_OptimizerParameters->GetMaximumStepLengthVersorRigid3DTransform()); - OptimizerPointer->SetNumberOfIterations(m_OptimizerParameters->GetNumberOfIterationsVersorRigid3DTransform()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::VERSORTRANSFORMOPTIMIZER) - { - itk::VersorTransformOptimizer::Pointer OptimizerPointer = itk::VersorTransformOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetGradientMagnitudeTolerance( - m_OptimizerParameters->GetGradientMagnitudeToleranceVersorTransform()); - OptimizerPointer->SetMinimumStepLength(m_OptimizerParameters->GetMinimumStepLengthVersorTransform()); - OptimizerPointer->SetMaximumStepLength(m_OptimizerParameters->GetMaximumStepLengthVersorTransform()); - OptimizerPointer->SetNumberOfIterations(m_OptimizerParameters->GetNumberOfIterationsVersorTransform()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::AMOEBAOPTIMIZER) - { - itk::AmoebaOptimizer::Pointer OptimizerPointer = itk::AmoebaOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetParametersConvergenceTolerance( - m_OptimizerParameters->GetParametersConvergenceToleranceAmoeba()); - OptimizerPointer->SetFunctionConvergenceTolerance(m_OptimizerParameters->GetFunctionConvergenceToleranceAmoeba()); - itk::Array simplexDeltaAmoeba = m_OptimizerParameters->GetSimplexDeltaAmoeba(); - OptimizerType::ParametersType simplexDelta(m_NumberTransformParameters); - for (int i = 0; i < m_NumberTransformParameters; i++) - { - simplexDelta[i] = simplexDeltaAmoeba[i]; - } - OptimizerPointer->AutomaticInitialSimplexOff(); - OptimizerPointer->SetInitialSimplexDelta(simplexDelta); - OptimizerPointer->SetMaximumNumberOfIterations(m_OptimizerParameters->GetNumberOfIterationsAmoeba()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::CONJUGATEGRADIENTOPTIMIZER) - { - itk::ConjugateGradientOptimizer::Pointer OptimizerPointer = itk::ConjugateGradientOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - /*typedef itk::ConjugateGradientOptimizer::InternalOptimizerType vnlOptimizerType; - vnlOptimizerType * vnlOptimizer = OptimizerPointer->GetOptimizer(); - vnlOptimizer->set_f_tolerance( 1e-3 ); - vnlOptimizer->set_g_tolerance( 1e-4 ); - vnlOptimizer->set_x_tolerance( 1e-8 ); - vnlOptimizer->set_epsilon_function( 1e-10 ); - vnlOptimizer->set_max_function_evals( m_Iterations ); - vnlOptimizer->set_check_derivatives( 3 );*/ - - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::LBFGSOPTIMIZER) - { - itk::LBFGSOptimizer::Pointer OptimizerPointer = itk::LBFGSOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->SetGradientConvergenceTolerance(m_OptimizerParameters->GetGradientConvergenceToleranceLBFGS()); - OptimizerPointer->SetLineSearchAccuracy(m_OptimizerParameters->GetLineSearchAccuracyLBFGS()); - OptimizerPointer->SetDefaultStepLength(m_OptimizerParameters->GetDefaultStepLengthLBFGS()); - OptimizerPointer->SetTrace(m_OptimizerParameters->GetTraceOnLBFGS()); - OptimizerPointer->SetMaximumNumberOfFunctionEvaluations(m_OptimizerParameters->GetNumberOfIterationsLBFGS()); - return OptimizerPointer.GetPointer(); - } - else if (optimizer == OptimizerParameters::SPSAOPTIMIZER) - { - itk::SPSAOptimizer::Pointer OptimizerPointer = itk::SPSAOptimizer::New(); - OptimizerPointer->SetMaximize(m_OptimizerParameters->GetMaximize()); - OptimizerPointer->Seta(m_OptimizerParameters->GetaSPSA()); - OptimizerPointer->SetA(m_OptimizerParameters->GetASPSA()); - OptimizerPointer->SetAlpha(m_OptimizerParameters->GetAlphaSPSA()); - OptimizerPointer->Setc(m_OptimizerParameters->GetcSPSA()); - OptimizerPointer->SetGamma(m_OptimizerParameters->GetGammaSPSA()); - OptimizerPointer->SetTolerance(m_OptimizerParameters->GetToleranceSPSA()); - OptimizerPointer->SetStateOfConvergenceDecayRate(m_OptimizerParameters->GetStateOfConvergenceDecayRateSPSA()); - OptimizerPointer->SetMinimumNumberOfIterations(m_OptimizerParameters->GetMinimumNumberOfIterationsSPSA()); - OptimizerPointer->SetNumberOfPerturbations(m_OptimizerParameters->GetNumberOfPerturbationsSPSA()); - OptimizerPointer->SetMaximumNumberOfIterations(m_OptimizerParameters->GetNumberOfIterationsSPSA()); - return OptimizerPointer.GetPointer(); - } - return nullptr; - } -} // end namespace diff --git a/Modules/RigidRegistration/mitkOptimizerFactory.h b/Modules/RigidRegistration/mitkOptimizerFactory.h deleted file mode 100644 index dfa77ba65b..0000000000 --- a/Modules/RigidRegistration/mitkOptimizerFactory.h +++ /dev/null @@ -1,86 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKOPTIMIZERFACTORY_H -#define MITKOPTIMIZERFACTORY_H - -#include "MitkRigidRegistrationExports.h" -#include "itkSingleValuedNonLinearOptimizer.h" -#include "mitkOptimizerParameters.h" - -namespace mitk -{ - /*! - \brief This class creates an optimizer for a rigid registration process. - - This class will e.g. be instantiated by mitkImageRegistrationMethod and an - optimizer corresponding to the integer value stored in mitkOptimizerParameters - will be created. Therefore SetOptimizerParameters() has to be called with an instance - of mitkOptimizerParameters, which holds all parameter informations for the new - optimizer. - - GetOptimizer() returns the optimizer which then can be used in combination with a - transform, a metric and an interpolator within a registration pipeline. - - - \ingroup RigidRegistration - - \author Daniel Stein - */ - - class MITKRIGIDREGISTRATION_EXPORT OptimizerFactory : public ::itk::Object - { - public: - mitkClassMacroItkParent(OptimizerFactory, itk::Object); - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - typedef itk::SingleValuedNonLinearOptimizer OptimizerType; - - /** - \brief Returns the optimizer which then can be used in combination with a transform, a metric - and an interpolator within a registration pipeline. - */ - OptimizerType::Pointer GetOptimizer(); - - /** - \brief Sets the number of transformParameters. - */ - void SetNumberOfTransformParameters(int numberTransformParameters); - - /** - \brief Sets the instance to the optimizer parameters class which holds all parameters for the new optimizer. - */ - void SetOptimizerParameters(OptimizerParameters::Pointer optimizerParameters) - { - m_OptimizerParameters = optimizerParameters; - } - - /** - \brief Returns the instance to the optimizer parameters class which holds all parameters for the new optimizer. - */ - OptimizerParameters::Pointer GetOptimizerParameters() { return m_OptimizerParameters; } - protected: - OptimizerFactory(); - ~OptimizerFactory(); - - private: - OptimizerParameters::Pointer m_OptimizerParameters; - int m_NumberTransformParameters; - }; - -} // namespace mitk - -#endif // MITKOPTIMIZERFACTORY_H diff --git a/Modules/RigidRegistration/mitkOptimizerParameters.cpp b/Modules/RigidRegistration/mitkOptimizerParameters.cpp deleted file mode 100644 index 593f2e747c..0000000000 --- a/Modules/RigidRegistration/mitkOptimizerParameters.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkOptimizerParameters.h" - -namespace mitk -{ - OptimizerParameters::OptimizerParameters() - : m_Optimizer(EXHAUSTIVEOPTIMIZER), - // for all Optimizer - m_Dimension(2), - m_Maximize(false), - - // for itk::ExhaustiveOptimizer - m_StepLengthExhaustive(1.0), - m_NumberOfStepsExhaustive(10), - - // for itk::GradientDescentOptimizer - m_LearningRateGradientDescent(0.01), - m_NumberOfIterationsGradientDescent(200), - - // for itk::QuaternionRigidTransformGradientDescentOptimizer - m_LearningRateQuaternionRigidTransformGradientDescent(0.01), - m_NumberOfIterationsQuaternionRigidTransformGradientDescent(200), - - // for itk::LBFGSBOptimizer - - // for itk::OnePlusOneEvolutionaryOptimizer - m_GrowthFactorOnePlusOneEvolutionary(0.01), - m_ShrinkFactorOnePlusOneEvolutionary(0.001), - m_EpsilonOnePlusOneEvolutionary(2), - m_InitialRadiusOnePlusOneEvolutionary(1), - m_NumberOfIterationsOnePlusOneEvolutionary(200), - - // for itk::PowellOptimizer - m_StepLengthPowell(0.01), - m_StepTolerancePowell(0.001), - m_ValueTolerancePowell(0.001), - m_NumberOfIterationsPowell(200), - - // for itk::FRPROptimizer - m_StepLengthFRPR(0.01), - m_FletchReevesFRPR(true), - m_PolakRibiereFRPR(false), - m_NumberOfIterationsFRPR(200), - - // for itk::RegularStepGradientDescentOptimizer - m_GradientMagnitudeToleranceRegularStepGradientDescent(0.0001), - m_MinimumStepLengthRegularStepGradientDescent(0.001), - m_MaximumStepLengthRegularStepGradientDescent(1.0), - m_NumberOfIterationsRegularStepGradientDescent(100), - m_RelaxationFactorRegularStepGradientDescent(0.5), - - // for itk::VersorRigid3DTransformOptimizer - m_GradientMagnitudeToleranceVersorRigid3DTransform(0.0001), - m_MinimumStepLengthVersorRigid3DTransform(0.0001), - m_MaximumStepLengthVersorRigid3DTransform(4.0), - m_NumberOfIterationsVersorRigid3DTransform(200), - - // for itk::VersorTransformOptimizer - m_GradientMagnitudeToleranceVersorTransform(0.0001), - m_MinimumStepLengthVersorTransform(0.0001), - m_MaximumStepLengthVersorTransform(4.0), - m_NumberOfIterationsVersorTransform(200), - - // for itk::AmoebaOptimizer - m_ParametersConvergenceToleranceAmoeba(0.01), - m_FunctionConvergenceToleranceAmoeba(0.001), - m_NumberOfIterationsAmoeba(200), - - // for itk::ConjugateGradientOptimizer - - // for itk::LBFGSOptimizer - m_GradientConvergenceToleranceLBFGS(0.01), - m_LineSearchAccuracyLBFGS(0.01), - m_DefaultStepLengthLBFGS(0.01), - m_TraceOnLBFGS(true), - m_NumberOfIterationsLBFGS(200), - - // for itk::SPSAOptimizer - m_aSPSA(1.0), - m_ASPSA(10.0), - m_AlphaSPSA(0.602), - m_cSPSA(0.0001), - m_GammaSPSA(0.101), - m_ToleranceSPSA(1e-5), - m_StateOfConvergenceDecayRateSPSA(0.5), - m_MinimumNumberOfIterationsSPSA(10), - m_NumberOfPerturbationsSPSA(1), - m_NumberOfIterationsSPSA(200) - { - // for itk::AmoebaOptimizer - m_SimplexDeltaAmoeba.SetSize(16); - m_SimplexDeltaAmoeba.Fill(5.0); - } - - /********************************** for itk::AmoebaOptimizer ****************************************/ - - void OptimizerParameters::SetSimplexDeltaAmoeba(itk::Array simplexDelta) - { - m_SimplexDeltaAmoeba = simplexDelta; - } - - itk::Array OptimizerParameters::GetSimplexDeltaAmoeba() { return m_SimplexDeltaAmoeba; } -} // namespace mitk diff --git a/Modules/RigidRegistration/mitkOptimizerParameters.h b/Modules/RigidRegistration/mitkOptimizerParameters.h deleted file mode 100644 index 8bae839d43..0000000000 --- a/Modules/RigidRegistration/mitkOptimizerParameters.h +++ /dev/null @@ -1,700 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKOPTIMIZERPARAMETERS_H -#define MITKOPTIMIZERPARAMETERS_H - -#include "MitkRigidRegistrationExports.h" -#include "mitkCommon.h" -#include -#include - -namespace mitk -{ - /*! - \brief This class is used to hold all optimizer parameters needed for a rigid registration process. - - To use the rigid registration framework you have to create an instance of this class and fill it with the parameters - belonging to the selected optimizer. To let the rigid registration work properly, this instance has to be given - to mitkImageRegistrationMethod before calling the update() method in mitkImageRegistrationMethod. - - Also instances of the classes mitkTransformParameters and mitkMetricParameters have to be set in - mitkImageRegistrationMethod - before calling the update() method. - - \ingroup RigidRegistration - - \author Daniel Stein - */ - class MITKRIGIDREGISTRATION_EXPORT OptimizerParameters : public ::itk::Object - { - public: - mitkClassMacroItkParent(OptimizerParameters, ::itk::Object); - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /** - \brief Unique integer value for every optimizer. - */ - enum OptimizerType { - EXHAUSTIVEOPTIMIZER = 0, - GRADIENTDESCENTOPTIMIZER = 1, - QUATERNIONRIGIDTRANSFORMGRADIENTDESCENTOPTIMIZER = 2, - LBFGSBOPTIMIZER = 3, - ONEPLUSONEEVOLUTIONARYOPTIMIZER = 4, - POWELLOPTIMIZER = 5, - FRPROPTIMIZER = 6, - REGULARSTEPGRADIENTDESCENTOPTIMIZER = 7, - VERSORTRANSFORMOPTIMIZER = 8, - AMOEBAOPTIMIZER = 9, - CONJUGATEGRADIENTOPTIMIZER = 10, - LBFGSOPTIMIZER = 11, - SPSAOPTIMIZER = 12, - VERSORRIGID3DTRANSFORMOPTIMIZER = 13 - }; - - /** - \brief Sets the optimizer used for registration by its unique integer value. - */ - itkSetMacro(Optimizer, int); - /** - \brief Returns the optimizer used for registration by its unique integer value. - */ - itkGetMacro(Optimizer, int); - - /** - \brief Sets the images dimension which have to be registered. - */ - itkSetMacro(Dimension, unsigned int); - - /** - \brief Returns the images dimension which have to be registered. - */ - itkGetMacro(Dimension, unsigned int); - - /** - \brief Sets whether the optimizer should maximize or minimize the metrics value. - */ - itkSetMacro(Maximize, bool); - - /** - \brief Returns whether the optimizer should maximize or minimize the metrics value. - */ - itkGetMacro(Maximize, bool); - - /** - \brief for itk::ExhaustiveOptimizer - */ - itkSetMacro(StepLengthExhaustive, float); - - /** - \brief for itk::ExhaustiveOptimizer - */ - itkGetMacro(StepLengthExhaustive, float); - - /** - \brief for itk::ExhaustiveOptimizer - */ - itkSetMacro(NumberOfStepsExhaustive, int); - - /** - \brief for itk::ExhaustiveOptimizer - */ - itkGetMacro(NumberOfStepsExhaustive, int); - - /** - \brief for itk::GradientDescentOptimizer - */ - itkSetMacro(LearningRateGradientDescent, float); - - /** - \brief for itk::GradientDescentOptimizer - */ - itkGetMacro(LearningRateGradientDescent, float); - - /** - \brief for itk::GradientDescentOptimizer - */ - itkSetMacro(NumberOfIterationsGradientDescent, int); - - /** - \brief for itk::GradientDescentOptimizer - */ - itkGetMacro(NumberOfIterationsGradientDescent, int); - - /** - \brief for itk::QuaternionRigidTransformGradientDescentOptimizer - */ - itkSetMacro(LearningRateQuaternionRigidTransformGradientDescent, float); - - /** - \brief for itk::QuaternionRigidTransformGradientDescentOptimizer - */ - itkGetMacro(LearningRateQuaternionRigidTransformGradientDescent, float); - - /** - \brief for itk::QuaternionRigidTransformGradientDescentOptimizer - */ - itkSetMacro(NumberOfIterationsQuaternionRigidTransformGradientDescent, int); - - /** - \brief for itk::QuaternionRigidTransformGradientDescentOptimizer - */ - itkGetMacro(NumberOfIterationsQuaternionRigidTransformGradientDescent, int); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkSetMacro(GrowthFactorOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkGetMacro(GrowthFactorOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkSetMacro(ShrinkFactorOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkGetMacro(ShrinkFactorOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkSetMacro(EpsilonOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkGetMacro(EpsilonOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkSetMacro(InitialRadiusOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkGetMacro(InitialRadiusOnePlusOneEvolutionary, float); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkSetMacro(NumberOfIterationsOnePlusOneEvolutionary, int); - - /** - \brief for itk::OnePlusOneEvolutionaryOptimizer - */ - itkGetMacro(NumberOfIterationsOnePlusOneEvolutionary, int); - - /** - \brief for itk::PowellOptimizer - */ - itkSetMacro(StepLengthPowell, float); - - /** - \brief for itk::PowellOptimizer - */ - itkGetMacro(StepLengthPowell, float); - - /** - \brief for itk::PowellOptimizer - */ - itkSetMacro(StepTolerancePowell, float); - - /** - \brief for itk::PowellOptimizer - */ - itkGetMacro(StepTolerancePowell, float); - - /** - \brief for itk::PowellOptimizer - */ - itkSetMacro(ValueTolerancePowell, float); - - /** - \brief for itk::PowellOptimizer - */ - itkGetMacro(ValueTolerancePowell, float); - - /** - \brief for itk::PowellOptimizer - */ - itkSetMacro(NumberOfIterationsPowell, int); - - /** - \brief for itk::PowellOptimizer - */ - itkGetMacro(NumberOfIterationsPowell, int); - - /** - \brief for itk::FRPROptimizer - */ - itkSetMacro(StepLengthFRPR, float); - - /** - \brief for itk::FRPROptimizer - */ - itkGetMacro(StepLengthFRPR, float); - - /** - \brief for itk::FRPROptimizer - */ - itkSetMacro(FletchReevesFRPR, bool); - - /** - \brief for itk::FRPROptimizer - */ - itkGetMacro(FletchReevesFRPR, bool); - - /** - \brief for itk::FRPROptimizer - */ - itkSetMacro(PolakRibiereFRPR, bool); - - /** - \brief for itk::FRPROptimizer - */ - itkGetMacro(PolakRibiereFRPR, bool); - - /** - \brief for itk::FRPROptimizer - */ - itkSetMacro(NumberOfIterationsFRPR, int); - - /** - \brief for itk::FRPROptimizer - */ - itkGetMacro(NumberOfIterationsFRPR, int); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkSetMacro(GradientMagnitudeToleranceRegularStepGradientDescent, float); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkGetMacro(GradientMagnitudeToleranceRegularStepGradientDescent, float); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkSetMacro(MinimumStepLengthRegularStepGradientDescent, float); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkGetMacro(MinimumStepLengthRegularStepGradientDescent, float); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkSetMacro(MaximumStepLengthRegularStepGradientDescent, float); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkGetMacro(MaximumStepLengthRegularStepGradientDescent, float); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkSetMacro(NumberOfIterationsRegularStepGradientDescent, int); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkGetMacro(NumberOfIterationsRegularStepGradientDescent, int); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkSetMacro(RelaxationFactorRegularStepGradientDescent, double); - - /** - \brief for itk::RegularStepGradientDescentOptimizer - */ - itkGetMacro(RelaxationFactorRegularStepGradientDescent, double); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkSetMacro(GradientMagnitudeToleranceVersorRigid3DTransform, float); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkGetMacro(GradientMagnitudeToleranceVersorRigid3DTransform, float); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkSetMacro(MinimumStepLengthVersorRigid3DTransform, float); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkGetMacro(MinimumStepLengthVersorRigid3DTransform, float); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkSetMacro(MaximumStepLengthVersorRigid3DTransform, float); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkGetMacro(MaximumStepLengthVersorRigid3DTransform, float); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkSetMacro(NumberOfIterationsVersorRigid3DTransform, int); - - /** - \brief for itk::VersorRigid3DTransformOptimizer - */ - itkGetMacro(NumberOfIterationsVersorRigid3DTransform, int); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkSetMacro(GradientMagnitudeToleranceVersorTransform, float); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkGetMacro(GradientMagnitudeToleranceVersorTransform, float); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkSetMacro(MinimumStepLengthVersorTransform, float); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkGetMacro(MinimumStepLengthVersorTransform, float); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkSetMacro(MaximumStepLengthVersorTransform, float); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkGetMacro(MaximumStepLengthVersorTransform, float); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkSetMacro(NumberOfIterationsVersorTransform, int); - - /** - \brief for itk::VersorTransformOptimizer - */ - itkGetMacro(NumberOfIterationsVersorTransform, int); - - /** - \brief for itk::AmoebaOptimizer - */ - void SetSimplexDeltaAmoeba(itk::Array simplexDelta); - - /** - \brief for itk::AmoebaOptimizer - */ - itk::Array GetSimplexDeltaAmoeba(); - - /** - \brief for itk::AmoebaOptimizer - */ - itkSetMacro(ParametersConvergenceToleranceAmoeba, float); - - /** - \brief for itk::AmoebaOptimizer - */ - itkGetMacro(ParametersConvergenceToleranceAmoeba, float); - - /** - \brief for itk::AmoebaOptimizer - */ - itkSetMacro(FunctionConvergenceToleranceAmoeba, float); - - /** - \brief for itk::AmoebaOptimizer - */ - itkGetMacro(FunctionConvergenceToleranceAmoeba, float); - - /** - \brief for itk::AmoebaOptimizer - */ - itkSetMacro(NumberOfIterationsAmoeba, int); - - /** - \brief for itk::AmoebaOptimizer - */ - itkGetMacro(NumberOfIterationsAmoeba, int); - - // nothing for itk::ConjugateGradientOptimizer - - /** - \brief for itk::LBFGSOptimizer - */ - itkSetMacro(GradientConvergenceToleranceLBFGS, float); - - /** - \brief for itk::LBFGSOptimizer - */ - itkGetMacro(GradientConvergenceToleranceLBFGS, float); - - /** - \brief for itk::LBFGSOptimizer - */ - itkSetMacro(LineSearchAccuracyLBFGS, float); - - /** - \brief for itk::LBFGSOptimizer - */ - itkGetMacro(LineSearchAccuracyLBFGS, float); - - /** - \brief for itk::LBFGSOptimizer - */ - itkSetMacro(DefaultStepLengthLBFGS, float); - - /** - \brief for itk::LBFGSOptimizer - */ - itkGetMacro(DefaultStepLengthLBFGS, float); - - /** - \brief for itk::LBFGSOptimizer - */ - itkSetMacro(TraceOnLBFGS, bool); - - /** - \brief for itk::LBFGSOptimizer - */ - itkGetMacro(TraceOnLBFGS, bool); - - /** - \brief for itk::LBFGSOptimizer - */ - itkSetMacro(NumberOfIterationsLBFGS, int); - - /** - \brief for itk::LBFGSOptimizer - */ - itkGetMacro(NumberOfIterationsLBFGS, int); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(aSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(aSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(ASPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(ASPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(AlphaSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(AlphaSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(cSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(cSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(GammaSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(GammaSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(ToleranceSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(ToleranceSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(StateOfConvergenceDecayRateSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(StateOfConvergenceDecayRateSPSA, float); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(MinimumNumberOfIterationsSPSA, int); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(MinimumNumberOfIterationsSPSA, int); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(NumberOfPerturbationsSPSA, int); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(NumberOfPerturbationsSPSA, int); - - /** - \brief for itk::SPSAOptimizer - */ - itkSetMacro(NumberOfIterationsSPSA, int); - - /** - \brief for itk::SPSAOptimizer - */ - itkGetMacro(NumberOfIterationsSPSA, int); - - protected: - OptimizerParameters(); - ~OptimizerParameters(){}; - - // for all Optimizer - int m_Optimizer; - unsigned int m_Dimension; - bool m_Maximize; - - // for itk::ExhaustiveOptimizer - float m_StepLengthExhaustive; - int m_NumberOfStepsExhaustive; - - // for itk::GradientDescentOptimizer - float m_LearningRateGradientDescent; - int m_NumberOfIterationsGradientDescent; - - // for itk::QuaternionRigidTransformGradientDescentOptimizer - float m_LearningRateQuaternionRigidTransformGradientDescent; - int m_NumberOfIterationsQuaternionRigidTransformGradientDescent; - - // for itk::LBFGSBOptimizer - - // for itk::OnePlusOneEvolutionaryOptimizer - float m_GrowthFactorOnePlusOneEvolutionary; - float m_ShrinkFactorOnePlusOneEvolutionary; - float m_EpsilonOnePlusOneEvolutionary; - float m_InitialRadiusOnePlusOneEvolutionary; - int m_NumberOfIterationsOnePlusOneEvolutionary; - - // for itk::PowellOptimizer - float m_StepLengthPowell; - float m_StepTolerancePowell; - float m_ValueTolerancePowell; - int m_NumberOfIterationsPowell; - - // for itk::FRPROptimizer - float m_StepLengthFRPR; - bool m_FletchReevesFRPR; - bool m_PolakRibiereFRPR; - int m_NumberOfIterationsFRPR; - - // for itk::RegularStepGradientDescentOptimizer - float m_GradientMagnitudeToleranceRegularStepGradientDescent; - float m_MinimumStepLengthRegularStepGradientDescent; - float m_MaximumStepLengthRegularStepGradientDescent; - int m_NumberOfIterationsRegularStepGradientDescent; - double m_RelaxationFactorRegularStepGradientDescent; - - // for itk::VersorRigid3DTransformOptimizer - float m_GradientMagnitudeToleranceVersorRigid3DTransform; - float m_MinimumStepLengthVersorRigid3DTransform; - float m_MaximumStepLengthVersorRigid3DTransform; - int m_NumberOfIterationsVersorRigid3DTransform; - - // for itk::VersorTransformOptimizer - float m_GradientMagnitudeToleranceVersorTransform; - float m_MinimumStepLengthVersorTransform; - float m_MaximumStepLengthVersorTransform; - int m_NumberOfIterationsVersorTransform; - - // for itk::AmoebaOptimizer - itk::Array m_SimplexDeltaAmoeba; - float m_ParametersConvergenceToleranceAmoeba; - float m_FunctionConvergenceToleranceAmoeba; - int m_NumberOfIterationsAmoeba; - - // for itk::ConjugateGradientOptimizer - - // for itk::LBFGSOptimizer - float m_GradientConvergenceToleranceLBFGS; - float m_LineSearchAccuracyLBFGS; - float m_DefaultStepLengthLBFGS; - bool m_TraceOnLBFGS; - int m_NumberOfIterationsLBFGS; - - // for itk::SPSAOptimizer - float m_aSPSA; - float m_ASPSA; - float m_AlphaSPSA; - float m_cSPSA; - float m_GammaSPSA; - float m_ToleranceSPSA; - float m_StateOfConvergenceDecayRateSPSA; - int m_MinimumNumberOfIterationsSPSA; - int m_NumberOfPerturbationsSPSA; - int m_NumberOfIterationsSPSA; - }; - -} // namespace mitk - -#endif // MITKOPTIMIZERPARAMETERS_H diff --git a/Modules/RigidRegistration/mitkPyramidalRegistrationMethod-TYPE.cpp b/Modules/RigidRegistration/mitkPyramidalRegistrationMethod-TYPE.cpp deleted file mode 100644 index 211f83cee9..0000000000 --- a/Modules/RigidRegistration/mitkPyramidalRegistrationMethod-TYPE.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include -#include - -#define InstantiateAccessFunction_PyramidalAccessItkImage(pixelType, dim) \ - template void mitk::PyramidalRegistrationMethodAccessFunctor::AccessItkImage( \ - const itk::Image *itkImage1, mitk::PyramidalRegistrationMethod *method); - -InstantiateAccessFunctionForFixedPixelType(PyramidalAccessItkImage, (@TYPE@)) diff --git a/Modules/RigidRegistration/mitkPyramidalRegistrationMethod.cpp b/Modules/RigidRegistration/mitkPyramidalRegistrationMethod.cpp deleted file mode 100644 index f843c0e9ed..0000000000 --- a/Modules/RigidRegistration/mitkPyramidalRegistrationMethod.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkPyramidalRegistrationMethod.h" -#include "mitkPyramidalRegistrationMethodAccessFunctor.h" - -namespace mitk -{ - PyramidalRegistrationMethod::PyramidalRegistrationMethod() : m_Observer(nullptr), m_Interpolator(0) - { - m_OptimizerParameters = OptimizerParameters::New(); - m_TransformParameters = TransformParameters::New(); - m_MetricParameters = MetricParameters::New(); - m_ReferenceImage = Image::New(); - m_MovingMask = Image::New(); - m_FixedMask = Image::New(); - - m_Preset = new mitk::RigidRegistrationPreset(); - - bool succeed = m_Preset->LoadPreset(); - if (!succeed) - { - std::cout << "RigidRegistrationParameters.xml is empty or does not exist. There are no presets to select." - << std::endl; - return; - } - - m_UseMask = false; - m_BlurMovingImage = true; - m_BlurFixedImage = true; - } - - PyramidalRegistrationMethod::~PyramidalRegistrationMethod() {} - void PyramidalRegistrationMethod::GenerateData() - { - if (this->GetInput()) - { - PyramidalRegistrationMethodAccessFunctor()(this->GetInput(), this); - } - } - - void PyramidalRegistrationMethod::SetObserver(RigidRegistrationObserver::Pointer observer) { m_Observer = observer; } - void PyramidalRegistrationMethod::SetInterpolator(int interpolator) { m_Interpolator = interpolator; } - void PyramidalRegistrationMethod::SetReferenceImage(Image::Pointer fixedImage) - { - m_ReferenceImage = fixedImage; - SetNthInput(1, m_ReferenceImage); - Modified(); - } - - mitk::TransformParameters::Pointer PyramidalRegistrationMethod::ParseTransformParameters( - itk::Array transformValues) - { - mitk::TransformParameters::Pointer transformParameters = TransformParameters::New(); - - itk::Array initialParameters; - if (transformParameters->GetInitialParameters().size()) - { - initialParameters = transformParameters->GetInitialParameters(); - } - transformParameters = mitk::TransformParameters::New(); - transformParameters->SetTransform(transformValues[0]); - - if (transformParameters->GetInitialParameters().size()) - { - transformParameters->SetInitialParameters(initialParameters); - } - - // Set scales. Every type of transform has a different number of scales!!! - // TODO: Finish for al types of transform (or find a better solution) - itk::Array scales; - if (transformValues[0] == mitk::TransformParameters::AFFINETRANSFORM) - scales.SetSize(12); - if (transformValues[0] == mitk::TransformParameters::TRANSLATIONTRANSFORM) - scales.SetSize(3); - - for (unsigned int i = 0; i < scales.size(); i++) - { - scales[i] = transformValues[i + 2]; - } - transformParameters->SetScales(scales); - transformParameters->SetTransformInitializerOn(false); - - // Use Scales - if (transformValues[1] == 1) - { - transformParameters->SetUseOptimizerScales(true); - } - - return transformParameters; - } - - mitk::MetricParameters::Pointer PyramidalRegistrationMethod::ParseMetricParameters(itk::Array metricValues) - { - mitk::MetricParameters::Pointer metricParameters = mitk::MetricParameters::New(); - - metricParameters->SetMetric(metricValues[0]); - metricParameters->SetComputeGradient(metricValues[1]); - - // Some things have to be checked for every metric individually - if (metricValues[0] == mitk::MetricParameters::MUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC) - { - metricParameters->SetNumberOfHistogramBinsMutualInformationHistogram(metricValues[2]); - } - - if (metricValues[0] == mitk::MetricParameters::MATTESMUTUALINFORMATIONIMAGETOIMAGEMETRIC) - { - metricParameters->SetSpatialSamplesMattesMutualInformation(metricValues[3]); - metricParameters->SetNumberOfHistogramBinsMattesMutualInformation(metricValues[4]); - } - - return metricParameters; - } - - mitk::OptimizerParameters::Pointer PyramidalRegistrationMethod::ParseOptimizerParameters( - itk::Array optimizerValues) - { - mitk::OptimizerParameters::Pointer optimizerParameters = mitk::OptimizerParameters::New(); - - optimizerParameters->SetOptimizer(optimizerValues[0]); - optimizerParameters->SetMaximize( - optimizerValues[1]); // should be when used with maximize mutual information for example - - if (optimizerValues[0] == mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER) - { - optimizerParameters->SetLearningRateGradientDescent(optimizerValues[2]); - optimizerParameters->SetNumberOfIterationsGradientDescent(optimizerValues[3]); - } - - if (optimizerValues[0] == mitk::OptimizerParameters::REGULARSTEPGRADIENTDESCENTOPTIMIZER) - { - cout << "use regularstepgradientdescent" << endl; - optimizerParameters->SetGradientMagnitudeToleranceRegularStepGradientDescent(optimizerValues[2]); - optimizerParameters->SetMinimumStepLengthRegularStepGradientDescent(optimizerValues[3]); - optimizerParameters->SetMaximumStepLengthRegularStepGradientDescent(optimizerValues[4]); - optimizerParameters->SetRelaxationFactorRegularStepGradientDescent(optimizerValues[5]); - optimizerParameters->SetNumberOfIterationsRegularStepGradientDescent(optimizerValues[6]); - } - - return optimizerParameters; - } - - void PyramidalRegistrationMethod::SetMovingMask(Image::Pointer movingMask) - { - m_MovingMask = movingMask; - SetNthInput(3, m_MovingMask); - Modified(); - } - - void PyramidalRegistrationMethod::SetFixedMask(Image::Pointer FixedMask) - { - m_FixedMask = FixedMask; - SetNthInput(4, m_FixedMask); - Modified(); - } - -} // end namespace diff --git a/Modules/RigidRegistration/mitkPyramidalRegistrationMethod.h b/Modules/RigidRegistration/mitkPyramidalRegistrationMethod.h deleted file mode 100644 index 04272bba5b..0000000000 --- a/Modules/RigidRegistration/mitkPyramidalRegistrationMethod.h +++ /dev/null @@ -1,131 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKPYRAMIDALREGISTRATIONMETHOD_H -#define MITKPYRAMIDALREGISTRATIONMETHOD_H - -#include "MitkRigidRegistrationExports.h" -#include "itkImageRegistrationMethod.h" -#include "itkSingleValuedNonLinearOptimizer.h" - -#include "mitkCommon.h" -#include "mitkImageAccessByItk.h" -#include "mitkImageToImageFilter.h" -#include "mitkMetricParameters.h" -#include "mitkOptimizerParameters.h" -#include "mitkRigidRegistrationObserver.h" -#include "mitkTransformParameters.h" - -#include "itkImageMaskSpatialObject.h" -#include "mitkRigidRegistrationPreset.h" - -namespace mitk -{ - /*! - \brief Main class for the rigid registration pipeline. - - - - - \ingroup RigidRegistration - - \author Thomas van Bruggen */ - class MITKRIGIDREGISTRATION_EXPORT PyramidalRegistrationMethod : public ImageToImageFilter - { - public: - typedef itk::SingleValuedNonLinearOptimizer OptimizerType; - typedef itk::ImageMaskSpatialObject<3> MaskType; - - mitkClassMacro(PyramidalRegistrationMethod, ImageToImageFilter); - - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - static const int LINEARINTERPOLATOR = 0; - static const int NEARESTNEIGHBORINTERPOLATOR = 1; - - void SetObserver(RigidRegistrationObserver::Pointer observer); - - void SetInterpolator(int interpolator); - - virtual void GenerateData() override; - - virtual void SetReferenceImage(Image::Pointer fixedImage); - - virtual void SetFixedMask(Image::Pointer fixedMask); - - virtual void SetMovingMask(Image::Pointer movingMask); - - void SetOptimizerParameters(OptimizerParameters::Pointer optimizerParameters) - { - m_OptimizerParameters = optimizerParameters; - } - - OptimizerParameters::Pointer GetOptimizerParameters() { return m_OptimizerParameters; } - void SetTransformParameters(TransformParameters::Pointer transformParameters) - { - m_TransformParameters = transformParameters; - } - - TransformParameters::Pointer GetTransformParameters() { return m_TransformParameters; } - void SetMetricParameters(MetricParameters::Pointer metricParameters) { m_MetricParameters = metricParameters; } - MetricParameters::Pointer GetMetricParameters() { return m_MetricParameters; } - void SetPresets(std::vector presets) { m_Presets = presets; } - itkSetMacro(FixedSchedule, itk::Array2D); - itkSetMacro(MovingSchedule, itk::Array2D); - itkSetMacro(MatchHistograms, bool); - itkGetMacro(Preset, mitk::RigidRegistrationPreset *); - itkSetMacro(BlurFixedImage, bool); - itkSetMacro(BlurMovingImage, bool); - - protected: - PyramidalRegistrationMethod(); - virtual ~PyramidalRegistrationMethod(); - - friend struct PyramidalRegistrationMethodAccessFunctor; - - RigidRegistrationObserver::Pointer m_Observer; - int m_Interpolator; - Image::Pointer m_ReferenceImage; - Image::Pointer m_FixedMask; - Image::Pointer m_MovingMask; - - void GenerateOutputInformation() override{}; - - private: - OptimizerParameters::Pointer m_OptimizerParameters; - TransformParameters::Pointer m_TransformParameters; - MetricParameters::Pointer m_MetricParameters; - - std::vector m_Presets; - mitk::RigidRegistrationPreset *m_Preset; - - // Schedules - itk::Array2D m_FixedSchedule; - itk::Array2D m_MovingSchedule; - - bool m_UseMask; - bool m_MatchHistograms; - bool m_BlurFixedImage; - bool m_BlurMovingImage; - MaskType::Pointer m_BrainMask; - - mitk::TransformParameters::Pointer ParseTransformParameters(itk::Array transformValues); - mitk::MetricParameters::Pointer ParseMetricParameters(itk::Array metricValues); - mitk::OptimizerParameters::Pointer ParseOptimizerParameters(itk::Array optimizerValues); - }; -} - -#endif // MITKIMAGEREGISTRATIONMETHOD_H diff --git a/Modules/RigidRegistration/mitkPyramidalRegistrationMethodAccessFunctor.h b/Modules/RigidRegistration/mitkPyramidalRegistrationMethodAccessFunctor.h deleted file mode 100644 index 07858c7187..0000000000 --- a/Modules/RigidRegistration/mitkPyramidalRegistrationMethodAccessFunctor.h +++ /dev/null @@ -1,40 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKPYRAMIDALREGISTRATIONMETHODACCESSFUNCTOR_H -#define MITKPYRAMIDALREGISTRATIONMETHODACCESSFUNCTOR_H - -#include - -namespace mitk -{ - class PyramidalRegistrationMethod; - - struct PyramidalRegistrationMethodAccessFunctor - { - typedef PyramidalRegistrationMethodAccessFunctor Self; - - void operator()(const mitk::Image *img, PyramidalRegistrationMethod *method) - { - AccessByItk_1(img, AccessItkImage, method) - } - - template - void AccessItkImage(const itk::Image *itkImage1, PyramidalRegistrationMethod *method); - }; -} - -#endif // MITKPYRAMIDALREGISTRATIONMETHODACCESSFUNCTOR_H diff --git a/Modules/RigidRegistration/mitkPyramidalRegistrationMethodAccessFunctor.txx b/Modules/RigidRegistration/mitkPyramidalRegistrationMethodAccessFunctor.txx deleted file mode 100644 index 8338b30d46..0000000000 --- a/Modules/RigidRegistration/mitkPyramidalRegistrationMethodAccessFunctor.txx +++ /dev/null @@ -1,244 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkPyramidalRegistrationMethod.h" -#include "mitkPyramidalRegistrationMethodAccessFunctor.h" - -#include - -#include -#include -#include -#include - -#include "mitkMetricFactory.h" -#include "mitkOptimizerFactory.h" -#include "mitkRegistrationInterfaceCommand.h" -#include "mitkTransformFactory.h" - -namespace mitk -{ - template - void PyramidalRegistrationMethodAccessFunctor::AccessItkImage(const itk::Image *itkImage1, - PyramidalRegistrationMethod *method) - { - // TYPEDEFS - typedef itk::Image ImageType; - - typedef float InternalPixelType; - typedef itk::Image InternalImageType; - - typedef typename itk::Transform TransformType; - typedef mitk::TransformFactory TransformFactoryType; - typedef itk::LinearInterpolateImageFunction InterpolatorType; - typedef mitk::MetricFactory MetricFactoryType; - typedef itk::RecursiveMultiResolutionPyramidImageFilter ImagePyramidType; - typedef itk::DiscreteGaussianImageFilter GaussianFilterType; - - typedef itk::MultiResolutionImageRegistrationMethod RegistrationType; - typedef RegistrationInterfaceCommand CommandType; - - typedef itk::CastImageFilter CastImageFilterType; - - itk::Array initialParameters; - if (method->m_TransformParameters->GetInitialParameters().size()) - { - initialParameters = method->m_TransformParameters->GetInitialParameters(); - } - - // LOAD PARAMETERS - itk::Array transformValues = method->m_Preset->getTransformValues(method->m_Presets[0]); - itk::Array metricValues = method->m_Preset->getMetricValues(method->m_Presets[0]); - itk::Array optimizerValues = method->m_Preset->getOptimizerValues(method->m_Presets[0]); - method->m_TransformParameters = method->ParseTransformParameters(transformValues); - method->m_MetricParameters = method->ParseMetricParameters(metricValues); - method->m_OptimizerParameters = method->ParseOptimizerParameters(optimizerValues); - - // The fixed and the moving image - typename InternalImageType::Pointer fixedImage = InternalImageType::New(); - typename InternalImageType::Pointer movingImage = InternalImageType::New(); - - mitk::CastToItkImage(method->m_ReferenceImage, fixedImage); - - // Blur the moving image - if (method->m_BlurMovingImage) - { - typename GaussianFilterType::Pointer gaussianFilter = GaussianFilterType::New(); - gaussianFilter->SetInput(itkImage1); - gaussianFilter->SetVariance(6.0); - gaussianFilter->SetMaximumError(0.1); - // gaussianFilter->SetMaximumKernelWidth ( 3 ); - gaussianFilter->Update(); - movingImage = gaussianFilter->GetOutput(); - } - else - { - typename CastImageFilterType::Pointer castImageFilter = CastImageFilterType::New(); - castImageFilter->SetInput(itkImage1); - castImageFilter->Update(); - movingImage = castImageFilter->GetOutput(); - } - - if (method->m_MatchHistograms) - { - typedef itk::RescaleIntensityImageFilter FilterType; - typedef itk::HistogramMatchingImageFilter HEFilterType; - - typename FilterType::Pointer inputRescaleFilter = FilterType::New(); - typename FilterType::Pointer referenceRescaleFilter = FilterType::New(); - - referenceRescaleFilter->SetInput(fixedImage); - inputRescaleFilter->SetInput(movingImage); - - const float desiredMinimum = 0.0; - const float desiredMaximum = 255.0; - - referenceRescaleFilter->SetOutputMinimum(desiredMinimum); - referenceRescaleFilter->SetOutputMaximum(desiredMaximum); - referenceRescaleFilter->UpdateLargestPossibleRegion(); - inputRescaleFilter->SetOutputMinimum(desiredMinimum); - inputRescaleFilter->SetOutputMaximum(desiredMaximum); - inputRescaleFilter->UpdateLargestPossibleRegion(); - - // Histogram match the images - typename HEFilterType::Pointer intensityEqualizeFilter = HEFilterType::New(); - - intensityEqualizeFilter->SetReferenceImage(inputRescaleFilter->GetOutput()); - intensityEqualizeFilter->SetInput(referenceRescaleFilter->GetOutput()); - intensityEqualizeFilter->SetNumberOfHistogramLevels(64); - intensityEqualizeFilter->SetNumberOfMatchPoints(12); - intensityEqualizeFilter->ThresholdAtMeanIntensityOn(); - intensityEqualizeFilter->Update(); - - // fixedImage = referenceRescaleFilter->GetOutput(); - // movingImage = IntensityEqualizeFilter->GetOutput(); - - fixedImage = intensityEqualizeFilter->GetOutput(); - movingImage = inputRescaleFilter->GetOutput(); - } - - typename TransformFactoryType::Pointer transFac = TransformFactoryType::New(); - transFac->SetTransformParameters(method->m_TransformParameters); - transFac->SetFixedImage(fixedImage); - transFac->SetMovingImage(movingImage); - typename TransformType::Pointer transform = transFac->GetTransform(); - - typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); - typename MetricFactoryType::Pointer metFac = MetricFactoryType::New(); - metFac->SetMetricParameters(method->m_MetricParameters); - - typename OptimizerFactory::Pointer optFac = OptimizerFactory::New(); - optFac->SetOptimizerParameters(method->m_OptimizerParameters); - optFac->SetNumberOfTransformParameters(transform->GetNumberOfParameters()); - typename PyramidalRegistrationMethod::OptimizerType::Pointer optimizer = optFac->GetOptimizer(); - - // optimizer scales - if (method->m_TransformParameters->GetUseOptimizerScales()) - { - itk::Array optimizerScales = method->m_TransformParameters->GetScales(); - typename PyramidalRegistrationMethod::OptimizerType::ScalesType scales(transform->GetNumberOfParameters()); - for (unsigned int i = 0; i < scales.Size(); i++) - { - scales[i] = optimizerScales[i]; - } - optimizer->SetScales(scales); - } - - typename ImagePyramidType::Pointer fixedImagePyramid = ImagePyramidType::New(); - typename ImagePyramidType::Pointer movingImagePyramid = ImagePyramidType::New(); - - if (method->m_FixedSchedule.size() > 0 && method->m_MovingSchedule.size() > 0) - { - fixedImagePyramid->SetSchedule(method->m_FixedSchedule); - movingImagePyramid->SetSchedule(method->m_MovingSchedule); - // Otherwise just use the default schedule - } - - typename RegistrationType::Pointer registration = RegistrationType::New(); - registration->SetOptimizer(optimizer); - registration->SetTransform(transform); - registration->SetInterpolator(interpolator); - registration->SetMetric(metFac->GetMetric()); - registration->SetFixedImagePyramid(fixedImagePyramid); - registration->SetMovingImagePyramid(movingImagePyramid); - registration->SetFixedImage(fixedImage); - registration->SetMovingImage(movingImage); - registration->SetFixedImageRegion(fixedImage->GetBufferedRegion()); - - if (transFac->GetTransformParameters()->GetInitialParameters().size()) - { - registration->SetInitialTransformParameters(transFac->GetTransformParameters()->GetInitialParameters()); - } - else - { - itk::Array zeroInitial; - zeroInitial.set_size(transform->GetNumberOfParameters()); - zeroInitial.fill(0.0); - zeroInitial[0] = 1.0; - zeroInitial[4] = 1.0; - zeroInitial[8] = 1.0; - registration->SetInitialTransformParameters(zeroInitial); - } - - if (method->m_UseMask) - { - itk::ImageMaskSpatialObject *mask = - dynamic_cast *>(method->m_BrainMask.GetPointer()); - registration->GetMetric()->SetFixedImageMask(mask); - } - - // registering command observer with the optimizer - if (method->m_Observer.IsNotNull()) - { - method->m_Observer->AddStepsToDo(20); - optimizer->AddObserver(itk::AnyEvent(), method->m_Observer); - registration->AddObserver(itk::AnyEvent(), method->m_Observer); - transform->AddObserver(itk::AnyEvent(), method->m_Observer); - } - - typename CommandType::Pointer command = CommandType::New(); - command->observer = method->m_Observer; - command->m_Presets = method->m_Presets; - command->m_UseMask = method->m_UseMask; - command->m_BrainMask = method->m_BrainMask; - - registration->AddObserver(itk::IterationEvent(), command); - registration->SetSchedules(method->m_FixedSchedule, method->m_MovingSchedule); - - // Start the registration process - try - { - registration->Update(); - } - catch (itk::ExceptionObject &err) - { - std::cout << "ExceptionObject caught !" << std::endl; - std::cout << err << std::endl; - } - if (method->m_Observer.IsNotNull()) - { - optimizer->RemoveAllObservers(); - registration->RemoveAllObservers(); - transform->RemoveAllObservers(); - method->m_Observer->SetRemainingProgress(15); - } - if (method->m_Observer.IsNotNull()) - { - method->m_Observer->SetRemainingProgress(5); - } - } - -} // end namespace diff --git a/Modules/RigidRegistration/mitkRegistrationInterfaceCommand.h b/Modules/RigidRegistration/mitkRegistrationInterfaceCommand.h deleted file mode 100644 index 52ad2e0ea0..0000000000 --- a/Modules/RigidRegistration/mitkRegistrationInterfaceCommand.h +++ /dev/null @@ -1,154 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -namespace mitk -{ - template - class RegistrationInterfaceCommand : public itk::Command - { - public: - typedef RegistrationInterfaceCommand Self; - typedef itk::Command Superclass; - typedef itk::SmartPointer Pointer; - itkFactorylessNewMacro(Self) itkCloneMacro(Self) protected : RegistrationInterfaceCommand() { m_UseMask = false; } - public: - // typedef TRegistration RegistrationType; - - typedef itk::MultiResolutionImageRegistrationMethod, itk::Image> RegistrationType; - - typedef RegistrationType *RegistrationPointer; - typedef itk::SingleValuedNonLinearOptimizer OptimizerType; - typedef OptimizerType *OptimizerPointer; - typedef itk::ImageMaskSpatialObject<3> MaskType; - - mitk::RigidRegistrationObserver::Pointer observer; - bool m_UseMask; - std::vector m_Presets; - MaskType::Pointer m_BrainMask; - - void Execute(itk::Object *object, const itk::EventObject &event) override - { - if (!(itk::IterationEvent().CheckEvent(&event))) - { - return; - } - - RegistrationPointer registration = dynamic_cast(object); - - /*OptimizerPointer optimizer = dynamic_cast< OptimizerPointer >( - registration->GetOptimizer() );*/ - - std::cout << "-------------------------------------" << std::endl; - std::cout << "MultiResolution Level : " << registration->GetCurrentLevel() << std::endl << std::endl; - - if (registration->GetCurrentLevel() == 0) - { - // Nothing needs to be changed in the first step - } - else - { - // Load presets and make a new optimizer if that succeeds - mitk::RigidRegistrationPreset *preset = new mitk::RigidRegistrationPreset(); - if (preset->LoadPreset()) - { - mitk::OptimizerParameters::Pointer optimizerParameters = mitk::OptimizerParameters::New(); - itk::Array optimizerValues = preset->getOptimizerValues(m_Presets[registration->GetCurrentLevel()]); - - optimizerParameters->SetOptimizer(optimizerValues[0]); - optimizerParameters->SetMaximize( - optimizerValues[1]); // should be when used with maximize mutual information for example - - if (optimizerValues[0] == mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER) - { - optimizerParameters->SetLearningRateGradientDescent(optimizerValues[2]); - optimizerParameters->SetNumberOfIterationsGradientDescent(optimizerValues[3]); - } - - if (optimizerValues[0] == mitk::OptimizerParameters::REGULARSTEPGRADIENTDESCENTOPTIMIZER) - { - cout << "use regularstepgradientdescent" << endl; - optimizerParameters->SetGradientMagnitudeToleranceRegularStepGradientDescent(optimizerValues[2]); - optimizerParameters->SetMinimumStepLengthRegularStepGradientDescent(optimizerValues[3]); - optimizerParameters->SetMaximumStepLengthRegularStepGradientDescent(optimizerValues[4]); - optimizerParameters->SetRelaxationFactorRegularStepGradientDescent(optimizerValues[5]); - optimizerParameters->SetNumberOfIterationsRegularStepGradientDescent(optimizerValues[6]); - } - - // Typedef for the OptimizerFactory and initialisation of the optimizer using m_OptimizerParameters - typename OptimizerFactory::Pointer optFac = OptimizerFactory::New(); - optFac->SetOptimizerParameters(optimizerParameters); - optFac->SetNumberOfTransformParameters(registration->GetTransform()->GetNumberOfParameters()); - typename OptimizerType::Pointer optimizer = optFac->GetOptimizer(); - - if (observer.IsNotNull()) - { - optimizer->AddObserver(itk::AnyEvent(), observer); - } - - itk::Array transformValues = preset->getTransformValues(m_Presets[registration->GetCurrentLevel()]); - - itk::Array scales; - if (transformValues[0] == mitk::TransformParameters::AFFINETRANSFORM) - scales.SetSize(12); - mitk::TransformParameters::Pointer transformParameters = mitk::TransformParameters::New(); - transformParameters->SetTransform(transformValues[0]); - - for (unsigned int i = 0; i < scales.size(); i++) - { - scales[i] = transformValues[i + 2]; - std::cout << "scale " << i << ": " << scales[i] << std::endl; - } - - transformParameters->SetScales(scales); - // transformParameters->SetTransformInitializerOn(false); - - // Use Scales - if (transformValues[1] == 1) - { - transformParameters->SetUseOptimizerScales(true); - } - - if (transformParameters->GetUseOptimizerScales()) - { - itk::Array optimizerScales = transformParameters->GetScales(); - typename OptimizerType::ScalesType scales(registration->GetTransform()->GetNumberOfParameters()); - for (unsigned int i = 0; i < scales.Size(); i++) - { - scales[i] = optimizerScales[i]; - } - optimizer->SetScales(scales); - } - - registration->SetOptimizer(optimizer); - } - delete preset; - } - - registration->Print(std::cout, 0); - std::cout << std::endl; - std::cout << "METRIC" << std::endl; - registration->GetMetric()->Print(std::cout, 0); - std::cout << std::endl; - std::cout << "OPTIMIZER" << std::endl; - registration->GetOptimizer()->Print(std::cout, 0); - std::cout << std::endl; - std::cout << "TRANSFORM" << std::endl; - registration->GetTransform()->Print(std::cout, 0); - } - - void Execute(const itk::Object *, const itk::EventObject &) override { return; } - }; -} diff --git a/Modules/RigidRegistration/mitkRigidRegistrationObserver.cpp b/Modules/RigidRegistration/mitkRigidRegistrationObserver.cpp deleted file mode 100644 index 8b6e5159bc..0000000000 --- a/Modules/RigidRegistration/mitkRigidRegistrationObserver.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkRigidRegistrationObserver.h" -#include "mitkProgressBar.h" - -mitk::RigidRegistrationObserver::RigidRegistrationObserver() : m_OptimizerValue(0), m_StopOptimization(false) -{ -} - -void mitk::RigidRegistrationObserver::HandleOptimizationIterationEvent(OptimizerType *optimizer) -{ - unsigned int iteration = 0; - - itk::RegularStepGradientDescentBaseOptimizer *rsgdbase = - dynamic_cast(optimizer); - if (rsgdbase != nullptr) - { - m_OptimizerValue = rsgdbase->GetValue(); - m_Params = rsgdbase->GetCurrentPosition(); - iteration = rsgdbase->GetCurrentIteration(); - - MITK_INFO << "(" << iteration << ") " << m_OptimizerValue << " :: " << m_Params << std::endl; - - if (this->m_StopOptimization) - { - rsgdbase->StopOptimization(); - m_StopOptimization = false; - } - return; - } - - itk::GradientDescentOptimizer *gdbase = dynamic_cast(optimizer); - if (gdbase != nullptr) - { - m_OptimizerValue = gdbase->GetValue(); - m_Params = gdbase->GetCurrentPosition(); - iteration = gdbase->GetCurrentIteration(); - - MITK_INFO << "(" << iteration << ") " << m_OptimizerValue << " :: " << m_Params << std::endl; - - if (this->m_StopOptimization) - { - gdbase->StopOptimization(); - m_StopOptimization = false; - } - return; - } - - itk::PowellOptimizer *powbase = dynamic_cast(optimizer); - if (powbase != nullptr) - { - m_OptimizerValue = powbase->GetValue(); - m_Params = powbase->GetCurrentPosition(); - iteration = powbase->GetCurrentIteration(); - - MITK_INFO << "(" << iteration << ") " << m_OptimizerValue << " :: " << m_Params << std::endl; - - if (this->m_StopOptimization) - { - powbase->StopOptimization(); - m_StopOptimization = false; - } - return; - } - - itk::OnePlusOneEvolutionaryOptimizer *opluso = dynamic_cast(optimizer); - if (opluso != nullptr) - { - m_OptimizerValue = opluso->GetValue(); - m_Params = opluso->GetCurrentPosition(); - iteration = opluso->GetCurrentIteration(); - - MITK_INFO << "(" << iteration << ") " << m_OptimizerValue << " :: " << m_Params << std::endl; - - if (this->m_StopOptimization) - { - powbase->StopOptimization(); - m_StopOptimization = false; - } - return; - } -} - -void mitk::RigidRegistrationObserver::Execute(itk::Object *caller, const itk::EventObject &event) -{ - if (typeid(event) == typeid(itk::IterationEvent)) - { - OptimizerPointer optimizer = dynamic_cast(caller); - - if (optimizer != nullptr) - { - this->HandleOptimizationIterationEvent(optimizer); - - InvokeEvent(itk::ModifiedEvent()); - } - } - else if (typeid(event) == typeid(itk::FunctionEvaluationIterationEvent)) - { - OptimizerPointer optimizer = dynamic_cast(caller); - itk::AmoebaOptimizer *AmoebaOptimizer = dynamic_cast(optimizer); - if (AmoebaOptimizer != nullptr) - { - m_OptimizerValue = AmoebaOptimizer->GetCachedValue(); - MITK_INFO << AmoebaOptimizer->GetCachedValue() << " " << AmoebaOptimizer->GetCachedCurrentPosition() - << std::endl; - m_Params = AmoebaOptimizer->GetCachedCurrentPosition(); - if (m_StopOptimization) - { - // AmoebaOptimizer->StopOptimization(); - m_StopOptimization = false; - } - InvokeEvent(itk::ModifiedEvent()); - } - } - mitk::ProgressBar::GetInstance()->AddStepsToDo(1); - mitk::ProgressBar::GetInstance()->Progress(); -} - -void mitk::RigidRegistrationObserver::Execute(const itk::Object * /*caller*/, const itk::EventObject & /*event*/) -{ -} - -void mitk::RigidRegistrationObserver::AddStepsToDo(int steps) -{ - mitk::ProgressBar::GetInstance()->AddStepsToDo(steps); -} - -void mitk::RigidRegistrationObserver::SetRemainingProgress(int steps) -{ - mitk::ProgressBar::GetInstance()->Progress(steps); -} - -double mitk::RigidRegistrationObserver::GetCurrentOptimizerValue() -{ - return m_OptimizerValue; -} - -itk::Array mitk::RigidRegistrationObserver::GetCurrentTranslation() -{ - return m_Params; -} - -// Sets the stop optimization flag, which is used to call the StopOptimization() method of the optimizer. -// Unfortunately it is not implemented for ExhaustiveOptimizer, LBFGSBOptimizer, AmoebaOptimizer, -// ConjugateGradientOptimizer and LBFGSOptimizer in ITK. -void mitk::RigidRegistrationObserver::SetStopOptimization(bool stopOptimization) -{ - m_StopOptimization = stopOptimization; -} diff --git a/Modules/RigidRegistration/mitkRigidRegistrationObserver.h b/Modules/RigidRegistration/mitkRigidRegistrationObserver.h deleted file mode 100644 index e46b1da051..0000000000 --- a/Modules/RigidRegistration/mitkRigidRegistrationObserver.h +++ /dev/null @@ -1,191 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKRIGIDREGISTRATIONOBSERVER_H -#define MITKRIGIDREGISTRATIONOBSERVER_H - -#include "MitkRigidRegistrationExports.h" -#include "itkCommand.h" -#include "itkSingleValuedNonLinearOptimizer.h" -#include "mitkCommon.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mitk -{ - /** - * \brief Observer to react on rigid registration optimizer events. - * - * \sa ProgressBar - * - * \ingroup RigidRegistration - * - * This class reacts on events sent by ITK optimizers. These events will be sent for every iteration the optimizer - * performs. - * This class also takes care for the progress bar for every iteration step. - * - * The current optimizer values will be stored and a modified event will be sent to listeners registered to this - * observer. - * These listeners have the possibility to get the current optimizer parameters. - * - * The optimization process can be stopped by setting stopOptimization to true. The optimization will be stopped after - * the next - * iteration step of the optimizer. Unfortunately this is not implemented for ExhaustiveOptimizer, LBFGSBOptimizer, - * AmoebaOptimizer, - * ConjugateGradientOptimizer and LBFGSOptimizer in ITK. - * - * \author Daniel Stein - */ - class MITKRIGIDREGISTRATION_EXPORT RigidRegistrationObserver : public itk::Command - { - public: - typedef RigidRegistrationObserver Self; - typedef itk::Command Superclass; - typedef itk::SmartPointer Pointer; - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - typedef itk::SingleValuedNonLinearOptimizer OptimizerType; - typedef OptimizerType *OptimizerPointer; - - /** - * \brief Reacts on events from ITK optimizers. - * - * Stores the optimizer values, adds progress to the progress bar and sends a stop flag to stop the optimization - * process if it is - * set in this class. Also emits a signal to inform listeners about new optimizer values. - */ - void Execute(itk::Object *caller, const itk::EventObject &event) override; - - /** - * \brief Not implemented... - * - */ - void Execute(const itk::Object *object, const itk::EventObject &event) override; - - /** - * \brief Add new steps to the progress bar. - * - */ - void AddStepsToDo(int steps); - - /** - * \brief Sets the remaining progress to the progress bar when the optimization process is done. - * - */ - void SetRemainingProgress(int steps); - - /** - * \brief Returns the current optimizer value. This value is calculated by the used metric and shows, how good the - * images are aligned. - * - * - */ - double GetCurrentOptimizerValue(); - - /** - * \brief Returns the current transformation parameters for the moving image to this iteration step. - * - * These can include parameters for translation, scaling, rotation and shearing. - */ - itk::Array GetCurrentTranslation(); - - /** - * \brief Sets the stop optimization flag, which is used to call the StopOptimization() method of the optimizer. - * - * Unfortunately it is not implemented for ExhaustiveOptimizer, LBFGSBOptimizer, AmoebaOptimizer, - * ConjugateGradientOptimizer and LBFGSOptimizer in ITK. - */ - void SetStopOptimization(bool stopOptimization); - - protected: - RigidRegistrationObserver(); - - void HandleOptimizationIterationEvent(OptimizerType *optimizer); - - private: - double m_OptimizerValue; - itk::Array m_Params; - bool m_StopOptimization; - }; - - template - class MITKRIGIDREGISTRATION_EXPORT RigidRegistrationPyramidObserver : public itk::Command - { - public: - typedef itk::RegularStepGradientDescentBaseOptimizer OptimizerType; - - mitkClassMacroItkParent(RigidRegistrationPyramidObserver, itk::Command) - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - void Execute(itk::Object *caller, const itk::EventObject & /*event*/) override - { - RegistrationType *registration = dynamic_cast(caller); - - if (registration == NULL) - return; - - OptimizerType *optimizer = dynamic_cast(registration->GetOptimizer()); - - if (optimizer == NULL) - { - MITK_WARN("Pyramid.Registration.Command") << "No step adaptation possible with given optimizer, cast failed! "; - return; - } - - MITK_DEBUG << "\t - Pyramid level " << registration->GetCurrentLevel(); - - if (registration->GetCurrentLevel() == 0) - { - MITK_INFO("Pyramid.Registration.Command") << "First pyramid resolution level: "; - MITK_INFO("Pyramid.Registration.Command") << " Current settings: \n" - << " Step length: (" << optimizer->GetMinimumStepLength() << "," - << optimizer->GetMaximumStepLength() - << "), Tolerance: " << optimizer->GetGradientMagnitudeTolerance() - << " Iterations: " << optimizer->GetNumberOfIterations(); - return; - } - - optimizer->SetMaximumStepLength(optimizer->GetMaximumStepLength() * 0.25f); - optimizer->SetMinimumStepLength(optimizer->GetMinimumStepLength() * 0.1f); - optimizer->SetGradientMagnitudeTolerance(optimizer->GetGradientMagnitudeTolerance() * 0.1f); - optimizer->SetNumberOfIterations(optimizer->GetNumberOfIterations() * 1.5f); - - MITK_INFO("Pyramid.Registration.Command") << " Current settings: \n" - << " Step length: (" << optimizer->GetMinimumStepLength() << "," - << optimizer->GetMaximumStepLength() - << "), Tolerance: " << optimizer->GetGradientMagnitudeTolerance() - << " Iterations: " << optimizer->GetNumberOfIterations(); - } - - void Execute(const itk::Object * /*object*/, const itk::EventObject & /*event*/) override {} - }; - -} // namespace mitk - -#endif // MITKRIGIDREGISTRATIONOBSERVER_H diff --git a/Modules/RigidRegistration/mitkRigidRegistrationPreset.cpp b/Modules/RigidRegistration/mitkRigidRegistrationPreset.cpp deleted file mode 100644 index a779167c20..0000000000 --- a/Modules/RigidRegistration/mitkRigidRegistrationPreset.cpp +++ /dev/null @@ -1,794 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkRigidRegistrationPreset.h" -#include "mitkMetricParameters.h" -#include "mitkOptimizerParameters.h" -#include "mitkTransformParameters.h" - -#include "usGetModuleContext.h" -#include "usModule.h" -#include "usModuleContext.h" -#include "usModuleResource.h" -#include "usModuleResourceStream.h" - -namespace mitk -{ - RigidRegistrationPreset::RigidRegistrationPreset() - { - m_Name = ""; - m_XmlFileName = "mitkRigidRegistrationPresets.xml"; - } - - RigidRegistrationPreset::~RigidRegistrationPreset() {} - bool RigidRegistrationPreset::LoadPreset() { return LoadPreset("mitkRigidRegistrationPresets.xml"); } - bool RigidRegistrationPreset::LoadPreset(std::string fileName) - { - if (fileName.empty()) - return false; - - us::ModuleResource presetResource = us::GetModuleContext()->GetModule()->GetResource(fileName); - if (!presetResource) - return false; - - us::ModuleResourceStream presetStream(presetResource); - - vtkXMLParser::SetStream(&presetStream); - - if (!vtkXMLParser::Parse()) - { -#ifdef INTERDEBUG - MITK_INFO << "RigidRegistrationPreset::LoadPreset xml file cannot parse!" << std::endl; -#endif - } - - return true; - } - - bool RigidRegistrationPreset::newPresets(std::map> newTransformValues, - std::map> newMetricValues, - std::map> newOptimizerValues, - std::map> newInterpolatorValues, - std::string fileName) - { - if (!fileName.empty()) - { - m_XmlFileName = fileName; - } - m_TransformValues = newTransformValues; - m_MetricValues = newMetricValues; - m_OptimizerValues = newOptimizerValues; - m_InterpolatorValues = newInterpolatorValues; - return save(); - } - - void RigidRegistrationPreset::StartElement(const char *elementName, const char **atts) - { - std::string elementNameString = elementName; - if (elementNameString == "preset") - { - m_Name = ReadXMLStringAttribut("NAME", atts); - } - else if (elementNameString == "transform") - { - itk::Array transformValues; - transformValues.SetSize(25); - transformValues.fill(0); - std::string transform = ReadXMLStringAttribut("TRANSFORM", atts); - double trans = atof(transform.c_str()); - transformValues[0] = trans; - MITK_DEBUG("RigidRegistration.Preset.StartElement ") << "Name tag: " << m_Name; - transformValues = this->loadTransformValues(transformValues, trans, atts); - m_TransformValues[m_Name] = transformValues; - } - else if (elementNameString == "metric") - { - itk::Array metricValues; - metricValues.SetSize(25); - metricValues.fill(0); - std::string metric = ReadXMLStringAttribut("METRIC", atts); - double met = atof(metric.c_str()); - metricValues[0] = met; - metricValues = this->loadMetricValues(metricValues, met, atts); - m_MetricValues[m_Name] = metricValues; - } - else if (elementNameString == "optimizer") - { - itk::Array optimizerValues; - optimizerValues.SetSize(25); - optimizerValues.fill(0); - std::string optimizer = ReadXMLStringAttribut("OPTIMIZER", atts); - double opt = atof(optimizer.c_str()); - optimizerValues[0] = opt; - optimizerValues = this->loadOptimizerValues(optimizerValues, opt, atts); - m_OptimizerValues[m_Name] = optimizerValues; - } - else if (elementNameString == "interpolator") - { - itk::Array interpolatorValues; - interpolatorValues.SetSize(25); - interpolatorValues.fill(0); - std::string interpolator = ReadXMLStringAttribut("INTERPOLATOR", atts); - double inter = atof(interpolator.c_str()); - interpolatorValues[0] = inter; - interpolatorValues = this->loadInterpolatorValues(interpolatorValues /*, inter, atts*/); - m_InterpolatorValues[m_Name] = interpolatorValues; - } - } - - std::string RigidRegistrationPreset::ReadXMLStringAttribut(std::string name, const char **atts) - { - if (atts) - { - const char **attsIter = atts; - - while (*attsIter) - { - if (name == *attsIter) - { - attsIter++; - return *attsIter; - } - attsIter++; - attsIter++; - } - } - - return std::string(); - } - - itk::Array RigidRegistrationPreset::getTransformValues(std::string name) { return m_TransformValues[name]; } - itk::Array RigidRegistrationPreset::getMetricValues(std::string name) { return m_MetricValues[name]; } - itk::Array RigidRegistrationPreset::getOptimizerValues(std::string name) { return m_OptimizerValues[name]; } - itk::Array RigidRegistrationPreset::getInterpolatorValues(std::string name) - { - return m_InterpolatorValues[name]; - } - - std::list &RigidRegistrationPreset::getAvailablePresets() - { - // use the loaded transoform values to access the names - - for (auto preset : m_TransformValues) - { - m_LoadedPresets.push_back(preset.first); - } - - return m_LoadedPresets; - } - - std::map> &RigidRegistrationPreset::getTransformValuesPresets() - { - return m_TransformValues; - } - - std::map> &RigidRegistrationPreset::getMetricValuesPresets() - { - return m_MetricValues; - } - - std::map> &RigidRegistrationPreset::getOptimizerValuesPresets() - { - return m_OptimizerValues; - } - - std::map> &RigidRegistrationPreset::getInterpolatorValuesPresets() - { - return m_InterpolatorValues; - } - - bool RigidRegistrationPreset::save() - { - // falsely removed return value, the previous implementation was also empty (and only returning false) - return false; - } - - itk::Array RigidRegistrationPreset::loadTransformValues(itk::Array transformValues, - double transform, - const char **atts) - { - if (transform == mitk::TransformParameters::TRANSLATIONTRANSFORM || - transform == mitk::TransformParameters::SCALETRANSFORM || - transform == mitk::TransformParameters::SCALELOGARITHMICTRANSFORM || - transform == mitk::TransformParameters::VERSORTRANSFORM || - transform == mitk::TransformParameters::RIGID2DTRANSFORM || - transform == mitk::TransformParameters::EULER2DTRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - } - else if (transform == mitk::TransformParameters::AFFINETRANSFORM || - transform == mitk::TransformParameters::FIXEDCENTEROFROTATIONAFFINETRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - std::string scale4 = ReadXMLStringAttribut("SCALE4", atts); - double sca4 = atof(scale4.c_str()); - transformValues[5] = sca4; - std::string scale5 = ReadXMLStringAttribut("SCALE5", atts); - double sca5 = atof(scale5.c_str()); - transformValues[6] = sca5; - std::string scale6 = ReadXMLStringAttribut("SCALE6", atts); - double sca6 = atof(scale6.c_str()); - transformValues[7] = sca6; - std::string scale7 = ReadXMLStringAttribut("SCALE7", atts); - double sca7 = atof(scale7.c_str()); - transformValues[8] = sca7; - std::string scale8 = ReadXMLStringAttribut("SCALE8", atts); - double sca8 = atof(scale8.c_str()); - transformValues[9] = sca8; - std::string scale9 = ReadXMLStringAttribut("SCALE9", atts); - double sca9 = atof(scale9.c_str()); - transformValues[10] = sca9; - std::string scale10 = ReadXMLStringAttribut("SCALE10", atts); - double sca10 = atof(scale10.c_str()); - transformValues[11] = sca10; - std::string scale11 = ReadXMLStringAttribut("SCALE11", atts); - double sca11 = atof(scale11.c_str()); - transformValues[12] = sca11; - std::string scale12 = ReadXMLStringAttribut("SCALE12", atts); - double sca12 = atof(scale12.c_str()); - transformValues[13] = sca12; - - std::string useInitializer = ReadXMLStringAttribut("USEINITIALIZER", atts); - double useIni = atof(useInitializer.c_str()); - transformValues[14] = useIni; - std::string useMoments = ReadXMLStringAttribut("USEMOMENTS", atts); - double useMo = atof(useMoments.c_str()); - transformValues[15] = useMo; - } - - else if (transform == mitk::TransformParameters::EULER3DTRANSFORM || - transform == mitk::TransformParameters::CENTEREDEULER3DTRANSFORM || - transform == mitk::TransformParameters::VERSORRIGID3DTRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - std::string scale4 = ReadXMLStringAttribut("SCALE4", atts); - double sca4 = atof(scale4.c_str()); - transformValues[5] = sca4; - std::string scale5 = ReadXMLStringAttribut("SCALE5", atts); - double sca5 = atof(scale5.c_str()); - transformValues[6] = sca5; - std::string scale6 = ReadXMLStringAttribut("SCALE6", atts); - double sca6 = atof(scale6.c_str()); - transformValues[7] = sca6; - std::string useInitializer = ReadXMLStringAttribut("USEINITIALIZER", atts); - double useIni = atof(useInitializer.c_str()); - transformValues[8] = useIni; - std::string useMoments = ReadXMLStringAttribut("USEMOMENTS", atts); - double useMo = atof(useMoments.c_str()); - transformValues[9] = useMo; - } - else if (transform == mitk::TransformParameters::QUATERNIONRIGIDTRANSFORM || - transform == mitk::TransformParameters::SIMILARITY3DTRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - std::string scale4 = ReadXMLStringAttribut("SCALE4", atts); - double sca4 = atof(scale4.c_str()); - transformValues[5] = sca4; - std::string scale5 = ReadXMLStringAttribut("SCALE5", atts); - double sca5 = atof(scale5.c_str()); - transformValues[6] = sca5; - std::string scale6 = ReadXMLStringAttribut("SCALE6", atts); - double sca6 = atof(scale6.c_str()); - transformValues[7] = sca6; - std::string scale7 = ReadXMLStringAttribut("SCALE7", atts); - double sca7 = atof(scale7.c_str()); - transformValues[8] = sca7; - std::string useInitializer = ReadXMLStringAttribut("USEINITIALIZER", atts); - double useIni = atof(useInitializer.c_str()); - transformValues[9] = useIni; - std::string useMoments = ReadXMLStringAttribut("USEMOMENTS", atts); - double useMo = atof(useMoments.c_str()); - transformValues[10] = useMo; - } - else if (transform == mitk::TransformParameters::SCALESKEWVERSOR3DTRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - std::string scale4 = ReadXMLStringAttribut("SCALE4", atts); - double sca4 = atof(scale4.c_str()); - transformValues[5] = sca4; - std::string scale5 = ReadXMLStringAttribut("SCALE5", atts); - double sca5 = atof(scale5.c_str()); - transformValues[6] = sca5; - std::string scale6 = ReadXMLStringAttribut("SCALE6", atts); - double sca6 = atof(scale6.c_str()); - transformValues[7] = sca6; - std::string scale7 = ReadXMLStringAttribut("SCALE7", atts); - double sca7 = atof(scale7.c_str()); - transformValues[8] = sca7; - std::string scale8 = ReadXMLStringAttribut("SCALE8", atts); - double sca8 = atof(scale8.c_str()); - transformValues[9] = sca8; - std::string scale9 = ReadXMLStringAttribut("SCALE9", atts); - double sca9 = atof(scale9.c_str()); - transformValues[10] = sca9; - std::string scale10 = ReadXMLStringAttribut("SCALE10", atts); - double sca10 = atof(scale10.c_str()); - transformValues[11] = sca10; - std::string scale11 = ReadXMLStringAttribut("SCALE11", atts); - double sca11 = atof(scale11.c_str()); - transformValues[12] = sca11; - std::string scale12 = ReadXMLStringAttribut("SCALE12", atts); - double sca12 = atof(scale12.c_str()); - transformValues[13] = sca12; - std::string scale13 = ReadXMLStringAttribut("SCALE13", atts); - double sca13 = atof(scale13.c_str()); - transformValues[14] = sca13; - std::string scale14 = ReadXMLStringAttribut("SCALE14", atts); - double sca14 = atof(scale14.c_str()); - transformValues[15] = sca14; - std::string scale15 = ReadXMLStringAttribut("SCALE15", atts); - double sca15 = atof(scale15.c_str()); - transformValues[16] = sca15; - std::string useInitializer = ReadXMLStringAttribut("USEINITIALIZER", atts); - double useIni = atof(useInitializer.c_str()); - transformValues[17] = useIni; - std::string useMoments = ReadXMLStringAttribut("USEMOMENTS", atts); - double useMo = atof(useMoments.c_str()); - transformValues[18] = useMo; - } - else if (transform == mitk::TransformParameters::CENTEREDRIGID2DTRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - std::string scale4 = ReadXMLStringAttribut("SCALE4", atts); - double sca4 = atof(scale4.c_str()); - transformValues[5] = sca4; - std::string scale5 = ReadXMLStringAttribut("SCALE5", atts); - double sca5 = atof(scale5.c_str()); - transformValues[6] = sca5; - std::string angle = ReadXMLStringAttribut("ANGLE", atts); - double ang = atof(angle.c_str()); - transformValues[7] = ang; - std::string useInitializer = ReadXMLStringAttribut("USEINITIALIZER", atts); - double useIni = atof(useInitializer.c_str()); - transformValues[8] = useIni; - std::string useMoments = ReadXMLStringAttribut("USEMOMENTS", atts); - double useMo = atof(useMoments.c_str()); - transformValues[9] = useMo; - } - else if (transform == mitk::TransformParameters::SIMILARITY2DTRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - std::string scale4 = ReadXMLStringAttribut("SCALE4", atts); - double sca4 = atof(scale4.c_str()); - transformValues[5] = sca4; - std::string scale = ReadXMLStringAttribut("SCALE", atts); - double sca = atof(scale.c_str()); - transformValues[6] = sca; - std::string angle = ReadXMLStringAttribut("ANGLE", atts); - double ang = atof(angle.c_str()); - transformValues[7] = ang; - std::string useInitializer = ReadXMLStringAttribut("USEINITIALIZER", atts); - double useIni = atof(useInitializer.c_str()); - transformValues[8] = useIni; - std::string useMoments = ReadXMLStringAttribut("USEMOMENTS", atts); - double useMo = atof(useMoments.c_str()); - transformValues[9] = useMo; - } - else if (transform == mitk::TransformParameters::CENTEREDSIMILARITY2DTRANSFORM) - { - std::string useScales = ReadXMLStringAttribut("USESCALES", atts); - double useSca = atof(useScales.c_str()); - transformValues[1] = useSca; - std::string scale1 = ReadXMLStringAttribut("SCALE1", atts); - double sca1 = atof(scale1.c_str()); - transformValues[2] = sca1; - std::string scale2 = ReadXMLStringAttribut("SCALE2", atts); - double sca2 = atof(scale2.c_str()); - transformValues[3] = sca2; - std::string scale3 = ReadXMLStringAttribut("SCALE3", atts); - double sca3 = atof(scale3.c_str()); - transformValues[4] = sca3; - std::string scale4 = ReadXMLStringAttribut("SCALE4", atts); - double sca4 = atof(scale4.c_str()); - transformValues[5] = sca4; - std::string scale5 = ReadXMLStringAttribut("SCALE5", atts); - double sca5 = atof(scale5.c_str()); - transformValues[6] = sca5; - std::string scale6 = ReadXMLStringAttribut("SCALE6", atts); - double sca6 = atof(scale6.c_str()); - transformValues[7] = sca6; - std::string scale = ReadXMLStringAttribut("SCALE", atts); - double sca = atof(scale.c_str()); - transformValues[8] = sca; - std::string angle = ReadXMLStringAttribut("ANGLE", atts); - double ang = atof(angle.c_str()); - transformValues[9] = ang; - std::string useInitializer = ReadXMLStringAttribut("USEINITIALIZER", atts); - double useIni = atof(useInitializer.c_str()); - transformValues[10] = useIni; - std::string useMoments = ReadXMLStringAttribut("USEMOMENTS", atts); - double useMo = atof(useMoments.c_str()); - transformValues[11] = useMo; - } - - MITK_DEBUG("RigidRegistration.Preset.LoadValue ") << transformValues; - return transformValues; - } - - itk::Array RigidRegistrationPreset::loadMetricValues(itk::Array metricValues, - double metric, - const char **atts) - { - std::string computeGradient = ReadXMLStringAttribut("COMPUTEGRADIENT", atts); - double compGra = atof(computeGradient.c_str()); - metricValues[1] = compGra; - if (metric == mitk::MetricParameters::MEANSQUARESIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::NORMALIZEDCORRELATIONIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::GRADIENTDIFFERENCEIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::MATCHCARDINALITYIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::KAPPASTATISTICIMAGETOIMAGEMETRIC) - { - } - else if (metric == mitk::MetricParameters::KULLBACKLEIBLERCOMPAREHISTOGRAMIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::CORRELATIONCOEFFICIENTHISTOGRAMIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::MEANSQUARESHISTOGRAMIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::MUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC || - metric == mitk::MetricParameters::NORMALIZEDMUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC) - { - std::string histogramBins = ReadXMLStringAttribut("HISTOGRAMBINS", atts); - double histBins = atof(histogramBins.c_str()); - metricValues[2] = histBins; - } - else if (metric == mitk::MetricParameters::MATTESMUTUALINFORMATIONIMAGETOIMAGEMETRIC) - { - std::string useSampling = ReadXMLStringAttribut("USESAMPLING", atts); - double useSamp = atof(useSampling.c_str()); - metricValues[2] = useSamp; - std::string spatialSamples = ReadXMLStringAttribut("SPATIALSAMPLES", atts); - double spatSamp = atof(spatialSamples.c_str()); - metricValues[3] = spatSamp; - std::string histogramBins = ReadXMLStringAttribut("HISTOGRAMBINS", atts); - double histBins = atof(histogramBins.c_str()); - metricValues[4] = histBins; - } - else if (metric == mitk::MetricParameters::MEANRECIPROCALSQUAREDIFFERENCEIMAGETOIMAGEMETRIC) - { - std::string lambda = ReadXMLStringAttribut("LAMBDA", atts); - double lamb = atof(lambda.c_str()); - metricValues[2] = lamb; - } - else if (metric == mitk::MetricParameters::MUTUALINFORMATIONIMAGETOIMAGEMETRIC) - { - std::string spatialSamples = ReadXMLStringAttribut("SPATIALSAMPLES", atts); - double spatSamp = atof(spatialSamples.c_str()); - metricValues[2] = spatSamp; - std::string fixedStandardDeviation = ReadXMLStringAttribut("FIXEDSTANDARDDEVIATION", atts); - double fiStaDev = atof(fixedStandardDeviation.c_str()); - metricValues[3] = fiStaDev; - std::string movingStandardDeviation = ReadXMLStringAttribut("MOVINGSTANDARDDEVIATION", atts); - double moStaDev = atof(movingStandardDeviation.c_str()); - metricValues[4] = moStaDev; - std::string useNormalizer = ReadXMLStringAttribut("USENORMALIZERANDSMOOTHER", atts); - double useNormal = atof(useNormalizer.c_str()); - metricValues[5] = useNormal; - std::string fixedSmootherVariance = ReadXMLStringAttribut("FIXEDSMOOTHERVARIANCE", atts); - double fiSmoVa = atof(fixedSmootherVariance.c_str()); - metricValues[6] = fiSmoVa; - std::string movingSmootherVariance = ReadXMLStringAttribut("MOVINGSMOOTHERVARIANCE", atts); - double moSmoVa = atof(movingSmootherVariance.c_str()); - metricValues[7] = moSmoVa; - } - return metricValues; - } - - itk::Array RigidRegistrationPreset::loadOptimizerValues(itk::Array optimizerValues, - double optimizer, - const char **atts) - { - std::string maximize = ReadXMLStringAttribut("MAXIMIZE", atts); - double max = atof(maximize.c_str()); - optimizerValues[1] = max; - if (optimizer == mitk::OptimizerParameters::EXHAUSTIVEOPTIMIZER) - { - std::string stepLength = ReadXMLStringAttribut("STEPLENGTH", atts); - double stepLe = atof(stepLength.c_str()); - optimizerValues[2] = stepLe; - std::string numberOfSteps = ReadXMLStringAttribut("NUMBEROFSTEPS", atts); - double numSteps = atof(numberOfSteps.c_str()); - optimizerValues[3] = numSteps; - } - else if (optimizer == mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER || - optimizer == mitk::OptimizerParameters::QUATERNIONRIGIDTRANSFORMGRADIENTDESCENTOPTIMIZER) - { - std::string learningRate = ReadXMLStringAttribut("LEARNINGRATE", atts); - double learn = atof(learningRate.c_str()); - optimizerValues[2] = learn; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[3] = numIt; - } - else if (optimizer == mitk::OptimizerParameters::LBFGSBOPTIMIZER) - { - } - else if (optimizer == mitk::OptimizerParameters::ONEPLUSONEEVOLUTIONARYOPTIMIZER) - { - std::string shrinkFactor = ReadXMLStringAttribut("SHRINKFACTOR", atts); - double shrink = atof(shrinkFactor.c_str()); - optimizerValues[2] = shrink; - std::string growthFactor = ReadXMLStringAttribut("GROWTHFACTOR", atts); - double growth = atof(growthFactor.c_str()); - optimizerValues[3] = growth; - std::string epsilon = ReadXMLStringAttribut("EPSILON", atts); - double eps = atof(epsilon.c_str()); - optimizerValues[4] = eps; - std::string initialRadius = ReadXMLStringAttribut("INITIALRADIUS", atts); - double initRad = atof(initialRadius.c_str()); - optimizerValues[5] = initRad; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[6] = numIt; - } - else if (optimizer == mitk::OptimizerParameters::POWELLOPTIMIZER) - { - std::string stepLength = ReadXMLStringAttribut("STEPLENGTH", atts); - double stepLe = atof(stepLength.c_str()); - optimizerValues[2] = stepLe; - std::string stepTolerance = ReadXMLStringAttribut("STEPTOLERANCE", atts); - double stepTo = atof(stepTolerance.c_str()); - optimizerValues[3] = stepTo; - std::string valueTolerance = ReadXMLStringAttribut("VALUETOLERANCE", atts); - double valTo = atof(valueTolerance.c_str()); - optimizerValues[4] = valTo; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[5] = numIt; - } - else if (optimizer == mitk::OptimizerParameters::FRPROPTIMIZER) - { - std::string useFletchReeves = ReadXMLStringAttribut("USEFLETCHREEVES", atts); - double useFleRe = atof(useFletchReeves.c_str()); - optimizerValues[2] = useFleRe; - std::string stepLength = ReadXMLStringAttribut("STEPLENGTH", atts); - double stepLe = atof(stepLength.c_str()); - optimizerValues[3] = stepLe; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[4] = numIt; - } - else if (optimizer == mitk::OptimizerParameters::REGULARSTEPGRADIENTDESCENTOPTIMIZER) - { - std::string gradientMagnitudeTolerance = ReadXMLStringAttribut("GRADIENTMAGNITUDETOLERANCE", atts); - double graMagTo = atof(gradientMagnitudeTolerance.c_str()); - optimizerValues[2] = graMagTo; - std::string minStepLength = ReadXMLStringAttribut("MINSTEPLENGTH", atts); - double minStep = atof(minStepLength.c_str()); - optimizerValues[3] = minStep; - std::string maxStepLength = ReadXMLStringAttribut("MAXSTEPLENGTH", atts); - double maxStep = atof(maxStepLength.c_str()); - optimizerValues[4] = maxStep; - std::string relaxationFactor = ReadXMLStringAttribut("RELAXATIONFACTOR", atts); - double relFac = atof(relaxationFactor.c_str()); - optimizerValues[5] = relFac; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[6] = numIt; - } - else if (optimizer == mitk::OptimizerParameters::VERSORTRANSFORMOPTIMIZER || - optimizer == mitk::OptimizerParameters::VERSORRIGID3DTRANSFORMOPTIMIZER) - { - std::string gradientMagnitudeTolerance = ReadXMLStringAttribut("GRADIENTMAGNITUDETOLERANCE", atts); - double graMagTo = atof(gradientMagnitudeTolerance.c_str()); - optimizerValues[2] = graMagTo; - std::string minStepLength = ReadXMLStringAttribut("MINSTEPLENGTH", atts); - double minStep = atof(minStepLength.c_str()); - optimizerValues[3] = minStep; - std::string maxStepLength = ReadXMLStringAttribut("MAXSTEPLENGTH", atts); - double maxStep = atof(maxStepLength.c_str()); - optimizerValues[4] = maxStep; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[5] = numIt; - } - else if (optimizer == mitk::OptimizerParameters::AMOEBAOPTIMIZER) - { - std::string simplexDelta1 = ReadXMLStringAttribut("SIMPLEXDELTA1", atts); - double simpDel1 = atof(simplexDelta1.c_str()); - optimizerValues[2] = simpDel1; - std::string simplexDelta2 = ReadXMLStringAttribut("SIMPLEXDELTA2", atts); - double simpDel2 = atof(simplexDelta2.c_str()); - optimizerValues[3] = simpDel2; - std::string simplexDelta3 = ReadXMLStringAttribut("SIMPLEXDELTA3", atts); - double simpDel3 = atof(simplexDelta3.c_str()); - optimizerValues[4] = simpDel3; - std::string simplexDelta4 = ReadXMLStringAttribut("SIMPLEXDELTA4", atts); - double simpDel4 = atof(simplexDelta4.c_str()); - optimizerValues[5] = simpDel4; - std::string simplexDelta5 = ReadXMLStringAttribut("SIMPLEXDELTA5", atts); - double simpDel5 = atof(simplexDelta5.c_str()); - optimizerValues[6] = simpDel5; - std::string simplexDelta6 = ReadXMLStringAttribut("SIMPLEXDELTA6", atts); - double simpDel6 = atof(simplexDelta6.c_str()); - optimizerValues[7] = simpDel6; - std::string simplexDelta7 = ReadXMLStringAttribut("SIMPLEXDELTA7", atts); - double simpDel7 = atof(simplexDelta7.c_str()); - optimizerValues[8] = simpDel7; - std::string simplexDelta8 = ReadXMLStringAttribut("SIMPLEXDELTA8", atts); - double simpDel8 = atof(simplexDelta8.c_str()); - optimizerValues[9] = simpDel8; - std::string simplexDelta9 = ReadXMLStringAttribut("SIMPLEXDELTA9", atts); - double simpDel9 = atof(simplexDelta9.c_str()); - optimizerValues[10] = simpDel9; - std::string simplexDelta10 = ReadXMLStringAttribut("SIMPLEXDELTA10", atts); - double simpDel10 = atof(simplexDelta10.c_str()); - optimizerValues[11] = simpDel10; - std::string simplexDelta11 = ReadXMLStringAttribut("SIMPLEXDELTA11", atts); - double simpDel11 = atof(simplexDelta11.c_str()); - optimizerValues[12] = simpDel11; - std::string simplexDelta12 = ReadXMLStringAttribut("SIMPLEXDELTA12", atts); - double simpDel12 = atof(simplexDelta12.c_str()); - optimizerValues[13] = simpDel12; - std::string simplexDelta13 = ReadXMLStringAttribut("SIMPLEXDELTA13", atts); - double simpDel13 = atof(simplexDelta13.c_str()); - optimizerValues[14] = simpDel13; - std::string simplexDelta14 = ReadXMLStringAttribut("SIMPLEXDELTA14", atts); - double simpDel14 = atof(simplexDelta14.c_str()); - optimizerValues[15] = simpDel14; - std::string simplexDelta15 = ReadXMLStringAttribut("SIMPLEXDELTA15", atts); - double simpDel15 = atof(simplexDelta15.c_str()); - optimizerValues[16] = simpDel15; - std::string simplexDelta16 = ReadXMLStringAttribut("SIMPLEXDELTA16", atts); - double simpDel16 = atof(simplexDelta16.c_str()); - optimizerValues[17] = simpDel16; - std::string parametersConvergenceTolerance = ReadXMLStringAttribut("PARAMETERSCONVERGENCETOLERANCE", atts); - double paramConv = atof(parametersConvergenceTolerance.c_str()); - optimizerValues[18] = paramConv; - std::string functionConvergenceTolerance = ReadXMLStringAttribut("FUNCTIONCONVERGENCETOLERANCE", atts); - double funcConv = atof(functionConvergenceTolerance.c_str()); - optimizerValues[19] = funcConv; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[20] = numIt; - } - else if (optimizer == mitk::OptimizerParameters::CONJUGATEGRADIENTOPTIMIZER) - { - } - else if (optimizer == mitk::OptimizerParameters::LBFGSOPTIMIZER) - { - std::string GradientConvergenceTolerance = ReadXMLStringAttribut("GRADIENTCONVERGENCETOLERANCE", atts); - double graConTo = atof(GradientConvergenceTolerance.c_str()); - optimizerValues[2] = graConTo; - std::string lineSearchAccuracy = ReadXMLStringAttribut("LINESEARCHACCURACY", atts); - double lineSearch = atof(lineSearchAccuracy.c_str()); - optimizerValues[3] = lineSearch; - std::string defaultStepLength = ReadXMLStringAttribut("DEFAULTSTEPLENGTH", atts); - double defStep = atof(defaultStepLength.c_str()); - optimizerValues[4] = defStep; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[5] = numIt; - std::string useTrace = ReadXMLStringAttribut("USETRACE", atts); - double useTr = atof(useTrace.c_str()); - optimizerValues[6] = useTr; - } - else if (optimizer == mitk::OptimizerParameters::SPSAOPTIMIZER) - { - std::string a = ReadXMLStringAttribut("a", atts); - double a1 = atof(a.c_str()); - optimizerValues[2] = a1; - std::string a2 = ReadXMLStringAttribut("A", atts); - double a3 = atof(a2.c_str()); - optimizerValues[3] = a3; - std::string alpha = ReadXMLStringAttribut("ALPHA", atts); - double alp = atof(alpha.c_str()); - optimizerValues[4] = alp; - std::string c = ReadXMLStringAttribut("c", atts); - double c1 = atof(c.c_str()); - optimizerValues[5] = c1; - std::string gamma = ReadXMLStringAttribut("GAMMA", atts); - double gam = atof(gamma.c_str()); - optimizerValues[6] = gam; - std::string tolerance = ReadXMLStringAttribut("TOLERANCE", atts); - double tol = atof(tolerance.c_str()); - optimizerValues[7] = tol; - std::string stateOfConvergenceDecayRate = ReadXMLStringAttribut("STATEOFCONVERGENCEDECAYRATE", atts); - double stateOfConvergence = atof(stateOfConvergenceDecayRate.c_str()); - optimizerValues[8] = stateOfConvergence; - std::string minNumberIterations = ReadXMLStringAttribut("MINNUMBERITERATIONS", atts); - double minNumIt = atof(minNumberIterations.c_str()); - optimizerValues[9] = minNumIt; - std::string numberPerturbations = ReadXMLStringAttribut("NUMBERPERTURBATIONS", atts); - double numPer = atof(numberPerturbations.c_str()); - optimizerValues[10] = numPer; - std::string numberIterations = ReadXMLStringAttribut("NUMBERITERATIONS", atts); - double numIt = atof(numberIterations.c_str()); - optimizerValues[11] = numIt; - } - return optimizerValues; - } - - itk::Array RigidRegistrationPreset::loadInterpolatorValues( - itk::Array interpolatorValues /*, double interpolator, const char **atts*/) - { - return interpolatorValues; - } -} diff --git a/Modules/RigidRegistration/mitkRigidRegistrationPreset.h b/Modules/RigidRegistration/mitkRigidRegistrationPreset.h deleted file mode 100644 index 42dbde7c16..0000000000 --- a/Modules/RigidRegistration/mitkRigidRegistrationPreset.h +++ /dev/null @@ -1,172 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKRIGIDREGISTRATIONPRESET_H_HEADER -#define MITKRIGIDREGISTRATIONPRESET_H_HEADER - -#include "MitkRigidRegistrationExports.h" -#include - -#include -#include -#include - -#include "mitkCommon.h" -#include - -namespace mitk -{ - /** - * \brief Class to load and save parameter presets for rigid registration. - * - * \ingroup RigidRegistration - * - * This class stores parameter presets for rigid registration applications. To that belong parameters for - * transformations, metrics, - * optimizer and interpolators. The presets will be stored in a xml file. Existing presets can be opened with - * LoadPreset() and saved with - * newPresets(...). - * - * - * \author Daniel Stein - */ - class MITKRIGIDREGISTRATION_EXPORT RigidRegistrationPreset : public vtkXMLParser - { - public: - RigidRegistrationPreset(); - ~RigidRegistrationPreset(); - - /** - * \brief Tries to find mitkRigidRegistrationPresets.xml in /mitk/Config and loads all presets stored in this file. - */ - bool LoadPreset(); - /** - * \brief Tries to open preset xml file \e fileName and loads all presets stored in this file. - */ - bool LoadPreset(std::string fileName); - /** - * \brief Returns an array including all all transform values belonging to preset \e name. - */ - itk::Array getTransformValues(std::string name); - /** - * \brief Returns an array including all all metric values belonging to preset \e name. - */ - itk::Array getMetricValues(std::string name); - /** - * \brief Returns an array including all all optimizer values belonging to preset \e name. - */ - itk::Array getOptimizerValues(std::string name); - /** - * \brief Returns an array including all interpolator values belonging to preset \e name. - */ - itk::Array getInterpolatorValues(std::string name); - - std::list &getAvailablePresets(); - - /** - * \brief Returns a map with all preset names and their according transform values as an array. - */ - std::map> &getTransformValuesPresets(); - /** - * \brief Returns a map with all preset names and their according metric values as an array. - */ - std::map> &getMetricValuesPresets(); - /** - * \brief Returns a map with all preset names and their according optimizer values as an array. - */ - std::map> &getOptimizerValuesPresets(); - /** - * \brief Returns a map with all preset names and their according interpolator values as an array. - */ - std::map> &getInterpolatorValuesPresets(); - /** - * \brief Saves new presets in the previous opened xml file or in the new fileName location. - * - * Every old entry will be removed from the xml file and replaced by the ones stored in the parameter maps. Make sure - * you have the - * old presets as well as the new ones within the maps. - */ - bool newPresets(std::map> newTransformValues, - std::map> newMetricValues, - std::map> newOptimizerValues, - std::map> newInterpolatorValues, - std::string fileName = ""); - - private: - /** - * \brief method used in XLM-Reading; gets called when a start-tag is read - */ - void StartElement(const char *elementName, const char **atts) override; - - /** - * \brief Saves all preset attributes to xml file. - */ - // bool saveXML(mitk::XMLWriter& xmlWriter); - /** - * \brief Saves all preset attributes to xml file. - */ - bool save(); - /** - * \brief Saves the transform values for one preset to the xml file. - */ - // void saveTransformValues(mitk::XMLWriter& xmlWriter, std::string item); - /** - * \brief Saves the metric values for one preset to the xml file. - */ - // void saveMetricValues(mitk::XMLWriter& xmlWriter, std::string item); - /** - * \brief Saves the optimizer values for one preset to the xml file. - */ - // void saveOptimizerValues(mitk::XMLWriter& xmlWriter, std::string item); - /** - * \brief Saves the interpolator values for one preset to the xml file. - */ - // void saveInterpolatorValues(mitk::XMLWriter& xmlWriter, std::string item); - - /** - * \brief Loads the transform values for one preset from the xml file. - */ - itk::Array loadTransformValues(itk::Array transformValues, double transform, const char **atts); - /** - * \brief Loads the metric values for one preset from the xml file. - */ - itk::Array loadMetricValues(itk::Array metricValues, double metric, const char **atts); - /** - * \brief Loads the optimizer values for one preset from the xml file. - */ - itk::Array loadOptimizerValues(itk::Array optimizerValues, double optimizer, const char **atts); - /** - * \brief Loads the interpolator values for one preset from the xml file. - */ - itk::Array loadInterpolatorValues( - itk::Array interpolatorValues /*, double interpolator, const char **atts*/); - - /** - * \brief Reads an XML-String-Attribute - */ - std::string ReadXMLStringAttribut(std::string name, const char **atts); - - std::string m_Name; - std::map> m_TransformValues; - std::map> m_MetricValues; - std::map> m_OptimizerValues; - std::map> m_InterpolatorValues; - std::list m_LoadedPresets; - - std::string m_XmlFileName; - }; -} -#endif diff --git a/Modules/RigidRegistration/mitkTransformFactory.h b/Modules/RigidRegistration/mitkTransformFactory.h deleted file mode 100644 index e40af398af..0000000000 --- a/Modules/RigidRegistration/mitkTransformFactory.h +++ /dev/null @@ -1,110 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKTRANSFORMFACTORY_H -#define MITKTRANSFORMFACTORY_H - -#include "MitkRigidRegistrationExports.h" -#include "itkImage.h" -#include "itkTransform.h" -#include "mitkTransformParameters.h" - -namespace mitk -{ - /*! - \brief This class creates a transform for a rigid registration process. - - This class will e.g. be instantiated by mitkImageRegistrationMethod and a - transform corresponding to the integer value stored in mitkTransformParameters - will be created. Therefore SetTransformParameters() has to be called with an instance - of mitkTransformParameters, which holds all parameter informations for the new - transformation. - - GetTransform() returns the transform which then can be used in combination with a - metric, an optimizer and an interpolator within a registration pipeline. - - - \ingroup RigidRegistration - - \author Daniel Stein - */ - - template - class MITKRIGIDREGISTRATION_EXPORT TransformFactory : public itk::Object - { - public: - mitkClassMacroItkParent(TransformFactory, itk::Object); - - /** Method for creation through the object factory. */ - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typedef typename itk::Image FixedImage2DType; - typedef typename itk::Image MovingImage2DType; - typedef typename itk::Image FixedImage3DType; - typedef typename itk::Image MovingImage3DType; - - typedef typename itk::Transform TransformType; - - typedef typename TransformType::Pointer TransformPointer; - - /** - \brief Returns the transform which then can be used in combination with a metric, an optimizer - and an interpolator within a registration pipeline. - */ - TransformPointer GetTransform(); - - /** - \brief Sets the fixed image which is needed by transform initializer. - */ - void SetFixedImage(FixedImageType *fixed); - - /** - \brief Sets the moving image which is needed by transform initializer. - */ - void SetMovingImage(MovingImageType *moving); - - /** - \brief Sets the instance to the transform parameters class which holds all parameters for the new transform. - */ - void SetTransformParameters(TransformParameters::Pointer transformParameters) - { - m_TransformParameters = transformParameters; - } - - /** - \brief Returns the instance to the transform parameters class which holds all parameters for the new transform. - */ - TransformParameters::Pointer GetTransformParameters() { return m_TransformParameters; } - protected: - TransformFactory(); - ~TransformFactory(){}; - - TransformParameters::Pointer m_TransformParameters; - typename FixedImageType::Pointer m_FixedImage; - typename MovingImageType::Pointer m_MovingImage; - typename FixedImage2DType::Pointer m_FixedImage2D; - typename MovingImage2DType::Pointer m_MovingImage2D; - typename FixedImage3DType::Pointer m_FixedImage3D; - typename MovingImage3DType::Pointer m_MovingImage3D; - }; - -} // namespace mitk - -#include "mitkTransformFactory.txx" - -#endif // MITKTRANSFORMFACTORY_H diff --git a/Modules/RigidRegistration/mitkTransformFactory.txx b/Modules/RigidRegistration/mitkTransformFactory.txx deleted file mode 100644 index a5f9e618ea..0000000000 --- a/Modules/RigidRegistration/mitkTransformFactory.txx +++ /dev/null @@ -1,492 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkTransformFactory.h" -#include "mitkTransformParameters.h" - -#include "itkAffineTransform.h" -#include "itkAzimuthElevationToCartesianTransform.h" -#include "itkCenteredAffineTransform.h" -#include "itkCenteredTransformInitializer.h" -#include "itkFixedCenterOfRotationAffineTransform.h" -#include "itkScaleLogarithmicTransform.h" -#include "itkScaleTransform.h" -#include "itkTranslationTransform.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mitk -{ - template - TransformFactory::TransformFactory() - : m_TransformParameters(NULL), - m_FixedImage(NULL), - m_MovingImage(NULL), - m_FixedImage2D(NULL), - m_MovingImage2D(NULL), - m_FixedImage3D(NULL), - m_MovingImage3D(NULL) - { - } - - template - void TransformFactory::SetFixedImage(FixedImageType *fixed) - { - if (VImageDimension == 2) - { - m_FixedImage2D = reinterpret_cast(fixed); - m_FixedImage = fixed; - } - else - { - m_FixedImage3D = reinterpret_cast(fixed); - ; - m_FixedImage = fixed; - } - } - - template - void TransformFactory::SetMovingImage(MovingImageType *moving) - { - if (VImageDimension == 2) - { - m_MovingImage2D = reinterpret_cast(moving); - m_MovingImage = moving; - } - else - { - m_MovingImage3D = reinterpret_cast(moving); - m_MovingImage = moving; - } - } - - /*template < class TPixelType, unsigned int VImageDimension > - typename ::itk::Transform< double, VImageDimension, VImageDimension >::Pointer - MakeRigidTransform(); - - template - typename ::itk::Transform< double, 3, 3 >::Pointer - MakeRigidTransform() - { - itk::Rigid3DTransform< double >::Pointer transform = itk::Rigid3DTransform< double >::New(); - transform->SetIdentity(); - return transform.GetPointer(); - } - - template - typename ::itk::Transform< double, 2, 2 >::Pointer - MakeRigidTransform() - { - return NULL; - }*/ - - /*template < unsigned int VImageDimension > - typename ::itk::Transform< double, VImageDimension, VImageDimension >::Pointer - MakeRigidTransform(); - - template <> - typename ::itk::Transform< double, 3, 3 >::Pointer - MakeRigidTransform<3>() - { - itk::Rigid3DTransform< double >::Pointer transform = itk::Rigid3DTransform< double >::New(); - transform->SetIdentity(); - return transform.GetPointer(); - } - - template <> - typename ::itk::Transform< double, 2, 2 >::Pointer - MakeRigidTransform<2>() - { - return NULL; - }*/ - // - // template class X - // { void f() { cout << "Primary template" << endl; } }; - // template class X - // { void f() { cout << "Partial specialization 3" << endl; - // } }; - // - // - // template < class TPixelType > class TransformFactory - //{ - // typedef typename itk::Transform< double, 3, 3 > TransformType; - // typedef typename TransformType::Pointer TransformPointer; - // - // typename TransformPointer MakeRigidTransform() - // { - // } - //}; - - // template <> - // typename TransformFactory< double, 3 >::TransformPointer - // TransformFactory< double, 3 >::MakeRigidTransform() - //{ - // itk::Rigid3DTransform< double >::Pointer transform = itk::Rigid3DTransform< double >::New(); - // transform->SetIdentity(); - // return transform.GetPointer(); - //} - - // template <> - // typename TransformFactory< double, 2 >::TransformPointer - // TransformFactory< double, 2 >::MakeRigidTransform() - //{ - // return NULL; - //} - - template - typename TransformFactory::TransformPointer - TransformFactory::GetTransform() - { - int transform = m_TransformParameters->GetTransform(); - if (transform == TransformParameters::TRANSLATIONTRANSFORM) - { - typename itk::TranslationTransform::Pointer transformPointer = - itk::TranslationTransform::New(); - transformPointer->SetIdentity(); - return transformPointer.GetPointer(); - } - else if (transform == TransformParameters::SCALETRANSFORM) - { - typename itk::ScaleTransform::Pointer transformPointer = - itk::ScaleTransform::New(); - transformPointer->SetIdentity(); - return transformPointer.GetPointer(); - } - else if (transform == TransformParameters::SCALELOGARITHMICTRANSFORM) - { - typename itk::ScaleLogarithmicTransform::Pointer transformPointer = - itk::ScaleLogarithmicTransform::New(); - transformPointer->SetIdentity(); - return transformPointer.GetPointer(); - } - else if (transform == TransformParameters::AFFINETRANSFORM) - { - typename itk::AffineTransform::Pointer transformPointer = - itk::AffineTransform::New(); - transformPointer->SetIdentity(); - if (m_TransformParameters->GetTransformInitializerOn()) - { - typedef typename itk::AffineTransform AffineTransformType; - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(m_FixedImage); - transformInitializer->SetMovingImage(m_MovingImage); - transformInitializer->SetTransform(transformPointer); - if (m_TransformParameters->GetMomentsOn()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return transformPointer.GetPointer(); - } - else if (transform == TransformParameters::FIXEDCENTEROFROTATIONAFFINETRANSFORM) - { - typedef typename itk::FixedCenterOfRotationAffineTransform CenteredAffineTransformType; - typename itk::FixedCenterOfRotationAffineTransform::Pointer transformPointer = - itk::FixedCenterOfRotationAffineTransform::New(); - transformPointer->SetIdentity(); - if (m_TransformParameters->GetTransformInitializerOn()) - { - typedef typename itk::FixedCenterOfRotationAffineTransform - FixedCenterOfRotationAffineTransformType; - typedef typename itk:: - CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(m_FixedImage); - transformInitializer->SetMovingImage(m_MovingImage); - transformInitializer->SetTransform(transformPointer); - if (m_TransformParameters->GetMomentsOn()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - transformInitializer->InitializeTransform(); - } - return transformPointer.GetPointer(); - } - // TODO remove rigid3dTransform - // else if (transform == TransformParameters::RIGID3DTRANSFORM) - // { - // //return MakeRigidTransform(); - // if (VImageDimension == 3) - // { - // typename itk::Rigid3DTransform< double >::Pointer transformPointer = itk::Rigid3DTransform< double - // >::New(); - // transformPointer->SetIdentity(); - // m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - // m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - // m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - // return reinterpret_cast(transformPointer.GetPointer()); - // } - // } - else if (transform == TransformParameters::EULER3DTRANSFORM) - { - if (VImageDimension == 3) - { - typename itk::Euler3DTransform::Pointer transformPointer = itk::Euler3DTransform::New(); - transformPointer->SetIdentity(); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::CENTEREDEULER3DTRANSFORM) - { - if (VImageDimension == 3) - { - typename itk::CenteredEuler3DTransform::Pointer transformPointer = - itk::CenteredEuler3DTransform::New(); - transformPointer->SetIdentity(); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::QUATERNIONRIGIDTRANSFORM) - { - if (VImageDimension == 3) - { - typename itk::QuaternionRigidTransform::Pointer transformPointer = - itk::QuaternionRigidTransform::New(); - transformPointer->SetIdentity(); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::VERSORTRANSFORM) - { - if (VImageDimension == 3) - { - typename itk::VersorTransform::Pointer transformPointer = itk::VersorTransform::New(); - transformPointer->SetIdentity(); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::VERSORRIGID3DTRANSFORM) - { - if (VImageDimension == 3) - { - typename itk::VersorRigid3DTransform::Pointer transformPointer = - itk::VersorRigid3DTransform::New(); - transformPointer->SetIdentity(); - typedef typename itk::VersorRigid3DTransform VersorRigid3DTransformType; - if (m_TransformParameters->GetTransformInitializerOn()) - { - typedef - typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(m_FixedImage3D); - transformInitializer->SetMovingImage(m_MovingImage3D); - transformInitializer->SetTransform(transformPointer); - if (m_TransformParameters->GetMomentsOn()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - typedef VersorRigid3DTransformType::VersorType VersorType; - typedef VersorType::VectorType VectorType; - - VersorType rotation; - VectorType axis; - - axis[0] = 0.0; - axis[1] = 0.0; - axis[2] = 1.0; - - const double angle = 0; - - rotation.Set(axis, angle); - - transformPointer->SetRotation(rotation); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::SCALESKEWVERSOR3DTRANSFORM) - { - if (VImageDimension == 3) - { - typename itk::ScaleSkewVersor3DTransform::Pointer transformPointer = - itk::ScaleSkewVersor3DTransform::New(); - transformPointer->SetIdentity(); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::SIMILARITY3DTRANSFORM) - { - if (VImageDimension == 3) - { - typename itk::Similarity3DTransform::Pointer transformPointer = - itk::Similarity3DTransform::New(); - transformPointer->SetIdentity(); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - m_TransformParameters->SetTransformCenterZ(transformPointer->GetCenter()[2]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::RIGID2DTRANSFORM) - { - if (VImageDimension == 2) - { - typename itk::Rigid2DTransform::Pointer transformPointer = itk::Rigid2DTransform::New(); - transformPointer->SetIdentity(); - transformPointer->SetAngle(m_TransformParameters->GetAngle()); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::CENTEREDRIGID2DTRANSFORM) - { - if (VImageDimension == 2) - { - typename itk::CenteredRigid2DTransform::Pointer transformPointer = - itk::CenteredRigid2DTransform::New(); - transformPointer->SetIdentity(); - if (m_TransformParameters->GetTransformInitializerOn()) - { - typedef typename itk::CenteredRigid2DTransform CenteredRigid2DTransformType; - typedef typename itk:: - CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(m_FixedImage2D); - transformInitializer->SetMovingImage(m_MovingImage2D); - transformInitializer->SetTransform(transformPointer); - if (m_TransformParameters->GetMomentsOn()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - transformPointer->SetAngle(m_TransformParameters->GetAngle()); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::EULER2DTRANSFORM) - { - if (VImageDimension == 2) - { - typename itk::Euler2DTransform::Pointer transformPointer = itk::Euler2DTransform::New(); - transformPointer->SetIdentity(); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::SIMILARITY2DTRANSFORM) - { - if (VImageDimension == 2) - { - typename itk::Similarity2DTransform::Pointer transformPointer = - itk::Similarity2DTransform::New(); - transformPointer->SetIdentity(); - transformPointer->SetScale(m_TransformParameters->GetScale()); - transformPointer->SetAngle(m_TransformParameters->GetAngle()); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - else if (transform == TransformParameters::CENTEREDSIMILARITY2DTRANSFORM) - { - if (VImageDimension == 2) - { - typename itk::CenteredSimilarity2DTransform::Pointer transformPointer = - itk::CenteredSimilarity2DTransform::New(); - transformPointer->SetIdentity(); - if (m_TransformParameters->GetTransformInitializerOn()) - { - typedef typename itk::CenteredSimilarity2DTransform CenteredSimilarity2DTransformType; - typedef typename itk:: - CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(m_FixedImage2D); - transformInitializer->SetMovingImage(m_MovingImage2D); - transformInitializer->SetTransform(transformPointer); - if (m_TransformParameters->GetMomentsOn()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - transformPointer->SetScale(m_TransformParameters->GetScale()); - transformPointer->SetAngle(m_TransformParameters->GetAngle()); - m_TransformParameters->SetTransformCenterX(transformPointer->GetCenter()[0]); - m_TransformParameters->SetTransformCenterY(transformPointer->GetCenter()[1]); - return reinterpret_cast(transformPointer.GetPointer()); - } - } - return NULL; - } -} // end namespace diff --git a/Modules/RigidRegistration/mitkTransformParameters.cpp b/Modules/RigidRegistration/mitkTransformParameters.cpp deleted file mode 100644 index ec6920c6c9..0000000000 --- a/Modules/RigidRegistration/mitkTransformParameters.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkTransformParameters.h" - -namespace mitk -{ - TransformParameters::TransformParameters() - : m_Transform(TRANSLATIONTRANSFORM), - m_Angle(0.0), - m_Scale(1.0), - m_TransformInitializerOn(true), - m_MomentsOn(true), - m_UseOptimizerScales(true), - m_TransformCenterX(0.0), - m_TransformCenterY(0.0), - m_TransformCenterZ(0.0) - { - m_InitialParameters.set_size(0); - m_Scales.SetSize(16); - m_Scales.Fill(1.0); - } - - void TransformParameters::SetScales(itk::Array scales) { m_Scales = scales; } - itk::Array TransformParameters::GetScales() { return m_Scales; } - void TransformParameters::SetInitialParameters(itk::Array initialParameters) - { - m_InitialParameters = initialParameters; - } - - itk::Array TransformParameters::GetInitialParameters() { return m_InitialParameters; } -} // namespace mitk diff --git a/Modules/RigidRegistration/mitkTransformParameters.h b/Modules/RigidRegistration/mitkTransformParameters.h deleted file mode 100644 index a1726a7157..0000000000 --- a/Modules/RigidRegistration/mitkTransformParameters.h +++ /dev/null @@ -1,209 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKTRANSFORMPARAMETERS_H -#define MITKTRANSFORMPARAMETERS_H - -#include "MitkRigidRegistrationExports.h" -#include "mitkCommon.h" -#include -#include - -namespace mitk -{ - /*! - \brief This class is used to hold all transform parameters needed for a rigid registration process. - - To use the rigid registration framework you have to create an instance of this class and fill it with the parameters - belonging to the selected transformation. To let the rigid registration work properly, this instance has to be given - to mitkImageRegistrationMethod before calling the update() method in mitkImageRegistrationMethod. - - Also instances of the classes mitkMetricParameters and mitkOptimizerParameters have to be set in - mitkImageRegistrationMethod - before calling the update() method. - - - \ingroup RigidRegistration - - \author Daniel Stein - */ - - class MITKRIGIDREGISTRATION_EXPORT TransformParameters : public itk::Object - { - public: - mitkClassMacroItkParent(TransformParameters, ::itk::Object); - itkFactorylessNewMacro(Self) itkCloneMacro(Self) - - /** - \brief Unique integer value for every transform. - */ - enum TransformType { - TRANSLATIONTRANSFORM = 0, - SCALETRANSFORM, - SCALELOGARITHMICTRANSFORM, - AFFINETRANSFORM, - FIXEDCENTEROFROTATIONAFFINETRANSFORM, - EULER3DTRANSFORM, - CENTEREDEULER3DTRANSFORM, - QUATERNIONRIGIDTRANSFORM, - VERSORTRANSFORM, - VERSORRIGID3DTRANSFORM, - SCALESKEWVERSOR3DTRANSFORM, - SIMILARITY3DTRANSFORM, - RIGID2DTRANSFORM, - CENTEREDRIGID2DTRANSFORM, - EULER2DTRANSFORM, - SIMILARITY2DTRANSFORM, - CENTEREDSIMILARITY2DTRANSFORM - }; - - /** - \brief Sets the transform used for registration by its unique integer value. - */ - itkSetMacro(Transform, int); - /** - \brief Returns the transform used for registration by its unique integer value. - */ - itkGetMacro(Transform, int); - - /** - \brief Sets an array that holds the magnitudes of changes for the transforms degrees of freedom. - - The optimizer changes the transforms values corresponding to this array values. - */ - void SetScales(itk::Array scales); - /** - \brief Returns an array that holds the magnitudes of changes for the transforms degrees of freedom. - - The optimizer changes the transforms values corresponding to this array values. - */ - itk::Array GetScales(); - - /** - \brief Sets an array that holds the initial transform parameters. - */ - void SetInitialParameters(itk::Array initialParameters); - /** - \brief Returns an array that holds the initial transform parameters. - */ - itk::Array GetInitialParameters(); - - /** - \brief Sets whether a transform initializer will be used. - - True = initializer is used, initializer is not used. - */ - itkSetMacro(TransformInitializerOn, bool); - /** - \brief Returns whether a transform initializer will be used. - - True = initializer is used, false = initializer is not used. - */ - itkGetMacro(TransformInitializerOn, bool); - - /** - \brief Sets whether the transform initializer will be used to align the images moments or their centers. - - True = image moments will be aligned, false = image centers will be aligned. - */ - itkSetMacro(MomentsOn, bool); - /** - \brief Returns whether the transform initializer will be used to align the images moments or their centers. - - True = image moments will be aligned, false = image centers will be aligned. - */ - itkGetMacro(MomentsOn, bool); - - /** - \brief Sets whether the optimizer scales will be used to let the optimizer know about different magnitudes for - the transforms degrees of freedom. - - True = optimizer scales will be used, false = optimizer scales will not be used. - */ - itkSetMacro(UseOptimizerScales, bool); - /** - \brief Returns whether the optimizer scales will be used to let the optimizer know about different magnitudes for - the transforms degrees of freedom. - - True = optimizer scales will be used, false = optimizer scales will not be used. - */ - itkGetMacro(UseOptimizerScales, bool); - - /** - \brief Sets the initial angle for transforms. - */ - itkSetMacro(Angle, float); - /** - \brief Returns the initial angle for transforms. - */ - itkGetMacro(Angle, float); - - /** - \brief Sets the transforms initial scale. - */ - itkSetMacro(Scale, float); - /** - \brief Returns the transforms initial scale. - */ - itkGetMacro(Scale, float); - - /** - \brief This setter is used by the mitkTransformFactory to set the transforms initial center in X direction. - */ - itkSetMacro(TransformCenterX, double); - /** - \brief Returns the transforms initial center in X direction. - */ - itkGetMacro(TransformCenterX, double); - - /** - \brief This setter is used by the mitkTransformFactory to set the transforms initial center in Y direction. - */ - itkSetMacro(TransformCenterY, double); - /** - \brief Returns the transforms initial center in Y direction. - */ - itkGetMacro(TransformCenterY, double); - - /** - \brief This setter is used by the mitkTransformFactory to set the transforms initial center in Z direction. - */ - itkSetMacro(TransformCenterZ, double); - /** - \brief Returns the transforms initial center in Z direction. - */ - itkGetMacro(TransformCenterZ, double); - - protected: - TransformParameters(); - ~TransformParameters(){}; - - int m_Transform; - float m_Angle; - float m_Scale; - bool m_TransformInitializerOn; - bool m_MomentsOn; - bool m_UseOptimizerScales; - double m_TransformCenterX; - double m_TransformCenterY; - double m_TransformCenterZ; - itk::Array m_Scales; - itk::Array m_InitialParameters; - }; - -} // namespace mitk - -#endif // MITKTRANSFORMPARAMETERS_H diff --git a/Modules/RigidRegistrationUI/CMakeLists.txt b/Modules/RigidRegistrationUI/CMakeLists.txt deleted file mode 100644 index ba997f332e..0000000000 --- a/Modules/RigidRegistrationUI/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -MITK_CREATE_MODULE( - SUBPROJECTS MITK-Registration - INCLUDE_DIRS RigidRegistrationMetrics RigidRegistrationOptimizer RigidRegistrationTransforms - DEPENDS MitkQtWidgets MitkRigidRegistration -) diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricControls.ui deleted file mode 100644 index 219f93a38a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricControls.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - QmitkCorrelationCoefficientHistogramMetricControls - - - - 0 - 0 - 201 - 66 - - - - Form - - - - - - - - - 50 - false - - - - Number of Histogram Bins: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 256 - - - Qt::AlignRight - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricView.cpp deleted file mode 100644 index d6b09a3610..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricView.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkCorrelationCoefficientHistogramMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkCorrelationCoefficientHistogramMetricView::QmitkCorrelationCoefficientHistogramMetricView(QWidget *parent, - Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkCorrelationCoefficientHistogramMetricView::~QmitkCorrelationCoefficientHistogramMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkCorrelationCoefficientHistogramMetricView::GetMetricType() -{ - return mitk::MetricParameters::CORRELATIONCOEFFICIENTHISTOGRAMIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkCorrelationCoefficientHistogramMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkCorrelationCoefficientHistogramMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::CorrelationCoefficientHistogramImageToImageMetric::Pointer - MetricPointer = itk::CorrelationCoefficientHistogramImageToImageMetric::New(); - unsigned int nBins = m_Controls.m_NumberOfHistogramBinsCorrelationCoefficientHistogram->text().toInt(); - typename itk::CorrelationCoefficientHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkCorrelationCoefficientHistogramMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(2); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_NumberOfHistogramBinsCorrelationCoefficientHistogram->text().toInt(); - return metricValues; -} - -void QmitkCorrelationCoefficientHistogramMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_NumberOfHistogramBinsCorrelationCoefficientHistogram->setText(QString::number(metricValues[1])); -} - -QString QmitkCorrelationCoefficientHistogramMetricView::GetName() -{ - return "CorrelationCoefficientHistogram"; -} - -void QmitkCorrelationCoefficientHistogramMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfHistogramBinsCorrelationCoefficientHistogram->setValidator(validatorLineEditInput); -} - -bool QmitkCorrelationCoefficientHistogramMetricView::Maximize() -{ - return true; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricView.h deleted file mode 100644 index 2f10d9ff09..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricView.h +++ /dev/null @@ -1,63 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkCorrelationCoefficientHistogramMetricViewWidgetHIncluded -#define QmitkCorrelationCoefficientHistogramMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkCorrelationCoefficientHistogramMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkCorrelationCoefficientHistogramMetricView - : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkCorrelationCoefficientHistogramMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkCorrelationCoefficientHistogramMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkCorrelationCoefficientHistogramMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricControls.ui deleted file mode 100644 index cf589914c0..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricControls.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - QmitkGradientDifferenceMetricControls - - - - 0 - 0 - 130 - 38 - - - - Form - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricView.cpp deleted file mode 100644 index 3b6705dd3c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricView.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkGradientDifferenceMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkGradientDifferenceMetricView::QmitkGradientDifferenceMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkGradientDifferenceMetricView::~QmitkGradientDifferenceMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkGradientDifferenceMetricView::GetMetricType() -{ - return mitk::MetricParameters::GRADIENTDIFFERENCEIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkGradientDifferenceMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkGradientDifferenceMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::GradientDifferenceImageToImageMetric::Pointer MetricPointer = - itk::GradientDifferenceImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkGradientDifferenceMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(1); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - return metricValues; -} - -void QmitkGradientDifferenceMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); -} - -QString QmitkGradientDifferenceMetricView::GetName() -{ - return "GradientDifference"; -} - -void QmitkGradientDifferenceMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); -} - -bool QmitkGradientDifferenceMetricView::Maximize() -{ - return false; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricView.h deleted file mode 100644 index b93b5ad9b5..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkGradientDifferenceMetricView.h +++ /dev/null @@ -1,62 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkGradientDifferenceMetricViewWidgetHIncluded -#define QmitkGradientDifferenceMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkGradientDifferenceMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkGradientDifferenceMetricView : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkGradientDifferenceMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkGradientDifferenceMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkGradientDifferenceMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricControls.ui deleted file mode 100644 index 7a31243686..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricControls.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - QmitkKappaStatisticMetricControls - - - - 0 - 0 - 130 - 38 - - - - Form - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricView.cpp deleted file mode 100644 index 40438be22f..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricView.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkKappaStatisticMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkKappaStatisticMetricView::QmitkKappaStatisticMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkKappaStatisticMetricView::~QmitkKappaStatisticMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkKappaStatisticMetricView::GetMetricType() -{ - return mitk::MetricParameters::KAPPASTATISTICIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkKappaStatisticMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkKappaStatisticMetricView::GetMetric2(itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::KappaStatisticImageToImageMetric::Pointer MetricPointer = - itk::KappaStatisticImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkKappaStatisticMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(1); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - return metricValues; -} - -void QmitkKappaStatisticMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); -} - -QString QmitkKappaStatisticMetricView::GetName() -{ - return "KappaStatistic"; -} - -void QmitkKappaStatisticMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); -} - -bool QmitkKappaStatisticMetricView::Maximize() -{ - return true; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricView.h deleted file mode 100644 index 308d92ebf9..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKappaStatisticMetricView.h +++ /dev/null @@ -1,62 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkKappaStatisticMetricViewWidgetHIncluded -#define QmitkKappaStatisticMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkKappaStatisticMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkKappaStatisticMetricView : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkKappaStatisticMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkKappaStatisticMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkKappaStatisticMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricControls.ui deleted file mode 100644 index 28c476d8ec..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricControls.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - QmitkKullbackLeiblerCompareHistogramMetricControls - - - - 0 - 0 - 201 - 66 - - - - Form - - - - - - - - - 50 - false - - - - Number of Histogram Bins: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 256 - - - Qt::AlignRight - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricView.cpp deleted file mode 100644 index 2ede24d149..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricView.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkKullbackLeiblerCompareHistogramMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkKullbackLeiblerCompareHistogramMetricView::QmitkKullbackLeiblerCompareHistogramMetricView(QWidget *parent, - Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkKullbackLeiblerCompareHistogramMetricView::~QmitkKullbackLeiblerCompareHistogramMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkKullbackLeiblerCompareHistogramMetricView::GetMetricType() -{ - return mitk::MetricParameters::KULLBACKLEIBLERCOMPAREHISTOGRAMIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkKullbackLeiblerCompareHistogramMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkKullbackLeiblerCompareHistogramMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::KullbackLeiblerCompareHistogramImageToImageMetric::Pointer - MetricPointer = itk::KullbackLeiblerCompareHistogramImageToImageMetric::New(); - unsigned int nBins = m_Controls.m_NumberOfHistogramBinsKullbackLeiblerCompareHistogram->text().toInt(); - typename itk::KullbackLeiblerCompareHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkKullbackLeiblerCompareHistogramMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(2); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_NumberOfHistogramBinsKullbackLeiblerCompareHistogram->text().toInt(); - return metricValues; -} - -void QmitkKullbackLeiblerCompareHistogramMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_NumberOfHistogramBinsKullbackLeiblerCompareHistogram->setText(QString::number(metricValues[1])); -} - -QString QmitkKullbackLeiblerCompareHistogramMetricView::GetName() -{ - return "KullbackLeiblerCompareHistogram"; -} - -void QmitkKullbackLeiblerCompareHistogramMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfHistogramBinsKullbackLeiblerCompareHistogram->setValidator(validatorLineEditInput); -} - -bool QmitkKullbackLeiblerCompareHistogramMetricView::Maximize() -{ - return false; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricView.h deleted file mode 100644 index 2c59b3a663..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricView.h +++ /dev/null @@ -1,63 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkKullbackLeiblerCompareHistogramMetricViewWidgetHIncluded -#define QmitkKullbackLeiblerCompareHistogramMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkKullbackLeiblerCompareHistogramMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkKullbackLeiblerCompareHistogramMetricView - : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkKullbackLeiblerCompareHistogramMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkKullbackLeiblerCompareHistogramMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkKullbackLeiblerCompareHistogramMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricControls.ui deleted file mode 100644 index 23eef5e8a1..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricControls.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - QmitkMatchCardinalityMetricControls - - - - 0 - 0 - 130 - 38 - - - - Form - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricView.cpp deleted file mode 100644 index 375760100d..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricView.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkMatchCardinalityMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkMatchCardinalityMetricView::QmitkMatchCardinalityMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkMatchCardinalityMetricView::~QmitkMatchCardinalityMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkMatchCardinalityMetricView::GetMetricType() -{ - return mitk::MetricParameters::MATCHCARDINALITYIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkMatchCardinalityMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkMatchCardinalityMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::MatchCardinalityImageToImageMetric::Pointer MetricPointer = - itk::MatchCardinalityImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkMatchCardinalityMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(1); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - return metricValues; -} - -void QmitkMatchCardinalityMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); -} - -QString QmitkMatchCardinalityMetricView::GetName() -{ - return "MatchCardinality"; -} - -void QmitkMatchCardinalityMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); -} - -bool QmitkMatchCardinalityMetricView::Maximize() -{ - return false; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricView.h deleted file mode 100644 index 51fccc0a16..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMatchCardinalityMetricView.h +++ /dev/null @@ -1,62 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkMatchCardinalityMetricViewWidgetHIncluded -#define QmitkMatchCardinalityMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkMatchCardinalityMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkMatchCardinalityMetricView : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkMatchCardinalityMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkMatchCardinalityMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkMatchCardinalityMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricControls.ui deleted file mode 100644 index 536649195f..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricControls.ui +++ /dev/null @@ -1,145 +0,0 @@ - - - QmitkMattesMutualInformationMetricControls - - - - 0 - 0 - 205 - 108 - - - - Form - - - - - - Use Spatial Samples - - - true - - - true - - - - 0 - - - - - - - - 50 - false - - - - Number of Spatial Samples: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 10000 - - - Qt::AlignRight - - - - - - - - - - - - - - - 50 - false - - - - Number of Histogram Bins: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 24 - - - Qt::AlignRight - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricView.cpp deleted file mode 100644 index 77624b16a6..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricView.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkMattesMutualInformationMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkMattesMutualInformationMetricView::QmitkMattesMutualInformationMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkMattesMutualInformationMetricView::~QmitkMattesMutualInformationMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkMattesMutualInformationMetricView::GetMetricType() -{ - return mitk::MetricParameters::MATTESMUTUALINFORMATIONIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkMattesMutualInformationMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkMattesMutualInformationMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::MattesMutualInformationImageToImageMetric::Pointer MetricPointer = - itk::MattesMutualInformationImageToImageMetric::New(); - bool useSampling = m_Controls.m_UseSamplingMattesMutualInformation->isChecked(); - if (useSampling) - { - // set the number of samples to use - MetricPointer->SetNumberOfSpatialSamples( - m_Controls.m_NumberOfSpatialSamplesMattesMutualInformation->text().toInt()); - } - else - { - MetricPointer->UseAllPixelsOn(); - } - MetricPointer->SetNumberOfHistogramBins(m_Controls.m_NumberOfHistogramBinsMattesMutualInformation->text().toInt()); - MetricPointer->ReinitializeSeed(76926294); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkMattesMutualInformationMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(4); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_UseSamplingMattesMutualInformation->isChecked(); - metricValues[2] = m_Controls.m_NumberOfSpatialSamplesMattesMutualInformation->text().toInt(); - metricValues[3] = m_Controls.m_NumberOfHistogramBinsMattesMutualInformation->text().toInt(); - return metricValues; -} - -void QmitkMattesMutualInformationMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_UseSamplingMattesMutualInformation->setChecked(metricValues[1]); - m_Controls.m_NumberOfSpatialSamplesMattesMutualInformation->setText(QString::number(metricValues[2])); - m_Controls.m_NumberOfHistogramBinsMattesMutualInformation->setText(QString::number(metricValues[3])); -} - -QString QmitkMattesMutualInformationMetricView::GetName() -{ - return "MattesMutualInformation"; -} - -void QmitkMattesMutualInformationMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfSpatialSamplesMattesMutualInformation->setValidator(validatorLineEditInput); - m_Controls.m_NumberOfHistogramBinsMattesMutualInformation->setValidator(validatorLineEditInput); -} - -bool QmitkMattesMutualInformationMetricView::Maximize() -{ - return true; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricView.h deleted file mode 100644 index 001e513e65..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMattesMutualInformationMetricView.h +++ /dev/null @@ -1,63 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkMattesMutualInformationMetricViewWidgetHIncluded -#define QmitkMattesMutualInformationMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkMattesMutualInformationMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkMattesMutualInformationMetricView - : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkMattesMutualInformationMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkMattesMutualInformationMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkMattesMutualInformationMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricControls.ui deleted file mode 100644 index a8a95b544f..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricControls.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - QmitkMeanReciprocalSquareDifferenceMetricControls - - - - 0 - 0 - 130 - 66 - - - - Form - - - - - - - - - 50 - false - - - - Lambda: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 10 - - - Qt::AlignRight - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricView.cpp deleted file mode 100644 index 2adab4fce7..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricView.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkMeanReciprocalSquareDifferenceMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkMeanReciprocalSquareDifferenceMetricView::QmitkMeanReciprocalSquareDifferenceMetricView(QWidget *parent, - Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkMeanReciprocalSquareDifferenceMetricView::~QmitkMeanReciprocalSquareDifferenceMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkMeanReciprocalSquareDifferenceMetricView::GetMetricType() -{ - return mitk::MetricParameters::MEANRECIPROCALSQUAREDIFFERENCEIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkMeanReciprocalSquareDifferenceMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkMeanReciprocalSquareDifferenceMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::MeanReciprocalSquareDifferenceImageToImageMetric::Pointer - MetricPointer = itk::MeanReciprocalSquareDifferenceImageToImageMetric::New(); - //------------------------------------------------------------ - // The lambda value is the intensity difference that should - // make the metric drop by 50% - //------------------------------------------------------------ - MetricPointer->SetLambda(m_Controls.m_LambdaMeanReciprocalSquareDifference->text().toInt()); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkMeanReciprocalSquareDifferenceMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(2); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_LambdaMeanReciprocalSquareDifference->text().toInt(); - return metricValues; -} - -void QmitkMeanReciprocalSquareDifferenceMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_LambdaMeanReciprocalSquareDifference->setText(QString::number(metricValues[1])); -} - -QString QmitkMeanReciprocalSquareDifferenceMetricView::GetName() -{ - return "MeanReciprocalSquareDifference"; -} - -void QmitkMeanReciprocalSquareDifferenceMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_LambdaMeanReciprocalSquareDifference->setValidator(validatorLineEditInput); -} - -bool QmitkMeanReciprocalSquareDifferenceMetricView::Maximize() -{ - return false; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricView.h deleted file mode 100644 index ac4229eff3..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricView.h +++ /dev/null @@ -1,63 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkMeanReciprocalSquareDifferenceMetricViewWidgetHIncluded -#define QmitkMeanReciprocalSquareDifferenceMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkMeanReciprocalSquareDifferenceMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkMeanReciprocalSquareDifferenceMetricView - : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkMeanReciprocalSquareDifferenceMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkMeanReciprocalSquareDifferenceMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkMeanReciprocalSquareDifferenceMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricControls.ui deleted file mode 100644 index b475312806..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricControls.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - QmitkMeanSquaresHistogramMetricControls - - - - 0 - 0 - 201 - 66 - - - - QmitkMeanSquaresHistogramMetricControls - - - - - - - - - 50 - false - - - - Number of Histogram Bins: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 256 - - - Qt::AlignRight - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricView.cpp deleted file mode 100644 index 089a903237..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricView.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkMeanSquaresHistogramMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkMeanSquaresHistogramMetricView::QmitkMeanSquaresHistogramMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkMeanSquaresHistogramMetricView::~QmitkMeanSquaresHistogramMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkMeanSquaresHistogramMetricView::GetMetricType() -{ - return mitk::MetricParameters::MEANSQUARESHISTOGRAMIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkMeanSquaresHistogramMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkMeanSquaresHistogramMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::MeanSquaresHistogramImageToImageMetric::Pointer MetricPointer = - itk::MeanSquaresHistogramImageToImageMetric::New(); - unsigned int nBins = m_Controls.m_NumberOfHistogramBinsMeanSquaresHistogram->text().toInt(); - typename itk::MeanSquaresHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkMeanSquaresHistogramMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(2); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_NumberOfHistogramBinsMeanSquaresHistogram->text().toInt(); - return metricValues; -} - -void QmitkMeanSquaresHistogramMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_NumberOfHistogramBinsMeanSquaresHistogram->setText(QString::number(metricValues[1])); -} - -QString QmitkMeanSquaresHistogramMetricView::GetName() -{ - return "MeanSquaresHistogram"; -} - -void QmitkMeanSquaresHistogramMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfHistogramBinsMeanSquaresHistogram->setValidator(validatorLineEditInput); -} - -bool QmitkMeanSquaresHistogramMetricView::Maximize() -{ - return false; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricView.h deleted file mode 100644 index 7d63d6236d..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricView.h +++ /dev/null @@ -1,62 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkMeanSquaresHistogramMetricViewWidgetHIncluded -#define QmitkMeanSquaresHistogramMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkMeanSquaresHistogramMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkMeanSquaresHistogramMetricView : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkMeanSquaresHistogramMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkMeanSquaresHistogramMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkMeanSquaresHistogramMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricControls.ui deleted file mode 100644 index 413372fe6c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricControls.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - QmitkMeanSquaresMetricControls - - - - 0 - 0 - 130 - 38 - - - - QmitkMeanSquaresMetricControls - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricView.cpp deleted file mode 100644 index 8a8817aa04..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricView.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkMeanSquaresMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkMeanSquaresMetricView::QmitkMeanSquaresMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkMeanSquaresMetricView::~QmitkMeanSquaresMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkMeanSquaresMetricView::GetMetricType() -{ - return mitk::MetricParameters::MEANSQUARESIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkMeanSquaresMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkMeanSquaresMetricView::GetMetric2(itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::MeanSquaresImageToImageMetric::Pointer MetricPointer = - itk::MeanSquaresImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkMeanSquaresMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(1); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - return metricValues; -} - -void QmitkMeanSquaresMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); -} - -QString QmitkMeanSquaresMetricView::GetName() -{ - return "MeanSquares"; -} - -void QmitkMeanSquaresMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); -} - -bool QmitkMeanSquaresMetricView::Maximize() -{ - return false; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricView.h deleted file mode 100644 index abc6ad4e6b..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMeanSquaresMetricView.h +++ /dev/null @@ -1,62 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkMeanSquaresMetricViewWidgetHIncluded -#define QmitkMeanSquaresMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkMeanSquaresMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkMeanSquaresMetricView : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkMeanSquaresMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkMeanSquaresMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkMeanSquaresMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricControls.ui deleted file mode 100644 index 3c6559abf0..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricControls.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - QmitkMutualInformationHistogramMetricControls - - - - 0 - 0 - 201 - 66 - - - - Form - - - - - - - - - 50 - false - - - - Number of Histogram Bins: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 256 - - - Qt::AlignRight - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricView.cpp deleted file mode 100644 index e3cc0e2767..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricView.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkMutualInformationHistogramMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkMutualInformationHistogramMetricView::QmitkMutualInformationHistogramMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkMutualInformationHistogramMetricView::~QmitkMutualInformationHistogramMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkMutualInformationHistogramMetricView::GetMetricType() -{ - return mitk::MetricParameters::MUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkMutualInformationHistogramMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkMutualInformationHistogramMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::MutualInformationHistogramImageToImageMetric::Pointer MetricPointer = - itk::MutualInformationHistogramImageToImageMetric::New(); - unsigned int nBins = m_Controls.m_NumberOfHistogramBinsMutualInformationHistogram->text().toInt(); - typename itk::MutualInformationHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkMutualInformationHistogramMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(2); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_NumberOfHistogramBinsMutualInformationHistogram->text().toInt(); - return metricValues; -} - -void QmitkMutualInformationHistogramMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_NumberOfHistogramBinsMutualInformationHistogram->setText(QString::number(metricValues[1])); -} - -QString QmitkMutualInformationHistogramMetricView::GetName() -{ - return "MutualInformationHistogram"; -} - -void QmitkMutualInformationHistogramMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfHistogramBinsMutualInformationHistogram->setValidator(validatorLineEditInput); -} - -bool QmitkMutualInformationHistogramMetricView::Maximize() -{ - return false; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricView.h deleted file mode 100644 index 322f7852dd..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricView.h +++ /dev/null @@ -1,63 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkMutualInformationHistogramMetricViewWidgetHIncluded -#define QmitkMutualInformationHistogramMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkMutualInformationHistogramMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkMutualInformationHistogramMetricView - : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkMutualInformationHistogramMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkMutualInformationHistogramMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkMutualInformationHistogramMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricControls.ui deleted file mode 100644 index a1fe2701f8..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricControls.ui +++ /dev/null @@ -1,169 +0,0 @@ - - - QmitkMutualInformationMetricControls - - - - 0 - 0 - 244 - 120 - - - - Form - - - - - - - - - - - 50 - false - - - - Number of Spatial Samples in %: - - - false - - - - - - - - 50 - false - - - - Moving Image Standard Deviation: - - - false - - - - - - - - 50 - false - - - - Fixed Image Standard Deviation: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.4 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.4 - - - Qt::AlignRight - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricView.cpp deleted file mode 100644 index dd2e43f637..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricView.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkMutualInformationMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkMutualInformationMetricView::QmitkMutualInformationMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkMutualInformationMetricView::~QmitkMutualInformationMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkMutualInformationMetricView::GetMetricType() -{ - return mitk::MetricParameters::MUTUALINFORMATIONIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkMutualInformationMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkMutualInformationMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::MutualInformationImageToImageMetric::Pointer MetricPointer = - itk::MutualInformationImageToImageMetric::New(); - MetricPointer->SetNumberOfSpatialSamples(m_Controls.m_NumberOfSpatialSamplesMutualInformation->text().toInt()); - MetricPointer->SetFixedImageStandardDeviation( - m_Controls.m_FixedImageStandardDeviationMutualInformation->text().toFloat()); - MetricPointer->SetMovingImageStandardDeviation( - m_Controls.m_MovingImageStandardDeviationMutualInformation->text().toFloat()); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkMutualInformationMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(4); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_NumberOfSpatialSamplesMutualInformation->text().toInt(); - metricValues[2] = m_Controls.m_FixedImageStandardDeviationMutualInformation->text().toFloat(); - metricValues[3] = m_Controls.m_MovingImageStandardDeviationMutualInformation->text().toFloat(); - return metricValues; -} - -void QmitkMutualInformationMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_NumberOfSpatialSamplesMutualInformation->setText(QString::number(metricValues[1])); - m_Controls.m_FixedImageStandardDeviationMutualInformation->setText(QString::number(metricValues[2])); - m_Controls.m_MovingImageStandardDeviationMutualInformation->setText(QString::number(metricValues[3])); -} - -QString QmitkMutualInformationMetricView::GetName() -{ - return "MutualInformation"; -} - -void QmitkMutualInformationMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfSpatialSamplesMutualInformation->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_FixedImageStandardDeviationMutualInformation->setValidator(validatorLineEditInputFloat); - m_Controls.m_MovingImageStandardDeviationMutualInformation->setValidator(validatorLineEditInputFloat); -} - -bool QmitkMutualInformationMetricView::Maximize() -{ - return true; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricView.h deleted file mode 100644 index 62cd3bb9e9..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkMutualInformationMetricView.h +++ /dev/null @@ -1,62 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkMutualInformationMetricViewWidgetHIncluded -#define QmitkMutualInformationMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkMutualInformationMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkMutualInformationMetricView : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkMutualInformationMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkMutualInformationMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkMutualInformationMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricControls.ui deleted file mode 100644 index 563968fbaf..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricControls.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - QmitkNormalizedCorrelationMetricControls - - - - 0 - 0 - 130 - 38 - - - - Form - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricView.cpp deleted file mode 100644 index 5d9109276e..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricView.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkNormalizedCorrelationMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkNormalizedCorrelationMetricView::QmitkNormalizedCorrelationMetricView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkNormalizedCorrelationMetricView::~QmitkNormalizedCorrelationMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkNormalizedCorrelationMetricView::GetMetricType() -{ - return mitk::MetricParameters::NORMALIZEDCORRELATIONIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkNormalizedCorrelationMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkNormalizedCorrelationMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::NormalizedCorrelationImageToImageMetric::Pointer MetricPointer = - itk::NormalizedCorrelationImageToImageMetric::New(); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkNormalizedCorrelationMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(1); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - return metricValues; -} - -void QmitkNormalizedCorrelationMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); -} - -QString QmitkNormalizedCorrelationMetricView::GetName() -{ - return "NormalizedCorrelation"; -} - -void QmitkNormalizedCorrelationMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); -} - -bool QmitkNormalizedCorrelationMetricView::Maximize() -{ - return true; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricView.h deleted file mode 100644 index 5ac9a3f32c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricView.h +++ /dev/null @@ -1,62 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkNormalizedCorrelationMetricViewWidgetHIncluded -#define QmitkNormalizedCorrelationMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkNormalizedCorrelationMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkNormalizedCorrelationMetricView : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkNormalizedCorrelationMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkNormalizedCorrelationMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkNormalizedCorrelationMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricControls.ui deleted file mode 100644 index b3865f8f88..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricControls.ui +++ /dev/null @@ -1,85 +0,0 @@ - - - QmitkNormalizedMutualInformationHistogramMetricControls - - - - 0 - 0 - 201 - 66 - - - - Form - - - - - - - - - 50 - false - - - - Number of Histogram Bins: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 256 - - - Qt::AlignRight - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - Compute Gradient - - - true - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricView.cpp deleted file mode 100644 index 2afbc57dcf..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricView.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkNormalizedMutualInformationHistogramMetricView.h" -#include "mitkImageAccessByItk.h" -#include - -#include "QValidator" - -QmitkNormalizedMutualInformationHistogramMetricView::QmitkNormalizedMutualInformationHistogramMetricView( - QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationMetricsGUIBase(parent, f) -{ -} - -QmitkNormalizedMutualInformationHistogramMetricView::~QmitkNormalizedMutualInformationHistogramMetricView() -{ -} - -mitk::MetricParameters::MetricType QmitkNormalizedMutualInformationHistogramMetricView::GetMetricType() -{ - return mitk::MetricParameters::NORMALIZEDMUTUALINFORMATIONHISTOGRAMIMAGETOIMAGEMETRIC; -} - -itk::Object::Pointer QmitkNormalizedMutualInformationHistogramMetricView::GetMetric() -{ - if (m_MovingImage.IsNotNull()) - { - AccessByItk(m_MovingImage, GetMetric2); - return m_MetricObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkNormalizedMutualInformationHistogramMetricView::GetMetric2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::NormalizedMutualInformationHistogramImageToImageMetric::Pointer - MetricPointer = itk::NormalizedMutualInformationHistogramImageToImageMetric::New(); - unsigned int nBins = m_Controls.m_NumberOfHistogramBinsNormalizedMutualInformationHistogram->text().toInt(); - typename itk::NormalizedMutualInformationHistogramImageToImageMetric::HistogramType::SizeType - histogramSize; - histogramSize[0] = nBins; - histogramSize[1] = nBins; - MetricPointer->SetHistogramSize(histogramSize); - MetricPointer->SetComputeGradient(m_Controls.m_ComputeGradient->isChecked()); - m_MetricObject = MetricPointer.GetPointer(); - return MetricPointer.GetPointer(); -} - -itk::Array QmitkNormalizedMutualInformationHistogramMetricView::GetMetricParameters() -{ - itk::Array metricValues; - metricValues.SetSize(2); - metricValues.fill(0); - metricValues[0] = m_Controls.m_ComputeGradient->isChecked(); - metricValues[1] = m_Controls.m_NumberOfHistogramBinsNormalizedMutualInformationHistogram->text().toInt(); - return metricValues; -} - -void QmitkNormalizedMutualInformationHistogramMetricView::SetMetricParameters(itk::Array metricValues) -{ - m_Controls.m_ComputeGradient->setChecked(metricValues[0]); - m_Controls.m_NumberOfHistogramBinsNormalizedMutualInformationHistogram->setText(QString::number(metricValues[1])); -} - -QString QmitkNormalizedMutualInformationHistogramMetricView::GetName() -{ - return "NormalizedMutualInformationHistogram"; -} - -void QmitkNormalizedMutualInformationHistogramMetricView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfHistogramBinsNormalizedMutualInformationHistogram->setValidator(validatorLineEditInput); -} - -bool QmitkNormalizedMutualInformationHistogramMetricView::Maximize() -{ - return true; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricView.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricView.h deleted file mode 100644 index 47b23e8751..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricView.h +++ /dev/null @@ -1,63 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkNormalizedMutualInformationHistogramMetricViewWidgetHIncluded -#define QmitkNormalizedMutualInformationHistogramMetricViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "ui_QmitkNormalizedMutualInformationHistogramMetricControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkNormalizedMutualInformationHistogramMetricView - : public QmitkRigidRegistrationMetricsGUIBase -{ -public: - QmitkNormalizedMutualInformationHistogramMetricView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkNormalizedMutualInformationHistogramMetricView(); - - virtual mitk::MetricParameters::MetricType GetMetricType() override; - - virtual itk::Object::Pointer GetMetric() override; - - virtual itk::Array GetMetricParameters() override; - - virtual void SetMetricParameters(itk::Array metricValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual bool Maximize() override; - -private: - template - itk::Object::Pointer GetMetric2(itk::Image *itkImage1); - -protected: - Ui::QmitkNormalizedMutualInformationHistogramMetricControls m_Controls; - - itk::Object::Pointer m_MetricObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkRigidRegistrationMetricsGUIBase.cpp b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkRigidRegistrationMetricsGUIBase.cpp deleted file mode 100644 index 477579e71d..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkRigidRegistrationMetricsGUIBase.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkRigidRegistrationMetricsGUIBase.h" - -QmitkRigidRegistrationMetricsGUIBase::QmitkRigidRegistrationMetricsGUIBase(QWidget *parent, Qt::WindowFlags f) - : QWidget(parent, f), m_MovingImage(nullptr) -{ -} - -QmitkRigidRegistrationMetricsGUIBase::~QmitkRigidRegistrationMetricsGUIBase() -{ -} - -void QmitkRigidRegistrationMetricsGUIBase::SetMovingImage(mitk::Image::Pointer movingImage) -{ - m_MovingImage = movingImage; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkRigidRegistrationMetricsGUIBase.h b/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkRigidRegistrationMetricsGUIBase.h deleted file mode 100644 index 7f3bc88905..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationMetrics/QmitkRigidRegistrationMetricsGUIBase.h +++ /dev/null @@ -1,59 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkRigidRegistrationMetricsGUIBaseH -#define QmitkRigidRegistrationMetricsGUIBaseH - -#include "MitkRigidRegistrationUIExports.h" -#include "mitkImage.h" -#include "mitkMetricParameters.h" -#include -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkRigidRegistrationMetricsGUIBase : public QWidget -{ -public: - QmitkRigidRegistrationMetricsGUIBase(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkRigidRegistrationMetricsGUIBase(); - - virtual mitk::MetricParameters::MetricType GetMetricType() = 0; - - virtual itk::Object::Pointer GetMetric() = 0; - - virtual itk::Array GetMetricParameters() = 0; - - virtual void SetMetricParameters(itk::Array metricValues) = 0; - - void SetMovingImage(mitk::Image::Pointer movingImage); - - virtual QString GetName() = 0; - - virtual void SetupUI(QWidget *parent) = 0; - - virtual bool Maximize() = 0; - -protected: - mitk::Image::Pointer m_MovingImage; -}; - -#endif // QmitkRigidRegistrationMetricsGUIBaseH diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerControls.ui deleted file mode 100644 index cf402d4750..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerControls.ui +++ /dev/null @@ -1,745 +0,0 @@ - - - QmitkAmoebaOptimizerControls - - - - 0 - 0 - 253 - 510 - - - - Form - - - - - - - - - - - 50 - false - - - - Simplex Delta 1: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 2: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 3: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 4: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 5: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 6: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 7: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 8: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 9: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 10: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 11: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 12: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 13: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 14: - - - false - - - - - - - - 50 - false - - - - Simplex Delta 15: - - - false - - - - - - - - 50 - false - - - - Parameters Convergence Tolerance: - - - false - - - - - - - - 50 - false - - - - Function Convergence Tolerance: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - 6 - - - QLayout::SetFixedSize - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 5.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.01 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerView.cpp deleted file mode 100644 index 678cb4f017..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerView.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkAmoebaOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkAmoebaOptimizerView::QmitkAmoebaOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(15) -{ -} - -QmitkAmoebaOptimizerView::~QmitkAmoebaOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkAmoebaOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::AMOEBAOPTIMIZER; -} - -itk::Object::Pointer QmitkAmoebaOptimizerView::GetOptimizer() -{ - itk::AmoebaOptimizer::Pointer OptimizerPointer = itk::AmoebaOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetParametersConvergenceTolerance( - m_Controls.m_ParametersConvergenceToleranceAmoeba->text().toFloat()); - OptimizerPointer->SetFunctionConvergenceTolerance(m_Controls.m_FunctionConvergenceToleranceAmoeba->text().toFloat()); - typedef itk::SingleValuedNonLinearOptimizer OptimizerType; - OptimizerType::ParametersType simplexDelta(m_NumberTransformParameters); - itk::Array simplexDeltaAmoeba = this->GetOptimizerParameters(); - for (int i = 0; i < m_NumberTransformParameters; i++) - { - simplexDelta[i] = simplexDeltaAmoeba[i + 1]; - } - OptimizerPointer->AutomaticInitialSimplexOff(); - OptimizerPointer->SetInitialSimplexDelta(simplexDelta); - OptimizerPointer->SetMaximumNumberOfIterations(m_Controls.m_IterationsAmoeba->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkAmoebaOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(19); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_SimplexDeltaAmoeba1->text().toDouble(); - optimizerValues[2] = m_Controls.m_SimplexDeltaAmoeba2->text().toDouble(); - optimizerValues[3] = m_Controls.m_SimplexDeltaAmoeba3->text().toDouble(); - optimizerValues[4] = m_Controls.m_SimplexDeltaAmoeba4->text().toDouble(); - optimizerValues[5] = m_Controls.m_SimplexDeltaAmoeba5->text().toDouble(); - optimizerValues[6] = m_Controls.m_SimplexDeltaAmoeba6->text().toDouble(); - optimizerValues[7] = m_Controls.m_SimplexDeltaAmoeba7->text().toDouble(); - optimizerValues[8] = m_Controls.m_SimplexDeltaAmoeba8->text().toDouble(); - optimizerValues[9] = m_Controls.m_SimplexDeltaAmoeba9->text().toDouble(); - optimizerValues[10] = m_Controls.m_SimplexDeltaAmoeba10->text().toDouble(); - optimizerValues[11] = m_Controls.m_SimplexDeltaAmoeba11->text().toDouble(); - optimizerValues[12] = m_Controls.m_SimplexDeltaAmoeba12->text().toDouble(); - optimizerValues[13] = m_Controls.m_SimplexDeltaAmoeba13->text().toDouble(); - optimizerValues[14] = m_Controls.m_SimplexDeltaAmoeba14->text().toDouble(); - optimizerValues[15] = m_Controls.m_SimplexDeltaAmoeba15->text().toDouble(); - optimizerValues[16] = m_Controls.m_ParametersConvergenceToleranceAmoeba->text().toFloat(); - optimizerValues[17] = m_Controls.m_FunctionConvergenceToleranceAmoeba->text().toFloat(); - optimizerValues[18] = m_Controls.m_IterationsAmoeba->text().toInt(); - return optimizerValues; -} - -void QmitkAmoebaOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_SimplexDeltaAmoeba1->setText(QString::number(optimizerValues[1])); - m_Controls.m_SimplexDeltaAmoeba2->setText(QString::number(optimizerValues[2])); - m_Controls.m_SimplexDeltaAmoeba3->setText(QString::number(optimizerValues[3])); - m_Controls.m_SimplexDeltaAmoeba4->setText(QString::number(optimizerValues[4])); - m_Controls.m_SimplexDeltaAmoeba5->setText(QString::number(optimizerValues[5])); - m_Controls.m_SimplexDeltaAmoeba6->setText(QString::number(optimizerValues[6])); - m_Controls.m_SimplexDeltaAmoeba7->setText(QString::number(optimizerValues[7])); - m_Controls.m_SimplexDeltaAmoeba8->setText(QString::number(optimizerValues[8])); - m_Controls.m_SimplexDeltaAmoeba9->setText(QString::number(optimizerValues[9])); - m_Controls.m_SimplexDeltaAmoeba10->setText(QString::number(optimizerValues[10])); - m_Controls.m_SimplexDeltaAmoeba11->setText(QString::number(optimizerValues[11])); - m_Controls.m_SimplexDeltaAmoeba12->setText(QString::number(optimizerValues[12])); - m_Controls.m_SimplexDeltaAmoeba13->setText(QString::number(optimizerValues[13])); - m_Controls.m_SimplexDeltaAmoeba14->setText(QString::number(optimizerValues[14])); - m_Controls.m_SimplexDeltaAmoeba15->setText(QString::number(optimizerValues[15])); - m_Controls.m_ParametersConvergenceToleranceAmoeba->setText(QString::number(optimizerValues[16])); - m_Controls.m_FunctionConvergenceToleranceAmoeba->setText(QString::number(optimizerValues[17])); - m_Controls.m_IterationsAmoeba->setText(QString::number(optimizerValues[18])); -} - -void QmitkAmoebaOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; - this->ShowSimplexDelta(); -} - -QString QmitkAmoebaOptimizerView::GetName() -{ - return "Amoeba"; -} - -void QmitkAmoebaOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsAmoeba->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_SimplexDeltaAmoeba1->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba2->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba3->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba4->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba5->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba6->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba7->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba8->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba9->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba10->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba11->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba12->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba13->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba14->setValidator(validatorLineEditInputFloat); - m_Controls.m_SimplexDeltaAmoeba15->setValidator(validatorLineEditInputFloat); - m_Controls.m_ParametersConvergenceToleranceAmoeba->setValidator(validatorLineEditInputFloat); - m_Controls.m_FunctionConvergenceToleranceAmoeba->setValidator(validatorLineEditInputFloat); - simplexDeltaLineEdits.clear(); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba1); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba2); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba3); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba4); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba5); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba6); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba7); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba8); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba9); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba10); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba11); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba12); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba13); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba14); - simplexDeltaLineEdits.push_back(m_Controls.m_SimplexDeltaAmoeba15); - simplexDeltaLabels.clear(); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel1); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel2); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel3); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel4); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel5); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel6); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel7); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel8); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel9); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel10); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel11); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel12); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel13); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel14); - simplexDeltaLabels.push_back(m_Controls.m_SimplexDeltaAmoebaLabel15); -} - -void QmitkAmoebaOptimizerView::ShowSimplexDelta() -{ - auto it_edit = simplexDeltaLineEdits.begin(); - for (it_edit = simplexDeltaLineEdits.begin(); it_edit != simplexDeltaLineEdits.end(); it_edit++) - { - (*it_edit)->hide(); - } - it_edit = simplexDeltaLineEdits.begin(); - for (int i = 0; i < m_NumberTransformParameters; i++) - { - (*it_edit)->show(); - it_edit++; - } - auto it_label = simplexDeltaLabels.begin(); - for (it_label = simplexDeltaLabels.begin(); it_label != simplexDeltaLabels.end(); it_label++) - { - (*it_label)->hide(); - } - it_label = simplexDeltaLabels.begin(); - for (int i = 0; i < m_NumberTransformParameters; i++) - { - (*it_label)->show(); - it_label++; - } - this->updateGeometry(); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerView.h deleted file mode 100644 index ca2f4bb8ff..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkAmoebaOptimizerView.h +++ /dev/null @@ -1,66 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkAmoebaOptimizerViewWidgetHIncluded -#define QmitkAmoebaOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkAmoebaOptimizerControls.h" -#include -#include -#include - -class QLineEdit; - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkAmoebaOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkAmoebaOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkAmoebaOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -private: - void ShowSimplexDelta(); - -protected: - Ui::QmitkAmoebaOptimizerControls m_Controls; - - int m_NumberTransformParameters; - - std::list simplexDeltaLineEdits; - std::list simplexDeltaLabels; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerControls.ui deleted file mode 100644 index fa255d990c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerControls.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - QmitkConjugateGradientOptimizerControls - - - - 0 - 0 - 162 - 38 - - - - Form - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerView.cpp deleted file mode 100644 index 1cb2107869..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerView.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkConjugateGradientOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkConjugateGradientOptimizerView::QmitkConjugateGradientOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkConjugateGradientOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::CONJUGATEGRADIENTOPTIMIZER; -} - -QmitkConjugateGradientOptimizerView::~QmitkConjugateGradientOptimizerView() -{ -} - -itk::Object::Pointer QmitkConjugateGradientOptimizerView::GetOptimizer() -{ - itk::ConjugateGradientOptimizer::Pointer OptimizerPointer = itk::ConjugateGradientOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - /*typedef itk::ConjugateGradientOptimizer::InternalOptimizerType vnlOptimizerType; - vnlOptimizerType * vnlOptimizer = OptimizerPointer->GetOptimizer(); - vnlOptimizer->set_f_tolerance( 1e-3 ); - vnlOptimizer->set_g_tolerance( 1e-4 ); - vnlOptimizer->set_x_tolerance( 1e-8 ); - vnlOptimizer->set_epsilon_function( 1e-10 ); - vnlOptimizer->set_max_function_evals( m_Iterations ); - vnlOptimizer->set_check_derivatives( 3 );*/ - - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkConjugateGradientOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(1); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - return optimizerValues; -} - -void QmitkConjugateGradientOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); -} - -void QmitkConjugateGradientOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkConjugateGradientOptimizerView::GetName() -{ - return "ConjugateGradient"; -} - -void QmitkConjugateGradientOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerView.h deleted file mode 100644 index dc6f1ffa2c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkConjugateGradientOptimizerViewWidgetHIncluded -#define QmitkConjugateGradientOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkConjugateGradientOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkConjugateGradientOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkConjugateGradientOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkConjugateGradientOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkConjugateGradientOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerControls.ui deleted file mode 100644 index dcf10ebab0..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerControls.ui +++ /dev/null @@ -1,112 +0,0 @@ - - - QmitkExhaustiveOptimizerControls - - - - 0 - 0 - 162 - 68 - - - - Form - - - - - - - - - - - 50 - false - - - - Step Length: - - - false - - - - - - - - 50 - false - - - - Number of Steps: - - - false - - - - - - - - - 6 - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 10 - - - Qt::AlignRight - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerView.cpp deleted file mode 100644 index 282772365d..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerView.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkExhaustiveOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkExhaustiveOptimizerView::QmitkExhaustiveOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkExhaustiveOptimizerView::~QmitkExhaustiveOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkExhaustiveOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::EXHAUSTIVEOPTIMIZER; -} - -itk::Object::Pointer QmitkExhaustiveOptimizerView::GetOptimizer() -{ - itk::ExhaustiveOptimizer::Pointer OptimizerPointer = itk::ExhaustiveOptimizer::New(); - OptimizerPointer->SetStepLength(m_Controls.m_StepLengthExhaustive->text().toFloat()); - itk::ExhaustiveOptimizer::StepsType steps(m_NumberTransformParameters); - for (int i = 0; i < m_NumberTransformParameters; i++) - { - steps[i] = m_Controls.m_NumberOfStepsExhaustive->text().toInt(); - } - OptimizerPointer->SetNumberOfSteps(steps); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkExhaustiveOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(1); - optimizerValues.fill(0); - optimizerValues[0] = 1; - optimizerValues[1] = m_Controls.m_StepLengthExhaustive->text().toFloat(); - optimizerValues[2] = m_Controls.m_NumberOfStepsExhaustive->text().toInt(); - return optimizerValues; -} - -void QmitkExhaustiveOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - // m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_StepLengthExhaustive->setText(QString::number(optimizerValues[1])); - m_Controls.m_NumberOfStepsExhaustive->setText(QString::number(optimizerValues[2])); -} - -void QmitkExhaustiveOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkExhaustiveOptimizerView::GetName() -{ - return "Exhaustive"; -} - -void QmitkExhaustiveOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_NumberOfStepsExhaustive->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_StepLengthExhaustive->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerView.h deleted file mode 100644 index 9d049c6f61..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkExhaustiveOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkExhaustiveOptimizerViewWidgetHIncluded -#define QmitkExhaustiveOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkExhaustiveOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkExhaustiveOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkExhaustiveOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkExhaustiveOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkExhaustiveOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerControls.ui deleted file mode 100644 index 6a92cc2101..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerControls.ui +++ /dev/null @@ -1,213 +0,0 @@ - - - QmitkFRPROptimizerControls - - - - 0 - 0 - 219 - 148 - - - - Form - - - - - - - - Type - - - - 0 - - - 0 - - - - - 0 - - - 9 - - - 9 - - - 9 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Fletch Reeves - - - true - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Polak Ribiere - - - - - - - - - - - - - - - - - 50 - false - - - - Step Length: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.01 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerView.cpp deleted file mode 100644 index aec0d5b2a9..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerView.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkFRPROptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkFRPROptimizerView::QmitkFRPROptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkFRPROptimizerView::~QmitkFRPROptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkFRPROptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::FRPROPTIMIZER; -} - -itk::Object::Pointer QmitkFRPROptimizerView::GetOptimizer() -{ - itk::FRPROptimizer::Pointer OptimizerPointer = itk::FRPROptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetStepLength(m_Controls.m_StepLengthFRPR->text().toFloat()); - if (m_Controls.m_FletchReevesFRPR->isChecked()) - { - OptimizerPointer->SetToFletchReeves(); - } - else - { - OptimizerPointer->SetToPolakRibiere(); - } - OptimizerPointer->SetMaximumIteration(m_Controls.m_IterationsFRPR->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkFRPROptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(4); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_FletchReevesFRPR->isChecked(); - optimizerValues[2] = m_Controls.m_StepLengthFRPR->text().toFloat(); - optimizerValues[3] = m_Controls.m_IterationsFRPR->text().toInt(); - return optimizerValues; -} - -void QmitkFRPROptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_FletchReevesFRPR->setChecked(optimizerValues[1]); - m_Controls.m_PolakRibiereFRPR->setChecked(!optimizerValues[1]); - m_Controls.m_StepLengthFRPR->setText(QString::number(optimizerValues[2])); - m_Controls.m_IterationsFRPR->setText(QString::number(optimizerValues[3])); -} - -void QmitkFRPROptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkFRPROptimizerView::GetName() -{ - return "FRPR"; -} - -void QmitkFRPROptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsFRPR->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_StepLengthFRPR->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerView.h deleted file mode 100644 index 601d9ca3eb..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkFRPROptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkFRPROptimizerViewWidgetHIncluded -#define QmitkFRPROptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkFRPROptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkFRPROptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkFRPROptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkFRPROptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkFRPROptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerControls.ui deleted file mode 100644 index 8ff2bbf7c5..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerControls.ui +++ /dev/null @@ -1,131 +0,0 @@ - - - QmitkGradientDescentOptimizerControls - - - - 0 - 0 - 544 - 325 - - - - Form - - - - - - - - - - - 50 - false - - - - Learning Rate: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.01 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerView.cpp deleted file mode 100644 index f299baf296..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerView.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkGradientDescentOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkGradientDescentOptimizerView::QmitkGradientDescentOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkGradientDescentOptimizerView::~QmitkGradientDescentOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkGradientDescentOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER; -} - -itk::Object::Pointer QmitkGradientDescentOptimizerView::GetOptimizer() -{ - itk::GradientDescentOptimizer::Pointer OptimizerPointer = itk::GradientDescentOptimizer::New(); - // OptimizerPointer->SetMaximize( m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetLearningRate(m_Controls.m_LearningRateGradientDescent->text().toFloat()); - OptimizerPointer->SetNumberOfIterations(m_Controls.m_IterationsGradientDescent->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkGradientDescentOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(3); - optimizerValues.fill(0); - // optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_LearningRateGradientDescent->text().toFloat(); - optimizerValues[2] = m_Controls.m_IterationsGradientDescent->text().toInt(); - return optimizerValues; -} - -void QmitkGradientDescentOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - // m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_LearningRateGradientDescent->setText(QString::number(optimizerValues[1])); - m_Controls.m_IterationsGradientDescent->setText(QString::number(optimizerValues[2])); -} - -void QmitkGradientDescentOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkGradientDescentOptimizerView::GetName() -{ - return "GradientDescent"; -} - -void QmitkGradientDescentOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsGradientDescent->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_LearningRateGradientDescent->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerView.h deleted file mode 100644 index 9b5ae365fd..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkGradientDescentOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkGradientDescentOptimizerViewWidgetHIncluded -#define QmitkGradientDescentOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkGradientDescentOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkGradientDescentOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkGradientDescentOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkGradientDescentOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkGradientDescentOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerControls.ui deleted file mode 100644 index 11572fc51a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerControls.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - QmitkLBFGSBOptimizerControls - - - - 0 - 0 - 162 - 38 - - - - Form - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerView.cpp deleted file mode 100644 index 48e4e67a93..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerView.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkLBFGSBOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkLBFGSBOptimizerView::QmitkLBFGSBOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkLBFGSBOptimizerView::~QmitkLBFGSBOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkLBFGSBOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::LBFGSBOPTIMIZER; -} - -itk::Object::Pointer QmitkLBFGSBOptimizerView::GetOptimizer() -{ - itk::LBFGSBOptimizer::Pointer OptimizerPointer = itk::LBFGSBOptimizer::New(); - // Set up boundary conditions - itk::LBFGSBOptimizer::BoundValueType lower(12); - itk::LBFGSBOptimizer::BoundValueType upper(12); - itk::LBFGSBOptimizer::BoundSelectionType select(12); - - lower.Fill(-1); - upper.Fill(10); - select.Fill(2); - - OptimizerPointer->SetLowerBound(lower); - OptimizerPointer->SetUpperBound(upper); - OptimizerPointer->SetBoundSelection(select); - OptimizerPointer->SetCostFunctionConvergenceFactor(1e+1); - OptimizerPointer->SetMaximumNumberOfCorrections(5); - OptimizerPointer->SetProjectedGradientTolerance(1e-5); - OptimizerPointer->SetMaximumNumberOfEvaluations(500); - OptimizerPointer->SetMaximumNumberOfIterations(200); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkLBFGSBOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(1); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - return optimizerValues; -} - -void QmitkLBFGSBOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); -} - -void QmitkLBFGSBOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkLBFGSBOptimizerView::GetName() -{ - return "LBFGSB"; -} - -void QmitkLBFGSBOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - /*QValidator* validatorLineEditInput = */ new QIntValidator(0, 20000000, this); - /*QValidator* validatorLineEditInputFloat = */ new QDoubleValidator(0, 20000000, 8, this); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerView.h deleted file mode 100644 index ff3b056cd5..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSBOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkLBFGSBOptimizerViewWidgetHIncluded -#define QmitkLBFGSBOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkLBFGSBOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkLBFGSBOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkLBFGSBOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkLBFGSBOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkLBFGSBOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerControls.ui deleted file mode 100644 index 2b96af4b09..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerControls.ui +++ /dev/null @@ -1,226 +0,0 @@ - - - QmitkLBFGSOptimizerControls - - - - 0 - 0 - 225 - 152 - - - - Form - - - - - - - - - - - 50 - false - - - - Gradient Magnitude Tolerance: - - - false - - - - - - - - 50 - false - - - - Line Search Accuracy - - - false - - - - - - - - 50 - false - - - - Default Step Length - - - false - - - - - - - - 50 - false - - - - Max # Function Evaluations - - - false - - - - - - - - - 0 - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.1 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - - 50 - false - - - - Trace - - - true - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerView.cpp deleted file mode 100644 index e24e12bb6c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerView.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkLBFGSOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkLBFGSOptimizerView::QmitkLBFGSOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkLBFGSOptimizerView::~QmitkLBFGSOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkLBFGSOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::LBFGSOPTIMIZER; -} - -itk::Object::Pointer QmitkLBFGSOptimizerView::GetOptimizer() -{ - itk::LBFGSOptimizer::Pointer OptimizerPointer = itk::LBFGSOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetGradientConvergenceTolerance(m_Controls.m_GradientMagnitudeToleranceLBFGS->text().toFloat()); - OptimizerPointer->SetLineSearchAccuracy(m_Controls.m_LineSearchAccuracyLBFGS->text().toFloat()); - OptimizerPointer->SetDefaultStepLength(m_Controls.m_DefaultStepLengthLBFGS->text().toFloat()); - OptimizerPointer->SetMaximumNumberOfFunctionEvaluations(m_Controls.m_MaximumEvaluationsLBFGS->text().toInt()); - OptimizerPointer->SetTrace(m_Controls.m_TraceOnLBFGS->isChecked()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkLBFGSOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(6); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_GradientMagnitudeToleranceLBFGS->text().toFloat(); - optimizerValues[2] = m_Controls.m_LineSearchAccuracyLBFGS->text().toFloat(); - optimizerValues[3] = m_Controls.m_DefaultStepLengthLBFGS->text().toFloat(); - optimizerValues[4] = m_Controls.m_MaximumEvaluationsLBFGS->text().toInt(); - optimizerValues[5] = m_Controls.m_TraceOnLBFGS->isChecked(); - return optimizerValues; -} - -void QmitkLBFGSOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_GradientMagnitudeToleranceLBFGS->setText(QString::number(optimizerValues[1])); - m_Controls.m_LineSearchAccuracyLBFGS->setText(QString::number(optimizerValues[2])); - m_Controls.m_DefaultStepLengthLBFGS->setText(QString::number(optimizerValues[3])); - m_Controls.m_MaximumEvaluationsLBFGS->setText(QString::number(optimizerValues[4])); - m_Controls.m_TraceOnLBFGS->setChecked(optimizerValues[5]); -} - -void QmitkLBFGSOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkLBFGSOptimizerView::GetName() -{ - return "LBFGS"; -} - -void QmitkLBFGSOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_MaximumEvaluationsLBFGS->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_GradientMagnitudeToleranceLBFGS->setValidator(validatorLineEditInputFloat); - m_Controls.m_LineSearchAccuracyLBFGS->setValidator(validatorLineEditInputFloat); - m_Controls.m_DefaultStepLengthLBFGS->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerView.h deleted file mode 100644 index 4547e47b94..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkLBFGSOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkLBFGSOptimizerViewWidgetHIncluded -#define QmitkLBFGSOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkLBFGSOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkLBFGSOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkLBFGSOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkLBFGSOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkLBFGSOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerControls.ui deleted file mode 100644 index a7fda47cb2..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerControls.ui +++ /dev/null @@ -1,245 +0,0 @@ - - - QmitkOnePlusOneEvolutionaryOptimizerControls - - - - 0 - 0 - 184 - 266 - - - - Form - - - - - - - - - - - 50 - false - - - - Shrink Factor: - - - false - - - - - - - - 50 - false - - - - Growth Factor: - - - false - - - - - - - - 50 - false - - - - Epsilon: - - - false - - - - - - - - 50 - false - - - - Initial Radius: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.98787654742307407 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.05 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 10 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerView.cpp deleted file mode 100644 index e2f5d5be2a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerView.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkOnePlusOneEvolutionaryOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include -#include - -QmitkOnePlusOneEvolutionaryOptimizerView::QmitkOnePlusOneEvolutionaryOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkOnePlusOneEvolutionaryOptimizerView::~QmitkOnePlusOneEvolutionaryOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkOnePlusOneEvolutionaryOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::ONEPLUSONEEVOLUTIONARYOPTIMIZER; -} - -itk::Object::Pointer QmitkOnePlusOneEvolutionaryOptimizerView::GetOptimizer() -{ - itk::OnePlusOneEvolutionaryOptimizer::Pointer OptimizerPointer = itk::OnePlusOneEvolutionaryOptimizer::New(); - // OptimizerPointer->SetMaximize( m_Controls.m_Maximize->isChecked() ); - itk::Statistics::NormalVariateGenerator::Pointer generator = itk::Statistics::NormalVariateGenerator::New(); - generator->Initialize(12345); - OptimizerPointer->SetNormalVariateGenerator(generator); - OptimizerPointer->SetShrinkFactor(m_Controls.m_ShrinkFactorOnePlusOneEvolutionary->text().toFloat()); - OptimizerPointer->SetGrowthFactor(m_Controls.m_GrowthFactorOnePlusOneEvolutionary->text().toFloat()); - OptimizerPointer->SetEpsilon(m_Controls.m_EpsilonOnePlusOneEvolutionary->text().toFloat()); - OptimizerPointer->SetInitialRadius(m_Controls.m_InitialRadiusOnePlusOneEvolutionary->text().toFloat()); - OptimizerPointer->SetMaximumIteration(m_Controls.m_IterationsOnePlusOneEvolutionary->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkOnePlusOneEvolutionaryOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(6); - optimizerValues.fill(0); - // optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_ShrinkFactorOnePlusOneEvolutionary->text().toFloat(); - optimizerValues[2] = m_Controls.m_GrowthFactorOnePlusOneEvolutionary->text().toFloat(); - optimizerValues[3] = m_Controls.m_EpsilonOnePlusOneEvolutionary->text().toFloat(); - optimizerValues[4] = m_Controls.m_InitialRadiusOnePlusOneEvolutionary->text().toFloat(); - optimizerValues[5] = m_Controls.m_IterationsOnePlusOneEvolutionary->text().toInt(); - return optimizerValues; -} - -void QmitkOnePlusOneEvolutionaryOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - // m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_ShrinkFactorOnePlusOneEvolutionary->setText(QString::number(optimizerValues[1])); - m_Controls.m_GrowthFactorOnePlusOneEvolutionary->setText(QString::number(optimizerValues[2])); - m_Controls.m_EpsilonOnePlusOneEvolutionary->setText(QString::number(optimizerValues[3])); - m_Controls.m_InitialRadiusOnePlusOneEvolutionary->setText(QString::number(optimizerValues[4])); - m_Controls.m_IterationsOnePlusOneEvolutionary->setText(QString::number(optimizerValues[5])); -} - -void QmitkOnePlusOneEvolutionaryOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkOnePlusOneEvolutionaryOptimizerView::GetName() -{ - return "OnePlusOneEvolutionary"; -} - -void QmitkOnePlusOneEvolutionaryOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_EpsilonOnePlusOneEvolutionary->setValidator(validatorLineEditInput); - m_Controls.m_InitialRadiusOnePlusOneEvolutionary->setValidator(validatorLineEditInput); - m_Controls.m_IterationsOnePlusOneEvolutionary->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ShrinkFactorOnePlusOneEvolutionary->setValidator(validatorLineEditInputFloat); - m_Controls.m_GrowthFactorOnePlusOneEvolutionary->setValidator(validatorLineEditInputFloat); - m_Controls.m_EpsilonOnePlusOneEvolutionary->setValidator(validatorLineEditInputFloat); - m_Controls.m_InitialRadiusOnePlusOneEvolutionary->setValidator(validatorLineEditInputFloat); - m_Controls.m_IterationsOnePlusOneEvolutionary->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerView.h deleted file mode 100644 index 5c0be832c2..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerView.h +++ /dev/null @@ -1,59 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkOnePlusOneEvolutionaryOptimizerViewWidgetHIncluded -#define QmitkOnePlusOneEvolutionaryOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkOnePlusOneEvolutionaryOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkOnePlusOneEvolutionaryOptimizerView - : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkOnePlusOneEvolutionaryOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkOnePlusOneEvolutionaryOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkOnePlusOneEvolutionaryOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerControls.ui deleted file mode 100644 index 991501b212..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerControls.ui +++ /dev/null @@ -1,207 +0,0 @@ - - - QmitkPowellOptimizerControls - - - - 0 - 0 - 182 - 146 - - - - Form - - - - - - - - - - - 50 - false - - - - Step Length: - - - false - - - - - - - - 50 - false - - - - Step Tolerance: - - - false - - - - - - - - 50 - false - - - - Value Tolerance: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.01 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerView.cpp deleted file mode 100644 index a363dbccf9..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerView.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkPowellOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkPowellOptimizerView::QmitkPowellOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkPowellOptimizerView::~QmitkPowellOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkPowellOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::POWELLOPTIMIZER; -} - -itk::Object::Pointer QmitkPowellOptimizerView::GetOptimizer() -{ - itk::PowellOptimizer::Pointer OptimizerPointer = itk::PowellOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetStepLength(m_Controls.m_StepLengthPowell->text().toFloat()); - OptimizerPointer->SetStepTolerance(m_Controls.m_StepTolerancePowell->text().toFloat()); - OptimizerPointer->SetValueTolerance(m_Controls.m_ValueTolerancePowell->text().toFloat()); - OptimizerPointer->SetMaximumIteration(m_Controls.m_IterationsPowell->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkPowellOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(5); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_StepLengthPowell->text().toFloat(); - optimizerValues[2] = m_Controls.m_StepTolerancePowell->text().toFloat(); - optimizerValues[3] = m_Controls.m_ValueTolerancePowell->text().toFloat(); - optimizerValues[4] = m_Controls.m_IterationsPowell->text().toInt(); - return optimizerValues; -} - -void QmitkPowellOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_StepLengthPowell->setText(QString::number(optimizerValues[1])); - m_Controls.m_StepTolerancePowell->setText(QString::number(optimizerValues[2])); - m_Controls.m_ValueTolerancePowell->setText(QString::number(optimizerValues[3])); - m_Controls.m_IterationsPowell->setText(QString::number(optimizerValues[4])); -} - -void QmitkPowellOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkPowellOptimizerView::GetName() -{ - return "Powell"; -} - -void QmitkPowellOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsPowell->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_StepLengthPowell->setValidator(validatorLineEditInputFloat); - m_Controls.m_StepTolerancePowell->setValidator(validatorLineEditInputFloat); - m_Controls.m_ValueTolerancePowell->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerView.h deleted file mode 100644 index ce7149cce7..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkPowellOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkPowellOptimizerViewWidgetHIncluded -#define QmitkPowellOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkPowellOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkPowellOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkPowellOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkPowellOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkPowellOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerControls.ui deleted file mode 100644 index 7b2bff5f05..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerControls.ui +++ /dev/null @@ -1,125 +0,0 @@ - - - QmitkQuaternionRigidTransformGradientDescentOptimizerControls - - - - 0 - 0 - 182 - 94 - - - - Form - - - - - - - - - - - 50 - false - - - - Learning Rate: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.01 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerView.cpp deleted file mode 100644 index 8b143dbf6c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerView.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkQuaternionRigidTransformGradientDescentOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkQuaternionRigidTransformGradientDescentOptimizerView::QmitkQuaternionRigidTransformGradientDescentOptimizerView( - QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkQuaternionRigidTransformGradientDescentOptimizerView::~QmitkQuaternionRigidTransformGradientDescentOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkQuaternionRigidTransformGradientDescentOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::QUATERNIONRIGIDTRANSFORMGRADIENTDESCENTOPTIMIZER; -} - -itk::Object::Pointer QmitkQuaternionRigidTransformGradientDescentOptimizerView::GetOptimizer() -{ - itk::QuaternionRigidTransformGradientDescentOptimizer::Pointer OptimizerPointer = - itk::QuaternionRigidTransformGradientDescentOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetLearningRate(m_Controls.m_LearningRateQuaternionRigidTransformGradientDescent->text().toFloat()); - OptimizerPointer->SetNumberOfIterations( - m_Controls.m_IterationsQuaternionRigidTransformGradientDescent->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkQuaternionRigidTransformGradientDescentOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(3); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_LearningRateQuaternionRigidTransformGradientDescent->text().toFloat(); - optimizerValues[2] = m_Controls.m_IterationsQuaternionRigidTransformGradientDescent->text().toInt(); - return optimizerValues; -} - -void QmitkQuaternionRigidTransformGradientDescentOptimizerView::SetOptimizerParameters( - itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_LearningRateQuaternionRigidTransformGradientDescent->setText(QString::number(optimizerValues[1])); - m_Controls.m_IterationsQuaternionRigidTransformGradientDescent->setText(QString::number(optimizerValues[2])); -} - -void QmitkQuaternionRigidTransformGradientDescentOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkQuaternionRigidTransformGradientDescentOptimizerView::GetName() -{ - return "QuaternionRigidTransformGradientDescent"; -} - -void QmitkQuaternionRigidTransformGradientDescentOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsQuaternionRigidTransformGradientDescent->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_LearningRateQuaternionRigidTransformGradientDescent->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerView.h deleted file mode 100644 index ce6805cbaa..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerView.h +++ /dev/null @@ -1,59 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkQuaternionRigidTransformGradientDescentOptimizerViewWidgetHIncluded -#define QmitkQuaternionRigidTransformGradientDescentOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkQuaternionRigidTransformGradientDescentOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkQuaternionRigidTransformGradientDescentOptimizerView - : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkQuaternionRigidTransformGradientDescentOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkQuaternionRigidTransformGradientDescentOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkQuaternionRigidTransformGradientDescentOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerControls.ui deleted file mode 100644 index aa99c202b1..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerControls.ui +++ /dev/null @@ -1,245 +0,0 @@ - - - QmitkRegularStepGradientDescentOptimizerControls - - - - 0 - 0 - 225 - 172 - - - - Form - - - - - - - - - - - 50 - false - - - - Gradient Magnitude Tolerance: - - - false - - - - - - - - 50 - false - - - - Minimum Step Length: - - - false - - - - - - - - 50 - false - - - - Maximum Step Length: - - - false - - - - - - - - 50 - false - - - - Relaxation Factor: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.5 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 100 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerView.cpp deleted file mode 100644 index 7895b2aeaa..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerView.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkRegularStepGradientDescentOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkRegularStepGradientDescentOptimizerView::QmitkRegularStepGradientDescentOptimizerView(QWidget *parent, - Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkRegularStepGradientDescentOptimizerView::~QmitkRegularStepGradientDescentOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkRegularStepGradientDescentOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::REGULARSTEPGRADIENTDESCENTOPTIMIZER; -} - -itk::Object::Pointer QmitkRegularStepGradientDescentOptimizerView::GetOptimizer() -{ - itk::RegularStepGradientDescentOptimizer::Pointer OptimizerPointer = itk::RegularStepGradientDescentOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetGradientMagnitudeTolerance( - m_Controls.m_GradientMagnitudeToleranceRegularStepGradientDescent->text().toFloat()); - OptimizerPointer->SetMinimumStepLength(m_Controls.m_MinimumStepLengthRegularStepGradientDescent->text().toFloat()); - OptimizerPointer->SetMaximumStepLength(m_Controls.m_MaximumStepLengthRegularStepGradientDescent->text().toFloat()); - OptimizerPointer->SetRelaxationFactor(m_Controls.m_RelaxationFactorRegularStepGradientDescent->text().toFloat()); - OptimizerPointer->SetNumberOfIterations(m_Controls.m_IterationsRegularStepGradientDescent->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkRegularStepGradientDescentOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(6); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_GradientMagnitudeToleranceRegularStepGradientDescent->text().toFloat(); - optimizerValues[2] = m_Controls.m_MinimumStepLengthRegularStepGradientDescent->text().toFloat(); - optimizerValues[3] = m_Controls.m_MaximumStepLengthRegularStepGradientDescent->text().toFloat(); - optimizerValues[4] = m_Controls.m_RelaxationFactorRegularStepGradientDescent->text().toFloat(); - optimizerValues[5] = m_Controls.m_IterationsRegularStepGradientDescent->text().toInt(); - return optimizerValues; -} - -void QmitkRegularStepGradientDescentOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_GradientMagnitudeToleranceRegularStepGradientDescent->setText(QString::number(optimizerValues[1])); - m_Controls.m_MinimumStepLengthRegularStepGradientDescent->setText(QString::number(optimizerValues[2])); - m_Controls.m_MaximumStepLengthRegularStepGradientDescent->setText(QString::number(optimizerValues[3])); - m_Controls.m_RelaxationFactorRegularStepGradientDescent->setText(QString::number(optimizerValues[4])); - m_Controls.m_IterationsRegularStepGradientDescent->setText(QString::number(optimizerValues[5])); -} - -void QmitkRegularStepGradientDescentOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkRegularStepGradientDescentOptimizerView::GetName() -{ - return "RegularStepGradientDescent"; -} - -void QmitkRegularStepGradientDescentOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsRegularStepGradientDescent->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_GradientMagnitudeToleranceRegularStepGradientDescent->setValidator(validatorLineEditInputFloat); - m_Controls.m_MinimumStepLengthRegularStepGradientDescent->setValidator(validatorLineEditInputFloat); - m_Controls.m_MaximumStepLengthRegularStepGradientDescent->setValidator(validatorLineEditInputFloat); - QValidator *validatorLineEditInputFloat0to1 = new QDoubleValidator(0.000001, 0.999999, 8, this); - m_Controls.m_RelaxationFactorRegularStepGradientDescent->setValidator(validatorLineEditInputFloat0to1); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerView.h deleted file mode 100644 index 79f15dbea0..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerView.h +++ /dev/null @@ -1,59 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkRegularStepGradientDescentOptimizerViewWidgetHIncluded -#define QmitkRegularStepGradientDescentOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkRegularStepGradientDescentOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkRegularStepGradientDescentOptimizerView - : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkRegularStepGradientDescentOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkRegularStepGradientDescentOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkRegularStepGradientDescentOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRigidRegistrationOptimizerGUIBase.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRigidRegistrationOptimizerGUIBase.cpp deleted file mode 100644 index 83708f591c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRigidRegistrationOptimizerGUIBase.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkRigidRegistrationOptimizerGUIBase.h" - -QmitkRigidRegistrationOptimizerGUIBase::QmitkRigidRegistrationOptimizerGUIBase(QWidget *parent, Qt::WindowFlags f) - : QWidget(parent, f) -{ -} - -QmitkRigidRegistrationOptimizerGUIBase::~QmitkRigidRegistrationOptimizerGUIBase() -{ -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRigidRegistrationOptimizerGUIBase.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRigidRegistrationOptimizerGUIBase.h deleted file mode 100644 index d0868460e2..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkRigidRegistrationOptimizerGUIBase.h +++ /dev/null @@ -1,56 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkRigidRegistrationOptimizerGUIBaseH -#define QmitkRigidRegistrationOptimizerGUIBaseH - -#include "MitkRigidRegistrationUIExports.h" -#include "mitkImage.h" -#include "mitkOptimizerParameters.h" -#include -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkRigidRegistrationOptimizerGUIBase : public QWidget -{ -public: - QmitkRigidRegistrationOptimizerGUIBase(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkRigidRegistrationOptimizerGUIBase(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() = 0; - - virtual itk::Object::Pointer GetOptimizer() = 0; - - virtual itk::Array GetOptimizerParameters() = 0; - - virtual void SetOptimizerParameters(itk::Array optimizerValues) = 0; - - virtual void SetNumberOfTransformParameters(int transformParameters) = 0; - - virtual QString GetName() = 0; - - virtual void SetupUI(QWidget *parent) = 0; - -protected: -}; - -#endif // QmitkRigidRegistrationOptimizerGUIBaseH diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerControls.ui deleted file mode 100644 index d36d46e476..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerControls.ui +++ /dev/null @@ -1,501 +0,0 @@ - - - QmitkSPSAOptimizerControls - - - - 0 - 0 - 249 - 302 - - - - Form - - - - - - 6 - - - 0 - - - - - - - true - - - - 50 - false - - - - a: - - - false - - - - - - - true - - - - 50 - false - - - - A: - - - false - - - - - - - true - - - - 50 - false - - - - Alpha: - - - false - - - - - - - true - - - - 50 - false - - - - Gamma: - - - false - - - - - - - true - - - - 50 - false - - - - c: - - - false - - - - - - - true - - - - 50 - false - - - - Tolerance: - - - false - - - - - - - true - - - - 50 - false - - - - State Of Convergence Decay Rate: - - - false - - - - - - - true - - - - 50 - false - - - - Minimum Number of Iterations: - - - false - - - - - - - true - - - - 50 - false - - - - Number Of Perturbations: - - - false - - - - - - - true - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 10.0 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 0.602 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 0.0001 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 0.101 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 1e-5 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 0.5 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 10 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 1 - - - Qt::AlignRight - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerView.cpp deleted file mode 100644 index 14a0f0dc9e..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerView.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkSPSAOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkSPSAOptimizerView::QmitkSPSAOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkSPSAOptimizerView::~QmitkSPSAOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkSPSAOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::SPSAOPTIMIZER; -} - -itk::Object::Pointer QmitkSPSAOptimizerView::GetOptimizer() -{ - itk::SPSAOptimizer::Pointer OptimizerPointer = itk::SPSAOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->Seta(m_Controls.m_aSPSA->text().toFloat()); - OptimizerPointer->SetA(m_Controls.m_ASPSA->text().toFloat()); - OptimizerPointer->SetAlpha(m_Controls.m_AlphaSPSA->text().toFloat()); - OptimizerPointer->Setc(m_Controls.m_cSPSA->text().toFloat()); - OptimizerPointer->SetGamma(m_Controls.m_GammaSPSA->text().toFloat()); - OptimizerPointer->SetTolerance(m_Controls.m_ToleranceSPSA->text().toFloat()); - OptimizerPointer->SetStateOfConvergenceDecayRate(m_Controls.m_StateOfConvergenceDecayRateSPSA->text().toFloat()); - OptimizerPointer->SetMinimumNumberOfIterations(m_Controls.m_MinimumNumberOfIterationsSPSA->text().toInt()); - OptimizerPointer->SetNumberOfPerturbations(m_Controls.m_NumberOfPerturbationsSPSA->text().toInt()); - OptimizerPointer->SetMaximumNumberOfIterations(m_Controls.m_IterationsSPSA->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkSPSAOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(3); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_aSPSA->text().toFloat(); - optimizerValues[2] = m_Controls.m_ASPSA->text().toFloat(); - optimizerValues[3] = m_Controls.m_AlphaSPSA->text().toFloat(); - optimizerValues[4] = m_Controls.m_cSPSA->text().toFloat(); - optimizerValues[5] = m_Controls.m_GammaSPSA->text().toFloat(); - optimizerValues[6] = m_Controls.m_ToleranceSPSA->text().toFloat(); - optimizerValues[7] = m_Controls.m_StateOfConvergenceDecayRateSPSA->text().toFloat(); - optimizerValues[8] = m_Controls.m_MinimumNumberOfIterationsSPSA->text().toInt(); - optimizerValues[9] = m_Controls.m_NumberOfPerturbationsSPSA->text().toInt(); - optimizerValues[10] = m_Controls.m_IterationsSPSA->text().toInt(); - return optimizerValues; -} - -void QmitkSPSAOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_aSPSA->setText(QString::number(optimizerValues[1])); - m_Controls.m_ASPSA->setText(QString::number(optimizerValues[2])); - m_Controls.m_AlphaSPSA->setText(QString::number(optimizerValues[3])); - m_Controls.m_cSPSA->setText(QString::number(optimizerValues[4])); - m_Controls.m_GammaSPSA->setText(QString::number(optimizerValues[5])); - m_Controls.m_ToleranceSPSA->setText(QString::number(optimizerValues[6])); - m_Controls.m_StateOfConvergenceDecayRateSPSA->setText(QString::number(optimizerValues[7])); - m_Controls.m_MinimumNumberOfIterationsSPSA->setText(QString::number(optimizerValues[8])); - m_Controls.m_NumberOfPerturbationsSPSA->setText(QString::number(optimizerValues[9])); - m_Controls.m_IterationsSPSA->setText(QString::number(optimizerValues[10])); -} - -void QmitkSPSAOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkSPSAOptimizerView::GetName() -{ - return "SPSA"; -} - -void QmitkSPSAOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_MinimumNumberOfIterationsSPSA->setValidator(validatorLineEditInput); - m_Controls.m_NumberOfPerturbationsSPSA->setValidator(validatorLineEditInput); - m_Controls.m_IterationsSPSA->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_aSPSA->setValidator(validatorLineEditInputFloat); - m_Controls.m_ASPSA->setValidator(validatorLineEditInputFloat); - m_Controls.m_AlphaSPSA->setValidator(validatorLineEditInputFloat); - m_Controls.m_cSPSA->setValidator(validatorLineEditInputFloat); - m_Controls.m_GammaSPSA->setValidator(validatorLineEditInputFloat); - m_Controls.m_ToleranceSPSA->setValidator(validatorLineEditInputFloat); - m_Controls.m_StateOfConvergenceDecayRateSPSA->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerView.h deleted file mode 100644 index 536fd51c57..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkSPSAOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkSPSAOptimizerViewWidgetHIncluded -#define QmitkSPSAOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkSPSAOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkSPSAOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkSPSAOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkSPSAOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkSPSAOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerControls.ui deleted file mode 100644 index e6d2a1952a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerControls.ui +++ /dev/null @@ -1,207 +0,0 @@ - - - QmitkVersorRigid3DTransformOptimizerControls - - - - 0 - 0 - 225 - 146 - - - - Form - - - - - - - - - - - 50 - false - - - - Gradient Magnitude Tolerance: - - - false - - - - - - - - 50 - false - - - - Minimum Step Length: - - - false - - - - - - - - 50 - false - - - - Maximum Step Length: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 4.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerView.cpp deleted file mode 100644 index 304af9adb4..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerView.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkVersorRigid3DTransformOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkVersorRigid3DTransformOptimizerView::QmitkVersorRigid3DTransformOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkVersorRigid3DTransformOptimizerView::~QmitkVersorRigid3DTransformOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkVersorRigid3DTransformOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::VERSORRIGID3DTRANSFORMOPTIMIZER; -} - -itk::Object::Pointer QmitkVersorRigid3DTransformOptimizerView::GetOptimizer() -{ - itk::VersorRigid3DTransformOptimizer::Pointer OptimizerPointer = itk::VersorRigid3DTransformOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetGradientMagnitudeTolerance( - m_Controls.m_GradientMagnitudeToleranceVersorRigid3DTransform->text().toFloat()); - OptimizerPointer->SetMinimumStepLength(m_Controls.m_MinimumStepLengthVersorRigid3DTransform->text().toFloat()); - OptimizerPointer->SetMaximumStepLength(m_Controls.m_MaximumStepLengthVersorRigid3DTransform->text().toFloat()); - OptimizerPointer->SetNumberOfIterations(m_Controls.m_IterationsVersorRigid3DTransform->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkVersorRigid3DTransformOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(5); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_GradientMagnitudeToleranceVersorRigid3DTransform->text().toFloat(); - optimizerValues[2] = m_Controls.m_MinimumStepLengthVersorRigid3DTransform->text().toFloat(); - optimizerValues[3] = m_Controls.m_MaximumStepLengthVersorRigid3DTransform->text().toFloat(); - optimizerValues[4] = m_Controls.m_IterationsVersorRigid3DTransform->text().toInt(); - return optimizerValues; -} - -void QmitkVersorRigid3DTransformOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_GradientMagnitudeToleranceVersorRigid3DTransform->setText(QString::number(optimizerValues[1])); - m_Controls.m_MinimumStepLengthVersorRigid3DTransform->setText(QString::number(optimizerValues[2])); - m_Controls.m_MaximumStepLengthVersorRigid3DTransform->setText(QString::number(optimizerValues[3])); - m_Controls.m_IterationsVersorRigid3DTransform->setText(QString::number(optimizerValues[4])); -} - -void QmitkVersorRigid3DTransformOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkVersorRigid3DTransformOptimizerView::GetName() -{ - return "VersorRigid3DTransform"; -} - -void QmitkVersorRigid3DTransformOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsVersorRigid3DTransform->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_GradientMagnitudeToleranceVersorRigid3DTransform->setValidator(validatorLineEditInputFloat); - m_Controls.m_MinimumStepLengthVersorRigid3DTransform->setValidator(validatorLineEditInputFloat); - m_Controls.m_MaximumStepLengthVersorRigid3DTransform->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerView.h deleted file mode 100644 index 90bbfc4aec..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerView.h +++ /dev/null @@ -1,59 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkVersorRigid3DOptimizerViewWidgetHIncluded -#define QmitkVersorRigid3DOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkVersorRigid3DTransformOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkVersorRigid3DTransformOptimizerView - : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkVersorRigid3DTransformOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkVersorRigid3DTransformOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkVersorRigid3DTransformOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerControls.ui deleted file mode 100644 index b11debeb81..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerControls.ui +++ /dev/null @@ -1,207 +0,0 @@ - - - QmitkVersorTransformOptimizerControls - - - - 0 - 0 - 225 - 146 - - - - Form - - - - - - - - - - - 50 - false - - - - Gradient Magnitude Tolerance: - - - false - - - - - - - - 50 - false - - - - Minimum Step Length: - - - false - - - - - - - - 50 - false - - - - Maximum Step Length: - - - false - - - - - - - - 50 - false - - - - Number of Iterations: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 4.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 200 - - - Qt::AlignRight - - - - - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Maximize Optimizer Value - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerView.cpp deleted file mode 100644 index b486a4df29..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerView.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkVersorTransformOptimizerView.h" -#include "mitkImageAccessByItk.h" -#include - -QmitkVersorTransformOptimizerView::QmitkVersorTransformOptimizerView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationOptimizerGUIBase(parent, f), m_NumberTransformParameters(16) -{ -} - -QmitkVersorTransformOptimizerView::~QmitkVersorTransformOptimizerView() -{ -} - -mitk::OptimizerParameters::OptimizerType QmitkVersorTransformOptimizerView::GetOptimizerType() -{ - return mitk::OptimizerParameters::VERSORTRANSFORMOPTIMIZER; -} - -itk::Object::Pointer QmitkVersorTransformOptimizerView::GetOptimizer() -{ - itk::VersorTransformOptimizer::Pointer OptimizerPointer = itk::VersorTransformOptimizer::New(); - OptimizerPointer->SetMaximize(m_Controls.m_Maximize->isChecked()); - OptimizerPointer->SetGradientMagnitudeTolerance( - m_Controls.m_GradientMagnitudeToleranceVersorTransform->text().toFloat()); - OptimizerPointer->SetMinimumStepLength(m_Controls.m_MinimumStepLengthVersorTransform->text().toFloat()); - OptimizerPointer->SetMaximumStepLength(m_Controls.m_MaximumStepLengthVersorTransform->text().toFloat()); - OptimizerPointer->SetNumberOfIterations(m_Controls.m_IterationsVersorTransform->text().toInt()); - return OptimizerPointer.GetPointer(); -} - -itk::Array QmitkVersorTransformOptimizerView::GetOptimizerParameters() -{ - itk::Array optimizerValues; - optimizerValues.SetSize(5); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_Maximize->isChecked(); - optimizerValues[1] = m_Controls.m_GradientMagnitudeToleranceVersorTransform->text().toFloat(); - optimizerValues[2] = m_Controls.m_MinimumStepLengthVersorTransform->text().toFloat(); - optimizerValues[3] = m_Controls.m_MaximumStepLengthVersorTransform->text().toFloat(); - optimizerValues[4] = m_Controls.m_IterationsVersorTransform->text().toInt(); - return optimizerValues; -} - -void QmitkVersorTransformOptimizerView::SetOptimizerParameters(itk::Array optimizerValues) -{ - m_Controls.m_Maximize->setChecked(optimizerValues[0]); - m_Controls.m_GradientMagnitudeToleranceVersorTransform->setText(QString::number(optimizerValues[1])); - m_Controls.m_MinimumStepLengthVersorTransform->setText(QString::number(optimizerValues[2])); - m_Controls.m_MaximumStepLengthVersorTransform->setText(QString::number(optimizerValues[3])); - m_Controls.m_IterationsVersorTransform->setText(QString::number(optimizerValues[4])); -} - -void QmitkVersorTransformOptimizerView::SetNumberOfTransformParameters(int transformParameters) -{ - m_NumberTransformParameters = transformParameters; -} - -QString QmitkVersorTransformOptimizerView::GetName() -{ - return "VersorTransform"; -} - -void QmitkVersorTransformOptimizerView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInput = new QIntValidator(0, 20000000, this); - m_Controls.m_IterationsVersorTransform->setValidator(validatorLineEditInput); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_GradientMagnitudeToleranceVersorTransform->setValidator(validatorLineEditInputFloat); - m_Controls.m_MinimumStepLengthVersorTransform->setValidator(validatorLineEditInputFloat); - m_Controls.m_MaximumStepLengthVersorTransform->setValidator(validatorLineEditInputFloat); -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerView.h b/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerView.h deleted file mode 100644 index 760e2ebbe1..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationOptimizer/QmitkVersorTransformOptimizerView.h +++ /dev/null @@ -1,58 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkVersorTransformOptimizerViewWidgetHIncluded -#define QmitkVersorTransformOptimizerViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" -#include "ui_QmitkVersorTransformOptimizerControls.h" -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkVersorTransformOptimizerView : public QmitkRigidRegistrationOptimizerGUIBase -{ -public: - QmitkVersorTransformOptimizerView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkVersorTransformOptimizerView(); - - virtual mitk::OptimizerParameters::OptimizerType GetOptimizerType() override; - - virtual itk::Object::Pointer GetOptimizer() override; - - virtual itk::Array GetOptimizerParameters() override; - - virtual void SetOptimizerParameters(itk::Array metricValues) override; - - virtual void SetNumberOfTransformParameters(int transformParameters) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - -protected: - Ui::QmitkVersorTransformOptimizerControls m_Controls; - - int m_NumberTransformParameters; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformControls.ui deleted file mode 100644 index fb0273984a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformControls.ui +++ /dev/null @@ -1,596 +0,0 @@ - - - QmitkAffineTransformControls - - - - 0 - 0 - 173 - 378 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale 1: - - - false - - - - - - - - 50 - false - - - - Scale 2: - - - false - - - - - - - - 50 - false - - - - Scale 3: - - - false - - - - - - - - 50 - false - - - - Scale 4: - - - false - - - - - - - - 50 - false - - - - Scale 5: - - - false - - - - - - - - 50 - false - - - - Scale 6: - - - false - - - - - - - - 50 - false - - - - Scale 7: - - - false - - - - - - - - 50 - false - - - - Scale 8: - - - false - - - - - - - - 50 - false - - - - Scale 9: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.cpp deleted file mode 100644 index cd3736fd69..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkAffineTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkAffineTransformView::QmitkAffineTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkAffineTransformView::~QmitkAffineTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkAffineTransformView::GetTransformType() -{ - return mitk::TransformParameters::AFFINETRANSFORM; -} - -itk::Object::Pointer QmitkAffineTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessTwoImagesFixedDimensionByItk(m_FixedImage, m_MovingImage, GetTransform2, 3); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkAffineTransformView::GetTransform2(itk::Image *itkImage1, - itk::Image *itkImage2) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImageType::Pointer fixedImage = itkImage1; - - // // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - // typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - // movingImageToItk->SetInput(m_MovingImage); - // movingImageToItk->Update(); - typename MovingImageType::Pointer movingImage = itkImage2; - - typename itk::AffineTransform::Pointer transformPointer = - itk::AffineTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerAffine->isChecked()) - { - typedef typename itk::AffineTransform AffineTransformType; - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage); - transformInitializer->SetMovingImage(movingImage); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsAffine->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); -} - -itk::Array QmitkAffineTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(15); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesAffine->isChecked(); - transformValues[1] = m_Controls.m_ScalesAffineTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesAffineTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesAffineTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesAffineTransformScale4->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesAffineTransformScale5->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesAffineTransformScale6->text().toDouble(); - transformValues[7] = m_Controls.m_ScalesAffineTransformScale7->text().toDouble(); - transformValues[8] = m_Controls.m_ScalesAffineTransformScale8->text().toDouble(); - transformValues[9] = m_Controls.m_ScalesAffineTransformScale9->text().toDouble(); - transformValues[10] = m_Controls.m_ScalesAffineTransformScaleTranslationX->text().toDouble(); - transformValues[11] = m_Controls.m_ScalesAffineTransformScaleTranslationY->text().toDouble(); - transformValues[12] = m_Controls.m_ScalesAffineTransformScaleTranslationZ->text().toDouble(); - transformValues[13] = m_Controls.m_CenterForInitializerAffine->isChecked(); - transformValues[14] = m_Controls.m_MomentsAffine->isChecked(); - return transformValues; -} - -void QmitkAffineTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesAffine->setChecked(transformValues[0]); - m_Controls.m_ScalesAffineTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesAffineTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesAffineTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesAffineTransformScale4->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesAffineTransformScale5->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesAffineTransformScale6->setText(QString::number(transformValues[6])); - m_Controls.m_ScalesAffineTransformScale7->setText(QString::number(transformValues[7])); - m_Controls.m_ScalesAffineTransformScale8->setText(QString::number(transformValues[8])); - m_Controls.m_ScalesAffineTransformScale9->setText(QString::number(transformValues[9])); - m_Controls.m_ScalesAffineTransformScaleTranslationX->setText(QString::number(transformValues[10])); - m_Controls.m_ScalesAffineTransformScaleTranslationY->setText(QString::number(transformValues[11])); - m_Controls.m_ScalesAffineTransformScaleTranslationZ->setText(QString::number(transformValues[12])); - m_Controls.m_CenterForInitializerAffine->setChecked(transformValues[13]); - m_Controls.m_MomentsAffine->setChecked(transformValues[14]); - m_Controls.m_GeometryAffine->setChecked(!transformValues[14]); -} - -QString QmitkAffineTransformView::GetName() -{ - return "Affine"; -} - -void QmitkAffineTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesAffineTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale4->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale5->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale6->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale7->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale8->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScale9->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesAffineTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkAffineTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(12); - scales.Fill(1.0); - scales[0] = m_Controls.m_ScalesAffineTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesAffineTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesAffineTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesAffineTransformScale4->text().toDouble(); - scales[4] = m_Controls.m_ScalesAffineTransformScale5->text().toDouble(); - scales[5] = m_Controls.m_ScalesAffineTransformScale6->text().toDouble(); - scales[6] = m_Controls.m_ScalesAffineTransformScale7->text().toDouble(); - scales[7] = m_Controls.m_ScalesAffineTransformScale8->text().toDouble(); - scales[8] = m_Controls.m_ScalesAffineTransformScale9->text().toDouble(); - scales[9] = m_Controls.m_ScalesAffineTransformScaleTranslationX->text().toDouble(); - scales[10] = m_Controls.m_ScalesAffineTransformScaleTranslationY->text().toDouble(); - scales[11] = m_Controls.m_ScalesAffineTransformScaleTranslationZ->text().toDouble(); - return scales; -} - -vtkTransform *QmitkAffineTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - // - the 9 rotation-coefficients are copied - // directly to the top left part of the matrix - int m = 0; - for (unsigned int i = 0; i < m_FixedImage->GetDimension(); i++) - { - for (unsigned int j = 0; j < m_FixedImage->GetDimension(); j++) - { - vtkmatrix->SetElement(i, j, transformParams[m]); - m++; - } - } - - // - the 3 translation-coefficients are corrected to take - // into account the center of the transformation - float center[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - std::cout << "rotation center: " << center[0] << " " << center[1] << " " << center[2] << std::endl; - - float translation[4]; - vtkmatrix->MultiplyPoint(center, translation); - if (m_FixedImage->GetDimension() == 2) - { - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); - } - else if (m_FixedImage->GetDimension() == 3) - { - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[9]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[10]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[11]); - } - - // set the transform matrix to init the transform - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkAffineTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - { - m_Controls.m_ScalesAffineTransformScale7->hide(); - m_Controls.m_ScalesAffineTransformScale8->hide(); - m_Controls.m_ScalesAffineTransformScale9->hide(); - m_Controls.m_ScalesAffineTransformScaleTranslationX->hide(); - m_Controls.m_ScalesAffineTransformScaleTranslationY->hide(); - m_Controls.m_ScalesAffineTransformScaleTranslationZ->hide(); - m_Controls.textLabel2_7->setText("Translation Scale X:"); - m_Controls.textLabel3_6->setText("Translation Scale Y:"); - m_Controls.textLabel4_4->hide(); - m_Controls.textLabel5_4->hide(); - m_Controls.textLabel6_4->hide(); - m_Controls.textLabel11_3->hide(); - m_Controls.textLabel12_3->hide(); - m_Controls.textLabel13_2->hide(); - return 6; - } - else - { - m_Controls.m_ScalesAffineTransformScale7->show(); - m_Controls.m_ScalesAffineTransformScale8->show(); - m_Controls.m_ScalesAffineTransformScale9->show(); - m_Controls.m_ScalesAffineTransformScaleTranslationX->show(); - m_Controls.m_ScalesAffineTransformScaleTranslationY->show(); - m_Controls.m_ScalesAffineTransformScaleTranslationZ->show(); - m_Controls.textLabel2_7->setText("Scale 5:"); - m_Controls.textLabel3_6->setText("Scale 6:"); - m_Controls.textLabel4_4->show(); - m_Controls.textLabel5_4->show(); - m_Controls.textLabel6_4->show(); - m_Controls.textLabel11_3->show(); - m_Controls.textLabel12_3->show(); - m_Controls.textLabel13_2->show(); - return 12; - } - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.h deleted file mode 100644 index fa849565af..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.h +++ /dev/null @@ -1,71 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkAffineTransformViewWidgetHIncluded -#define QmitkAffineTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkAffineTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkAffineTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkAffineTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkAffineTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1, - itk::Image *itkImage2); - -protected: - Ui::QmitkAffineTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformControls.ui deleted file mode 100644 index 5e4f683b9b..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformControls.ui +++ /dev/null @@ -1,368 +0,0 @@ - - - QmitkCenteredEuler3DTransformControls - - - - 0 - 0 - 173 - 222 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Rotation X: - - - false - - - - - - - - 50 - false - - - - Scale Rotation Y: - - - false - - - - - - - - 50 - false - - - - Scale Rotation Z: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformView.cpp deleted file mode 100644 index 1cde15257e..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformView.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkCenteredEuler3DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include - -QmitkCenteredEuler3DTransformView::QmitkCenteredEuler3DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkCenteredEuler3DTransformView::~QmitkCenteredEuler3DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkCenteredEuler3DTransformView::GetTransformType() -{ - return mitk::TransformParameters::CENTEREDEULER3DTRANSFORM; -} - -itk::Object::Pointer QmitkCenteredEuler3DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessByItk(m_FixedImage, GetTransform2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkCenteredEuler3DTransformView::GetTransform2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - if (VImageDimension == 3) - { - typename itk::CenteredEuler3DTransform::Pointer transformPointer = - itk::CenteredEuler3DTransform::New(); - transformPointer->SetIdentity(); - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkCenteredEuler3DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(9); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesCenteredEuler3D->isChecked(); - transformValues[1] = m_Controls.m_ScalesCenteredEuler3DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesCenteredEuler3DTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesCenteredEuler3DTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationX->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationY->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationZ->text().toDouble(); - transformValues[7] = m_Controls.m_CenterForInitializerCenteredEuler3D->isChecked(); - transformValues[8] = m_Controls.m_MomentsCenteredEuler3D->isChecked(); - return transformValues; -} - -void QmitkCenteredEuler3DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesCenteredEuler3D->setChecked(transformValues[0]); - m_Controls.m_ScalesCenteredEuler3DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesCenteredEuler3DTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesCenteredEuler3DTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationX->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationY->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationZ->setText(QString::number(transformValues[6])); - m_Controls.m_CenterForInitializerCenteredEuler3D->setChecked(transformValues[7]); - m_Controls.m_MomentsCenteredEuler3D->setChecked(transformValues[8]); - m_Controls.m_GeometryCenteredEuler3D->setChecked(!transformValues[8]); -} - -QString QmitkCenteredEuler3DTransformView::GetName() -{ - return "CenteredEuler3D"; -} - -void QmitkCenteredEuler3DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesCenteredEuler3DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredEuler3DTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredEuler3DTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkCenteredEuler3DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(6); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesCenteredEuler3D->isChecked()) - { - scales[0] = m_Controls.m_ScalesCenteredEuler3DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesCenteredEuler3DTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesCenteredEuler3DTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationX->text().toDouble(); - scales[4] = m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationY->text().toDouble(); - scales[5] = m_Controls.m_ScalesCenteredEuler3DTransformScaleTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkCenteredEuler3DTransformView::Transform(vtkMatrix4x4 * /*vtkmatrix*/, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - mitk::ScalarType angleX = transformParams[0] * 45.0 / atan(1.0); - mitk::ScalarType angleY = transformParams[1] * 45.0 / atan(1.0); - mitk::ScalarType angleZ = transformParams[2] * 45.0 / atan(1.0); - vtktransform->PostMultiply(); - vtktransform->Translate(-m_CenterX, -m_CenterY, -m_CenterZ); - vtktransform->RotateX(angleX); - vtktransform->RotateY(angleY); - vtktransform->RotateZ(angleZ); - vtktransform->Translate(m_CenterX, m_CenterY, m_CenterZ); - vtktransform->Translate(transformParams[3], transformParams[4], transformParams[5]); - vtktransform->PreMultiply(); - } - return vtktransform; -} - -int QmitkCenteredEuler3DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 4; - else - return 6; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformView.h deleted file mode 100644 index b33843629d..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredEuler3DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkCenteredEuler3DTransformViewWidgetHIncluded -#define QmitkCenteredEuler3DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkCenteredEuler3DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkCenteredEuler3DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkCenteredEuler3DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkCenteredEuler3DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkCenteredEuler3DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformControls.ui deleted file mode 100644 index 807255d24c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformControls.ui +++ /dev/null @@ -1,372 +0,0 @@ - - - QmitkCenteredRigid2DTransformControls - - - - 0 - 0 - 173 - 218 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - - - - 50 - false - - - - Angle: - - - false - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0 - - - Qt::AlignRight - - - - - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Rotation: - - - false - - - - - - - - 50 - false - - - - Scale Center X: - - - false - - - - - - - - 50 - false - - - - Scale Center Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp deleted file mode 100644 index 95746a9c32..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkCenteredRigid2DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkCenteredRigid2DTransformView::QmitkCenteredRigid2DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkCenteredRigid2DTransformView::~QmitkCenteredRigid2DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkCenteredRigid2DTransformView::GetTransformType() -{ - return mitk::TransformParameters::CENTEREDRIGID2DTRANSFORM; -} - -itk::Object::Pointer QmitkCenteredRigid2DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkCenteredRigid2DTransformView::GetTransform2( - itk::Image *itkImage1) -{ - if (VImageDimension == 2) - { - typedef typename itk::Image FixedImage2DType; - typedef typename itk::Image MovingImage2DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage2DType::Pointer fixedImage2D = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); - - typename itk::CenteredRigid2DTransform::Pointer transformPointer = - itk::CenteredRigid2DTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerCenteredRigid2D->isChecked()) - { - typedef typename itk::CenteredRigid2DTransform CenteredRigid2DTransformType; - typedef - typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage2D); - transformInitializer->SetMovingImage(movingImage2D); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsCenteredRigid2D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - transformPointer->SetAngle(m_Controls.m_AngleCenteredRigid2D->text().toFloat()); - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkCenteredRigid2DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(9); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesCenteredRigid2D->isChecked(); - transformValues[1] = m_Controls.m_RotationScaleCenteredRigid2D->text().toDouble(); - transformValues[2] = m_Controls.m_CenterXScaleCenteredRigid2D->text().toDouble(); - transformValues[3] = m_Controls.m_CenterYScaleCenteredRigid2D->text().toDouble(); - transformValues[4] = m_Controls.m_TranslationXScaleCenteredRigid2D->text().toDouble(); - transformValues[5] = m_Controls.m_TranslationYScaleCenteredRigid2D->text().toDouble(); - transformValues[6] = m_Controls.m_AngleCenteredRigid2D->text().toFloat(); - transformValues[7] = m_Controls.m_CenterForInitializerCenteredRigid2D->isChecked(); - transformValues[8] = m_Controls.m_MomentsCenteredRigid2D->isChecked(); - return transformValues; -} - -void QmitkCenteredRigid2DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesCenteredRigid2D->setChecked(transformValues[0]); - m_Controls.m_RotationScaleCenteredRigid2D->setText(QString::number(transformValues[1])); - m_Controls.m_CenterXScaleCenteredRigid2D->setText(QString::number(transformValues[2])); - m_Controls.m_CenterYScaleCenteredRigid2D->setText(QString::number(transformValues[3])); - m_Controls.m_TranslationXScaleCenteredRigid2D->setText(QString::number(transformValues[4])); - m_Controls.m_TranslationYScaleCenteredRigid2D->setText(QString::number(transformValues[5])); - m_Controls.m_AngleCenteredRigid2D->setText(QString::number(transformValues[6])); - m_Controls.m_CenterForInitializerCenteredRigid2D->setChecked(transformValues[7]); - m_Controls.m_MomentsCenteredRigid2D->setChecked(transformValues[8]); - m_Controls.m_GeometryCenteredRigid2D->setChecked(!transformValues[8]); -} - -QString QmitkCenteredRigid2DTransformView::GetName() -{ - return "CenteredRigid2D"; -} - -void QmitkCenteredRigid2DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_AngleCenteredRigid2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_RotationScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_CenterXScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_CenterYScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_TranslationXScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_TranslationYScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkCenteredRigid2DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(5); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesCenteredRigid2D->isChecked()) - { - scales[0] = m_Controls.m_RotationScaleCenteredRigid2D->text().toDouble(); - scales[1] = m_Controls.m_CenterXScaleCenteredRigid2D->text().toDouble(); - scales[2] = m_Controls.m_CenterYScaleCenteredRigid2D->text().toDouble(); - scales[3] = m_Controls.m_TranslationXScaleCenteredRigid2D->text().toDouble(); - scales[4] = m_Controls.m_TranslationYScaleCenteredRigid2D->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkCenteredRigid2DTransformView::Transform(vtkMatrix4x4 * /* vtkmatrix */, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - mitk::ScalarType angle = transformParams[0] * 45.0 / atan(1.0); - ; - vtktransform->PostMultiply(); - vtktransform->Translate(-transformParams[1], -transformParams[2], 0); - vtktransform->RotateZ(angle); - vtktransform->Translate(transformParams[1], transformParams[2], 0); - vtktransform->Translate(transformParams[3], transformParams[4], 0); - vtktransform->PreMultiply(); - } - return vtktransform; -} - -int QmitkCenteredRigid2DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 5; - else - return 0; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.h deleted file mode 100644 index c283db5691..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkCenteredRigid2DTransformViewWidgetHIncluded -#define QmitkCenteredRigid2DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkCenteredRigid2DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkCenteredRigid2DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkCenteredRigid2DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkCenteredRigid2DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkCenteredRigid2DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformControls.ui deleted file mode 100644 index c65d2ec2c9..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformControls.ui +++ /dev/null @@ -1,456 +0,0 @@ - - - QmitkCenteredSimilarity2DTransformControls - - - - 0 - 0 - 173 - 272 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Initial Scale: - - - false - - - - - - - - 50 - false - - - - Initial Angle: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0 - - - Qt::AlignRight - - - - - - - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Scaling: - - - false - - - - - - - - 50 - false - - - - Scale Rotation: - - - false - - - - - - - - 50 - false - - - - Scale Center X: - - - false - - - - - - - - 50 - false - - - - Scale Center Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 10.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp deleted file mode 100644 index 1269d96267..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkCenteredSimilarity2DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkCenteredSimilarity2DTransformView::QmitkCenteredSimilarity2DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkCenteredSimilarity2DTransformView::~QmitkCenteredSimilarity2DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkCenteredSimilarity2DTransformView::GetTransformType() -{ - return mitk::TransformParameters::CENTEREDSIMILARITY2DTRANSFORM; -} - -itk::Object::Pointer QmitkCenteredSimilarity2DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkCenteredSimilarity2DTransformView::GetTransform2( - itk::Image *itkImage1) -{ - if (VImageDimension == 2) - { - typedef typename itk::Image FixedImage2DType; - typedef typename itk::Image MovingImage2DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage2DType::Pointer fixedImage2D = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); - - typename itk::CenteredSimilarity2DTransform::Pointer transformPointer = - itk::CenteredSimilarity2DTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerCenteredSimilarity2D->isChecked()) - { - typedef typename itk::CenteredSimilarity2DTransform CenteredSimilarity2DTransformType; - typedef typename itk:: - CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage2D); - transformInitializer->SetMovingImage(movingImage2D); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsCenteredSimilarity2D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - transformPointer->SetScale(m_Controls.m_InitialScaleCenteredSimilarity2D->text().toFloat()); - transformPointer->SetAngle(m_Controls.m_AngleCenteredSimilarity2D->text().toFloat()); - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkCenteredSimilarity2DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(11); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesCenteredSimilarity2D->isChecked(); - transformValues[1] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->text().toDouble(); - transformValues[7] = m_Controls.m_InitialScaleCenteredSimilarity2D->text().toFloat(); - transformValues[8] = m_Controls.m_AngleCenteredSimilarity2D->text().toFloat(); - transformValues[9] = m_Controls.m_CenterForInitializerCenteredSimilarity2D->isChecked(); - transformValues[10] = m_Controls.m_MomentsCenteredSimilarity2D->isChecked(); - return transformValues; -} - -void QmitkCenteredSimilarity2DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesCenteredSimilarity2D->setChecked(transformValues[0]); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->setText(QString::number(transformValues[6])); - m_Controls.m_InitialScaleCenteredSimilarity2D->setText(QString::number(transformValues[7])); - m_Controls.m_AngleCenteredSimilarity2D->setText(QString::number(transformValues[8])); - m_Controls.m_CenterForInitializerCenteredSimilarity2D->setChecked(transformValues[9]); - m_Controls.m_MomentsCenteredSimilarity2D->setChecked(transformValues[10]); - m_Controls.m_GeometryCenteredSimilarity2D->setChecked(!transformValues[10]); -} - -QString QmitkCenteredSimilarity2DTransformView::GetName() -{ - return "CenteredSimilarity2D"; -} - -void QmitkCenteredSimilarity2DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkCenteredSimilarity2DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(6); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesCenteredSimilarity2D->isChecked()) - { - scales[0] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->text().toDouble(); - scales[4] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->text().toDouble(); - scales[5] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkCenteredSimilarity2DTransformView::Transform(vtkMatrix4x4 * /*vtkmatrix*/, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - mitk::ScalarType angle = transformParams[1] * 45.0 / atan(1.0); - vtktransform->PostMultiply(); - vtktransform->Translate(-transformParams[2], -transformParams[3], 0); - vtktransform->Scale(transformParams[0], transformParams[0], 1); - vtktransform->RotateZ(angle); - vtktransform->Translate(transformParams[2], transformParams[3], 0); - vtktransform->Translate(transformParams[4], transformParams[5], 0); - vtktransform->PreMultiply(); - } - return vtktransform; -} - -int QmitkCenteredSimilarity2DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 6; - else - return 0; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.h deleted file mode 100644 index 29b26c1c2e..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.h +++ /dev/null @@ -1,71 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkCenteredSimilarity2DTransformViewWidgetHIncluded -#define QmitkCenteredSimilarity2DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkCenteredSimilarity2DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkCenteredSimilarity2DTransformView - : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkCenteredSimilarity2DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkCenteredSimilarity2DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkCenteredSimilarity2DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformControls.ui deleted file mode 100644 index aac928f71a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformControls.ui +++ /dev/null @@ -1,254 +0,0 @@ - - - QmitkEuler2DTransformControls - - - - 0 - 0 - 173 - 144 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Rotation: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp deleted file mode 100644 index 2c2c3d2a2c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkEuler2DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkEuler2DTransformView::QmitkEuler2DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkEuler2DTransformView::~QmitkEuler2DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkEuler2DTransformView::GetTransformType() -{ - return mitk::TransformParameters::EULER2DTRANSFORM; -} - -itk::Object::Pointer QmitkEuler2DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkEuler2DTransformView::GetTransform2(itk::Image *itkImage1) -{ - if (VImageDimension == 2) - { - typedef typename itk::Image FixedImage2DType; - typedef typename itk::Image MovingImage2DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage2DType::Pointer fixedImage2D = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); - - typename itk::Euler2DTransform::Pointer transformPointer = itk::Euler2DTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerEuler2D->isChecked()) - { - typedef typename itk::Euler2DTransform Euler2DTransformType; - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage2D); - transformInitializer->SetMovingImage(movingImage2D); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsEuler2D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkEuler2DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(6); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesEuler2D->isChecked(); - transformValues[1] = m_Controls.m_RotationScaleEuler2D->text().toDouble(); - transformValues[2] = m_Controls.m_TranslationXScaleEuler2D->text().toDouble(); - transformValues[3] = m_Controls.m_TranslationYScaleEuler2D->text().toDouble(); - transformValues[4] = m_Controls.m_CenterForInitializerEuler2D->isChecked(); - transformValues[5] = m_Controls.m_MomentsEuler2D->isChecked(); - return transformValues; -} - -void QmitkEuler2DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesEuler2D->setChecked(transformValues[0]); - m_Controls.m_RotationScaleEuler2D->setText(QString::number(transformValues[1])); - m_Controls.m_TranslationXScaleEuler2D->setText(QString::number(transformValues[2])); - m_Controls.m_TranslationYScaleEuler2D->setText(QString::number(transformValues[3])); - m_Controls.m_CenterForInitializerEuler2D->setChecked(transformValues[4]); - m_Controls.m_MomentsEuler2D->setChecked(transformValues[5]); - m_Controls.m_GeometryEuler2D->setChecked(!transformValues[5]); -} - -QString QmitkEuler2DTransformView::GetName() -{ - return "Euler2D"; -} - -void QmitkEuler2DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_RotationScaleEuler2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_TranslationXScaleEuler2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_TranslationYScaleEuler2D->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkEuler2DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(3); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesEuler2D->isChecked()) - { - scales[0] = m_Controls.m_RotationScaleEuler2D->text().toDouble(); - scales[1] = m_Controls.m_TranslationXScaleEuler2D->text().toDouble(); - scales[2] = m_Controls.m_TranslationYScaleEuler2D->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkEuler2DTransformView::Transform(vtkMatrix4x4 * /*vtkmatrix*/, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - mitk::ScalarType angle = transformParams[0] * 45.0 / atan(1.0); - vtktransform->PostMultiply(); - vtktransform->RotateZ(angle); - vtktransform->Translate(transformParams[1], transformParams[2], 0); - vtktransform->PreMultiply(); - } - return vtktransform; -} - -int QmitkEuler2DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 3; - else - return 0; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.h deleted file mode 100644 index 06764a5487..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkEuler2DTransformViewWidgetHIncluded -#define QmitkEuler2DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkEuler2DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkEuler2DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkEuler2DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkEuler2DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkEuler2DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformControls.ui deleted file mode 100644 index be392ba02a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformControls.ui +++ /dev/null @@ -1,368 +0,0 @@ - - - QmitkEuler3DTransformControls - - - - 0 - 0 - 173 - 222 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Rotation X: - - - false - - - - - - - - 50 - false - - - - Scale Rotation Y: - - - false - - - - - - - - 50 - false - - - - Scale Rotation Z: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformView.cpp deleted file mode 100644 index fd26fad5d0..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformView.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkEuler3DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include - -QmitkEuler3DTransformView::QmitkEuler3DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkEuler3DTransformView::~QmitkEuler3DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkEuler3DTransformView::GetTransformType() -{ - return mitk::TransformParameters::EULER3DTRANSFORM; -} - -itk::Object::Pointer QmitkEuler3DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessByItk(m_FixedImage, GetTransform2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkEuler3DTransformView::GetTransform2(itk::Image * /*itkImage1*/) -{ - if (VImageDimension == 3) - { - typename itk::Euler3DTransform::Pointer transformPointer = itk::Euler3DTransform::New(); - transformPointer->SetIdentity(); - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkEuler3DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(9); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesEuler3D->isChecked(); - transformValues[1] = m_Controls.m_ScalesEuler3DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesEuler3DTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesEuler3DTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesEuler3DTransformScaleTranslationX->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesEuler3DTransformScaleTranslationY->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesEuler3DTransformScaleTranslationZ->text().toDouble(); - transformValues[7] = m_Controls.m_CenterForInitializerEuler3D->isChecked(); - transformValues[8] = m_Controls.m_MomentsEuler3D->isChecked(); - return transformValues; -} - -void QmitkEuler3DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesEuler3D->setChecked(transformValues[0]); - m_Controls.m_ScalesEuler3DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesEuler3DTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesEuler3DTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesEuler3DTransformScaleTranslationX->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesEuler3DTransformScaleTranslationY->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesEuler3DTransformScaleTranslationZ->setText(QString::number(transformValues[6])); - m_Controls.m_CenterForInitializerEuler3D->setChecked(transformValues[7]); - m_Controls.m_MomentsEuler3D->setChecked(transformValues[8]); - m_Controls.m_GeometryEuler3D->setChecked(!transformValues[8]); -} - -QString QmitkEuler3DTransformView::GetName() -{ - return "Euler3D"; -} - -void QmitkEuler3DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesEuler3DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesEuler3DTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesEuler3DTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesEuler3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesEuler3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesEuler3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkEuler3DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(6); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesEuler3D->isChecked()) - { - scales[0] = m_Controls.m_ScalesEuler3DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesEuler3DTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesEuler3DTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesEuler3DTransformScaleTranslationX->text().toDouble(); - scales[4] = m_Controls.m_ScalesEuler3DTransformScaleTranslationY->text().toDouble(); - scales[5] = m_Controls.m_ScalesEuler3DTransformScaleTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkEuler3DTransformView::Transform(vtkMatrix4x4 * /*vtkmatrix*/, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - mitk::ScalarType angleX = transformParams[0] * 45.0 / atan(1.0); - mitk::ScalarType angleY = transformParams[1] * 45.0 / atan(1.0); - mitk::ScalarType angleZ = transformParams[2] * 45.0 / atan(1.0); - vtktransform->PostMultiply(); - vtktransform->Translate(-m_CenterX, -m_CenterY, -m_CenterZ); - vtktransform->RotateX(angleX); - vtktransform->RotateY(angleY); - vtktransform->RotateZ(angleZ); - vtktransform->Translate(m_CenterX, m_CenterY, m_CenterZ); - vtktransform->Translate(transformParams[3], transformParams[4], transformParams[5]); - vtktransform->PreMultiply(); - } - return vtktransform; -} - -int QmitkEuler3DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 4; - else - return 6; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformView.h deleted file mode 100644 index 44a5511e65..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler3DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkEuler3DTransformViewWidgetHIncluded -#define QmitkEuler3DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkEuler3DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkEuler3DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkEuler3DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkEuler3DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkEuler3DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformControls.ui deleted file mode 100644 index 18da44b8d4..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformControls.ui +++ /dev/null @@ -1,596 +0,0 @@ - - - QmitkFixedCenterOfRotationAffineTransformControls - - - - 0 - 0 - 173 - 378 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale 1: - - - false - - - - - - - - 50 - false - - - - Scale 2: - - - false - - - - - - - - 50 - false - - - - Scale 3: - - - false - - - - - - - - 50 - false - - - - Scale 4: - - - false - - - - - - - - 50 - false - - - - Scale 5: - - - false - - - - - - - - 50 - false - - - - Scale 6: - - - false - - - - - - - - 50 - false - - - - Scale 7: - - - false - - - - - - - - 50 - false - - - - Scale 8: - - - false - - - - - - - - 50 - false - - - - Scale 9: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp deleted file mode 100644 index af4e4e16a4..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkFixedCenterOfRotationAffineTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkFixedCenterOfRotationAffineTransformView::QmitkFixedCenterOfRotationAffineTransformView(QWidget *parent, - Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkFixedCenterOfRotationAffineTransformView::~QmitkFixedCenterOfRotationAffineTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkFixedCenterOfRotationAffineTransformView::GetTransformType() -{ - return mitk::TransformParameters::FIXEDCENTEROFROTATIONAFFINETRANSFORM; -} - -itk::Object::Pointer QmitkFixedCenterOfRotationAffineTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessByItk(m_FixedImage, GetTransform2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkFixedCenterOfRotationAffineTransformView::GetTransform2( - itk::Image *itkImage1) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImageType::Pointer fixedImage = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImageType::Pointer movingImage = movingImageToItk->GetOutput(); - - typedef typename itk::FixedCenterOfRotationAffineTransform CenteredAffineTransformType; - typename itk::FixedCenterOfRotationAffineTransform::Pointer transformPointer = - itk::FixedCenterOfRotationAffineTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->isChecked()) - { - typedef typename itk::FixedCenterOfRotationAffineTransform - FixedCenterOfRotationAffineTransformType; - typedef typename itk:: - CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage); - transformInitializer->SetMovingImage(movingImage); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsFixedCenterOfRotationAffine->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - transformInitializer->InitializeTransform(); - } - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); -} - -itk::Array QmitkFixedCenterOfRotationAffineTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(15); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->isChecked(); - transformValues[1] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->text().toDouble(); - transformValues[7] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->text().toDouble(); - transformValues[8] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->text().toDouble(); - transformValues[9] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->text().toDouble(); - transformValues[10] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->text().toDouble(); - transformValues[11] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->text().toDouble(); - transformValues[12] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->text().toDouble(); - transformValues[13] = m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->isChecked(); - transformValues[14] = m_Controls.m_MomentsFixedCenterOfRotationAffine->isChecked(); - return transformValues; -} - -void QmitkFixedCenterOfRotationAffineTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->setChecked(transformValues[0]); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->setText(QString::number(transformValues[6])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->setText(QString::number(transformValues[7])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->setText(QString::number(transformValues[8])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->setText(QString::number(transformValues[9])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->setText( - QString::number(transformValues[10])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->setText( - QString::number(transformValues[11])); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->setText( - QString::number(transformValues[12])); - m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->setChecked(transformValues[13]); - m_Controls.m_MomentsFixedCenterOfRotationAffine->setChecked(transformValues[14]); - m_Controls.m_GeometryFixedCenterOfRotationAffine->setChecked(!transformValues[14]); -} - -QString QmitkFixedCenterOfRotationAffineTransformView::GetName() -{ - return "FixedCenterOfRotationAffine"; -} - -void QmitkFixedCenterOfRotationAffineTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkFixedCenterOfRotationAffineTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(12); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->isChecked()) - { - scales[0] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->text().toDouble(); - scales[4] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->text().toDouble(); - scales[5] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->text().toDouble(); - scales[6] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->text().toDouble(); - scales[7] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->text().toDouble(); - scales[8] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->text().toDouble(); - scales[9] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->text().toDouble(); - scales[10] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->text().toDouble(); - scales[11] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkFixedCenterOfRotationAffineTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - int m = 0; - for (unsigned int i = 0; i < m_FixedImage->GetDimension(); i++) - { - for (unsigned int j = 0; j < m_FixedImage->GetDimension(); j++) - { - vtkmatrix->SetElement(i, j, transformParams[m]); - m++; - } - } - float center[4]; - float translation[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - vtkmatrix->MultiplyPoint(center, translation); - if (m_FixedImage->GetDimension() == 2) - { - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); - } - else if (m_FixedImage->GetDimension() == 3) - { - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[9]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[10]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[11]); - } - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkFixedCenterOfRotationAffineTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - { - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->hide(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->hide(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->hide(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->hide(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->hide(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->hide(); - m_Controls.textLabel2_7_2_2->setText("Translation Scale X:"); - m_Controls.textLabel3_6_2_2->setText("Translation Scale Y:"); - m_Controls.textLabel4_4_3_2->hide(); - m_Controls.textLabel5_4_2_2->hide(); - m_Controls.textLabel6_4_2_2->hide(); - m_Controls.textLabel11_3_2_2->hide(); - m_Controls.textLabel12_3_2_2->hide(); - m_Controls.textLabel13_2_2_2->hide(); - return 6; - } - else - { - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->show(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->show(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->show(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->show(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->show(); - m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->show(); - m_Controls.textLabel2_7_2_2->setText("Scale 5:"); - m_Controls.textLabel3_6_2_2->setText("Scale 6:"); - m_Controls.textLabel4_4_3_2->show(); - m_Controls.textLabel5_4_2_2->show(); - m_Controls.textLabel6_4_2_2->show(); - m_Controls.textLabel11_3_2_2->show(); - m_Controls.textLabel12_3_2_2->show(); - m_Controls.textLabel13_2_2_2->show(); - return 12; - } - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.h deleted file mode 100644 index 7c989e3ccf..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.h +++ /dev/null @@ -1,71 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkFixedCenterOfRotationAffineTransformViewWidgetHIncluded -#define QmitkFixedCenterOfRotationAffineTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkFixedCenterOfRotationAffineTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkFixedCenterOfRotationAffineTransformView - : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkFixedCenterOfRotationAffineTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkFixedCenterOfRotationAffineTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkFixedCenterOfRotationAffineTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformControls.ui deleted file mode 100644 index ff2bc06f81..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformControls.ui +++ /dev/null @@ -1,406 +0,0 @@ - - - QmitkQuaternionRigidTransformControls - - - - 0 - 0 - 175 - 248 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Quaternion 1: - - - false - - - - - - - - 50 - false - - - - Scale Quaternion 2: - - - false - - - - - - - - 50 - false - - - - Scale Quaternion 3: - - - false - - - - - - - - 50 - false - - - - Scale Quaternion 4: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp deleted file mode 100644 index 9044b2bfc7..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkQuaternionRigidTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkQuaternionRigidTransformView::QmitkQuaternionRigidTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkQuaternionRigidTransformView::~QmitkQuaternionRigidTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkQuaternionRigidTransformView::GetTransformType() -{ - return mitk::TransformParameters::QUATERNIONRIGIDTRANSFORM; -} - -itk::Object::Pointer QmitkQuaternionRigidTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkQuaternionRigidTransformView::GetTransform2( - itk::Image *itkImage1) -{ - if (VImageDimension == 3) - { - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImageType::Pointer fixedImage = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImageType::Pointer movingImage = movingImageToItk->GetOutput(); - - typename itk::QuaternionRigidTransform::Pointer transformPointer = - itk::QuaternionRigidTransform::New(); - transformPointer->SetIdentity(); - typedef typename itk::QuaternionRigidTransform QuaternionRigidTransformType; - if (m_Controls.m_CenterForInitializerQuaternionRigid->isChecked()) - { - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage); - transformInitializer->SetMovingImage(movingImage); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsQuaternionRigid->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkQuaternionRigidTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(10); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesQuaternionRigid->isChecked(); - transformValues[1] = m_Controls.m_ScalesQuaternionRigidTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesQuaternionRigidTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesQuaternionRigidTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesQuaternionRigidTransformScale4->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->text().toDouble(); - transformValues[7] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->text().toDouble(); - transformValues[8] = m_Controls.m_CenterForInitializerQuaternionRigid->isChecked(); - transformValues[9] = m_Controls.m_MomentsQuaternionRigid->isChecked(); - return transformValues; -} - -void QmitkQuaternionRigidTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesQuaternionRigid->setChecked(transformValues[0]); - m_Controls.m_ScalesQuaternionRigidTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesQuaternionRigidTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesQuaternionRigidTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesQuaternionRigidTransformScale4->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->setText(QString::number(transformValues[6])); - m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->setText(QString::number(transformValues[7])); - m_Controls.m_CenterForInitializerQuaternionRigid->setChecked(transformValues[8]); - m_Controls.m_MomentsQuaternionRigid->setChecked(transformValues[9]); - m_Controls.m_GeometryQuaternionRigid->setChecked(!transformValues[9]); -} - -QString QmitkQuaternionRigidTransformView::GetName() -{ - return "QuaternionRigid"; -} - -void QmitkQuaternionRigidTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesQuaternionRigidTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesQuaternionRigidTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesQuaternionRigidTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesQuaternionRigidTransformScale4->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkQuaternionRigidTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(7); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesQuaternionRigid->isChecked()) - { - scales[0] = m_Controls.m_ScalesQuaternionRigidTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesQuaternionRigidTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesQuaternionRigidTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesQuaternionRigidTransformScale4->text().toDouble(); - scales[4] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->text().toDouble(); - scales[5] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->text().toDouble(); - scales[6] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkQuaternionRigidTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - itk::QuaternionRigidTransform::Pointer quaternionTransform = itk::QuaternionRigidTransform::New(); - quaternionTransform->SetParameters(transformParams); - itk::Matrix Matrix = quaternionTransform->GetMatrix(); - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - vtkmatrix->SetElement(i, j, Matrix[i][j]); - } - } - float center[4]; - float translation[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - vtkmatrix->MultiplyPoint(center, translation); - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[6]); - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkQuaternionRigidTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 0; - else - return 7; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.h deleted file mode 100644 index 425ff9957c..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkQuaternionRigidTransformViewWidgetHIncluded -#define QmitkQuaternionRigidTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkQuaternionRigidTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkQuaternionRigidTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkQuaternionRigidTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkQuaternionRigidTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkQuaternionRigidTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformControls.ui deleted file mode 100644 index 9b7e916258..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformControls.ui +++ /dev/null @@ -1,266 +0,0 @@ - - - QmitkRigid2DTransformControls - - - - 0 - 0 - 173 - 144 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - - 75 - true - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Rotation: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - - 75 - true - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp deleted file mode 100644 index c2e2baf80b..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkRigid2DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkRigid2DTransformView::QmitkRigid2DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkRigid2DTransformView::~QmitkRigid2DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkRigid2DTransformView::GetTransformType() -{ - return mitk::TransformParameters::RIGID2DTRANSFORM; -} - -itk::Object::Pointer QmitkRigid2DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkRigid2DTransformView::GetTransform2(itk::Image *itkImage1) -{ - if (VImageDimension == 2) - { - typedef typename itk::Image FixedImage2DType; - typedef typename itk::Image MovingImage2DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage2DType::Pointer fixedImage2D = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); - - typename itk::Rigid2DTransform::Pointer transformPointer = itk::Rigid2DTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerRigid2D->isChecked()) - { - typedef typename itk::Rigid2DTransform Rigid2DTransformType; - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage2D); - transformInitializer->SetMovingImage(movingImage2D); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsRigid2D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkRigid2DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(6); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesRigid2D->isChecked(); - transformValues[1] = m_Controls.m_ScalesRigid2DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesRigid2DTransformScaleTranslationX->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesRigid2DTransformScaleTranslationY->text().toDouble(); - transformValues[4] = m_Controls.m_CenterForInitializerRigid2D->isChecked(); - transformValues[5] = m_Controls.m_MomentsRigid2D->isChecked(); - return transformValues; -} - -void QmitkRigid2DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesRigid2D->setChecked(transformValues[0]); - m_Controls.m_ScalesRigid2DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesRigid2DTransformScaleTranslationX->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesRigid2DTransformScaleTranslationY->setText(QString::number(transformValues[3])); - m_Controls.m_CenterForInitializerRigid2D->setChecked(transformValues[4]); - m_Controls.m_MomentsRigid2D->setChecked(transformValues[5]); - m_Controls.m_GeometryRigid2D->setChecked(!transformValues[5]); -} - -QString QmitkRigid2DTransformView::GetName() -{ - return "Rigid2D"; -} - -void QmitkRigid2DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesRigid2DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid2DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid2DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkRigid2DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(3); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesRigid2D->isChecked()) - { - scales[0] = m_Controls.m_ScalesRigid2DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesRigid2DTransformScaleTranslationX->text().toDouble(); - scales[2] = m_Controls.m_ScalesRigid2DTransformScaleTranslationY->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkRigid2DTransformView::Transform(vtkMatrix4x4 * /*vtkmatrix*/, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - mitk::ScalarType angle = transformParams[0] * 45.0 / atan(1.0); - vtktransform->PostMultiply(); - vtktransform->RotateZ(angle); - vtktransform->Translate(transformParams[1], transformParams[2], 0); - vtktransform->PreMultiply(); - } - return vtktransform; -} - -int QmitkRigid2DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 3; - else - return 0; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.h deleted file mode 100644 index cfd57303dd..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkRigid2DTransformViewWidgetHIncluded -#define QmitkRigid2DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkRigid2DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkRigid2DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkRigid2DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkRigid2DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkRigid2DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformControls.ui deleted file mode 100644 index e065f8cb01..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformControls.ui +++ /dev/null @@ -1,596 +0,0 @@ - - - QmitkRigid3DTransformControls - - - - 0 - 0 - 173 - 378 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Rotation 1: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 2: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 3: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 4: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 5: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 6: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 7: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 8: - - - false - - - - - - - - 50 - false - - - - Scale Rotation 9: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformView.cpp deleted file mode 100644 index 3be98f24e0..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformView.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkRigid3DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include - -QmitkRigid3DTransformView::QmitkRigid3DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkRigid3DTransformView::~QmitkRigid3DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkRigid3DTransformView::GetTransformType() -{ - return mitk::TransformParameters::RIGID3DTRANSFORM; -} - -itk::Object::Pointer QmitkRigid3DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessByItk(m_FixedImage, GetTransform2); - return m_TransformObject; - } - return NULL; -} - -template -itk::Object::Pointer QmitkRigid3DTransformView::GetTransform2(itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - if (VImageDimension == 3) - { - typename itk::VersorRigid3DTransform::Pointer transformPointer = itk::VersorRigid3DTransform::New(); - transformPointer->SetIdentity(); - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return NULL; -} - -itk::Array QmitkRigid3DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(15); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesRigid3D->isChecked(); - transformValues[1] = m_Controls.m_ScalesRigid3DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesRigid3DTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesRigid3DTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesRigid3DTransformScale4->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesRigid3DTransformScale5->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesRigid3DTransformScale6->text().toDouble(); - transformValues[7] = m_Controls.m_ScalesRigid3DTransformScale7->text().toDouble(); - transformValues[8] = m_Controls.m_ScalesRigid3DTransformScale8->text().toDouble(); - transformValues[9] = m_Controls.m_ScalesRigid3DTransformScale9->text().toDouble(); - transformValues[10] = m_Controls.m_ScalesRigid3DTransformScaleTranslationX->text().toDouble(); - transformValues[11] = m_Controls.m_ScalesRigid3DTransformScaleTranslationY->text().toDouble(); - transformValues[12] = m_Controls.m_ScalesRigid3DTransformScaleTranslationZ->text().toDouble(); - transformValues[13] = m_Controls.m_CenterForInitializerRigid3D->isChecked(); - transformValues[14] = m_Controls.m_MomentsRigid3D->isChecked(); - return transformValues; -} - -void QmitkRigid3DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesRigid3D->setChecked(transformValues[0]); - m_Controls.m_ScalesRigid3DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesRigid3DTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesRigid3DTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesRigid3DTransformScale4->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesRigid3DTransformScale5->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesRigid3DTransformScale6->setText(QString::number(transformValues[6])); - m_Controls.m_ScalesRigid3DTransformScale7->setText(QString::number(transformValues[7])); - m_Controls.m_ScalesRigid3DTransformScale8->setText(QString::number(transformValues[8])); - m_Controls.m_ScalesRigid3DTransformScale9->setText(QString::number(transformValues[9])); - m_Controls.m_ScalesRigid3DTransformScaleTranslationX->setText(QString::number(transformValues[10])); - m_Controls.m_ScalesRigid3DTransformScaleTranslationY->setText(QString::number(transformValues[11])); - m_Controls.m_ScalesRigid3DTransformScaleTranslationZ->setText(QString::number(transformValues[12])); - m_Controls.m_CenterForInitializerRigid3D->setChecked(transformValues[13]); - m_Controls.m_MomentsRigid3D->setChecked(transformValues[14]); - m_Controls.m_GeometryRigid3D->setChecked(!transformValues[14]); -} - -QString QmitkRigid3DTransformView::GetName() -{ - return "Rigid3D"; -} - -void QmitkRigid3DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesRigid3DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale4->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale5->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale6->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale7->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale8->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScale9->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesRigid3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkRigid3DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(12); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesRigid3D->isChecked()) - { - scales[0] = m_Controls.m_ScalesRigid3DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesRigid3DTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesRigid3DTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesRigid3DTransformScale4->text().toDouble(); - scales[4] = m_Controls.m_ScalesRigid3DTransformScale5->text().toDouble(); - scales[5] = m_Controls.m_ScalesRigid3DTransformScale6->text().toDouble(); - scales[6] = m_Controls.m_ScalesRigid3DTransformScale7->text().toDouble(); - scales[7] = m_Controls.m_ScalesRigid3DTransformScale8->text().toDouble(); - scales[8] = m_Controls.m_ScalesRigid3DTransformScale9->text().toDouble(); - scales[9] = m_Controls.m_ScalesRigid3DTransformScaleTranslationX->text().toDouble(); - scales[10] = m_Controls.m_ScalesRigid3DTransformScaleTranslationY->text().toDouble(); - scales[11] = m_Controls.m_ScalesRigid3DTransformScaleTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkRigid3DTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - int m = 0; - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - vtkmatrix->SetElement(i, j, transformParams[m]); - m++; - } - } - float center[4]; - float translation[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - vtkmatrix->MultiplyPoint(center, translation); - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[9]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[10]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[11]); - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkRigid3DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 6; - else - return 12; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformView.h deleted file mode 100644 index 87e719dbdf..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid3DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkRigid3DTransformViewWidgetHIncluded -#define QmitkRigid3DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkRigid3DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkRigid3DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkRigid3DTransformView(QWidget *parent = 0, Qt::WindowFlags f = 0); - ~QmitkRigid3DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType(); - - virtual itk::Object::Pointer GetTransform(); - - virtual itk::Array GetTransformParameters(); - - virtual void SetTransformParameters(itk::Array transformValues); - - virtual QString GetName(); - - virtual void SetupUI(QWidget *parent); - - virtual itk::Array GetScales(); - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams); - - virtual int GetNumberOfTransformParameters(); - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkRigid3DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigidRegistrationTransformsGUIBase.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigidRegistrationTransformsGUIBase.cpp deleted file mode 100644 index 867c9976d3..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigidRegistrationTransformsGUIBase.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkRigidRegistrationTransformsGUIBase.h" - -QmitkRigidRegistrationTransformsGUIBase::QmitkRigidRegistrationTransformsGUIBase(QWidget *parent, Qt::WindowFlags f) - : QWidget(parent, f), m_FixedImage(nullptr), m_MovingImage(nullptr) -{ -} - -QmitkRigidRegistrationTransformsGUIBase::~QmitkRigidRegistrationTransformsGUIBase() -{ -} - -void QmitkRigidRegistrationTransformsGUIBase::SetFixedImage(mitk::Image::Pointer fixedImage) -{ - m_FixedImage = fixedImage; -} - -void QmitkRigidRegistrationTransformsGUIBase::SetMovingImage(mitk::Image::Pointer movingImage) -{ - m_MovingImage = movingImage; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigidRegistrationTransformsGUIBase.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigidRegistrationTransformsGUIBase.h deleted file mode 100644 index 762611f6f9..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigidRegistrationTransformsGUIBase.h +++ /dev/null @@ -1,71 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkRigidRegistrationTransformsGUIBaseH -#define QmitkRigidRegistrationTransformsGUIBaseH - -#include "MitkRigidRegistrationUIExports.h" -#include "mitkImage.h" -#include "mitkOptimizerParameters.h" -#include "mitkTransformParameters.h" -#include -#include -#include -#include -#include -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkRigidRegistrationTransformsGUIBase : public QWidget -{ -public: - QmitkRigidRegistrationTransformsGUIBase(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkRigidRegistrationTransformsGUIBase(); - - virtual mitk::TransformParameters::TransformType GetTransformType() = 0; - - virtual itk::Object::Pointer GetTransform() = 0; - - virtual itk::Array GetTransformParameters() = 0; - - virtual void SetTransformParameters(itk::Array transformValues) = 0; - - virtual int GetNumberOfTransformParameters() = 0; - - virtual itk::Array GetScales() = 0; - - virtual QString GetName() = 0; - - virtual void SetupUI(QWidget *parent) = 0; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) = 0; - - void SetFixedImage(mitk::Image::Pointer fixedImage); - - void SetMovingImage(mitk::Image::Pointer movingImage); - -protected: - mitk::Image::Pointer m_FixedImage; - mitk::Image::Pointer m_MovingImage; -}; - -#endif // QmitkRigidRegistrationTransformsGUIBaseH diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformControls.ui deleted file mode 100644 index 015d12a8ab..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformControls.ui +++ /dev/null @@ -1,189 +0,0 @@ - - - QmitkScaleLogarithmicTransformControls - - - - 0 - 0 - 143 - 110 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - false - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale X: - - - false - - - - - - - - 50 - false - - - - Scale Y: - - - false - - - - - - - - 50 - false - - - - Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformView.cpp deleted file mode 100644 index 52647c4a55..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformView.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkScaleLogarithmicTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include - -QmitkScaleLogarithmicTransformView::QmitkScaleLogarithmicTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f) -{ -} - -QmitkScaleLogarithmicTransformView::~QmitkScaleLogarithmicTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkScaleLogarithmicTransformView::GetTransformType() -{ - return mitk::TransformParameters::SCALELOGARITHMICTRANSFORM; -} - -itk::Object::Pointer QmitkScaleLogarithmicTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessByItk(m_FixedImage, GetTransform2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkScaleLogarithmicTransformView::GetTransform2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::ScaleLogarithmicTransform::Pointer transformPointer = - itk::ScaleLogarithmicTransform::New(); - transformPointer->SetIdentity(); - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); -} - -itk::Array QmitkScaleLogarithmicTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(4); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesScaleLogarithmic->isChecked(); - transformValues[1] = m_Controls.m_ScalesScaleLogarithmicTransformScaleX->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesScaleLogarithmicTransformScaleY->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesScaleLogarithmicTransformScaleZ->text().toDouble(); - return transformValues; -} - -void QmitkScaleLogarithmicTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesScaleLogarithmic->setChecked(transformValues[0]); - m_Controls.m_ScalesScaleLogarithmicTransformScaleX->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesScaleLogarithmicTransformScaleY->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesScaleLogarithmicTransformScaleZ->setText(QString::number(transformValues[3])); -} - -QString QmitkScaleLogarithmicTransformView::GetName() -{ - return "ScaleLogarithmic"; -} - -void QmitkScaleLogarithmicTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesScaleLogarithmicTransformScaleX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleLogarithmicTransformScaleY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleLogarithmicTransformScaleZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkScaleLogarithmicTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(3); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesScaleLogarithmic->isChecked()) - { - scales[0] = m_Controls.m_ScalesScaleLogarithmicTransformScaleX->text().toDouble(); - scales[1] = m_Controls.m_ScalesScaleLogarithmicTransformScaleY->text().toDouble(); - scales[2] = m_Controls.m_ScalesScaleLogarithmicTransformScaleZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkScaleLogarithmicTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - for (unsigned int i = 0; i < transformParams.size(); i++) - { - vtkmatrix->SetElement(i, i, transformParams[i]); - } - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkScaleLogarithmicTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - { - m_Controls.m_ScalesScaleLogarithmicTransformScaleZ->hide(); - m_Controls.textLabel3_5_3->hide(); - return 2; - } - else - { - m_Controls.m_ScalesScaleLogarithmicTransformScaleZ->show(); - m_Controls.textLabel3_5_3->show(); - return 3; - } - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformView.h deleted file mode 100644 index d79a2dcdf2..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleLogarithmicTransformView.h +++ /dev/null @@ -1,66 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkScaleLogarithmicTransformViewWidgetHIncluded -#define QmitkScaleLogarithmicTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkScaleLogarithmicTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkScaleLogarithmicTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkScaleLogarithmicTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkScaleLogarithmicTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkScaleLogarithmicTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformControls.ui deleted file mode 100644 index c6ab53fa99..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformControls.ui +++ /dev/null @@ -1,710 +0,0 @@ - - - QmitkScaleSkewVersor3DTransformControls - - - - 0 - 0 - 173 - 456 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Versor 1: - - - false - - - - - - - - 50 - false - - - - Scale Versor 2: - - - false - - - - - - - - 50 - false - - - - Scale Versor 3: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - 50 - false - - - - Scale Scaling X: - - - false - - - - - - - - 50 - false - - - - Scale Scaling Y: - - - false - - - - - - - - 50 - false - - - - Scale Scaling Z: - - - false - - - - - - - - 50 - false - - - - Scale Skew 1: - - - false - - - - - - - - 50 - false - - - - Scale Skew 2: - - - false - - - - - - - - 50 - false - - - - Scale Skew 3: - - - false - - - - - - - - 50 - false - - - - Scale Skew 4: - - - false - - - - - - - - 50 - false - - - - Scale Skew 5: - - - false - - - - - - - - 50 - false - - - - Scale Skew 6: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp deleted file mode 100644 index 6dd102cfb2..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkScaleSkewVersor3DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkScaleSkewVersor3DTransformView::QmitkScaleSkewVersor3DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkScaleSkewVersor3DTransformView::~QmitkScaleSkewVersor3DTransformView() -{ -} -mitk::TransformParameters::TransformType QmitkScaleSkewVersor3DTransformView::GetTransformType() -{ - return mitk::TransformParameters::SCALESKEWVERSOR3DTRANSFORM; -} - -itk::Object::Pointer QmitkScaleSkewVersor3DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkScaleSkewVersor3DTransformView::GetTransform2( - itk::Image *itkImage1) -{ - if (VImageDimension == 3) - { - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImageType::Pointer fixedImage = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImageType::Pointer movingImage = movingImageToItk->GetOutput(); - - typename itk::ScaleSkewVersor3DTransform::Pointer transformPointer = - itk::ScaleSkewVersor3DTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->isChecked()) - { - typedef typename itk::ScaleSkewVersor3DTransform ScaleSkewVersor3DTransformType; - typedef - typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage); - transformInitializer->SetMovingImage(movingImage); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsScaleSkewVersorRigid3D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkScaleSkewVersor3DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(18); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->isChecked(); - transformValues[1] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->text().toDouble(); - transformValues[5] = m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->text().toDouble(); - transformValues[7] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->text().toDouble(); - transformValues[8] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->text().toDouble(); - transformValues[9] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->text().toDouble(); - transformValues[10] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->text().toDouble(); - transformValues[11] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->text().toDouble(); - transformValues[12] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->text().toDouble(); - transformValues[13] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->text().toDouble(); - transformValues[14] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->text().toDouble(); - transformValues[15] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->text().toDouble(); - transformValues[16] = m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->isChecked(); - transformValues[17] = m_Controls.m_MomentsScaleSkewVersorRigid3D->isChecked(); - return transformValues; -} - -void QmitkScaleSkewVersor3DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->setChecked(transformValues[0]); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->setText(QString::number(transformValues[4])); - m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->setText(QString::number(transformValues[6])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->setText(QString::number(transformValues[7])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->setText(QString::number(transformValues[8])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->setText(QString::number(transformValues[9])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->setText(QString::number(transformValues[10])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->setText(QString::number(transformValues[11])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->setText(QString::number(transformValues[12])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->setText(QString::number(transformValues[13])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->setText(QString::number(transformValues[14])); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->setText(QString::number(transformValues[15])); - m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->setChecked(transformValues[16]); - m_Controls.m_MomentsScaleSkewVersorRigid3D->setChecked(transformValues[17]); - m_Controls.m_GeometryScaleSkewVersorRigid3D->setChecked(!transformValues[17]); -} - -QString QmitkScaleSkewVersor3DTransformView::GetName() -{ - return "ScaleSkewVersor3D"; -} - -void QmitkScaleSkewVersor3DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkScaleSkewVersor3DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(15); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->isChecked()) - { - scales[0] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->text().toDouble(); - scales[4] = m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->text().toDouble(); - scales[5] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->text().toDouble(); - scales[6] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->text().toDouble(); - scales[7] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->text().toDouble(); - scales[8] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->text().toDouble(); - scales[9] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->text().toDouble(); - scales[10] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->text().toDouble(); - scales[11] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->text().toDouble(); - scales[12] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->text().toDouble(); - scales[13] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->text().toDouble(); - scales[14] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkScaleSkewVersor3DTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - itk::ScaleSkewVersor3DTransform::Pointer versorTransform = itk::ScaleSkewVersor3DTransform::New(); - versorTransform->SetParameters(transformParams); - itk::Matrix Matrix = versorTransform->GetMatrix(); - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - vtkmatrix->SetElement(i, j, Matrix[i][j]); - } - } - float center[4]; - float translation[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - vtkmatrix->MultiplyPoint(center, translation); - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[3]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[4]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[5]); - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkScaleSkewVersor3DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 0; - else - return 15; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.h deleted file mode 100644 index ccce47743a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.h +++ /dev/null @@ -1,71 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkScaleSkewVersor3DTransformViewWidgetHIncluded -#define QmitkScaleSkewVersor3DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkScaleSkewVersor3DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkScaleSkewVersor3DTransformView - : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkScaleSkewVersor3DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkScaleSkewVersor3DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkScaleSkewVersor3DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformControls.ui deleted file mode 100644 index becc6b2725..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformControls.ui +++ /dev/null @@ -1,192 +0,0 @@ - - - QmitkScaleTransformControls - - - - 0 - 0 - 143 - 110 - - - - Form - - - - 6 - - - 9 - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale X: - - - false - - - - - - - - 50 - false - - - - Scale Y: - - - false - - - - - - - - 50 - false - - - - Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformView.cpp deleted file mode 100644 index 0ca56bfebf..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformView.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkScaleTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include - -QmitkScaleTransformView::QmitkScaleTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f) -{ -} - -QmitkScaleTransformView::~QmitkScaleTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkScaleTransformView::GetTransformType() -{ - return mitk::TransformParameters::SCALETRANSFORM; -} - -itk::Object::Pointer QmitkScaleTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessByItk(m_FixedImage, GetTransform2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkScaleTransformView::GetTransform2(itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typename itk::ScaleTransform::Pointer transformPointer = - itk::ScaleTransform::New(); - transformPointer->SetIdentity(); - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); -} - -itk::Array QmitkScaleTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(4); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesScale->isChecked(); - transformValues[1] = m_Controls.m_ScalesScaleTransformScaleX->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesScaleTransformScaleY->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesScaleTransformScaleZ->text().toDouble(); - return transformValues; -} - -void QmitkScaleTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesScale->setChecked(transformValues[0]); - m_Controls.m_ScalesScaleTransformScaleX->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesScaleTransformScaleY->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesScaleTransformScaleZ->setText(QString::number(transformValues[3])); -} - -QString QmitkScaleTransformView::GetName() -{ - return "Scale"; -} - -void QmitkScaleTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesScaleTransformScaleX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleTransformScaleY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesScaleTransformScaleZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkScaleTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(3); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesScale->isChecked()) - { - scales[0] = m_Controls.m_ScalesScaleTransformScaleX->text().toDouble(); - scales[1] = m_Controls.m_ScalesScaleTransformScaleY->text().toDouble(); - scales[2] = m_Controls.m_ScalesScaleTransformScaleZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkScaleTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - for (unsigned int i = 0; i < transformParams.size(); i++) - { - vtkmatrix->SetElement(i, i, transformParams[i]); - } - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkScaleTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - { - m_Controls.m_ScalesScaleTransformScaleZ->hide(); - m_Controls.textLabel3_5->hide(); - return 2; - } - else - { - m_Controls.m_ScalesScaleTransformScaleZ->show(); - m_Controls.textLabel3_5->show(); - this->repaint(); - return 3; - } - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformView.h deleted file mode 100644 index 979460b412..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleTransformView.h +++ /dev/null @@ -1,66 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkScaleTransformViewWidgetHIncluded -#define QmitkScaleTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkScaleTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkScaleTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkScaleTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkScaleTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkScaleTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformControls.ui deleted file mode 100644 index 82a9bba6d4..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformControls.ui +++ /dev/null @@ -1,380 +0,0 @@ - - - QmitkSimilarity2DTransformControls - - - - 0 - 0 - 173 - 220 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Initial Scale: - - - false - - - - - - - - 50 - false - - - - Initial Angle: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.0 - - - Qt::AlignRight - - - - - - - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Scaling: - - - false - - - - - - - - 50 - false - - - - Scale Rotation: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 10.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp deleted file mode 100644 index 7b60c16115..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkSimilarity2DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkSimilarity2DTransformView::QmitkSimilarity2DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkSimilarity2DTransformView::~QmitkSimilarity2DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkSimilarity2DTransformView::GetTransformType() -{ - return mitk::TransformParameters::SIMILARITY2DTRANSFORM; -} - -itk::Object::Pointer QmitkSimilarity2DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkSimilarity2DTransformView::GetTransform2(itk::Image *itkImage1) -{ - if (VImageDimension == 2) - { - typedef typename itk::Image FixedImage2DType; - typedef typename itk::Image MovingImage2DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage2DType::Pointer fixedImage2D = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); - - typename itk::Similarity2DTransform::Pointer transformPointer = itk::Similarity2DTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerSimilarity2D->isChecked()) - { - typedef typename itk::Similarity2DTransform Similarity2DTransformType; - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage2D); - transformInitializer->SetMovingImage(movingImage2D); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsSimilarity2D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - transformPointer->SetScale(m_Controls.m_InitialScaleSimilarity2D->text().toFloat()); - transformPointer->SetAngle(m_Controls.m_AngleSimilarity2D->text().toFloat()); - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkSimilarity2DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(9); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesSimilarity2D->isChecked(); - transformValues[1] = m_Controls.m_ScalingScaleSimilarity2D->text().toDouble(); - transformValues[2] = m_Controls.m_RotationScaleSimilarity2D->text().toDouble(); - transformValues[3] = m_Controls.m_TranslationXScaleSimilarity2D->text().toDouble(); - transformValues[4] = m_Controls.m_TranslationYScaleSimilarity2D->text().toDouble(); - transformValues[5] = m_Controls.m_InitialScaleSimilarity2D->text().toFloat(); - transformValues[6] = m_Controls.m_AngleSimilarity2D->text().toFloat(); - transformValues[7] = m_Controls.m_CenterForInitializerSimilarity2D->isChecked(); - transformValues[8] = m_Controls.m_MomentsSimilarity2D->isChecked(); - return transformValues; -} - -void QmitkSimilarity2DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesSimilarity2D->setChecked(transformValues[0]); - m_Controls.m_ScalingScaleSimilarity2D->setText(QString::number(transformValues[1])); - m_Controls.m_RotationScaleSimilarity2D->setText(QString::number(transformValues[2])); - m_Controls.m_TranslationXScaleSimilarity2D->setText(QString::number(transformValues[3])); - m_Controls.m_TranslationYScaleSimilarity2D->setText(QString::number(transformValues[4])); - m_Controls.m_InitialScaleSimilarity2D->setText(QString::number(transformValues[5])); - m_Controls.m_AngleSimilarity2D->setText(QString::number(transformValues[6])); - m_Controls.m_CenterForInitializerSimilarity2D->setChecked(transformValues[7]); - m_Controls.m_MomentsSimilarity2D->setChecked(transformValues[8]); - m_Controls.m_GeometrySimilarity2D->setChecked(!transformValues[8]); -} - -QString QmitkSimilarity2DTransformView::GetName() -{ - return "Similarity2D"; -} - -void QmitkSimilarity2DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalingScaleSimilarity2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_RotationScaleSimilarity2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_TranslationXScaleSimilarity2D->setValidator(validatorLineEditInputFloat); - m_Controls.m_TranslationYScaleSimilarity2D->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkSimilarity2DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(4); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesSimilarity2D->isChecked()) - { - scales[0] = m_Controls.m_ScalingScaleSimilarity2D->text().toDouble(); - scales[1] = m_Controls.m_RotationScaleSimilarity2D->text().toDouble(); - scales[2] = m_Controls.m_TranslationXScaleSimilarity2D->text().toDouble(); - scales[3] = m_Controls.m_TranslationYScaleSimilarity2D->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkSimilarity2DTransformView::Transform(vtkMatrix4x4 * /* vtkmatrix */, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - mitk::ScalarType angle = transformParams[1] * 45.0 / atan(1.0); - vtktransform->PostMultiply(); - vtktransform->Scale(transformParams[0], transformParams[0], 1); - vtktransform->RotateZ(angle); - vtktransform->Translate(transformParams[2], transformParams[3], 0); - vtktransform->PreMultiply(); - } - return vtktransform; -} - -int QmitkSimilarity2DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 4; - else - return 0; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.h deleted file mode 100644 index abcb93a4eb..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkSimilarity2DTransformViewWidgetHIncluded -#define QmitkSimilarity2DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkSimilarity2DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkSimilarity2DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkSimilarity2DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkSimilarity2DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkSimilarity2DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformControls.ui deleted file mode 100644 index b647f95c5a..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformControls.ui +++ /dev/null @@ -1,406 +0,0 @@ - - - QmitkSimilarity3DTransformControls - - - - 0 - 0 - 173 - 248 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Scaling: - - - false - - - - - - - - 50 - false - - - - Scale Versor 1: - - - false - - - - - - - - 50 - false - - - - Scale Versor 2: - - - false - - - - - - - - 50 - false - - - - Scale Versor 3: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp deleted file mode 100644 index fb9aa35694..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkSimilarity3DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkSimilarity3DTransformView::QmitkSimilarity3DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkSimilarity3DTransformView::~QmitkSimilarity3DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkSimilarity3DTransformView::GetTransformType() -{ - return mitk::TransformParameters::SIMILARITY3DTRANSFORM; -} - -itk::Object::Pointer QmitkSimilarity3DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkSimilarity3DTransformView::GetTransform2(itk::Image *itkImage1) -{ - if (VImageDimension == 3) - { - typedef typename itk::Image FixedImage3DType; - typedef typename itk::Image MovingImage3DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage3DType::Pointer fixedImage = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage3DType::Pointer movingImage = movingImageToItk->GetOutput(); - - typename itk::Similarity3DTransform::Pointer transformPointer = itk::Similarity3DTransform::New(); - transformPointer->SetIdentity(); - if (m_Controls.m_CenterForInitializerSimilarity3D->isChecked()) - { - typedef typename itk::Similarity3DTransform Similarity3DTransformType; - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage); - transformInitializer->SetMovingImage(movingImage); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsSimilarity3D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkSimilarity3DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(10); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesSimilarity3D->isChecked(); - transformValues[1] = m_Controls.m_ScalesSimilarity3DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesSimilarity3DTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesSimilarity3DTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesSimilarity3DTransformScale4->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->text().toDouble(); - transformValues[7] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->text().toDouble(); - transformValues[8] = m_Controls.m_CenterForInitializerSimilarity3D->isChecked(); - transformValues[9] = m_Controls.m_MomentsSimilarity3D->isChecked(); - return transformValues; -} - -void QmitkSimilarity3DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesSimilarity3D->setChecked(transformValues[0]); - m_Controls.m_ScalesSimilarity3DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesSimilarity3DTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesSimilarity3DTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesSimilarity3DTransformScale4->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->setText(QString::number(transformValues[6])); - m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->setText(QString::number(transformValues[7])); - m_Controls.m_CenterForInitializerSimilarity3D->setChecked(transformValues[8]); - m_Controls.m_MomentsSimilarity3D->setChecked(transformValues[9]); - m_Controls.m_GeometrySimilarity3D->setChecked(!transformValues[9]); -} - -QString QmitkSimilarity3DTransformView::GetName() -{ - return "Similarity3D"; -} - -void QmitkSimilarity3DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesSimilarity3DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesSimilarity3DTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesSimilarity3DTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesSimilarity3DTransformScale4->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkSimilarity3DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(7); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesSimilarity3D->isChecked()) - { - scales[0] = m_Controls.m_ScalesSimilarity3DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesSimilarity3DTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesSimilarity3DTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesSimilarity3DTransformScale4->text().toDouble(); - scales[4] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->text().toDouble(); - scales[5] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->text().toDouble(); - scales[6] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkSimilarity3DTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - itk::Similarity3DTransform::Pointer similarityTransform = itk::Similarity3DTransform::New(); - similarityTransform->SetParameters(transformParams); - itk::Matrix Matrix = similarityTransform->GetMatrix(); - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - vtkmatrix->SetElement(i, j, Matrix[i][j]); - } - } - float center[4]; - float translation[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - vtkmatrix->MultiplyPoint(center, translation); - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[6]); - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkSimilarity3DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 0; - else - return 7; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.h deleted file mode 100644 index 717b305096..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkSimilarity3DTransformViewWidgetHIncluded -#define QmitkSimilarity3DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkSimilarity3DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkSimilarity3DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkSimilarity3DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkSimilarity3DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkSimilarity3DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformControls.ui deleted file mode 100644 index 99fadbf3fd..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformControls.ui +++ /dev/null @@ -1,201 +0,0 @@ - - - QmitkTranslationTransformControls - - - - 0 - 0 - 145 - 110 - - - - - 0 - 0 - - - - - 0 - 0 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - false - - - - 6 - - - 0 - - - - - - - - - - 50 - false - - - - Tranlsation X: - - - false - - - - - - - - 50 - false - - - - Translation Y: - - - false - - - - - - - - 50 - false - - - - Translation Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformView.cpp deleted file mode 100644 index ddf45a93ae..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformView.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkTranslationTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include - -QmitkTranslationTransformView::QmitkTranslationTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f) -{ -} - -QmitkTranslationTransformView::~QmitkTranslationTransformView() -{ -} - -itk::Object::Pointer QmitkTranslationTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessByItk(m_FixedImage, GetTransform2); - return m_TransformObject; - } - return nullptr; -} - -mitk::TransformParameters::TransformType QmitkTranslationTransformView::GetTransformType() -{ - return mitk::TransformParameters::TRANSLATIONTRANSFORM; -} - -template -itk::Object::Pointer QmitkTranslationTransformView::GetTransform2( - itk::Image * /*itkImage1*/) -{ - typedef typename itk::Image FixedImageType; - typedef typename itk::Image MovingImageType; - typedef itk::TranslationTransform TransformType; - typename TransformType::Pointer transform = TransformType::New(); - transform->SetIdentity(); - m_TransformObject = transform; - return transform.GetPointer(); -} - -itk::Array QmitkTranslationTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(4); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesTranslation->isChecked(); - transformValues[1] = m_Controls.m_ScalesTranslationTransformTranslationX->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesTranslationTransformTranslationY->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesTranslationTransformTranslationZ->text().toDouble(); - return transformValues; -} - -void QmitkTranslationTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesTranslation->setChecked(transformValues[0]); - m_Controls.m_ScalesTranslationTransformTranslationX->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesTranslationTransformTranslationY->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesTranslationTransformTranslationZ->setText(QString::number(transformValues[3])); -} - -QString QmitkTranslationTransformView::GetName() -{ - return "Translation"; -} - -void QmitkTranslationTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesTranslationTransformTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesTranslationTransformTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesTranslationTransformTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkTranslationTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(3); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesTranslation->isChecked()) - { - scales[0] = m_Controls.m_ScalesTranslationTransformTranslationX->text().toDouble(); - scales[1] = m_Controls.m_ScalesTranslationTransformTranslationY->text().toDouble(); - scales[2] = m_Controls.m_ScalesTranslationTransformTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkTranslationTransformView::Transform(vtkMatrix4x4 * /*vtkmatrix*/, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - if (transformParams.size() == 2) - { - vtktransform->Translate(transformParams[0], transformParams[1], 0); - } - else if (transformParams.size() == 3) - { - vtktransform->Translate(transformParams[0], transformParams[1], transformParams[2]); - std::cout << "Translation is: " << transformParams[0] << transformParams[1] << transformParams[2] << std::endl; - } - } - return vtktransform; -} - -int QmitkTranslationTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - { - m_Controls.m_ScalesTranslationTransformTranslationZ->hide(); - m_Controls.textLabel4_4_2->hide(); - - return 2; - } - else - { - m_Controls.m_ScalesTranslationTransformTranslationZ->show(); - m_Controls.textLabel4_4_2->show(); - - return 3; - } - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformView.h deleted file mode 100644 index 5d3a5e1081..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkTranslationTransformView.h +++ /dev/null @@ -1,66 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkTranslationTransformViewWidgetHIncluded -#define QmitkTranslationTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkTranslationTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkTranslationTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkTranslationTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkTranslationTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkTranslationTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformControls.ui deleted file mode 100644 index 39498320e2..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformControls.ui +++ /dev/null @@ -1,374 +0,0 @@ - - - QmitkVersorRigid3DTransformControls - - - - 0 - 0 - 173 - 222 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Versor 1: - - - false - - - - - - - - 50 - false - - - - Scale Versor 2: - - - false - - - - - - - - 50 - false - - - - Scale Versor 3: - - - false - - - - - - - - 50 - false - - - - Translation Scale X: - - - false - - - - - - - - 50 - false - - - - Translation Scale Y: - - - false - - - - - - - - 50 - false - - - - Translation Scale Z: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 0.001 - - - Qt::AlignRight - - - - - - - - - - - - - - - 75 - true - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp deleted file mode 100644 index ecba0b87c7..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkVersorRigid3DTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkVersorRigid3DTransformView::QmitkVersorRigid3DTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkVersorRigid3DTransformView::~QmitkVersorRigid3DTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkVersorRigid3DTransformView::GetTransformType() -{ - return mitk::TransformParameters::VERSORRIGID3DTRANSFORM; -} - -itk::Object::Pointer QmitkVersorRigid3DTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkVersorRigid3DTransformView::GetTransform2(itk::Image *itkImage1) -{ - if (VImageDimension == 3) - { - typedef typename itk::Image FixedImage3DType; - typedef typename itk::Image MovingImage3DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage3DType::Pointer fixedImage = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage3DType::Pointer movingImage = movingImageToItk->GetOutput(); - - typename itk::VersorRigid3DTransform::Pointer transformPointer = itk::VersorRigid3DTransform::New(); - transformPointer->SetIdentity(); - typedef typename itk::VersorRigid3DTransform VersorRigid3DTransformType; - if (m_Controls.m_CenterForInitializerVersorRigid3D->isChecked()) - { - typedef - typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage); - transformInitializer->SetMovingImage(movingImage); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsVersorRigid3D->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - typedef VersorRigid3DTransformType::VersorType VersorType; - typedef VersorType::VectorType VectorType; - - VersorType rotation; - VectorType axis; - - axis[0] = 0.0; - axis[1] = 0.0; - axis[2] = 1.0; - - const double angle = 0; - - rotation.Set(axis, angle); - - transformPointer->SetRotation(rotation); - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkVersorRigid3DTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(9); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesVersorRigid3D->isChecked(); - transformValues[1] = m_Controls.m_ScalesVersorRigid3DTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesVersorRigid3DTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesVersorRigid3DTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->text().toDouble(); - transformValues[5] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->text().toDouble(); - transformValues[6] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->text().toDouble(); - transformValues[7] = m_Controls.m_CenterForInitializerVersorRigid3D->isChecked(); - transformValues[8] = m_Controls.m_MomentsVersorRigid3D->isChecked(); - return transformValues; -} - -void QmitkVersorRigid3DTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesVersorRigid3D->setChecked(transformValues[0]); - m_Controls.m_ScalesVersorRigid3DTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesVersorRigid3DTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesVersorRigid3DTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->setText(QString::number(transformValues[4])); - m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->setText(QString::number(transformValues[5])); - m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->setText(QString::number(transformValues[6])); - m_Controls.m_CenterForInitializerVersorRigid3D->setChecked(transformValues[7]); - m_Controls.m_MomentsVersorRigid3D->setChecked(transformValues[8]); - m_Controls.m_GeometryVersorRigid3D->setChecked(!transformValues[8]); -} - -QString QmitkVersorRigid3DTransformView::GetName() -{ - return "VersorRigid3D"; -} - -void QmitkVersorRigid3DTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesVersorRigid3DTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesVersorRigid3DTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesVersorRigid3DTransformScale3->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkVersorRigid3DTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(6); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesVersorRigid3D->isChecked()) - { - scales[0] = m_Controls.m_ScalesVersorRigid3DTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesVersorRigid3DTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesVersorRigid3DTransformScale3->text().toDouble(); - scales[3] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->text().toDouble(); - scales[4] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->text().toDouble(); - scales[5] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkVersorRigid3DTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - itk::VersorRigid3DTransform::Pointer versorTransform = itk::VersorRigid3DTransform::New(); - versorTransform->SetParameters(transformParams); - itk::Matrix Matrix = versorTransform->GetMatrix(); - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - vtkmatrix->SetElement(i, j, Matrix[i][j]); - } - } - float center[4]; - float translation[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - vtkmatrix->MultiplyPoint(center, translation); - vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[3]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[4]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[5]); - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkVersorRigid3DTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 0; - else - return 6; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.h deleted file mode 100644 index 220c07ac6d..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkVersorRigid3DTransformViewWidgetHIncluded -#define QmitkVersorRigid3DTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkVersorRigid3DTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkVersorRigid3DTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkVersorRigid3DTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkVersorRigid3DTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkVersorRigid3DTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformControls.ui b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformControls.ui deleted file mode 100644 index 2b484f20e8..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformControls.ui +++ /dev/null @@ -1,251 +0,0 @@ - - - QmitkVersorTransformControls - - - - 0 - 0 - 160 - 146 - - - - Form - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - Use Optimizer Scales - - - true - - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - Scale Versor 1: - - - false - - - - - - - - 50 - false - - - - Scale Versor 2: - - - false - - - - - - - - 50 - false - - - - Scale Versor 3: - - - false - - - - - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - 0 - 20 - - - - - 50 - false - - - - 1.0 - - - Qt::AlignRight - - - - - - - - - - - - - - Center for Initializer - - - true - - - true - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Geometry - - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - Moments - - - true - - - - - - - - - - - - - - diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.cpp deleted file mode 100644 index 593d6de206..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkVersorTransformView.h" -#include "mitkImageAccessByItk.h" -#include -#include -#include -#include - -QmitkVersorTransformView::QmitkVersorTransformView(QWidget *parent, Qt::WindowFlags f) - : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) -{ -} - -QmitkVersorTransformView::~QmitkVersorTransformView() -{ -} - -mitk::TransformParameters::TransformType QmitkVersorTransformView::GetTransformType() -{ - return mitk::TransformParameters::VERSORTRANSFORM; -} - -itk::Object::Pointer QmitkVersorTransformView::GetTransform() -{ - if (m_FixedImage.IsNotNull()) - { - AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); - return m_TransformObject; - } - return nullptr; -} - -template -itk::Object::Pointer QmitkVersorTransformView::GetTransform2(itk::Image *itkImage1) -{ - if (VImageDimension == 3) - { - typedef typename itk::Image FixedImage3DType; - typedef typename itk::Image MovingImage3DType; - - // the fixedImage is the input parameter (fix for Bug #14626) - typename FixedImage3DType::Pointer fixedImage = itkImage1; - - // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) - typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); - movingImageToItk->SetInput(m_MovingImage); - movingImageToItk->Update(); - typename MovingImage3DType::Pointer movingImage = movingImageToItk->GetOutput(); - - typename itk::VersorTransform::Pointer transformPointer = itk::VersorTransform::New(); - transformPointer->SetIdentity(); - typedef typename itk::VersorTransform VersorTransformType; - if (m_Controls.m_CenterForInitializerVersor->isChecked()) - { - typedef typename itk::CenteredTransformInitializer - TransformInitializerType; - typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage(fixedImage); - transformInitializer->SetMovingImage(movingImage); - transformInitializer->SetTransform(transformPointer); - if (m_Controls.m_MomentsVersor->isChecked()) - { - transformInitializer->MomentsOn(); - } - else - { - transformInitializer->GeometryOn(); - } - transformInitializer->InitializeTransform(); - } - m_CenterX = transformPointer->GetCenter()[0]; - m_CenterY = transformPointer->GetCenter()[1]; - m_CenterZ = transformPointer->GetCenter()[2]; - m_TransformObject = transformPointer.GetPointer(); - return transformPointer.GetPointer(); - } - return nullptr; -} - -itk::Array QmitkVersorTransformView::GetTransformParameters() -{ - itk::Array transformValues; - transformValues.SetSize(6); - transformValues.fill(0); - transformValues[0] = m_Controls.m_UseOptimizerScalesVersor->isChecked(); - transformValues[1] = m_Controls.m_ScalesVersorTransformScale1->text().toDouble(); - transformValues[2] = m_Controls.m_ScalesVersorTransformScale2->text().toDouble(); - transformValues[3] = m_Controls.m_ScalesVersorTransformScale3->text().toDouble(); - transformValues[4] = m_Controls.m_CenterForInitializerVersor->isChecked(); - transformValues[5] = m_Controls.m_MomentsVersor->isChecked(); - return transformValues; -} - -void QmitkVersorTransformView::SetTransformParameters(itk::Array transformValues) -{ - m_Controls.m_UseOptimizerScalesVersor->setChecked(transformValues[0]); - m_Controls.m_ScalesVersorTransformScale1->setText(QString::number(transformValues[1])); - m_Controls.m_ScalesVersorTransformScale2->setText(QString::number(transformValues[2])); - m_Controls.m_ScalesVersorTransformScale3->setText(QString::number(transformValues[3])); - m_Controls.m_CenterForInitializerVersor->setChecked(transformValues[4]); - m_Controls.m_MomentsVersor->setChecked(transformValues[5]); - m_Controls.m_GeometryVersor->setChecked(!transformValues[5]); -} - -QString QmitkVersorTransformView::GetName() -{ - return "Versor"; -} - -void QmitkVersorTransformView::SetupUI(QWidget *parent) -{ - m_Controls.setupUi(parent); - QValidator *validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); - m_Controls.m_ScalesVersorTransformScale1->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesVersorTransformScale2->setValidator(validatorLineEditInputFloat); - m_Controls.m_ScalesVersorTransformScale3->setValidator(validatorLineEditInputFloat); -} - -itk::Array QmitkVersorTransformView::GetScales() -{ - itk::Array scales; - scales.SetSize(3); - scales.Fill(1.0); - if (m_Controls.m_UseOptimizerScalesVersor->isChecked()) - { - scales[0] = m_Controls.m_ScalesVersorTransformScale1->text().toDouble(); - scales[1] = m_Controls.m_ScalesVersorTransformScale2->text().toDouble(); - scales[2] = m_Controls.m_ScalesVersorTransformScale3->text().toDouble(); - } - return scales; -} - -vtkTransform *QmitkVersorTransformView::Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) -{ - if (m_MovingImage.IsNotNull()) - { - itk::VersorTransform::Pointer versorTransform = itk::VersorTransform::New(); - versorTransform->SetParameters(transformParams); - itk::Matrix Matrix = versorTransform->GetMatrix(); - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 3; j++) - { - vtkmatrix->SetElement(i, j, Matrix[i][j]); - } - } - float center[4]; - float translation[4]; - center[0] = m_CenterX; - center[1] = m_CenterY; - center[2] = m_CenterZ; - center[3] = 1; - vtkmatrix->MultiplyPoint(center, translation); - vtkmatrix->SetElement(0, 3, -translation[0] + center[0]); - vtkmatrix->SetElement(1, 3, -translation[1] + center[1]); - vtkmatrix->SetElement(2, 3, -translation[2] + center[2]); - vtktransform->SetMatrix(vtkmatrix); - } - return vtktransform; -} - -int QmitkVersorTransformView::GetNumberOfTransformParameters() -{ - if (m_FixedImage.IsNotNull()) - { - if (m_FixedImage->GetDimension() == 2) - return 0; - else - return 3; - } - else - return 0; -} diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.h b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.h deleted file mode 100644 index 4a2c7f06fc..0000000000 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.h +++ /dev/null @@ -1,70 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkVersorTransformViewWidgetHIncluded -#define QmitkVersorTransformViewWidgetHIncluded - -#include "MitkRigidRegistrationUIExports.h" -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "ui_QmitkVersorTransformControls.h" -#include - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class MITKRIGIDREGISTRATIONUI_EXPORT QmitkVersorTransformView : public QmitkRigidRegistrationTransformsGUIBase -{ -public: - QmitkVersorTransformView(QWidget *parent = nullptr, Qt::WindowFlags f = nullptr); - ~QmitkVersorTransformView(); - - virtual mitk::TransformParameters::TransformType GetTransformType() override; - - virtual itk::Object::Pointer GetTransform() override; - - virtual itk::Array GetTransformParameters() override; - - virtual void SetTransformParameters(itk::Array transformValues) override; - - virtual QString GetName() override; - - virtual void SetupUI(QWidget *parent) override; - - virtual itk::Array GetScales() override; - - virtual vtkTransform *Transform(vtkMatrix4x4 *vtkmatrix, - vtkTransform *vtktransform, - itk::Array transformParams) override; - - virtual int GetNumberOfTransformParameters() override; - -private: - template - itk::Object::Pointer GetTransform2(itk::Image *itkImage1); - -protected: - Ui::QmitkVersorTransformControls m_Controls; - - itk::Object::Pointer m_TransformObject; - - double m_CenterX; - double m_CenterY; - double m_CenterZ; -}; - -#endif diff --git a/Modules/RigidRegistrationUI/files.cmake b/Modules/RigidRegistrationUI/files.cmake deleted file mode 100644 index 25f183a8f6..0000000000 --- a/Modules/RigidRegistrationUI/files.cmake +++ /dev/null @@ -1,98 +0,0 @@ -set(CPP_FILES - RigidRegistrationMetrics/QmitkRigidRegistrationMetricsGUIBase.cpp - RigidRegistrationMetrics/QmitkMeanSquaresMetricView.cpp - RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricView.cpp - RigidRegistrationMetrics/QmitkGradientDifferenceMetricView.cpp - RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricView.cpp - RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricView.cpp - RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricView.cpp - RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricView.cpp - RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricView.cpp - RigidRegistrationMetrics/QmitkMattesMutualInformationMetricView.cpp - RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricView.cpp - RigidRegistrationMetrics/QmitkMutualInformationMetricView.cpp - RigidRegistrationMetrics/QmitkMatchCardinalityMetricView.cpp - RigidRegistrationMetrics/QmitkKappaStatisticMetricView.cpp - RigidRegistrationOptimizer/QmitkRigidRegistrationOptimizerGUIBase.cpp - RigidRegistrationOptimizer/QmitkExhaustiveOptimizerView.cpp - RigidRegistrationOptimizer/QmitkGradientDescentOptimizerView.cpp - RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerView.cpp - RigidRegistrationOptimizer/QmitkLBFGSBOptimizerView.cpp - RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerView.cpp - RigidRegistrationOptimizer/QmitkPowellOptimizerView.cpp - RigidRegistrationOptimizer/QmitkFRPROptimizerView.cpp - RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerView.cpp - RigidRegistrationOptimizer/QmitkVersorTransformOptimizerView.cpp - RigidRegistrationOptimizer/QmitkAmoebaOptimizerView.cpp - RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerView.cpp - RigidRegistrationOptimizer/QmitkLBFGSOptimizerView.cpp - RigidRegistrationOptimizer/QmitkSPSAOptimizerView.cpp - RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerView.cpp - RigidRegistrationTransforms/QmitkRigidRegistrationTransformsGUIBase.cpp - RigidRegistrationTransforms/QmitkTranslationTransformView.cpp - RigidRegistrationTransforms/QmitkScaleTransformView.cpp - RigidRegistrationTransforms/QmitkScaleLogarithmicTransformView.cpp - RigidRegistrationTransforms/QmitkAffineTransformView.cpp - RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp - #RigidRegistrationTransforms/QmitkRigid3DTransformView.cpp - RigidRegistrationTransforms/QmitkEuler3DTransformView.cpp - RigidRegistrationTransforms/QmitkCenteredEuler3DTransformView.cpp - RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp - RigidRegistrationTransforms/QmitkVersorTransformView.cpp - RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp - RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp - RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp - RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp - RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp - RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp - RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp - RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp -) - -set(UI_FILES - RigidRegistrationMetrics/QmitkMeanSquaresMetricControls.ui - RigidRegistrationMetrics/QmitkNormalizedCorrelationMetricControls.ui - RigidRegistrationMetrics/QmitkGradientDifferenceMetricControls.ui - RigidRegistrationMetrics/QmitkKullbackLeiblerCompareHistogramMetricControls.ui - RigidRegistrationMetrics/QmitkCorrelationCoefficientHistogramMetricControls.ui - RigidRegistrationMetrics/QmitkMeanSquaresHistogramMetricControls.ui - RigidRegistrationMetrics/QmitkMutualInformationHistogramMetricControls.ui - RigidRegistrationMetrics/QmitkNormalizedMutualInformationHistogramMetricControls.ui - RigidRegistrationMetrics/QmitkMattesMutualInformationMetricControls.ui - RigidRegistrationMetrics/QmitkMeanReciprocalSquareDifferenceMetricControls.ui - RigidRegistrationMetrics/QmitkMutualInformationMetricControls.ui - RigidRegistrationMetrics/QmitkMatchCardinalityMetricControls.ui - RigidRegistrationMetrics/QmitkKappaStatisticMetricControls.ui - RigidRegistrationOptimizer/QmitkExhaustiveOptimizerControls.ui - RigidRegistrationOptimizer/QmitkGradientDescentOptimizerControls.ui - RigidRegistrationOptimizer/QmitkQuaternionRigidTransformGradientDescentOptimizerControls.ui - RigidRegistrationOptimizer/QmitkLBFGSBOptimizerControls.ui - RigidRegistrationOptimizer/QmitkOnePlusOneEvolutionaryOptimizerControls.ui - RigidRegistrationOptimizer/QmitkPowellOptimizerControls.ui - RigidRegistrationOptimizer/QmitkFRPROptimizerControls.ui - RigidRegistrationOptimizer/QmitkRegularStepGradientDescentOptimizerControls.ui - RigidRegistrationOptimizer/QmitkVersorTransformOptimizerControls.ui - RigidRegistrationOptimizer/QmitkAmoebaOptimizerControls.ui - RigidRegistrationOptimizer/QmitkConjugateGradientOptimizerControls.ui - RigidRegistrationOptimizer/QmitkLBFGSOptimizerControls.ui - RigidRegistrationOptimizer/QmitkSPSAOptimizerControls.ui - RigidRegistrationOptimizer/QmitkVersorRigid3DTransformOptimizerControls.ui - RigidRegistrationTransforms/QmitkTranslationTransformControls.ui - RigidRegistrationTransforms/QmitkScaleTransformControls.ui - RigidRegistrationTransforms/QmitkScaleLogarithmicTransformControls.ui - RigidRegistrationTransforms/QmitkAffineTransformControls.ui - RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformControls.ui - #RigidRegistrationTransforms/QmitkRigid3DTransformControls.ui - RigidRegistrationTransforms/QmitkEuler3DTransformControls.ui - RigidRegistrationTransforms/QmitkCenteredEuler3DTransformControls.ui - RigidRegistrationTransforms/QmitkQuaternionRigidTransformControls.ui - RigidRegistrationTransforms/QmitkVersorTransformControls.ui - RigidRegistrationTransforms/QmitkVersorRigid3DTransformControls.ui - RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformControls.ui - RigidRegistrationTransforms/QmitkSimilarity3DTransformControls.ui - RigidRegistrationTransforms/QmitkRigid2DTransformControls.ui - RigidRegistrationTransforms/QmitkCenteredRigid2DTransformControls.ui - RigidRegistrationTransforms/QmitkEuler2DTransformControls.ui - RigidRegistrationTransforms/QmitkSimilarity2DTransformControls.ui - RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformControls.ui -) \ No newline at end of file diff --git a/Plugins/PluginList.cmake b/Plugins/PluginList.cmake index 199198f500..9f962bfa35 100644 --- a/Plugins/PluginList.cmake +++ b/Plugins/PluginList.cmake @@ -1,98 +1,97 @@ # Plug-ins must be ordered according to their dependencies set(MITK_PLUGINS org.blueberry.core.runtime:ON org.blueberry.core.expressions:OFF org.blueberry.core.commands:OFF org.blueberry.core.jobs:OFF org.blueberry.ui.qt:OFF org.blueberry.ui.qt.help:OFF org.blueberry.ui.qt.log:ON org.blueberry.ui.qt.objectinspector:OFF #org.blueberry.test:ON #org.blueberry.uitest:ON #Testing/org.blueberry.core.runtime.tests:ON #Testing/org.blueberry.osgi.tests:ON org.mitk.core.services:ON org.mitk.gui.common:ON org.mitk.planarfigure:ON org.mitk.core.ext:OFF org.mitk.core.jobs:OFF org.mitk.simulation:OFF org.mitk.gui.qt.application:ON org.mitk.gui.qt.coreapplication:OFF org.mitk.gui.qt.ext:OFF org.mitk.gui.qt.extapplication:OFF org.mitk.gui.qt.common:ON org.mitk.gui.qt.stdmultiwidgeteditor:ON org.mitk.gui.qt.common.legacy:OFF org.mitk.gui.qt.cmdlinemodules:OFF org.mitk.gui.qt.diffusionimagingapp:OFF org.mitk.gui.qt.datamanager:ON org.mitk.gui.qt.datamanagerlight:OFF org.mitk.gui.qt.properties:ON org.mitk.gui.qt.basicimageprocessing:OFF org.mitk.gui.qt.dicom:OFF org.mitk.gui.qt.dicominspector:OFF org.mitk.gui.qt.diffusionimaging:OFF org.mitk.gui.qt.diffusionimaging.connectomics:OFF org.mitk.gui.qt.diffusionimaging.denoising:OFF org.mitk.gui.qt.diffusionimaging.fiberfox:OFF org.mitk.gui.qt.diffusionimaging.fiberprocessing:OFF org.mitk.gui.qt.diffusionimaging.ivim:OFF org.mitk.gui.qt.diffusionimaging.odfpeaks:OFF org.mitk.gui.qt.diffusionimaging.partialvolume:OFF org.mitk.gui.qt.diffusionimaging.preprocessing:OFF org.mitk.gui.qt.diffusionimaging.reconstruction:OFF org.mitk.gui.qt.diffusionimaging.registration:OFF org.mitk.gui.qt.diffusionimaging.tbss:OFF org.mitk.gui.qt.diffusionimaging.tractography:OFF org.mitk.gui.qt.dosevisualization:OFF org.mitk.gui.qt.geometrytools:OFF org.mitk.gui.qt.igtexamples:OFF org.mitk.gui.qt.igttracking:OFF org.mitk.gui.qt.openigtlink:OFF org.mitk.gui.qt.imagecropper:OFF org.mitk.gui.qt.imagenavigator:ON org.mitk.gui.qt.viewnavigator:OFF org.mitk.gui.qt.materialeditor:OFF org.mitk.gui.qt.measurementtoolbox:OFF org.mitk.gui.qt.moviemaker:OFF org.mitk.gui.qt.pointsetinteraction:OFF org.mitk.gui.qt.pointsetinteractionmultispectrum:OFF org.mitk.gui.qt.python:OFF - org.mitk.gui.qt.registration:OFF org.mitk.gui.qt.remeshing:OFF org.mitk.gui.qt.segmentation:OFF org.mitk.gui.qt.simulation:OFF org.mitk.gui.qt.aicpregistration:OFF org.mitk.gui.qt.renderwindowmanager:OFF org.mitk.gui.qt.toftutorial:OFF org.mitk.gui.qt.tofutil:OFF org.mitk.gui.qt.tubegraph:OFF org.mitk.gui.qt.ugvisualization:OFF org.mitk.gui.qt.ultrasound:OFF org.mitk.gui.qt.volumevisualization:OFF org.mitk.gui.qt.eventrecorder:OFF org.mitk.gui.qt.xnat:OFF org.mitk.gui.qt.igt.app.echotrack:OFF org.mitk.gui.qt.spectrocamrecorder:OFF org.mitk.gui.qt.classificationsegmentation:OFF org.mitk.gui.qt.overlaymanager:OFF org.mitk.gui.qt.multilabelsegmentation:OFF org.mitk.matchpoint.core.helper:OFF org.mitk.gui.qt.matchpoint.algorithm.browser:OFF org.mitk.gui.qt.matchpoint.algorithm.control:OFF org.mitk.gui.qt.matchpoint.algorithm.batch:OFF org.mitk.gui.qt.matchpoint.mapper:OFF org.mitk.gui.qt.matchpoint.framereg:OFF org.mitk.gui.qt.matchpoint.visualizer:OFF org.mitk.gui.qt.matchpoint.evaluator:OFF org.mitk.gui.qt.matchpoint.manipulator:OFF org.mitk.gui.qt.cest:OFF ) diff --git a/Plugins/org.mitk.gui.qt.basicimageprocessing/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.basicimageprocessing/manifest_headers.cmake index 64cf4a666d..1276fbfbfe 100644 --- a/Plugins/org.mitk.gui.qt.basicimageprocessing/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.basicimageprocessing/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Basic Image Processing") set(Plugin-Version "0.1") set(Plugin-Vendor "DKFZ; Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy) +set(Require-Plugin org.mitk.gui.qt.common) diff --git a/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.cpp b/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.cpp index dafbf0ad2c..8794178c8b 100644 --- a/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.cpp +++ b/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.cpp @@ -1,1430 +1,1430 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkBasicImageProcessingView.h" // QT includes (GUI) #include #include #include #include #include #include #include // Berry includes (selection service) #include #include // MITK includes (GUI) -#include "QmitkStdMultiWidget.h" #include "QmitkDataNodeSelectionProvider.h" #include "mitkDataNodeObject.h" // MITK includes (general) -#include "mitkNodePredicateDataType.h" -#include "mitkNodePredicateDimension.h" -#include "mitkNodePredicateAnd.h" -#include "mitkImageTimeSelector.h" -#include "mitkVectorImageMapper2D.h" -#include "mitkProperties.h" +#include +#include +#include +#include +#include +#include +#include // Includes for image casting between ITK and MITK -#include "mitkImageCast.h" -#include "mitkITKImageImport.h" +#include +#include // ITK includes (general) #include #include // Morphological Operations #include #include #include #include #include // Smoothing #include #include #include // Threshold #include // Inversion #include // Derivatives #include #include #include // Resampling #include #include #include #include #include // Image Arithmetics #include #include #include #include // Boolean operations #include #include #include // Flip Image #include #include #include // Convenient Definitions typedef itk::Image ImageType; typedef itk::Image SegmentationImageType; typedef itk::Image DoubleImageType; typedef itk::Image, 3> VectorImageType; typedef itk::BinaryBallStructuringElement BallType; typedef itk::GrayscaleDilateImageFilter DilationFilterType; typedef itk::GrayscaleErodeImageFilter ErosionFilterType; typedef itk::GrayscaleMorphologicalOpeningImageFilter OpeningFilterType; typedef itk::GrayscaleMorphologicalClosingImageFilter ClosingFilterType; typedef itk::MedianImageFilter< ImageType, ImageType > MedianFilterType; typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType> GaussianFilterType; typedef itk::TotalVariationDenoisingImageFilter TotalVariationFilterType; typedef itk::TotalVariationDenoisingImageFilter VectorTotalVariationFilterType; typedef itk::BinaryThresholdImageFilter< ImageType, ImageType > ThresholdFilterType; typedef itk::InvertIntensityImageFilter< ImageType, ImageType > InversionFilterType; typedef itk::GradientMagnitudeRecursiveGaussianImageFilter< ImageType, ImageType > GradientFilterType; typedef itk::LaplacianImageFilter< DoubleImageType, DoubleImageType > LaplacianFilterType; typedef itk::SobelEdgeDetectionImageFilter< DoubleImageType, DoubleImageType > SobelFilterType; typedef itk::ResampleImageFilter< ImageType, ImageType > ResampleImageFilterType; typedef itk::ResampleImageFilter< ImageType, ImageType > ResampleImageFilterType2; typedef itk::CastImageFilter< ImageType, DoubleImageType > ImagePTypeToFloatPTypeCasterType; typedef itk::AddImageFilter< ImageType, ImageType, ImageType > AddFilterType; typedef itk::SubtractImageFilter< ImageType, ImageType, ImageType > SubtractFilterType; typedef itk::MultiplyImageFilter< ImageType, ImageType, ImageType > MultiplyFilterType; typedef itk::DivideImageFilter< ImageType, ImageType, DoubleImageType > DivideFilterType; typedef itk::OrImageFilter< ImageType, ImageType > OrImageFilterType; typedef itk::AndImageFilter< ImageType, ImageType > AndImageFilterType; typedef itk::XorImageFilter< ImageType, ImageType > XorImageFilterType; typedef itk::FlipImageFilter< ImageType > FlipImageFilterType; typedef itk::LinearInterpolateImageFunction< ImageType, double > LinearInterpolatorType; typedef itk::NearestNeighborInterpolateImageFunction< ImageType, double > NearestInterpolatorType; QmitkBasicImageProcessing::QmitkBasicImageProcessing() : QmitkAbstractView(), m_Controls(NULL), m_SelectedImageNode(NULL), m_TimeStepperAdapter(NULL) { } QmitkBasicImageProcessing::~QmitkBasicImageProcessing() { //berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); //if(s) // s->RemoveSelectionListener(m_SelectionListener); } void QmitkBasicImageProcessing::CreateQtPartControl(QWidget *parent) { if (m_Controls == NULL) { m_Controls = new Ui::QmitkBasicImageProcessingViewControls; m_Controls->setupUi(parent); this->CreateConnections(); //setup predictaes for combobox mitk::NodePredicateDimension::Pointer dimensionPredicate = mitk::NodePredicateDimension::New(3); mitk::NodePredicateDataType::Pointer imagePredicate = mitk::NodePredicateDataType::New("Image"); m_Controls->m_ImageSelector2->SetDataStorage(this->GetDataStorage()); m_Controls->m_ImageSelector2->SetPredicate(mitk::NodePredicateAnd::New(dimensionPredicate, imagePredicate)); } m_Controls->gbTwoImageOps->hide(); m_SelectedImageNode = mitk::DataStorageSelection::New(this->GetDataStorage(), false); // Setup Controls this->m_Controls->cbWhat1->clear(); this->m_Controls->cbWhat1->insertItem(NOACTIONSELECTED, "Please select operation"); this->m_Controls->cbWhat1->insertItem(CATEGORY_DENOISING, "--- Denoising ---"); this->m_Controls->cbWhat1->insertItem(GAUSSIAN, "Gaussian"); this->m_Controls->cbWhat1->insertItem(MEDIAN, "Median"); this->m_Controls->cbWhat1->insertItem(TOTALVARIATION, "Total Variation"); this->m_Controls->cbWhat1->insertItem(CATEGORY_MORPHOLOGICAL, "--- Morphological ---"); this->m_Controls->cbWhat1->insertItem(DILATION, "Dilation"); this->m_Controls->cbWhat1->insertItem(EROSION, "Erosion"); this->m_Controls->cbWhat1->insertItem(OPENING, "Opening"); this->m_Controls->cbWhat1->insertItem(CLOSING, "Closing"); this->m_Controls->cbWhat1->insertItem(CATEGORY_EDGE_DETECTION, "--- Edge Detection ---"); this->m_Controls->cbWhat1->insertItem(GRADIENT, "Gradient"); this->m_Controls->cbWhat1->insertItem(LAPLACIAN, "Laplacian (2nd Derivative)"); this->m_Controls->cbWhat1->insertItem(SOBEL, "Sobel Operator"); this->m_Controls->cbWhat1->insertItem(CATEGORY_MISC, "--- Misc ---"); this->m_Controls->cbWhat1->insertItem(THRESHOLD, "Threshold"); this->m_Controls->cbWhat1->insertItem(INVERSION, "Image Inversion"); this->m_Controls->cbWhat1->insertItem(DOWNSAMPLING, "Downsampling"); this->m_Controls->cbWhat1->insertItem(FLIPPING, "Flipping"); this->m_Controls->cbWhat1->insertItem(RESAMPLING, "Resample to"); this->m_Controls->cbWhat1->insertItem(RESCALE, "Rescale values to interval"); this->m_Controls->cbWhat1->insertItem(RESCALE2, "Rescale values by scalar"); this->m_Controls->cbWhat2->clear(); this->m_Controls->cbWhat2->insertItem(TWOIMAGESNOACTIONSELECTED, "Please select on operation"); this->m_Controls->cbWhat2->insertItem(CATEGORY_ARITHMETIC, "--- Arithmetric operations ---"); this->m_Controls->cbWhat2->insertItem(ADD, "Add to Image 1:"); this->m_Controls->cbWhat2->insertItem(SUBTRACT, "Subtract from Image 1:"); this->m_Controls->cbWhat2->insertItem(MULTIPLY, "Multiply with Image 1:"); this->m_Controls->cbWhat2->insertItem(RESAMPLE_TO, "Resample Image 1 to fit geometry:"); this->m_Controls->cbWhat2->insertItem(DIVIDE, "Divide Image 1 by:"); this->m_Controls->cbWhat2->insertItem(CATEGORY_BOOLEAN, "--- Boolean operations ---"); this->m_Controls->cbWhat2->insertItem(AND, "AND"); this->m_Controls->cbWhat2->insertItem(OR, "OR"); this->m_Controls->cbWhat2->insertItem(XOR, "XOR"); this->m_Controls->cbParam4->clear(); this->m_Controls->cbParam4->insertItem(LINEAR, "Linear"); this->m_Controls->cbParam4->insertItem(NEAREST, "Nearest neighbor"); m_Controls->dsbParam1->hide(); m_Controls->dsbParam2->hide(); m_Controls->dsbParam3->hide(); m_Controls->tlParam3->hide(); m_Controls->tlParam4->hide(); m_Controls->cbParam4->hide(); } void QmitkBasicImageProcessing::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->cbWhat1), SIGNAL( activated(int) ), this, SLOT( SelectAction(int) ) ); connect( (QObject*)(m_Controls->btnDoIt), SIGNAL(clicked()),(QObject*) this, SLOT(StartButtonClicked())); connect( (QObject*)(m_Controls->cbWhat2), SIGNAL( activated(int) ), this, SLOT( SelectAction2(int) ) ); connect( (QObject*)(m_Controls->btnDoIt2), SIGNAL(clicked()),(QObject*) this, SLOT(StartButton2Clicked())); connect( (QObject*)(m_Controls->rBOneImOp), SIGNAL( clicked() ), this, SLOT( ChangeGUI() ) ); connect( (QObject*)(m_Controls->rBTwoImOp), SIGNAL( clicked() ), this, SLOT( ChangeGUI() ) ); connect( (QObject*)(m_Controls->cbParam4), SIGNAL( activated(int) ), this, SLOT( SelectInterpolator(int) ) ); } } void QmitkBasicImageProcessing::InternalGetTimeNavigationController() { auto renwin_part = GetRenderWindowPart(); if( renwin_part != nullptr ) { auto tnc = renwin_part->GetTimeNavigationController(); if( tnc != nullptr ) { m_TimeStepperAdapter = new QmitkStepperAdapter((QObject*) m_Controls->sliceNavigatorTime, tnc->GetTime(), "sliceNavigatorTimeFromBIP"); } } } void QmitkBasicImageProcessing::SetFocus() { m_Controls->rBOneImOp->setFocus(); } //datamanager selection changed void QmitkBasicImageProcessing::OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList& nodes) { //any nodes there? if (!nodes.empty()) { // reset GUI // this->ResetOneImageOpPanel(); m_Controls->sliceNavigatorTime->setEnabled(false); m_Controls->leImage1->setText(tr("Select an Image in Data Manager")); m_Controls->tlWhat1->setEnabled(false); m_Controls->cbWhat1->setEnabled(false); m_Controls->tlWhat2->setEnabled(false); m_Controls->cbWhat2->setEnabled(false); m_SelectedImageNode->RemoveAllNodes(); //get the selected Node mitk::DataNode* _DataNode = nodes.front(); *m_SelectedImageNode = _DataNode; //try to cast to image mitk::Image::Pointer tempImage = dynamic_cast(m_SelectedImageNode->GetNode()->GetData()); //no image if( tempImage.IsNull() || (tempImage->IsInitialized() == false) ) { m_Controls->leImage1->setText(tr("Not an image.")); return; } //2D image if( tempImage->GetDimension() < 3) { m_Controls->leImage1->setText(tr("2D images are not supported.")); return; } //image m_Controls->leImage1->setText(QString(m_SelectedImageNode->GetNode()->GetName().c_str())); // button coding if ( tempImage->GetDimension() > 3 ) { // try to retrieve the TNC (for 4-D Processing ) this->InternalGetTimeNavigationController(); m_Controls->sliceNavigatorTime->setEnabled(true); m_Controls->tlTime->setEnabled(true); } m_Controls->tlWhat1->setEnabled(true); m_Controls->cbWhat1->setEnabled(true); m_Controls->tlWhat2->setEnabled(true); m_Controls->cbWhat2->setEnabled(true); } } void QmitkBasicImageProcessing::ChangeGUI() { if(m_Controls->rBOneImOp->isChecked()) { m_Controls->gbTwoImageOps->hide(); m_Controls->gbOneImageOps->show(); } else if(m_Controls->rBTwoImOp->isChecked()) { m_Controls->gbOneImageOps->hide(); m_Controls->gbTwoImageOps->show(); } } void QmitkBasicImageProcessing::ResetOneImageOpPanel() { m_Controls->tlParam1->setText(tr("Param1")); m_Controls->tlParam2->setText(tr("Param2")); m_Controls->cbWhat1->setCurrentIndex(0); m_Controls->tlTime->setEnabled(false); this->ResetParameterPanel(); m_Controls->btnDoIt->setEnabled(false); m_Controls->cbHideOrig->setEnabled(false); } void QmitkBasicImageProcessing::ResetParameterPanel() { m_Controls->tlParam->setEnabled(false); m_Controls->tlParam1->setEnabled(false); m_Controls->tlParam2->setEnabled(false); m_Controls->tlParam3->setEnabled(false); m_Controls->tlParam4->setEnabled(false); m_Controls->sbParam1->setEnabled(false); m_Controls->sbParam2->setEnabled(false); m_Controls->dsbParam1->setEnabled(false); m_Controls->dsbParam2->setEnabled(false); m_Controls->dsbParam3->setEnabled(false); m_Controls->cbParam4->setEnabled(false); m_Controls->sbParam1->setValue(0); m_Controls->sbParam2->setValue(0); m_Controls->dsbParam1->setValue(0); m_Controls->dsbParam2->setValue(0); m_Controls->dsbParam3->setValue(0); m_Controls->sbParam1->show(); m_Controls->sbParam2->show(); m_Controls->dsbParam1->hide(); m_Controls->dsbParam2->hide(); m_Controls->dsbParam3->hide(); m_Controls->cbParam4->hide(); m_Controls->tlParam3->hide(); m_Controls->tlParam4->hide(); } void QmitkBasicImageProcessing::ResetTwoImageOpPanel() { m_Controls->cbWhat2->setCurrentIndex(0); m_Controls->tlImage2->setEnabled(false); m_Controls->m_ImageSelector2->setEnabled(false); m_Controls->btnDoIt2->setEnabled(false); } void QmitkBasicImageProcessing::SelectAction(int action) { if ( ! m_SelectedImageNode->GetNode() ) return; // Prepare GUI this->ResetParameterPanel(); m_Controls->btnDoIt->setEnabled(false); m_Controls->cbHideOrig->setEnabled(false); QString text1 = tr("No Parameters"); QString text2 = text1; QString text3 = text1; QString text4 = text1; if (action != 19) { m_Controls->dsbParam1->hide(); m_Controls->dsbParam2->hide(); m_Controls->dsbParam3->hide(); m_Controls->tlParam1->show(); m_Controls->tlParam2->show(); m_Controls->tlParam3->hide(); m_Controls->tlParam4->hide(); m_Controls->sbParam1->show(); m_Controls->sbParam2->show(); m_Controls->cbParam4->hide(); } // check which operation the user has selected and set parameters and GUI accordingly switch (action) { case 2: { m_SelectedAction = GAUSSIAN; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->hide(); m_Controls->dsbParam1->show(); m_Controls->dsbParam1->setEnabled(true); text1 = tr("&Variance:"); m_Controls->tlParam2->hide(); m_Controls->sbParam2->hide(); m_Controls->dsbParam1->setMinimum( 0 ); m_Controls->dsbParam1->setMaximum( 200 ); m_Controls->dsbParam1->setValue( 2 ); break; } case 3: { m_SelectedAction = MEDIAN; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); text1 = tr("&Radius:"); m_Controls->sbParam1->setMinimum( 0 ); m_Controls->sbParam1->setMaximum( 200 ); m_Controls->sbParam1->setValue( 3 ); break; } case 4: { m_SelectedAction = TOTALVARIATION; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); m_Controls->tlParam2->setEnabled(true); m_Controls->sbParam2->setEnabled(true); text1 = tr("Number Iterations:"); text2 = tr("Regularization\n(Lambda/1000):"); m_Controls->sbParam1->setMinimum( 1 ); m_Controls->sbParam1->setMaximum( 1000 ); m_Controls->sbParam1->setValue( 40 ); m_Controls->sbParam2->setMinimum( 0 ); m_Controls->sbParam2->setMaximum( 100000 ); m_Controls->sbParam2->setValue( 1 ); break; } case 6: { m_SelectedAction = DILATION; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); text1 = tr("&Radius:"); m_Controls->sbParam1->setMinimum( 0 ); m_Controls->sbParam1->setMaximum( 200 ); m_Controls->sbParam1->setValue( 3 ); break; } case 7: { m_SelectedAction = EROSION; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); text1 = tr("&Radius:"); m_Controls->sbParam1->setMinimum( 0 ); m_Controls->sbParam1->setMaximum( 200 ); m_Controls->sbParam1->setValue( 3 ); break; } case 8: { m_SelectedAction = OPENING; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); text1 = tr("&Radius:"); m_Controls->sbParam1->setMinimum( 0 ); m_Controls->sbParam1->setMaximum( 200 ); m_Controls->sbParam1->setValue( 3 ); break; } case 9: { m_SelectedAction = CLOSING; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); text1 = tr("&Radius:"); m_Controls->sbParam1->setMinimum( 0 ); m_Controls->sbParam1->setMaximum( 200 ); m_Controls->sbParam1->setValue( 3 ); break; } case 11: { m_SelectedAction = GRADIENT; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->hide(); m_Controls->dsbParam1->show(); m_Controls->dsbParam1->setEnabled(true); text1 = tr("Sigma of Gaussian Kernel:\n(in Image Spacing Units)"); m_Controls->tlParam2->hide(); m_Controls->sbParam2->hide(); m_Controls->dsbParam1->setMinimum( 0 ); m_Controls->dsbParam1->setMaximum( 200 ); m_Controls->dsbParam1->setValue( 2 ); break; } case 12: { m_SelectedAction = LAPLACIAN; break; } case 13: { m_SelectedAction = SOBEL; break; } case 15: { m_SelectedAction = THRESHOLD; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); m_Controls->tlParam2->setEnabled(true); m_Controls->sbParam2->setEnabled(true); text1 = tr("Lower threshold:"); text2 = tr("Upper threshold:"); m_Controls->sbParam1->setMinimum( -100000 ); m_Controls->sbParam1->setMaximum( 100000 ); m_Controls->sbParam1->setValue( 0 ); m_Controls->sbParam2->setMinimum( -100000 ); m_Controls->sbParam2->setMaximum( 100000 ); m_Controls->sbParam2->setValue( 300 ); break; } case 16: { m_SelectedAction = INVERSION; break; } case 17: { m_SelectedAction = DOWNSAMPLING; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); text1 = tr("Downsampling by Factor:"); m_Controls->sbParam1->setMinimum( 1 ); m_Controls->sbParam1->setMaximum( 100 ); m_Controls->sbParam1->setValue( 2 ); break; } case 18: { m_SelectedAction = FLIPPING; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(true); text1 = tr("Flip across axis:"); m_Controls->sbParam1->setMinimum( 0 ); m_Controls->sbParam1->setMaximum( 2 ); m_Controls->sbParam1->setValue( 1 ); break; } case 19: { m_SelectedAction = RESAMPLING; m_Controls->tlParam1->setEnabled(true); m_Controls->sbParam1->setEnabled(false); m_Controls->sbParam1->hide(); m_Controls->dsbParam1->show(); m_Controls->dsbParam1->setEnabled(true); m_Controls->tlParam2->setEnabled(true); m_Controls->sbParam2->setEnabled(false); m_Controls->sbParam2->hide(); m_Controls->dsbParam2->show(); m_Controls->dsbParam2->setEnabled(true); m_Controls->tlParam3->show(); m_Controls->tlParam3->setEnabled(true); m_Controls->dsbParam3->show(); m_Controls->dsbParam3->setEnabled(true); m_Controls->tlParam4->show(); m_Controls->tlParam4->setEnabled(true); m_Controls->cbParam4->show(); m_Controls->cbParam4->setEnabled(true); m_Controls->dsbParam1->setMinimum(0.01); m_Controls->dsbParam1->setMaximum(10.0); m_Controls->dsbParam1->setSingleStep(0.1); m_Controls->dsbParam1->setValue(0.3); m_Controls->dsbParam2->setMinimum(0.01); m_Controls->dsbParam2->setMaximum(10.0); m_Controls->dsbParam2->setSingleStep(0.1); m_Controls->dsbParam2->setValue(0.3); m_Controls->dsbParam3->setMinimum(0.01); m_Controls->dsbParam3->setMaximum(10.0); m_Controls->dsbParam3->setSingleStep(0.1); m_Controls->dsbParam3->setValue(1.5); text1 = tr("x-spacing:"); text2 = tr("y-spacing:"); text3 = tr("z-spacing:"); text4 = tr("Interplation:"); break; } case 20: { m_SelectedAction = RESCALE; m_Controls->dsbParam1->show(); m_Controls->tlParam1->show(); m_Controls->dsbParam1->setEnabled(true); m_Controls->tlParam1->setEnabled(true); m_Controls->dsbParam2->show(); m_Controls->tlParam2->show(); m_Controls->dsbParam2->setEnabled(true); m_Controls->tlParam2->setEnabled(true); text1 = tr("Output minimum:"); text2 = tr("Output maximum:"); break; } case 21: { m_SelectedAction = RESCALE2; m_Controls->dsbParam1->show(); m_Controls->tlParam1->show(); m_Controls->dsbParam1->setEnabled(true); m_Controls->tlParam1->setEnabled(true); text1 = tr("Scaling value:"); break; } default: return; } m_Controls->tlParam->setEnabled(true); m_Controls->tlParam1->setText(text1); m_Controls->tlParam2->setText(text2); m_Controls->tlParam3->setText(text3); m_Controls->tlParam4->setText(text4); m_Controls->btnDoIt->setEnabled(true); m_Controls->cbHideOrig->setEnabled(true); } void QmitkBasicImageProcessing::StartButtonClicked() { if(!m_SelectedImageNode->GetNode()) return; this->BusyCursorOn(); mitk::Image::Pointer newImage; try { newImage = dynamic_cast(m_SelectedImageNode->GetNode()->GetData()); } catch ( std::exception &e ) { QString exceptionString = tr("An error occured during image loading:\n"); exceptionString.append( e.what() ); QMessageBox::warning( NULL, "Basic Image Processing", exceptionString , QMessageBox::Ok, QMessageBox::NoButton ); this->BusyCursorOff(); return; } // check if input image is valid, casting does not throw exception when casting from 'NULL-Object' if ( (! newImage) || (newImage->IsInitialized() == false) ) { this->BusyCursorOff(); QMessageBox::warning( NULL, "Basic Image Processing", tr("Input image is broken or not initialized. Returning."), QMessageBox::Ok, QMessageBox::NoButton ); return; } // check if operation is done on 4D a image time step if(newImage->GetDimension() > 3) { mitk::ImageTimeSelector::Pointer timeSelector = mitk::ImageTimeSelector::New(); timeSelector->SetInput(newImage); timeSelector->SetTimeNr( ((QmitkSliderNavigatorWidget*)m_Controls->sliceNavigatorTime)->GetPos() ); timeSelector->Update(); newImage = timeSelector->GetOutput(); } // check if image or vector image ImageType::Pointer itkImage = ImageType::New(); VectorImageType::Pointer itkVecImage = VectorImageType::New(); int isVectorImage = newImage->GetPixelType().GetNumberOfComponents(); if(isVectorImage > 1) { CastToItkImage( newImage, itkVecImage ); } else { CastToItkImage( newImage, itkImage ); } std::stringstream nameAddition(""); int param1 = m_Controls->sbParam1->value(); int param2 = m_Controls->sbParam2->value(); double dparam1 = m_Controls->dsbParam1->value(); double dparam2 = m_Controls->dsbParam2->value(); double dparam3 = m_Controls->dsbParam3->value(); try{ switch (m_SelectedAction) { case GAUSSIAN: { GaussianFilterType::Pointer gaussianFilter = GaussianFilterType::New(); gaussianFilter->SetInput( itkImage ); gaussianFilter->SetVariance( dparam1 ); gaussianFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(gaussianFilter->GetOutput())->Clone(); nameAddition << "_Gaussian_var_" << dparam1; std::cout << "Gaussian filtering successful." << std::endl; break; } case MEDIAN: { MedianFilterType::Pointer medianFilter = MedianFilterType::New(); MedianFilterType::InputSizeType size; size.Fill(param1); medianFilter->SetRadius( size ); medianFilter->SetInput(itkImage); medianFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(medianFilter->GetOutput())->Clone(); nameAddition << "_Median_radius_" << param1; std::cout << "Median Filtering successful." << std::endl; break; } case TOTALVARIATION: { if(isVectorImage > 1) { VectorTotalVariationFilterType::Pointer TVFilter = VectorTotalVariationFilterType::New(); TVFilter->SetInput( itkVecImage.GetPointer() ); TVFilter->SetNumberIterations(param1); TVFilter->SetLambda(double(param2)/1000.); TVFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(TVFilter->GetOutput())->Clone(); } else { ImagePTypeToFloatPTypeCasterType::Pointer floatCaster = ImagePTypeToFloatPTypeCasterType::New(); floatCaster->SetInput( itkImage ); floatCaster->Update(); DoubleImageType::Pointer fImage = floatCaster->GetOutput(); TotalVariationFilterType::Pointer TVFilter = TotalVariationFilterType::New(); TVFilter->SetInput( fImage.GetPointer() ); TVFilter->SetNumberIterations(param1); TVFilter->SetLambda(double(param2)/1000.); TVFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(TVFilter->GetOutput())->Clone(); } nameAddition << "_TV_Iter_" << param1 << "_L_" << param2; std::cout << "Total Variation Filtering successful." << std::endl; break; } case DILATION: { BallType binaryBall; binaryBall.SetRadius( param1 ); binaryBall.CreateStructuringElement(); DilationFilterType::Pointer dilationFilter = DilationFilterType::New(); dilationFilter->SetInput( itkImage ); dilationFilter->SetKernel( binaryBall ); dilationFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(dilationFilter->GetOutput())->Clone(); nameAddition << "_Dilated_by_" << param1; std::cout << "Dilation successful." << std::endl; break; } case EROSION: { BallType binaryBall; binaryBall.SetRadius( param1 ); binaryBall.CreateStructuringElement(); ErosionFilterType::Pointer erosionFilter = ErosionFilterType::New(); erosionFilter->SetInput( itkImage ); erosionFilter->SetKernel( binaryBall ); erosionFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(erosionFilter->GetOutput())->Clone(); nameAddition << "_Eroded_by_" << param1; std::cout << "Erosion successful." << std::endl; break; } case OPENING: { BallType binaryBall; binaryBall.SetRadius( param1 ); binaryBall.CreateStructuringElement(); OpeningFilterType::Pointer openFilter = OpeningFilterType::New(); openFilter->SetInput( itkImage ); openFilter->SetKernel( binaryBall ); openFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(openFilter->GetOutput())->Clone(); nameAddition << "_Opened_by_" << param1; std::cout << "Opening successful." << std::endl; break; } case CLOSING: { BallType binaryBall; binaryBall.SetRadius( param1 ); binaryBall.CreateStructuringElement(); ClosingFilterType::Pointer closeFilter = ClosingFilterType::New(); closeFilter->SetInput( itkImage ); closeFilter->SetKernel( binaryBall ); closeFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(closeFilter->GetOutput())->Clone(); nameAddition << "_Closed_by_" << param1; std::cout << "Closing successful." << std::endl; break; } case GRADIENT: { GradientFilterType::Pointer gradientFilter = GradientFilterType::New(); gradientFilter->SetInput( itkImage ); gradientFilter->SetSigma( dparam1 ); gradientFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(gradientFilter->GetOutput())->Clone(); nameAddition << "_Gradient_sigma_" << dparam1; std::cout << "Gradient calculation successful." << std::endl; break; } case LAPLACIAN: { // the laplace filter requires a float type image as input, we need to cast the itkImage // to correct type ImagePTypeToFloatPTypeCasterType::Pointer caster = ImagePTypeToFloatPTypeCasterType::New(); caster->SetInput( itkImage ); caster->Update(); DoubleImageType::Pointer fImage = caster->GetOutput(); LaplacianFilterType::Pointer laplacianFilter = LaplacianFilterType::New(); laplacianFilter->SetInput( fImage ); laplacianFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(laplacianFilter->GetOutput())->Clone(); nameAddition << "_Second_Derivative"; std::cout << "Laplacian filtering successful." << std::endl; break; } case SOBEL: { // the sobel filter requires a float type image as input, we need to cast the itkImage // to correct type ImagePTypeToFloatPTypeCasterType::Pointer caster = ImagePTypeToFloatPTypeCasterType::New(); caster->SetInput( itkImage ); caster->Update(); DoubleImageType::Pointer fImage = caster->GetOutput(); SobelFilterType::Pointer sobelFilter = SobelFilterType::New(); sobelFilter->SetInput( fImage ); sobelFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(sobelFilter->GetOutput())->Clone(); nameAddition << "_Sobel"; std::cout << "Edge Detection successful." << std::endl; break; } case THRESHOLD: { ThresholdFilterType::Pointer thFilter = ThresholdFilterType::New(); thFilter->SetLowerThreshold(param1 < param2 ? param1 : param2); thFilter->SetUpperThreshold(param2 > param1 ? param2 : param1); thFilter->SetInsideValue(1); thFilter->SetOutsideValue(0); thFilter->SetInput(itkImage); thFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(thFilter->GetOutput())->Clone(); nameAddition << "_Threshold"; std::cout << "Thresholding successful." << std::endl; break; } case INVERSION: { InversionFilterType::Pointer invFilter = InversionFilterType::New(); mitk::ScalarType min = newImage->GetScalarValueMin(); mitk::ScalarType max = newImage->GetScalarValueMax(); invFilter->SetMaximum( max + min ); invFilter->SetInput(itkImage); invFilter->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(invFilter->GetOutput())->Clone(); nameAddition << "_Inverted"; std::cout << "Image inversion successful." << std::endl; break; } case DOWNSAMPLING: { ResampleImageFilterType::Pointer downsampler = ResampleImageFilterType::New(); downsampler->SetInput( itkImage ); NearestInterpolatorType::Pointer interpolator = NearestInterpolatorType::New(); downsampler->SetInterpolator( interpolator ); downsampler->SetDefaultPixelValue( 0 ); ResampleImageFilterType::SpacingType spacing = itkImage->GetSpacing(); spacing *= (double) param1; downsampler->SetOutputSpacing( spacing ); downsampler->SetOutputOrigin( itkImage->GetOrigin() ); downsampler->SetOutputDirection( itkImage->GetDirection() ); ResampleImageFilterType::SizeType size = itkImage->GetLargestPossibleRegion().GetSize(); for ( int i = 0; i < 3; ++i ) { size[i] /= param1; } downsampler->SetSize( size ); downsampler->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(downsampler->GetOutput())->Clone(); nameAddition << "_Downsampled_by_" << param1; std::cout << "Downsampling successful." << std::endl; break; } case FLIPPING: { FlipImageFilterType::Pointer flipper = FlipImageFilterType::New(); flipper->SetInput( itkImage ); itk::FixedArray flipAxes; for(int i=0; i<3; ++i) { if(i == param1) { flipAxes[i] = true; } else { flipAxes[i] = false; } } flipper->SetFlipAxes(flipAxes); flipper->UpdateLargestPossibleRegion(); newImage = mitk::ImportItkImage(flipper->GetOutput())->Clone(); std::cout << "Image flipping successful." << std::endl; break; } case RESAMPLING: { std::string selectedInterpolator; ResampleImageFilterType::Pointer resampler = ResampleImageFilterType::New(); switch (m_SelectedInterpolation) { case LINEAR: { LinearInterpolatorType::Pointer interpolator = LinearInterpolatorType::New(); resampler->SetInterpolator(interpolator); selectedInterpolator = "Linear"; break; } case NEAREST: { NearestInterpolatorType::Pointer interpolator = NearestInterpolatorType::New(); resampler->SetInterpolator(interpolator); selectedInterpolator = "Nearest"; break; } default: { LinearInterpolatorType::Pointer interpolator = LinearInterpolatorType::New(); resampler->SetInterpolator(interpolator); selectedInterpolator = "Linear"; break; } } resampler->SetInput( itkImage ); resampler->SetOutputOrigin( itkImage->GetOrigin() ); ImageType::SizeType input_size = itkImage->GetLargestPossibleRegion().GetSize(); ImageType::SpacingType input_spacing = itkImage->GetSpacing(); ImageType::SizeType output_size; ImageType::SpacingType output_spacing; output_size[0] = input_size[0] * (input_spacing[0] / dparam1); output_size[1] = input_size[1] * (input_spacing[1] / dparam2); output_size[2] = input_size[2] * (input_spacing[2] / dparam3); output_spacing [0] = dparam1; output_spacing [1] = dparam2; output_spacing [2] = dparam3; resampler->SetSize( output_size ); resampler->SetOutputSpacing( output_spacing ); resampler->SetOutputDirection( itkImage->GetDirection() ); resampler->UpdateLargestPossibleRegion(); ImageType::Pointer resampledImage = resampler->GetOutput(); newImage = mitk::ImportItkImage( resampledImage )->Clone(); nameAddition << "_Resampled_" << selectedInterpolator; std::cout << "Resampling successful." << std::endl; break; } case RESCALE: { DoubleImageType::Pointer floatImage = DoubleImageType::New(); CastToItkImage( newImage, floatImage ); itk::RescaleIntensityImageFilter::Pointer filter = itk::RescaleIntensityImageFilter::New(); filter->SetInput(0, floatImage); filter->SetOutputMinimum(dparam1); filter->SetOutputMaximum(dparam2); filter->Update(); floatImage = filter->GetOutput(); newImage = mitk::Image::New(); newImage->InitializeByItk(floatImage.GetPointer()); newImage->SetVolume(floatImage->GetBufferPointer()); nameAddition << "_Rescaled"; std::cout << "Rescaling successful." << std::endl; break; } case RESCALE2: { DoubleImageType::Pointer floatImage = DoubleImageType::New(); CastToItkImage( newImage, floatImage ); itk::ShiftScaleImageFilter::Pointer filter = itk::ShiftScaleImageFilter::New(); filter->SetInput(0, floatImage); filter->SetScale(dparam1); filter->Update(); floatImage = filter->GetOutput(); newImage = mitk::Image::New(); newImage->InitializeByItk(floatImage.GetPointer()); newImage->SetVolume(floatImage->GetBufferPointer()); nameAddition << "_Rescaled"; std::cout << "Rescaling successful." << std::endl; break; } default: this->BusyCursorOff(); return; } } catch (...) { this->BusyCursorOff(); QMessageBox::warning(NULL, "Warning", "Problem when applying filter operation. Check your input..."); return; } newImage->DisconnectPipeline(); // adjust level/window to new image mitk::LevelWindow levelwindow; levelwindow.SetAuto( newImage ); mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); levWinProp->SetLevelWindow( levelwindow ); // compose new image name std::string name = m_SelectedImageNode->GetNode()->GetName(); if (name.find(".pic.gz") == name.size() -7 ) { name = name.substr(0,name.size() -7); } name.append( nameAddition.str() ); // create final result MITK data storage node mitk::DataNode::Pointer result = mitk::DataNode::New(); result->SetProperty( "levelwindow", levWinProp ); result->SetProperty( "name", mitk::StringProperty::New( name.c_str() ) ); result->SetData( newImage ); // for vector images, a different mapper is needed if(isVectorImage > 1) { mitk::VectorImageMapper2D::Pointer mapper = mitk::VectorImageMapper2D::New(); result->SetMapper(1,mapper); } // reset GUI to ease further processing // this->ResetOneImageOpPanel(); // add new image to data storage and set as active to ease further processing GetDataStorage()->Add( result, m_SelectedImageNode->GetNode() ); if ( m_Controls->cbHideOrig->isChecked() == true ) m_SelectedImageNode->GetNode()->SetProperty( "visible", mitk::BoolProperty::New(false) ); // TODO!! m_Controls->m_ImageSelector1->SetSelectedNode(result); // show the results mitk::RenderingManager::GetInstance()->RequestUpdateAll(); this->BusyCursorOff(); } void QmitkBasicImageProcessing::SelectAction2(int operation) { // check which operation the user has selected and set parameters and GUI accordingly switch (operation) { case 2: m_SelectedOperation = ADD; break; case 3: m_SelectedOperation = SUBTRACT; break; case 4: m_SelectedOperation = MULTIPLY; break; case 5: m_SelectedOperation = DIVIDE; break; case 6: m_SelectedOperation = RESAMPLE_TO; break; case 8: m_SelectedOperation = AND; break; case 9: m_SelectedOperation = OR; break; case 10: m_SelectedOperation = XOR; break; default: // this->ResetTwoImageOpPanel(); return; } m_Controls->tlImage2->setEnabled(true); m_Controls->m_ImageSelector2->setEnabled(true); m_Controls->btnDoIt2->setEnabled(true); } void QmitkBasicImageProcessing::StartButton2Clicked() { mitk::Image::Pointer newImage1 = dynamic_cast (m_SelectedImageNode->GetNode()->GetData()); mitk::Image::Pointer newImage2 = dynamic_cast (m_Controls->m_ImageSelector2->GetSelectedNode()->GetData()); // check if images are valid if( (!newImage1) || (!newImage2) || (newImage1->IsInitialized() == false) || (newImage2->IsInitialized() == false) ) { itkGenericExceptionMacro(<< "At least one of the input images are broken or not initialized. Returning"); return; } this->BusyCursorOn(); // this->ResetTwoImageOpPanel(); // check if 4D image and use filter on correct time step if(newImage1->GetDimension() > 3) { mitk::ImageTimeSelector::Pointer timeSelector = mitk::ImageTimeSelector::New(); auto sn_widget = static_cast( m_Controls->sliceNavigatorTime ); int time = 0; if( sn_widget != nullptr ) time = sn_widget->GetPos(); timeSelector->SetInput(newImage1); timeSelector->SetTimeNr( time ); timeSelector->UpdateLargestPossibleRegion(); newImage1 = timeSelector->GetOutput(); newImage1->DisconnectPipeline(); timeSelector->SetInput(newImage2); timeSelector->SetTimeNr( time ); timeSelector->UpdateLargestPossibleRegion(); newImage2 = timeSelector->GetOutput(); newImage2->DisconnectPipeline(); } // reset GUI for better usability // this->ResetTwoImageOpPanel(); ImageType::Pointer itkImage1 = ImageType::New(); ImageType::Pointer itkImage2 = ImageType::New(); CastToItkImage( newImage1, itkImage1 ); CastToItkImage( newImage2, itkImage2 ); // Remove temp image // newImage2 = NULL; std::string nameAddition = ""; try { switch (m_SelectedOperation) { case ADD: { AddFilterType::Pointer addFilter = AddFilterType::New(); addFilter->SetInput1( itkImage1 ); addFilter->SetInput2( itkImage2 ); addFilter->UpdateLargestPossibleRegion(); newImage1 = mitk::ImportItkImage(addFilter->GetOutput())->Clone(); nameAddition = "_Added"; } break; case SUBTRACT: { SubtractFilterType::Pointer subFilter = SubtractFilterType::New(); subFilter->SetInput1( itkImage1 ); subFilter->SetInput2( itkImage2 ); subFilter->UpdateLargestPossibleRegion(); newImage1 = mitk::ImportItkImage(subFilter->GetOutput())->Clone(); nameAddition = "_Subtracted"; } break; case MULTIPLY: { MultiplyFilterType::Pointer multFilter = MultiplyFilterType::New(); multFilter->SetInput1( itkImage1 ); multFilter->SetInput2( itkImage2 ); multFilter->UpdateLargestPossibleRegion(); newImage1 = mitk::ImportItkImage(multFilter->GetOutput())->Clone(); nameAddition = "_Multiplied"; } break; case DIVIDE: { DivideFilterType::Pointer divFilter = DivideFilterType::New(); divFilter->SetInput1( itkImage1 ); divFilter->SetInput2( itkImage2 ); divFilter->UpdateLargestPossibleRegion(); newImage1 = mitk::ImportItkImage(divFilter->GetOutput())->Clone(); nameAddition = "_Divided"; } break; case AND: { AndImageFilterType::Pointer andFilter = AndImageFilterType::New(); andFilter->SetInput1( itkImage1 ); andFilter->SetInput2( itkImage2 ); andFilter->UpdateLargestPossibleRegion(); newImage1 = mitk::ImportItkImage(andFilter->GetOutput())->Clone(); nameAddition = "_AND"; break; } case OR: { OrImageFilterType::Pointer orFilter = OrImageFilterType::New(); orFilter->SetInput1( itkImage1 ); orFilter->SetInput2( itkImage2 ); orFilter->UpdateLargestPossibleRegion(); newImage1 = mitk::ImportItkImage(orFilter->GetOutput())->Clone(); nameAddition = "_OR"; break; } case XOR: { XorImageFilterType::Pointer xorFilter = XorImageFilterType::New(); xorFilter->SetInput1( itkImage1 ); xorFilter->SetInput2( itkImage2 ); xorFilter->UpdateLargestPossibleRegion(); newImage1 = mitk::ImportItkImage(xorFilter->GetOutput())->Clone(); nameAddition = "_XOR"; break; } case RESAMPLE_TO: { itk::BSplineInterpolateImageFunction::Pointer bspl_interpolator = itk::BSplineInterpolateImageFunction::New(); bspl_interpolator->SetSplineOrder( 3 ); itk::NearestNeighborInterpolateImageFunction< DoubleImageType >::Pointer nn_interpolator = itk::NearestNeighborInterpolateImageFunction< DoubleImageType>::New(); DoubleImageType::Pointer itkImage1 = DoubleImageType::New(); DoubleImageType::Pointer itkImage2 = DoubleImageType::New(); CastToItkImage( newImage1, itkImage1 ); CastToItkImage( newImage2, itkImage2 ); itk::ResampleImageFilter< DoubleImageType, DoubleImageType >::Pointer resampleFilter = itk::ResampleImageFilter< DoubleImageType, DoubleImageType >::New(); resampleFilter->SetInput( itkImage1 ); resampleFilter->SetReferenceImage( itkImage2 ); resampleFilter->SetUseReferenceImage( true ); // use NN interp with binary images if( m_SelectedImageNode->GetNode()->GetProperty("binary") ) resampleFilter->SetInterpolator( nn_interpolator ); else resampleFilter->SetInterpolator( bspl_interpolator ); resampleFilter->SetDefaultPixelValue( 0 ); try { resampleFilter->UpdateLargestPossibleRegion(); } catch( const itk::ExceptionObject &e) { MITK_WARN << "Updating resampling filter failed. "; MITK_WARN << "REASON: " << e.what(); } DoubleImageType::Pointer resampledImage = resampleFilter->GetOutput(); newImage1 = mitk::ImportItkImage( resampledImage )->Clone(); nameAddition = "_Resampled"; break; } default: std::cout << "Something went wrong..." << std::endl; this->BusyCursorOff(); return; } } catch (const itk::ExceptionObject& e ) { this->BusyCursorOff(); QMessageBox::warning(NULL, "ITK Exception", e.what() ); QMessageBox::warning(NULL, "Warning", tr("Problem when applying arithmetic operation to two images. Check dimensions of input images.")); return; } // disconnect pipeline; images will not be reused newImage1->DisconnectPipeline(); itkImage1 = NULL; itkImage2 = NULL; // adjust level/window to new image and compose new image name mitk::LevelWindow levelwindow; levelwindow.SetAuto( newImage1 ); mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); levWinProp->SetLevelWindow( levelwindow ); std::string name = m_SelectedImageNode->GetNode()->GetName(); if (name.find(".pic.gz") == name.size() -7 ) { name = name.substr(0,name.size() -7); } // create final result MITK data storage node mitk::DataNode::Pointer result = mitk::DataNode::New(); result->SetProperty( "levelwindow", levWinProp ); result->SetProperty( "name", mitk::StringProperty::New( (name + nameAddition ).c_str() )); result->SetData( newImage1 ); GetDataStorage()->Add( result, m_SelectedImageNode->GetNode() ); // show only the newly created image m_SelectedImageNode->GetNode()->SetProperty( "visible", mitk::BoolProperty::New(false) ); m_Controls->m_ImageSelector2->GetSelectedNode()->SetProperty( "visible", mitk::BoolProperty::New(false) ); // show the newly created image mitk::RenderingManager::GetInstance()->RequestUpdateAll(); this->BusyCursorOff(); } void QmitkBasicImageProcessing::SelectInterpolator(int interpolator) { switch (interpolator) { case 0: { m_SelectedInterpolation = LINEAR; break; } case 1: { m_SelectedInterpolation = NEAREST; break; } } } diff --git a/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.h b/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.h index e166a06af8..701e63cf51 100644 --- a/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.h +++ b/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingView.h @@ -1,189 +1,187 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #if !defined(QmitkBasicImageProcessingView_H__INCLUDED) #define QmitkBasicImageProcessingView_H__INCLUDED #include #include #include "ui_QmitkBasicImageProcessingViewControls.h" #include "QmitkStepperAdapter.h" #include /*! \brief This module allows to use some basic image processing filters for preprocessing, image enhancement and testing purposes Several basic ITK image processing filters, like denoising, morphological and edge detection are encapsulated in this module and can be selected via a list and an intuitive parameter input. The selected filter will be applied on the image, and a new image showing the output is displayed as result. Also, some image arithmetic operations are available. Images can be 3D or 4D. In the 4D case, the filters work on the 3D image selected via the time slider. The result is also a 3D image. -\sa QmitkFunctionality, QObject - \class QmitkBasicImageProcessing \author Tobias Schwarz \version 1.0 (3M3) \date 2009-05-10 \ingroup Bundles */ class BASICIMAGEPROCESSING_EXPORT QmitkBasicImageProcessing : public QmitkAbstractView { Q_OBJECT public: /*! \brief default constructor */ QmitkBasicImageProcessing(); /*! \brief default destructor */ virtual ~QmitkBasicImageProcessing(); /*! \brief method for creating the widget containing the application controls, like sliders, buttons etc. */ virtual void CreateQtPartControl(QWidget *parent) override; virtual void SetFocus() override; /*! \brief method for creating the connections of main and control widget */ virtual void CreateConnections(); /*! \brief Invoked when the DataManager selection changed */ - virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList& nodes) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; protected slots: /* * When an action is selected in the "one image ops" list box */ void SelectAction(int action); /* * When an action is selected in the "two image ops" list box */ void SelectAction2(int operation); /* * The "Execute" button in the "one image ops" box was triggered */ void StartButtonClicked(); /* * The "Execute" button in the "two image ops" box was triggered */ void StartButton2Clicked(); /* * Switch between the one and the two image operations GUI */ void ChangeGUI(); void SelectInterpolator(int interpolator); private: /* * After a one image operation, reset the "one image ops" panel */ void ResetOneImageOpPanel(); /* * Helper method to reset the parameter set panel */ void ResetParameterPanel(); /* * After a two image operation, reset the "two image ops" panel */ void ResetTwoImageOpPanel(); /** retrieve the tnc from renderwindow part */ void InternalGetTimeNavigationController(); /*! * controls containing sliders for scrolling through the slices */ Ui::QmitkBasicImageProcessingViewControls *m_Controls; //mitk::DataNode* m_SelectedImageNode; mitk::DataStorageSelection::Pointer m_SelectedImageNode; QmitkStepperAdapter* m_TimeStepperAdapter; enum ActionType { NOACTIONSELECTED, CATEGORY_DENOISING, GAUSSIAN, MEDIAN, TOTALVARIATION, CATEGORY_MORPHOLOGICAL, DILATION, EROSION, OPENING, CLOSING, CATEGORY_EDGE_DETECTION, GRADIENT, LAPLACIAN, SOBEL, CATEGORY_MISC, THRESHOLD, INVERSION, DOWNSAMPLING, FLIPPING, RESAMPLING, RESCALE, RESCALE2 } m_SelectedAction; enum OperationType{ TWOIMAGESNOACTIONSELECTED, CATEGORY_ARITHMETIC, ADD, SUBTRACT, MULTIPLY, DIVIDE, RESAMPLE_TO, CATEGORY_BOOLEAN, AND, OR, XOR } m_SelectedOperation; enum InterpolationType{ LINEAR, NEAREST } m_SelectedInterpolation; }; #endif // !defined(QmitkBasicImageProcessing_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.datamanager/src/mitkIContextMenuAction.h b/Plugins/org.mitk.gui.qt.datamanager/src/mitkIContextMenuAction.h index e2b283bb39..fa3dabbc5c 100644 --- a/Plugins/org.mitk.gui.qt.datamanager/src/mitkIContextMenuAction.h +++ b/Plugins/org.mitk.gui.qt.datamanager/src/mitkIContextMenuAction.h @@ -1,55 +1,53 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef mitkIContextMenuAction_H_ #define mitkIContextMenuAction_H_ #include #include #include #include #include "mitkDataStorage.h" -class QmitkStdMultiWidget; - namespace mitk { /** * A context menu action, which is linked to the context menu
* through an extension point. For an example check the
* plugin.xml and the connected classes of
* the the segmentation bundle and also the QmitkDataManagerView.cpp
* in this bundle. */ struct IContextMenuAction { /** * @brief Executes the action, that linked to the context menu entry. */ virtual void Run( const QList& selectedNodes ) = 0; // Setters virtual void SetDataStorage(mitk::DataStorage* dataStorage) = 0; virtual void SetSmoothed(bool smoothed) = 0; virtual void SetDecimated(bool decimated) = 0; virtual void SetFunctionality(berry::QtViewPart* functionality) = 0; }; } Q_DECLARE_INTERFACE(mitk::IContextMenuAction, "org.mitk.datamanager.IContextMenuAction") #endif // mitkIContextMenuAction_H_ diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.cpp index 4e3f633a63..1b16665c5f 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.cpp @@ -1,533 +1,522 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // ####### Blueberry includes ####### #include #include // ####### Qmitk includes ####### #include "QmitkConnectomicsDataView.h" -#include "QmitkStdMultiWidget.h" // ####### Qt includes ####### #include // ####### ITK includes ####### #include // ####### MITK includes ####### #include #include "mitkConnectomicsSyntheticNetworkGenerator.h" #include "mitkConnectomicsSimulatedAnnealingManager.h" #include "mitkConnectomicsSimulatedAnnealingPermutationModularity.h" #include "mitkConnectomicsSimulatedAnnealingCostFunctionModularity.h" #include // Includes for image casting between ITK and MITK #include "mitkImageCast.h" #include "mitkITKImageImport.h" #include "mitkImageAccessByItk.h" const std::string QmitkConnectomicsDataView::VIEW_ID = "org.mitk.views.connectomicsdata"; QmitkConnectomicsDataView::QmitkConnectomicsDataView() -: QmitkFunctionality() +: QmitkAbstractView() , m_Controls( 0 ) -, m_MultiWidget( NULL ) , m_ConnectomicsNetworkCreator( mitk::ConnectomicsNetworkCreator::New() ) , m_demomode( false ) , m_currentIndex( 0 ) { } QmitkConnectomicsDataView::~QmitkConnectomicsDataView() { } void QmitkConnectomicsDataView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkConnectomicsDataViewControls; m_Controls->setupUi( parent ); QObject::connect( m_Controls->networkifyPushButton, SIGNAL(clicked()), this, SLOT(OnNetworkifyPushButtonClicked()) ); QObject::connect( m_Controls->syntheticNetworkCreationPushButton, SIGNAL(clicked()), this, SLOT(OnSyntheticNetworkCreationPushButtonClicked()) ); QObject::connect( (QObject*)( m_Controls->syntheticNetworkComboBox ), SIGNAL(currentIndexChanged (int)), this, SLOT(OnSyntheticNetworkComboBoxCurrentIndexChanged(int)) ); QObject::connect( m_Controls->createCorrelationMatrixPushButton, SIGNAL(clicked()), this, SLOT(OnCreateCorrelationMatrixPushButtonClicked()) ); } // GUI is different for developer and demo mode m_demomode = true; if( m_demomode ) { this->m_Controls->networkifyPushButton->show(); this->m_Controls->networkifyPushButton->setText( "Create Network" ); this->m_Controls->syntheticNetworkOptionsGroupBox->show(); //--------------------------- fill comboBox--------------------------- this->m_Controls->syntheticNetworkComboBox->insertItem(0,"Regular lattice"); this->m_Controls->syntheticNetworkComboBox->insertItem(1,"Heterogenic sphere"); this->m_Controls->syntheticNetworkComboBox->insertItem(2,"Random network"); this->m_Controls->mappingStrategyComboBox->insertItem(m_ConnectomicsNetworkCreator->EndElementPosition, "Use label of end position of fibers"); this->m_Controls->mappingStrategyComboBox->insertItem(m_ConnectomicsNetworkCreator->EndElementPositionAvoidingWhiteMatter, "Extrapolate label"); } else { this->m_Controls->networkifyPushButton->show(); this->m_Controls->networkifyPushButton->setText( "Networkify" ); this->m_Controls->syntheticNetworkOptionsGroupBox->show(); //--------------------------- fill comboBox--------------------------- this->m_Controls->syntheticNetworkComboBox->insertItem(0,"Regular lattice"); this->m_Controls->syntheticNetworkComboBox->insertItem(1,"Heterogenic sphere"); this->m_Controls->syntheticNetworkComboBox->insertItem(2,"Random network"); this->m_Controls->syntheticNetworkComboBox->insertItem(3,"Scale free network"); this->m_Controls->syntheticNetworkComboBox->insertItem(4,"Small world network"); this->m_Controls->mappingStrategyComboBox->insertItem(m_ConnectomicsNetworkCreator->EndElementPosition, "Use label of end position of fibers"); this->m_Controls->mappingStrategyComboBox->insertItem(m_ConnectomicsNetworkCreator->EndElementPositionAvoidingWhiteMatter, "Extrapolate label"); this->m_Controls->mappingStrategyComboBox->insertItem(m_ConnectomicsNetworkCreator->JustEndPointVerticesNoLabel, "Use end position of fibers, no label"); } this->WipeDisplay(); } -void QmitkConnectomicsDataView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkConnectomicsDataView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkConnectomicsDataView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->mappingStrategyComboBox->setFocus(); } void QmitkConnectomicsDataView::WipeDisplay() { m_Controls->lblWarning->setVisible( true ); m_Controls->inputImageOneNameLabel->setText( mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_DASH ); m_Controls->inputImageOneNameLabel->setVisible( false ); m_Controls->inputImageOneLabel->setVisible( false ); m_Controls->inputImageTwoNameLabel->setText( mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_DASH ); m_Controls->inputImageTwoNameLabel->setVisible( false ); m_Controls->inputImageTwoLabel->setVisible( false ); } -void QmitkConnectomicsDataView::OnSelectionChanged( std::vector nodes ) +void QmitkConnectomicsDataView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { this->WipeDisplay(); // Valid options are either // 1 image (parcellation) // // 1 image (parcellation) // 1 fiber bundle // // 1 network if( nodes.size() > 2 ) { return; } bool alreadyFiberBundleSelected( false ), alreadyImageSelected( false ), currentFormatUnknown( true ); // iterate all selected objects, adjust warning visibility - for( std::vector::iterator it = nodes.begin(); - it != nodes.end(); - ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; currentFormatUnknown = true; if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { currentFormatUnknown = false; if( alreadyImageSelected ) { this->WipeDisplay(); return; } alreadyImageSelected = true; m_Controls->lblWarning->setVisible( false ); m_Controls->inputImageOneNameLabel->setText(node->GetName().c_str()); m_Controls->inputImageOneNameLabel->setVisible( true ); m_Controls->inputImageOneLabel->setVisible( true ); } if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { currentFormatUnknown = false; // a fiber bundle has to be in conjunction with a parcellation if( nodes.size() != 2 || alreadyFiberBundleSelected ) { this->WipeDisplay(); return; } alreadyFiberBundleSelected = true; m_Controls->lblWarning->setVisible( false ); m_Controls->inputImageTwoNameLabel->setText(node->GetName().c_str()); m_Controls->inputImageTwoNameLabel->setVisible( true ); m_Controls->inputImageTwoLabel->setVisible( true ); } { // network section mitk::ConnectomicsNetwork* network = dynamic_cast( node->GetData() ); if( node.IsNotNull() && network ) { currentFormatUnknown = false; if( nodes.size() != 1 ) { // only valid option is a single network this->WipeDisplay(); return; } m_Controls->lblWarning->setVisible( false ); m_Controls->inputImageOneNameLabel->setText(node->GetName().c_str()); m_Controls->inputImageOneNameLabel->setVisible( true ); m_Controls->inputImageOneLabel->setVisible( true ); } } // end network section if ( currentFormatUnknown ) { this->WipeDisplay(); return; } } // end for loop } void QmitkConnectomicsDataView::OnSyntheticNetworkComboBoxCurrentIndexChanged(int currentIndex) { m_currentIndex = currentIndex; switch (m_currentIndex) { case 0: this->m_Controls->parameterOneLabel->setText( "Nodes per side" ); this->m_Controls->parameterTwoLabel->setText( "Internode distance" ); this->m_Controls->parameterOneSpinBox->setEnabled( true ); this->m_Controls->parameterOneSpinBox->setValue( 5 ); this->m_Controls->parameterTwoDoubleSpinBox->setEnabled( true ); this->m_Controls->parameterTwoDoubleSpinBox->setMaximum( 999.999 ); this->m_Controls->parameterTwoDoubleSpinBox->setValue( 10.0 ); break; case 1: this->m_Controls->parameterOneLabel->setText( "Number of nodes" ); this->m_Controls->parameterTwoLabel->setText( "Radius" ); this->m_Controls->parameterOneSpinBox->setEnabled( true ); this->m_Controls->parameterOneSpinBox->setValue( 1000 ); this->m_Controls->parameterTwoDoubleSpinBox->setEnabled( true ); this->m_Controls->parameterTwoDoubleSpinBox->setMaximum( 999.999 ); this->m_Controls->parameterTwoDoubleSpinBox->setValue( 50.0 ); break; case 2: this->m_Controls->parameterOneLabel->setText( "Number of nodes" ); this->m_Controls->parameterTwoLabel->setText( "Edge percentage" ); this->m_Controls->parameterOneSpinBox->setEnabled( true ); this->m_Controls->parameterOneSpinBox->setValue( 100 ); this->m_Controls->parameterTwoDoubleSpinBox->setEnabled( true ); this->m_Controls->parameterTwoDoubleSpinBox->setMaximum( 1.0 ); this->m_Controls->parameterTwoDoubleSpinBox->setValue( 0.5 ); break; case 3: //GenerateSyntheticScaleFreeNetwork( network, 1000 ); break; case 4: //GenerateSyntheticSmallWorldNetwork( network, 1000 ); break; default: this->m_Controls->parameterOneLabel->setText( "Parameter 1" ); this->m_Controls->parameterTwoLabel->setText( "Paramater 2" ); this->m_Controls->parameterOneSpinBox->setEnabled( false ); this->m_Controls->parameterOneSpinBox->setValue( 0 ); this->m_Controls->parameterTwoDoubleSpinBox->setEnabled( false ); this->m_Controls->parameterTwoDoubleSpinBox->setValue( 0.0 ); } } void QmitkConnectomicsDataView::OnSyntheticNetworkCreationPushButtonClicked() { // warn if trying to create a very big network // big network is a network with > 5000 nodes (estimate) // this might fill up the memory to the point it freezes int numberOfNodes( 0 ); switch (m_currentIndex) { case 0: numberOfNodes = this->m_Controls->parameterOneSpinBox->value() * this->m_Controls->parameterOneSpinBox->value() * this->m_Controls->parameterOneSpinBox->value(); break; case 1: numberOfNodes = this->m_Controls->parameterOneSpinBox->value(); break; case 2: numberOfNodes = this->m_Controls->parameterOneSpinBox->value(); break; case 3: // not implemented yet break; case 4: // not implemented yet break; default: break; } if( numberOfNodes > 5000 ) { QMessageBox msgBox; msgBox.setText("Trying to generate very large network."); msgBox.setIcon( QMessageBox::Warning ); msgBox.setInformativeText("You are trying to generate a network with more than 5000 nodes, this is very resource intensive and might lead to program instability. Proceed with network generation?"); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Yes: // continue break; case QMessageBox::No: // stop return; break; default: // should never be reached break; } } // proceed mitk::ConnectomicsSyntheticNetworkGenerator::Pointer generator = mitk::ConnectomicsSyntheticNetworkGenerator::New(); mitk::DataNode::Pointer networkNode = mitk::DataNode::New(); int parameterOne = this->m_Controls->parameterOneSpinBox->value(); double parameterTwo = this->m_Controls->parameterTwoDoubleSpinBox->value(); //add network to datastorage networkNode->SetData( generator->CreateSyntheticNetwork( m_currentIndex, parameterOne, parameterTwo ) ); networkNode->SetName( mitk::ConnectomicsConstantsManager::CONNECTOMICS_PROPERTY_DEFAULT_CNF_NAME ); if( generator->WasGenerationSuccessfull() ) { - this->GetDefaultDataStorage()->Add( networkNode ); + this->GetDataStorage()->Add( networkNode ); } else { MITK_WARN << "Problem occured during synthetic network generation."; } mitk::RenderingManager::GetInstance()->InitializeViews( networkNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); return; } void QmitkConnectomicsDataView::OnNetworkifyPushButtonClicked() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if ( nodes.empty() ) { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS_CREATION, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_SELECTION_WARNING); return; } if (! ( nodes.size() == 2 ) ) { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS_CREATION, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_SELECTION_WARNING); return; } mitk::DataNode* firstNode = nodes.front(); mitk::DataNode* secondNode = nodes.at(1); if (!firstNode) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS_CREATION, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_SELECTION_WARNING); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData* firstData = firstNode->GetData(); mitk::BaseData* secondData = secondNode->GetData(); if (firstData && secondData) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image* image = dynamic_cast( firstData ); mitk::FiberBundle* fiberBundle = dynamic_cast( secondData ); // check whether order was switched if (! (image && fiberBundle) ) { image = dynamic_cast( secondData ); fiberBundle = dynamic_cast( firstData ); } if (image && fiberBundle) { mitk::ConnectomicsNetworkCreator::MappingStrategy mappingStrategy = static_cast(this->m_Controls->mappingStrategyComboBox->currentIndex()); m_ConnectomicsNetworkCreator->SetSegmentation( image ); m_ConnectomicsNetworkCreator->SetFiberBundle( fiberBundle ); m_ConnectomicsNetworkCreator->CalculateCenterOfMass(); m_ConnectomicsNetworkCreator->SetEndPointSearchRadius( 15 ); m_ConnectomicsNetworkCreator->SetMappingStrategy( mappingStrategy ); m_ConnectomicsNetworkCreator->CreateNetworkFromFibersAndSegmentation(); mitk::DataNode::Pointer networkNode = mitk::DataNode::New(); //add network to datastorage networkNode->SetData( m_ConnectomicsNetworkCreator->GetNetwork() ); networkNode->SetName( mitk::ConnectomicsConstantsManager::CONNECTOMICS_PROPERTY_DEFAULT_CNF_NAME ); - this->GetDefaultDataStorage()->Add( networkNode ); + this->GetDataStorage()->Add( networkNode ); } } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkConnectomicsDataView::OnCreateCorrelationMatrixPushButtonClicked() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if ( nodes.empty() ) { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_FMRI_CORRELATION_SELECTION_WARNING); return; } if( nodes.size() == 1 ) { mitk::DataNode* firstNode = nodes.front(); if (!firstNode) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_FMRI_CORRELATION_SELECTION_WARNING); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData* firstData = firstNode->GetData(); if (firstData) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image* image = dynamic_cast( firstData ); if(image && image->GetDimension() == 4) { AccessFixedDimensionByItk(image, DoWholeCorrelation, 4); } } } else if( nodes.size() == 2 ) { mitk::DataNode* firstNode = nodes.front(); mitk::DataNode* secondNode = nodes.at(1); if (!firstNode) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_FMRI_CORRELATION_SELECTION_WARNING); return; } if (!secondNode) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_FMRI_CORRELATION_SELECTION_WARNING); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData* firstData = firstNode->GetData(); mitk::BaseData* secondData = secondNode->GetData(); if (firstData && secondData) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image* firstImage = dynamic_cast( firstData ); mitk::Image* secondImage = dynamic_cast( secondData ); if(firstImage && secondImage) { if( firstImage->GetDimension() == 4 && secondImage->GetDimension() == 3 ) { AccessFixedDimensionByItk_n(firstImage, DoParcelCorrelation, 4, ( secondImage)); } else if( firstImage->GetDimension() == 3 && secondImage->GetDimension() == 4 ) { AccessFixedDimensionByItk_n(secondImage, DoParcelCorrelation, 4, ( firstImage)); } else { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_FMRI_CORRELATION_SELECTION_WARNING); return; } } } } } template< typename TPixel, unsigned int VImageDimension > void QmitkConnectomicsDataView::DoWholeCorrelation( itk::Image* itkTimeSeriesImage ) { typename mitk::CorrelationCalculator::Pointer correlationCalculator = mitk::CorrelationCalculator::New(); mitk::Image::Pointer timeSeriesImage = mitk::Image::New(); mitk::CastToMitkImage(itkTimeSeriesImage, timeSeriesImage); correlationCalculator->SetTimeSeriesImage( timeSeriesImage ); correlationCalculator->SetParcellationImage( nullptr ); correlationCalculator->DoWholeCorrelation(); const vnl_matrix< double >* vnlmat = correlationCalculator->GetCorrelationMatrix(); std::stringstream output; for(unsigned int i(0); i < (*vnlmat).rows(); ++i) { for(unsigned int j(0); j < (*vnlmat).cols(); ++j) { output << (*vnlmat)[i][j] << " "; } output << "\n"; } MITK_INFO << "\n" << output.str(); } template< typename TPixel, unsigned int VImageDimension > void QmitkConnectomicsDataView::DoParcelCorrelation( itk::Image* itkTimeSeriesImage, mitk::Image::Pointer parcelImage ) { typename mitk::CorrelationCalculator::Pointer correlationCalculator = mitk::CorrelationCalculator::New(); mitk::Image::Pointer timeSeriesImage = mitk::Image::New(); mitk::CastToMitkImage(itkTimeSeriesImage, timeSeriesImage); correlationCalculator->SetTimeSeriesImage( timeSeriesImage ); correlationCalculator->SetParcellationImage( parcelImage ); correlationCalculator->DoParcelCorrelation(); mitk::DataNode::Pointer networkNode = mitk::DataNode::New(); networkNode->SetData( correlationCalculator->GetConnectomicsNetwork() ); networkNode->SetName("ParcelCorrelationNetwork"); - this->GetDefaultDataStorage()->Add(networkNode); + this->GetDataStorage()->Add(networkNode); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.h index c15011281c..55cce873d4 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsDataView.h @@ -1,112 +1,109 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkConnectomicsDataView_h #define QmitkConnectomicsDataView_h #include -#include +#include #include "ui_QmitkConnectomicsDataViewControls.h" #include "mitkConnectomicsNetworkCreator.h" #include "mitkConnectomicsNetworkMapper3D.h" // ####### ITK includes ####### #include /*! \brief QmitkConnectomicsDataView This view provides functionality for the generation of networks. Either from parcellation and fiber bundle or synthetically. - -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkConnectomicsDataView : public QmitkFunctionality +class QmitkConnectomicsDataView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkConnectomicsDataView(); virtual ~QmitkConnectomicsDataView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: /// \brief Align two images by copying the geometry void OnNetworkifyPushButtonClicked(); /// \brief Create synthetic networks void OnSyntheticNetworkCreationPushButtonClicked(); /// \brief Adjust parameters depending on synthetic network type void OnSyntheticNetworkComboBoxCurrentIndexChanged(int currentIndex); /// \brief Create #voxel x #voxel correlation matrix of a timeseries image void OnCreateCorrelationMatrixPushButtonClicked(); protected: // ####### Functions ####### - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; /// \brief Converts an image into a RGBA image template < typename TPixel, unsigned int VImageDimension > void TurnIntoRGBA( itk::Image* inputImage); /// \brief Wipe display and empty statistics void WipeDisplay(); template< typename TPixel, unsigned int VImageDimension > void DoWholeCorrelation( itk::Image* itkTimeSeriesImage ); template< typename TPixel, unsigned int VImageDimension > void DoParcelCorrelation( itk::Image* itkTimeSeriesImage, mitk::Image::Pointer parcelImage ); // ####### Variables ####### Ui::QmitkConnectomicsDataViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - mitk::ConnectomicsNetworkCreator::Pointer m_ConnectomicsNetworkCreator; mitk::ConnectomicsNetworkMapper3D::Pointer m_NetworkMapper; // Demo/Developer mode toggle bool m_demomode; // The selected synthetic network type int m_currentIndex; }; #endif // _QMITKBRAINNETWORKANALYSISVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.cpp index 9e05634083..4ca7bd97ad 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.cpp @@ -1,587 +1,564 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // ####### Blueberry includes ####### #include #include // ####### Qmitk includes ####### #include "QmitkConnectomicsNetworkOperationsView.h" -#include "QmitkStdMultiWidget.h" // ####### Qt includes ####### #include // ####### ITK includes ####### #include // ####### MITK includes ####### #include #include "mitkConnectomicsSimulatedAnnealingManager.h" #include "mitkConnectomicsSimulatedAnnealingPermutationModularity.h" #include "mitkConnectomicsSimulatedAnnealingCostFunctionModularity.h" #include #include #include #include // Includes for image casting between ITK and MITK #include "mitkImageCast.h" #include "mitkITKImageImport.h" #include "mitkImageAccessByItk.h" const std::string QmitkConnectomicsNetworkOperationsView::VIEW_ID = "org.mitk.views.connectomicsnetworkoperations"; QmitkConnectomicsNetworkOperationsView::QmitkConnectomicsNetworkOperationsView() -: QmitkFunctionality() +: QmitkAbstractView() , m_Controls( 0 ) -, m_MultiWidget( NULL ) , m_demomode( false ) , m_currentIndex( 0 ) { } QmitkConnectomicsNetworkOperationsView::~QmitkConnectomicsNetworkOperationsView() { } void QmitkConnectomicsNetworkOperationsView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkConnectomicsNetworkOperationsViewControls; m_Controls->setupUi( parent ); QObject::connect( m_Controls->convertToRGBAImagePushButton, SIGNAL(clicked()), this, SLOT(OnConvertToRGBAImagePushButtonClicked()) ); QObject::connect( m_Controls->assignFreeSurferColorsPushButton, SIGNAL(clicked()), this, SLOT(OnAssignFreeSurferColorsPushButtonClicked()) ); QObject::connect( (QObject*)( m_Controls->modularizePushButton ), SIGNAL(clicked()), this, SLOT(OnModularizePushButtonClicked()) ); QObject::connect( (QObject*)( m_Controls->prunePushButton ), SIGNAL(clicked()), this, SLOT(OnPrunePushButtonClicked()) ); QObject::connect( (QObject*)( m_Controls->createConnectivityMatrixImagePushButton ), SIGNAL(clicked()), this, SLOT(OnCreateConnectivityMatrixImagePushButtonClicked()) ); } // GUI is different for developer and demo mode m_demomode = true; if( m_demomode ) { this->m_Controls->convertToRGBAImagePushButton->show(); this->m_Controls->assignFreeSurferColorsPushButton->show(); this->m_Controls->modularizePushButton->hide(); this->m_Controls->pruneOptionsGroupBox->show(); } else { this->m_Controls->convertToRGBAImagePushButton->show(); this->m_Controls->assignFreeSurferColorsPushButton->show(); this->m_Controls->modularizePushButton->show(); this->m_Controls->pruneOptionsGroupBox->show(); } this->WipeDisplay(); } -void QmitkConnectomicsNetworkOperationsView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkConnectomicsNetworkOperationsView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkConnectomicsNetworkOperationsView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->convertToRGBAImagePushButton->setFocus(); } void QmitkConnectomicsNetworkOperationsView::WipeDisplay() { m_Controls->lblWarning->setVisible( true ); m_Controls->inputImageOneNameLabel->setText( mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_DASH ); m_Controls->inputImageOneNameLabel->setVisible( false ); m_Controls->inputImageOneLabel->setVisible( false ); } -void QmitkConnectomicsNetworkOperationsView::OnSelectionChanged( std::vector nodes ) +void QmitkConnectomicsNetworkOperationsView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { this->WipeDisplay(); // Valid options are either if( nodes.size() > 2 ) { return; } bool currentFormatUnknown(true), alreadyImageSelected(false); // iterate all selected objects, adjust warning visibility - for( std::vector::iterator it = nodes.begin(); - it != nodes.end(); - ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; currentFormatUnknown = true; if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { currentFormatUnknown = false; if( alreadyImageSelected ) { this->WipeDisplay(); return; } alreadyImageSelected = true; m_Controls->lblWarning->setVisible( false ); m_Controls->inputImageOneNameLabel->setText(node->GetName().c_str()); m_Controls->inputImageOneNameLabel->setVisible( true ); m_Controls->inputImageOneLabel->setVisible( true ); } if( node.IsNotNull() ) { // network section mitk::ConnectomicsNetwork* network = dynamic_cast( node->GetData() ); if( network ) { currentFormatUnknown = false; if( nodes.size() != 1 ) { // only valid option is a single network this->WipeDisplay(); return; } m_Controls->lblWarning->setVisible( false ); m_Controls->inputImageOneNameLabel->setText(node->GetName().c_str()); m_Controls->inputImageOneNameLabel->setVisible( true ); m_Controls->inputImageOneLabel->setVisible( true ); } } // end network section if ( currentFormatUnknown ) { this->WipeDisplay(); return; } } // end for loop } void QmitkConnectomicsNetworkOperationsView::OnConvertToRGBAImagePushButtonClicked() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if (nodes.empty()) return; mitk::DataNode* node = nodes.front(); if (!node) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_ONLY_PARCELLATION_SELECTION_WARNING); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData* data = node->GetData(); if (data) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image* image = dynamic_cast( data ); if (image) { std::stringstream message; std::string name; message << mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_PERFORMING_IMAGE_PROCESSING_FOR_IMAGE; if (node->GetName(name)) { // a property called "name" was found for this DataNode message << "'" << name << "'"; } message << "."; MITK_INFO << message.str(); // Convert to RGBA AccessByItk( image, TurnIntoRGBA ); - this->GetDefaultDataStorage()->GetNamedNode( mitk::ConnectomicsConstantsManager::CONNECTOMICS_PROPERTY_DEFAULT_RGBA_NAME )->GetData()->SetGeometry( node->GetData()->GetGeometry() ); + this->GetDataStorage()->GetNamedNode( mitk::ConnectomicsConstantsManager::CONNECTOMICS_PROPERTY_DEFAULT_RGBA_NAME )->GetData()->SetGeometry( node->GetData()->GetGeometry() ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_ONLY_PARCELLATION_SELECTION_WARNING); return; } } else { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_ONLY_PARCELLATION_SELECTION_WARNING); return; } } void QmitkConnectomicsNetworkOperationsView::OnAssignFreeSurferColorsPushButtonClicked() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if (nodes.empty()) return; mitk::DataNode* node = nodes.front(); if (!node) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_ONLY_PARCELLATION_SELECTION_WARNING); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData* data = node->GetData(); if (data) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image* image = dynamic_cast( data ); if (image) { std::stringstream message; std::string name; message << mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_PERFORMING_IMAGE_PROCESSING_FOR_IMAGE; if (node->GetName(name)) { // a property called "name" was found for this DataNode message << "'" << name << "'"; } message << "."; MITK_INFO << message.str(); // Convert to RGBA AssignFreeSurferColors( node ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_ONLY_PARCELLATION_SELECTION_WARNING); return; } } else { QMessageBox::information( NULL, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_CONNECTOMICS, mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_ONLY_PARCELLATION_SELECTION_WARNING); return; } } void QmitkConnectomicsNetworkOperationsView::AssignFreeSurferColors( mitk::DataNode::Pointer node ) { mitk::FreeSurferParcellationTranslator::Pointer translator = mitk::FreeSurferParcellationTranslator::New(); //translator->AssignLookupTable(node); translator->AssignTransferFunction(node); node->SetProperty("Image Rendering.Mode", mitk::RenderingModeProperty::New(mitk::RenderingModeProperty::COLORTRANSFERFUNCTION_COLOR)); } template < typename TPixel, unsigned int VImageDimension > void QmitkConnectomicsNetworkOperationsView::TurnIntoRGBA( itk::Image* inputImage) { typedef itk::RGBAPixel< unsigned char > RGBAPixelType; typedef itk::Image< TPixel, VImageDimension > TemplateImageType; typedef itk::Image< RGBAPixelType, VImageDimension > RGBAImageType; itk::ImageRegionIterator it_inputImage(inputImage, inputImage->GetLargestPossibleRegion()); TPixel minimumValue, maximumValue; it_inputImage.GoToBegin(); maximumValue = minimumValue = it_inputImage.Value(); for(it_inputImage.GoToBegin(); !it_inputImage.IsAtEnd(); ++it_inputImage) { if ( it_inputImage.Value() < minimumValue ) { minimumValue = it_inputImage.Value(); } else { if ( it_inputImage.Value() > maximumValue ) { maximumValue = it_inputImage.Value(); } } } int range = int ( maximumValue - minimumValue ); //needs to be castable to int int offset = int ( minimumValue ); if ( range < 0 ) //error { return; } std::vector< unsigned int > histogram; histogram.resize( range + 1, 0 ); for(it_inputImage.GoToBegin(); !it_inputImage.IsAtEnd(); ++it_inputImage) { histogram[ int ( it_inputImage.Value() ) - offset ] += 1; } int gapCounter = 0; //this variable will be used to count the empty labels //stores how much has to be subtracted from the image to remove gaps std::vector< TPixel > subtractionStorage; subtractionStorage.resize( range + 1, 0 ); for( int index = 0; index <= range; index++ ) { if( histogram[ index ] == 0 ) { gapCounter++; //if the label is empty, increase gapCounter } else { subtractionStorage[ index ] = TPixel ( gapCounter ); } } //remove gaps from label image //for(it_inputImage.GoToBegin(); !it_inputImage.IsAtEnd(); ++it_inputImage) //{ // it_inputImage.Value() = it_inputImage.Value() - subtractionStorage[int ( it_inputImage.Value() ) - offset ]; //} // create colour vector std::vector< RGBAPixelType > lookupTable; { RGBAPixelType backgroundColour; for( int elementIndex = 0; elementIndex < 4; ++elementIndex ) { backgroundColour.SetElement( elementIndex, 0 ); } lookupTable.push_back( backgroundColour ); for(int colourNumber = 0; colourNumber < range ; ++colourNumber) { RGBAPixelType colour; for( int elementIndex = 0; elementIndex < 3; ++elementIndex ) { colour.SetElement( elementIndex, rand() % 256 ); } colour.SetAlpha( 255 ); lookupTable.push_back( colour ); } } // create RGBA image typename RGBAImageType::Pointer rgbaImage = RGBAImageType::New(); rgbaImage->SetRegions(inputImage->GetLargestPossibleRegion().GetSize()); rgbaImage->SetSpacing(inputImage->GetSpacing()); rgbaImage->SetOrigin(inputImage->GetOrigin()); rgbaImage->Allocate(); //fill with appropriate colours itk::ImageRegionIterator it_rgbaImage(rgbaImage, rgbaImage->GetLargestPossibleRegion()); for(it_inputImage.GoToBegin(), it_rgbaImage.GoToBegin(); !it_inputImage.IsAtEnd(); ++it_inputImage, ++it_rgbaImage) { it_rgbaImage.Value() = lookupTable[ int ( it_inputImage.Value() - subtractionStorage[int ( it_inputImage.Value() ) - offset ] ) - offset ]; } mitk::Image::Pointer mitkRGBAImage = mitk::ImportItkImage( rgbaImage )->Clone(); mitk::DataNode::Pointer rgbaImageNode = mitk::DataNode::New(); rgbaImageNode->SetData(mitkRGBAImage); rgbaImageNode->SetProperty(mitk::ConnectomicsConstantsManager::CONNECTOMICS_PROPERTY_NAME, mitk::StringProperty::New(mitk::ConnectomicsConstantsManager::CONNECTOMICS_PROPERTY_DEFAULT_RGBA_NAME)); rgbaImageNode->SetBoolProperty( mitk::ConnectomicsConstantsManager::CONNECTOMICS_PROPERTY_VOLUMERENDERING, true); - this->GetDefaultDataStorage()->Add( rgbaImageNode ); + this->GetDataStorage()->Add( rgbaImageNode ); } void QmitkConnectomicsNetworkOperationsView::OnModularizePushButtonClicked() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if ( nodes.empty() ) { QMessageBox::information( NULL, "Modularization calculation", "Please select exactly one network."); return; } - for( std::vector::iterator it = nodes.begin(); - it != nodes.end(); - ++it ) + for (auto node: nodes) { - mitk::DataNode::Pointer node = *it; - if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { return; } { mitk::ConnectomicsNetwork* network = dynamic_cast( node->GetData() ); if( node.IsNotNull() && network ) { typedef mitk::ConnectomicsSimulatedAnnealingPermutationModularity::ToModuleMapType MappingType; int depthOfModuleRecursive( 2 ); double startTemperature( 2.0 ); double stepSize( 4.0 ); mitk::ConnectomicsNetwork::Pointer connectomicsNetwork( network ); mitk::ConnectomicsSimulatedAnnealingManager::Pointer manager = mitk::ConnectomicsSimulatedAnnealingManager::New(); mitk::ConnectomicsSimulatedAnnealingPermutationModularity::Pointer permutation = mitk::ConnectomicsSimulatedAnnealingPermutationModularity::New(); mitk::ConnectomicsSimulatedAnnealingCostFunctionModularity::Pointer costFunction = mitk::ConnectomicsSimulatedAnnealingCostFunctionModularity::New(); permutation->SetCostFunction( costFunction.GetPointer() ); permutation->SetNetwork( connectomicsNetwork ); permutation->SetDepth( depthOfModuleRecursive ); permutation->SetStepSize( stepSize ); manager->SetPermutation( permutation.GetPointer() ); manager->RunSimulatedAnnealing( startTemperature, stepSize ); MappingType mapping = permutation->GetMapping(); MappingType::iterator iter = mapping.begin(); MappingType::iterator end = mapping.end(); while( iter != end ) { MBI_DEBUG << "Vertex " << iter->first << " belongs to module " << iter->second ; MBI_INFO << "Vertex " << iter->first << " belongs to module " << iter->second ; iter++; } MBI_DEBUG << "Overall number of modules is " << permutation->getNumberOfModules( &mapping ) ; MBI_DEBUG << "Cost is " << costFunction->Evaluate( network, &mapping ) ; MBI_INFO << "Overall number of modules is " << permutation->getNumberOfModules( &mapping ) ; MBI_INFO << "Cost is " << costFunction->Evaluate( network, &mapping ) ; return; } } } } void QmitkConnectomicsNetworkOperationsView::OnPrunePushButtonClicked() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if ( nodes.empty() ) { QMessageBox::information( NULL, "Network pruning", "Please select one or more networks."); return; } - for( std::vector::iterator it = nodes.begin(); - it != nodes.end(); - ++it ) + for (auto node: nodes) { - mitk::DataNode::Pointer node = *it; - if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { return; } { mitk::ConnectomicsNetwork* network = dynamic_cast( node->GetData() ); if( node.IsNotNull() && network ) { mitk::ConnectomicsNetworkThresholder::Pointer thresholder = mitk::ConnectomicsNetworkThresholder::New(); thresholder->SetNetwork( network ); thresholder->SetTargetThreshold( this->m_Controls->targetThresholdSpinBox->value() ); thresholder->SetTargetDensity( this->m_Controls->densityThresholdDoubleSpinBox->value() ); if( this->m_Controls->thresholdBasedThresholdingCheckBox->isChecked() ) { thresholder->SetThresholdingScheme( mitk::ConnectomicsNetworkThresholder::ThresholdBased ); mitk::DataNode::Pointer thresholdBasedNode = mitk::DataNode::New(); thresholdBasedNode->SetData ( thresholder->GetThresholdedNetwork() ); thresholdBasedNode->SetName( "Threshold based" ); - this->GetDefaultDataStorage()->Add(thresholdBasedNode, node ); + this->GetDataStorage()->Add(thresholdBasedNode, node ); } if( this->m_Controls->largestDensityLowerThanCheckBox->isChecked() ) { thresholder->SetThresholdingScheme( mitk::ConnectomicsNetworkThresholder::LargestLowerThanDensity ); mitk::DataNode::Pointer thresholdBasedNode = mitk::DataNode::New(); thresholdBasedNode->SetData ( thresholder->GetThresholdedNetwork() ); thresholdBasedNode->SetName( "Largest density below threshold" ); - this->GetDefaultDataStorage()->Add(thresholdBasedNode, node ); + this->GetDataStorage()->Add(thresholdBasedNode, node ); } if( this->m_Controls->RandomRemovalThresholdingCheckBox->isChecked() ) { thresholder->SetThresholdingScheme( mitk::ConnectomicsNetworkThresholder::RandomRemovalOfWeakest ); mitk::DataNode::Pointer thresholdBasedNode = mitk::DataNode::New(); thresholdBasedNode->SetData ( thresholder->GetThresholdedNetwork() ); thresholdBasedNode->SetName( "Random removal threshold" ); - this->GetDefaultDataStorage()->Add(thresholdBasedNode, node ); + this->GetDataStorage()->Add(thresholdBasedNode, node ); } } } } } void QmitkConnectomicsNetworkOperationsView::OnCreateConnectivityMatrixImagePushButtonClicked() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if ( nodes.empty() ) { QMessageBox::information( NULL, "Connectivity Matrix Image creation", "Please select one or more networks."); return; } - for( std::vector::iterator it = nodes.begin(); - it != nodes.end(); - ++it ) + for (auto node: nodes) { - mitk::DataNode::Pointer node = *it; - if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { return; } { mitk::ConnectomicsNetwork* network = dynamic_cast( node->GetData() ); if( node.IsNotNull() && network ) { itk::ConnectomicsNetworkToConnectivityMatrixImageFilter::Pointer filter = itk::ConnectomicsNetworkToConnectivityMatrixImageFilter::New(); filter->SetInputNetwork( network ); filter->SetBinaryConnectivity(m_Controls->binaryCheckBox->isChecked()); filter->SetRescaleConnectivity(m_Controls->rescaleCheckBox->isChecked()); filter->Update(); mitk::Image::Pointer connectivityMatrixImage = mitk::ImportItkImage( filter->GetOutput())->Clone(); mitk::DataNode::Pointer connectivityMatrixImageNode = mitk::DataNode::New(); connectivityMatrixImageNode->SetData ( connectivityMatrixImage ); connectivityMatrixImageNode->SetName( "Connectivity matrix" ); - this->GetDefaultDataStorage()->Add(connectivityMatrixImageNode, node ); + this->GetDataStorage()->Add(connectivityMatrixImageNode, node ); } } } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.h index dfc16f2c31..08b3655ad2 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsNetworkOperationsView.h @@ -1,110 +1,107 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkConnectomicsNetworkOperationsView_h #define QmitkConnectomicsNetworkOperationsView_h #include -#include +#include #include "ui_QmitkConnectomicsNetworkOperationsViewControls.h" #include "mitkConnectomicsNetworkMapper3D.h" // ####### ITK includes ####### #include /*! \brief QmitkConnectomicsNetworkOperationsView This bundle provides GUI for the brain network analysis algorithms. - -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkConnectomicsNetworkOperationsView : public QmitkFunctionality +class QmitkConnectomicsNetworkOperationsView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkConnectomicsNetworkOperationsView(); virtual ~QmitkConnectomicsNetworkOperationsView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: /// \brief Called when the user clicks the GUI button void OnConvertToRGBAImagePushButtonClicked(); /// \brief Called when the user clicks the GUI button void OnAssignFreeSurferColorsPushButtonClicked(); /// \brief Create modularization of network void OnModularizePushButtonClicked(); /// \brief Prune network void OnPrunePushButtonClicked(); /// \brief Create 2D Connecivity Matrix image from network void OnCreateConnectivityMatrixImagePushButtonClicked(); protected: // ####### Functions ####### - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; /// \brief Converts an image into a RGBA image template < typename TPixel, unsigned int VImageDimension > void TurnIntoRGBA( itk::Image* inputImage); /// \brief Assigns an image the Freesurfer LUT void AssignFreeSurferColors( mitk::DataNode::Pointer node ); /// \brief Wipe display and empty statistics void WipeDisplay(); // ####### Variables ####### Ui::QmitkConnectomicsNetworkOperationsViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - mitk::ConnectomicsNetworkMapper3D::Pointer m_NetworkMapper; // Demo/Developer mode toggle bool m_demomode; // The selected synthetic network type int m_currentIndex; }; #endif // _QMITKBRAINNETWORKANALYSISVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.cpp index ce40779dd0..c9a5fcf462 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.cpp @@ -1,262 +1,256 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // ####### Blueberry includes ####### #include #include // ####### Qmitk includes ####### #include "QmitkConnectomicsStatisticsView.h" -#include "QmitkStdMultiWidget.h" // ####### Qt includes ####### #include #include // ####### ITK includes ####### #include // ####### MITK includes ####### #include #include #include #include // Includes for image casting between ITK and MITK #include "mitkImageCast.h" #include "mitkITKImageImport.h" #include "mitkImageAccessByItk.h" #include const std::string QmitkConnectomicsStatisticsView::VIEW_ID = "org.mitk.views.connectomicsstatistics"; QmitkConnectomicsStatisticsView::QmitkConnectomicsStatisticsView() -: QmitkFunctionality() +: QmitkAbstractView() , m_Controls( nullptr ) -, m_MultiWidget( nullptr ) { } QmitkConnectomicsStatisticsView::~QmitkConnectomicsStatisticsView() { } void QmitkConnectomicsStatisticsView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) {// create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkConnectomicsStatisticsViewControls; m_Controls-> setupUi( parent ); connect( m_Controls-> networkBalloonsNodeLabelsComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( OnNetworkBalloonsNodeLabelsComboBoxCurrentIndexChanged( ) ) ); } this-> WipeDisplay(); } -void QmitkConnectomicsStatisticsView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkConnectomicsStatisticsView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - -void QmitkConnectomicsStatisticsView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = nullptr; + m_Controls->networkStatisticsPlainTextEdit->setFocus(); } void QmitkConnectomicsStatisticsView::WipeDisplay() { m_Controls->lblWarning->setVisible( true ); m_Controls->inputImageOneNameLabel->setText( mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_DASH ); m_Controls->inputImageOneNameLabel->setVisible( false ); m_Controls->inputImageOneLabel->setVisible( false ); m_Controls->networkStatisticsPlainTextEdit->clear(); m_Controls->betweennessNetworkHistogramCanvas->SetHistogram( nullptr ); m_Controls->degreeNetworkHistogramCanvas->SetHistogram( nullptr ); m_Controls->shortestPathNetworkHistogramCanvas->SetHistogram( nullptr ); m_Controls->betweennessNetworkHistogramCanvas->update(); m_Controls->degreeNetworkHistogramCanvas->update(); m_Controls->shortestPathNetworkHistogramCanvas->update(); m_Controls->betweennessNetworkHistogramCanvas->Clear(); m_Controls->degreeNetworkHistogramCanvas->Clear(); m_Controls->shortestPathNetworkHistogramCanvas->Clear(); m_Controls->betweennessNetworkHistogramCanvas->Replot(); m_Controls->degreeNetworkHistogramCanvas->Replot(); m_Controls->shortestPathNetworkHistogramCanvas->Replot(); m_Controls-> networkBalloonsNodeLabelsComboBox-> QComboBox::clear(); m_Controls-> networkBalloonsPlainTextEdit-> clear(); } void QmitkConnectomicsStatisticsView::OnNetworkBalloonsNodeLabelsComboBoxCurrentIndexChanged( ) { - std::vector nodes = this-> GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if( nodes.size() != 1 ) { return; } mitk::DataNode::Pointer node = *nodes.begin(); if( node.IsNotNull() ) { mitk::ConnectomicsNetwork* network = dynamic_cast< mitk::ConnectomicsNetwork* >( node-> GetData() ); if( network ) { std::string tempCurrentText = m_Controls-> networkBalloonsNodeLabelsComboBox-> QComboBox::currentText().toStdString(); // get text of currently selected item. if( tempCurrentText.size() > 3 && tempCurrentText.rfind( ":" ) != tempCurrentText.npos ) { // update chosenNode property. tempCurrentText = tempCurrentText.substr( tempCurrentText.rfind( ":" ) + 2 ); node-> SetProperty( mitk::connectomicsRenderingNodeChosenNodeName.c_str(), mitk::StringProperty::New( tempCurrentText.c_str() ) ); - this-> m_MultiWidget-> ForceImmediateUpdate(); //RequestUpdate() is too slow. + auto renderWindowPart = this->GetRenderWindowPart(); + if (renderWindowPart) + { + renderWindowPart->ForceImmediateUpdate(); //RequestUpdate() is too slow. + } } std::stringstream balloonTextStream; node-> Update(); if( node-> GetProperty( mitk::connectomicsRenderingBalloonTextName.c_str() ) != nullptr && node-> GetProperty( mitk::connectomicsRenderingBalloonNodeStatsName.c_str() ) != nullptr && tempCurrentText != "-1" ) { balloonTextStream << node-> GetProperty( mitk::connectomicsRenderingBalloonTextName.c_str() ) -> GetValueAsString() << node-> GetProperty( mitk::connectomicsRenderingBalloonNodeStatsName.c_str() ) -> GetValueAsString() << std::endl; QString balloonQString ( balloonTextStream.str().c_str() ); // setPlainText() overwrites, insertPlainText() appends. m_Controls-> networkBalloonsPlainTextEdit-> setPlainText( balloonQString ); } if( tempCurrentText == "-1" ) { m_Controls-> networkBalloonsPlainTextEdit-> setPlainText( "" ); } } } return; } -void QmitkConnectomicsStatisticsView::OnSelectionChanged( std::vector nodes ) +void QmitkConnectomicsStatisticsView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { this->WipeDisplay(); // Valid options are either // 1 image (parcellation) // // 1 image (parcellation) // 1 fiber bundle // // 1 network if( nodes.size() > 2 ) { return; } bool currentFormatUnknown(true); // iterate all selected objects, adjust warning visibility - for( std::vector::iterator it = nodes.begin(); - it != nodes.end(); - ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; currentFormatUnknown = true; if( node.IsNotNull() ) { // network section mitk::ConnectomicsNetwork* network = dynamic_cast( node->GetData() ); if( network ) { currentFormatUnknown = false; if( nodes.size() != 1 ) { // only valid option is a single network this->WipeDisplay(); return; } m_Controls->lblWarning->setVisible( false ); m_Controls->inputImageOneNameLabel->setText(node->GetName().c_str()); m_Controls->inputImageOneNameLabel->setVisible( true ); m_Controls->inputImageOneLabel->setVisible( true ); { std::stringstream statisticsStream; mitk::ConnectomicsStatisticsCalculator::Pointer calculator = mitk::ConnectomicsStatisticsCalculator::New(); calculator->SetNetwork( network ); calculator->Update(); statisticsStream << "# Vertices: " << calculator->GetNumberOfVertices() << "\n"; statisticsStream << "# Edges: " << calculator->GetNumberOfEdges() << "\n"; statisticsStream << "Average Degree: " << calculator->GetAverageDegree() << "\n"; statisticsStream << "Density: " << calculator->GetConnectionDensity() << "\n"; statisticsStream << "Small Worldness: " << calculator->GetSmallWorldness() << "\n"; statisticsStream << "Average Path Length: " << calculator->GetAveragePathLength() << "\n"; statisticsStream << "Efficiency: " << (1 / calculator->GetAveragePathLength() ) << "\n"; statisticsStream << "# Connected Components: " << calculator->GetNumberOfConnectedComponents() << "\n"; statisticsStream << "Average Component Size: " << calculator->GetAverageComponentSize() << "\n"; statisticsStream << "Largest Component Size: " << calculator->GetLargestComponentSize() << "\n"; statisticsStream << "Average Clustering Coefficient: " << calculator->GetAverageClusteringCoefficientsC() << "\n"; statisticsStream << "Average Vertex Betweenness Centrality: " << calculator->GetAverageVertexBetweennessCentrality() << "\n"; statisticsStream << "Average Edge Betweenness Centrality: " << calculator->GetAverageEdgeBetweennessCentrality() << "\n"; statisticsStream << "# Isolated Points: " << calculator->GetNumberOfIsolatedPoints() << "\n"; statisticsStream << "# End Points: " << calculator->GetNumberOfEndPoints() << "\n"; statisticsStream << "Diameter: " << calculator->GetDiameter() << "\n"; statisticsStream << "Radius: " << calculator->GetRadius() << "\n"; statisticsStream << "Average Eccentricity: " << calculator->GetAverageEccentricity() << "\n"; statisticsStream << "# Central Points: " << calculator->GetNumberOfCentralPoints() << "\n"; QString statisticsString( statisticsStream.str().c_str() ); m_Controls-> networkStatisticsPlainTextEdit-> setPlainText( statisticsString ); } mitk::ConnectomicsNetwork::Pointer connectomicsNetwork( network ); mitk::ConnectomicsHistogramsContainer *histogramContainer = histogramCache[ connectomicsNetwork ]; if(histogramContainer) { m_Controls->betweennessNetworkHistogramCanvas->SetHistogram( histogramContainer->GetBetweennessHistogram() ); m_Controls->degreeNetworkHistogramCanvas->SetHistogram( histogramContainer->GetDegreeHistogram() ); m_Controls->shortestPathNetworkHistogramCanvas->SetHistogram( histogramContainer->GetShortestPathHistogram() ); m_Controls->betweennessNetworkHistogramCanvas->DrawProfiles(); m_Controls->degreeNetworkHistogramCanvas->DrawProfiles(); m_Controls->shortestPathNetworkHistogramCanvas->DrawProfiles(); } // For the balloon overlay: if( node-> GetProperty( mitk::connectomicsRenderingBalloonAllNodeLabelsName.c_str() ) != nullptr ) { // QComboBox with node label names and numbers. QString allNodesLabel = node-> GetProperty( mitk::connectomicsRenderingBalloonAllNodeLabelsName.c_str() )-> GetValueAsString().c_str(); QStringList allNodesLabelList = allNodesLabel.simplified().split( "," ); allNodesLabelList.sort( Qt::CaseInsensitive ); m_Controls-> networkBalloonsNodeLabelsComboBox-> QComboBox::addItem( "no node chosen: -1" ); m_Controls-> networkBalloonsNodeLabelsComboBox-> QComboBox::addItems( allNodesLabelList ); } } } // end network section if ( currentFormatUnknown ) { this->WipeDisplay(); return; } } // end for loop } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.h index bd619ce73e..c216290956 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkConnectomicsStatisticsView.h @@ -1,84 +1,80 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkConnectomicsStatisticsView_h #define QmitkConnectomicsStatisticsView_h #include -#include #include #include "ui_QmitkConnectomicsStatisticsViewControls.h" #include "mitkConnectomicsHistogramCache.h" // ####### ITK includes ####### #include /*! \brief QmitkConnectomicsStatisticsView This view provides the statistics GUI. - -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkConnectomicsStatisticsView : public QmitkFunctionality +class QmitkConnectomicsStatisticsView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkConnectomicsStatisticsView(); virtual ~QmitkConnectomicsStatisticsView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void OnNetworkBalloonsNodeLabelsComboBoxCurrentIndexChanged( ); protected: // ####### Functions ####### - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; /// \brief Wipe display and empty statistics void WipeDisplay(); // ####### Variables ####### Ui::QmitkConnectomicsStatisticsViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - /// Cache for histograms mitk::ConnectomicsHistogramCache histogramCache; }; #endif // _QMITKBRAINNETWORKANALYSISVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.cpp index f753714261..2992579cd7 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.cpp @@ -1,359 +1,359 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Qmitk #include "QmitkRandomParcellationView.h" // Blueberry #include #include // Qt #include // Includes for image casting between ITK and MITK #include "mitkImageCast.h" #include "mitkImageAccessByItk.h" #include "mitkITKImageImport.h" //To convert integer to string #include #include //Itk Iterators #include #include // mitk #include #include //Child const std::string QmitkRandomParcellationView::PROPERTYNAME = "name"; const std::string QmitkRandomParcellationView::PROPERTYOPACITY = "opacity"; const std::string QmitkRandomParcellationView::m_NAMEFORRANDOMVOXELIMAGE = "Random Voxel Image"; const std::string QmitkRandomParcellationView::VIEW_ID = "org.mitk.views.randomparcellationview"; void QmitkRandomParcellationView::SetFocus() { m_Controls.buttonSelectRandomNodes->setFocus(); } void QmitkRandomParcellationView::CreateQtPartControl( QWidget *parent ) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi( parent ); connect( m_Controls.buttonSelectRandomNodes, SIGNAL(clicked()), this, SLOT(SelectRandomNodes()) ); connect( m_Controls.checkBoxMerging, SIGNAL(stateChanged(int)),this, SLOT(OnMergingCheckboxChanged(int))); connect( m_Controls.radioButtonNumberParcels, SIGNAL(clicked()), this, SLOT(OnRadioButtonNumberParcelsChanged(int))); connect( m_Controls.radioButtonSmallestParcel, SIGNAL(clicked()), this, SLOT(OnRadioButtonSmallestParcelChanged(int))); } void QmitkRandomParcellationView::OnMergingCheckboxChanged(int state) { if (m_Controls.checkBoxMerging->isChecked()) { //Make the frame visible m_Controls.frameMerging->setEnabled(true); m_Controls.frameNumberParcels->setEnabled(true); m_Controls.frameSmallestParcel->setEnabled(true); } else { m_Controls.frameMerging->setEnabled(false); } } void QmitkRandomParcellationView::OnRadioButtonNumberParcelsChanged(int state) { if (m_Controls.radioButtonNumberParcels->isChecked()) { m_Controls.frameNumberParcels->setEnabled(true); m_Controls.radioButtonSmallestParcel->setChecked(false); } else { m_Controls.frameNumberParcels->setEnabled(false); } } void QmitkRandomParcellationView::OnRadioButtonSmallestParcelChanged(int state) { if (m_Controls.radioButtonSmallestParcel->isChecked()) { m_Controls.frameSmallestParcel->setEnabled(true); m_Controls.radioButtonNumberParcels->setChecked(false); } else { m_Controls.frameSmallestParcel->setEnabled(false); } } -void QmitkRandomParcellationView::OnSelectionChanged(std::vector nodes ) +void QmitkRandomParcellationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { // iterate all selected objects, adjust warning visibility - foreach( mitk::DataNode::Pointer node, nodes ) + for (mitk::DataNode::Pointer node: nodes) { if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { m_Controls.labelWarning->setVisible( false ); m_Controls.buttonSelectRandomNodes->setEnabled( true ); mitk::Image* imageDisplay = dynamic_cast(node->GetData()); AccessFixedDimensionByItk(imageDisplay, ShowNumberOfVoxels, 3); return; } } m_Controls.labelWarning->setVisible( true ); m_Controls.buttonSelectRandomNodes->setEnabled( false ); } template void QmitkRandomParcellationView::ShowNumberOfVoxels( itk::Image * inputImage) { typedef itk::Image< TPixel, VImageDimension > ImageType; mitk::RegionVoxelCounter counter; counter.SetRegion(inputImage->GetLargestPossibleRegion()); counter.SetImage(inputImage); int numberVoxelsDisplay = counter.VoxelWithValue(1); std::string stringDisplay = "Number of voxels with value 1: "; std::ostringstream convertDisplay; convertDisplay << numberVoxelsDisplay; std::string stringNumberVoxels = convertDisplay.str(); stringDisplay += stringNumberVoxels; QString textNumberVoxelsDisplay = QString::fromStdString(stringDisplay); m_Controls.labelNumberVoxels->setText(textNumberVoxelsDisplay); } void QmitkRandomParcellationView::SelectRandomNodes() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if (nodes.empty()) return; mitk::DataNode* node = nodes.front(); if (!node) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, "No image available", "Please load and select an image before starting image processing."); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData* data = node->GetData(); if (data) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image* image = dynamic_cast( data ); if (image) { //get numberNodes (number of nodes) with SpinBox int numberNodes( 0 ); numberNodes = m_Controls.spinBoxNumberNodes->value(); std::stringstream message; std::string name; message << "Selecting " << numberNodes << " random nodes for "; if (node->GetName(name)) { // a property called "name" was found for this DataNode message << "'" << name << "'"; } message << "."; MITK_INFO << message.str(); //MITK into ITK image, function GetRandomParcels gets executed, Dimension is 3 AccessFixedDimensionByItk(image, GetRandomParcels, 3); } } } template void QmitkRandomParcellationView::GetRandomParcels( itk::Image * inputImage) { typedef itk::Image< TPixel, VImageDimension > ImageType; typedef itk::Image< int, VImageDimension > IntegerImageType; //new Image which will contain the parcellation typename IntegerImageType::Pointer voxelImage = IntegerImageType::New(); voxelImage->SetRegions(inputImage->GetLargestPossibleRegion().GetSize()); voxelImage->SetSpacing(inputImage->GetSpacing()); voxelImage->SetOrigin(inputImage->GetOrigin()); voxelImage->Allocate(); //Voxel iterators itk::ImageRegionIterator it_inputImage(inputImage, inputImage->GetLargestPossibleRegion()); itk::ImageRegionIterator it_voxelImage(voxelImage, voxelImage->GetLargestPossibleRegion()); //Copy the inputImage -> voxelImage for (it_inputImage.GoToBegin(), it_voxelImage.GoToBegin(); !it_inputImage.IsAtEnd(); ++it_inputImage, ++it_voxelImage) { it_voxelImage.Value() = it_inputImage.Value(); } //Neighborhood Iterator typedef itk::NeighborhoodIterator< IntegerImageType > NeighborhoodIteratorType; typename NeighborhoodIteratorType::RadiusType radius; radius.Fill(1); //Counter for voxels with value 1 mitk::RegionVoxelCounter counter; counter.SetImage(voxelImage); counter.SetRegion(voxelImage->GetLargestPossibleRegion()); int numberVoxels = counter.VoxelWithValue(1); //Get numberNodes with SpinBox int numberNodes(0); numberNodes = m_Controls.spinBoxNumberNodes->value(); //WARNINGS if (numberNodes > numberVoxels ) { QMessageBox::information( NULL, "Smaller Number of Nodes", "The number of nodes is greater than the number of voxels. Please choose a smaller number!"); return; } if (m_Controls.checkBoxMerging->isChecked() && m_Controls.radioButtonNumberParcels->isChecked()) { int numberParcels = m_Controls.spinBoxNumberParcels->value(); if (numberNodesisChecked() && m_Controls.radioButtonSmallestParcel->isChecked()) { int sizeSmallestParcel = m_Controls.spinBoxSmallestParcel->value(); if (sizeSmallestParcel > numberVoxels ) { QMessageBox::information( NULL, "Smaller Size", "The size of the smallest parcel is greater than the number of voxels. Please choose a smaller size!"); return; } } //Get a RandomParcellationGenerator to generate the parcels mitk::RandomParcellationGenerator generator; generator.SetImage(voxelImage); generator.SetNumberNodes(numberNodes); //Chooses random initial voxels, with which we can start the parcellation growth generator.GetRandomSeedVoxels(); //Now we add all the voxels (which share a face with one of the voxels of a region) to a region, particular constraints have to be fulfilled generator.ParcelGrowthOverFaces(); //Because of the constraints or the position of some voxels we now add voxels to the regions which just share an edge or vertex with one region generator.FillOverEdgeOrVertex(); //Isolated voxels also have to be allocated to the regions generator.AllocateIsolatedVoxels(); //Show the sizeOfRegions in the window MITK_DEBUG << "Without merging we get the following size of regions: " << endl; generator.ShowSizeOfRegions(); //Check if the Merge-Buttons are chosen int newNumberNodes; if (m_Controls.checkBoxMerging->isChecked()) { int givenSizeOfSmallestRegion(0); int desiredNumberOfParcels(0); int givenSizeOfSmallestRegionBeginning = numberVoxels; bool mergingWithNumberParcels(false); bool mergingWithSmallestParcel(false); bool justMergeSmallParcels(false); if (m_Controls.radioButtonSmallestParcel->isChecked() ) { mergingWithSmallestParcel = true; givenSizeOfSmallestRegionBeginning = m_Controls.spinBoxSmallestParcel->value(); if( m_Controls.checkBoxJustMergeSmallParcels-> isChecked() ) { //Spinbox: How many voxels should the smallest parcel have? givenSizeOfSmallestRegion = m_Controls.spinBoxSmallestParcel->value(); justMergeSmallParcels = true; } else { givenSizeOfSmallestRegion = numberVoxels; } } else if (m_Controls.radioButtonNumberParcels->isChecked()) { givenSizeOfSmallestRegion = numberVoxels; desiredNumberOfParcels = m_Controls.spinBoxNumberParcels->value(); mergingWithNumberParcels = true; } //Merge parcels according to a costfunction generator.SetVariablesForMerging(givenSizeOfSmallestRegion, desiredNumberOfParcels, givenSizeOfSmallestRegionBeginning); generator.SetBoolsForMerging(mergingWithNumberParcels, mergingWithSmallestParcel, justMergeSmallParcels); newNumberNodes = generator.MergeParcels(); MITK_DEBUG << "After merging we get the following size of regions:" << endl; generator.ShowSizeOfRegions(); } //Show NumberOfNodes on the GUI if (m_Controls.checkBoxMerging->isChecked()) //merging was used { ShowNumberOfNodes(newNumberNodes); } else { ShowNumberOfNodes(numberNodes); } //Change the values of the nodes, such that no gaps exist and the values starts with 1 generator.SetAppropriateValues(); //Get a new data node which contains the random parcellation mitk::Image::Pointer mitkRandomVoxelImage = mitk::GrabItkImageMemory( voxelImage ); mitk::DataNode::Pointer newRandomVoxelImageNode = mitk::DataNode::New(); newRandomVoxelImageNode->SetData(mitkRandomVoxelImage); newRandomVoxelImageNode->SetProperty(PROPERTYNAME.c_str(), mitk::StringProperty::New(m_NAMEFORRANDOMVOXELIMAGE)); newRandomVoxelImageNode->SetProperty(PROPERTYOPACITY.c_str(), mitk::FloatProperty::New(1.0)); - this->GetDefaultDataStorage()->Add( newRandomVoxelImageNode ); + this->GetDataStorage()->Add( newRandomVoxelImageNode ); return; } void QmitkRandomParcellationView::ShowNumberOfNodes(int numberNodes) { std::string string = "Number of nodes: "; std::string stringNumberNodes; std::ostringstream convert; convert << numberNodes; stringNumberNodes = convert.str(); string += stringNumberNodes; QString textNumberNodes = QString::fromStdString(string); m_Controls.labelNumberNodes->setText(textNumberNodes); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.h index 5517794b44..7a93554bb3 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.connectomics/src/internal/QmitkRandomParcellationView.h @@ -1,101 +1,98 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef RandomParcellationView_h #define RandomParcellationView_h #include -#include +#include #include "ui_QmitkRandomParcellationViewControls.h" #include #include //To use pair #include /** \brief QmitkRandomParcellationView for GUI Interactions -\sa QmitkFunctionality \ingroup ${plugin_target}_internal */ -class QmitkRandomParcellationView : public QmitkFunctionality +class QmitkRandomParcellationView : public QmitkAbstractView { Q_OBJECT public: static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent) override; + virtual void SetFocus() override; + /** \brief Interaction with GUI and mitkRandomParcellationGenerator to get random parcels.*/ template void GetRandomParcels( itk::Image* ); /** \brief Method to set the default data storage.*/ virtual void SetDataStorage(mitk::DataStorage* dataStorage) { m_DataStorage = dataStorage; } protected slots: /** \brief Called when the user clicks the GUI button*/ void SelectRandomNodes(); /** \brief Called when the user checks the GUI checkbox*/ void OnMergingCheckboxChanged(int state); /** \brief Called when the user ckecks the GUI radio button*/ void OnRadioButtonNumberParcelsChanged(int state); /** \brief Called when the user ckecks the GUI radio button*/ void OnRadioButtonSmallestParcelChanged(int state); protected: - QmitkStdMultiWidget* m_MultiWidget; - mitk::DataStorage* m_DataStorage; //to save an itk image mitk::DataNode::Pointer m_InputImageNode; /** \brief Shows the number of voxels with value one on the GUI*/ template void ShowNumberOfVoxels( itk::Image * inputImage); /** \brief Shows the number of nodes on the GUI (may have changed after merging)*/ void ShowNumberOfNodes(int numberNodes); - virtual void SetFocus() override; - - /** \brief called by QmitkFunctionality when DataManager's selection has changed*/ - virtual void OnSelectionChanged(std::vector nodes) override; + /** \brief called by QmitkAbstractView when DataManager's selection has changed*/ + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkRandomParcellationViewControls m_Controls; static const std::string PROPERTYNAME; static const std::string PROPERTYOPACITY; static const std::string m_NAMEFORRANDOMVOXELIMAGE; }; #endif // RandomParcellationView_h diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.cpp index 77dee17b43..dd72d5d92a 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.cpp @@ -1,525 +1,524 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkDenoisingView.h" #include #include #include #include QmitkDenoisingWorker::QmitkDenoisingWorker(QmitkDenoisingView *view) : m_View(view) { } void QmitkDenoisingWorker::run() { if (m_View->m_ImageNode.IsNotNull()) { switch (m_View->m_SelectedFilter) { case QmitkDenoisingView::NOFILTERSELECTED: case QmitkDenoisingView::GAUSS: { break; } case QmitkDenoisingView::NLM: { try { m_View->m_CompletedCalculation = true; m_View->m_NonLocalMeansFilter->Update(); } catch (itk::ExceptionObject& e) { m_View->m_CompletedCalculation = false; MITK_ERROR << e.what(); } break; } } m_View->m_DenoisingThread.quit(); } } const std::string QmitkDenoisingView::VIEW_ID = "org.mitk.views.denoisingview"; QmitkDenoisingView::QmitkDenoisingView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) , m_ImageNode(NULL) , m_BrainMaskNode(NULL) , m_DenoisingWorker(this) , m_ThreadIsRunning(false) , m_NonLocalMeansFilter(NULL) , m_InputImage(NULL) , m_LastProgressCount(0) , m_MaxProgressCount(0) , m_SelectedFilter(NOFILTERSELECTED) { m_DenoisingWorker.moveToThread(&m_DenoisingThread); connect(&m_DenoisingThread, SIGNAL(started()), this, SLOT(BeforeThread())); connect(&m_DenoisingThread, SIGNAL(started()), &m_DenoisingWorker, SLOT(run())); connect(&m_DenoisingThread, SIGNAL(finished()), this, SLOT(AfterThread())); connect(&m_DenoisingThread, SIGNAL(terminated()), this, SLOT(AfterThread())); m_DenoisingTimer = new QTimer(this); } QmitkDenoisingView::~QmitkDenoisingView() { delete m_DenoisingTimer; } void QmitkDenoisingView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkDenoisingViewControls; m_Controls->setupUi( parent ); + + m_Controls->m_SelectFilterComboBox->clear(); + m_Controls->m_SelectFilterComboBox->insertItem(NOFILTERSELECTED, "Please select a filter"); + m_Controls->m_SelectFilterComboBox->insertItem(NLM, "Non-local means filter"); + m_Controls->m_SelectFilterComboBox->insertItem(GAUSS, "Discrete gaussian filter"); + CreateConnections(); ResetParameterPanel(); } } void QmitkDenoisingView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_ApplyButton), SIGNAL(clicked()), this, SLOT(StartDenoising())); connect( (QObject*)(m_Controls->m_SelectFilterComboBox), SIGNAL(activated(int)), this, SLOT(SelectFilter(int))); connect( m_DenoisingTimer, SIGNAL(timeout()), this, SLOT(UpdateProgress())); } } -void QmitkDenoisingView::Activated() +void QmitkDenoisingView::SetFocus() { - QmitkFunctionality::Activated(); - - m_Controls->m_SelectFilterComboBox->clear(); - m_Controls->m_SelectFilterComboBox->insertItem(NOFILTERSELECTED, "Please select a filter"); - m_Controls->m_SelectFilterComboBox->insertItem(NLM, "Non-local means filter"); - m_Controls->m_SelectFilterComboBox->insertItem(GAUSS, "Discrete gaussian filter"); + m_Controls->m_SelectFilterComboBox->setFocus(); } -void QmitkDenoisingView::OnSelectionChanged( std::vector nodes ) +void QmitkDenoisingView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { if (m_ThreadIsRunning) return; if (m_SelectedFilter != NOFILTERSELECTED) { m_Controls->m_InputImageLabel->setText("mandatory"); } else { m_Controls->m_InputImageLabel->setText("mandatory"); } m_Controls->m_InputBrainMaskLabel->setText("optional"); m_Controls->m_ApplyButton->setEnabled(false); m_ImageNode = NULL; m_BrainMaskNode = NULL; // iterate selection - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; - bool isDiffusionImage(false); if(node.IsNotNull()) { isDiffusionImage = mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())); } if( node.IsNotNull() && isDiffusionImage) { m_Controls->m_InputImageLabel->setText(node->GetName().c_str()); m_ImageNode = node; } bool isBinary = false; node->GetBoolProperty("binary", isBinary); // look for a brainmask in selection if( node.IsNotNull() && static_cast(node->GetData()) && isBinary) { m_Controls->m_InputBrainMaskLabel->setText(node->GetName().c_str()); m_BrainMaskNode = node; } } // Preparation of GUI to start denoising if a filter is selected if (m_ImageNode.IsNotNull() && m_SelectedFilter != NOFILTERSELECTED) { m_Controls->m_ApplyButton->setEnabled(true); } } void QmitkDenoisingView::StartDenoising() { if (!m_ThreadIsRunning) { if (m_ImageNode.IsNotNull()) { m_LastProgressCount = 0; switch (m_SelectedFilter) { case NOFILTERSELECTED: { break; } case NLM: { // initialize NLM m_InputImage = dynamic_cast (m_ImageNode->GetData()); m_NonLocalMeansFilter = NonLocalMeansDenoisingFilterType::New(); if (m_BrainMaskNode.IsNotNull()) { // use brainmask if set m_ImageMask = dynamic_cast(m_BrainMaskNode->GetData()); itk::Image::Pointer itkMask; mitk::CastToItkImage(m_ImageMask, itkMask); m_NonLocalMeansFilter->SetInputMask(itkMask); itk::ImageRegionIterator< itk::Image > mit(itkMask, itkMask->GetLargestPossibleRegion()); mit.GoToBegin(); itk::Image::IndexType minIndex; itk::Image::IndexType maxIndex; minIndex.Fill(10000); maxIndex.Fill(0); while (!mit.IsAtEnd()) { if (mit.Get()) { // calculation of the start & end index of the smallest masked region minIndex[0] = minIndex[0] < mit.GetIndex()[0] ? minIndex[0] : mit.GetIndex()[0]; minIndex[1] = minIndex[1] < mit.GetIndex()[1] ? minIndex[1] : mit.GetIndex()[1]; minIndex[2] = minIndex[2] < mit.GetIndex()[2] ? minIndex[2] : mit.GetIndex()[2]; maxIndex[0] = maxIndex[0] > mit.GetIndex()[0] ? maxIndex[0] : mit.GetIndex()[0]; maxIndex[1] = maxIndex[1] > mit.GetIndex()[1] ? maxIndex[1] : mit.GetIndex()[1]; maxIndex[2] = maxIndex[2] > mit.GetIndex()[2] ? maxIndex[2] : mit.GetIndex()[2]; } ++mit; } itk::Image::SizeType size; size[0] = maxIndex[0] - minIndex[0] + 1; size[1] = maxIndex[1] - minIndex[1] + 1; size[2] = maxIndex[2] - minIndex[2] + 1; m_MaxProgressCount = size[0] * size[1] * size[2]; } else { // initialize the progressbar m_MaxProgressCount = m_InputImage->GetDimension(0) * m_InputImage->GetDimension(1) * m_InputImage->GetDimension(2); } mitk::ProgressBar::GetInstance()->AddStepsToDo(m_MaxProgressCount); ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(m_InputImage, itkVectorImagePointer); m_NonLocalMeansFilter->SetInputImage( itkVectorImagePointer ); m_NonLocalMeansFilter->SetUseRicianAdaption(m_Controls->m_RicianCheckbox->isChecked()); m_NonLocalMeansFilter->SetUseJointInformation(m_Controls->m_JointInformationCheckbox->isChecked()); m_NonLocalMeansFilter->SetSearchRadius(m_Controls->m_SpinBoxParameter1->value()); m_NonLocalMeansFilter->SetComparisonRadius(m_Controls->m_SpinBoxParameter2->value()); m_NonLocalMeansFilter->SetVariance(m_Controls->m_DoubleSpinBoxParameter3->value()); // start denoising in detached thread m_DenoisingThread.start(QThread::HighestPriority); break; } case GAUSS: { // initialize GAUSS and run m_InputImage = dynamic_cast (m_ImageNode->GetData()); ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(m_InputImage, itkVectorImagePointer); ExtractFilterType::Pointer extractor = ExtractFilterType::New(); extractor->SetInput( itkVectorImagePointer ); ComposeFilterType::Pointer composer = ComposeFilterType::New(); for (unsigned int i = 0; i < itkVectorImagePointer->GetVectorLength(); ++i) { extractor->SetIndex(i); extractor->Update(); m_GaussianFilter = GaussianFilterType::New(); m_GaussianFilter->SetVariance(m_Controls->m_SpinBoxParameter1->value()); if (m_BrainMaskNode.IsNotNull()) { m_ImageMask = dynamic_cast(m_BrainMaskNode->GetData()); itk::Image::Pointer itkMask = itk::Image::New(); mitk::CastToItkImage(m_ImageMask, itkMask); itk::MaskImageFilter , itk::Image >::Pointer maskImageFilter = itk::MaskImageFilter , itk::Image >::New(); maskImageFilter->SetInput(extractor->GetOutput()); maskImageFilter->SetMaskImage(itkMask); maskImageFilter->Update(); m_GaussianFilter->SetInput(maskImageFilter->GetOutput()); } else { m_GaussianFilter->SetInput(extractor->GetOutput()); } m_GaussianFilter->Update(); composer->SetInput(i, m_GaussianFilter->GetOutput()); } composer->Update(); mitk::Image::Pointer image = mitk::GrabItkImageMemory(composer->GetOutput()); image->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( static_cast( m_InputImage->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer() ) ); image->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast(m_InputImage->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ) ); mitk::DiffusionPropertyHelper propertyHelper( image ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( image ); QString name = m_ImageNode->GetName().c_str(); imageNode->SetName((name+"_gauss_"+QString::number(m_Controls->m_SpinBoxParameter1->value())).toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode); + GetDataStorage()->Add(imageNode); break; } } } } else { m_NonLocalMeansFilter->AbortGenerateDataOn(); m_CompletedCalculation = false; } } void QmitkDenoisingView::ResetParameterPanel() { m_Controls->m_DwiLabel->setEnabled(false); m_Controls->m_InputImageLabel->setEnabled(false); m_Controls->m_BrainMaskLabel->setEnabled(false); m_Controls->m_InputBrainMaskLabel->setEnabled(false); m_Controls->m_ParameterBox->hide(); m_Controls->m_LabelParameter_1->hide(); m_Controls->m_LabelParameter_2->hide(); m_Controls->m_LabelParameter_3->hide(); m_Controls->m_SpinBoxParameter1->hide(); m_Controls->m_SpinBoxParameter2->hide(); m_Controls->m_DoubleSpinBoxParameter3->hide(); m_Controls->m_RicianLabel->hide(); m_Controls->m_RicianCheckbox->hide(); m_Controls->m_JointInformationLabel->hide(); m_Controls->m_JointInformationCheckbox->hide(); m_Controls->m_ApplyButton->setEnabled(false); } void QmitkDenoisingView::SelectFilter(int filter) { if (m_ThreadIsRunning) return; //Prepare GUI this->ResetParameterPanel(); switch (filter) { case 0: { m_SelectedFilter = NOFILTERSELECTED; break; } case 1: { m_SelectedFilter = NLM; m_Controls->m_DwiLabel->setEnabled(true); m_Controls->m_InputImageLabel->setEnabled(true); m_Controls->m_BrainMaskLabel->setEnabled(true); m_Controls->m_InputBrainMaskLabel->setEnabled(true); m_Controls->m_ParameterBox->show(); m_Controls->m_LabelParameter_1->show(); m_Controls->m_LabelParameter_1->setText("Search Radius:"); m_Controls->m_LabelParameter_2->show(); m_Controls->m_LabelParameter_2->setText("Comparision Radius:"); m_Controls->m_LabelParameter_3->show(); m_Controls->m_LabelParameter_3->setText("Noise variance:"); m_Controls->m_SpinBoxParameter1->show(); m_Controls->m_SpinBoxParameter1->setValue(4); m_Controls->m_SpinBoxParameter2->show(); m_Controls->m_SpinBoxParameter2->setValue(1); m_Controls->m_DoubleSpinBoxParameter3->show(); m_Controls->m_DoubleSpinBoxParameter3->setValue(1.0); m_Controls->m_RicianLabel->show(); m_Controls->m_RicianCheckbox->show(); m_Controls->m_RicianCheckbox->setChecked(true); m_Controls->m_JointInformationLabel->show(); m_Controls->m_JointInformationCheckbox->show(); m_Controls->m_JointInformationCheckbox->setChecked(false); break; } case 2: { m_SelectedFilter = GAUSS; m_Controls->m_DwiLabel->setEnabled(true); m_Controls->m_InputImageLabel->setEnabled(true); m_Controls->m_BrainMaskLabel->setEnabled(true); m_Controls->m_InputBrainMaskLabel->setEnabled(true); m_Controls->m_ParameterBox->show(); m_Controls->m_LabelParameter_1->show(); m_Controls->m_LabelParameter_1->setText("Variance:"); m_Controls->m_SpinBoxParameter1->show(); m_Controls->m_SpinBoxParameter1->setValue(2); break; } } if (m_ImageNode.IsNull()) { if (m_SelectedFilter != NOFILTERSELECTED) m_Controls->m_InputImageLabel->setText("mandatory"); else m_Controls->m_InputImageLabel->setText("mandatory"); } if (m_ImageNode.IsNotNull()) { m_Controls->m_ApplyButton->setEnabled(false); switch(filter) { case NOFILTERSELECTED: { break; } case NLM: case GAUSS: { m_Controls->m_ApplyButton->setEnabled(true); break; } } } } void QmitkDenoisingView::BeforeThread() { m_ThreadIsRunning = true; // initialize timer to update the progressbar at each timestep m_DenoisingTimer->start(500); m_Controls->m_ParameterBox->setEnabled(false); m_Controls->m_ApplyButton->setText("Abort"); } void QmitkDenoisingView::AfterThread() { m_ThreadIsRunning = false; // stop timer to stop updates of progressbar m_DenoisingTimer->stop(); // make sure progressbar is finished mitk::ProgressBar::GetInstance()->Progress(m_MaxProgressCount); if (m_CompletedCalculation) { switch (m_SelectedFilter) { case NOFILTERSELECTED: case GAUSS: { break; } case NLM: { mitk::Image::Pointer image = mitk::GrabItkImageMemory( m_NonLocalMeansFilter->GetOutput() ); image->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( static_cast( m_InputImage->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer() ) ); image->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast(m_InputImage->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ) ); mitk::DiffusionPropertyHelper propertyHelper( image ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( image ); QString name = m_ImageNode->GetName().c_str(); //TODO: Rician adaption & joint information in name if (m_Controls->m_RicianCheckbox->isChecked() && !m_Controls->m_JointInformationCheckbox->isChecked()) { imageNode->SetName((name+"_NLMr_"+QString::number(m_Controls->m_SpinBoxParameter1->value())+"-"+QString::number(m_Controls->m_SpinBoxParameter2->value())).toStdString().c_str()); } else if(!m_Controls->m_RicianCheckbox->isChecked() && m_Controls->m_JointInformationCheckbox->isChecked()) { imageNode->SetName((name+"_NLMv_"+QString::number(m_Controls->m_SpinBoxParameter1->value())+"-"+QString::number(m_Controls->m_SpinBoxParameter2->value())).toStdString().c_str()); } else if(m_Controls->m_RicianCheckbox->isChecked() && m_Controls->m_JointInformationCheckbox->isChecked()) { imageNode->SetName((name+"_NLMvr_"+QString::number(m_Controls->m_SpinBoxParameter1->value())+"-"+QString::number(m_Controls->m_SpinBoxParameter2->value())).toStdString().c_str()); } else { imageNode->SetName((name+"_NLM_"+QString::number(m_Controls->m_SpinBoxParameter1->value())+"-"+QString::number(m_Controls->m_SpinBoxParameter2->value())).toStdString().c_str()); } - GetDefaultDataStorage()->Add(imageNode); + GetDataStorage()->Add(imageNode); break; } } } m_Controls->m_ParameterBox->setEnabled(true); m_Controls->m_ApplyButton->setText("Apply"); } void QmitkDenoisingView::UpdateProgress() { switch (m_SelectedFilter) { case NOFILTERSELECTED: case GAUSS: { break; } case NLM: { unsigned int currentProgressCount = m_NonLocalMeansFilter->GetCurrentVoxelCount(); mitk::ProgressBar::GetInstance()->Progress(currentProgressCount-m_LastProgressCount); m_LastProgressCount = currentProgressCount; break; } } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.h index 8da26d4ca8..1bfbb673f9 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.denoising/src/internal/QmitkDenoisingView.h @@ -1,134 +1,135 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKQmitkDenoisingView_H_INCLUDED #define _QMITKQmitkDenoisingView_H_INCLUDED #include -#include +#include #include "ui_QmitkDenoisingViewControls.h" #include #include #include #include #include #include #include #include #include #include /** * \class QmitkDenoisingView * \brief View displaying details to denoise diffusionweighted images. - * - * \sa QmitkFunctionality - * \ingroup Functionalities */ class QmitkDenoisingView; class QmitkDenoisingWorker : public QObject { Q_OBJECT public: QmitkDenoisingWorker(QmitkDenoisingView* view); public slots: void run(); private: QmitkDenoisingView* m_View; }; -class QmitkDenoisingView : public QmitkFunctionality +class QmitkDenoisingView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkDenoisingView(); virtual ~QmitkDenoisingView(); /** Typedefs */ typedef short DiffusionPixelType; typedef mitk::Image MaskImageType; typedef itk::NonLocalMeansDenoisingFilter< DiffusionPixelType > NonLocalMeansDenoisingFilterType; typedef itk::DiscreteGaussianImageFilter < itk::Image< DiffusionPixelType, 3>, itk::Image< DiffusionPixelType, 3> > GaussianFilterType; typedef itk::VectorImageToImageFilter < DiffusionPixelType > ExtractFilterType; typedef itk::ComposeImageFilter < itk::Image > ComposeFilterType; typedef itk::VectorImage ITKDiffusionImageType; virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Creation of the connections of the FilterComboBox - virtual void Activated() override; + + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; private slots: void StartDenoising(); //< prepares filter condition and starts thread for denoising void SelectFilter(int filter); //< updates which filter is selected void BeforeThread(); //< starts timer & disables all buttons while denoising void AfterThread(); //< stops timer & creates a new datanode of the denoised image void UpdateProgress(); //< updates the progressbar each timestep private: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + void ResetParameterPanel(); Ui::QmitkDenoisingViewControls* m_Controls; mitk::DataNode::Pointer m_ImageNode; mitk::DataNode::Pointer m_BrainMaskNode; QmitkDenoisingWorker m_DenoisingWorker; QThread m_DenoisingThread; bool m_ThreadIsRunning; bool m_CompletedCalculation; NonLocalMeansDenoisingFilterType::Pointer m_NonLocalMeansFilter; GaussianFilterType::Pointer m_GaussianFilter; mitk::Image::Pointer m_InputImage; MaskImageType::Pointer m_ImageMask; QTimer* m_DenoisingTimer; unsigned int m_LastProgressCount; unsigned int m_MaxProgressCount; enum FilterType { NOFILTERSELECTED, NLM, GAUSS }m_SelectedFilter; friend class QmitkDenoisingWorker; }; #endif // _QmitkDenoisingView_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkAstrosticksModelParametersWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkAstrosticksModelParametersWidget.h index 6b1cfc8e96..2ddae96a1f 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkAstrosticksModelParametersWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkAstrosticksModelParametersWidget.h @@ -1,64 +1,62 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKAstrosticksModelParametersWidget_H_INCLUDED #define _QMITKAstrosticksModelParametersWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkAstrosticksModelParametersWidgetControls.h" #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_FIBERFOX_EXPORT QmitkAstrosticksModelParametersWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkAstrosticksModelParametersWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkAstrosticksModelParametersWidget(); virtual void CreateQtPartControl(QWidget *parent); void SetT1(double t1){ m_Controls->m_T1box->setValue(t1); } void SetT2(double t2){ m_Controls->m_T2box->setValue(t2); } void SetD(double d){ m_Controls->m_D1box->setValue(d); } void SetRandomizeSticks(bool r){ m_Controls->m_RandomCheck->setChecked(r); } double GetD(){ return m_Controls->m_D1box->value(); } unsigned int GetT2(){ return m_Controls->m_T2box->value(); } unsigned int GetT1(){ return m_Controls->m_T1box->value(); } bool GetRandomizeSticks(){ return m_Controls->m_RandomCheck->isChecked(); } public slots: protected: // member variables Ui::QmitkAstrosticksModelParametersWidgetControls* m_Controls; private: }; #endif // _QMITKAstrosticksModelParametersWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkBallModelParametersWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkBallModelParametersWidget.h index 2b07f1f5b3..bab9c9b06d 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkBallModelParametersWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkBallModelParametersWidget.h @@ -1,62 +1,60 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKBallModelParametersWidget_H_INCLUDED #define _QMITKBallModelParametersWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkBallModelParametersWidgetControls.h" #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_FIBERFOX_EXPORT QmitkBallModelParametersWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkBallModelParametersWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkBallModelParametersWidget(); virtual void CreateQtPartControl(QWidget *parent); void SetT1(double t1){ m_Controls->m_T1box->setValue(t1); } void SetT2(double t2){ m_Controls->m_T2box->setValue(t2); } void SetD(double d){ m_Controls->m_D1box->setValue(d); } double GetD(){ return m_Controls->m_D1box->value(); } unsigned int GetT2(){ return m_Controls->m_T2box->value(); } unsigned int GetT1(){ return m_Controls->m_T1box->value(); } public slots: protected: // member variables Ui::QmitkBallModelParametersWidgetControls* m_Controls; private: }; #endif // _QMITKBallModelParametersWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkDotModelParametersWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkDotModelParametersWidget.h index 6615fed73e..1cd55142e3 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkDotModelParametersWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkDotModelParametersWidget.h @@ -1,59 +1,57 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKDotModelParametersWidget_H_INCLUDED #define _QMITKDotModelParametersWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkDotModelParametersWidgetControls.h" #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_FIBERFOX_EXPORT QmitkDotModelParametersWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkDotModelParametersWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkDotModelParametersWidget(); virtual void CreateQtPartControl(QWidget *parent); void SetT1(double t1){ m_Controls->m_T1box->setValue(t1); } void SetT2(double t2){ m_Controls->m_T2box->setValue(t2); } unsigned int GetT2(){ return m_Controls->m_T2box->value(); } unsigned int GetT1(){ return m_Controls->m_T1box->value(); } public slots: protected: // member variables Ui::QmitkDotModelParametersWidgetControls* m_Controls; private: }; #endif // _QMITKDotModelParametersWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkPrototypeSignalParametersWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkPrototypeSignalParametersWidget.h index ebd88627a3..1f390e2f2e 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkPrototypeSignalParametersWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkPrototypeSignalParametersWidget.h @@ -1,66 +1,64 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QmitkPrototypeSignalParametersWidget_H_INCLUDED #define _QmitkPrototypeSignalParametersWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkPrototypeSignalParametersWidgetControls.h" #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_FIBERFOX_EXPORT QmitkPrototypeSignalParametersWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkPrototypeSignalParametersWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkPrototypeSignalParametersWidget(); virtual void CreateQtPartControl(QWidget *parent); void SetMinAdc(double min){ m_Controls->m_MinAdcBox->setValue(min); } void SetMaxAdc(double max){ m_Controls->m_MaxAdcBox->setValue(max); } void SetMinFa(double min){ m_Controls->m_MinFaBox->setValue(min); } void SetMaxFa(double max){ m_Controls->m_MaxFaBox->setValue(max); } void SetNumberOfSamples(int n){ m_Controls->m_NumSamplesBox->setValue(n); } double GetMinAdc(){ return m_Controls->m_MinAdcBox->value(); } double GetMaxAdc(){ return m_Controls->m_MaxAdcBox->value(); } double GetMinFa(){ return m_Controls->m_MinFaBox->value(); } double GetMaxFa(){ return m_Controls->m_MaxFaBox->value(); } double GetNumberOfSamples(){ return m_Controls->m_NumSamplesBox->value(); } public slots: protected: // member variables Ui::QmitkPrototypeSignalParametersWidgetControls* m_Controls; private: }; #endif // _QmitkPrototypeSignalParametersWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkStickModelParametersWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkStickModelParametersWidget.h index 13ac0f8342..a70cdbd4c9 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkStickModelParametersWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkStickModelParametersWidget.h @@ -1,62 +1,60 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKStickModelParametersWidget_H_INCLUDED #define _QMITKStickModelParametersWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkStickModelParametersWidgetControls.h" #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_FIBERFOX_EXPORT QmitkStickModelParametersWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkStickModelParametersWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkStickModelParametersWidget(); virtual void CreateQtPartControl(QWidget *parent); void SetT1(double t1){ m_Controls->m_T1box->setValue(t1); } void SetT2(double t2){ m_Controls->m_T2box->setValue(t2); } void SetD(double d){ m_Controls->m_D1box->setValue(d); } double GetD(){ return m_Controls->m_D1box->value(); } unsigned int GetT2(){ return m_Controls->m_T2box->value(); } unsigned int GetT1(){ return m_Controls->m_T1box->value(); } public slots: protected: // member variables Ui::QmitkStickModelParametersWidgetControls* m_Controls; private: }; #endif // _QMITKStickModelParametersWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkTensorModelParametersWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkTensorModelParametersWidget.h index 85abcc548e..28995de88c 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkTensorModelParametersWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkTensorModelParametersWidget.h @@ -1,69 +1,67 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKTensorModelParametersWidget_H_INCLUDED #define _QMITKTensorModelParametersWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkTensorModelParametersWidgetControls.h" #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_FIBERFOX_EXPORT QmitkTensorModelParametersWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkTensorModelParametersWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkTensorModelParametersWidget(); virtual void CreateQtPartControl(QWidget *parent); void SetT1(double t1){ m_Controls->m_T1box->setValue(t1); } void SetT2(double t2){ m_Controls->m_T2box->setValue(t2); } void SetD1(double d1){ m_Controls->m_D1box->setValue(d1); } void SetD2(double d2){ m_Controls->m_D2box->setValue(d2); } void SetD3(double d3){ m_Controls->m_D3box->setValue(d3); } double GetD1(){ return m_Controls->m_D1box->value(); } double GetD2(){ return m_Controls->m_D2box->value(); } double GetD3(){ return m_Controls->m_D3box->value(); } unsigned int GetT2(){ return m_Controls->m_T2box->value(); } unsigned int GetT1(){ return m_Controls->m_T1box->value(); } public slots: void DChanged( double value ); protected: // member variables Ui::QmitkTensorModelParametersWidgetControls* m_Controls; void UpdateUi(); private: }; #endif // _QMITKTensorModelParametersWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkZeppelinModelParametersWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkZeppelinModelParametersWidget.h index 10df85fae5..bf249008f5 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkZeppelinModelParametersWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/QmitkZeppelinModelParametersWidget.h @@ -1,67 +1,65 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKZeppelinModelParametersWidget_H_INCLUDED #define _QMITKZeppelinModelParametersWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkZeppelinModelParametersWidgetControls.h" #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_FIBERFOX_EXPORT QmitkZeppelinModelParametersWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkZeppelinModelParametersWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkZeppelinModelParametersWidget(); virtual void CreateQtPartControl(QWidget *parent); void SetT1(double t1){ m_Controls->m_T1box->setValue(t1); } void SetT2(double t2){ m_Controls->m_T2box->setValue(t2); } void SetD1(double d1){ m_Controls->m_D1box->setValue(d1); } void SetD2(double d2){ m_Controls->m_D2box->setValue(d2); } double GetD1(){ return m_Controls->m_D1box->value(); } double GetD2(){ return m_Controls->m_D2box->value(); } unsigned int GetT2(){ return m_Controls->m_T2box->value(); } unsigned int GetT1(){ return m_Controls->m_T1box->value(); } public slots: void DChanged( double value ); protected: // member variables Ui::QmitkZeppelinModelParametersWidgetControls* m_Controls; void UpdateUi(); private: }; #endif // _QMITKZeppelinModelParametersWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.cpp index b28818685d..b583eb6cb9 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.cpp @@ -1,2902 +1,2902 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //misc #define _USE_MATH_DEFINES #include // Blueberry #include #include // Qmitk #include "QmitkFiberfoxView.h" // MITK #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define RAPIDXML_NO_EXCEPTIONS #include #include #include #include #include "usModuleRegistry.h" #include #include #include #include #include #include #include #include #include #include "mitkNodePredicateDataType.h" #include #include #include #include #define _USE_MATH_DEFINES #include QmitkFiberfoxWorker::QmitkFiberfoxWorker(QmitkFiberfoxView* view) : m_View(view) { } void QmitkFiberfoxWorker::run() { try{ m_View->m_TractsToDwiFilter->Update(); } catch( ... ) { } m_View->m_Thread.quit(); } const std::string QmitkFiberfoxView::VIEW_ID = "org.mitk.views.fiberfoxview"; QmitkFiberfoxView::QmitkFiberfoxView() : QmitkAbstractView() , m_Controls( 0 ) , m_SelectedImageNode( NULL ) , m_Worker(this) , m_ThreadIsRunning(false) { m_Worker.moveToThread(&m_Thread); connect(&m_Thread, SIGNAL(started()), this, SLOT(BeforeThread())); connect(&m_Thread, SIGNAL(started()), &m_Worker, SLOT(run())); connect(&m_Thread, SIGNAL(finished()), this, SLOT(AfterThread())); // connect(&m_Thread, SIGNAL(terminated()), this, SLOT(AfterThread())); m_SimulationTimer = new QTimer(this); } void QmitkFiberfoxView::KillThread() { MITK_INFO << "Aborting DWI simulation."; m_TractsToDwiFilter->SetAbortGenerateData(true); m_Controls->m_AbortSimulationButton->setEnabled(false); m_Controls->m_AbortSimulationButton->setText("Aborting simulation ..."); } void QmitkFiberfoxView::BeforeThread() { m_SimulationTime = QTime::currentTime(); m_SimulationTimer->start(100); m_Controls->m_AbortSimulationButton->setVisible(true); m_Controls->m_GenerateImageButton->setVisible(false); m_Controls->m_SimulationStatusText->setVisible(true); m_ThreadIsRunning = true; } void QmitkFiberfoxView::AfterThread() { UpdateSimulationStatus(); m_SimulationTimer->stop(); m_Controls->m_AbortSimulationButton->setVisible(false); m_Controls->m_AbortSimulationButton->setEnabled(true); m_Controls->m_AbortSimulationButton->setText("Abort simulation"); m_Controls->m_GenerateImageButton->setVisible(true); m_ThreadIsRunning = false; QString statusText; FiberfoxParameters parameters; mitk::Image::Pointer mitkImage = mitk::Image::New(); statusText = QString(m_TractsToDwiFilter->GetStatusText().c_str()); if (m_TractsToDwiFilter->GetAbortGenerateData()) { MITK_INFO << "Simulation aborted."; return; } parameters = m_TractsToDwiFilter->GetParameters(); mitkImage = mitk::GrabItkImageMemory( m_TractsToDwiFilter->GetOutput() ); mitkImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( parameters.m_SignalGen.GetGradientDirections() )); mitkImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( parameters.m_SignalGen.m_Bvalue )); mitk::DiffusionPropertyHelper propertyHelper( mitkImage ); propertyHelper.InitializeImage(); parameters.m_Misc.m_ResultNode->SetData( mitkImage ); GetDataStorage()->Add(parameters.m_Misc.m_ResultNode, parameters.m_Misc.m_ParentNode); parameters.m_Misc.m_ResultNode->SetProperty( "levelwindow", mitk::LevelWindowProperty::New(m_TractsToDwiFilter->GetLevelWindow()) ); if (m_Controls->m_VolumeFractionsBox->isChecked()) { std::vector< itk::TractsToDWIImageFilter< short >::ItkDoubleImgType::Pointer > volumeFractions = m_TractsToDwiFilter->GetVolumeFractions(); for (unsigned int k=0; kInitializeByItk(volumeFractions.at(k).GetPointer()); image->SetVolume(volumeFractions.at(k)->GetBufferPointer()); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( image ); node->SetName("CompartmentVolume-"+QString::number(k).toStdString()); GetDataStorage()->Add(node, parameters.m_Misc.m_ResultNode); } if (m_TractsToDwiFilter->GetPhaseImage().IsNotNull()) { mitk::Image::Pointer phaseImage = mitk::Image::New(); itk::TractsToDWIImageFilter< short >::DoubleDwiType::Pointer itkPhase = m_TractsToDwiFilter->GetPhaseImage(); phaseImage = mitk::GrabItkImageMemory( itkPhase.GetPointer() ); mitk::DataNode::Pointer phaseNode = mitk::DataNode::New(); phaseNode->SetData( phaseImage ); phaseNode->SetName("Phase Image"); GetDataStorage()->Add(phaseNode, parameters.m_Misc.m_ResultNode); } if (m_TractsToDwiFilter->GetKspaceImage().IsNotNull()) { mitk::Image::Pointer image = mitk::Image::New(); itk::TractsToDWIImageFilter< short >::DoubleDwiType::Pointer itkImage = m_TractsToDwiFilter->GetKspaceImage(); image = mitk::GrabItkImageMemory( itkImage.GetPointer() ); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( image ); node->SetName("k-Space"); GetDataStorage()->Add(node, parameters.m_Misc.m_ResultNode); } { mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_TractsToDwiFilter->GetCoilPointset()); node->SetName("Coil Positions"); node->SetProperty("pointsize", mitk::FloatProperty::New(parameters.m_SignalGen.m_ImageSpacing[0]/4)); node->SetProperty("color", mitk::ColorProperty::New(0, 1, 0)); GetDataStorage()->Add(node, parameters.m_Misc.m_ResultNode); } } m_TractsToDwiFilter = NULL; if (parameters.m_Misc.m_AfterSimulationMessage.size()>0) QMessageBox::information( NULL, "Warning", parameters.m_Misc.m_AfterSimulationMessage.c_str()); mitk::BaseData::Pointer basedata = parameters.m_Misc.m_ResultNode->GetData(); if (basedata.IsNotNull()) { mitk::RenderingManager::GetInstance()->InitializeViews( basedata->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } if (!parameters.m_Misc.m_OutputPath.empty()) { try{ QString outputFileName(parameters.m_Misc.m_OutputPath.c_str()); outputFileName += parameters.m_Misc.m_ResultNode->GetName().c_str(); outputFileName.replace(QString("."), QString("_")); SaveParameters(outputFileName+".ffp"); outputFileName += ".dwi"; QString status("Saving output image to "); status += outputFileName; m_Controls->m_SimulationStatusText->append(status); mitk::IOUtil::Save(mitkImage, outputFileName.toStdString()); m_Controls->m_SimulationStatusText->append("File saved successfully."); } catch (itk::ExceptionObject &e) { QString status("Exception during DWI writing: "); status += e.GetDescription(); m_Controls->m_SimulationStatusText->append(status); } catch (...) { m_Controls->m_SimulationStatusText->append("Unknown exception during DWI writing!"); } } parameters.m_SignalGen.m_FrequencyMap = NULL; } void QmitkFiberfoxView::UpdateSimulationStatus() { QString statusText = QString(m_TractsToDwiFilter->GetStatusText().c_str()); if (QString::compare(m_SimulationStatusText,statusText)!=0) { m_Controls->m_SimulationStatusText->clear(); m_Controls->m_SimulationStatusText->setText(statusText); QScrollBar *vScrollBar = m_Controls->m_SimulationStatusText->verticalScrollBar(); vScrollBar->triggerAction(QScrollBar::SliderToMaximum); } } // Destructor QmitkFiberfoxView::~QmitkFiberfoxView() { delete m_SimulationTimer; } void QmitkFiberfoxView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkFiberfoxViewControls; m_Controls->setupUi( parent ); m_Controls->m_StickWidget1->setVisible(true); m_Controls->m_StickWidget2->setVisible(false); m_Controls->m_ZeppelinWidget1->setVisible(false); m_Controls->m_ZeppelinWidget2->setVisible(false); m_Controls->m_TensorWidget1->setVisible(false); m_Controls->m_TensorWidget2->setVisible(false); m_Controls->m_BallWidget1->setVisible(true); m_Controls->m_BallWidget2->setVisible(false); m_Controls->m_BallWidget2->SetT1(4500); m_Controls->m_AstrosticksWidget1->setVisible(false); m_Controls->m_AstrosticksWidget2->setVisible(false); m_Controls->m_AstrosticksWidget2->SetT1(4500); m_Controls->m_DotWidget1->setVisible(false); m_Controls->m_DotWidget2->setVisible(false); m_Controls->m_DotWidget2->SetT1(4500); m_Controls->m_PrototypeWidget1->setVisible(false); m_Controls->m_PrototypeWidget2->setVisible(false); m_Controls->m_PrototypeWidget3->setVisible(false); m_Controls->m_PrototypeWidget4->setVisible(false); m_Controls->m_PrototypeWidget3->SetMinFa(0.0); m_Controls->m_PrototypeWidget3->SetMaxFa(0.15); m_Controls->m_PrototypeWidget4->SetMinFa(0.0); m_Controls->m_PrototypeWidget4->SetMaxFa(0.15); m_Controls->m_PrototypeWidget3->SetMinAdc(0.0); m_Controls->m_PrototypeWidget3->SetMaxAdc(0.001); m_Controls->m_PrototypeWidget4->SetMinAdc(0.003); m_Controls->m_PrototypeWidget4->SetMaxAdc(0.004); m_Controls->m_Comp2FractionFrame->setVisible(false); m_Controls->m_Comp4FractionFrame->setVisible(false); m_Controls->m_DiffusionPropsMessage->setVisible(false); m_Controls->m_GeometryMessage->setVisible(false); m_Controls->m_AdvancedSignalOptionsFrame->setVisible(false); m_Controls->m_AdvancedFiberOptionsFrame->setVisible(false); m_Controls->m_VarianceBox->setVisible(false); m_Controls->m_NoiseFrame->setVisible(false); m_Controls->m_GhostFrame->setVisible(false); m_Controls->m_DistortionsFrame->setVisible(false); m_Controls->m_EddyFrame->setVisible(false); m_Controls->m_SpikeFrame->setVisible(false); m_Controls->m_AliasingFrame->setVisible(false); m_Controls->m_MotionArtifactFrame->setVisible(false); m_ParameterFile = QDir::currentPath()+"/param.ffp"; m_Controls->m_AbortSimulationButton->setVisible(false); m_Controls->m_SimulationStatusText->setVisible(false); m_Controls->m_FrequencyMapBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_Comp1VolumeFraction->SetDataStorage(this->GetDataStorage()); m_Controls->m_Comp2VolumeFraction->SetDataStorage(this->GetDataStorage()); m_Controls->m_Comp3VolumeFraction->SetDataStorage(this->GetDataStorage()); m_Controls->m_Comp4VolumeFraction->SetDataStorage(this->GetDataStorage()); m_Controls->m_MaskComboBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_TemplateComboBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_FiberBundleComboBox->SetDataStorage(this->GetDataStorage()); mitk::TNodePredicateDataType::Pointer isFiberBundle = mitk::TNodePredicateDataType::New(); mitk::TNodePredicateDataType::Pointer isMitkImage = mitk::TNodePredicateDataType::New(); mitk::NodePredicateIsDWI::Pointer isDwi = mitk::NodePredicateIsDWI::New( ); mitk::NodePredicateDataType::Pointer isDti = mitk::NodePredicateDataType::New("TensorImage"); mitk::NodePredicateDataType::Pointer isQbi = mitk::NodePredicateDataType::New("QBallImage"); mitk::NodePredicateOr::Pointer isDiffusionImage = mitk::NodePredicateOr::New(isDwi, isDti); isDiffusionImage = mitk::NodePredicateOr::New(isDiffusionImage, isQbi); mitk::NodePredicateNot::Pointer noDiffusionImage = mitk::NodePredicateNot::New(isDiffusionImage); mitk::NodePredicateAnd::Pointer isNonDiffMitkImage = mitk::NodePredicateAnd::New(isMitkImage, noDiffusionImage); mitk::NodePredicateProperty::Pointer isBinaryPredicate = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); mitk::NodePredicateAnd::Pointer isBinaryMitkImage = mitk::NodePredicateAnd::New( isNonDiffMitkImage, isBinaryPredicate ); m_Controls->m_FrequencyMapBox->SetPredicate(isNonDiffMitkImage); m_Controls->m_Comp1VolumeFraction->SetPredicate(isNonDiffMitkImage); m_Controls->m_Comp1VolumeFraction->SetZeroEntryText("--"); m_Controls->m_Comp2VolumeFraction->SetPredicate(isNonDiffMitkImage); m_Controls->m_Comp2VolumeFraction->SetZeroEntryText("--"); m_Controls->m_Comp3VolumeFraction->SetPredicate(isNonDiffMitkImage); m_Controls->m_Comp3VolumeFraction->SetZeroEntryText("--"); m_Controls->m_Comp4VolumeFraction->SetPredicate(isNonDiffMitkImage); m_Controls->m_Comp4VolumeFraction->SetZeroEntryText("--"); m_Controls->m_MaskComboBox->SetPredicate(isBinaryMitkImage); m_Controls->m_MaskComboBox->SetZeroEntryText("--"); m_Controls->m_TemplateComboBox->SetPredicate(isMitkImage); m_Controls->m_TemplateComboBox->SetZeroEntryText("--"); m_Controls->m_FiberBundleComboBox->SetPredicate(isFiberBundle); m_Controls->m_FiberBundleComboBox->SetZeroEntryText("--"); QFont font; font.setFamily("Courier"); font.setStyleHint(QFont::Monospace); font.setFixedPitch(true); font.setPointSize(8); m_Controls->m_SimulationStatusText->setFont(font); connect( m_SimulationTimer, SIGNAL(timeout()), this, SLOT(UpdateSimulationStatus()) ); connect((QObject*) m_Controls->m_AbortSimulationButton, SIGNAL(clicked()), (QObject*) this, SLOT(KillThread())); connect((QObject*) m_Controls->m_GenerateImageButton, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateImage())); connect((QObject*) m_Controls->m_GenerateFibersButton, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateFibers())); connect((QObject*) m_Controls->m_CircleButton, SIGNAL(clicked()), (QObject*) this, SLOT(OnDrawROI())); connect((QObject*) m_Controls->m_FlipButton, SIGNAL(clicked()), (QObject*) this, SLOT(OnFlipButton())); connect((QObject*) m_Controls->m_JoinBundlesButton, SIGNAL(clicked()), (QObject*) this, SLOT(JoinBundles())); connect((QObject*) m_Controls->m_VarianceBox, SIGNAL(valueChanged(double)), (QObject*) this, SLOT(OnVarianceChanged(double))); connect((QObject*) m_Controls->m_DistributionBox, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(OnDistributionChanged(int))); connect((QObject*) m_Controls->m_FiberDensityBox, SIGNAL(valueChanged(int)), (QObject*) this, SLOT(OnFiberDensityChanged(int))); connect((QObject*) m_Controls->m_FiberSamplingBox, SIGNAL(valueChanged(double)), (QObject*) this, SLOT(OnFiberSamplingChanged(double))); connect((QObject*) m_Controls->m_TensionBox, SIGNAL(valueChanged(double)), (QObject*) this, SLOT(OnTensionChanged(double))); connect((QObject*) m_Controls->m_ContinuityBox, SIGNAL(valueChanged(double)), (QObject*) this, SLOT(OnContinuityChanged(double))); connect((QObject*) m_Controls->m_BiasBox, SIGNAL(valueChanged(double)), (QObject*) this, SLOT(OnBiasChanged(double))); connect((QObject*) m_Controls->m_AddNoise, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnAddNoise(int))); connect((QObject*) m_Controls->m_AddGhosts, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnAddGhosts(int))); connect((QObject*) m_Controls->m_AddDistortions, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnAddDistortions(int))); connect((QObject*) m_Controls->m_AddEddy, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnAddEddy(int))); connect((QObject*) m_Controls->m_AddSpikes, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnAddSpikes(int))); connect((QObject*) m_Controls->m_AddAliasing, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnAddAliasing(int))); connect((QObject*) m_Controls->m_AddMotion, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnAddMotion(int))); connect((QObject*) m_Controls->m_ConstantRadiusBox, SIGNAL(stateChanged(int)), (QObject*) this, SLOT(OnConstantRadius(int))); connect((QObject*) m_Controls->m_CopyBundlesButton, SIGNAL(clicked()), (QObject*) this, SLOT(CopyBundles())); connect((QObject*) m_Controls->m_TransformBundlesButton, SIGNAL(clicked()), (QObject*) this, SLOT(ApplyTransform())); connect((QObject*) m_Controls->m_AlignOnGrid, SIGNAL(clicked()), (QObject*) this, SLOT(AlignOnGrid())); connect((QObject*) m_Controls->m_Compartment1Box, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(Comp1ModelFrameVisibility(int))); connect((QObject*) m_Controls->m_Compartment2Box, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(Comp2ModelFrameVisibility(int))); connect((QObject*) m_Controls->m_Compartment3Box, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(Comp3ModelFrameVisibility(int))); connect((QObject*) m_Controls->m_Compartment4Box, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(Comp4ModelFrameVisibility(int))); connect((QObject*) m_Controls->m_AdvancedOptionsBox, SIGNAL( stateChanged(int)), (QObject*) this, SLOT(ShowAdvancedOptions(int))); connect((QObject*) m_Controls->m_AdvancedOptionsBox_2, SIGNAL( stateChanged(int)), (QObject*) this, SLOT(ShowAdvancedOptions(int))); connect((QObject*) m_Controls->m_SaveParametersButton, SIGNAL(clicked()), (QObject*) this, SLOT(SaveParameters())); connect((QObject*) m_Controls->m_LoadParametersButton, SIGNAL(clicked()), (QObject*) this, SLOT(LoadParameters())); connect((QObject*) m_Controls->m_OutputPathButton, SIGNAL(clicked()), (QObject*) this, SLOT(SetOutputPath())); connect((QObject*) m_Controls->m_MaskComboBox, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(OnMaskSelected(int))); connect((QObject*) m_Controls->m_TemplateComboBox, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(OnTemplateSelected(int))); connect((QObject*) m_Controls->m_FiberBundleComboBox, SIGNAL(currentIndexChanged(int)), (QObject*) this, SLOT(OnFibSelected(int))); } } void QmitkFiberfoxView::OnMaskSelected(int value) { UpdateGui(); } void QmitkFiberfoxView::OnTemplateSelected(int value) { UpdateGui(); } void QmitkFiberfoxView::OnFibSelected(int value) { UpdateGui(); } template< class ScalarType > FiberfoxParameters< ScalarType > QmitkFiberfoxView::UpdateImageParameters(bool all, bool save) { FiberfoxParameters< ScalarType > parameters; parameters.m_Misc.m_OutputPath = ""; parameters.m_Misc.m_CheckAdvancedFiberOptionsBox = m_Controls->m_AdvancedOptionsBox->isChecked(); parameters.m_Misc.m_CheckAdvancedSignalOptionsBox = m_Controls->m_AdvancedOptionsBox_2->isChecked(); parameters.m_Misc.m_CheckOutputVolumeFractionsBox = m_Controls->m_VolumeFractionsBox->isChecked(); parameters.m_Misc.m_AfterSimulationMessage = ""; string outputPath = m_Controls->m_SavePathEdit->text().toStdString(); if (outputPath.compare("-")!=0) { parameters.m_Misc.m_OutputPath = outputPath; parameters.m_Misc.m_OutputPath += "/"; } switch(m_Controls->m_DistributionBox->currentIndex()) { case 0: parameters.m_FiberGen.m_Distribution = FiberGenerationParameters::DISTRIBUTE_UNIFORM; break; case 1: parameters.m_FiberGen.m_Distribution = FiberGenerationParameters::DISTRIBUTE_GAUSSIAN; break; default: parameters.m_FiberGen.m_Distribution = FiberGenerationParameters::DISTRIBUTE_UNIFORM; } parameters.m_FiberGen.m_Variance = m_Controls->m_VarianceBox->value(); parameters.m_FiberGen.m_Density = m_Controls->m_FiberDensityBox->value(); parameters.m_FiberGen.m_Sampling = m_Controls->m_FiberSamplingBox->value(); parameters.m_FiberGen.m_Tension = m_Controls->m_TensionBox->value(); parameters.m_FiberGen.m_Continuity = m_Controls->m_ContinuityBox->value(); parameters.m_FiberGen.m_Bias = m_Controls->m_BiasBox->value(); parameters.m_FiberGen.m_Rotation[0] = m_Controls->m_XrotBox->value(); parameters.m_FiberGen.m_Rotation[1] = m_Controls->m_YrotBox->value(); parameters.m_FiberGen.m_Rotation[2] = m_Controls->m_ZrotBox->value(); parameters.m_FiberGen.m_Translation[0] = m_Controls->m_XtransBox->value(); parameters.m_FiberGen.m_Translation[1] = m_Controls->m_YtransBox->value(); parameters.m_FiberGen.m_Translation[2] = m_Controls->m_ZtransBox->value(); parameters.m_FiberGen.m_Scale[0] = m_Controls->m_XscaleBox->value(); parameters.m_FiberGen.m_Scale[1] = m_Controls->m_YscaleBox->value(); parameters.m_FiberGen.m_Scale[2] = m_Controls->m_ZscaleBox->value(); if (!all) return parameters; if (m_Controls->m_MaskComboBox->GetSelectedNode().IsNotNull()) { mitk::Image::Pointer mitkMaskImage = dynamic_cast(m_Controls->m_MaskComboBox->GetSelectedNode()->GetData()); mitk::CastToItkImage(mitkMaskImage, parameters.m_SignalGen.m_MaskImage); itk::ImageDuplicator::Pointer duplicator = itk::ImageDuplicator::New(); duplicator->SetInputImage(parameters.m_SignalGen.m_MaskImage); duplicator->Update(); parameters.m_SignalGen.m_MaskImage = duplicator->GetOutput(); } if (m_Controls->m_TemplateComboBox->GetSelectedNode().IsNotNull() && mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( m_Controls->m_TemplateComboBox->GetSelectedNode())) // use parameters of selected DWI { mitk::Image::Pointer dwi = dynamic_cast(m_Controls->m_TemplateComboBox->GetSelectedNode()->GetData()); ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(dwi, itkVectorImagePointer); parameters.m_SignalGen.m_ImageRegion = itkVectorImagePointer->GetLargestPossibleRegion(); parameters.m_SignalGen.m_ImageSpacing = itkVectorImagePointer->GetSpacing(); parameters.m_SignalGen.m_ImageOrigin = itkVectorImagePointer->GetOrigin(); parameters.m_SignalGen.m_ImageDirection = itkVectorImagePointer->GetDirection(); parameters.m_SignalGen.m_Bvalue = static_cast(dwi->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue(); parameters.m_SignalGen.SetGradienDirections(static_cast( dwi->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer()); } else if (m_Controls->m_TemplateComboBox->GetSelectedNode().IsNotNull()) // use geometry of selected image { mitk::Image::Pointer img = dynamic_cast(m_Controls->m_TemplateComboBox->GetSelectedNode()->GetData()); itk::Image< float, 3 >::Pointer itkImg = itk::Image< float, 3 >::New(); CastToItkImage< itk::Image< float, 3 > >(img, itkImg); parameters.m_SignalGen.m_ImageRegion = itkImg->GetLargestPossibleRegion(); parameters.m_SignalGen.m_ImageSpacing = itkImg->GetSpacing(); parameters.m_SignalGen.m_ImageOrigin = itkImg->GetOrigin(); parameters.m_SignalGen.m_ImageDirection = itkImg->GetDirection(); parameters.m_SignalGen.SetNumWeightedVolumes(m_Controls->m_NumGradientsBox->value()); parameters.m_SignalGen.m_Bvalue = m_Controls->m_BvalueBox->value(); } else if (parameters.m_SignalGen.m_MaskImage.IsNotNull()) // use geometry of mask image { ItkUcharImgType::Pointer itkImg = parameters.m_SignalGen.m_MaskImage; parameters.m_SignalGen.m_ImageRegion = itkImg->GetLargestPossibleRegion(); parameters.m_SignalGen.m_ImageSpacing = itkImg->GetSpacing(); parameters.m_SignalGen.m_ImageOrigin = itkImg->GetOrigin(); parameters.m_SignalGen.m_ImageDirection = itkImg->GetDirection(); parameters.m_SignalGen.SetNumWeightedVolumes(m_Controls->m_NumGradientsBox->value()); parameters.m_SignalGen.m_Bvalue = m_Controls->m_BvalueBox->value(); } else // use GUI parameters { parameters.m_SignalGen.m_ImageRegion.SetSize(0, m_Controls->m_SizeX->value()); parameters.m_SignalGen.m_ImageRegion.SetSize(1, m_Controls->m_SizeY->value()); parameters.m_SignalGen.m_ImageRegion.SetSize(2, m_Controls->m_SizeZ->value()); parameters.m_SignalGen.m_ImageSpacing[0] = m_Controls->m_SpacingX->value(); parameters.m_SignalGen.m_ImageSpacing[1] = m_Controls->m_SpacingY->value(); parameters.m_SignalGen.m_ImageSpacing[2] = m_Controls->m_SpacingZ->value(); parameters.m_SignalGen.m_ImageOrigin[0] = parameters.m_SignalGen.m_ImageSpacing[0]/2; parameters.m_SignalGen.m_ImageOrigin[1] = parameters.m_SignalGen.m_ImageSpacing[1]/2; parameters.m_SignalGen.m_ImageOrigin[2] = parameters.m_SignalGen.m_ImageSpacing[2]/2; parameters.m_SignalGen.m_ImageDirection.SetIdentity(); parameters.m_SignalGen.SetNumWeightedVolumes(m_Controls->m_NumGradientsBox->value()); parameters.m_SignalGen.m_Bvalue = m_Controls->m_BvalueBox->value(); parameters.m_SignalGen.GenerateGradientHalfShell(); } // signal relaxation parameters.m_SignalGen.m_DoSimulateRelaxation = false; if (m_Controls->m_RelaxationBox->isChecked() && (m_Controls->m_FiberBundleComboBox->GetSelectedNode().IsNotNull() || save) ) { parameters.m_SignalGen.m_DoSimulateRelaxation = true; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Relaxation", BoolProperty::New(true)); parameters.m_Misc.m_ArtifactModelString += "_RELAX"; } parameters.m_SignalGen.m_SimulateKspaceAcquisition = parameters.m_SignalGen.m_DoSimulateRelaxation; // N/2 ghosts parameters.m_Misc.m_CheckAddGhostsBox = m_Controls->m_AddGhosts->isChecked(); if (m_Controls->m_AddGhosts->isChecked()) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; parameters.m_Misc.m_ArtifactModelString += "_GHOST"; parameters.m_SignalGen.m_KspaceLineOffset = m_Controls->m_kOffsetBox->value(); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Ghost", DoubleProperty::New(parameters.m_SignalGen.m_KspaceLineOffset)); } else parameters.m_SignalGen.m_KspaceLineOffset = 0; // Aliasing parameters.m_Misc.m_CheckAddAliasingBox = m_Controls->m_AddAliasing->isChecked(); if (m_Controls->m_AddAliasing->isChecked()) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; parameters.m_Misc.m_ArtifactModelString += "_ALIASING"; parameters.m_SignalGen.m_CroppingFactor = (100-m_Controls->m_WrapBox->value())/100; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Aliasing", DoubleProperty::New(m_Controls->m_WrapBox->value())); } // Spikes parameters.m_Misc.m_CheckAddSpikesBox = m_Controls->m_AddSpikes->isChecked(); if (m_Controls->m_AddSpikes->isChecked()) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; parameters.m_SignalGen.m_Spikes = m_Controls->m_SpikeNumBox->value(); parameters.m_SignalGen.m_SpikeAmplitude = m_Controls->m_SpikeScaleBox->value(); parameters.m_Misc.m_ArtifactModelString += "_SPIKES"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Spikes.Number", IntProperty::New(parameters.m_SignalGen.m_Spikes)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Spikes.Amplitude", DoubleProperty::New(parameters.m_SignalGen.m_SpikeAmplitude)); } // gibbs ringing parameters.m_SignalGen.m_DoAddGibbsRinging = m_Controls->m_AddGibbsRinging->isChecked(); if (m_Controls->m_AddGibbsRinging->isChecked()) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Ringing", BoolProperty::New(true)); parameters.m_Misc.m_ArtifactModelString += "_RINGING"; } // add distortions parameters.m_Misc.m_CheckAddDistortionsBox = m_Controls->m_AddDistortions->isChecked(); if (m_Controls->m_AddDistortions->isChecked() && m_Controls->m_FrequencyMapBox->GetSelectedNode().IsNotNull()) { mitk::DataNode::Pointer fMapNode = m_Controls->m_FrequencyMapBox->GetSelectedNode(); mitk::Image* img = dynamic_cast(fMapNode->GetData()); ItkDoubleImgType::Pointer itkImg = ItkDoubleImgType::New(); CastToItkImage< ItkDoubleImgType >(img, itkImg); if (m_Controls->m_TemplateComboBox->GetSelectedNode().IsNull()) // use geometry of frequency map { parameters.m_SignalGen.m_ImageRegion = itkImg->GetLargestPossibleRegion(); parameters.m_SignalGen.m_ImageSpacing = itkImg->GetSpacing(); parameters.m_SignalGen.m_ImageOrigin = itkImg->GetOrigin(); parameters.m_SignalGen.m_ImageDirection = itkImg->GetDirection(); } if (parameters.m_SignalGen.m_ImageRegion.GetSize(0)==itkImg->GetLargestPossibleRegion().GetSize(0) && parameters.m_SignalGen.m_ImageRegion.GetSize(1)==itkImg->GetLargestPossibleRegion().GetSize(1) && parameters.m_SignalGen.m_ImageRegion.GetSize(2)==itkImg->GetLargestPossibleRegion().GetSize(2)) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; itk::ImageDuplicator::Pointer duplicator = itk::ImageDuplicator::New(); duplicator->SetInputImage(itkImg); duplicator->Update(); parameters.m_SignalGen.m_FrequencyMap = duplicator->GetOutput(); parameters.m_Misc.m_ArtifactModelString += "_DISTORTED"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Distortions", BoolProperty::New(true)); } } parameters.m_SignalGen.m_EddyStrength = 0; parameters.m_Misc.m_CheckAddEddyCurrentsBox = m_Controls->m_AddEddy->isChecked(); if (m_Controls->m_AddEddy->isChecked()) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; parameters.m_SignalGen.m_EddyStrength = m_Controls->m_EddyGradientStrength->value(); parameters.m_Misc.m_ArtifactModelString += "_EDDY"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Eddy-strength", DoubleProperty::New(parameters.m_SignalGen.m_EddyStrength)); } // Motion parameters.m_SignalGen.m_DoAddMotion = false; parameters.m_SignalGen.m_DoRandomizeMotion = m_Controls->m_RandomMotion->isChecked(); parameters.m_SignalGen.m_Translation[0] = m_Controls->m_MaxTranslationBoxX->value(); parameters.m_SignalGen.m_Translation[1] = m_Controls->m_MaxTranslationBoxY->value(); parameters.m_SignalGen.m_Translation[2] = m_Controls->m_MaxTranslationBoxZ->value(); parameters.m_SignalGen.m_Rotation[0] = m_Controls->m_MaxRotationBoxX->value(); parameters.m_SignalGen.m_Rotation[1] = m_Controls->m_MaxRotationBoxY->value(); parameters.m_SignalGen.m_Rotation[2] = m_Controls->m_MaxRotationBoxZ->value(); parameters.m_SignalGen.m_MotionVolumes.clear(); parameters.m_Misc.m_MotionVolumesBox = m_Controls->m_MotionVolumesBox->text().toStdString(); if ( m_Controls->m_AddMotion->isChecked() && (m_Controls->m_FiberBundleComboBox->GetSelectedNode().IsNotNull() || save) ) { parameters.m_SignalGen.m_DoAddMotion = true; parameters.m_Misc.m_ArtifactModelString += "_MOTION"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Motion.Random", BoolProperty::New(parameters.m_SignalGen.m_DoRandomizeMotion)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Motion.Translation-x", DoubleProperty::New(parameters.m_SignalGen.m_Translation[0])); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Motion.Translation-y", DoubleProperty::New(parameters.m_SignalGen.m_Translation[1])); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Motion.Translation-z", DoubleProperty::New(parameters.m_SignalGen.m_Translation[2])); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Motion.Rotation-x", DoubleProperty::New(parameters.m_SignalGen.m_Rotation[0])); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Motion.Rotation-y", DoubleProperty::New(parameters.m_SignalGen.m_Rotation[1])); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Motion.Rotation-z", DoubleProperty::New(parameters.m_SignalGen.m_Rotation[2])); if ( parameters.m_Misc.m_MotionVolumesBox == "random" ) { for ( size_t i=0; i < parameters.m_SignalGen.GetNumVolumes(); ++i ) { parameters.m_SignalGen.m_MotionVolumes.push_back( bool( rand()%2 ) ); } MITK_DEBUG << "QmitkFiberfoxView.cpp: Case m_Misc.m_MotionVolumesBox == \"random\"."; } else if ( ! parameters.m_Misc.m_MotionVolumesBox.empty() ) { stringstream stream( parameters.m_Misc.m_MotionVolumesBox ); std::vector numbers; int nummer = std::numeric_limits::max(); while( stream >> nummer ) { if( nummer < std::numeric_limits::max() ) { numbers.push_back( nummer ); } } // If a list of negative numbers is given: if( *(std::min_element( numbers.begin(), numbers.end() )) < 0 && *(std::max_element( numbers.begin(), numbers.end() )) <= 0 ) // cave: -0 == +0 { for ( size_t i=0; i < parameters.m_SignalGen.GetNumVolumes(); ++i ) { parameters.m_SignalGen.m_MotionVolumes.push_back( true ); } // set all true except those given. for( auto iter = std::begin( numbers ); iter != std::end( numbers ); ++iter ) { if ( -(*iter) < parameters.m_SignalGen.GetNumVolumes() && -(*iter) >= 0 ) { parameters.m_SignalGen.m_MotionVolumes.at( -(*iter) ) = false; } } MITK_DEBUG << "QmitkFiberfoxView.cpp: Case list of negative numbers."; } // If a list of positive numbers is given: else if( *(std::min_element( numbers.begin(), numbers.end() )) >= 0 && *(std::max_element( numbers.begin(), numbers.end() )) >= 0 ) { for ( size_t i=0; i < parameters.m_SignalGen.GetNumVolumes(); ++i ) { parameters.m_SignalGen.m_MotionVolumes.push_back( false ); } // set all false except those given. for( auto iter = std::begin( numbers ); iter != std::end( numbers ); ++iter ) { if ( *iter < parameters.m_SignalGen.GetNumVolumes() && *iter >= 0 ) { parameters.m_SignalGen.m_MotionVolumes.at( *iter ) = true; } } MITK_DEBUG << "QmitkFiberfoxView.cpp: Case list of positive numbers."; } else { MITK_ERROR << "QmitkFiberfoxView.cpp: Inconsistent list of numbers in m_MotionVolumesBox."; } } else { MITK_WARN << "QmitkFiberfoxView.cpp: Unrecognised parameters.m_Misc.m_MotionVolumesBox: " << parameters.m_Misc.m_MotionVolumesBox; parameters.m_Misc.m_MotionVolumesBox = "random"; // set default. for (int i=0; im_AcquisitionTypeBox->currentIndex(); parameters.m_SignalGen.m_CoilSensitivityProfile = (SignalGenerationParameters::CoilSensitivityProfile)m_Controls->m_CoilSensBox->currentIndex(); parameters.m_SignalGen.m_NumberOfCoils = m_Controls->m_NumCoilsBox->value(); parameters.m_SignalGen.m_PartialFourier = m_Controls->m_PartialFourier->value(); parameters.m_SignalGen.m_ReversePhase = m_Controls->m_ReversePhaseBox->isChecked(); parameters.m_SignalGen.m_tLine = m_Controls->m_LineReadoutTimeBox->value(); parameters.m_SignalGen.m_tInhom = m_Controls->m_T2starBox->value(); parameters.m_SignalGen.m_tEcho = m_Controls->m_TEbox->value(); parameters.m_SignalGen.m_tRep = m_Controls->m_TRbox->value(); parameters.m_SignalGen.m_DoDisablePartialVolume = m_Controls->m_EnforcePureFiberVoxelsBox->isChecked(); parameters.m_SignalGen.m_AxonRadius = m_Controls->m_FiberRadius->value(); parameters.m_SignalGen.m_SignalScale = m_Controls->m_SignalScaleBox->value(); double voxelVolume = parameters.m_SignalGen.m_ImageSpacing[0] * parameters.m_SignalGen.m_ImageSpacing[1] * parameters.m_SignalGen.m_ImageSpacing[2]; if ( parameters.m_SignalGen.m_SignalScale*voxelVolume > itk::NumericTraits::max()*0.75 ) { parameters.m_SignalGen.m_SignalScale = itk::NumericTraits::max()*0.75/voxelVolume; m_Controls->m_SignalScaleBox->setValue(parameters.m_SignalGen.m_SignalScale); QMessageBox::information( NULL, "Warning", "Maximum signal exceeding data type limits. Automatically adjusted to " + QString::number(parameters.m_SignalGen.m_SignalScale) + " to obtain a maximum signal of 75% of the data type maximum." " Relaxation and other effects that affect the signal intensities are not accounted for."); } // Noise parameters.m_Misc.m_CheckAddNoiseBox = m_Controls->m_AddNoise->isChecked(); parameters.m_SignalGen.m_NoiseVariance = 0; if (m_Controls->m_AddNoise->isChecked()) { double noiseVariance = m_Controls->m_NoiseLevel->value(); switch (m_Controls->m_NoiseDistributionBox->currentIndex()) { case 0: { if (noiseVariance>0) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; parameters.m_Misc.m_ArtifactModelString += "_COMPLEX-GAUSSIAN-"; parameters.m_SignalGen.m_NoiseVariance = m_Controls->m_NoiseLevel->value(); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Noise-Distribution", StringProperty::New("Complex Gaussian")); } break; } case 1: { if (noiseVariance>0) { parameters.m_NoiseModel = std::make_shared< mitk::RicianNoiseModel >(); parameters.m_Misc.m_ArtifactModelString += "_RICIAN-"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Noise-Distribution", StringProperty::New("Rician")); parameters.m_NoiseModel->SetNoiseVariance(noiseVariance); } break; } case 2: { if (noiseVariance>0) { parameters.m_NoiseModel = std::make_shared< mitk::ChiSquareNoiseModel >(); parameters.m_Misc.m_ArtifactModelString += "_CHISQUARED-"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Noise-Distribution", StringProperty::New("Chi-squared")); parameters.m_NoiseModel->SetNoiseVariance(noiseVariance); } break; } default: { if (noiseVariance>0) { parameters.m_SignalGen.m_SimulateKspaceAcquisition = true; parameters.m_Misc.m_ArtifactModelString += "_COMPLEX-GAUSSIAN-"; parameters.m_SignalGen.m_NoiseVariance = m_Controls->m_NoiseLevel->value(); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Noise-Distribution", StringProperty::New("Complex Gaussian")); } break; } } if (noiseVariance>0) { parameters.m_Misc.m_ArtifactModelString += QString::number(noiseVariance).toStdString(); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Noise-Variance", DoubleProperty::New(noiseVariance)); } } // signal models { // compartment 1 switch (m_Controls->m_Compartment1Box->currentIndex()) { case 0: { mitk::StickModel* model = new mitk::StickModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity(m_Controls->m_StickWidget1->GetD()); model->SetT2(m_Controls->m_StickWidget1->GetT2()); model->SetT1(m_Controls->m_StickWidget1->GetT1()); model->m_CompartmentId = 1; parameters.m_FiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Stick"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Description", StringProperty::New("Intra-axonal compartment") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Model", StringProperty::New("Stick") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.D", DoubleProperty::New(m_Controls->m_StickWidget1->GetD()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.T2", DoubleProperty::New(model->GetT2()) ); break; } case 1: { mitk::TensorModel* model = new mitk::TensorModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity1(m_Controls->m_ZeppelinWidget1->GetD1()); model->SetDiffusivity2(m_Controls->m_ZeppelinWidget1->GetD2()); model->SetDiffusivity3(m_Controls->m_ZeppelinWidget1->GetD2()); model->SetT2(m_Controls->m_ZeppelinWidget1->GetT2()); model->SetT1(m_Controls->m_ZeppelinWidget1->GetT1()); model->m_CompartmentId = 1; parameters.m_FiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Zeppelin"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Description", StringProperty::New("Intra-axonal compartment") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Model", StringProperty::New("Zeppelin") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.D1", DoubleProperty::New(m_Controls->m_ZeppelinWidget1->GetD1()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.D2", DoubleProperty::New(m_Controls->m_ZeppelinWidget1->GetD2()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.T2", DoubleProperty::New(model->GetT2()) ); break; } case 2: { mitk::TensorModel* model = new mitk::TensorModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity1(m_Controls->m_TensorWidget1->GetD1()); model->SetDiffusivity2(m_Controls->m_TensorWidget1->GetD2()); model->SetDiffusivity3(m_Controls->m_TensorWidget1->GetD3()); model->SetT2(m_Controls->m_TensorWidget1->GetT2()); model->SetT1(m_Controls->m_TensorWidget1->GetT1()); model->m_CompartmentId = 1; parameters.m_FiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Tensor"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Description", StringProperty::New("Intra-axonal compartment") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Model", StringProperty::New("Tensor") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.D1", DoubleProperty::New(m_Controls->m_TensorWidget1->GetD1()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.D2", DoubleProperty::New(m_Controls->m_TensorWidget1->GetD2()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.D3", DoubleProperty::New(m_Controls->m_TensorWidget1->GetD3()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.T2", DoubleProperty::New(model->GetT2()) ); break; } case 3: { mitk::RawShModel* model = new mitk::RawShModel(); parameters.m_SignalGen.m_DoSimulateRelaxation = false; model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetMaxNumKernels(m_Controls->m_PrototypeWidget1->GetNumberOfSamples()); model->SetFaRange(m_Controls->m_PrototypeWidget1->GetMinFa(), m_Controls->m_PrototypeWidget1->GetMaxFa()); model->SetAdcRange(m_Controls->m_PrototypeWidget1->GetMinAdc(), m_Controls->m_PrototypeWidget1->GetMaxAdc()); model->m_CompartmentId = 1; parameters.m_FiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Prototype"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Description", StringProperty::New("Intra-axonal compartment") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment1.Model", StringProperty::New("Prototype") ); break; } } if (m_Controls->m_Comp1VolumeFraction->GetSelectedNode().IsNotNull()) { mitk::DataNode::Pointer volumeNode = m_Controls->m_Comp1VolumeFraction->GetSelectedNode(); ItkDoubleImgType::Pointer comp1VolumeImage = ItkDoubleImgType::New(); mitk::Image* img = dynamic_cast(volumeNode->GetData()); CastToItkImage< ItkDoubleImgType >(img, comp1VolumeImage); parameters.m_FiberModelList.back()->SetVolumeFractionImage(comp1VolumeImage); } // compartment 2 switch (m_Controls->m_Compartment2Box->currentIndex()) { case 0: break; case 1: { mitk::StickModel* model = new mitk::StickModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity(m_Controls->m_StickWidget2->GetD()); model->SetT2(m_Controls->m_StickWidget2->GetT2()); model->SetT1(m_Controls->m_StickWidget2->GetT1()); model->m_CompartmentId = 2; parameters.m_FiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Stick"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.Description", StringProperty::New("Inter-axonal compartment") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.Model", StringProperty::New("Stick") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.D", DoubleProperty::New(m_Controls->m_StickWidget2->GetD()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.T2", DoubleProperty::New(model->GetT2()) ); break; } case 2: { mitk::TensorModel* model = new mitk::TensorModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity1(m_Controls->m_ZeppelinWidget2->GetD1()); model->SetDiffusivity2(m_Controls->m_ZeppelinWidget2->GetD2()); model->SetDiffusivity3(m_Controls->m_ZeppelinWidget2->GetD2()); model->SetT2(m_Controls->m_ZeppelinWidget2->GetT2()); model->SetT1(m_Controls->m_ZeppelinWidget2->GetT1()); model->m_CompartmentId = 2; parameters.m_FiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Zeppelin"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.Description", StringProperty::New("Inter-axonal compartment") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.Model", StringProperty::New("Zeppelin") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.D1", DoubleProperty::New(m_Controls->m_ZeppelinWidget2->GetD1()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.D2", DoubleProperty::New(m_Controls->m_ZeppelinWidget2->GetD2()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.T2", DoubleProperty::New(model->GetT2()) ); break; } case 3: { mitk::TensorModel* model = new mitk::TensorModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity1(m_Controls->m_TensorWidget2->GetD1()); model->SetDiffusivity2(m_Controls->m_TensorWidget2->GetD2()); model->SetDiffusivity3(m_Controls->m_TensorWidget2->GetD3()); model->SetT2(m_Controls->m_TensorWidget2->GetT2()); model->SetT1(m_Controls->m_TensorWidget2->GetT1()); model->m_CompartmentId = 2; parameters.m_FiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Tensor"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.Description", StringProperty::New("Inter-axonal compartment") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.Model", StringProperty::New("Tensor") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.D1", DoubleProperty::New(m_Controls->m_TensorWidget2->GetD1()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.D2", DoubleProperty::New(m_Controls->m_TensorWidget2->GetD2()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.D3", DoubleProperty::New(m_Controls->m_TensorWidget2->GetD3()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment2.T2", DoubleProperty::New(model->GetT2()) ); break; } } if (m_Controls->m_Comp2VolumeFraction->GetSelectedNode().IsNotNull() && parameters.m_FiberModelList.size()==2) { mitk::DataNode::Pointer volumeNode = m_Controls->m_Comp2VolumeFraction->GetSelectedNode(); ItkDoubleImgType::Pointer comp1VolumeImage = ItkDoubleImgType::New(); mitk::Image* img = dynamic_cast(volumeNode->GetData()); CastToItkImage< ItkDoubleImgType >(img, comp1VolumeImage); parameters.m_FiberModelList.back()->SetVolumeFractionImage(comp1VolumeImage); } // compartment 3 switch (m_Controls->m_Compartment3Box->currentIndex()) { case 0: { mitk::BallModel* model = new mitk::BallModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity(m_Controls->m_BallWidget1->GetD()); model->SetT2(m_Controls->m_BallWidget1->GetT2()); model->SetT1(m_Controls->m_BallWidget1->GetT1()); model->m_CompartmentId = 3; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Ball"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Description", StringProperty::New("Extra-axonal compartment 1") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Model", StringProperty::New("Ball") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.D", DoubleProperty::New(m_Controls->m_BallWidget1->GetD()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.T2", DoubleProperty::New(model->GetT2()) ); break; } case 1: { mitk::AstroStickModel* model = new mitk::AstroStickModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity(m_Controls->m_AstrosticksWidget1->GetD()); model->SetT2(m_Controls->m_AstrosticksWidget1->GetT2()); model->SetT1(m_Controls->m_AstrosticksWidget1->GetT1()); model->SetRandomizeSticks(m_Controls->m_AstrosticksWidget1->GetRandomizeSticks()); model->m_CompartmentId = 3; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Astrosticks"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Description", StringProperty::New("Extra-axonal compartment 1") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Model", StringProperty::New("Astrosticks") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.D", DoubleProperty::New(m_Controls->m_AstrosticksWidget1->GetD()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.T2", DoubleProperty::New(model->GetT2()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.RandomSticks", BoolProperty::New(m_Controls->m_AstrosticksWidget1->GetRandomizeSticks()) ); break; } case 2: { mitk::DotModel* model = new mitk::DotModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetT2(m_Controls->m_DotWidget1->GetT2()); model->SetT1(m_Controls->m_DotWidget1->GetT1()); model->m_CompartmentId = 3; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Dot"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Description", StringProperty::New("Extra-axonal compartment 1") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Model", StringProperty::New("Dot") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.T2", DoubleProperty::New(model->GetT2()) ); break; } case 3: { mitk::RawShModel* model = new mitk::RawShModel(); parameters.m_SignalGen.m_DoSimulateRelaxation = false; model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetMaxNumKernels(m_Controls->m_PrototypeWidget3->GetNumberOfSamples()); model->SetFaRange(m_Controls->m_PrototypeWidget3->GetMinFa(), m_Controls->m_PrototypeWidget3->GetMaxFa()); model->SetAdcRange(m_Controls->m_PrototypeWidget3->GetMinAdc(), m_Controls->m_PrototypeWidget3->GetMaxAdc()); model->m_CompartmentId = 3; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Prototype"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Description", StringProperty::New("Extra-axonal compartment 1") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment3.Model", StringProperty::New("Prototype") ); break; } } if (m_Controls->m_Comp3VolumeFraction->GetSelectedNode().IsNotNull()) { mitk::DataNode::Pointer volumeNode = m_Controls->m_Comp3VolumeFraction->GetSelectedNode(); ItkDoubleImgType::Pointer comp1VolumeImage = ItkDoubleImgType::New(); mitk::Image* img = dynamic_cast(volumeNode->GetData()); CastToItkImage< ItkDoubleImgType >(img, comp1VolumeImage); parameters.m_NonFiberModelList.back()->SetVolumeFractionImage(comp1VolumeImage); } switch (m_Controls->m_Compartment4Box->currentIndex()) { case 0: break; case 1: { mitk::BallModel* model = new mitk::BallModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity(m_Controls->m_BallWidget2->GetD()); model->SetT2(m_Controls->m_BallWidget2->GetT2()); model->SetT1(m_Controls->m_BallWidget2->GetT1()); model->m_CompartmentId = 4; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Ball"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Description", StringProperty::New("Extra-axonal compartment 2") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Model", StringProperty::New("Ball") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.D", DoubleProperty::New(m_Controls->m_BallWidget2->GetD()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.T2", DoubleProperty::New(model->GetT2()) ); break; } case 2: { mitk::AstroStickModel* model = new mitk::AstroStickModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetBvalue(parameters.m_SignalGen.m_Bvalue); model->SetDiffusivity(m_Controls->m_AstrosticksWidget2->GetD()); model->SetT2(m_Controls->m_AstrosticksWidget2->GetT2()); model->SetT1(m_Controls->m_AstrosticksWidget2->GetT1()); model->SetRandomizeSticks(m_Controls->m_AstrosticksWidget2->GetRandomizeSticks()); model->m_CompartmentId = 4; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Astrosticks"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Description", StringProperty::New("Extra-axonal compartment 2") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Model", StringProperty::New("Astrosticks") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.D", DoubleProperty::New(m_Controls->m_AstrosticksWidget2->GetD()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.T2", DoubleProperty::New(model->GetT2()) ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.RandomSticks", BoolProperty::New(m_Controls->m_AstrosticksWidget2->GetRandomizeSticks()) ); break; } case 3: { mitk::DotModel* model = new mitk::DotModel(); model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetT2(m_Controls->m_DotWidget2->GetT2()); model->SetT1(m_Controls->m_DotWidget2->GetT1()); model->m_CompartmentId = 4; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Dot"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Description", StringProperty::New("Extra-axonal compartment 2") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Model", StringProperty::New("Dot") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.T2", DoubleProperty::New(model->GetT2()) ); break; } case 4: { mitk::RawShModel* model = new mitk::RawShModel(); parameters.m_SignalGen.m_DoSimulateRelaxation = false; model->SetGradientList(parameters.m_SignalGen.GetGradientDirections()); model->SetMaxNumKernels(m_Controls->m_PrototypeWidget4->GetNumberOfSamples()); model->SetFaRange(m_Controls->m_PrototypeWidget4->GetMinFa(), m_Controls->m_PrototypeWidget4->GetMaxFa()); model->SetAdcRange(m_Controls->m_PrototypeWidget4->GetMinAdc(), m_Controls->m_PrototypeWidget4->GetMaxAdc()); model->m_CompartmentId = 4; parameters.m_NonFiberModelList.push_back(model); parameters.m_Misc.m_SignalModelString += "Prototype"; parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Description", StringProperty::New("Extra-axonal compartment 2") ); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Compartment4.Model", StringProperty::New("Prototype") ); break; } } if (m_Controls->m_Comp4VolumeFraction->GetSelectedNode().IsNotNull() && parameters.m_NonFiberModelList.size()==2) { mitk::DataNode::Pointer volumeNode = m_Controls->m_Comp4VolumeFraction->GetSelectedNode(); ItkDoubleImgType::Pointer compVolumeImage = ItkDoubleImgType::New(); mitk::Image* img = dynamic_cast(volumeNode->GetData()); CastToItkImage< ItkDoubleImgType >(img, compVolumeImage); parameters.m_NonFiberModelList.back()->SetVolumeFractionImage(compVolumeImage); } } parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.SignalScale", IntProperty::New(parameters.m_SignalGen.m_SignalScale)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.FiberRadius", IntProperty::New(parameters.m_SignalGen.m_AxonRadius)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Tinhom", DoubleProperty::New(parameters.m_SignalGen.m_tInhom)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Tline", DoubleProperty::New(parameters.m_SignalGen.m_tLine)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.TE", DoubleProperty::New(parameters.m_SignalGen.m_tEcho)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.b-value", DoubleProperty::New(parameters.m_SignalGen.m_Bvalue)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.NoPartialVolume", BoolProperty::New(parameters.m_SignalGen.m_DoDisablePartialVolume)); parameters.m_Misc.m_ResultNode->AddProperty("Fiberfox.Relaxation", BoolProperty::New(parameters.m_SignalGen.m_DoSimulateRelaxation)); parameters.m_Misc.m_ResultNode->AddProperty("binary", BoolProperty::New(false)); parameters.m_Misc.m_CheckRealTimeFibersBox = m_Controls->m_RealTimeFibers->isChecked(); parameters.m_Misc.m_CheckAdvancedFiberOptionsBox = m_Controls->m_AdvancedOptionsBox->isChecked(); parameters.m_Misc.m_CheckIncludeFiducialsBox = m_Controls->m_IncludeFiducials->isChecked(); parameters.m_Misc.m_CheckConstantRadiusBox = m_Controls->m_ConstantRadiusBox->isChecked(); return parameters; } void QmitkFiberfoxView::SaveParameters(QString filename) { FiberfoxParameters<> ffParamaters = UpdateImageParameters(true, true); std::vector< int > bVals = ffParamaters.m_SignalGen.GetBvalues(); std::cout << "b-values: "; for (auto v : bVals) std::cout << v << " "; std::cout << std::endl; bool ok = true; bool first = true; bool dosampling = false; mitk::Image::Pointer diffImg = NULL; itk::Image< itk::DiffusionTensor3D< double >, 3 >::Pointer tensorImage = NULL; const int shOrder = 2; typedef itk::AnalyticalDiffusionQballReconstructionImageFilter QballFilterType; QballFilterType::CoefficientImageType::Pointer itkFeatureImage = NULL; ItkDoubleImgType::Pointer adcImage = NULL; for (unsigned int i=0; i* model = nullptr; if (i* >(ffParamaters.m_FiberModelList.at(i)); } else { model = dynamic_cast< mitk::RawShModel<>* >(ffParamaters.m_NonFiberModelList.at(i-ffParamaters.m_FiberModelList.size())); } if ( model!=nullptr && model->GetNumberOfKernels() <= 0 ) { if (first==true) { if ( QMessageBox::question(NULL, "Prototype signal sampling", "Do you want to sample prototype signals from the selected diffusion-weighted imag and save them?", QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes ) dosampling = true; first = false; if ( dosampling && (m_Controls->m_TemplateComboBox->GetSelectedNode().IsNull() || !mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(m_Controls->m_TemplateComboBox->GetSelectedNode()->GetData()) ) ) ) { QMessageBox::information(NULL, "Parameter file not saved", "No diffusion-weighted image selected to sample signal from."); return; } else if (dosampling) { diffImg = dynamic_cast(m_Controls->m_TemplateComboBox->GetSelectedNode()->GetData()); typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, double > TensorReconstructionImageFilterType; TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New(); ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(diffImg, itkVectorImagePointer); filter->SetGradientImage( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(), itkVectorImagePointer ); filter->SetBValue( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str() ).GetPointer() ) ->GetValue() ); filter->Update(); tensorImage = filter->GetOutput(); QballFilterType::Pointer qballfilter = QballFilterType::New(); qballfilter->SetGradientImage( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(), itkVectorImagePointer ); qballfilter->SetBValue( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); qballfilter->SetLambda(0.006); qballfilter->SetNormalizationMethod(QballFilterType::QBAR_RAW_SIGNAL); qballfilter->Update(); itkFeatureImage = qballfilter->GetCoefficientImage(); itk::AdcImageFilter< short, double >::Pointer adcFilter = itk::AdcImageFilter< short, double >::New(); adcFilter->SetInput( itkVectorImagePointer ); adcFilter->SetGradientDirections( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); adcFilter->SetB_value( static_cast (diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); adcFilter->Update(); adcImage = adcFilter->GetOutput(); } } typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, double > TensorReconstructionImageFilterType; TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New(); ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(diffImg, itkVectorImagePointer); filter->SetGradientImage( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(), itkVectorImagePointer ); filter->SetBValue( static_cast (diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); filter->Update(); tensorImage = filter->GetOutput(); QballFilterType::Pointer qballfilter = QballFilterType::New(); qballfilter->SetGradientImage( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(), itkVectorImagePointer ); qballfilter->SetBValue( static_cast (diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); qballfilter->SetLambda(0.006); qballfilter->SetNormalizationMethod(QballFilterType::QBAR_RAW_SIGNAL); qballfilter->Update(); itkFeatureImage = qballfilter->GetCoefficientImage(); itk::AdcImageFilter< short, double >::Pointer adcFilter = itk::AdcImageFilter< short, double >::New(); adcFilter->SetInput( itkVectorImagePointer ); adcFilter->SetGradientDirections( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); adcFilter->SetB_value( static_cast (diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); adcFilter->Update(); adcImage = adcFilter->GetOutput(); if (dosampling && diffImg.IsNotNull()) { ok = model->SampleKernels(diffImg, ffParamaters.m_SignalGen.m_MaskImage, tensorImage, itkFeatureImage, adcImage); if (!ok) { QMessageBox::information( NULL, "Parameter file not saved", "No valid prototype signals could be sampled."); return; } } } } ffParamaters.SaveParameters(filename.toStdString()); m_ParameterFile = filename; } void QmitkFiberfoxView::SaveParameters() { QString filename = QFileDialog::getSaveFileName( 0, tr("Save Parameters"), m_ParameterFile, tr("Fiberfox Parameters (*.ffp)") ); SaveParameters(filename); } void QmitkFiberfoxView::LoadParameters() { QString filename = QFileDialog::getOpenFileName(0, tr("Load Parameters"), QString(itksys::SystemTools::GetFilenamePath(m_ParameterFile.toStdString()).c_str()), tr("Fiberfox Parameters (*.ffp)") ); if(filename.isEmpty() || filename.isNull()) return; m_ParameterFile = filename; FiberfoxParameters<> parameters = UpdateImageParameters(); parameters.LoadParameters(filename.toStdString()); if (parameters.m_MissingTags.size()>0) { QString missing("Parameter file might be corrupted. The following parameters could not be read: "); missing += QString(parameters.m_MissingTags.c_str()); missing += "\nDefault values have been assigned to the missing parameters."; QMessageBox::information( NULL, "Warning!", missing); } m_Controls->m_RealTimeFibers->setChecked(parameters.m_Misc.m_CheckRealTimeFibersBox); m_Controls->m_AdvancedOptionsBox->setChecked(parameters.m_Misc.m_CheckAdvancedFiberOptionsBox); m_Controls->m_IncludeFiducials->setChecked(parameters.m_Misc.m_CheckIncludeFiducialsBox); m_Controls->m_ConstantRadiusBox->setChecked(parameters.m_Misc.m_CheckConstantRadiusBox); m_Controls->m_DistributionBox->setCurrentIndex(parameters.m_FiberGen.m_Distribution); m_Controls->m_VarianceBox->setValue(parameters.m_FiberGen.m_Variance); m_Controls->m_FiberDensityBox->setValue(parameters.m_FiberGen.m_Density); m_Controls->m_FiberSamplingBox->setValue(parameters.m_FiberGen.m_Sampling); m_Controls->m_TensionBox->setValue(parameters.m_FiberGen.m_Tension); m_Controls->m_ContinuityBox->setValue(parameters.m_FiberGen.m_Continuity); m_Controls->m_BiasBox->setValue(parameters.m_FiberGen.m_Bias); m_Controls->m_XrotBox->setValue(parameters.m_FiberGen.m_Rotation[0]); m_Controls->m_YrotBox->setValue(parameters.m_FiberGen.m_Rotation[1]); m_Controls->m_ZrotBox->setValue(parameters.m_FiberGen.m_Rotation[2]); m_Controls->m_XtransBox->setValue(parameters.m_FiberGen.m_Translation[0]); m_Controls->m_YtransBox->setValue(parameters.m_FiberGen.m_Translation[1]); m_Controls->m_ZtransBox->setValue(parameters.m_FiberGen.m_Translation[2]); m_Controls->m_XscaleBox->setValue(parameters.m_FiberGen.m_Scale[0]); m_Controls->m_YscaleBox->setValue(parameters.m_FiberGen.m_Scale[1]); m_Controls->m_ZscaleBox->setValue(parameters.m_FiberGen.m_Scale[2]); // image generation parameters m_Controls->m_SizeX->setValue(parameters.m_SignalGen.m_ImageRegion.GetSize(0)); m_Controls->m_SizeY->setValue(parameters.m_SignalGen.m_ImageRegion.GetSize(1)); m_Controls->m_SizeZ->setValue(parameters.m_SignalGen.m_ImageRegion.GetSize(2)); m_Controls->m_SpacingX->setValue(parameters.m_SignalGen.m_ImageSpacing[0]); m_Controls->m_SpacingY->setValue(parameters.m_SignalGen.m_ImageSpacing[1]); m_Controls->m_SpacingZ->setValue(parameters.m_SignalGen.m_ImageSpacing[2]); m_Controls->m_NumGradientsBox->setValue(parameters.m_SignalGen.GetNumWeightedVolumes()); m_Controls->m_BvalueBox->setValue(parameters.m_SignalGen.m_Bvalue); m_Controls->m_SignalScaleBox->setValue(parameters.m_SignalGen.m_SignalScale); m_Controls->m_TEbox->setValue(parameters.m_SignalGen.m_tEcho); m_Controls->m_LineReadoutTimeBox->setValue(parameters.m_SignalGen.m_tLine); m_Controls->m_T2starBox->setValue(parameters.m_SignalGen.m_tInhom); m_Controls->m_FiberRadius->setValue(parameters.m_SignalGen.m_AxonRadius); m_Controls->m_RelaxationBox->setChecked(parameters.m_SignalGen.m_DoSimulateRelaxation); m_Controls->m_EnforcePureFiberVoxelsBox->setChecked(parameters.m_SignalGen.m_DoDisablePartialVolume); m_Controls->m_ReversePhaseBox->setChecked(parameters.m_SignalGen.m_ReversePhase); m_Controls->m_PartialFourier->setValue(parameters.m_SignalGen.m_PartialFourier); m_Controls->m_TRbox->setValue(parameters.m_SignalGen.m_tRep); m_Controls->m_NumCoilsBox->setValue(parameters.m_SignalGen.m_NumberOfCoils); m_Controls->m_CoilSensBox->setCurrentIndex(parameters.m_SignalGen.m_CoilSensitivityProfile); m_Controls->m_AcquisitionTypeBox->setCurrentIndex(parameters.m_SignalGen.m_AcquisitionType); if (parameters.m_NoiseModel!=NULL) { m_Controls->m_AddNoise->setChecked(parameters.m_Misc.m_CheckAddNoiseBox); if (dynamic_cast*>(parameters.m_NoiseModel.get())) { m_Controls->m_NoiseDistributionBox->setCurrentIndex(0); } else if (dynamic_cast*>(parameters.m_NoiseModel.get())) { m_Controls->m_NoiseDistributionBox->setCurrentIndex(1); } m_Controls->m_NoiseLevel->setValue(parameters.m_NoiseModel->GetNoiseVariance()); } else { m_Controls->m_AddNoise->setChecked(parameters.m_Misc.m_CheckAddNoiseBox); m_Controls->m_NoiseLevel->setValue(parameters.m_SignalGen.m_NoiseVariance); } m_Controls->m_VolumeFractionsBox->setChecked(parameters.m_Misc.m_CheckOutputVolumeFractionsBox); m_Controls->m_AdvancedOptionsBox_2->setChecked(parameters.m_Misc.m_CheckAdvancedSignalOptionsBox); m_Controls->m_AddGhosts->setChecked(parameters.m_Misc.m_CheckAddGhostsBox); m_Controls->m_AddAliasing->setChecked(parameters.m_Misc.m_CheckAddAliasingBox); m_Controls->m_AddDistortions->setChecked(parameters.m_Misc.m_CheckAddDistortionsBox); m_Controls->m_AddSpikes->setChecked(parameters.m_Misc.m_CheckAddSpikesBox); m_Controls->m_AddEddy->setChecked(parameters.m_Misc.m_CheckAddEddyCurrentsBox); m_Controls->m_kOffsetBox->setValue(parameters.m_SignalGen.m_KspaceLineOffset); m_Controls->m_WrapBox->setValue(100*(1-parameters.m_SignalGen.m_CroppingFactor)); m_Controls->m_SpikeNumBox->setValue(parameters.m_SignalGen.m_Spikes); m_Controls->m_SpikeScaleBox->setValue(parameters.m_SignalGen.m_SpikeAmplitude); m_Controls->m_EddyGradientStrength->setValue(parameters.m_SignalGen.m_EddyStrength); m_Controls->m_AddGibbsRinging->setChecked(parameters.m_SignalGen.m_DoAddGibbsRinging); m_Controls->m_AddMotion->setChecked(parameters.m_SignalGen.m_DoAddMotion); m_Controls->m_RandomMotion->setChecked(parameters.m_SignalGen.m_DoRandomizeMotion); m_Controls->m_MotionVolumesBox->setText(QString(parameters.m_Misc.m_MotionVolumesBox.c_str())); m_Controls->m_MaxTranslationBoxX->setValue(parameters.m_SignalGen.m_Translation[0]); m_Controls->m_MaxTranslationBoxY->setValue(parameters.m_SignalGen.m_Translation[1]); m_Controls->m_MaxTranslationBoxZ->setValue(parameters.m_SignalGen.m_Translation[2]); m_Controls->m_MaxRotationBoxX->setValue(parameters.m_SignalGen.m_Rotation[0]); m_Controls->m_MaxRotationBoxY->setValue(parameters.m_SignalGen.m_Rotation[1]); m_Controls->m_MaxRotationBoxZ->setValue(parameters.m_SignalGen.m_Rotation[2]); m_Controls->m_Compartment1Box->setCurrentIndex(0); m_Controls->m_Compartment2Box->setCurrentIndex(0); m_Controls->m_Compartment3Box->setCurrentIndex(0); m_Controls->m_Compartment4Box->setCurrentIndex(0); for (unsigned int i=0; i* signalModel = NULL; if (iGetVolumeFractionImage().IsNotNull() ) { compVolNode = mitk::DataNode::New(); mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk(signalModel->GetVolumeFractionImage().GetPointer()); image->SetVolume(signalModel->GetVolumeFractionImage()->GetBufferPointer()); compVolNode->SetData( image ); compVolNode->SetName("Compartment volume "+QString::number(signalModel->m_CompartmentId).toStdString()); GetDataStorage()->Add(compVolNode); } switch (signalModel->m_CompartmentId) { case 1: { if (compVolNode.IsNotNull()) m_Controls->m_Comp1VolumeFraction->SetSelectedNode(compVolNode); if (dynamic_cast*>(signalModel)) { mitk::StickModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_StickWidget1->SetT2(model->GetT2()); m_Controls->m_StickWidget1->SetT1(model->GetT1()); m_Controls->m_StickWidget1->SetD(model->GetDiffusivity()); m_Controls->m_Compartment1Box->setCurrentIndex(0); break; } else if (dynamic_cast*>(signalModel)) { mitk::TensorModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_TensorWidget1->SetT2(model->GetT2()); m_Controls->m_TensorWidget1->SetT1(model->GetT1()); m_Controls->m_TensorWidget1->SetD1(model->GetDiffusivity1()); m_Controls->m_TensorWidget1->SetD2(model->GetDiffusivity2()); m_Controls->m_TensorWidget1->SetD3(model->GetDiffusivity3()); m_Controls->m_Compartment1Box->setCurrentIndex(2); break; } else if (dynamic_cast*>(signalModel)) { mitk::RawShModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_PrototypeWidget1->SetNumberOfSamples(model->GetMaxNumKernels()); m_Controls->m_PrototypeWidget1->SetMinFa(model->GetFaRange().first); m_Controls->m_PrototypeWidget1->SetMaxFa(model->GetFaRange().second); m_Controls->m_PrototypeWidget1->SetMinAdc(model->GetAdcRange().first); m_Controls->m_PrototypeWidget1->SetMaxAdc(model->GetAdcRange().second); m_Controls->m_Compartment1Box->setCurrentIndex(3); break; } break; } case 2: { if (compVolNode.IsNotNull()) m_Controls->m_Comp2VolumeFraction->SetSelectedNode(compVolNode); if (dynamic_cast*>(signalModel)) { mitk::StickModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_StickWidget2->SetT2(model->GetT2()); m_Controls->m_StickWidget2->SetT1(model->GetT1()); m_Controls->m_StickWidget2->SetD(model->GetDiffusivity()); m_Controls->m_Compartment2Box->setCurrentIndex(1); break; } else if (dynamic_cast*>(signalModel)) { mitk::TensorModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_TensorWidget2->SetT2(model->GetT2()); m_Controls->m_TensorWidget2->SetT1(model->GetT1()); m_Controls->m_TensorWidget2->SetD1(model->GetDiffusivity1()); m_Controls->m_TensorWidget2->SetD2(model->GetDiffusivity2()); m_Controls->m_TensorWidget2->SetD3(model->GetDiffusivity3()); m_Controls->m_Compartment2Box->setCurrentIndex(3); break; } break; } case 3: { if (compVolNode.IsNotNull()) m_Controls->m_Comp3VolumeFraction->SetSelectedNode(compVolNode); if (dynamic_cast*>(signalModel)) { mitk::BallModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_BallWidget1->SetT2(model->GetT2()); m_Controls->m_BallWidget1->SetT1(model->GetT1()); m_Controls->m_BallWidget1->SetD(model->GetDiffusivity()); m_Controls->m_Compartment3Box->setCurrentIndex(0); break; } else if (dynamic_cast*>(signalModel)) { mitk::AstroStickModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_AstrosticksWidget1->SetT2(model->GetT2()); m_Controls->m_AstrosticksWidget1->SetT1(model->GetT1()); m_Controls->m_AstrosticksWidget1->SetD(model->GetDiffusivity()); m_Controls->m_AstrosticksWidget1->SetRandomizeSticks(model->GetRandomizeSticks()); m_Controls->m_Compartment3Box->setCurrentIndex(1); break; } else if (dynamic_cast*>(signalModel)) { mitk::DotModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_DotWidget1->SetT2(model->GetT2()); m_Controls->m_DotWidget1->SetT1(model->GetT1()); m_Controls->m_Compartment3Box->setCurrentIndex(2); break; } else if (dynamic_cast*>(signalModel)) { mitk::RawShModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_PrototypeWidget3->SetNumberOfSamples(model->GetMaxNumKernels()); m_Controls->m_PrototypeWidget3->SetMinFa(model->GetFaRange().first); m_Controls->m_PrototypeWidget3->SetMaxFa(model->GetFaRange().second); m_Controls->m_PrototypeWidget3->SetMinAdc(model->GetAdcRange().first); m_Controls->m_PrototypeWidget3->SetMaxAdc(model->GetAdcRange().second); m_Controls->m_Compartment3Box->setCurrentIndex(3); break; } break; } case 4: { if (compVolNode.IsNotNull()) m_Controls->m_Comp4VolumeFraction->SetSelectedNode(compVolNode); if (dynamic_cast*>(signalModel)) { mitk::BallModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_BallWidget2->SetT2(model->GetT2()); m_Controls->m_BallWidget2->SetT1(model->GetT1()); m_Controls->m_BallWidget2->SetD(model->GetDiffusivity()); m_Controls->m_Compartment4Box->setCurrentIndex(1); break; } else if (dynamic_cast*>(signalModel)) { mitk::AstroStickModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_AstrosticksWidget2->SetT2(model->GetT2()); m_Controls->m_AstrosticksWidget2->SetT1(model->GetT1()); m_Controls->m_AstrosticksWidget2->SetD(model->GetDiffusivity()); m_Controls->m_AstrosticksWidget2->SetRandomizeSticks(model->GetRandomizeSticks()); m_Controls->m_Compartment4Box->setCurrentIndex(2); break; } else if (dynamic_cast*>(signalModel)) { mitk::DotModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_DotWidget2->SetT2(model->GetT2()); m_Controls->m_DotWidget2->SetT1(model->GetT1()); m_Controls->m_Compartment4Box->setCurrentIndex(3); break; } else if (dynamic_cast*>(signalModel)) { mitk::RawShModel<>* model = dynamic_cast*>(signalModel); m_Controls->m_PrototypeWidget4->SetNumberOfSamples(model->GetMaxNumKernels()); m_Controls->m_PrototypeWidget4->SetMinFa(model->GetFaRange().first); m_Controls->m_PrototypeWidget4->SetMaxFa(model->GetFaRange().second); m_Controls->m_PrototypeWidget4->SetMinAdc(model->GetAdcRange().first); m_Controls->m_PrototypeWidget4->SetMaxAdc(model->GetAdcRange().second); m_Controls->m_Compartment4Box->setCurrentIndex(4); break; } break; } } } if ( parameters.m_SignalGen.m_MaskImage ) { mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk(parameters.m_SignalGen.m_MaskImage.GetPointer()); image->SetVolume(parameters.m_SignalGen.m_MaskImage->GetBufferPointer()); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( image ); node->SetName("Tissue mask"); GetDataStorage()->Add(node); m_Controls->m_MaskComboBox->SetSelectedNode(node); } if ( parameters.m_SignalGen.m_FrequencyMap ) { mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk(parameters.m_SignalGen.m_FrequencyMap.GetPointer()); image->SetVolume(parameters.m_SignalGen.m_FrequencyMap->GetBufferPointer()); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( image ); node->SetName("Frequency map"); GetDataStorage()->Add(node); m_Controls->m_FrequencyMapBox->SetSelectedNode(node); } } void QmitkFiberfoxView::ShowAdvancedOptions(int state) { if (state) { m_Controls->m_AdvancedFiberOptionsFrame->setVisible(true); m_Controls->m_AdvancedSignalOptionsFrame->setVisible(true); m_Controls->m_AdvancedOptionsBox->setChecked(true); m_Controls->m_AdvancedOptionsBox_2->setChecked(true); } else { m_Controls->m_AdvancedFiberOptionsFrame->setVisible(false); m_Controls->m_AdvancedSignalOptionsFrame->setVisible(false); m_Controls->m_AdvancedOptionsBox->setChecked(false); m_Controls->m_AdvancedOptionsBox_2->setChecked(false); } } void QmitkFiberfoxView::Comp1ModelFrameVisibility(int index) { m_Controls->m_StickWidget1->setVisible(false); m_Controls->m_ZeppelinWidget1->setVisible(false); m_Controls->m_TensorWidget1->setVisible(false); m_Controls->m_PrototypeWidget1->setVisible(false); switch (index) { case 0: m_Controls->m_StickWidget1->setVisible(true); break; case 1: m_Controls->m_ZeppelinWidget1->setVisible(true); break; case 2: m_Controls->m_TensorWidget1->setVisible(true); break; case 3: m_Controls->m_PrototypeWidget1->setVisible(true); break; } } void QmitkFiberfoxView::Comp2ModelFrameVisibility(int index) { m_Controls->m_StickWidget2->setVisible(false); m_Controls->m_ZeppelinWidget2->setVisible(false); m_Controls->m_TensorWidget2->setVisible(false); m_Controls->m_Comp2FractionFrame->setVisible(false); switch (index) { case 0: break; case 1: m_Controls->m_StickWidget2->setVisible(true); m_Controls->m_Comp2FractionFrame->setVisible(true); break; case 2: m_Controls->m_ZeppelinWidget2->setVisible(true); m_Controls->m_Comp2FractionFrame->setVisible(true); break; case 3: m_Controls->m_TensorWidget2->setVisible(true); m_Controls->m_Comp2FractionFrame->setVisible(true); break; } } void QmitkFiberfoxView::Comp3ModelFrameVisibility(int index) { m_Controls->m_BallWidget1->setVisible(false); m_Controls->m_AstrosticksWidget1->setVisible(false); m_Controls->m_DotWidget1->setVisible(false); m_Controls->m_PrototypeWidget3->setVisible(false); switch (index) { case 0: m_Controls->m_BallWidget1->setVisible(true); break; case 1: m_Controls->m_AstrosticksWidget1->setVisible(true); break; case 2: m_Controls->m_DotWidget1->setVisible(true); break; case 3: m_Controls->m_PrototypeWidget3->setVisible(true); break; } } void QmitkFiberfoxView::Comp4ModelFrameVisibility(int index) { m_Controls->m_BallWidget2->setVisible(false); m_Controls->m_AstrosticksWidget2->setVisible(false); m_Controls->m_DotWidget2->setVisible(false); m_Controls->m_PrototypeWidget4->setVisible(false); m_Controls->m_Comp4FractionFrame->setVisible(false); switch (index) { case 0: break; case 1: m_Controls->m_BallWidget2->setVisible(true); m_Controls->m_Comp4FractionFrame->setVisible(true); break; case 2: m_Controls->m_AstrosticksWidget2->setVisible(true); m_Controls->m_Comp4FractionFrame->setVisible(true); break; case 3: m_Controls->m_DotWidget2->setVisible(true); m_Controls->m_Comp4FractionFrame->setVisible(true); break; case 4: m_Controls->m_PrototypeWidget4->setVisible(true); m_Controls->m_Comp4FractionFrame->setVisible(true); break; } } void QmitkFiberfoxView::OnConstantRadius(int value) { if (value>0 && m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnAddMotion(int value) { if (value>0) m_Controls->m_MotionArtifactFrame->setVisible(true); else m_Controls->m_MotionArtifactFrame->setVisible(false); } void QmitkFiberfoxView::OnAddAliasing(int value) { if (value>0) m_Controls->m_AliasingFrame->setVisible(true); else m_Controls->m_AliasingFrame->setVisible(false); } void QmitkFiberfoxView::OnAddSpikes(int value) { if (value>0) m_Controls->m_SpikeFrame->setVisible(true); else m_Controls->m_SpikeFrame->setVisible(false); } void QmitkFiberfoxView::OnAddEddy(int value) { if (value>0) m_Controls->m_EddyFrame->setVisible(true); else m_Controls->m_EddyFrame->setVisible(false); } void QmitkFiberfoxView::OnAddDistortions(int value) { if (value>0) m_Controls->m_DistortionsFrame->setVisible(true); else m_Controls->m_DistortionsFrame->setVisible(false); } void QmitkFiberfoxView::OnAddGhosts(int value) { if (value>0) m_Controls->m_GhostFrame->setVisible(true); else m_Controls->m_GhostFrame->setVisible(false); } void QmitkFiberfoxView::OnAddNoise(int value) { if (value>0) m_Controls->m_NoiseFrame->setVisible(true); else m_Controls->m_NoiseFrame->setVisible(false); } void QmitkFiberfoxView::OnDistributionChanged(int value) { if (value==1) m_Controls->m_VarianceBox->setVisible(true); else m_Controls->m_VarianceBox->setVisible(false); if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnVarianceChanged(double) { if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnFiberDensityChanged(int) { if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnFiberSamplingChanged(double) { if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnTensionChanged(double) { if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnContinuityChanged(double) { if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnBiasChanged(double) { if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::AlignOnGrid() { for (unsigned int i=0; i(m_SelectedFiducials.at(i)->GetData()); mitk::Point3D wc0 = pe->GetWorldControlPoint(0); mitk::DataStorage::SetOfObjects::ConstPointer parentFibs = GetDataStorage()->GetSources(m_SelectedFiducials.at(i)); for( mitk::DataStorage::SetOfObjects::const_iterator it = parentFibs->begin(); it != parentFibs->end(); ++it ) { mitk::DataNode::Pointer pFibNode = *it; if ( pFibNode.IsNotNull() && dynamic_cast(pFibNode->GetData()) ) { mitk::DataStorage::SetOfObjects::ConstPointer parentImgs = GetDataStorage()->GetSources(pFibNode); for( mitk::DataStorage::SetOfObjects::const_iterator it2 = parentImgs->begin(); it2 != parentImgs->end(); ++it2 ) { mitk::DataNode::Pointer pImgNode = *it2; if ( pImgNode.IsNotNull() && dynamic_cast(pImgNode->GetData()) ) { mitk::Image::Pointer img = dynamic_cast(pImgNode->GetData()); mitk::BaseGeometry::Pointer geom = img->GetGeometry(); itk::Index<3> idx; geom->WorldToIndex(wc0, idx); mitk::Point3D cIdx; cIdx[0]=idx[0]; cIdx[1]=idx[1]; cIdx[2]=idx[2]; mitk::Point3D world; geom->IndexToWorld(cIdx,world); mitk::Vector3D trans = world - wc0; pe->GetGeometry()->Translate(trans); break; } } break; } } } for(unsigned int i=0; iGetSources(fibNode); for( mitk::DataStorage::SetOfObjects::const_iterator it = sources->begin(); it != sources->end(); ++it ) { mitk::DataNode::Pointer imgNode = *it; if ( imgNode.IsNotNull() && dynamic_cast(imgNode->GetData()) ) { mitk::DataStorage::SetOfObjects::ConstPointer derivations = GetDataStorage()->GetDerivations(fibNode); for( mitk::DataStorage::SetOfObjects::const_iterator it2 = derivations->begin(); it2 != derivations->end(); ++it2 ) { mitk::DataNode::Pointer fiducialNode = *it2; if ( fiducialNode.IsNotNull() && dynamic_cast(fiducialNode->GetData()) ) { mitk::PlanarEllipse::Pointer pe = dynamic_cast(fiducialNode->GetData()); mitk::Point3D wc0 = pe->GetWorldControlPoint(0); mitk::Image::Pointer img = dynamic_cast(imgNode->GetData()); mitk::BaseGeometry::Pointer geom = img->GetGeometry(); itk::Index<3> idx; geom->WorldToIndex(wc0, idx); mitk::Point3D cIdx; cIdx[0]=idx[0]; cIdx[1]=idx[1]; cIdx[2]=idx[2]; mitk::Point3D world; geom->IndexToWorld(cIdx,world); mitk::Vector3D trans = world - wc0; pe->GetGeometry()->Translate(trans); } } break; } } } for(unsigned int i=0; i(m_SelectedImages.at(i)->GetData()); mitk::DataStorage::SetOfObjects::ConstPointer derivations = GetDataStorage()->GetDerivations(m_SelectedImages.at(i)); for( mitk::DataStorage::SetOfObjects::const_iterator it = derivations->begin(); it != derivations->end(); ++it ) { mitk::DataNode::Pointer fibNode = *it; if ( fibNode.IsNotNull() && dynamic_cast(fibNode->GetData()) ) { mitk::DataStorage::SetOfObjects::ConstPointer derivations2 = GetDataStorage()->GetDerivations(fibNode); for( mitk::DataStorage::SetOfObjects::const_iterator it2 = derivations2->begin(); it2 != derivations2->end(); ++it2 ) { mitk::DataNode::Pointer fiducialNode = *it2; if ( fiducialNode.IsNotNull() && dynamic_cast(fiducialNode->GetData()) ) { mitk::PlanarEllipse::Pointer pe = dynamic_cast(fiducialNode->GetData()); mitk::Point3D wc0 = pe->GetWorldControlPoint(0); mitk::BaseGeometry::Pointer geom = img->GetGeometry(); itk::Index<3> idx; geom->WorldToIndex(wc0, idx); mitk::Point3D cIdx; cIdx[0]=idx[0]; cIdx[1]=idx[1]; cIdx[2]=idx[2]; mitk::Point3D world; geom->IndexToWorld(cIdx,world); mitk::Vector3D trans = world - wc0; pe->GetGeometry()->Translate(trans); } } } } } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::OnFlipButton() { if (m_SelectedFiducial.IsNull()) return; std::map::iterator it = m_DataNodeToPlanarFigureData.find(m_SelectedFiducial.GetPointer()); if( it != m_DataNodeToPlanarFigureData.end() ) { QmitkPlanarFigureData& data = it->second; data.m_Flipped += 1; data.m_Flipped %= 2; } if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } QmitkFiberfoxView::GradientListType QmitkFiberfoxView::GenerateHalfShell(int NPoints) { NPoints *= 2; GradientListType pointshell; int numB0 = NPoints/20; if (numB0==0) numB0=1; GradientType g; g.Fill(0.0); for (int i=0; i theta; theta.set_size(NPoints); vnl_vector phi; phi.set_size(NPoints); double C = sqrt(4*M_PI); phi(0) = 0.0; phi(NPoints-1) = 0.0; for(int i=0; i0 && i std::vector > QmitkFiberfoxView::MakeGradientList() { std::vector > retval; vnl_matrix_fixed* U = itk::PointShell >::DistributePointShell(); // Add 0 vector for B0 int numB0 = ndirs/10; if (numB0==0) numB0=1; itk::Vector v; v.Fill(0.0); for (int i=0; i v; v[0] = U->get(0,i); v[1] = U->get(1,i); v[2] = U->get(2,i); retval.push_back(v); } return retval; } void QmitkFiberfoxView::OnAddBundle() { if (m_SelectedImageNode.IsNull()) return; mitk::DataStorage::SetOfObjects::ConstPointer children = GetDataStorage()->GetDerivations(m_SelectedImageNode); mitk::FiberBundle::Pointer bundle = mitk::FiberBundle::New(); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( bundle ); QString name = QString("Bundle_%1").arg(children->size()); node->SetName(name.toStdString()); m_SelectedBundles.push_back(node); UpdateGui(); GetDataStorage()->Add(node, m_SelectedImageNode); } void QmitkFiberfoxView::OnDrawROI() { if (m_SelectedBundles.empty()) OnAddBundle(); if (m_SelectedBundles.empty()) return; mitk::DataStorage::SetOfObjects::ConstPointer children = GetDataStorage()->GetDerivations(m_SelectedBundles.at(0)); mitk::PlanarEllipse::Pointer figure = mitk::PlanarEllipse::New(); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( figure ); node->SetBoolProperty("planarfigure.3drendering", true); node->SetBoolProperty("planarfigure.3drendering.fill", true); QList nodes = this->GetDataManagerSelection(); for( int i=0; iSetSelected(false); m_SelectedFiducial = node; QString name = QString("Fiducial_%1").arg(children->size()); node->SetName(name.toStdString()); node->SetSelected(true); this->DisableCrosshairNavigation(); mitk::PlanarFigureInteractor::Pointer figureInteractor = dynamic_cast(node->GetDataInteractor().GetPointer()); if(figureInteractor.IsNull()) { figureInteractor = mitk::PlanarFigureInteractor::New(); us::Module* planarFigureModule = us::ModuleRegistry::GetModule( "MitkPlanarFigure" ); figureInteractor->LoadStateMachine("PlanarFigureInteraction.xml", planarFigureModule ); figureInteractor->SetEventConfig( "PlanarFigureConfig.xml", planarFigureModule ); figureInteractor->SetDataNode( node ); } UpdateGui(); GetDataStorage()->Add(node, m_SelectedBundles.at(0)); } bool CompareLayer(mitk::DataNode::Pointer i,mitk::DataNode::Pointer j) { int li = -1; i->GetPropertyValue("layer", li); int lj = -1; j->GetPropertyValue("layer", lj); return liGetSources(m_SelectedFiducial); for( mitk::DataStorage::SetOfObjects::const_iterator it = parents->begin(); it != parents->end(); ++it ) if(dynamic_cast((*it)->GetData())) m_SelectedBundles.push_back(*it); if (m_SelectedBundles.empty()) return; } FiberfoxParameters parameters = UpdateImageParameters(false); for (unsigned int i=0; iGetDerivations(m_SelectedBundles.at(i)); std::vector< mitk::DataNode::Pointer > childVector; for( mitk::DataStorage::SetOfObjects::const_iterator it = children->begin(); it != children->end(); ++it ) childVector.push_back(*it); sort(childVector.begin(), childVector.end(), CompareLayer); vector< mitk::PlanarEllipse::Pointer > fib; vector< unsigned int > flip; float radius = 1; int count = 0; for( std::vector< mitk::DataNode::Pointer >::const_iterator it = childVector.begin(); it != childVector.end(); ++it ) { mitk::DataNode::Pointer node = *it; if ( node.IsNotNull() && dynamic_cast(node->GetData()) ) { mitk::PlanarEllipse* ellipse = dynamic_cast(node->GetData()); if (m_Controls->m_ConstantRadiusBox->isChecked()) { ellipse->SetTreatAsCircle(true); mitk::Point2D c = ellipse->GetControlPoint(0); mitk::Point2D p = ellipse->GetControlPoint(1); mitk::Vector2D v = p-c; if (count==0) { radius = v.GetVnlVector().magnitude(); ellipse->SetControlPoint(1, p); ellipse->Modified(); } else { v.Normalize(); v *= radius; ellipse->SetControlPoint(1, c+v); ellipse->Modified(); } } fib.push_back(ellipse); std::map::iterator it = m_DataNodeToPlanarFigureData.find(node.GetPointer()); if( it != m_DataNodeToPlanarFigureData.end() ) { QmitkPlanarFigureData& data = it->second; flip.push_back(data.m_Flipped); } else flip.push_back(0); } count++; } if (fib.size()>1) { parameters.m_FiberGen.m_Fiducials.push_back(fib); parameters.m_FiberGen.m_FlipList.push_back(flip); } else if (fib.size()>0) m_SelectedBundles.at(i)->SetData( mitk::FiberBundle::New() ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } itk::FibersFromPlanarFiguresFilter::Pointer filter = itk::FibersFromPlanarFiguresFilter::New(); filter->SetParameters(parameters.m_FiberGen); filter->Update(); vector< mitk::FiberBundle::Pointer > fiberBundles = filter->GetFiberBundles(); for (unsigned int i=0; iSetData( fiberBundles.at(i) ); if (fiberBundles.at(i)->GetNumFibers()>50000) m_SelectedBundles.at(i)->SetVisibility(false); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberfoxView::GenerateImage() { if (m_Controls->m_FiberBundleComboBox->GetSelectedNode().IsNull() && !mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( m_Controls->m_TemplateComboBox->GetSelectedNode())) { mitk::Image::Pointer image = mitk::ImageGenerator::GenerateGradientImage( m_Controls->m_SizeX->value(), m_Controls->m_SizeY->value(), m_Controls->m_SizeZ->value(), m_Controls->m_SpacingX->value(), m_Controls->m_SpacingY->value(), m_Controls->m_SpacingZ->value()); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( image ); node->SetName("Dummy"); unsigned int window = m_Controls->m_SizeX->value()*m_Controls->m_SizeY->value()*m_Controls->m_SizeZ->value(); unsigned int level = window/2; mitk::LevelWindow lw; lw.SetLevelWindow(level, window); node->SetProperty( "levelwindow", mitk::LevelWindowProperty::New( lw ) ); GetDataStorage()->Add(node); m_SelectedImageNode = node; mitk::BaseData::Pointer basedata = node->GetData(); if (basedata.IsNotNull()) { mitk::RenderingManager::GetInstance()->InitializeViews( basedata->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } UpdateGui(); QMessageBox::information(NULL, "Template image generated", "You have selected no fiber bundle or diffusion-weighted image, which can be used to simulate a new diffusion-weighted image. A template image with the specified geometry has been generated that can be used to draw artificial fibers (see tab 'Fiber Definition')."); } else if (m_Controls->m_FiberBundleComboBox->GetSelectedNode().IsNotNull()) SimulateImageFromFibers(m_Controls->m_FiberBundleComboBox->GetSelectedNode()); else if ( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( m_Controls->m_TemplateComboBox->GetSelectedNode()) ) SimulateForExistingDwi(m_Controls->m_TemplateComboBox->GetSelectedNode()); else QMessageBox::information(NULL, "No image generated", "You have selected no fiber bundle or diffusion-weighted image, which can be used to simulate a new diffusion-weighted image."); } void QmitkFiberfoxView::SimulateForExistingDwi(mitk::DataNode* imageNode) { bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(imageNode->GetData())) ); if ( !isDiffusionImage ) { return; } FiberfoxParameters parameters = UpdateImageParameters(); mitk::Image::Pointer diffImg = dynamic_cast(imageNode->GetData()); ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(diffImg, itkVectorImagePointer); m_TractsToDwiFilter = itk::TractsToDWIImageFilter< short >::New(); parameters.m_Misc.m_ParentNode = imageNode; parameters.m_SignalGen.m_SignalScale = 1; parameters.m_Misc.m_ResultNode->SetName(parameters.m_Misc.m_ParentNode->GetName() +"_D"+QString::number(parameters.m_SignalGen.m_ImageRegion.GetSize(0)).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageRegion.GetSize(1)).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageRegion.GetSize(2)).toStdString() +"_S"+QString::number(parameters.m_SignalGen.m_ImageSpacing[0]).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageSpacing[1]).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageSpacing[2]).toStdString() +"_b"+QString::number(parameters.m_SignalGen.m_Bvalue).toStdString() +"_"+parameters.m_Misc.m_SignalModelString +parameters.m_Misc.m_ArtifactModelString); m_TractsToDwiFilter->SetParameters(parameters); m_TractsToDwiFilter->SetInputImage(itkVectorImagePointer); m_Thread.start(QThread::LowestPriority); } void QmitkFiberfoxView::SimulateImageFromFibers(mitk::DataNode* fiberNode) { mitk::FiberBundle::Pointer fiberBundle = dynamic_cast(fiberNode->GetData()); if (fiberBundle->GetNumFibers()<=0) { return; } FiberfoxParameters parameters = UpdateImageParameters(); m_TractsToDwiFilter = itk::TractsToDWIImageFilter< short >::New(); parameters.m_Misc.m_ParentNode = fiberNode; parameters.m_Misc.m_ResultNode->SetName(parameters.m_Misc.m_ParentNode->GetName() +"_D"+QString::number(parameters.m_SignalGen.m_ImageRegion.GetSize(0)).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageRegion.GetSize(1)).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageRegion.GetSize(2)).toStdString() +"_S"+QString::number(parameters.m_SignalGen.m_ImageSpacing[0]).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageSpacing[1]).toStdString() +"-"+QString::number(parameters.m_SignalGen.m_ImageSpacing[2]).toStdString() +"_b"+QString::number(parameters.m_SignalGen.m_Bvalue).toStdString() +"_"+parameters.m_Misc.m_SignalModelString +parameters.m_Misc.m_ArtifactModelString); if ( m_Controls->m_TemplateComboBox->GetSelectedNode().IsNotNull() && mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast (m_Controls->m_TemplateComboBox->GetSelectedNode()->GetData()) ) ) { bool first = true; bool ok = true; mitk::Image::Pointer diffImg = dynamic_cast(m_Controls->m_TemplateComboBox->GetSelectedNode()->GetData()); itk::Image< itk::DiffusionTensor3D< double >, 3 >::Pointer tensorImage = NULL; const int shOrder = 2; typedef itk::AnalyticalDiffusionQballReconstructionImageFilter QballFilterType; QballFilterType::CoefficientImageType::Pointer itkFeatureImage = NULL; ItkDoubleImgType::Pointer adcImage = NULL; for (unsigned int i=0; i* model = NULL; if (i* >(parameters.m_FiberModelList.at(i)); else model = dynamic_cast< mitk::RawShModel<>* >(parameters.m_NonFiberModelList.at(i-parameters.m_FiberModelList.size())); if (model!=0 && model->GetNumberOfKernels()<=0) { if (first==true) { ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(diffImg, itkVectorImagePointer); typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, double > TensorReconstructionImageFilterType; TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New(); filter->SetGradientImage( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(), itkVectorImagePointer ); filter->SetBValue( static_cast (diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); filter->Update(); tensorImage = filter->GetOutput(); QballFilterType::Pointer qballfilter = QballFilterType::New(); qballfilter->SetGradientImage( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(), itkVectorImagePointer ); qballfilter->SetBValue( static_cast (diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); qballfilter->SetLambda(0.006); qballfilter->SetNormalizationMethod(QballFilterType::QBAR_RAW_SIGNAL); qballfilter->Update(); itkFeatureImage = qballfilter->GetCoefficientImage(); itk::AdcImageFilter< short, double >::Pointer adcFilter = itk::AdcImageFilter< short, double >::New(); adcFilter->SetInput( itkVectorImagePointer ); adcFilter->SetGradientDirections( static_cast ( diffImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); adcFilter->SetB_value( static_cast (diffImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); adcFilter->Update(); adcImage = adcFilter->GetOutput(); } ok = model->SampleKernels(diffImg, parameters.m_SignalGen.m_MaskImage, tensorImage, itkFeatureImage, adcImage); if (!ok) break; } } if (!ok) { QMessageBox::information( NULL, "Simulation cancelled", "No valid prototype signals could be sampled."); return; } } else if ( m_Controls->m_Compartment1Box->currentIndex()==3 || m_Controls->m_Compartment3Box->currentIndex()==3 || m_Controls->m_Compartment4Box->currentIndex()==4 ) { QMessageBox::information( NULL, "Simulation cancelled", "Prototype signal but no diffusion-weighted image selected to sample signal from."); return; } m_TractsToDwiFilter->SetParameters(parameters); m_TractsToDwiFilter->SetFiberBundle(fiberBundle); m_Thread.start(QThread::LowestPriority); } void QmitkFiberfoxView::ApplyTransform() { vector< mitk::DataNode::Pointer > selectedBundles; for(unsigned int i=0; iGetDerivations(m_SelectedImages.at(i)); for( mitk::DataStorage::SetOfObjects::const_iterator it = derivations->begin(); it != derivations->end(); ++it ) { mitk::DataNode::Pointer fibNode = *it; if ( fibNode.IsNotNull() && dynamic_cast(fibNode->GetData()) ) selectedBundles.push_back(fibNode); } } if (selectedBundles.empty()) selectedBundles = m_SelectedBundles2; if (!selectedBundles.empty()) { for (std::vector::const_iterator it = selectedBundles.begin(); it!=selectedBundles.end(); ++it) { mitk::FiberBundle::Pointer fib = dynamic_cast((*it)->GetData()); fib->RotateAroundAxis(m_Controls->m_XrotBox->value(), m_Controls->m_YrotBox->value(), m_Controls->m_ZrotBox->value()); fib->TranslateFibers(m_Controls->m_XtransBox->value(), m_Controls->m_YtransBox->value(), m_Controls->m_ZtransBox->value()); fib->ScaleFibers(m_Controls->m_XscaleBox->value(), m_Controls->m_YscaleBox->value(), m_Controls->m_ZscaleBox->value()); // handle child fiducials if (m_Controls->m_IncludeFiducials->isChecked()) { mitk::DataStorage::SetOfObjects::ConstPointer derivations = GetDataStorage()->GetDerivations(*it); for( mitk::DataStorage::SetOfObjects::const_iterator it2 = derivations->begin(); it2 != derivations->end(); ++it2 ) { mitk::DataNode::Pointer fiducialNode = *it2; if ( fiducialNode.IsNotNull() && dynamic_cast(fiducialNode->GetData()) ) { mitk::PlanarEllipse* pe = dynamic_cast(fiducialNode->GetData()); mitk::BaseGeometry* geom = pe->GetGeometry(); // translate mitk::Vector3D world; world[0] = m_Controls->m_XtransBox->value(); world[1] = m_Controls->m_YtransBox->value(); world[2] = m_Controls->m_ZtransBox->value(); geom->Translate(world); // calculate rotation matrix double x = m_Controls->m_XrotBox->value()*M_PI/180; double y = m_Controls->m_YrotBox->value()*M_PI/180; double z = m_Controls->m_ZrotBox->value()*M_PI/180; itk::Matrix< double, 3, 3 > rotX; rotX.SetIdentity(); rotX[1][1] = cos(x); rotX[2][2] = rotX[1][1]; rotX[1][2] = -sin(x); rotX[2][1] = -rotX[1][2]; itk::Matrix< double, 3, 3 > rotY; rotY.SetIdentity(); rotY[0][0] = cos(y); rotY[2][2] = rotY[0][0]; rotY[0][2] = sin(y); rotY[2][0] = -rotY[0][2]; itk::Matrix< double, 3, 3 > rotZ; rotZ.SetIdentity(); rotZ[0][0] = cos(z); rotZ[1][1] = rotZ[0][0]; rotZ[0][1] = -sin(z); rotZ[1][0] = -rotZ[0][1]; itk::Matrix< double, 3, 3 > rot = rotZ*rotY*rotX; // transform control point coordinate into geometry translation geom->SetOrigin(pe->GetWorldControlPoint(0)); mitk::Point2D cp; cp.Fill(0.0); pe->SetControlPoint(0, cp); // rotate fiducial geom->GetIndexToWorldTransform()->SetMatrix(rot*geom->GetIndexToWorldTransform()->GetMatrix()); // implicit translation mitk::Vector3D trans; trans[0] = geom->GetOrigin()[0]-fib->GetGeometry()->GetCenter()[0]; trans[1] = geom->GetOrigin()[1]-fib->GetGeometry()->GetCenter()[1]; trans[2] = geom->GetOrigin()[2]-fib->GetGeometry()->GetCenter()[2]; mitk::Vector3D newWc = rot*trans; newWc = newWc-trans; geom->Translate(newWc); pe->Modified(); } } } } } else { for (unsigned int i=0; i(m_SelectedFiducials.at(i)->GetData()); mitk::BaseGeometry* geom = pe->GetGeometry(); // translate mitk::Vector3D world; world[0] = m_Controls->m_XtransBox->value(); world[1] = m_Controls->m_YtransBox->value(); world[2] = m_Controls->m_ZtransBox->value(); geom->Translate(world); // calculate rotation matrix double x = m_Controls->m_XrotBox->value()*M_PI/180; double y = m_Controls->m_YrotBox->value()*M_PI/180; double z = m_Controls->m_ZrotBox->value()*M_PI/180; itk::Matrix< double, 3, 3 > rotX; rotX.SetIdentity(); rotX[1][1] = cos(x); rotX[2][2] = rotX[1][1]; rotX[1][2] = -sin(x); rotX[2][1] = -rotX[1][2]; itk::Matrix< double, 3, 3 > rotY; rotY.SetIdentity(); rotY[0][0] = cos(y); rotY[2][2] = rotY[0][0]; rotY[0][2] = sin(y); rotY[2][0] = -rotY[0][2]; itk::Matrix< double, 3, 3 > rotZ; rotZ.SetIdentity(); rotZ[0][0] = cos(z); rotZ[1][1] = rotZ[0][0]; rotZ[0][1] = -sin(z); rotZ[1][0] = -rotZ[0][1]; itk::Matrix< double, 3, 3 > rot = rotZ*rotY*rotX; // transform control point coordinate into geometry translation geom->SetOrigin(pe->GetWorldControlPoint(0)); mitk::Point2D cp; cp.Fill(0.0); pe->SetControlPoint(0, cp); // rotate fiducial geom->GetIndexToWorldTransform()->SetMatrix(rot*geom->GetIndexToWorldTransform()->GetMatrix()); pe->Modified(); } if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberfoxView::CopyBundles() { if ( m_SelectedBundles.size()<1 ){ QMessageBox::information( NULL, "Warning", "Select at least one fiber bundle!"); MITK_WARN("QmitkFiberFoxView") << "Select at least one fiber bundle!"; return; } for (std::vector::const_iterator it = m_SelectedBundles.begin(); it!=m_SelectedBundles.end(); ++it) { // find parent image mitk::DataNode::Pointer parentNode; mitk::DataStorage::SetOfObjects::ConstPointer parentImgs = GetDataStorage()->GetSources(*it); for( mitk::DataStorage::SetOfObjects::const_iterator it2 = parentImgs->begin(); it2 != parentImgs->end(); ++it2 ) { mitk::DataNode::Pointer pImgNode = *it2; if ( pImgNode.IsNotNull() && dynamic_cast(pImgNode->GetData()) ) { parentNode = pImgNode; break; } } mitk::FiberBundle::Pointer fib = dynamic_cast((*it)->GetData()); mitk::FiberBundle::Pointer newBundle = fib->GetDeepCopy(); QString name((*it)->GetName().c_str()); name += "_copy"; mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); fbNode->SetData(newBundle); fbNode->SetName(name.toStdString()); fbNode->SetVisibility(true); if (parentNode.IsNotNull()) GetDataStorage()->Add(fbNode, parentNode); else GetDataStorage()->Add(fbNode); // copy child fiducials if (m_Controls->m_IncludeFiducials->isChecked()) { mitk::DataStorage::SetOfObjects::ConstPointer derivations = GetDataStorage()->GetDerivations(*it); for( mitk::DataStorage::SetOfObjects::const_iterator it2 = derivations->begin(); it2 != derivations->end(); ++it2 ) { mitk::DataNode::Pointer fiducialNode = *it2; if ( fiducialNode.IsNotNull() && dynamic_cast(fiducialNode->GetData()) ) { mitk::PlanarEllipse::Pointer pe = dynamic_cast(fiducialNode->GetData())->Clone(); mitk::DataNode::Pointer newNode = mitk::DataNode::New(); newNode->SetData(pe); newNode->SetName(fiducialNode->GetName()); newNode->SetBoolProperty("planarfigure.3drendering", true); GetDataStorage()->Add(newNode, fbNode); } } } } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberfoxView::JoinBundles() { if ( m_SelectedBundles.size()<2 ){ QMessageBox::information( NULL, "Warning", "Select at least two fiber bundles!"); MITK_WARN("QmitkFiberFoxView") << "Select at least two fiber bundles!"; return; } std::vector::const_iterator it = m_SelectedBundles.begin(); mitk::FiberBundle::Pointer newBundle = dynamic_cast((*it)->GetData()); QString name(""); name += QString((*it)->GetName().c_str()); ++it; for (; it!=m_SelectedBundles.end(); ++it) { newBundle = newBundle->AddBundle(dynamic_cast((*it)->GetData())); name += "+"+QString((*it)->GetName().c_str()); } mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); fbNode->SetData(newBundle); fbNode->SetName(name.toStdString()); fbNode->SetVisibility(true); GetDataStorage()->Add(fbNode); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberfoxView::UpdateGui() { m_Controls->m_GeometryFrame->setEnabled(true); m_Controls->m_GeometryMessage->setVisible(false); m_Controls->m_DiffusionPropsMessage->setVisible(false); m_Controls->m_FiberGenMessage->setVisible(true); m_Controls->m_TransformBundlesButton->setEnabled(false); m_Controls->m_CopyBundlesButton->setEnabled(false); m_Controls->m_GenerateFibersButton->setEnabled(false); m_Controls->m_FlipButton->setEnabled(false); m_Controls->m_CircleButton->setEnabled(false); m_Controls->m_BvalueBox->setEnabled(true); m_Controls->m_NumGradientsBox->setEnabled(true); m_Controls->m_JoinBundlesButton->setEnabled(false); m_Controls->m_AlignOnGrid->setEnabled(false); // Fiber generation gui if (m_SelectedFiducial.IsNotNull()) { m_Controls->m_TransformBundlesButton->setEnabled(true); m_Controls->m_FlipButton->setEnabled(true); m_Controls->m_AlignOnGrid->setEnabled(true); } if (m_SelectedImageNode.IsNotNull() || !m_SelectedBundles.empty()) { m_Controls->m_CircleButton->setEnabled(true); m_Controls->m_FiberGenMessage->setVisible(false); } if (m_SelectedImageNode.IsNotNull() && !m_SelectedBundles.empty()) m_Controls->m_AlignOnGrid->setEnabled(true); if (!m_SelectedBundles.empty()) { m_Controls->m_TransformBundlesButton->setEnabled(true); m_Controls->m_CopyBundlesButton->setEnabled(true); m_Controls->m_GenerateFibersButton->setEnabled(true); if (m_SelectedBundles.size()>1) m_Controls->m_JoinBundlesButton->setEnabled(true); } // Signal generation gui if (m_Controls->m_MaskComboBox->GetSelectedNode().IsNotNull() || m_Controls->m_TemplateComboBox->GetSelectedNode().IsNotNull()) { m_Controls->m_GeometryMessage->setVisible(true); m_Controls->m_GeometryFrame->setEnabled(false); } if ( m_Controls->m_TemplateComboBox->GetSelectedNode().IsNotNull() && mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(m_Controls->m_TemplateComboBox->GetSelectedNode()->GetData()) ) ) { m_Controls->m_DiffusionPropsMessage->setVisible(true); m_Controls->m_BvalueBox->setEnabled(false); m_Controls->m_NumGradientsBox->setEnabled(false); m_Controls->m_GeometryMessage->setVisible(true); m_Controls->m_GeometryFrame->setEnabled(false); } } -void QmitkFiberfoxView::OnSelectionChanged( berry::IWorkbenchPart::Pointer, const QList& nodes ) +void QmitkFiberfoxView::OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList& nodes) { m_SelectedBundles2.clear(); m_SelectedImages.clear(); m_SelectedFiducials.clear(); m_SelectedFiducial = NULL; m_SelectedBundles.clear(); m_SelectedImageNode = NULL; // iterate all selected objects, adjust warning visibility for( int i=0; i(node->GetData()) ) { m_SelectedImages.push_back(node); m_SelectedImageNode = node; } else if ( node.IsNotNull() && dynamic_cast(node->GetData()) ) { m_SelectedBundles2.push_back(node); if (m_Controls->m_RealTimeFibers->isChecked()) { m_SelectedBundles.push_back(node); mitk::FiberBundle::Pointer newFib = dynamic_cast(node->GetData()); if (newFib->GetNumFibers()!=m_Controls->m_FiberDensityBox->value()) GenerateFibers(); } else m_SelectedBundles.push_back(node); } else if ( node.IsNotNull() && dynamic_cast(node->GetData()) ) { m_SelectedFiducials.push_back(node); m_SelectedFiducial = node; m_SelectedBundles.clear(); mitk::DataStorage::SetOfObjects::ConstPointer parents = GetDataStorage()->GetSources(node); for( mitk::DataStorage::SetOfObjects::const_iterator it = parents->begin(); it != parents->end(); ++it ) { mitk::DataNode::Pointer pNode = *it; if ( pNode.IsNotNull() && dynamic_cast(pNode->GetData()) ) m_SelectedBundles.push_back(pNode); } } } UpdateGui(); } void QmitkFiberfoxView::EnableCrosshairNavigation() { if (m_Controls->m_RealTimeFibers->isChecked()) GenerateFibers(); } void QmitkFiberfoxView::DisableCrosshairNavigation() { } void QmitkFiberfoxView::NodeRemoved(const mitk::DataNode* node) { mitk::DataNode* nonConstNode = const_cast(node); std::map::iterator it = m_DataNodeToPlanarFigureData.find(nonConstNode); if (dynamic_cast(node->GetData())) { m_SelectedBundles.clear(); m_SelectedBundles2.clear(); } else if (dynamic_cast(node->GetData())) m_SelectedImages.clear(); if( it != m_DataNodeToPlanarFigureData.end() ) { QmitkPlanarFigureData& data = it->second; // remove observers data.m_Figure->RemoveObserver( data.m_EndPlacementObserverTag ); data.m_Figure->RemoveObserver( data.m_SelectObserverTag ); data.m_Figure->RemoveObserver( data.m_StartInteractionObserverTag ); data.m_Figure->RemoveObserver( data.m_EndInteractionObserverTag ); m_DataNodeToPlanarFigureData.erase( it ); } } void QmitkFiberfoxView::NodeAdded( const mitk::DataNode* node ) { // add observer for selection in renderwindow mitk::PlanarFigure* figure = dynamic_cast(node->GetData()); bool isPositionMarker (false); node->GetBoolProperty("isContourMarker", isPositionMarker); if( figure && !isPositionMarker ) { MITK_DEBUG << "figure added. will add interactor if needed."; mitk::PlanarFigureInteractor::Pointer figureInteractor = dynamic_cast(node->GetDataInteractor().GetPointer()); mitk::DataNode* nonConstNode = const_cast( node ); if(figureInteractor.IsNull()) { figureInteractor = mitk::PlanarFigureInteractor::New(); us::Module* planarFigureModule = us::ModuleRegistry::GetModule( "MitkPlanarFigure" ); figureInteractor->LoadStateMachine("PlanarFigureInteraction.xml", planarFigureModule ); figureInteractor->SetEventConfig( "PlanarFigureConfig.xml", planarFigureModule ); figureInteractor->SetDataNode( nonConstNode ); } MITK_DEBUG << "will now add observers for planarfigure"; QmitkPlanarFigureData data; data.m_Figure = figure; // // add observer for event when figure has been placed typedef itk::SimpleMemberCommand< QmitkFiberfoxView > SimpleCommandType; // SimpleCommandType::Pointer initializationCommand = SimpleCommandType::New(); // initializationCommand->SetCallbackFunction( this, &QmitkFiberfoxView::PlanarFigureInitialized ); // data.m_EndPlacementObserverTag = figure->AddObserver( mitk::EndPlacementPlanarFigureEvent(), initializationCommand ); // add observer for event when figure is picked (selected) typedef itk::MemberCommand< QmitkFiberfoxView > MemberCommandType; MemberCommandType::Pointer selectCommand = MemberCommandType::New(); selectCommand->SetCallbackFunction( this, &QmitkFiberfoxView::PlanarFigureSelected ); data.m_SelectObserverTag = figure->AddObserver( mitk::SelectPlanarFigureEvent(), selectCommand ); // add observer for event when interaction with figure starts SimpleCommandType::Pointer startInteractionCommand = SimpleCommandType::New(); startInteractionCommand->SetCallbackFunction( this, &QmitkFiberfoxView::DisableCrosshairNavigation); data.m_StartInteractionObserverTag = figure->AddObserver( mitk::StartInteractionPlanarFigureEvent(), startInteractionCommand ); // add observer for event when interaction with figure starts SimpleCommandType::Pointer endInteractionCommand = SimpleCommandType::New(); endInteractionCommand->SetCallbackFunction( this, &QmitkFiberfoxView::EnableCrosshairNavigation); data.m_EndInteractionObserverTag = figure->AddObserver( mitk::EndInteractionPlanarFigureEvent(), endInteractionCommand ); m_DataNodeToPlanarFigureData[nonConstNode] = data; } } void QmitkFiberfoxView::PlanarFigureSelected( itk::Object* object, const itk::EventObject& ) { mitk::TNodePredicateDataType::Pointer isPf = mitk::TNodePredicateDataType::New(); mitk::DataStorage::SetOfObjects::ConstPointer allPfs = this->GetDataStorage()->GetSubset( isPf ); for ( mitk::DataStorage::SetOfObjects::const_iterator it = allPfs->begin(); it!=allPfs->end(); ++it) { mitk::DataNode* node = *it; if( node->GetData() == object ) { node->SetSelected(true); m_SelectedFiducial = node; } else node->SetSelected(false); } UpdateGui(); this->RequestRenderWindowUpdate(); } void QmitkFiberfoxView::SetFocus() { m_Controls->m_CircleButton->setFocus(); } void QmitkFiberfoxView::SetOutputPath() { // SELECT FOLDER DIALOG string outputPath = QFileDialog::getExistingDirectory(NULL, "Save images to...", QString(outputPath.c_str())).toStdString(); if (outputPath.empty()) m_Controls->m_SavePathEdit->setText("-"); else { outputPath += "/"; m_Controls->m_SavePathEdit->setText(QString(outputPath.c_str())); } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.h index 94bcf65efb..fa1768f6b4 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFiberfoxView.h @@ -1,217 +1,215 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include #include #include "ui_QmitkFiberfoxViewControls.h" #include #include #include #ifndef Q_MOC_RUN #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif #include #include #include #include /*! \brief View for fiber based diffusion software phantoms (Fiberfox). See "Fiberfox: Facilitating the creation of realistic white matter software phantoms" (DOI: 10.1002/mrm.25045) for details. -\sa QmitkFunctionality -\ingroup Functionalities */ // Forward Qt class declarations using namespace std; class QmitkFiberfoxView; class QmitkFiberfoxWorker : public QObject { Q_OBJECT public: QmitkFiberfoxWorker(QmitkFiberfoxView* view); public slots: void run(); private: QmitkFiberfoxView* m_View; }; class QmitkFiberfoxView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const string VIEW_ID; QmitkFiberfoxView(); virtual ~QmitkFiberfoxView(); virtual void CreateQtPartControl(QWidget *parent) override; void SetFocus() override; typedef mitk::DiffusionPropertyHelper::GradientDirectionType GradientDirectionType; typedef mitk::DiffusionPropertyHelper::GradientDirectionsContainerType GradientDirectionContainerType; typedef itk::Vector GradientType; typedef vector GradientListType; typedef itk::VectorImage< short, 3 > ItkDwiType; typedef itk::Image ItkDoubleImgType; typedef itk::Image ItkFloatImgType; typedef itk::Image ItkUcharImgType; template vector > MakeGradientList(); protected slots: void SetOutputPath(); ///< path where image is automatically saved to after the simulation is finished void LoadParameters(); ///< load fiberfox parameters void SaveParameters(); ///< save fiberfox parameters void BeforeThread(); void AfterThread(); void KillThread(); ///< abort simulation void UpdateSimulationStatus(); ///< print simulation progress and satus messages void OnDrawROI(); ///< adds new ROI, handles interactors etc. void OnAddBundle(); ///< adds new fiber bundle to datastorage void OnFlipButton(); ///< negate one coordinate of the fiber waypoints in the selcted planar figure. needed in case of unresolvable twists void GenerateFibers(); ///< generate fibers from the selected ROIs void GenerateImage(); ///< start image simulation void JoinBundles(); ///< merges selcted fiber bundles into one void CopyBundles(); ///< add copy of the selected bundle to the datamanager void ApplyTransform(); ///< rotate and shift selected bundles void AlignOnGrid(); ///< shift selected fiducials to nearest voxel center void Comp1ModelFrameVisibility(int index); ///< only show parameters of selected signal model for compartment 1 void Comp2ModelFrameVisibility(int index); ///< only show parameters of selected signal model for compartment 2 void Comp3ModelFrameVisibility(int index); ///< only show parameters of selected signal model for compartment 3 void Comp4ModelFrameVisibility(int index); ///< only show parameters of selected signal model for compartment 4 void ShowAdvancedOptions(int state); /** update fibers if any parameter changes */ void OnFiberDensityChanged(int value); void OnFiberSamplingChanged(double value); void OnTensionChanged(double value); void OnContinuityChanged(double value); void OnBiasChanged(double value); void OnVarianceChanged(double value); void OnDistributionChanged(int value); void OnConstantRadius(int value); /** update GUI elements */ void OnAddNoise(int value); void OnAddGhosts(int value); void OnAddDistortions(int value); void OnAddEddy(int value); void OnAddSpikes(int value); void OnAddAliasing(int value); void OnAddMotion(int value); void OnMaskSelected(int value); void OnFibSelected(int value); void OnTemplateSelected(int value); protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList&) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; GradientListType GenerateHalfShell(int NPoints); ///< generate vectors distributed over the halfsphere Ui::QmitkFiberfoxViewControls* m_Controls; void SimulateForExistingDwi(mitk::DataNode* imageNode); ///< add artifacts to existing diffusion weighted image void SimulateImageFromFibers(mitk::DataNode* fiberNode); ///< simulate new diffusion weighted image template< class ScalarType > FiberfoxParameters< ScalarType > UpdateImageParameters(bool all=true, bool save=false); ///< update fiberfox paramater object (template parameter defines noise model type) void UpdateGui(); ///< enable/disbale buttons etc. according to current datamanager selection void PlanarFigureSelected( itk::Object* object, const itk::EventObject& ); void EnableCrosshairNavigation(); ///< enable crosshair navigation if planar figure interaction ends void DisableCrosshairNavigation(); ///< disable crosshair navigation if planar figure interaction starts void NodeAdded( const mitk::DataNode* node ) override; ///< add observers void NodeRemoved(const mitk::DataNode* node) override; ///< remove observers void SaveParameters(QString filename); /** structure to keep track of planar figures and observers */ struct QmitkPlanarFigureData { QmitkPlanarFigureData() : m_Figure(0) , m_EndPlacementObserverTag(0) , m_SelectObserverTag(0) , m_StartInteractionObserverTag(0) , m_EndInteractionObserverTag(0) , m_Flipped(0) { } mitk::PlanarFigure* m_Figure; unsigned int m_EndPlacementObserverTag; unsigned int m_SelectObserverTag; unsigned int m_StartInteractionObserverTag; unsigned int m_EndInteractionObserverTag; unsigned int m_Flipped; }; std::map m_DataNodeToPlanarFigureData; ///< map each planar figure uniquely to a QmitkPlanarFigureData mitk::DataNode::Pointer m_SelectedFiducial; ///< selected planar ellipse mitk::DataNode::Pointer m_SelectedImageNode; vector< mitk::DataNode::Pointer > m_SelectedBundles; vector< mitk::DataNode::Pointer > m_SelectedBundles2; vector< mitk::DataNode::Pointer > m_SelectedFiducials; vector< mitk::DataNode::Pointer > m_SelectedImages; QString m_ParameterFile; ///< parameter file name // GUI thread QmitkFiberfoxWorker m_Worker; ///< runs filter QThread m_Thread; ///< worker thread bool m_ThreadIsRunning; QTimer* m_SimulationTimer; QTime m_SimulationTime; QString m_SimulationStatusText; /** Image filters that do all the simulations. */ itk::TractsToDWIImageFilter< short >::Pointer m_TractsToDwiFilter; friend class QmitkFiberfoxWorker; }; diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.cpp index 36cc39d848..359a34e83f 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.cpp @@ -1,299 +1,298 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // MITK #include "QmitkFieldmapGeneratorView.h" -#include #include #include #include #include +#include +#include const std::string QmitkFieldmapGeneratorView::VIEW_ID = "org.mitk.views.fieldmapgenerator"; QmitkFieldmapGeneratorView::QmitkFieldmapGeneratorView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) { } QmitkFieldmapGeneratorView::~QmitkFieldmapGeneratorView() { } void QmitkFieldmapGeneratorView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkFieldmapGeneratorViewControls; m_Controls->setupUi( parent ); m_Controls->m_SelectedImageBox->SetDataStorage(this->GetDataStorage()); mitk::TNodePredicateDataType::Pointer isMitkImage = mitk::TNodePredicateDataType::New(); m_Controls->m_SelectedImageBox->SetPredicate(isMitkImage); connect((QObject*) m_Controls->m_GenerateFieldmap, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateFieldmap())); connect((QObject*) m_Controls->m_PlaceFieldSource, SIGNAL(clicked()), (QObject*) this, SLOT(PlaceFieldSource())); connect((QObject*) m_Controls->m_SourceVarianceBox, SIGNAL(valueChanged(double)), (QObject*) this, SLOT(OnVarianceChanged(double))); connect((QObject*) m_Controls->m_SourceHeightBox, SIGNAL(valueChanged(double)), (QObject*) this, SLOT(OnHeightChanged(double))); } } +void QmitkFieldmapGeneratorView::SetFocus() +{ + m_Controls->m_SelectedImageBox->setFocus(); +} + void QmitkFieldmapGeneratorView::OnVarianceChanged(double value) { if (m_SelectedSource.IsNotNull()) { m_SelectedSource->SetProperty("pointsize", mitk::FloatProperty::New(value)); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkFieldmapGeneratorView::OnHeightChanged(double value) { if (m_SelectedSource.IsNotNull()) { m_SelectedSource->SetProperty("color", mitk::ColorProperty::New(0, 0, value/100.0)); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkFieldmapGeneratorView::PlaceFieldSource() { - if (m_Controls->m_SelectedImageBox->GetSelectedNode().IsNull() || !m_MultiWidget) + if (m_Controls->m_SelectedImageBox->GetSelectedNode().IsNull() || !this->GetRenderWindowPart()) { m_Controls->m_WorldPosLabel->setText("-"); m_Controls->m_IndexLabel->setText("-"); return; } mitk::Point3D index; mitk::Image::Pointer img = dynamic_cast(m_Controls->m_SelectedImageBox->GetSelectedNode()->GetData()); mitk::BaseGeometry* geom = img->GetGeometry(); if ( geom->IsInside(m_WorldPoint) ) { img->GetGeometry()->WorldToIndex(m_WorldPoint, index); mitk::PointSet::Pointer pointSet = mitk::PointSet::New(); pointSet->InsertPoint(0, m_WorldPoint); mitk::DataStorage::SetOfObjects::ConstPointer children = GetDataStorage()->GetDerivations(m_Controls->m_SelectedImageBox->GetSelectedNode()); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(pointSet); QString name = QString("FieldSource_%1").arg(children->size()); node->SetName(name.toStdString()); node->SetVisibility(true); float minSpacing; if(geom->GetSpacing()[0]GetSpacing()[1] && geom->GetSpacing()[0]GetSpacing()[2]) minSpacing = geom->GetSpacing()[0]; else if (geom->GetSpacing()[1] < geom->GetSpacing()[2]) minSpacing = geom->GetSpacing()[1]; else minSpacing = geom->GetSpacing()[2]; node->SetProperty("pointsize", mitk::FloatProperty::New(minSpacing*5)); node->SetProperty("color", mitk::ColorProperty::New(0, 0, 1)); GetDataStorage()->Add(node, m_Controls->m_SelectedImageBox->GetSelectedNode()); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkFieldmapGeneratorView::GenerateFieldmap() { if (m_Controls->m_SelectedImageBox->GetSelectedNode().IsNull()) return; mitk::Image::Pointer img = dynamic_cast(m_Controls->m_SelectedImageBox->GetSelectedNode()->GetData()); mitk::BaseGeometry* geom = img->GetGeometry(); typedef itk::Image< double, 3 > FieldMapType; itk::Vector spacing; ///< output image spacing mitk::Point3D origin; ///< output image origin itk::FieldmapGeneratorFilter< FieldMapType >::MatrixType directionMatrix; ///< output image rotation itk::FieldmapGeneratorFilter< FieldMapType >::OutputImageRegionType imageRegion; ///< output image size spacing = geom->GetSpacing(); origin = geom->GetOrigin(); imageRegion.SetSize(0, img->GetDimension(0)); imageRegion.SetSize(1, img->GetDimension(1)); imageRegion.SetSize(2, img->GetDimension(2)); for (int r=0; r<3; r++) for (int c=0; c<3; c++) directionMatrix[r][c]=geom->GetMatrixColumn(c)[r]/spacing[c]; std::vector< double > variances; std::vector< double > heights; std::vector< mitk::Point3D > worldPositions; mitk::DataStorage::SetOfObjects::ConstPointer children = GetDataStorage()->GetDerivations(m_Controls->m_SelectedImageBox->GetSelectedNode()); for( mitk::DataStorage::SetOfObjects::const_iterator it = children->begin(); it != children->end(); ++it ) if(dynamic_cast((*it)->GetData())) { float var = 0; (*it)->GetPropertyValue("pointsize", var); variances.push_back(var); float color[3]; (*it)->GetColor(color); heights.push_back(color[2]*100); mitk::PointSet* ps = dynamic_cast((*it)->GetData()); mitk::Point3D point; ps->GetPointIfExists(0, &point); worldPositions.push_back(point); } vnl_vector_fixed< double, 3 > gradient, offset; gradient[0] = m_Controls->m_xGradientBox->value(); gradient[1] = m_Controls->m_yGradientBox->value(); gradient[2] = m_Controls->m_zGradientBox->value(); offset[0] = m_Controls->m_xOffsetBox->value(); offset[1] = m_Controls->m_yOffsetBox->value(); offset[2] = m_Controls->m_zOffsetBox->value(); itk::FieldmapGeneratorFilter< FieldMapType >::Pointer filter = itk::FieldmapGeneratorFilter< FieldMapType >::New(); filter->SetHeights(heights); filter->SetVariances(variances); filter->SetWorldPositions(worldPositions); filter->SetSpacing(spacing); filter->SetOrigin(origin); filter->SetDirectionMatrix(directionMatrix); filter->SetImageRegion(imageRegion); filter->SetGradient(gradient); filter->SetOffset(offset); filter->Update(); mitk::DataNode::Pointer resultNode = mitk::DataNode::New(); mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk(filter->GetOutput(0)); image->SetVolume(filter->GetOutput(0)->GetBufferPointer()); resultNode->SetData( image ); resultNode->SetName(m_Controls->m_SelectedImageBox->GetSelectedNode()->GetName()+"_Fieldmap"); GetDataStorage()->Add(resultNode); } -void QmitkFieldmapGeneratorView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkFieldmapGeneratorView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { - m_MultiWidget = &stdMultiWidget; - { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget1->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkFieldmapGeneratorView::OnSliceChanged ); m_SliceObserverTag1 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget2->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkFieldmapGeneratorView::OnSliceChanged ); m_SliceObserverTag2 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget3->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkFieldmapGeneratorView::OnSliceChanged ); m_SliceObserverTag3 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } } -void QmitkFieldmapGeneratorView::StdMultiWidgetNotAvailable() +void QmitkFieldmapGeneratorView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) { { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget1->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController(); slicer->RemoveObserver( m_SliceObserverTag1 ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget2->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController(); slicer->RemoveObserver( m_SliceObserverTag2 ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget3->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController(); slicer->RemoveObserver( m_SliceObserverTag3 ); } - - m_MultiWidget = NULL; } -void QmitkFieldmapGeneratorView::OnSelectionChanged( std::vector nodes ) +void QmitkFieldmapGeneratorView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { if (m_Controls->m_SelectedImageBox->GetSelectedNode().IsNotNull()) m_Controls->m_SelectedImageBox->GetSelectedNode()->RemoveObserver( m_PropertyObserverTag ); m_Controls->m_InputData->setTitle("Please Select Reference Image"); m_SelectedSource = NULL; // iterate selection - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; - if ( node.IsNotNull() && (dynamic_cast(node->GetData())) ) { m_Controls->m_SourceNameLabel->setText(node->GetName().c_str()); m_SelectedSource = node; float variance = 0; node->GetPropertyValue("pointsize", variance); m_Controls->m_SourceVarianceBox->setValue(variance); float color[3]; node->GetColor(color); m_Controls->m_SourceHeightBox->setValue(color[2]*100); } } if (m_Controls->m_SelectedImageBox->GetSelectedNode().IsNotNull()) { itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkFieldmapGeneratorView::OnSliceChanged ); m_PropertyObserverTag = m_Controls->m_SelectedImageBox->GetSelectedNode()->AddObserver( itk::ModifiedEvent(), command ); m_Controls->m_InputData->setTitle("Reference Image"); } } void QmitkFieldmapGeneratorView::OnSliceChanged(const itk::EventObject& /*e*/) { - if (m_Controls->m_SelectedImageBox->GetSelectedNode().IsNull() || !m_MultiWidget) + if (m_Controls->m_SelectedImageBox->GetSelectedNode().IsNull() || !this->GetRenderWindowPart()) { m_Controls->m_WorldPosLabel->setText("-"); m_Controls->m_IndexLabel->setText("-"); return; } - m_WorldPoint = m_MultiWidget->GetCrossPosition(); + m_WorldPoint = this->GetRenderWindowPart()->GetSelectedPosition(); QString posSting = QString::number(m_WorldPoint[0]); posSting += ", "; posSting += QString::number(m_WorldPoint[1]); posSting += ", "; posSting += QString::number(m_WorldPoint[2]); m_Controls->m_WorldPosLabel->setText(posSting.toStdString().c_str()); mitk::Point3D index; mitk::Image::Pointer img = dynamic_cast(m_Controls->m_SelectedImageBox->GetSelectedNode()->GetData()); if ( m_Controls->m_SelectedImageBox->GetSelectedNode()->GetData()->GetGeometry()->IsInside(m_WorldPoint) ) { img->GetGeometry()->WorldToIndex(m_WorldPoint, index); posSting = QString::number(index[0]); posSting += ", "; posSting += QString::number(index[1]); posSting += ", "; posSting += QString::number(index[2]); m_Controls->m_IndexLabel->setText(posSting.toStdString().c_str()); } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.h index 233e40f792..2bf1c6f532 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberfox/src/internal/QmitkFieldmapGeneratorView.h @@ -1,82 +1,84 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKQmitkFieldmapGeneratorView_H_INCLUDED #define _QMITKQmitkFieldmapGeneratorView_H_INCLUDED #include -#include +#include +#include #include "ui_QmitkFieldmapGeneratorViewControls.h" #include #include /*! \brief Generate float image with artificial frequency maps used by Fiberfox. Simulates additional frequencies at (possibly multiple) positions based on 3D gaussians with the specified variance and amplitude and/or as a linear gradient in the image. * See "Fiberfox: Facilitating the creation of realistic white matter software phantoms" (DOI: 10.1002/mrm.25045) for details. - - \sa QmitkFunctionality - \ingroup Functionalities */ -class QmitkFieldmapGeneratorView : public QmitkFunctionality +class QmitkFieldmapGeneratorView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkFieldmapGeneratorView(); virtual ~QmitkFieldmapGeneratorView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + + virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; + virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; void OnSliceChanged(const itk::EventObject& e); protected slots: void GenerateFieldmap(); void PlaceFieldSource(); void OnVarianceChanged(double value); void OnHeightChanged(double value); protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkFieldmapGeneratorViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; /** observer flags */ int m_SliceObserverTag1; int m_SliceObserverTag2; int m_SliceObserverTag3; int m_PropertyObserverTag; mitk::Point3D m_WorldPoint; mitk::DataNode::Pointer m_SelectedSource; }; #endif // _QmitkFieldmapGeneratorView_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.cpp index 1838f6a640..f6afa5276a 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.cpp @@ -1,1427 +1,1428 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include +#include #include // Qmitk #include "QmitkFiberProcessingView.h" -#include // Qt #include // MITK #include #include #include #include #include #include #include #include #include #include #include "usModuleRegistry.h" #include #include "mitkNodePredicateDataType.h" #include #include #include #include // ITK #include #include #include #include #include #include #include #define _USE_MATH_DEFINES #include const std::string QmitkFiberProcessingView::VIEW_ID = "org.mitk.views.fiberprocessing"; const std::string id_DataManager = "org.mitk.views.datamanager"; using namespace mitk; QmitkFiberProcessingView::QmitkFiberProcessingView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) , m_CircleCounter(0) , m_PolygonCounter(0) , m_UpsamplingFactor(1) { } // Destructor QmitkFiberProcessingView::~QmitkFiberProcessingView() { } void QmitkFiberProcessingView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkFiberProcessingViewControls; m_Controls->setupUi( parent ); connect( m_Controls->m_CircleButton, SIGNAL( clicked() ), this, SLOT( OnDrawCircle() ) ); connect( m_Controls->m_PolygonButton, SIGNAL( clicked() ), this, SLOT( OnDrawPolygon() ) ); connect(m_Controls->PFCompoANDButton, SIGNAL(clicked()), this, SLOT(GenerateAndComposite()) ); connect(m_Controls->PFCompoORButton, SIGNAL(clicked()), this, SLOT(GenerateOrComposite()) ); connect(m_Controls->PFCompoNOTButton, SIGNAL(clicked()), this, SLOT(GenerateNotComposite()) ); connect(m_Controls->m_GenerateRoiImage, SIGNAL(clicked()), this, SLOT(GenerateRoiImage()) ); connect(m_Controls->m_JoinBundles, SIGNAL(clicked()), this, SLOT(JoinBundles()) ); connect(m_Controls->m_SubstractBundles, SIGNAL(clicked()), this, SLOT(SubstractBundles()) ); connect(m_Controls->m_CopyBundle, SIGNAL(clicked()), this, SLOT(CopyBundles()) ); connect(m_Controls->m_ExtractFibersButton, SIGNAL(clicked()), this, SLOT(Extract())); connect(m_Controls->m_RemoveButton, SIGNAL(clicked()), this, SLOT(Remove())); connect(m_Controls->m_ModifyButton, SIGNAL(clicked()), this, SLOT(Modify())); connect(m_Controls->m_ExtractionMethodBox, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateGui())); connect(m_Controls->m_RemovalMethodBox, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateGui())); connect(m_Controls->m_ModificationMethodBox, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateGui())); connect(m_Controls->m_ExtractionBoxMask, SIGNAL(currentIndexChanged(int)), this, SLOT(OnMaskExtractionChanged())); m_Controls->m_ColorMapBox->SetDataStorage(this->GetDataStorage()); mitk::TNodePredicateDataType::Pointer isMitkImage = mitk::TNodePredicateDataType::New(); mitk::NodePredicateDataType::Pointer isDwi = mitk::NodePredicateDataType::New("DiffusionImage"); mitk::NodePredicateDataType::Pointer isDti = mitk::NodePredicateDataType::New("TensorImage"); mitk::NodePredicateDataType::Pointer isQbi = mitk::NodePredicateDataType::New("QBallImage"); mitk::NodePredicateOr::Pointer isDiffusionImage = mitk::NodePredicateOr::New(isDwi, isDti); isDiffusionImage = mitk::NodePredicateOr::New(isDiffusionImage, isQbi); mitk::NodePredicateNot::Pointer noDiffusionImage = mitk::NodePredicateNot::New(isDiffusionImage); mitk::NodePredicateAnd::Pointer finalPredicate = mitk::NodePredicateAnd::New(isMitkImage, noDiffusionImage); m_Controls->m_ColorMapBox->SetPredicate(finalPredicate); m_Controls->label_17->setVisible(false); m_Controls->m_FiberExtractionFractionBox->setVisible(false); } UpdateGui(); } void QmitkFiberProcessingView::OnMaskExtractionChanged() { if (m_Controls->m_ExtractionBoxMask->currentIndex() == 2) { m_Controls->label_17->setVisible(true); m_Controls->m_FiberExtractionFractionBox->setVisible(true); m_Controls->m_BothEnds->setVisible(false); } else { m_Controls->label_17->setVisible(false); m_Controls->m_FiberExtractionFractionBox->setVisible(false); if (m_Controls->m_ExtractionBoxMask->currentIndex() != 3) m_Controls->m_BothEnds->setVisible(true); } } +void QmitkFiberProcessingView::SetFocus() +{ + m_Controls->toolBoxx->setFocus(); +} + void QmitkFiberProcessingView::Modify() { switch (m_Controls->m_ModificationMethodBox->currentIndex()) { case 0: { ResampleSelectedBundlesSpline(); break; } case 1: { ResampleSelectedBundlesLinear(); break; } case 2: { CompressSelectedBundles(); break; } case 3: { DoImageColorCoding(); break; } case 4: { MirrorFibers(); break; } case 5: { WeightFibers(); break; } case 6: { DoCurvatureColorCoding(); break; } } } void QmitkFiberProcessingView::WeightFibers() { float weight = this->m_Controls->m_BundleWeightBox->value(); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); fib->SetFiberWeights(weight); } } void QmitkFiberProcessingView::Remove() { switch (m_Controls->m_RemovalMethodBox->currentIndex()) { case 0: { RemoveDir(); break; } case 1: { PruneBundle(); break; } case 2: { ApplyCurvatureThreshold(); break; } case 3: { RemoveWithMask(false); break; } case 4: { RemoveWithMask(true); break; } } } void QmitkFiberProcessingView::Extract() { switch (m_Controls->m_ExtractionMethodBox->currentIndex()) { case 0: { ExtractWithPlanarFigure(); break; } case 1: { switch (m_Controls->m_ExtractionBoxMask->currentIndex()) { { case 0: ExtractWithMask(true, false); break; } { case 1: ExtractWithMask(true, true); break; } { case 2: ExtractWithMask(false, false); break; } { case 3: ExtractWithMask(false, true); break; } } break; } } } void QmitkFiberProcessingView::PruneBundle() { int minLength = this->m_Controls->m_PruneFibersMinBox->value(); int maxLength = this->m_Controls->m_PruneFibersMaxBox->value(); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); if (!fib->RemoveShortFibers(minLength)) QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers."); else if (!fib->RemoveLongFibers(maxLength)) QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers."); } RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberProcessingView::ApplyCurvatureThreshold() { int angle = this->m_Controls->m_CurvSpinBox->value(); int dist = this->m_Controls->m_CurvDistanceSpinBox->value(); std::vector< DataNode::Pointer > nodes = m_SelectedFB; for (auto node : nodes) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); itk::FiberCurvatureFilter::Pointer filter = itk::FiberCurvatureFilter::New(); filter->SetInputFiberBundle(fib); filter->SetAngularDeviation(angle); filter->SetDistance(dist); filter->SetRemoveFibers(m_Controls->m_RemoveCurvedFibersBox->isChecked()); filter->Update(); mitk::FiberBundle::Pointer newFib = filter->GetOutputFiberBundle(); if (newFib->GetNumFibers()>0) { newFib->ColorFibersByOrientation(); node->SetData(newFib); } else QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers."); } RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberProcessingView::RemoveDir() { for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); vnl_vector_fixed dir; dir[0] = m_Controls->m_ExtractDirX->value(); dir[1] = m_Controls->m_ExtractDirY->value(); dir[2] = m_Controls->m_ExtractDirZ->value(); fib->RemoveDir(dir,cos((float)m_Controls->m_ExtractAngle->value()*M_PI/180)); } RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberProcessingView::RemoveWithMask(bool removeInside) { if (m_MaskImageNode.IsNull()) return; mitk::Image::Pointer mitkMask = dynamic_cast(m_MaskImageNode->GetData()); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); QString name(node->GetName().c_str()); itkUCharImageType::Pointer mask = itkUCharImageType::New(); mitk::CastToItkImage(mitkMask, mask); mitk::FiberBundle::Pointer newFib = fib->RemoveFibersOutside(mask, removeInside); if (newFib->GetNumFibers()<=0) { QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers."); continue; } node->SetData(newFib); } RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberProcessingView::ExtractWithMask(bool onlyEnds, bool invert) { if (m_MaskImageNode.IsNull()) return; mitk::Image::Pointer mitkMask = dynamic_cast(m_MaskImageNode->GetData()); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); QString name(node->GetName().c_str()); itkUCharImageType::Pointer mask = itkUCharImageType::New(); mitk::CastToItkImage(mitkMask, mask); mitk::FiberBundle::Pointer newFib = fib->ExtractFiberSubset(mask, !onlyEnds, invert, m_Controls->m_BothEnds->isChecked(), m_Controls->m_FiberExtractionFractionBox->value()); if (newFib->GetNumFibers()<=0) { QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers."); continue; } DataNode::Pointer newNode = DataNode::New(); newNode->SetData(newFib); if (invert) { name += "_not"; if (onlyEnds) name += "-ending-in-mask"; else name += "-passing-mask"; } else { if (onlyEnds) name += "_ending-in-mask"; else name += "_passing-mask"; } newNode->SetName(name.toStdString()); - GetDefaultDataStorage()->Add(newNode); + GetDataStorage()->Add(newNode); node->SetVisibility(false); } } void QmitkFiberProcessingView::GenerateRoiImage() { if (m_SelectedPF.empty()) return; mitk::BaseGeometry::Pointer geometry; if (!m_SelectedFB.empty()) { mitk::FiberBundle::Pointer fib = dynamic_cast(m_SelectedFB.front()->GetData()); geometry = fib->GetGeometry(); } else if (m_SelectedImage) geometry = m_SelectedImage->GetGeometry(); else return; itk::Vector spacing = geometry->GetSpacing(); spacing /= m_UpsamplingFactor; mitk::Point3D newOrigin = geometry->GetOrigin(); mitk::Geometry3D::BoundsArrayType bounds = geometry->GetBounds(); newOrigin[0] += bounds.GetElement(0); newOrigin[1] += bounds.GetElement(2); newOrigin[2] += bounds.GetElement(4); itk::Matrix direction; itk::ImageRegion<3> imageRegion; for (int i=0; i<3; i++) for (int j=0; j<3; j++) direction[j][i] = geometry->GetMatrixColumn(i)[j]/spacing[j]; imageRegion.SetSize(0, geometry->GetExtent(0)*m_UpsamplingFactor); imageRegion.SetSize(1, geometry->GetExtent(1)*m_UpsamplingFactor); imageRegion.SetSize(2, geometry->GetExtent(2)*m_UpsamplingFactor); m_PlanarFigureImage = itkUCharImageType::New(); m_PlanarFigureImage->SetSpacing( spacing ); // Set the image spacing m_PlanarFigureImage->SetOrigin( newOrigin ); // Set the image origin m_PlanarFigureImage->SetDirection( direction ); // Set the image direction m_PlanarFigureImage->SetRegions( imageRegion ); m_PlanarFigureImage->Allocate(); m_PlanarFigureImage->FillBuffer( 0 ); Image::Pointer tmpImage = Image::New(); tmpImage->InitializeByItk(m_PlanarFigureImage.GetPointer()); tmpImage->SetVolume(m_PlanarFigureImage->GetBufferPointer()); std::string name = m_SelectedPF.at(0)->GetName(); WritePfToImage(m_SelectedPF.at(0), tmpImage); for (unsigned int i=1; iGetName(); WritePfToImage(m_SelectedPF.at(i), tmpImage); } DataNode::Pointer node = DataNode::New(); tmpImage = Image::New(); tmpImage->InitializeByItk(m_PlanarFigureImage.GetPointer()); tmpImage->SetVolume(m_PlanarFigureImage->GetBufferPointer()); node->SetData(tmpImage); node->SetName(name); - this->GetDefaultDataStorage()->Add(node); + this->GetDataStorage()->Add(node); } void QmitkFiberProcessingView::WritePfToImage(mitk::DataNode::Pointer node, mitk::Image* image) { if (dynamic_cast(node->GetData())) { m_PlanarFigure = dynamic_cast(node->GetData()); AccessFixedDimensionByItk_2( image, InternalReorientImagePlane, 3, m_PlanarFigure->GetGeometry(), -1); AccessFixedDimensionByItk_2( m_InternalImage, InternalCalculateMaskFromPlanarFigure, 3, 2, node->GetName() ); } else if (dynamic_cast(node->GetData())) { DataStorage::SetOfObjects::ConstPointer children = GetDataStorage()->GetDerivations(node); for (unsigned int i=0; iSize(); i++) { WritePfToImage(children->at(i), image); } } } template < typename TPixel, unsigned int VImageDimension > void QmitkFiberProcessingView::InternalReorientImagePlane( const itk::Image< TPixel, VImageDimension > *image, mitk::BaseGeometry* planegeo3D, int additionalIndex ) { typedef itk::Image< TPixel, VImageDimension > ImageType; typedef itk::Image< float, VImageDimension > FloatImageType; typedef itk::ResampleImageFilter ResamplerType; typename ResamplerType::Pointer resampler = ResamplerType::New(); mitk::PlaneGeometry* planegeo = dynamic_cast(planegeo3D); float upsamp = m_UpsamplingFactor; float gausssigma = 0.5; // Spacing typename ResamplerType::SpacingType spacing = planegeo->GetSpacing(); spacing[0] = image->GetSpacing()[0] / upsamp; spacing[1] = image->GetSpacing()[1] / upsamp; spacing[2] = image->GetSpacing()[2]; resampler->SetOutputSpacing( spacing ); // Size typename ResamplerType::SizeType size; size[0] = planegeo->GetExtentInMM(0) / spacing[0]; size[1] = planegeo->GetExtentInMM(1) / spacing[1]; size[2] = 1; resampler->SetSize( size ); // Origin typename mitk::Point3D orig = planegeo->GetOrigin(); typename mitk::Point3D corrorig; planegeo3D->WorldToIndex(orig,corrorig); corrorig[0] += 0.5/upsamp; corrorig[1] += 0.5/upsamp; corrorig[2] += 0; planegeo3D->IndexToWorld(corrorig,corrorig); resampler->SetOutputOrigin(corrorig ); // Direction typename ResamplerType::DirectionType direction; typename mitk::AffineTransform3D::MatrixType matrix = planegeo->GetIndexToWorldTransform()->GetMatrix(); for(int c=0; cSetOutputDirection( direction ); // Gaussian interpolation if(gausssigma != 0) { double sigma[3]; for( unsigned int d = 0; d < 3; d++ ) sigma[d] = gausssigma * image->GetSpacing()[d]; double alpha = 2.0; typedef itk::GaussianInterpolateImageFunction GaussianInterpolatorType; typename GaussianInterpolatorType::Pointer interpolator = GaussianInterpolatorType::New(); interpolator->SetInputImage( image ); interpolator->SetParameters( sigma, alpha ); resampler->SetInterpolator( interpolator ); } else { typedef typename itk::LinearInterpolateImageFunction InterpolatorType; typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); interpolator->SetInputImage( image ); resampler->SetInterpolator( interpolator ); } resampler->SetInput( image ); resampler->SetDefaultPixelValue(0); resampler->Update(); if(additionalIndex < 0) { this->m_InternalImage = mitk::Image::New(); this->m_InternalImage->InitializeByItk( resampler->GetOutput() ); this->m_InternalImage->SetVolume( resampler->GetOutput()->GetBufferPointer() ); } } template < typename TPixel, unsigned int VImageDimension > void QmitkFiberProcessingView::InternalCalculateMaskFromPlanarFigure( itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string ) { typedef itk::Image< TPixel, VImageDimension > ImageType; typedef itk::CastImageFilter< ImageType, itkUCharImageType > CastFilterType; // Generate mask image as new image with same header as input image and // initialize with "1". itkUCharImageType::Pointer newMaskImage = itkUCharImageType::New(); newMaskImage->SetSpacing( image->GetSpacing() ); // Set the image spacing newMaskImage->SetOrigin( image->GetOrigin() ); // Set the image origin newMaskImage->SetDirection( image->GetDirection() ); // Set the image direction newMaskImage->SetRegions( image->GetLargestPossibleRegion() ); newMaskImage->Allocate(); newMaskImage->FillBuffer( 1 ); // Generate VTK polygon from (closed) PlanarFigure polyline // (The polyline points are shifted by -0.5 in z-direction to make sure // that the extrusion filter, which afterwards elevates all points by +0.5 // in z-direction, creates a 3D object which is cut by the the plane z=0) const PlaneGeometry *planarFigurePlaneGeometry = m_PlanarFigure->GetPlaneGeometry(); const PlanarFigure::PolyLineType planarFigurePolyline = m_PlanarFigure->GetPolyLine( 0 ); const BaseGeometry *imageGeometry3D = m_InternalImage->GetGeometry( 0 ); vtkPolyData *polyline = vtkPolyData::New(); polyline->Allocate( 1, 1 ); // Determine x- and y-dimensions depending on principal axis int i0, i1; switch ( axis ) { case 0: i0 = 1; i1 = 2; break; case 1: i0 = 0; i1 = 2; break; case 2: default: i0 = 0; i1 = 1; break; } // Create VTK polydata object of polyline contour vtkPoints *points = vtkPoints::New(); PlanarFigure::PolyLineType::const_iterator it; unsigned int numberOfPoints = 0; for ( it = planarFigurePolyline.begin(); it != planarFigurePolyline.end(); ++it ) { Point3D point3D; // Convert 2D point back to the local index coordinates of the selected image Point2D point2D = *it; planarFigurePlaneGeometry->WorldToIndex(point2D, point2D); point2D[0] -= 0.5/m_UpsamplingFactor; point2D[1] -= 0.5/m_UpsamplingFactor; planarFigurePlaneGeometry->IndexToWorld(point2D, point2D); planarFigurePlaneGeometry->Map( point2D, point3D ); // Polygons (partially) outside of the image bounds can not be processed further due to a bug in vtkPolyDataToImageStencil if ( !imageGeometry3D->IsInside( point3D ) ) { float bounds[2] = {0,0}; bounds[0] = this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i0); bounds[1] = this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i1); imageGeometry3D->WorldToIndex( point3D, point3D ); if (point3D[i0]<0) point3D[i0] = 0.0; else if (point3D[i0]>bounds[0]) point3D[i0] = bounds[0]-0.001; if (point3D[i1]<0) point3D[i1] = 0.0; else if (point3D[i1]>bounds[1]) point3D[i1] = bounds[1]-0.001; points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 ); numberOfPoints++; } else { imageGeometry3D->WorldToIndex( point3D, point3D ); // Add point to polyline array points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 ); numberOfPoints++; } } polyline->SetPoints( points ); points->Delete(); vtkIdType *ptIds = new vtkIdType[numberOfPoints]; for ( vtkIdType i = 0; i < numberOfPoints; ++i ) ptIds[i] = i; polyline->InsertNextCell( VTK_POLY_LINE, numberOfPoints, ptIds ); // Extrude the generated contour polygon vtkLinearExtrusionFilter *extrudeFilter = vtkLinearExtrusionFilter::New(); extrudeFilter->SetInputData( polyline ); extrudeFilter->SetScaleFactor( 1 ); extrudeFilter->SetExtrusionTypeToNormalExtrusion(); extrudeFilter->SetVector( 0.0, 0.0, 1.0 ); // Make a stencil from the extruded polygon vtkPolyDataToImageStencil *polyDataToImageStencil = vtkPolyDataToImageStencil::New(); polyDataToImageStencil->SetInputConnection( extrudeFilter->GetOutputPort() ); // Export from ITK to VTK (to use a VTK filter) typedef itk::VTKImageImport< itkUCharImageType > ImageImportType; typedef itk::VTKImageExport< itkUCharImageType > ImageExportType; typename ImageExportType::Pointer itkExporter = ImageExportType::New(); itkExporter->SetInput( newMaskImage ); vtkImageImport *vtkImporter = vtkImageImport::New(); this->ConnectPipelines( itkExporter, vtkImporter ); vtkImporter->Update(); // Apply the generated image stencil to the input image vtkImageStencil *imageStencilFilter = vtkImageStencil::New(); imageStencilFilter->SetInputConnection( vtkImporter->GetOutputPort() ); imageStencilFilter->SetStencilConnection(polyDataToImageStencil->GetOutputPort() ); imageStencilFilter->ReverseStencilOff(); imageStencilFilter->SetBackgroundValue( 0 ); imageStencilFilter->Update(); // Export from VTK back to ITK vtkImageExport *vtkExporter = vtkImageExport::New(); vtkExporter->SetInputConnection( imageStencilFilter->GetOutputPort() ); vtkExporter->Update(); typename ImageImportType::Pointer itkImporter = ImageImportType::New(); this->ConnectPipelines( vtkExporter, itkImporter ); itkImporter->Update(); // calculate cropping bounding box m_InternalImageMask3D = itkImporter->GetOutput(); m_InternalImageMask3D->SetDirection(image->GetDirection()); itk::ImageRegionConstIterator itmask(m_InternalImageMask3D, m_InternalImageMask3D->GetLargestPossibleRegion()); itk::ImageRegionIterator itimage(image, image->GetLargestPossibleRegion()); itmask.GoToBegin(); itimage.GoToBegin(); typename ImageType::SizeType lowersize = {{itk::NumericTraits::max(),itk::NumericTraits::max(),itk::NumericTraits::max()}}; typename ImageType::SizeType uppersize = {{0,0,0}}; while( !itmask.IsAtEnd() ) { if(itmask.Get() == 0) itimage.Set(0); else { typename ImageType::IndexType index = itimage.GetIndex(); typename ImageType::SizeType signedindex; signedindex[0] = index[0]; signedindex[1] = index[1]; signedindex[2] = index[2]; lowersize[0] = signedindex[0] < lowersize[0] ? signedindex[0] : lowersize[0]; lowersize[1] = signedindex[1] < lowersize[1] ? signedindex[1] : lowersize[1]; lowersize[2] = signedindex[2] < lowersize[2] ? signedindex[2] : lowersize[2]; uppersize[0] = signedindex[0] > uppersize[0] ? signedindex[0] : uppersize[0]; uppersize[1] = signedindex[1] > uppersize[1] ? signedindex[1] : uppersize[1]; uppersize[2] = signedindex[2] > uppersize[2] ? signedindex[2] : uppersize[2]; } ++itmask; ++itimage; } typename ImageType::IndexType index; index[0] = lowersize[0]; index[1] = lowersize[1]; index[2] = lowersize[2]; typename ImageType::SizeType size; size[0] = uppersize[0] - lowersize[0] + 1; size[1] = uppersize[1] - lowersize[1] + 1; size[2] = uppersize[2] - lowersize[2] + 1; itk::ImageRegion<3> cropRegion = itk::ImageRegion<3>(index, size); // crop internal mask typedef itk::RegionOfInterestImageFilter< itkUCharImageType, itkUCharImageType > ROIMaskFilterType; typename ROIMaskFilterType::Pointer roi2 = ROIMaskFilterType::New(); roi2->SetRegionOfInterest(cropRegion); roi2->SetInput(m_InternalImageMask3D); roi2->Update(); m_InternalImageMask3D = roi2->GetOutput(); Image::Pointer tmpImage = Image::New(); tmpImage->InitializeByItk(m_InternalImageMask3D.GetPointer()); tmpImage->SetVolume(m_InternalImageMask3D->GetBufferPointer()); Image::Pointer tmpImage2 = Image::New(); tmpImage2->InitializeByItk(m_PlanarFigureImage.GetPointer()); const BaseGeometry *pfImageGeometry3D = tmpImage2->GetGeometry( 0 ); const BaseGeometry *intImageGeometry3D = tmpImage->GetGeometry( 0 ); typedef itk::ImageRegionIteratorWithIndex IteratorType; IteratorType imageIterator (m_InternalImageMask3D, m_InternalImageMask3D->GetRequestedRegion()); imageIterator.GoToBegin(); while ( !imageIterator.IsAtEnd() ) { unsigned char val = imageIterator.Value(); if (val>0) { itk::Index<3> index = imageIterator.GetIndex(); Point3D point; point[0] = index[0]; point[1] = index[1]; point[2] = index[2]; intImageGeometry3D->IndexToWorld(point, point); pfImageGeometry3D->WorldToIndex(point, point); point[i0] += 0.5; point[i1] += 0.5; index[0] = point[0]; index[1] = point[1]; index[2] = point[2]; if (pfImageGeometry3D->IsIndexInside(index)) m_PlanarFigureImage->SetPixel(index, 1); } ++imageIterator; } // Clean up VTK objects polyline->Delete(); extrudeFilter->Delete(); polyDataToImageStencil->Delete(); vtkImporter->Delete(); imageStencilFilter->Delete(); //vtkExporter->Delete(); // TODO: crashes when outcommented; memory leak?? delete[] ptIds; } -void QmitkFiberProcessingView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - -void QmitkFiberProcessingView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - void QmitkFiberProcessingView::UpdateGui() { m_Controls->m_FibLabel->setText("mandatory"); m_Controls->m_PfLabel->setText("needed for extraction"); m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->m_RemoveButton->setEnabled(false); m_Controls->m_PlanarFigureButtonsFrame->setEnabled(false); m_Controls->PFCompoANDButton->setEnabled(false); m_Controls->PFCompoORButton->setEnabled(false); m_Controls->PFCompoNOTButton->setEnabled(false); m_Controls->m_GenerateRoiImage->setEnabled(false); m_Controls->m_ExtractFibersButton->setEnabled(false); m_Controls->m_ModifyButton->setEnabled(false); m_Controls->m_CopyBundle->setEnabled(false); m_Controls->m_JoinBundles->setEnabled(false); m_Controls->m_SubstractBundles->setEnabled(false); // disable alle frames m_Controls->m_BundleWeightFrame->setVisible(false); m_Controls->m_ExtactionFramePF->setVisible(false); m_Controls->m_RemoveDirectionFrame->setVisible(false); m_Controls->m_RemoveLengthFrame->setVisible(false); m_Controls->m_RemoveCurvatureFrame->setVisible(false); m_Controls->m_SmoothFibersFrame->setVisible(false); m_Controls->m_CompressFibersFrame->setVisible(false); m_Controls->m_ColorFibersFrame->setVisible(false); m_Controls->m_MirrorFibersFrame->setVisible(false); m_Controls->m_MaskExtractionFrame->setVisible(false); bool pfSelected = !m_SelectedPF.empty(); bool fibSelected = !m_SelectedFB.empty(); bool multipleFibsSelected = (m_SelectedFB.size()>1); bool maskSelected = m_MaskImageNode.IsNotNull(); bool imageSelected = m_SelectedImage.IsNotNull(); // toggle visibility of elements according to selected method switch ( m_Controls->m_ExtractionMethodBox->currentIndex() ) { case 0: m_Controls->m_ExtactionFramePF->setVisible(true); break; case 1: m_Controls->m_MaskExtractionFrame->setVisible(true); break; } switch ( m_Controls->m_RemovalMethodBox->currentIndex() ) { case 0: m_Controls->m_RemoveDirectionFrame->setVisible(true); if ( fibSelected ) m_Controls->m_RemoveButton->setEnabled(true); break; case 1: m_Controls->m_RemoveLengthFrame->setVisible(true); if ( fibSelected ) m_Controls->m_RemoveButton->setEnabled(true); break; case 2: m_Controls->m_RemoveCurvatureFrame->setVisible(true); if ( fibSelected ) m_Controls->m_RemoveButton->setEnabled(true); break; case 3: break; case 4: break; } switch ( m_Controls->m_ModificationMethodBox->currentIndex() ) { case 0: m_Controls->m_SmoothFibersFrame->setVisible(true); break; case 1: m_Controls->m_SmoothFibersFrame->setVisible(true); break; case 2: m_Controls->m_CompressFibersFrame->setVisible(true); break; case 3: m_Controls->m_ColorFibersFrame->setVisible(true); break; case 4: m_Controls->m_MirrorFibersFrame->setVisible(true); if (m_SelectedSurfaces.size()>0) m_Controls->m_ModifyButton->setEnabled(true); break; case 5: m_Controls->m_BundleWeightFrame->setVisible(true); } // are fiber bundles selected? if ( fibSelected ) { m_Controls->m_CopyBundle->setEnabled(true); m_Controls->m_ModifyButton->setEnabled(true); m_Controls->m_PlanarFigureButtonsFrame->setEnabled(true); m_Controls->m_FibLabel->setText(QString(m_SelectedFB.at(0)->GetName().c_str())); // one bundle and one planar figure needed to extract fibers if (pfSelected && m_Controls->m_ExtractionMethodBox->currentIndex()==0) { m_Controls->m_InputData->setTitle("Input Data"); m_Controls->m_PfLabel->setText(QString(m_SelectedPF.at(0)->GetName().c_str())); m_Controls->m_ExtractFibersButton->setEnabled(true); } // more than two bundles needed to join/subtract if (multipleFibsSelected) { m_Controls->m_FibLabel->setText("multiple bundles selected"); m_Controls->m_JoinBundles->setEnabled(true); m_Controls->m_SubstractBundles->setEnabled(true); } if (maskSelected && m_Controls->m_ExtractionMethodBox->currentIndex()==1) { m_Controls->m_InputData->setTitle("Input Data"); m_Controls->m_PfLabel->setText(QString(m_MaskImageNode->GetName().c_str())); m_Controls->m_ExtractFibersButton->setEnabled(true); } if (maskSelected && (m_Controls->m_RemovalMethodBox->currentIndex()==3 || m_Controls->m_RemovalMethodBox->currentIndex()==4) ) { m_Controls->m_InputData->setTitle("Input Data"); m_Controls->m_PfLabel->setText(QString(m_MaskImageNode->GetName().c_str())); m_Controls->m_RemoveButton->setEnabled(true); } } // are planar figures selected? if (pfSelected) { if ( fibSelected || m_SelectedImage.IsNotNull()) m_Controls->m_GenerateRoiImage->setEnabled(true); if (m_SelectedPF.size() > 1) { m_Controls->PFCompoANDButton->setEnabled(true); m_Controls->PFCompoORButton->setEnabled(true); } else m_Controls->PFCompoNOTButton->setEnabled(true); } // is image selected if (imageSelected || maskSelected) { m_Controls->m_PlanarFigureButtonsFrame->setEnabled(true); } } void QmitkFiberProcessingView::NodeRemoved(const mitk::DataNode* node) { - std::vector nodes; - OnSelectionChanged(nodes); + berry::IWorkbenchPart::Pointer nullPart; + QList nodes; + OnSelectionChanged(nullPart, nodes); } void QmitkFiberProcessingView::NodeAdded(const mitk::DataNode* node) { - std::vector nodes; - OnSelectionChanged(nodes); + berry::IWorkbenchPart::Pointer nullPart; + QList nodes; + OnSelectionChanged(nullPart, nodes); } -void QmitkFiberProcessingView::OnSelectionChanged( std::vector nodes ) +void QmitkFiberProcessingView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { //reset existing Vectors containing FiberBundles and PlanarFigures from a previous selection m_SelectedFB.clear(); m_SelectedPF.clear(); m_SelectedSurfaces.clear(); m_SelectedImage = NULL; m_MaskImageNode = NULL; - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (auto node: nodes) { - mitk::DataNode::Pointer node = *it; if ( dynamic_cast(node->GetData()) ) m_SelectedFB.push_back(node); else if (dynamic_cast(node->GetData()) || dynamic_cast(node->GetData()) || dynamic_cast(node->GetData())) m_SelectedPF.push_back(node); else if (dynamic_cast(node->GetData())) { m_SelectedImage = dynamic_cast(node->GetData()); bool isBinary = false; node->GetPropertyValue("binary", isBinary); if (isBinary) m_MaskImageNode = node; } else if (dynamic_cast(node->GetData())) m_SelectedSurfaces.push_back(dynamic_cast(node->GetData())); } if (m_SelectedFB.empty() && m_SelectedSurfaces.empty()) { int maxLayer = 0; - itk::VectorContainer::ConstPointer nodes = this->GetDefaultDataStorage()->GetAll(); + itk::VectorContainer::ConstPointer nodes = this->GetDataStorage()->GetAll(); for (unsigned int i=0; iSize(); i++) if (dynamic_cast(nodes->at(i)->GetData())) { mitk::DataStorage::SetOfObjects::ConstPointer sources = GetDataStorage()->GetSources(nodes->at(i)); if (sources->Size()>0) continue; int layer = 0; nodes->at(i)->GetPropertyValue("layer", layer); if (layer>=maxLayer) { maxLayer = layer; m_SelectedFB.clear(); m_SelectedFB.push_back(nodes->at(i)); } } } if (m_SelectedPF.empty()) { int maxLayer = 0; - itk::VectorContainer::ConstPointer nodes = this->GetDefaultDataStorage()->GetAll(); + itk::VectorContainer::ConstPointer nodes = this->GetDataStorage()->GetAll(); for (unsigned int i=0; iSize(); i++) if (dynamic_cast(nodes->at(i)->GetData()) || dynamic_cast(nodes->at(i)->GetData()) || dynamic_cast(nodes->at(i)->GetData())) { mitk::DataStorage::SetOfObjects::ConstPointer sources = GetDataStorage()->GetSources(nodes->at(i)); if (sources->Size()>0) continue; int layer = 0; nodes->at(i)->GetPropertyValue("layer", layer); if (layer>=maxLayer) { maxLayer = layer; m_SelectedPF.clear(); m_SelectedPF.push_back(nodes->at(i)); } } } UpdateGui(); } void QmitkFiberProcessingView::OnDrawPolygon() { mitk::PlanarPolygon::Pointer figure = mitk::PlanarPolygon::New(); figure->ClosedOn(); this->AddFigureToDataStorage(figure, QString("Polygon%1").arg(++m_PolygonCounter)); } void QmitkFiberProcessingView::OnDrawCircle() { mitk::PlanarCircle::Pointer figure = mitk::PlanarCircle::New(); this->AddFigureToDataStorage(figure, QString("Circle%1").arg(++m_CircleCounter)); } -void QmitkFiberProcessingView::Activated() -{ - -} - void QmitkFiberProcessingView::AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name, const char *, mitk::BaseProperty* ) { // initialize figure's geometry with empty geometry mitk::PlaneGeometry::Pointer emptygeometry = mitk::PlaneGeometry::New(); figure->SetPlaneGeometry( emptygeometry ); //set desired data to DataNode where Planarfigure is stored mitk::DataNode::Pointer newNode = mitk::DataNode::New(); newNode->SetName(name.toStdString()); newNode->SetData(figure); newNode->SetBoolProperty("planarfigure.3drendering", true); newNode->SetBoolProperty("planarfigure.3drendering.fill", true); mitk::PlanarFigureInteractor::Pointer figureInteractor = dynamic_cast(newNode->GetDataInteractor().GetPointer()); if(figureInteractor.IsNull()) { figureInteractor = mitk::PlanarFigureInteractor::New(); us::Module* planarFigureModule = us::ModuleRegistry::GetModule( "MitkPlanarFigure" ); figureInteractor->LoadStateMachine("PlanarFigureInteraction.xml", planarFigureModule ); figureInteractor->SetEventConfig( "PlanarFigureConfig.xml", planarFigureModule ); figureInteractor->SetDataNode(newNode); } // figure drawn on the topmost layer / image GetDataStorage()->Add(newNode ); for(unsigned int i = 0; i < m_SelectedPF.size(); i++) m_SelectedPF[i]->SetSelected(false); newNode->SetSelected(true); m_SelectedPF.clear(); m_SelectedPF.push_back(newNode); UpdateGui(); } void QmitkFiberProcessingView::ExtractWithPlanarFigure() { if ( m_SelectedFB.empty() || m_SelectedPF.empty() ){ QMessageBox::information( NULL, "Warning", "No fibe bundle selected!"); return; } std::vector fiberBundles = m_SelectedFB; mitk::DataNode::Pointer planarFigure = m_SelectedPF.at(0); for (unsigned int i=0; i(fiberBundles.at(i)->GetData()); mitk::FiberBundle::Pointer extFB = fib->ExtractFiberSubset(planarFigure, GetDataStorage()); if (extFB->GetNumFibers()<=0) { QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers."); continue; } mitk::DataNode::Pointer node; node = mitk::DataNode::New(); node->SetData(extFB); QString name(fiberBundles.at(i)->GetName().c_str()); name += "*"; //name += planarFigure->GetName().c_str(); node->SetName(name.toStdString()); fiberBundles.at(i)->SetVisibility(false); GetDataStorage()->Add(node); } } void QmitkFiberProcessingView::GenerateAndComposite() { mitk::PlanarFigureComposite::Pointer PFCAnd = mitk::PlanarFigureComposite::New(); PFCAnd->setOperationType(mitk::PlanarFigureComposite::AND); mitk::DataNode::Pointer newPFCNode; newPFCNode = mitk::DataNode::New(); newPFCNode->SetName("AND"); newPFCNode->SetData(PFCAnd); AddCompositeToDatastorage(newPFCNode, m_SelectedPF); m_SelectedPF.clear(); m_SelectedPF.push_back(newPFCNode); UpdateGui(); } void QmitkFiberProcessingView::GenerateOrComposite() { mitk::PlanarFigureComposite::Pointer PFCOr = mitk::PlanarFigureComposite::New(); PFCOr->setOperationType(mitk::PlanarFigureComposite::OR); mitk::DataNode::Pointer newPFCNode; newPFCNode = mitk::DataNode::New(); newPFCNode->SetName("OR"); newPFCNode->SetData(PFCOr); AddCompositeToDatastorage(newPFCNode, m_SelectedPF); m_SelectedPF.clear(); m_SelectedPF.push_back(newPFCNode); UpdateGui(); } void QmitkFiberProcessingView::GenerateNotComposite() { mitk::PlanarFigureComposite::Pointer PFCNot = mitk::PlanarFigureComposite::New(); PFCNot->setOperationType(mitk::PlanarFigureComposite::NOT); mitk::DataNode::Pointer newPFCNode; newPFCNode = mitk::DataNode::New(); newPFCNode->SetName("NOT"); newPFCNode->SetData(PFCNot); AddCompositeToDatastorage(newPFCNode, m_SelectedPF); m_SelectedPF.clear(); m_SelectedPF.push_back(newPFCNode); UpdateGui(); } void QmitkFiberProcessingView::AddCompositeToDatastorage(mitk::DataNode::Pointer pfc, std::vector children, mitk::DataNode::Pointer parentNode ) { pfc->SetSelected(true); if (parentNode.IsNotNull()) GetDataStorage()->Add(pfc, parentNode); else GetDataStorage()->Add(pfc); for (auto child : children) { if (dynamic_cast(child->GetData())) { mitk::DataNode::Pointer newChild; newChild = mitk::DataNode::New(); newChild->SetData(dynamic_cast(child->GetData())); newChild->SetName( child->GetName() ); newChild->SetBoolProperty("planarfigure.3drendering", true); newChild->SetBoolProperty("planarfigure.3drendering.fill", true); GetDataStorage()->Add(newChild, pfc); GetDataStorage()->Remove(child); } else if (dynamic_cast(child->GetData())) { mitk::DataNode::Pointer newChild; newChild = mitk::DataNode::New(); newChild->SetData(dynamic_cast(child->GetData())); newChild->SetName( child->GetName() ); std::vector< mitk::DataNode::Pointer > grandChildVector; mitk::DataStorage::SetOfObjects::ConstPointer grandchildren = GetDataStorage()->GetDerivations(child); for( mitk::DataStorage::SetOfObjects::const_iterator it = grandchildren->begin(); it != grandchildren->end(); ++it ) grandChildVector.push_back(*it); AddCompositeToDatastorage(newChild, grandChildVector, pfc); GetDataStorage()->Remove(child); } } UpdateGui(); } void QmitkFiberProcessingView::CopyBundles() { if ( m_SelectedFB.empty() ){ QMessageBox::information( NULL, "Warning", "Select at least one fiber bundle!"); MITK_WARN("QmitkFiberProcessingView") << "Select at least one fiber bundle!"; return; } for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); mitk::FiberBundle::Pointer newFib = fib->GetDeepCopy(); node->SetVisibility(false); QString name(""); name += QString(m_SelectedFB.at(0)->GetName().c_str()); name += "_copy"; mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); fbNode->SetData(newFib); fbNode->SetName(name.toStdString()); fbNode->SetVisibility(true); GetDataStorage()->Add(fbNode); } UpdateGui(); } void QmitkFiberProcessingView::JoinBundles() { if ( m_SelectedFB.size()<2 ){ QMessageBox::information( NULL, "Warning", "Select at least two fiber bundles!"); MITK_WARN("QmitkFiberProcessingView") << "Select at least two fiber bundles!"; return; } mitk::FiberBundle::Pointer newBundle = dynamic_cast(m_SelectedFB.at(0)->GetData()); m_SelectedFB.at(0)->SetVisibility(false); QString name(""); name += QString(m_SelectedFB.at(0)->GetName().c_str()); for (unsigned int i=1; iAddBundle(dynamic_cast(m_SelectedFB.at(i)->GetData())); name += "+"+QString(m_SelectedFB.at(i)->GetName().c_str()); m_SelectedFB.at(i)->SetVisibility(false); } mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); fbNode->SetData(newBundle); fbNode->SetName(name.toStdString()); fbNode->SetVisibility(true); GetDataStorage()->Add(fbNode); UpdateGui(); } void QmitkFiberProcessingView::SubstractBundles() { if ( m_SelectedFB.size()<2 ){ QMessageBox::information( NULL, "Warning", "Select at least two fiber bundles!"); MITK_WARN("QmitkFiberProcessingView") << "Select at least two fiber bundles!"; return; } mitk::FiberBundle::Pointer newBundle = dynamic_cast(m_SelectedFB.at(0)->GetData()); m_SelectedFB.at(0)->SetVisibility(false); QString name(""); name += QString(m_SelectedFB.at(0)->GetName().c_str()); for (unsigned int i=1; iSubtractBundle(dynamic_cast(m_SelectedFB.at(i)->GetData())); if (newBundle.IsNull()) break; name += "-"+QString(m_SelectedFB.at(i)->GetName().c_str()); m_SelectedFB.at(i)->SetVisibility(false); } if (newBundle.IsNull()) { QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers. Did you select the fiber bundles in the correct order? X-Y is not equal to Y-X!"); return; } mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); fbNode->SetData(newBundle); fbNode->SetName(name.toStdString()); fbNode->SetVisibility(true); GetDataStorage()->Add(fbNode); UpdateGui(); } void QmitkFiberProcessingView::ResampleSelectedBundlesSpline() { double factor = this->m_Controls->m_SmoothFibersBox->value(); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); fib->ResampleSpline(factor); } RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberProcessingView::ResampleSelectedBundlesLinear() { double factor = this->m_Controls->m_SmoothFibersBox->value(); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); fib->ResampleLinear(factor); } RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberProcessingView::CompressSelectedBundles() { double factor = this->m_Controls->m_ErrorThresholdBox->value(); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); fib->Compress(factor); fib->ColorFibersByOrientation(); } RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkFiberProcessingView::DoImageColorCoding() { if (m_Controls->m_ColorMapBox->GetSelectedNode().IsNull()) { QMessageBox::information(NULL, "Bundle coloring aborted:", "No image providing the scalar values for coloring the selected bundle available."); return; } for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); fib->ColorFibersByScalarMap(dynamic_cast(m_Controls->m_ColorMapBox->GetSelectedNode()->GetData()), m_Controls->m_FiberOpacityBox->isChecked()); } - RenderingManager::GetInstance()->RequestUpdateAll(); + + if (auto renderWindowPart = this->GetRenderWindowPart()) + { + renderWindowPart->RequestUpdate(); + } } void QmitkFiberProcessingView::DoCurvatureColorCoding() { for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); fib->ColorFibersByCurvature(); } - RenderingManager::GetInstance()->RequestUpdateAll(); + + if (auto renderWindowPart = this->GetRenderWindowPart()) + { + renderWindowPart->RequestUpdate(); + } } void QmitkFiberProcessingView::MirrorFibers() { unsigned int axis = this->m_Controls->m_MirrorFibersBox->currentIndex(); for (auto node : m_SelectedFB) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); if (m_SelectedImage.IsNotNull()) fib->SetReferenceGeometry(m_SelectedImage->GetGeometry()); fib->MirrorFibers(axis); } for (auto surf : m_SelectedSurfaces) { vtkSmartPointer poly = surf->GetVtkPolyData(); vtkSmartPointer vtkNewPoints = vtkSmartPointer::New(); for (int i=0; iGetNumberOfPoints(); i++) { double* point = poly->GetPoint(i); point[axis] *= -1; vtkNewPoints->InsertNextPoint(point); } poly->SetPoints(vtkNewPoints); surf->CalculateBoundingBox(); } - RenderingManager::GetInstance()->RequestUpdateAll(); + if (auto renderWindowPart = this->GetRenderWindowPart()) + { + renderWindowPart->RequestUpdate(); + } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.h index 3c3d8b4c65..4fb630aa02 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberProcessingView.h @@ -1,193 +1,190 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkFiberProcessingView_h #define QmitkFiberProcessingView_h -#include +#include #include "ui_QmitkFiberProcessingViewControls.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*! \brief View to process fiber bundles. Supplies methods to extract fibers from the bundle, fiber resampling, mirroring, join and subtract bundles and much more. - -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkFiberProcessingView : public QmitkFunctionality +class QmitkFiberProcessingView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: typedef itk::Image< unsigned char, 3 > itkUCharImageType; static const std::string VIEW_ID; QmitkFiberProcessingView(); virtual ~QmitkFiberProcessingView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; - virtual void Activated() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void OnDrawCircle(); ///< add circle interactors etc. void OnDrawPolygon(); ///< add circle interactors etc. void GenerateAndComposite(); void GenerateOrComposite(); void GenerateNotComposite(); void CopyBundles(); ///< add copies of selected bundles to data storage void JoinBundles(); ///< merge selected fiber bundles void SubstractBundles(); ///< subtract bundle A from bundle B. Not commutative! Defined by order of selection. void GenerateRoiImage(); ///< generate binary image of selected planar figures. void Remove(); void Extract(); void Modify(); void UpdateGui(); ///< update button activity etc. dpending on current datamanager selection void OnMaskExtractionChanged(); virtual void AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name, const char *propertyKey = NULL, mitk::BaseProperty *property = NULL ); protected: void MirrorFibers(); ///< mirror bundle on the specified plane void ResampleSelectedBundlesSpline(); ///< void ResampleSelectedBundlesLinear(); ///< void DoImageColorCoding(); ///< color fibers by selected scalar image void DoCurvatureColorCoding(); ///< color fibers by curvature void CompressSelectedBundles(); ///< remove points below certain error threshold void WeightFibers(); void RemoveWithMask(bool removeInside); void RemoveDir(); void ApplyCurvatureThreshold(); ///< remove/split fibers with a too high curvature threshold void PruneBundle(); ///< remove too short/too long fibers void ExtractWithMask(bool onlyEnds, bool invert); void ExtractWithPlanarFigure(); - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkFiberProcessingViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; /** Connection from VTK to ITK */ template void ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer) { importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback()); importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback()); importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback()); importer->SetSpacingCallback(exporter->GetSpacingCallback()); importer->SetOriginCallback(exporter->GetOriginCallback()); importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback()); importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback()); importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback()); importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback()); importer->SetDataExtentCallback(exporter->GetDataExtentCallback()); importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback()); importer->SetCallbackUserData(exporter->GetCallbackUserData()); } template void ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer) { importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback()); importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback()); importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback()); importer->SetSpacingCallback(exporter->GetSpacingCallback()); importer->SetOriginCallback(exporter->GetOriginCallback()); importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback()); importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback()); importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback()); importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback()); importer->SetDataExtentCallback(exporter->GetDataExtentCallback()); importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback()); importer->SetCallbackUserData(exporter->GetCallbackUserData()); } template < typename TPixel, unsigned int VImageDimension > void InternalCalculateMaskFromPlanarFigure( itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName ); template < typename TPixel, unsigned int VImageDimension > void InternalReorientImagePlane( const itk::Image< TPixel, VImageDimension > *image, mitk::BaseGeometry* planegeo3D, int additionalIndex ); int m_CircleCounter; ///< used for data node naming int m_PolygonCounter; ///< used for data node naming std::vector m_SelectedFB; ///< selected fiber bundle nodes std::vector m_SelectedPF; ///< selected planar figure nodes std::vector m_SelectedSurfaces; mitk::Image::Pointer m_SelectedImage; mitk::Image::Pointer m_InternalImage; mitk::PlanarFigure::Pointer m_PlanarFigure; itkUCharImageType::Pointer m_InternalImageMask3D; itkUCharImageType::Pointer m_PlanarFigureImage; float m_UpsamplingFactor; ///< upsampling factor for all image generations mitk::DataNode::Pointer m_MaskImageNode; void AddCompositeToDatastorage(mitk::DataNode::Pointer pfc, std::vector children, mitk::DataNode::Pointer parentNode=NULL); void debugPFComposition(mitk::PlanarFigureComposite::Pointer , int ); void WritePfToImage(mitk::DataNode::Pointer node, mitk::Image* image); mitk::DataNode::Pointer GenerateTractDensityImage(mitk::FiberBundle::Pointer fib, bool binary, bool absolute); mitk::DataNode::Pointer GenerateColorHeatmap(mitk::FiberBundle::Pointer fib); mitk::DataNode::Pointer GenerateFiberEndingsImage(mitk::FiberBundle::Pointer fib); mitk::DataNode::Pointer GenerateFiberEndingsPointSet(mitk::FiberBundle::Pointer fib); void NodeAdded( const mitk::DataNode* node ) override; void NodeRemoved(const mitk::DataNode* node) override; }; #endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.cpp index 58bd85c7d4..99f301b6ed 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.cpp @@ -1,491 +1,477 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkFiberQuantificationView.h" -#include // Qt #include // MITK #include #include #include #include #include #include #include #include #include #include // ITK #include #include #include #include #include #include #include #include #include #include const std::string QmitkFiberQuantificationView::VIEW_ID = "org.mitk.views.fiberquantification"; const std::string id_DataManager = "org.mitk.views.datamanager"; using namespace mitk; QmitkFiberQuantificationView::QmitkFiberQuantificationView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) , m_UpsamplingFactor(5) { } // Destructor QmitkFiberQuantificationView::~QmitkFiberQuantificationView() { } void QmitkFiberQuantificationView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkFiberQuantificationViewControls; m_Controls->setupUi( parent ); connect( m_Controls->m_ProcessFiberBundleButton, SIGNAL(clicked()), this, SLOT(ProcessSelectedBundles()) ); connect( m_Controls->m_ExtractFiberPeaks, SIGNAL(clicked()), this, SLOT(CalculateFiberDirections()) ); } } -void QmitkFiberQuantificationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkFiberQuantificationView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkFiberQuantificationView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->m_ProcessFiberBundleButton->setFocus(); } void QmitkFiberQuantificationView::CalculateFiberDirections() { typedef itk::Image ItkUcharImgType; typedef itk::Image< itk::Vector< float, 3>, 3 > ItkDirectionImage3DType; typedef itk::VectorContainer< unsigned int, ItkDirectionImage3DType::Pointer > ItkDirectionImageContainerType; // load fiber bundle mitk::FiberBundle::Pointer inputTractogram = dynamic_cast(m_SelectedFB.back()->GetData()); itk::TractsToVectorImageFilter::Pointer fOdfFilter = itk::TractsToVectorImageFilter::New(); if (m_SelectedImage.IsNotNull()) { ItkUcharImgType::Pointer itkMaskImage = ItkUcharImgType::New(); mitk::CastToItkImage(m_SelectedImage, itkMaskImage); fOdfFilter->SetMaskImage(itkMaskImage); } // extract directions from fiber bundle fOdfFilter->SetFiberBundle(inputTractogram); fOdfFilter->SetAngularThreshold(cos(m_Controls->m_AngularThreshold->value()*M_PI/180)); fOdfFilter->SetNormalizeVectors(m_Controls->m_NormalizeDirectionsBox->isChecked()); fOdfFilter->SetUseWorkingCopy(true); fOdfFilter->SetCreateDirectionImages(m_Controls->m_DirectionImagesBox->isChecked()); fOdfFilter->SetSizeThreshold(m_Controls->m_PeakThreshold->value()); fOdfFilter->SetMaxNumDirections(m_Controls->m_MaxNumDirections->value()); fOdfFilter->Update(); QString name = m_SelectedFB.back()->GetName().c_str(); if (m_Controls->m_VectorFieldBox->isChecked()) { float minSpacing = 1; if (m_SelectedImage.IsNotNull()) { mitk::Vector3D outImageSpacing = m_SelectedImage->GetGeometry()->GetSpacing(); if(outImageSpacing[0]GetOutputFiberBundle(); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(directions); node->SetName((name+"_VECTOR_FIELD").toStdString().c_str()); node->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(minSpacing)); node->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(false)); node->SetProperty("color", mitk::ColorProperty::New(1.0f, 1.0f, 1.0f)); - GetDefaultDataStorage()->Add(node, m_SelectedFB.back()); + GetDataStorage()->Add(node, m_SelectedFB.back()); } if (m_Controls->m_NumDirectionsBox->isChecked()) { mitk::Image::Pointer mitkImage = mitk::Image::New(); mitkImage->InitializeByItk( fOdfFilter->GetNumDirectionsImage().GetPointer() ); mitkImage->SetVolume( fOdfFilter->GetNumDirectionsImage()->GetBufferPointer() ); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(mitkImage); node->SetName((name+"_NUM_DIRECTIONS").toStdString().c_str()); GetDefaultDataStorage()->Add(node, m_SelectedFB.back()); } if (m_Controls->m_DirectionImagesBox->isChecked()) { itk::TractsToVectorImageFilter::ItkDirectionImageType::Pointer itkImg = fOdfFilter->GetDirectionImage(); if (itkImg.IsNull()) return; mitk::Image::Pointer mitkImage = mitk::Image::New(); mitkImage->InitializeByItk( itkImg.GetPointer() ); mitkImage->SetVolume( itkImg->GetBufferPointer() ); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(mitkImage); node->SetName( (name+"_DIRECTIONS").toStdString().c_str()); GetDefaultDataStorage()->Add(node, m_SelectedFB.back()); } } void QmitkFiberQuantificationView::UpdateGui() { m_Controls->m_ProcessFiberBundleButton->setEnabled(!m_SelectedFB.empty()); m_Controls->m_ExtractFiberPeaks->setEnabled(!m_SelectedFB.empty()); } -void QmitkFiberQuantificationView::OnSelectionChanged( std::vector nodes ) +void QmitkFiberQuantificationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { //reset existing Vectors containing FiberBundles and PlanarFigures from a previous selection m_SelectedFB.clear(); m_SelectedSurfaces.clear(); m_SelectedImage = NULL; - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; if ( dynamic_cast(node->GetData()) ) { m_SelectedFB.push_back(node); } else if (dynamic_cast(node->GetData())) m_SelectedImage = dynamic_cast(node->GetData()); else if (dynamic_cast(node->GetData())) { m_SelectedSurfaces.push_back(dynamic_cast(node->GetData())); } } UpdateGui(); GenerateStats(); } -void QmitkFiberQuantificationView::Activated() -{ - -} - void QmitkFiberQuantificationView::GenerateStats() { if ( m_SelectedFB.empty() ) return; QString stats(""); for( int i=0; i(node->GetData())) { if (i>0) stats += "\n-----------------------------\n"; stats += QString(node->GetName().c_str()) + "\n"; mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); stats += "Number of fibers: "+ QString::number(fib->GetNumFibers()) + "\n"; stats += "Number of points: "+ QString::number(fib->GetNumberOfPoints()) + "\n"; stats += "Min. length: "+ QString::number(fib->GetMinFiberLength(),'f',1) + " mm\n"; stats += "Max. length: "+ QString::number(fib->GetMaxFiberLength(),'f',1) + " mm\n"; stats += "Mean length: "+ QString::number(fib->GetMeanFiberLength(),'f',1) + " mm\n"; stats += "Median length: "+ QString::number(fib->GetMedianFiberLength(),'f',1) + " mm\n"; stats += "Standard deviation: "+ QString::number(fib->GetLengthStDev(),'f',1) + " mm\n"; vtkSmartPointer weights = fib->GetFiberWeights(); if (weights!=NULL) { stats += "Detected fiber weights\n"; // stats += "Detected fiber weights:\n"; // float weight=-1; // int c = 0; // for (int i=0; iGetSize(); i++) // if (!mitk::Equal(weights->GetValue(i),weight,0.00001)) // { // c++; // if (weight>0) // stats += QString::number(i) + ": "+ QString::number(weights->GetValue(i)) + "\n"; // stats += QString::number(c) + ". Fibers " + QString::number(i+1) + "-"; // weight = weights->GetValue(i); // } // stats += QString::number(weights->GetSize()) + ": "+ QString::number(weight) + "\n"; } else stats += "No fiber weight array found.\n"; } } this->m_Controls->m_StatsTextEdit->setText(stats); } void QmitkFiberQuantificationView::ProcessSelectedBundles() { if ( m_SelectedFB.empty() ){ QMessageBox::information( NULL, "Warning", "No fibe bundle selected!"); MITK_WARN("QmitkFiberQuantificationView") << "no fibe bundle selected"; return; } int generationMethod = m_Controls->m_GenerationBox->currentIndex(); for( int i=0; i(node->GetData())) { mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); QString name(node->GetName().c_str()); DataNode::Pointer newNode = NULL; switch(generationMethod){ case 0: newNode = GenerateTractDensityImage(fib, false, true); name += "_TDI"; break; case 1: newNode = GenerateTractDensityImage(fib, false, false); name += "_TDI"; break; case 2: newNode = GenerateTractDensityImage(fib, true, false); name += "_envelope"; break; case 3: newNode = GenerateColorHeatmap(fib); break; case 4: newNode = GenerateFiberEndingsImage(fib); name += "_fiber_endings"; break; case 5: newNode = GenerateFiberEndingsPointSet(fib); name += "_fiber_endings"; break; } if (newNode.IsNotNull()) { newNode->SetName(name.toStdString()); GetDataStorage()->Add(newNode); } } } } // generate pointset displaying the fiber endings mitk::DataNode::Pointer QmitkFiberQuantificationView::GenerateFiberEndingsPointSet(mitk::FiberBundle::Pointer fib) { mitk::PointSet::Pointer pointSet = mitk::PointSet::New(); vtkSmartPointer fiberPolyData = fib->GetFiberPolyData(); vtkSmartPointer vLines = fiberPolyData->GetLines(); vLines->InitTraversal(); int count = 0; int numFibers = fib->GetNumFibers(); for( int i=0; iGetNextCell ( numPoints, points ); if (numPoints>0) { double* point = fiberPolyData->GetPoint(points[0]); itk::Point itkPoint; itkPoint[0] = point[0]; itkPoint[1] = point[1]; itkPoint[2] = point[2]; pointSet->InsertPoint(count, itkPoint); count++; } if (numPoints>2) { double* point = fiberPolyData->GetPoint(points[numPoints-1]); itk::Point itkPoint; itkPoint[0] = point[0]; itkPoint[1] = point[1]; itkPoint[2] = point[2]; pointSet->InsertPoint(count, itkPoint); count++; } } mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( pointSet ); return node; } // generate image displaying the fiber endings mitk::DataNode::Pointer QmitkFiberQuantificationView::GenerateFiberEndingsImage(mitk::FiberBundle::Pointer fib) { typedef unsigned char OutPixType; typedef itk::Image OutImageType; typedef itk::TractsToFiberEndingsImageFilter< OutImageType > ImageGeneratorType; ImageGeneratorType::Pointer generator = ImageGeneratorType::New(); generator->SetFiberBundle(fib); generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value()); if (m_SelectedImage.IsNotNull()) { OutImageType::Pointer itkImage = OutImageType::New(); CastToItkImage(m_SelectedImage, itkImage); generator->SetInputImage(itkImage); generator->SetUseImageGeometry(true); } generator->Update(); // get output image OutImageType::Pointer outImg = generator->GetOutput(); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk(outImg.GetPointer()); img->SetVolume(outImg->GetBufferPointer()); // init data node mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(img); return node; } // generate rgba heatmap from fiber bundle mitk::DataNode::Pointer QmitkFiberQuantificationView::GenerateColorHeatmap(mitk::FiberBundle::Pointer fib) { typedef itk::RGBAPixel OutPixType; typedef itk::Image OutImageType; typedef itk::TractsToRgbaImageFilter< OutImageType > ImageGeneratorType; ImageGeneratorType::Pointer generator = ImageGeneratorType::New(); generator->SetFiberBundle(fib); generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value()); if (m_SelectedImage.IsNotNull()) { itk::Image::Pointer itkImage = itk::Image::New(); CastToItkImage(m_SelectedImage, itkImage); generator->SetInputImage(itkImage); generator->SetUseImageGeometry(true); } generator->Update(); // get output image typedef itk::Image OutType; OutType::Pointer outImg = generator->GetOutput(); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk(outImg.GetPointer()); img->SetVolume(outImg->GetBufferPointer()); // init data node mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(img); return node; } // generate tract density image from fiber bundle mitk::DataNode::Pointer QmitkFiberQuantificationView::GenerateTractDensityImage(mitk::FiberBundle::Pointer fib, bool binary, bool absolute) { mitk::DataNode::Pointer node = mitk::DataNode::New(); if (binary) { typedef unsigned char OutPixType; typedef itk::Image OutImageType; itk::TractDensityImageFilter< OutImageType >::Pointer generator = itk::TractDensityImageFilter< OutImageType >::New(); generator->SetFiberBundle(fib); generator->SetBinaryOutput(binary); generator->SetOutputAbsoluteValues(absolute); generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value()); if (m_SelectedImage.IsNotNull()) { OutImageType::Pointer itkImage = OutImageType::New(); CastToItkImage(m_SelectedImage, itkImage); generator->SetInputImage(itkImage); generator->SetUseImageGeometry(true); } generator->Update(); // get output image typedef itk::Image OutType; OutType::Pointer outImg = generator->GetOutput(); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk(outImg.GetPointer()); img->SetVolume(outImg->GetBufferPointer()); // init data node node->SetData(img); } else { typedef float OutPixType; typedef itk::Image OutImageType; itk::TractDensityImageFilter< OutImageType >::Pointer generator = itk::TractDensityImageFilter< OutImageType >::New(); generator->SetFiberBundle(fib); generator->SetBinaryOutput(binary); generator->SetOutputAbsoluteValues(absolute); generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value()); if (m_SelectedImage.IsNotNull()) { OutImageType::Pointer itkImage = OutImageType::New(); CastToItkImage(m_SelectedImage, itkImage); generator->SetInputImage(itkImage); generator->SetUseImageGeometry(true); } //generator->SetDoFiberResampling(false); generator->Update(); // get output image typedef itk::Image OutType; OutType::Pointer outImg = generator->GetOutput(); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk(outImg.GetPointer()); img->SetVolume(outImg->GetBufferPointer()); // init data node node->SetData(img); } return node; } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.h index 1e2144ebdc..017a341f32 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkFiberQuantificationView.h @@ -1,150 +1,148 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkFiberQuantificationView_h #define QmitkFiberQuantificationView_h -#include +#include #include "ui_QmitkFiberQuantificationViewControls.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*! \brief Generation of images from fiber bundles (TDI, envelopes, endpoint distribution) and extraction of principal fiber directions from tractograms. -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkFiberQuantificationView : public QmitkFunctionality +class QmitkFiberQuantificationView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: typedef itk::Image< unsigned char, 3 > itkUCharImageType; static const std::string VIEW_ID; QmitkFiberQuantificationView(); virtual ~QmitkFiberQuantificationView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; - virtual void Activated() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void ProcessSelectedBundles(); ///< start selected operation on fiber bundle (e.g. tract density image generation) void CalculateFiberDirections(); ///< Calculate main fiber directions from tractogram protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkFiberQuantificationViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; /** Connection from VTK to ITK */ template void ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer) { importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback()); importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback()); importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback()); importer->SetSpacingCallback(exporter->GetSpacingCallback()); importer->SetOriginCallback(exporter->GetOriginCallback()); importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback()); importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback()); importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback()); importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback()); importer->SetDataExtentCallback(exporter->GetDataExtentCallback()); importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback()); importer->SetCallbackUserData(exporter->GetCallbackUserData()); } template void ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer) { importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback()); importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback()); importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback()); importer->SetSpacingCallback(exporter->GetSpacingCallback()); importer->SetOriginCallback(exporter->GetOriginCallback()); importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback()); importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback()); importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback()); importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback()); importer->SetDataExtentCallback(exporter->GetDataExtentCallback()); importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback()); importer->SetCallbackUserData(exporter->GetCallbackUserData()); } template < typename TPixel, unsigned int VImageDimension > void InternalCalculateMaskFromPlanarFigure( itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName ); template < typename TPixel, unsigned int VImageDimension > void InternalReorientImagePlane( const itk::Image< TPixel, VImageDimension > *image, mitk::Geometry3D* planegeo3D, int additionalIndex ); void GenerateStats(); ///< generate statistics of selected fiber bundles void UpdateGui(); ///< update button activity etc. dpending on current datamanager selection std::vector m_SelectedFB; ///< selected fiber bundle nodes mitk::Image::Pointer m_SelectedImage; float m_UpsamplingFactor; ///< upsampling factor for all image generations std::vector m_SelectedSurfaces; mitk::DataNode::Pointer GenerateTractDensityImage(mitk::FiberBundle::Pointer fib, bool binary, bool absolute); mitk::DataNode::Pointer GenerateColorHeatmap(mitk::FiberBundle::Pointer fib); mitk::DataNode::Pointer GenerateFiberEndingsImage(mitk::FiberBundle::Pointer fib); mitk::DataNode::Pointer GenerateFiberEndingsPointSet(mitk::FiberBundle::Pointer fib); }; #endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.cpp index 0872515184..09dfb8bde3 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.cpp @@ -1,1008 +1,1016 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkIVIMView.h" -#include "QmitkStdMultiWidget.h" // qt #include "qmessagebox.h" #include "qclipboard.h" // mitk #include "mitkImage.h" #include "mitkImageCast.h" #include "mitkLookupTable.h" #include "mitkLookupTableProperty.h" +#include +#include // itk #include "itkScalarImageToHistogramGenerator.h" #include "itkRegionOfInterestImageFilter.h" #include "itkImageRegionConstIteratorWithIndex.h" // itk/mitk #include "itkDiffusionIntravoxelIncoherentMotionReconstructionImageFilter.h" #include "itkRegularizedIVIMReconstructionFilter.h" #include "mitkImageCast.h" const std::string QmitkIVIMView::VIEW_ID = "org.mitk.views.ivim"; QmitkIVIMView::QmitkIVIMView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) , m_SliceObserverTag1(0), m_SliceObserverTag2(0), m_SliceObserverTag3(0) , m_DiffusionImageNode(NULL) , m_MaskImageNode(NULL) , m_Active(false) + , m_Visible(false) , m_HoldUpdate(false) { } QmitkIVIMView::~QmitkIVIMView() { } void QmitkIVIMView::CreateQtPartControl( QWidget *parent ) { // hold update untill all elements are set this->m_HoldUpdate = true; // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkIVIMViewControls; m_Controls->setupUi( parent ); connect( m_Controls->m_ButtonStart, SIGNAL(clicked()), this, SLOT(FittIVIMStart()) ); connect( m_Controls->m_ButtonAutoThres, SIGNAL(clicked()), this, SLOT(AutoThreshold()) ); connect( m_Controls->m_MethodCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(MethodCombo(int)) ); connect( m_Controls->m_DStarSlider, SIGNAL(valueChanged(int)), this, SLOT(DStarSlider(int)) ); connect( m_Controls->m_BThreshSlider, SIGNAL(valueChanged(int)), this, SLOT(BThreshSlider(int)) ); connect( m_Controls->m_S0ThreshSlider, SIGNAL(valueChanged(int)), this, SLOT(S0ThreshSlider(int)) ); connect( m_Controls->m_NumItSlider, SIGNAL(valueChanged(int)), this, SLOT(NumItsSlider(int)) ); connect( m_Controls->m_LambdaSlider, SIGNAL(valueChanged(int)), this, SLOT(LambdaSlider(int)) ); connect( m_Controls->m_CheckDStar, SIGNAL(clicked()), this, SLOT(Checkbox()) ); connect( m_Controls->m_CheckD, SIGNAL(clicked()), this, SLOT(Checkbox()) ); connect( m_Controls->m_Checkf, SIGNAL(clicked()), this, SLOT(Checkbox()) ); connect( m_Controls->m_ChooseMethod, SIGNAL(clicked()), this, SLOT(ChooseMethod()) ); connect( m_Controls->m_CurveClipboard, SIGNAL(clicked()), this, SLOT(ClipboardCurveButtonClicked()) ); connect( m_Controls->m_ValuesClipboard, SIGNAL(clicked()), this, SLOT(ClipboardStatisticsButtonClicked()) ); // connect all kurtosis actions to a recompute connect( m_Controls->m_KurtosisRangeWidget, SIGNAL( rangeChanged(double, double)), this, SLOT(OnKurtosisParamsChanged() ) ); //connect( m_Controls->m_MaximalBValueWidget, SIGNAL( valueChanged(double)), this, SLOT( OnKurtosisParamsChanged() ) ); connect( m_Controls->m_OmitBZeroCB, SIGNAL( stateChanged(int) ), this, SLOT( OnKurtosisParamsChanged() ) ); connect( m_Controls->m_KurtosisFitScale, SIGNAL( currentIndexChanged(int)), this, SLOT( OnKurtosisParamsChanged() ) ); connect( m_Controls->m_UseKurtosisBoundsCB, SIGNAL(clicked() ), this, SLOT( OnKurtosisParamsChanged() ) ); } QString dstar = QString::number(m_Controls->m_DStarSlider->value()/1000.0); m_Controls->m_DStarLabel->setText(dstar); QString bthresh = QString::number(m_Controls->m_BThreshSlider->value()*5.0); m_Controls->m_BThreshLabel->setText(bthresh); QString s0thresh = QString::number(m_Controls->m_S0ThreshSlider->value()*0.5); m_Controls->m_S0ThreshLabel->setText(s0thresh); QString numits = QString::number(m_Controls->m_NumItSlider->value()); m_Controls->m_NumItsLabel->setText(numits); QString lambda = QString::number(m_Controls->m_LambdaSlider->value()*.00001); m_Controls->m_LambdaLabel->setText(lambda); m_Controls->m_MethodCombo->setVisible(m_Controls->m_ChooseMethod->isChecked()); m_Controls->m_Warning->setVisible(false); MethodCombo(m_Controls->m_MethodCombo->currentIndex()); m_Controls->m_KurtosisRangeWidget->setSingleStep(0.1); m_Controls->m_KurtosisRangeWidget->setRange( 0.0, 10.0 ); m_Controls->m_KurtosisRangeWidget->setMaximumValue( 5.0 ); // LogScale not working yet, have to fix that first // m_Controls->m_KurtosisFitScale->setEnabled(false); //m_Controls->m_MaximalBValueWidget->setVisible( false ); // release update block after the UI-elements were all set this->m_HoldUpdate = false; } +void QmitkIVIMView::SetFocus() +{ + m_Controls->m_ButtonAutoThres->setFocus(); +} + void QmitkIVIMView::Checkbox() { itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::MethodCombo(int val) { switch(val) { case 0: m_Controls->m_DstarFrame->setVisible(false); m_Controls->m_NeglSiFrame->setVisible(true); m_Controls->m_NeglBframe->setVisible(false); m_Controls->m_IterationsFrame->setVisible(false); m_Controls->m_LambdaFrame->setVisible(false); break; case 1: m_Controls->m_DstarFrame->setVisible(true); m_Controls->m_NeglSiFrame->setVisible(true); m_Controls->m_NeglBframe->setVisible(false); m_Controls->m_IterationsFrame->setVisible(false); m_Controls->m_LambdaFrame->setVisible(false); break; case 2: m_Controls->m_DstarFrame->setVisible(false); m_Controls->m_NeglSiFrame->setVisible(true); m_Controls->m_NeglBframe->setVisible(true); m_Controls->m_IterationsFrame->setVisible(false); m_Controls->m_LambdaFrame->setVisible(false); break; case 3: m_Controls->m_DstarFrame->setVisible(false); m_Controls->m_NeglSiFrame->setVisible(true); m_Controls->m_NeglBframe->setVisible(true); m_Controls->m_IterationsFrame->setVisible(false); m_Controls->m_LambdaFrame->setVisible(false); break; case 4: m_Controls->m_DstarFrame->setVisible(false); m_Controls->m_NeglSiFrame->setVisible(false); m_Controls->m_NeglBframe->setVisible(false); m_Controls->m_IterationsFrame->setVisible(false); m_Controls->m_LambdaFrame->setVisible(false); break; } itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::DStarSlider (int val) { QString sval = QString::number(val/1000.0); m_Controls->m_DStarLabel->setText(sval); itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::BThreshSlider (int val) { QString sval = QString::number(val*5.0); m_Controls->m_BThreshLabel->setText(sval); itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::S0ThreshSlider (int val) { QString sval = QString::number(val*0.5); m_Controls->m_S0ThreshLabel->setText(sval); itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::NumItsSlider (int val) { QString sval = QString::number(val); m_Controls->m_NumItsLabel->setText(sval); itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::LambdaSlider (int val) { QString sval = QString::number(val*.00001); m_Controls->m_LambdaLabel->setText(sval); itk::StartEvent dummy; OnSliceChanged(dummy); } -void QmitkIVIMView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkIVIMView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { - m_MultiWidget = &stdMultiWidget; - { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget1->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkIVIMView::OnSliceChanged ); m_SliceObserverTag1 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget2->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkIVIMView::OnSliceChanged ); m_SliceObserverTag2 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget3->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkIVIMView::OnSliceChanged ); m_SliceObserverTag3 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } - } -void QmitkIVIMView::StdMultiWidgetNotAvailable() +void QmitkIVIMView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) { - { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget1->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController(); slicer->RemoveObserver( m_SliceObserverTag1 ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget2->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController(); slicer->RemoveObserver( m_SliceObserverTag2 ); } { - mitk::SliceNavigationController* slicer = m_MultiWidget->mitkWidget3->GetSliceNavigationController(); + mitk::SliceNavigationController* slicer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController(); slicer->RemoveObserver( m_SliceObserverTag3 ); } - - m_MultiWidget = NULL; } -void QmitkIVIMView::OnSelectionChanged( std::vector nodes ) +void QmitkIVIMView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { bool foundOneDiffusionImage = false; m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->m_DiffusionImageLabel->setText("mandatory"); m_Controls->m_MaskImageLabel->setText("optional"); m_MaskImageNode = NULL; m_DiffusionImageNode = NULL; // iterate all selected objects, adjust warning visibility - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (auto node: nodes) { - mitk::DataNode::Pointer node = *it; - if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())) ); if( isDiffusionImage ) { m_DiffusionImageNode = node; foundOneDiffusionImage = true; m_Controls->m_DiffusionImageLabel->setText(node->GetName().c_str()); } else { bool isBinary = false; node->GetPropertyValue("binary", isBinary); if (isBinary) { m_MaskImageNode = node; m_Controls->m_MaskImageLabel->setText(node->GetName().c_str()); } } } } if (m_DiffusionImageNode.IsNotNull()) { m_Controls->m_VisualizeResultsWidget->setVisible(true); m_Controls->m_KurtosisVisualizationWidget->setVisible(true); m_Controls->m_InputData->setTitle("Input Data"); m_HoldUpdate = false; } else { m_Controls->m_VisualizeResultsWidget->setVisible(false); m_Controls->m_KurtosisVisualizationWidget->setVisible(false); m_Controls->m_DiffusionImageLabel->setText("mandatory"); } m_Controls->m_ButtonStart->setEnabled( foundOneDiffusionImage ); m_Controls->m_ButtonAutoThres->setEnabled( foundOneDiffusionImage ); m_Controls->m_ControlsFrame->setEnabled( foundOneDiffusionImage ); m_Controls->m_BottomControlsFrame->setEnabled( foundOneDiffusionImage ); itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::AutoThreshold() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); if (nodes.empty()) return; if (!nodes.front()) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, "Template", "Please load and select a diffusion image before starting image processing."); return; } mitk::Image* dimg = dynamic_cast(nodes.front()->GetData()); if (!dimg) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, "Template", "No valid diffusion image was found."); return; } // find bzero index int index = -1; DirContainerType::Pointer directions = static_cast( dimg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(); for(DirContainerType::ConstIterator it = directions->Begin(); it != directions->End(); ++it) { index++; GradientDirectionType g = it.Value(); if(g[0] == 0 && g[1] == 0 && g[2] == 0 ) break; } VecImgType::Pointer vecimg = VecImgType::New(); mitk::CastToItkImage(dimg, vecimg); int vecLength = vecimg->GetVectorLength(); index = index > vecLength-1 ? vecLength-1 : index; MITK_INFO << "Performing Histogram Analysis on Channel" << index; typedef itk::Image ImgType; ImgType::Pointer img = ImgType::New(); mitk::CastToItkImage(dimg, img); itk::ImageRegionIterator itw (img, img->GetLargestPossibleRegion() ); itw.GoToBegin(); itk::ImageRegionConstIterator itr (vecimg, vecimg->GetLargestPossibleRegion() ); itr.GoToBegin(); while(!itr.IsAtEnd()) { itw.Set(itr.Get().GetElement(index)); ++itr; ++itw; } typedef itk::Statistics::ScalarImageToHistogramGenerator< ImgType > HistogramGeneratorType; typedef HistogramGeneratorType::HistogramType HistogramType; HistogramGeneratorType::Pointer histogramGenerator = HistogramGeneratorType::New(); histogramGenerator->SetInput( img ); histogramGenerator->SetMarginalScale( 10 ); // Defines y-margin width of histogram histogramGenerator->SetNumberOfBins( 100 ); // CT range [-1024, +2048] --> bin size 4 values histogramGenerator->SetHistogramMin( dimg->GetScalarValueMin() ); histogramGenerator->SetHistogramMax( dimg->GetScalarValueMax() * .5 ); histogramGenerator->Compute(); HistogramType::ConstIterator iter = histogramGenerator->GetOutput()->Begin(); float maxFreq = 0; float maxValue = 0; while ( iter != histogramGenerator->GetOutput()->End() ) { if(iter.GetFrequency() > maxFreq) { maxFreq = iter.GetFrequency(); maxValue = iter.GetMeasurementVector()[0]; } ++iter; } maxValue *= 2; int sliderPos = maxValue * 2; m_Controls->m_S0ThreshSlider->setValue(sliderPos); S0ThreshSlider(sliderPos); } void QmitkIVIMView::FittIVIMStart() { - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); mitk::Image* img = 0; for ( unsigned int i=0; i(nodes.at(i)->GetData()); bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(nodes.at(i)->GetData())) ); if (img && isDiffusionImage) break; } if (!img) { QMessageBox::information( NULL, "Template", "No valid diffusion image was found."); return; } VecImgType::Pointer vecimg = VecImgType::New(); mitk::CastToItkImage(img, vecimg); OutImgType::IndexType dummy; if( m_Controls->m_ModelTabSelectionWidget->currentIndex() ) { // KURTOSIS KurtosisFilterType::Pointer filter = KurtosisFilterType::New(); filter->SetInput(vecimg); filter->SetReferenceBValue( static_cast(img->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ); filter->SetGradientDirections( static_cast( img->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer() ); filter->SetSmoothingSigma( this->m_Controls->m_SigmaSpinBox->value() ); if( this->m_Controls->m_UseKurtosisBoundsCB->isChecked() ) filter->SetBoundariesForKurtosis( this->m_Controls->m_KurtosisRangeWidget->minimumValue(), this->m_Controls->m_KurtosisRangeWidget->maximumValue() ); filter->SetFittingScale( static_cast(this->m_Controls->m_KurtosisFitScale->currentIndex() ) ); if( m_MaskImageNode.IsNotNull() ) { mitk::Image::Pointer maskImg = dynamic_cast(m_MaskImageNode->GetData()); typedef itk::Image MaskImgType; MaskImgType::Pointer maskItk; CastToItkImage( maskImg, maskItk ); filter->SetImageMask( maskItk ); } filter->Update(); mitk::LookupTable::Pointer kurt_map_lut = mitk::LookupTable::New(); kurt_map_lut->SetType( mitk::LookupTable::JET_TRANSPARENT ); mitk::LookupTableProperty::Pointer kurt_lut_prop = mitk::LookupTableProperty::New(); kurt_lut_prop->SetLookupTable( kurt_map_lut ); mitk::Image::Pointer dimage = mitk::Image::New(); dimage->InitializeByItk( filter->GetOutput(0) ); dimage->SetVolume( filter->GetOutput(0)->GetBufferPointer()); mitk::Image::Pointer kimage = mitk::Image::New(); kimage->InitializeByItk( filter->GetOutput(1) ); kimage->SetVolume( filter->GetOutput(1)->GetBufferPointer()); QString basename(nodes.front()->GetName().c_str()); QString new_dname = basename; new_dname = new_dname.append("KurtFit_DMap"); QString new_kname = basename; new_kname = new_kname.append("KurtFit_KMap"); if( this->m_Controls->m_CheckKurtD->isChecked() ) { mitk::DataNode::Pointer dnode = mitk::DataNode::New(); dnode->SetData( dimage ); dnode->SetName(new_dname.toLatin1()); dnode->SetProperty("LookupTable", kurt_lut_prop ); - GetDefaultDataStorage()->Add(dnode); + GetDataStorage()->Add(dnode); } if( this->m_Controls->m_CheckKurtK->isChecked() ) { mitk::DataNode::Pointer knode = mitk::DataNode::New(); knode->SetData( kimage ); knode->SetName(new_kname.toLatin1()); knode->SetProperty("LookupTable", kurt_lut_prop ); - GetDefaultDataStorage()->Add(knode); + GetDataStorage()->Add(knode); } } else { FittIVIM(vecimg, static_cast( img->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), static_cast(img->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue(), true, dummy); OutputToDatastorage(nodes); } } void QmitkIVIMView::OnKurtosisParamsChanged() { itk::StartEvent dummy; OnSliceChanged(dummy); } void QmitkIVIMView::OnSliceChanged(const itk::EventObject& /*e*/) { if(!m_Visible) return; if(m_HoldUpdate) return; m_Controls->m_Warning->setVisible(false); if(!m_Controls || m_DiffusionImageNode.IsNull()) return; m_Controls->m_VisualizeResultsWidget->setVisible(false); m_Controls->m_KurtosisVisualizationWidget->setVisible(false); mitk::Image::Pointer diffusionImg = dynamic_cast(m_DiffusionImageNode->GetData()); mitk::Image::Pointer maskImg = NULL; if (m_MaskImageNode.IsNotNull()) maskImg = dynamic_cast(m_MaskImageNode->GetData()); - if (!m_MultiWidget) return; + if (!this->GetRenderWindowPart()) return; VecImgType::Pointer vecimg = VecImgType::New(); mitk::CastToItkImage(diffusionImg, vecimg); VecImgType::Pointer roiImage = VecImgType::New(); bool success = false; if(maskImg.IsNull()) { int roisize = 0; if(m_Controls->m_MethodCombo->currentIndex() == 4) roisize = 5; - mitk::Point3D pos = m_MultiWidget->GetCrossPosition(); + mitk::Point3D pos = this->GetRenderWindowPart()->GetSelectedPosition(); VecImgType::IndexType crosspos; diffusionImg->GetGeometry()->WorldToIndex(pos, crosspos); if (!vecimg->GetLargestPossibleRegion().IsInside(crosspos)) { m_Controls->m_Warning->setText(QString("Crosshair position not inside of selected diffusion weighted image. Reinit needed!")); m_Controls->m_Warning->setVisible(true); return; } else m_Controls->m_Warning->setVisible(false); VecImgType::IndexType index; index[0] = crosspos[0] - roisize; index[0] = index[0] < 0 ? 0 : index[0]; index[1] = crosspos[1] - roisize; index[1] = index[1] < 0 ? 0 : index[1]; index[2] = crosspos[2] - roisize; index[2] = index[2] < 0 ? 0 : index[2]; VecImgType::SizeType size; size[0] = roisize*2+1; size[1] = roisize*2+1; size[2] = roisize*2+1; VecImgType::SizeType maxSize = vecimg->GetLargestPossibleRegion().GetSize(); size[0] = index[0]+size[0] > maxSize[0] ? maxSize[0]-index[0] : size[0]; size[1] = index[1]+size[1] > maxSize[1] ? maxSize[1]-index[1] : size[1]; size[2] = index[2]+size[2] > maxSize[2] ? maxSize[2]-index[2] : size[2]; VecImgType::RegionType region; region.SetSize( size ); region.SetIndex( index ); vecimg->SetRequestedRegion( region ); VecImgType::IndexType newstart; newstart.Fill(0); VecImgType::RegionType newregion; newregion.SetSize( size ); newregion.SetIndex( newstart ); roiImage->CopyInformation( vecimg ); roiImage->SetRegions( newregion ); roiImage->SetOrigin( pos ); roiImage->Allocate(); roiImage->SetPixel(newstart, vecimg->GetPixel(index)); if( m_Controls->m_ModelTabSelectionWidget->currentIndex() ) { success = FitKurtosis(roiImage, static_cast( diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), static_cast(diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue(), newstart); } else { success = FittIVIM(roiImage, static_cast( diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), static_cast(diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue(), false, crosspos); } } else { typedef itk::Image MaskImgType; MaskImgType::Pointer maskItk; CastToItkImage( maskImg, maskItk ); mitk::Point3D pos; pos[0] = 0; pos[1] = 0; pos[2] = 0; VecImgType::IndexType index; index[0] = 0; index[1] = 0; index[2] = 0; VecImgType::SizeType size; size[0] = 1; size[1] = 1; size[2] = 1; VecImgType::RegionType region; region.SetSize( size ); region.SetIndex( index ); vecimg->SetRequestedRegion( region ); // iterators over output and input itk::ImageRegionConstIteratorWithIndex vecit(vecimg, vecimg->GetLargestPossibleRegion()); itk::VariableLengthVector avg(vecimg->GetVectorLength()); avg.Fill(0); float numPixels = 0; while ( ! vecit.IsAtEnd() ) { VecImgType::PointType point; vecimg->TransformIndexToPhysicalPoint(vecit.GetIndex(), point); MaskImgType::IndexType index; maskItk->TransformPhysicalPointToIndex(point, index); if(maskItk->GetPixel(index) != 0) { avg += vecit.Get(); numPixels += 1.0; } // update iterators ++vecit; } avg /= numPixels; m_Controls->m_Warning->setText(QString("Averaging ")+QString::number((int)numPixels)+QString(" voxels!")); m_Controls->m_Warning->setVisible(true); roiImage->CopyInformation( vecimg ); roiImage->SetRegions( region ); roiImage->SetOrigin( pos ); roiImage->Allocate(); roiImage->SetPixel(index, avg); if( m_Controls->m_ModelTabSelectionWidget->currentIndex() ) { success = FitKurtosis(roiImage, static_cast( diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), static_cast(diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue(), index); } else { success = FittIVIM(roiImage, static_cast( diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), static_cast(diffusionImg->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue(), false, index); } // do not update until selection changed, the values will remain the same as long as the mask is selected! m_HoldUpdate = true; } vecimg->SetRegions( vecimg->GetLargestPossibleRegion() ); if (success) { // 0 - IVIM, 1 - Kurtosis if( m_Controls->m_ModelTabSelectionWidget->currentIndex() ) { m_Controls->m_KurtosisVisualizationWidget->setVisible(true); m_Controls->m_KurtosisVisualizationWidget->SetData(m_KurtosisSnap); } else { m_Controls->m_VisualizeResultsWidget->setVisible(true); m_Controls->m_VisualizeResultsWidget->SetParameters(m_Snap); } } } bool QmitkIVIMView::FitKurtosis( itk::VectorImage *vecimg, DirContainerType *dirs, float bval, OutImgType::IndexType &crosspos ) { KurtosisFilterType::Pointer filter = KurtosisFilterType::New(); itk::KurtosisFitConfiguration fit_config; fit_config.omit_bzero = this->m_Controls->m_OmitBZeroCB->isChecked(); if( this->m_Controls->m_UseKurtosisBoundsCB->isChecked() ) { fit_config.use_K_limits = true; vnl_vector_fixed k_limits; k_limits[0] = this->m_Controls->m_KurtosisRangeWidget->minimumValue(); k_limits[1] = this->m_Controls->m_KurtosisRangeWidget->maximumValue(); fit_config.K_limits = k_limits; } fit_config.fit_scale = static_cast(this->m_Controls->m_KurtosisFitScale->currentIndex() ); m_KurtosisSnap = filter->GetSnapshot( vecimg->GetPixel( crosspos ), dirs, bval, fit_config ); return true; } bool QmitkIVIMView::FittIVIM(itk::VectorImage* vecimg, DirContainerType* dirs, float bval, bool multivoxel, OutImgType::IndexType &crosspos) { IVIMFilterType::Pointer filter = IVIMFilterType::New(); filter->SetInput(vecimg); filter->SetGradientDirections(dirs); filter->SetBValue(bval); switch(m_Controls->m_MethodCombo->currentIndex()) { case 0: filter->SetMethod(IVIMFilterType::IVIM_FIT_ALL); filter->SetS0Thres(m_Controls->m_S0ThreshLabel->text().toDouble()); break; case 1: filter->SetMethod(IVIMFilterType::IVIM_DSTAR_FIX); filter->SetDStar(m_Controls->m_DStarLabel->text().toDouble()); filter->SetS0Thres(m_Controls->m_S0ThreshLabel->text().toDouble()); break; case 2: filter->SetMethod(IVIMFilterType::IVIM_D_THEN_DSTAR); filter->SetBThres(m_Controls->m_BThreshLabel->text().toDouble()); filter->SetS0Thres(m_Controls->m_S0ThreshLabel->text().toDouble()); filter->SetFitDStar(m_Controls->m_CheckDStar->isChecked()); break; case 3: filter->SetMethod(IVIMFilterType::IVIM_LINEAR_D_THEN_F); filter->SetBThres(m_Controls->m_BThreshLabel->text().toDouble()); filter->SetS0Thres(m_Controls->m_S0ThreshLabel->text().toDouble()); filter->SetFitDStar(m_Controls->m_CheckDStar->isChecked()); break; case 4: filter->SetMethod(IVIMFilterType::IVIM_REGULARIZED); filter->SetBThres(m_Controls->m_BThreshLabel->text().toDouble()); filter->SetS0Thres(m_Controls->m_S0ThreshLabel->text().toDouble()); filter->SetNumberIterations(m_Controls->m_NumItsLabel->text().toInt()); filter->SetLambda(m_Controls->m_LambdaLabel->text().toDouble()); filter->SetFitDStar(m_Controls->m_CheckDStar->isChecked()); break; } if(!multivoxel) { filter->SetFitDStar(true); } filter->SetNumberOfThreads(1); filter->SetVerbose(false); filter->SetCrossPosition(crosspos); try{ filter->Update(); m_Snap = filter->GetSnapshot(); m_DStarMap = filter->GetOutput(2); m_DMap = filter->GetOutput(1); m_fMap = filter->GetOutput(); } catch (itk::ExceptionObject &ex) { MITK_INFO << ex ; m_Controls->m_Warning->setText(QString("IVIM fit not possible: ")+ex.GetDescription()); m_Controls->m_Warning->setVisible(true); return false; } return true; } -void QmitkIVIMView::OutputToDatastorage(std::vector nodes) +void QmitkIVIMView::OutputToDatastorage(const QList& nodes) { // Outputs to Datastorage QString basename(nodes.front()->GetName().c_str()); if(m_Controls->m_CheckDStar->isChecked()) { mitk::Image::Pointer dstarimage = mitk::Image::New(); dstarimage->InitializeByItk(m_DStarMap.GetPointer()); dstarimage->SetVolume(m_DStarMap->GetBufferPointer()); QString newname2 = basename; newname2 = newname2.append("_DStarMap_%1").arg(m_Controls->m_MethodCombo->currentText()); mitk::DataNode::Pointer node2=mitk::DataNode::New(); node2->SetData( dstarimage ); node2->SetName(newname2.toLatin1()); - GetDefaultDataStorage()->Add(node2); + GetDataStorage()->Add(node2); } if(m_Controls->m_CheckD->isChecked()) { mitk::Image::Pointer dimage = mitk::Image::New(); dimage->InitializeByItk(m_DMap.GetPointer()); dimage->SetVolume(m_DMap->GetBufferPointer()); QString newname1 = basename; newname1 = newname1.append("_DMap_%1").arg(m_Controls->m_MethodCombo->currentText()); mitk::DataNode::Pointer node1=mitk::DataNode::New(); node1->SetData( dimage ); node1->SetName(newname1.toLatin1()); - GetDefaultDataStorage()->Add(node1); + GetDataStorage()->Add(node1); } if(m_Controls->m_Checkf->isChecked()) { mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk(m_fMap.GetPointer()); image->SetVolume(m_fMap->GetBufferPointer()); QString newname0 = basename; newname0 = newname0.append("_fMap_%1").arg(m_Controls->m_MethodCombo->currentText()); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); node->SetName(newname0.toLatin1()); - GetDefaultDataStorage()->Add(node); + GetDataStorage()->Add(node); } - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); // reset the data node labels, the selection in DataManager is lost after adding // a new node -> we cannot directly proceed twice, the DWI ( and MASK) image have to be selected again m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->m_DiffusionImageLabel->setText("mandatory"); m_Controls->m_MaskImageLabel->setText("optional"); m_MaskImageNode = NULL; m_DiffusionImageNode = NULL; } void QmitkIVIMView::ChooseMethod() { m_Controls->m_MethodCombo->setVisible(m_Controls->m_ChooseMethod->isChecked()); } void QmitkIVIMView::ClipboardCurveButtonClicked() { // Kurtosis if ( m_Controls->m_ModelTabSelectionWidget->currentIndex() ) { std::stringstream ss; QString clipboard("Measurement Points\n"); ss << m_KurtosisSnap.bvalues << "\n" << m_KurtosisSnap.measurements << "\n\n"; ss << "Fitted Values ( D K [b_0] ) \n" << m_KurtosisSnap.m_D << " " << m_KurtosisSnap.m_K; if( m_KurtosisSnap.m_fittedBZero ) ss << " " << m_KurtosisSnap.m_BzeroFit; ss << "\n\n"; clipboard.append( QString( ss.str().c_str() )); ss.str( std::string() ); ss.clear(); QApplication::clipboard()->setText( clipboard, QClipboard::Clipboard ); } else { QString clipboard("Measurement Points\n"); for ( unsigned int i=0; isetText( clipboard, QClipboard::Clipboard ); } } void QmitkIVIMView::ClipboardStatisticsButtonClicked() { // Kurtosis if ( m_Controls->m_ModelTabSelectionWidget->currentIndex() ) { QString clipboard( "D \t K \n" ); clipboard = clipboard.append( "%L1 \t %L2" ) .arg( m_KurtosisSnap.m_D, 0, 'f', 10 ) .arg( m_KurtosisSnap.m_K, 0, 'f', 10 ) ; QApplication::clipboard()->setText( clipboard, QClipboard::Clipboard ); } else { QString clipboard( "f \t D \t D* \n" ); clipboard = clipboard.append( "%L1 \t %L2 \t %L3" ) .arg( m_Snap.currentF, 0, 'f', 10 ) .arg( m_Snap.currentD, 0, 'f', 10 ) .arg( m_Snap.currentDStar, 0, 'f', 10 ) ; QApplication::clipboard()->setText( clipboard, QClipboard::Clipboard ); } } void QmitkIVIMView::Activated() { m_Active = true; } void QmitkIVIMView::Deactivated() { m_Active = false; } + +void QmitkIVIMView::Visible() +{ + m_Visible = true; +} + +void QmitkIVIMView::Hidden() +{ + m_Visible = false; +} diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.h index 0f147d7c43..acaa7086e1 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.ivim/src/internal/QmitkIVIMView.h @@ -1,127 +1,133 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKIVIMVIEW_H_INCLUDED #define _QMITKIVIMVIEW_H_INCLUDED #include -#include +#include +#include +#include #include "ui_QmitkIVIMViewControls.h" #include "itkVectorImage.h" #include "itkImage.h" #include #include "itkDiffusionIntravoxelIncoherentMotionReconstructionImageFilter.h" #include "itkDiffusionKurtosisReconstructionImageFilter.h" /*! \brief QmitkIVIMView \warning This application module is not yet documented. Use "svn blame/praise/annotate" and ask the author to provide basic documentation. - - \sa QmitkFunctionality - \ingroup Functionalities */ -class QmitkIVIMView : public QmitkFunctionality +class QmitkIVIMView : public QmitkAbstractView, public mitk::ILifecycleAwarePart, public mitk::IRenderWindowPartListener { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkIVIMView(); virtual ~QmitkIVIMView(); typedef mitk::DiffusionPropertyHelper::GradientDirectionType GradientDirectionType; typedef mitk::DiffusionPropertyHelper::GradientDirectionsContainerType DirContainerType; typedef itk::DiffusionIntravoxelIncoherentMotionReconstructionImageFilter IVIMFilterType; typedef itk::DiffusionKurtosisReconstructionImageFilter KurtosisFilterType; typedef itk::VectorImage VecImgType; typedef itk::Image OutImgType; virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + + virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; + virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; void OnSliceChanged(const itk::EventObject& e); - void OutputToDatastorage(std::vector nodes); + void OutputToDatastorage(const QList& nodes); bool FittIVIM(itk::VectorImage* vecimg, DirContainerType* dirs, float bval, bool multivoxel, OutImgType::IndexType &crosspos); void Activated() override; void Deactivated() override; + void Visible() override; + void Hidden() override; protected slots: /// \brief Called when the user clicks the GUI button void FittIVIMStart(); void AutoThreshold(); void MethodCombo(int val); void Checkbox(); void DStarSlider(int val); void BThreshSlider(int val); void S0ThreshSlider(int val); void NumItsSlider(int val); void LambdaSlider(int val); void ChooseMethod(); void ClipboardStatisticsButtonClicked(); void ClipboardCurveButtonClicked(); void OnKurtosisParamsChanged(); protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; bool FitKurtosis( itk::VectorImage *vecimg, DirContainerType *dirs, float bval, OutImgType::IndexType &crosspos); Ui::QmitkIVIMViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; int m_SliceObserverTag1; int m_SliceObserverTag2; int m_SliceObserverTag3; OutImgType::Pointer m_DStarMap; OutImgType::Pointer m_DMap; OutImgType::Pointer m_fMap; IVIMFilterType::IVIMSnapshot m_Snap; KurtosisFilterType::KurtosisSnapshot m_KurtosisSnap; mitk::DataNode::Pointer m_DiffusionImageNode; mitk::DataNode::Pointer m_MaskImageNode; bool m_Active; + bool m_Visible; bool m_HoldUpdate; }; #endif // _QMITKIVIMVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.cpp index fd626123a1..6486b057b9 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.cpp @@ -1,658 +1,771 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //misc #define _USE_MATH_DEFINES #include #include // Blueberry #include #include // Qmitk #include "QmitkOdfMaximaExtractionView.h" // MITK #include #include #include #include #include // ITK #include #include #include #include #include #include #include // Qt #include const std::string QmitkOdfMaximaExtractionView::VIEW_ID = "org.mitk.views.odfmaximaextractionview"; using namespace mitk; QmitkOdfMaximaExtractionView::QmitkOdfMaximaExtractionView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) { } // Destructor QmitkOdfMaximaExtractionView::~QmitkOdfMaximaExtractionView() { } void QmitkOdfMaximaExtractionView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkOdfMaximaExtractionViewControls; m_Controls->setupUi( parent ); connect((QObject*) m_Controls->m_StartTensor, SIGNAL(clicked()), (QObject*) this, SLOT(StartTensor())); connect((QObject*) m_Controls->m_StartFiniteDiff, SIGNAL(clicked()), (QObject*) this, SLOT(StartFiniteDiff())); connect((QObject*) m_Controls->m_ImportPeaks, SIGNAL(clicked()), (QObject*) this, SLOT(ConvertPeaks())); connect((QObject*) m_Controls->m_ImportShCoeffs, SIGNAL(clicked()), (QObject*) this, SLOT(ConvertShCoeffs())); } } +void QmitkOdfMaximaExtractionView::SetFocus() +{ + m_Controls->m_GenerateImageButton->setFocus(); +} + void QmitkOdfMaximaExtractionView::UpdateGui() { m_Controls->m_StartFiniteDiff->setEnabled(false); m_Controls->m_StartTensor->setEnabled(false); m_Controls->m_CoeffImageFrame->setEnabled(false); if (!m_ImageNodes.empty() || !m_TensorImageNodes.empty()) { m_Controls->m_InputData->setTitle("Input Data"); if (!m_TensorImageNodes.empty()) { m_Controls->m_DwiFibLabel->setText(m_TensorImageNodes.front()->GetName().c_str()); m_Controls->m_StartTensor->setEnabled(true); } else { m_Controls->m_DwiFibLabel->setText(m_ImageNodes.front()->GetName().c_str()); m_Controls->m_StartFiniteDiff->setEnabled(true); m_Controls->m_CoeffImageFrame->setEnabled(true); m_Controls->m_ShOrderBox->setEnabled(true); m_Controls->m_MaxNumPeaksBox->setEnabled(true); m_Controls->m_PeakThresholdBox->setEnabled(true); m_Controls->m_AbsoluteThresholdBox->setEnabled(true); } } else m_Controls->m_DwiFibLabel->setText("mandatory"); if (m_ImageNodes.empty()) { m_Controls->m_ImportPeaks->setEnabled(false); m_Controls->m_ImportShCoeffs->setEnabled(false); } else { m_Controls->m_ImportPeaks->setEnabled(true); m_Controls->m_ImportShCoeffs->setEnabled(true); } if (!m_BinaryImageNodes.empty()) { m_Controls->m_MaskLabel->setText(m_BinaryImageNodes.front()->GetName().c_str()); } else { m_Controls->m_MaskLabel->setText("optional"); } } template void QmitkOdfMaximaExtractionView::TemplatedConvertShCoeffs(mitk::Image* mitkImg) { typedef itk::ShCoefficientImageImporter< float, shOrder > FilterType; typedef mitk::ImageToItk< itk::Image< float, 4 > > CasterType; CasterType::Pointer caster = CasterType::New(); caster->SetInput(mitkImg); caster->Update(); typename FilterType::Pointer filter = FilterType::New(); switch (m_Controls->m_ToolkitBox->currentIndex()) { case 0: filter->SetToolkit(FilterType::FSL); break; case 1: filter->SetToolkit(FilterType::MRTRIX); break; default: filter->SetToolkit(FilterType::FSL); } filter->SetInputImage(caster->GetOutput()); filter->GenerateData(); typename FilterType::QballImageType::Pointer itkQbi = filter->GetQballImage(); typename FilterType::CoefficientImageType::Pointer itkCi = filter->GetCoefficientImage(); { mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk( itkCi.GetPointer() ); img->SetVolume( itkCi->GetBufferPointer() ); DataNode::Pointer node = DataNode::New(); node->SetData(img); node->SetName("_ShCoefficientImage"); node->SetVisibility(false); GetDataStorage()->Add(node); } { mitk::QBallImage::Pointer img = mitk::QBallImage::New(); img->InitializeByItk( itkQbi.GetPointer() ); img->SetVolume( itkQbi->GetBufferPointer() ); DataNode::Pointer node = DataNode::New(); node->SetData(img); node->SetName("_QballImage"); GetDataStorage()->Add(node); } } void QmitkOdfMaximaExtractionView::ConvertShCoeffs() { if (m_ImageNodes.empty()) return; mitk::Image::Pointer mitkImg = dynamic_cast(m_ImageNodes.at(0)->GetData()); if (mitkImg->GetDimension()!=4) { MITK_INFO << "wrong image type (need 4 dimensions)"; return; } int nrCoeffs = mitkImg->GetLargestPossibleRegion().GetSize()[3]; // solve bx² + cx + d = 0 = shOrder² + 2*shOrder + 2-2*neededCoeffs; int c=3, d=2-2*nrCoeffs; double D = c*c-4*d; int shOrder; if (D>0) { shOrder = (-c+sqrt(D))/2.0; if (shOrder<0) shOrder = (-c-sqrt(D))/2.0; } else if (D==0) shOrder = -c/2.0; MITK_INFO << "using SH-order " << shOrder; switch (shOrder) { case 2: TemplatedConvertShCoeffs<2>(mitkImg); break; case 4: TemplatedConvertShCoeffs<4>(mitkImg); break; case 6: TemplatedConvertShCoeffs<6>(mitkImg); break; case 8: TemplatedConvertShCoeffs<8>(mitkImg); break; case 10: TemplatedConvertShCoeffs<10>(mitkImg); break; case 12: TemplatedConvertShCoeffs<12>(mitkImg); break; default: MITK_INFO << "SH-order " << shOrder << " not supported"; } } void QmitkOdfMaximaExtractionView::ConvertPeaks() { if (m_ImageNodes.empty()) return; switch (m_Controls->m_ToolkitBox->currentIndex()) { case 0: { typedef itk::Image< float, 4 > ItkImageType; typedef itk::FslPeakImageConverter< float > FilterType; FilterType::Pointer filter = FilterType::New(); FilterType::InputType::Pointer inputVec = FilterType::InputType::New(); mitk::BaseGeometry::Pointer geom; for (int i=0; i(m_ImageNodes.at(i)->GetData()); geom = mitkImg->GetGeometry(); typedef mitk::ImageToItk< FilterType::InputImageType > CasterType; CasterType::Pointer caster = CasterType::New(); caster->SetInput(mitkImg); caster->Update(); FilterType::InputImageType::Pointer itkImg = caster->GetOutput(); inputVec->InsertElement(inputVec->Size(), itkImg); } filter->SetInputImages(inputVec); filter->SetInvertX(m_Controls->m_InvertX->isChecked()); filter->SetInvertY(m_Controls->m_InvertY->isChecked()); filter->SetInvertZ(m_Controls->m_InvertZ->isChecked()); filter->GenerateData(); mitk::Vector3D outImageSpacing = geom->GetSpacing(); float maxSpacing = 1; if(outImageSpacing[0]>outImageSpacing[1] && outImageSpacing[0]>outImageSpacing[2]) maxSpacing = outImageSpacing[0]; else if (outImageSpacing[1] > outImageSpacing[2]) maxSpacing = outImageSpacing[1]; else maxSpacing = outImageSpacing[2]; mitk::FiberBundle::Pointer directions = filter->GetOutputFiberBundle(); // directions->SetGeometry(geom); DataNode::Pointer node = DataNode::New(); node->SetData(directions); node->SetName("_VectorField"); node->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(maxSpacing)); node->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(false)); GetDataStorage()->Add(node); typedef FilterType::DirectionImageContainerType DirectionImageContainerType; DirectionImageContainerType::Pointer container = filter->GetDirectionImageContainer(); for (int i=0; iSize(); i++) { ItkDirectionImage3DType::Pointer itkImg = container->GetElement(i); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk( itkImg.GetPointer() ); img->SetVolume( itkImg->GetBufferPointer() ); DataNode::Pointer node = DataNode::New(); node->SetData(img); QString name(m_ImageNodes.at(i)->GetName().c_str()); name += "_Direction"; name += QString::number(i+1); node->SetName(name.toStdString().c_str()); node->SetVisibility(false); GetDataStorage()->Add(node); } break; } case 1: { typedef itk::Image< float, 4 > ItkImageType; typedef itk::MrtrixPeakImageConverter< float > FilterType; FilterType::Pointer filter = FilterType::New(); // cast to itk mitk::Image::Pointer mitkImg = dynamic_cast(m_ImageNodes.at(0)->GetData()); mitk::BaseGeometry::Pointer geom = mitkImg->GetGeometry(); typedef mitk::ImageToItk< FilterType::InputImageType > CasterType; CasterType::Pointer caster = CasterType::New(); caster->SetInput(mitkImg); caster->Update(); FilterType::InputImageType::Pointer itkImg = caster->GetOutput(); filter->SetInputImage(itkImg); filter->SetInvertX(m_Controls->m_InvertX->isChecked()); filter->SetInvertY(m_Controls->m_InvertY->isChecked()); filter->SetInvertZ(m_Controls->m_InvertZ->isChecked()); filter->GenerateData(); mitk::Vector3D outImageSpacing = geom->GetSpacing(); float maxSpacing = 1; if(outImageSpacing[0]>outImageSpacing[1] && outImageSpacing[0]>outImageSpacing[2]) maxSpacing = outImageSpacing[0]; else if (outImageSpacing[1] > outImageSpacing[2]) maxSpacing = outImageSpacing[1]; else maxSpacing = outImageSpacing[2]; mitk::FiberBundle::Pointer directions = filter->GetOutputFiberBundle(); //directions->SetGeometry(geom); DataNode::Pointer node = DataNode::New(); node->SetData(directions); QString name(m_ImageNodes.at(0)->GetName().c_str()); name += "_VectorField"; node->SetName(name.toStdString().c_str()); node->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(maxSpacing)); node->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(false)); GetDataStorage()->Add(node); { ItkUcharImgType::Pointer numDirImage = filter->GetNumDirectionsImage(); mitk::Image::Pointer image2 = mitk::Image::New(); image2->InitializeByItk( numDirImage.GetPointer() ); image2->SetVolume( numDirImage->GetBufferPointer() ); DataNode::Pointer node2 = DataNode::New(); node2->SetData(image2); QString name(m_ImageNodes.at(0)->GetName().c_str()); name += "_NumDirections"; node2->SetName(name.toStdString().c_str()); GetDataStorage()->Add(node2); } typedef FilterType::DirectionImageContainerType DirectionImageContainerType; DirectionImageContainerType::Pointer container = filter->GetDirectionImageContainer(); for (int i=0; iSize(); i++) { ItkDirectionImage3DType::Pointer itkImg = container->GetElement(i); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk( itkImg.GetPointer() ); img->SetVolume( itkImg->GetBufferPointer() ); DataNode::Pointer node = DataNode::New(); node->SetData(img); QString name(m_ImageNodes.at(0)->GetName().c_str()); name += "_Direction"; name += QString::number(i+1); node->SetName(name.toStdString().c_str()); node->SetVisibility(false); GetDataStorage()->Add(node); } break; } } } void QmitkOdfMaximaExtractionView::StartTensor() { if (m_TensorImageNodes.empty()) return; typedef itk::DiffusionTensorPrincipalDirectionImageFilter< float, float > MaximaExtractionFilterType; MaximaExtractionFilterType::Pointer filter = MaximaExtractionFilterType::New(); mitk::BaseGeometry::Pointer geometry; try{ TensorImage::Pointer img = dynamic_cast(m_TensorImageNodes.at(0)->GetData()); ItkTensorImage::Pointer itkImage = ItkTensorImage::New(); CastToItkImage(img, itkImage); filter->SetInput(itkImage); geometry = img->GetGeometry(); } catch(itk::ExceptionObject &e) { MITK_INFO << "wrong image type: " << e.what(); QMessageBox::warning( NULL, "Wrong pixel type", "Could not perform Tensor Principal Direction Extraction due to Image has wrong pixel type.", QMessageBox::Ok ); return; //throw e; } if (!m_BinaryImageNodes.empty()) { ItkUcharImgType::Pointer itkMaskImage = ItkUcharImgType::New(); Image::Pointer mitkMaskImg = dynamic_cast(m_BinaryImageNodes.at(0)->GetData()); CastToItkImage(mitkMaskImg, itkMaskImage); filter->SetMaskImage(itkMaskImage); } if (m_Controls->m_NormalizationBox->currentIndex()==0) filter->SetNormalizeVectors(false); filter->Update(); if (m_Controls->m_OutputDirectionImagesBox->isChecked()) { MaximaExtractionFilterType::OutputImageType::Pointer itkImg = filter->GetOutput(); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk( itkImg.GetPointer() ); img->SetVolume( itkImg->GetBufferPointer() ); DataNode::Pointer node = DataNode::New(); node->SetData(img); QString name(m_TensorImageNodes.at(0)->GetName().c_str()); name += "_PrincipalDirection"; node->SetName(name.toStdString().c_str()); node->SetVisibility(false); GetDataStorage()->Add(node); } if (m_Controls->m_OutputNumDirectionsBox->isChecked()) { ItkUcharImgType::Pointer numDirImage = filter->GetNumDirectionsImage(); mitk::Image::Pointer image2 = mitk::Image::New(); image2->InitializeByItk( numDirImage.GetPointer() ); image2->SetVolume( numDirImage->GetBufferPointer() ); DataNode::Pointer node2 = DataNode::New(); node2->SetData(image2); QString name(m_TensorImageNodes.at(0)->GetName().c_str()); name += "_NumDirections"; node2->SetName(name.toStdString().c_str()); GetDataStorage()->Add(node2); } if (m_Controls->m_OutputVectorFieldBox->isChecked()) { mitk::Vector3D outImageSpacing = geometry->GetSpacing(); float minSpacing = 1; if(outImageSpacing[0]GetOutputFiberBundle(); // directions->SetGeometry(geometry); DataNode::Pointer node = DataNode::New(); node->SetData(directions); QString name(m_TensorImageNodes.at(0)->GetName().c_str()); name += "_VectorField"; node->SetName(name.toStdString().c_str()); node->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(minSpacing)); node->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(false)); GetDataStorage()->Add(node); } } template void QmitkOdfMaximaExtractionView::StartMaximaExtraction() { typedef itk::FiniteDiffOdfMaximaExtractionFilter< float, shOrder, 20242 > MaximaExtractionFilterType; typename MaximaExtractionFilterType::Pointer filter = MaximaExtractionFilterType::New(); switch (m_Controls->m_ToolkitBox->currentIndex()) { case 0: filter->SetToolkit(MaximaExtractionFilterType::FSL); break; case 1: filter->SetToolkit(MaximaExtractionFilterType::MRTRIX); break; default: filter->SetToolkit(MaximaExtractionFilterType::FSL); } mitk::BaseGeometry::Pointer geometry; try{ Image::Pointer img = dynamic_cast(m_ImageNodes.at(0)->GetData()); typedef ImageToItk< typename MaximaExtractionFilterType::CoefficientImageType > CasterType; typename CasterType::Pointer caster = CasterType::New(); caster->SetInput(img); caster->Update(); filter->SetInput(caster->GetOutput()); geometry = img->GetGeometry(); } catch(itk::ExceptionObject &e) { MITK_INFO << "wrong image type: " << e.what(); QMessageBox::warning( NULL, "Wrong pixel type", "Could not perform Finite Differences Extraction due to Image has wrong pixel type.", QMessageBox::Ok ); return; //throw; } filter->SetAngularThreshold(cos((float)m_Controls->m_AngularThreshold->value()*M_PI/180)); filter->SetClusteringThreshold(cos((float)m_Controls->m_ClusteringAngleBox->value()*M_PI/180)); filter->SetMaxNumPeaks(m_Controls->m_MaxNumPeaksBox->value()); filter->SetPeakThreshold(m_Controls->m_PeakThresholdBox->value()); filter->SetAbsolutePeakThreshold(m_Controls->m_AbsoluteThresholdBox->value()); if (!m_BinaryImageNodes.empty()) { ItkUcharImgType::Pointer itkMaskImage = ItkUcharImgType::New(); Image::Pointer mitkMaskImg = dynamic_cast(m_BinaryImageNodes.at(0)->GetData()); CastToItkImage(mitkMaskImg, itkMaskImage); filter->SetMaskImage(itkMaskImage); } switch (m_Controls->m_NormalizationBox->currentIndex()) { case 0: filter->SetNormalizationMethod(MaximaExtractionFilterType::NO_NORM); break; case 1: filter->SetNormalizationMethod(MaximaExtractionFilterType::MAX_VEC_NORM); break; case 2: filter->SetNormalizationMethod(MaximaExtractionFilterType::SINGLE_VEC_NORM); break; } //filter->SetNumberOfThreads(1); filter->Update(); if (m_Controls->m_OutputDirectionImagesBox->isChecked()) { typename MaximaExtractionFilterType::PeakImageType::Pointer itkImg = filter->GetPeakImage(); mitk::Image::Pointer img = mitk::Image::New(); CastToMitkImage(itkImg, img); DataNode::Pointer node = DataNode::New(); node->SetData(img); QString name(m_ImageNodes.at(0)->GetName().c_str()); name += "_PEAKS"; node->SetName(name.toStdString().c_str()); GetDataStorage()->Add(node); } if (m_Controls->m_OutputNumDirectionsBox->isChecked()) { ItkUcharImgType::Pointer numDirImage = filter->GetNumDirectionsImage(); mitk::Image::Pointer image2 = mitk::Image::New(); CastToMitkImage(numDirImage, image2); DataNode::Pointer node2 = DataNode::New(); node2->SetData(image2); QString name(m_ImageNodes.at(0)->GetName().c_str()); name += "_NUM_DIRECTIONS"; node2->SetName(name.toStdString().c_str()); GetDataStorage()->Add(node2); } if (m_Controls->m_OutputVectorFieldBox->isChecked()) { mitk::Vector3D outImageSpacing = geometry->GetSpacing(); float minSpacing = 1; if(outImageSpacing[0]GetOutputFiberBundle(); // directions->SetGeometry(geometry); DataNode::Pointer node = DataNode::New(); node->SetData(directions); QString name(m_ImageNodes.at(0)->GetName().c_str()); name += "_VECTOR_FIELD"; node->SetName(name.toStdString().c_str()); node->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(minSpacing)); node->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(false)); GetDataStorage()->Add(node); } } void QmitkOdfMaximaExtractionView::StartFiniteDiff() { if (m_ImageNodes.empty()) return; switch (m_Controls->m_ShOrderBox->currentIndex()) { case 0: StartMaximaExtraction<2>(); break; case 1: StartMaximaExtraction<4>(); break; case 2: StartMaximaExtraction<6>(); break; case 3: StartMaximaExtraction<8>(); break; case 4: StartMaximaExtraction<10>(); break; case 5: StartMaximaExtraction<12>(); break; } } void QmitkOdfMaximaExtractionView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) { m_MultiWidget = &stdMultiWidget; } void QmitkOdfMaximaExtractionView::StdMultiWidgetNotAvailable() { m_MultiWidget = NULL; } -void QmitkOdfMaximaExtractionView::OnSelectionChanged( std::vector nodes ) +void QmitkOdfMaximaExtractionView::GenerateDataFromDwi() +{ + typedef itk::OdfMaximaExtractionFilter< float > MaximaExtractionFilterType; + MaximaExtractionFilterType::Pointer filter = MaximaExtractionFilterType::New(); + + mitk::BaseGeometry::Pointer geometry; + if (!m_ImageNodes.empty()) + { + try{ + Image::Pointer img = dynamic_cast(m_ImageNodes.at(0)->GetData()); + typedef ImageToItk< MaximaExtractionFilterType::CoefficientImageType > CasterType; + CasterType::Pointer caster = CasterType::New(); + caster->SetInput(img); + caster->Update(); + filter->SetShCoeffImage(caster->GetOutput()); + geometry = img->GetGeometry(); + } + catch(itk::ExceptionObject &e) + { + MITK_INFO << "wrong image type: " << e.what(); + return; + } + } + else + return; + + filter->SetMaxNumPeaks(m_Controls->m_MaxNumPeaksBox->value()); + filter->SetPeakThreshold(m_Controls->m_PeakThresholdBox->value()); + + if (!m_BinaryImageNodes.empty()) + { + ItkUcharImgType::Pointer itkMaskImage = ItkUcharImgType::New(); + Image::Pointer mitkMaskImg = dynamic_cast(m_BinaryImageNodes.at(0)->GetData()); + CastToItkImage(mitkMaskImg, itkMaskImage); + filter->SetMaskImage(itkMaskImage); + } + + switch (m_Controls->m_NormalizationBox->currentIndex()) + { + case 0: + filter->SetNormalizationMethod(MaximaExtractionFilterType::NO_NORM); + break; + case 1: + filter->SetNormalizationMethod(MaximaExtractionFilterType::MAX_VEC_NORM); + break; + case 2: + filter->SetNormalizationMethod(MaximaExtractionFilterType::SINGLE_VEC_NORM); + break; + } + + filter->GenerateData(); + + ItkUcharImgType::Pointer numDirImage = filter->GetNumDirectionsImage(); + + if (m_Controls->m_OutputDirectionImagesBox->isChecked()) + { + typedef MaximaExtractionFilterType::ItkDirectionImageContainer ItkDirectionImageContainer; + ItkDirectionImageContainer::Pointer container = filter->GetDirectionImageContainer(); + for (int i=0; iSize(); i++) + { + MaximaExtractionFilterType::ItkDirectionImage::Pointer itkImg = container->GetElement(i); + mitk::Image::Pointer img = mitk::Image::New(); + img->InitializeByItk( itkImg.GetPointer() ); + img->SetVolume( itkImg->GetBufferPointer() ); + DataNode::Pointer node = DataNode::New(); + node->SetData(img); + QString name(m_ImageNodes.at(0)->GetName().c_str()); + name += "_Direction"; + name += QString::number(i+1); + node->SetName(name.toStdString().c_str()); + GetDataStorage()->Add(node); + } + } + + if (m_Controls->m_OutputNumDirectionsBox->isChecked()) + { + mitk::Image::Pointer image2 = mitk::Image::New(); + image2->InitializeByItk( numDirImage.GetPointer() ); + image2->SetVolume( numDirImage->GetBufferPointer() ); + DataNode::Pointer node = DataNode::New(); + node->SetData(image2); + QString name(m_ImageNodes.at(0)->GetName().c_str()); + name += "_NumDirections"; + node->SetName(name.toStdString().c_str()); + GetDataStorage()->Add(node); + } + + if (m_Controls->m_OutputVectorFieldBox->isChecked()) + { + mitk::Vector3D outImageSpacing = geometry->GetSpacing(); + float minSpacing = 1; + if(outImageSpacing[0]GetOutputFiberBundle(); + // directions->SetGeometry(geometry); + DataNode::Pointer node = DataNode::New(); + node->SetData(directions); + QString name(m_ImageNodes.at(0)->GetName().c_str()); + name += "_VectorField"; + node->SetName(name.toStdString().c_str()); + node->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(minSpacing)); + node->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(false)); + GetDataStorage()->Add(node); + } +} + +void QmitkOdfMaximaExtractionView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->m_DwiFibLabel->setText("mandatory"); m_Controls->m_MaskLabel->setText("optional"); m_BinaryImageNodes.clear(); m_ImageNodes.clear(); m_TensorImageNodes.clear(); // iterate all selected objects, adjust warning visibility - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; - if ( node.IsNotNull() && dynamic_cast(node->GetData()) ) { m_TensorImageNodes.push_back(node); } else if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { bool isBinary = false; node->GetPropertyValue("binary", isBinary); if (isBinary) m_BinaryImageNodes.push_back(node); else m_ImageNodes.push_back(node); } } UpdateGui(); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.h index 224d639b2e..79e181ef22 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.odfpeaks/src/internal/QmitkOdfMaximaExtractionView.h @@ -1,90 +1,88 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include -#include +#include #include "ui_QmitkOdfMaximaExtractionViewControls.h" #include #include #include /*! \brief View providing several methods to extract peaks from the spherical harmonic representation of ODFs or from tensors - -\sa QmitkFunctionality -\ingroup Functionalities */ // Forward Qt class declarations -class QmitkOdfMaximaExtractionView : public QmitkFunctionality +class QmitkOdfMaximaExtractionView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkOdfMaximaExtractionView(); virtual ~QmitkOdfMaximaExtractionView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; typedef itk::Image ItkUcharImgType; typedef itk::Image< itk::DiffusionTensor3D< float >, 3 > ItkTensorImage; typedef itk::Image< itk::Vector< float, 3>, 3 > ItkDirectionImage3DType; ///< contains a 3D vector in each voxel protected slots: void ConvertShCoeffs(); ///< convert spherical harmonic coefficients to the according mitk datatype void ConvertPeaks(); ///< convert peak files from other toolkits to the according mitk datatype void StartFiniteDiff(); ///< ODF maxima extraction using finite differences on the densely sampled sphere void StartTensor(); ///< extract principal eigenvectors from tensor image protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkOdfMaximaExtractionViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; std::vector< mitk::DataNode::Pointer > m_BinaryImageNodes; ///< mask images std::vector< mitk::DataNode::Pointer > m_ImageNodes; std::vector< mitk::DataNode::Pointer > m_TensorImageNodes; void UpdateGui(); ///< update button activity etc. dpending on current datamanager selection template void TemplatedConvertShCoeffs(mitk::Image* mitkImg); template void StartMaximaExtraction(); ///< ODF maxima extraction using finite differences on the densely sampled sphere private: }; diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.cpp index e9a63dc0ff..94669f7a42 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.cpp @@ -1,2197 +1,2169 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkPartialVolumeAnalysisView.h" #include #include #include #include #include #include #include #include #include #include #include #include #include -#include "QmitkStdMultiWidget.h" -#include "QmitkStdMultiWidgetEditor.h" #include "QmitkSliderNavigatorWidget.h" #include #include "mitkNodePredicateDataType.h" #include "mitkNodePredicateOr.h" #include "mitkImageTimeSelector.h" #include "mitkProperties.h" #include "mitkProgressBar.h" #include "mitkImageCast.h" #include "mitkImageToItk.h" #include "mitkITKImageImport.h" #include "mitkDataNodeObject.h" #include "mitkNodePredicateData.h" #include "mitkPlanarFigureInteractor.h" #include "mitkTensorImage.h" #include "mitkPlanarCircle.h" #include "mitkPlanarRectangle.h" #include "mitkPlanarPolygon.h" #include "mitkPartialVolumeAnalysisClusteringCalculator.h" #include "usModuleRegistry.h" #include #include "itkTensorDerivedMeasurementsFilter.h" #include "itkDiffusionTensor3D.h" #include "itkCartesianToPolarVectorImageFilter.h" #include "itkPolarToCartesianVectorImageFilter.h" #include "itkBinaryThresholdImageFilter.h" #include "itkMaskImageFilter.h" #include "itkCastImageFilter.h" #include "itkImageMomentsCalculator.h" #include #include #include #include #include #define _USE_MATH_DEFINES #include #define PVA_PI M_PI const std::string QmitkPartialVolumeAnalysisView::VIEW_ID = "org.mitk.views.partialvolumeanalysisview"; class QmitkRequestStatisticsUpdateEvent : public QEvent { public: enum Type { StatisticsUpdateRequest = QEvent::MaxUser - 1025 }; QmitkRequestStatisticsUpdateEvent() : QEvent( (QEvent::Type) StatisticsUpdateRequest ) {}; }; typedef itk::Image ImageType; typedef itk::Image FloatImageType; typedef itk::Image, 3> VectorImageType; inline bool my_isnan(float x) { volatile float d = x; if(d!=d) return true; if(d==d) return false; return d != d; } QmitkPartialVolumeAnalysisView::QmitkPartialVolumeAnalysisView(QObject * /*parent*/, const char * /*name*/) - : //QmitkFunctionality(), + : QmitkAbstractView(), m_Controls( NULL ), m_TimeStepperAdapter( NULL ), m_MeasurementInfoRenderer(0), m_MeasurementInfoAnnotation(0), m_SelectedImageNodes( ), m_SelectedImage( NULL ), m_SelectedMaskNode( NULL ), m_SelectedImageMask( NULL ), m_SelectedPlanarFigureNodes(0), m_SelectedPlanarFigure( NULL ), m_IsTensorImage(false), m_FAImage(0), m_RDImage(0), m_ADImage(0), m_MDImage(0), m_CAImage(0), // m_DirectionImage(0), m_DirectionComp1Image(0), m_DirectionComp2Image(0), m_AngularErrorImage(0), m_SelectedRenderWindow(NULL), m_LastRenderWindow(NULL), m_ImageObserverTag( -1 ), m_ImageMaskObserverTag( -1 ), m_PlanarFigureObserverTag( -1 ), m_CurrentStatisticsValid( false ), m_StatisticsUpdatePending( false ), m_GaussianSigmaChangedSliding(false), m_NumberBinsSliding(false), m_UpsamplingChangedSliding(false), m_ClusteringResult(NULL), m_EllipseCounter(0), m_RectangleCounter(0), m_PolygonCounter(0), m_CurrentFigureNodeInitialized(false), m_QuantifyClass(2), m_IconTexOFF(new QIcon(":/QmitkPartialVolumeAnalysisView/texIntOFFIcon.png")), m_IconTexON(new QIcon(":/QmitkPartialVolumeAnalysisView/texIntONIcon.png")), m_TexIsOn(true), m_Visible(false) { } QmitkPartialVolumeAnalysisView::~QmitkPartialVolumeAnalysisView() { if ( m_SelectedImage.IsNotNull() ) m_SelectedImage->RemoveObserver( m_ImageObserverTag ); if ( m_SelectedImageMask.IsNotNull() ) m_SelectedImageMask->RemoveObserver( m_ImageMaskObserverTag ); if ( m_SelectedPlanarFigure.IsNotNull() ) { m_SelectedPlanarFigure->RemoveObserver( m_PlanarFigureObserverTag ); m_SelectedPlanarFigure->RemoveObserver( m_InitializedObserverTag ); } this->GetDataStorage()->AddNodeEvent -= mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeAddedInDataStorage ); m_SelectedPlanarFigureNodes->NodeChanged.RemoveListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeChanged ) ); m_SelectedPlanarFigureNodes->NodeRemoved.RemoveListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeRemoved ) ); m_SelectedPlanarFigureNodes->PropertyChanged.RemoveListener( mitk::MessageDelegate2( this, &QmitkPartialVolumeAnalysisView::PropertyChanged ) ); m_SelectedImageNodes->NodeChanged.RemoveListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeChanged ) ); m_SelectedImageNodes->NodeRemoved.RemoveListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeRemoved ) ); m_SelectedImageNodes->PropertyChanged.RemoveListener( mitk::MessageDelegate2( this, &QmitkPartialVolumeAnalysisView::PropertyChanged ) ); } void QmitkPartialVolumeAnalysisView::CreateQtPartControl(QWidget *parent) { if (m_Controls == NULL) { m_Controls = new Ui::QmitkPartialVolumeAnalysisViewControls; m_Controls->setupUi(parent); this->CreateConnections(); } SetHistogramVisibility(); m_Controls->m_TextureIntON->setIcon(*m_IconTexON); m_Controls->m_SimilarAnglesFrame->setVisible(false); m_Controls->m_SimilarAnglesLabel->setVisible(false); vtkTextProperty *textProp = vtkTextProperty::New(); textProp->SetColor(1.0, 1.0, 1.0); m_MeasurementInfoAnnotation = vtkCornerAnnotation::New(); m_MeasurementInfoAnnotation->SetMaximumFontSize(12); m_MeasurementInfoAnnotation->SetTextProperty(textProp); m_MeasurementInfoRenderer = vtkRenderer::New(); m_MeasurementInfoRenderer->AddActor(m_MeasurementInfoAnnotation); m_SelectedPlanarFigureNodes = mitk::DataStorageSelection::New(this->GetDataStorage(), false); m_SelectedPlanarFigureNodes->NodeChanged.AddListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeChanged ) ); m_SelectedPlanarFigureNodes->NodeRemoved.AddListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeRemoved ) ); m_SelectedPlanarFigureNodes->PropertyChanged.AddListener( mitk::MessageDelegate2( this, &QmitkPartialVolumeAnalysisView::PropertyChanged ) ); m_SelectedImageNodes = mitk::DataStorageSelection::New(this->GetDataStorage(), false); m_SelectedImageNodes->PropertyChanged.AddListener( mitk::MessageDelegate2( this, &QmitkPartialVolumeAnalysisView::PropertyChanged ) ); m_SelectedImageNodes->NodeChanged.AddListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeChanged ) ); m_SelectedImageNodes->NodeRemoved.AddListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeRemoved ) ); this->GetDataStorage()->AddNodeEvent.AddListener( mitk::MessageDelegate1( this, &QmitkPartialVolumeAnalysisView::NodeAddedInDataStorage ) ); Select(NULL,true,true); SetAdvancedVisibility(); } +void QmitkPartialVolumeAnalysisView::SetFocus() +{ + m_Controls->m_CircleButton->setFocus(); +} + void QmitkPartialVolumeAnalysisView::SetHistogramVisibility() { m_Controls->m_HistogramWidget->setVisible(m_Controls->m_DisplayHistogramCheckbox->isChecked()); } void QmitkPartialVolumeAnalysisView::SetAdvancedVisibility() { m_Controls->frame_7->setVisible(m_Controls->m_AdvancedCheckbox->isChecked()); } void QmitkPartialVolumeAnalysisView::CreateConnections() { if ( m_Controls ) { connect( m_Controls->m_DisplayHistogramCheckbox, SIGNAL( clicked() ) , this, SLOT( SetHistogramVisibility() ) ); connect( m_Controls->m_AdvancedCheckbox, SIGNAL( clicked() ) , this, SLOT( SetAdvancedVisibility() ) ); connect( m_Controls->m_NumberBinsSlider, SIGNAL( sliderReleased () ), this, SLOT( NumberBinsReleasedSlider( ) ) ); connect( m_Controls->m_UpsamplingSlider, SIGNAL( sliderReleased( ) ), this, SLOT( UpsamplingReleasedSlider( ) ) ); connect( m_Controls->m_GaussianSigmaSlider, SIGNAL( sliderReleased( ) ), this, SLOT( GaussianSigmaReleasedSlider( ) ) ); connect( m_Controls->m_SimilarAnglesSlider, SIGNAL( sliderReleased( ) ), this, SLOT( SimilarAnglesReleasedSlider( ) ) ); connect( m_Controls->m_NumberBinsSlider, SIGNAL( valueChanged (int) ), this, SLOT( NumberBinsChangedSlider( int ) ) ); connect( m_Controls->m_UpsamplingSlider, SIGNAL( valueChanged( int ) ), this, SLOT( UpsamplingChangedSlider( int ) ) ); connect( m_Controls->m_GaussianSigmaSlider, SIGNAL( valueChanged( int ) ), this, SLOT( GaussianSigmaChangedSlider( int ) ) ); connect( m_Controls->m_SimilarAnglesSlider, SIGNAL( valueChanged( int ) ), this, SLOT( SimilarAnglesChangedSlider(int) ) ); connect( m_Controls->m_OpacitySlider, SIGNAL( valueChanged( int ) ), this, SLOT( OpacityChangedSlider(int) ) ); connect( (QObject*)(m_Controls->m_ButtonCopyHistogramToClipboard), SIGNAL(clicked()),(QObject*) this, SLOT(ToClipBoard())); connect( m_Controls->m_CircleButton, SIGNAL( clicked() ) , this, SLOT( ActionDrawEllipseTriggered() ) ); connect( m_Controls->m_RectangleButton, SIGNAL( clicked() ) , this, SLOT( ActionDrawRectangleTriggered() ) ); connect( m_Controls->m_PolygonButton, SIGNAL( clicked() ) , this, SLOT( ActionDrawPolygonTriggered() ) ); connect( m_Controls->m_GreenRadio, SIGNAL( clicked(bool) ) , this, SLOT( GreenRadio(bool) ) ); connect( m_Controls->m_PartialVolumeRadio, SIGNAL( clicked(bool) ) , this, SLOT( PartialVolumeRadio(bool) ) ); connect( m_Controls->m_BlueRadio, SIGNAL( clicked(bool) ) , this, SLOT( BlueRadio(bool) ) ); connect( m_Controls->m_AllRadio, SIGNAL( clicked(bool) ) , this, SLOT( AllRadio(bool) ) ); connect( m_Controls->m_EstimateCircle, SIGNAL( clicked() ) , this, SLOT( EstimateCircle() ) ); connect( (QObject*)(m_Controls->m_TextureIntON), SIGNAL(clicked()), this, SLOT(TextIntON()) ); connect( m_Controls->m_ExportClusteringResultsButton, SIGNAL(clicked()), this, SLOT(ExportClusteringResults())); } } void QmitkPartialVolumeAnalysisView::ExportClusteringResults() { if (m_ClusteringResult.IsNull() || m_SelectedImage.IsNull()) return; mitk::BaseGeometry* geometry = m_SelectedImage->GetGeometry(); itk::Image< short, 3>::Pointer referenceImage = itk::Image< short, 3>::New(); itk::Vector newSpacing = geometry->GetSpacing(); mitk::Point3D newOrigin = geometry->GetOrigin(); mitk::Geometry3D::BoundsArrayType bounds = geometry->GetBounds(); newOrigin[0] += bounds.GetElement(0); newOrigin[1] += bounds.GetElement(2); newOrigin[2] += bounds.GetElement(4); itk::Matrix newDirection; itk::ImageRegion<3> imageRegion; for (int i=0; i<3; i++) for (int j=0; j<3; j++) newDirection[j][i] = geometry->GetMatrixColumn(i)[j]/newSpacing[j]; imageRegion.SetSize(0, geometry->GetExtent(0)); imageRegion.SetSize(1, geometry->GetExtent(1)); imageRegion.SetSize(2, geometry->GetExtent(2)); // apply new image parameters referenceImage->SetSpacing( newSpacing ); referenceImage->SetOrigin( newOrigin ); referenceImage->SetDirection( newDirection ); referenceImage->SetRegions( imageRegion ); referenceImage->Allocate(); typedef itk::Image< float, 3 > OutType; mitk::Image::Pointer mitkInImage = dynamic_cast(m_ClusteringResult->GetData()); typedef itk::Image< itk::RGBAPixel, 3 > ItkRgbaImageType; typedef mitk::ImageToItk< ItkRgbaImageType > CasterType; CasterType::Pointer caster = CasterType::New(); caster->SetInput(mitkInImage); caster->Update(); ItkRgbaImageType::Pointer itkInImage = caster->GetOutput(); typedef itk::ExtractChannelFromRgbaImageFilter< itk::Image< short, 3>, OutType > ExtractionFilterType; ExtractionFilterType::Pointer filter = ExtractionFilterType::New(); filter->SetInput(itkInImage); filter->SetChannel(ExtractionFilterType::ALPHA); filter->SetReferenceImage(referenceImage); filter->Update(); OutType::Pointer outImg = filter->GetOutput(); mitk::Image::Pointer img = mitk::Image::New(); img->InitializeByItk(outImg.GetPointer()); img->SetVolume(outImg->GetBufferPointer()); // init data node mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(img); node->SetName("Clustering Result"); GetDataStorage()->Add(node); } void QmitkPartialVolumeAnalysisView::EstimateCircle() { typedef itk::Image SegImageType; SegImageType::Pointer mask_itk = SegImageType::New(); typedef mitk::ImageToItk CastType; CastType::Pointer caster = CastType::New(); caster->SetInput(m_SelectedImageMask); caster->Update(); typedef itk::ImageMomentsCalculator< SegImageType > MomentsType; MomentsType::Pointer momentsCalc = MomentsType::New(); momentsCalc->SetImage(caster->GetOutput()); momentsCalc->Compute(); MomentsType::VectorType cog = momentsCalc->GetCenterOfGravity(); MomentsType::MatrixType axes = momentsCalc->GetPrincipalAxes(); MomentsType::VectorType moments = momentsCalc->GetPrincipalMoments(); // moments-coord conversion // third coordinate min oder max? // max-min = extent MomentsType::AffineTransformPointer trafo = momentsCalc->GetPhysicalAxesToPrincipalAxesTransform(); itk::ImageRegionIterator itimage(caster->GetOutput(), caster->GetOutput()->GetLargestPossibleRegion()); itimage = itimage.Begin(); double max = -9999999999.0; double min = 9999999999.0; while( !itimage.IsAtEnd() ) { if(itimage.Get()) { ImageType::IndexType index = itimage.GetIndex(); itk::Point point; caster->GetOutput()->TransformIndexToPhysicalPoint(index,point); itk::Point newPoint; newPoint = trafo->TransformPoint(point); if(newPoint[2]max) max = newPoint[2]; } ++itimage; } double extent = max - min; MITK_DEBUG << "EXTENT = " << extent; mitk::Point3D origin; mitk::Vector3D right, bottom, normal; double factor = 1000.0; mitk::FillVector3D(origin, cog[0]-factor*axes[1][0]-factor*axes[2][0], cog[1]-factor*axes[1][1]-factor*axes[2][1], cog[2]-factor*axes[1][2]-factor*axes[2][2]); // mitk::FillVector3D(normal, axis[0][0],axis[0][1],axis[0][2]); mitk::FillVector3D(bottom, 2*factor*axes[1][0], 2*factor*axes[1][1], 2*factor*axes[1][2]); mitk::FillVector3D(right, 2*factor*axes[2][0], 2*factor*axes[2][1], 2*factor*axes[2][2]); mitk::PlaneGeometry::Pointer planegeometry = mitk::PlaneGeometry::New(); planegeometry->InitializeStandardPlane(right.Get_vnl_vector(), bottom.Get_vnl_vector()); planegeometry->SetOrigin(origin); double len1 = sqrt(axes[1][0]*axes[1][0] + axes[1][1]*axes[1][1] + axes[1][2]*axes[1][2]); double len2 = sqrt(axes[2][0]*axes[2][0] + axes[2][1]*axes[2][1] + axes[2][2]*axes[2][2]); mitk::Point2D point1; point1[0] = factor*len1; point1[1] = factor*len2; mitk::Point2D point2; point2[0] = factor*len1+extent*.5; point2[1] = factor*len2; mitk::PlanarCircle::Pointer circle = mitk::PlanarCircle::New(); circle->SetPlaneGeometry(planegeometry); circle->PlaceFigure( point1 ); circle->SetControlPoint(0,point1); circle->SetControlPoint(1,point2); //circle->SetCurrentControlPoint( point2 ); mitk::PlanarFigure::PolyLineType polyline = circle->GetPolyLine( 0 ); MITK_DEBUG << "SIZE of planar figure polyline: " << polyline.size(); AddFigureToDataStorage(circle, "Circle"); } bool QmitkPartialVolumeAnalysisView::AssertDrawingIsPossible(bool checked) { if (m_SelectedImageNodes->GetNode().IsNull()) { checked = false; this->HandleException("Please select an image!", dynamic_cast(this->parent()), true); return false; } - //this->GetActiveStdMultiWidget()->SetWidgetPlanesVisibility(false); + //this->GetRenderWindowPart(OPEN)->EnableSlicingPlanes(false); return checked; } void QmitkPartialVolumeAnalysisView::ActionDrawEllipseTriggered() { bool checked = m_Controls->m_CircleButton->isChecked(); if(!this->AssertDrawingIsPossible(checked)) return; mitk::PlanarCircle::Pointer figure = mitk::PlanarCircle::New(); // using PV_ prefix for planar figures from this view // to distinguish them from that ones created throught the measurement view this->AddFigureToDataStorage(figure, QString("PV_Circle%1").arg(++m_EllipseCounter)); MITK_DEBUG << "PlanarCircle created ..."; } void QmitkPartialVolumeAnalysisView::ActionDrawRectangleTriggered() { bool checked = m_Controls->m_RectangleButton->isChecked(); if(!this->AssertDrawingIsPossible(checked)) return; mitk::PlanarRectangle::Pointer figure = mitk::PlanarRectangle::New(); // using PV_ prefix for planar figures from this view // to distinguish them from that ones created throught the measurement view this->AddFigureToDataStorage(figure, QString("PV_Rectangle%1").arg(++m_RectangleCounter)); MITK_DEBUG << "PlanarRectangle created ..."; } void QmitkPartialVolumeAnalysisView::ActionDrawPolygonTriggered() { bool checked = m_Controls->m_PolygonButton->isChecked(); if(!this->AssertDrawingIsPossible(checked)) return; mitk::PlanarPolygon::Pointer figure = mitk::PlanarPolygon::New(); figure->ClosedOn(); // using PV_ prefix for planar figures from this view // to distinguish them from that ones created throught the measurement view this->AddFigureToDataStorage(figure, QString("PV_Polygon%1").arg(++m_PolygonCounter)); MITK_DEBUG << "PlanarPolygon created ..."; } void QmitkPartialVolumeAnalysisView::AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name, const char *propertyKey, mitk::BaseProperty *property ) { mitk::DataNode::Pointer newNode = mitk::DataNode::New(); newNode->SetName(name.toStdString()); newNode->SetData(figure); // Add custom property, if available if ( (propertyKey != NULL) && (property != NULL) ) { newNode->AddProperty( propertyKey, property ); } // figure drawn on the topmost layer / image this->GetDataStorage()->Add(newNode, m_SelectedImageNodes->GetNode() ); QList selectedNodes = this->GetDataManagerSelection(); for(unsigned int i = 0; i < selectedNodes.size(); i++) { selectedNodes[i]->SetSelected(false); } std::vector selectedPFNodes = m_SelectedPlanarFigureNodes->GetNodes(); for(unsigned int i = 0; i < selectedPFNodes.size(); i++) { selectedPFNodes[i]->SetSelected(false); } newNode->SetSelected(true); Select(newNode); } void QmitkPartialVolumeAnalysisView::PlanarFigureInitialized() { if(m_SelectedPlanarFigureNodes->GetNode().IsNull()) return; m_CurrentFigureNodeInitialized = true; this->Select(m_SelectedPlanarFigureNodes->GetNode()); m_Controls->m_CircleButton->setChecked(false); m_Controls->m_RectangleButton->setChecked(false); m_Controls->m_PolygonButton->setChecked(false); - //this->GetActiveStdMultiWidget()->SetWidgetPlanesVisibility(true); + //this->GetRenderWindowPart(OPEN)->EnableSlicingPlanes(true); this->RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::PlanarFigureFocus(mitk::DataNode* node) { mitk::PlanarFigure* _PlanarFigure = 0; _PlanarFigure = dynamic_cast (node->GetData()); if (_PlanarFigure) { FindRenderWindow(node); const mitk::PlaneGeometry* _PlaneGeometry = _PlanarFigure->GetPlaneGeometry(); // make node visible if (m_SelectedRenderWindow) { mitk::Point3D centerP = _PlaneGeometry->GetOrigin(); m_SelectedRenderWindow->GetSliceNavigationController()->ReorientSlices( centerP, _PlaneGeometry->GetNormal()); m_SelectedRenderWindow->GetSliceNavigationController()->SelectSliceByPoint( centerP); } } } void QmitkPartialVolumeAnalysisView::FindRenderWindow(mitk::DataNode* node) { if (node && dynamic_cast (node->GetData())) { m_SelectedRenderWindow = 0; bool PlanarFigureInitializedWindow = false; foreach(QmitkRenderWindow * window, this->GetRenderWindowPart()->GetQmitkRenderWindows().values()) { if (!m_SelectedRenderWindow && node->GetBoolProperty("PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, window->GetRenderer())) { m_SelectedRenderWindow = window; } } } } void QmitkPartialVolumeAnalysisView::OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList &nodes) { m_Controls->m_InputData->setTitle("Please Select Input Data"); if (!m_Visible) return; if ( nodes.empty() ) { if (m_ClusteringResult.IsNotNull()) { this->GetDataStorage()->Remove(m_ClusteringResult); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } Select(NULL, true, true); } for (int i=0; iRemoveOrphanImages(); bool somethingChanged = false; if(node.IsNull()) { somethingChanged = true; if(clearMaskOnFirstArgNULL) { if ( (m_SelectedImageMask.IsNotNull()) && (m_ImageMaskObserverTag >= 0) ) { m_SelectedImageMask->RemoveObserver( m_ImageMaskObserverTag ); m_ImageMaskObserverTag = -1; } if ( (m_SelectedPlanarFigure.IsNotNull()) && (m_PlanarFigureObserverTag >= 0) ) { m_SelectedPlanarFigure->RemoveObserver( m_PlanarFigureObserverTag ); m_PlanarFigureObserverTag = -1; } if ( (m_SelectedPlanarFigure.IsNotNull()) && (m_InitializedObserverTag >= 0) ) { m_SelectedPlanarFigure->RemoveObserver( m_InitializedObserverTag ); m_InitializedObserverTag = -1; } m_SelectedPlanarFigure = NULL; m_SelectedPlanarFigureNodes->RemoveAllNodes(); m_CurrentFigureNodeInitialized = false; m_SelectedRenderWindow = 0; m_SelectedMaskNode = NULL; m_SelectedImageMask = NULL; } if(clearImageOnFirstArgNULL) { if ( (m_SelectedImage.IsNotNull()) && (m_ImageObserverTag >= 0) ) { m_SelectedImage->RemoveObserver( m_ImageObserverTag ); m_ImageObserverTag = -1; } m_SelectedImageNodes->RemoveAllNodes(); m_SelectedImage = NULL; m_IsTensorImage = false; m_FAImage = NULL; m_RDImage = NULL; m_ADImage = NULL; m_MDImage = NULL; m_CAImage = NULL; m_DirectionComp1Image = NULL; m_DirectionComp2Image = NULL; m_AngularErrorImage = NULL; m_Controls->m_SimilarAnglesFrame->setVisible(false); m_Controls->m_SimilarAnglesLabel->setVisible(false); } } else { typedef itk::SimpleMemberCommand< QmitkPartialVolumeAnalysisView > ITKCommandType; ITKCommandType::Pointer changeListener; changeListener = ITKCommandType::New(); changeListener->SetCallbackFunction( this, &QmitkPartialVolumeAnalysisView::RequestStatisticsUpdate ); // Get selected element mitk::TensorImage *selectedTensorImage = dynamic_cast< mitk::TensorImage * >( node->GetData() ); mitk::Image *selectedImage = dynamic_cast< mitk::Image * >( node->GetData() ); mitk::PlanarFigure *selectedPlanar = dynamic_cast< mitk::PlanarFigure * >( node->GetData() ); bool isMask = false; bool isImage = false; bool isPlanar = false; bool isTensorImage = false; if (selectedTensorImage != NULL) { isTensorImage = true; } else if(selectedImage != NULL) { node->GetPropertyValue("binary", isMask); isImage = !isMask; } else if ( (selectedPlanar != NULL) ) { isPlanar = true; } // image if(isImage && selectedImage->GetDimension()==3) { if(selectedImage != m_SelectedImage.GetPointer()) { somethingChanged = true; if ( (m_SelectedImage.IsNotNull()) && (m_ImageObserverTag >= 0) ) { m_SelectedImage->RemoveObserver( m_ImageObserverTag ); m_ImageObserverTag = -1; } *m_SelectedImageNodes = node; m_SelectedImage = selectedImage; m_IsTensorImage = false; m_FAImage = NULL; m_RDImage = NULL; m_ADImage = NULL; m_MDImage = NULL; m_CAImage = NULL; m_DirectionComp1Image = NULL; m_DirectionComp2Image = NULL; m_AngularErrorImage = NULL; // Add change listeners to selected objects m_ImageObserverTag = m_SelectedImage->AddObserver( itk::ModifiedEvent(), changeListener ); m_Controls->m_SimilarAnglesFrame->setVisible(false); m_Controls->m_SimilarAnglesLabel->setVisible(false); m_Controls->m_SelectedImageLabel->setText( m_SelectedImageNodes->GetNode()->GetName().c_str() ); } } //planar if(isPlanar) { if(selectedPlanar != m_SelectedPlanarFigure.GetPointer()) { MITK_DEBUG << "Planar selection changed"; somethingChanged = true; // Possibly previous change listeners if ( (m_SelectedPlanarFigure.IsNotNull()) && (m_PlanarFigureObserverTag >= 0) ) { m_SelectedPlanarFigure->RemoveObserver( m_PlanarFigureObserverTag ); m_PlanarFigureObserverTag = -1; } if ( (m_SelectedPlanarFigure.IsNotNull()) && (m_InitializedObserverTag >= 0) ) { m_SelectedPlanarFigure->RemoveObserver( m_InitializedObserverTag ); m_InitializedObserverTag = -1; } m_SelectedPlanarFigure = selectedPlanar; *m_SelectedPlanarFigureNodes = node; m_CurrentFigureNodeInitialized = selectedPlanar->IsPlaced(); m_SelectedMaskNode = NULL; m_SelectedImageMask = NULL; m_PlanarFigureObserverTag = m_SelectedPlanarFigure->AddObserver( mitk::EndInteractionPlanarFigureEvent(), changeListener ); if(!m_CurrentFigureNodeInitialized) { typedef itk::SimpleMemberCommand< QmitkPartialVolumeAnalysisView > ITKCommandType; ITKCommandType::Pointer initializationCommand; initializationCommand = ITKCommandType::New(); // set the callback function of the member command initializationCommand->SetCallbackFunction( this, &QmitkPartialVolumeAnalysisView::PlanarFigureInitialized ); // add an observer m_InitializedObserverTag = selectedPlanar->AddObserver( mitk::EndPlacementPlanarFigureEvent(), initializationCommand ); } m_Controls->m_SelectedMaskLabel->setText( m_SelectedPlanarFigureNodes->GetNode()->GetName().c_str() ); PlanarFigureFocus(node); } } //mask this->m_Controls->m_EstimateCircle->setEnabled(isMask && selectedImage->GetDimension()==3); if(isMask && selectedImage->GetDimension()==3) { if(selectedImage != m_SelectedImage.GetPointer()) { somethingChanged = true; if ( (m_SelectedImageMask.IsNotNull()) && (m_ImageMaskObserverTag >= 0) ) { m_SelectedImageMask->RemoveObserver( m_ImageMaskObserverTag ); m_ImageMaskObserverTag = -1; } m_SelectedMaskNode = node; m_SelectedImageMask = selectedImage; m_SelectedPlanarFigure = NULL; m_SelectedPlanarFigureNodes->RemoveAllNodes(); m_ImageMaskObserverTag = m_SelectedImageMask->AddObserver( itk::ModifiedEvent(), changeListener ); m_Controls->m_SelectedMaskLabel->setText( m_SelectedMaskNode->GetName().c_str() ); } } //tensor image if(isTensorImage && selectedTensorImage->GetDimension()==3) { if(selectedImage != m_SelectedImage.GetPointer()) { somethingChanged = true; if ( (m_SelectedImage.IsNotNull()) && (m_ImageObserverTag >= 0) ) { m_SelectedImage->RemoveObserver( m_ImageObserverTag ); m_ImageObserverTag = -1; } *m_SelectedImageNodes = node; m_SelectedImage = selectedImage; m_IsTensorImage = true; ExtractTensorImages(selectedImage); // Add change listeners to selected objects m_ImageObserverTag = m_SelectedImage->AddObserver( itk::ModifiedEvent(), changeListener ); m_Controls->m_SimilarAnglesFrame->setVisible(true); m_Controls->m_SimilarAnglesLabel->setVisible(true); m_Controls->m_SelectedImageLabel->setText( m_SelectedImageNodes->GetNode()->GetName().c_str() ); } } } if(somethingChanged) { this->SetMeasurementInfoToRenderWindow(""); if(m_SelectedPlanarFigure.IsNull() && m_SelectedImageMask.IsNull() ) { m_Controls->m_SelectedMaskLabel->setText("mandatory"); m_Controls->m_ResampleOptionsFrame->setEnabled(false); m_Controls->m_HistogramWidget->setEnabled(false); m_Controls->m_ClassSelector->setEnabled(false); m_Controls->m_DisplayHistogramCheckbox->setEnabled(false); m_Controls->m_AdvancedCheckbox->setEnabled(false); m_Controls->frame_7->setEnabled(false); } else { m_Controls->m_ResampleOptionsFrame->setEnabled(true); m_Controls->m_HistogramWidget->setEnabled(true); m_Controls->m_ClassSelector->setEnabled(true); m_Controls->m_DisplayHistogramCheckbox->setEnabled(true); m_Controls->m_AdvancedCheckbox->setEnabled(true); m_Controls->frame_7->setEnabled(true); } // Clear statistics / histogram GUI if nothing is selected if ( m_SelectedImage.IsNull() ) { m_Controls->m_PlanarFigureButtonsFrame->setEnabled(false); m_Controls->m_OpacityFrame->setEnabled(false); m_Controls->m_SelectedImageLabel->setText("mandatory"); } else { m_Controls->m_PlanarFigureButtonsFrame->setEnabled(true); m_Controls->m_OpacityFrame->setEnabled(true); } if( !m_Visible || m_SelectedImage.IsNull() || (m_SelectedPlanarFigure.IsNull() && m_SelectedImageMask.IsNull()) ) { m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->m_HistogramWidget->ClearItemModel(); m_CurrentStatisticsValid = false; } else { m_Controls->m_InputData->setTitle("Input Data"); this->RequestStatisticsUpdate(); } } } void QmitkPartialVolumeAnalysisView::ShowClusteringResults() { typedef itk::Image MaskImageType; mitk::Image::Pointer mask = 0; MaskImageType::Pointer itkmask = 0; if(m_IsTensorImage && m_Controls->m_SimilarAnglesSlider->value() != 0) { typedef itk::Image AngularErrorImageType; typedef mitk::ImageToItk CastType; CastType::Pointer caster = CastType::New(); caster->SetInput(m_AngularErrorImage); caster->Update(); typedef itk::BinaryThresholdImageFilter< AngularErrorImageType, MaskImageType > ThreshType; ThreshType::Pointer thresh = ThreshType::New(); thresh->SetUpperThreshold((90-m_Controls->m_SimilarAnglesSlider->value())*(PVA_PI/180.0)); thresh->SetInsideValue(1.0); thresh->SetInput(caster->GetOutput()); thresh->Update(); itkmask = thresh->GetOutput(); mask = mitk::Image::New(); mask->InitializeByItk(itkmask.GetPointer()); mask->SetVolume(itkmask->GetBufferPointer()); - // GetDefaultDataStorage()->Remove(m_newnode); + // GetDataStorage()->Remove(m_newnode); // m_newnode = mitk::DataNode::New(); // m_newnode->SetData(mask); // m_newnode->SetName("masking node"); // m_newnode->SetIntProperty( "layer", 1002 ); - // GetDefaultDataStorage()->Add(m_newnode, m_SelectedImageNodes->GetNode()); + // GetDataStorage()->Add(m_newnode, m_SelectedImageNodes->GetNode()); } mitk::Image::Pointer clusteredImage; ClusteringType::Pointer clusterer = ClusteringType::New(); if(m_QuantifyClass==3) { if(m_IsTensorImage) { double *green_fa, *green_rd, *green_ad, *green_md; //double *greengray_fa, *greengray_rd, *greengray_ad, *greengray_md; double *gray_fa, *gray_rd, *gray_ad, *gray_md; //double *redgray_fa, *redgray_rd, *redgray_ad, *redgray_md; double *red_fa, *red_rd, *red_ad, *red_md; mitk::Image* tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(0); mitk::Image::ConstPointer imgToCluster = tmpImg; red_fa = clusterer->PerformQuantification(imgToCluster, m_CurrentRGBClusteringResults->rgbChannels->r, mask); green_fa = clusterer->PerformQuantification(imgToCluster, m_CurrentRGBClusteringResults->rgbChannels->g, mask); gray_fa = clusterer->PerformQuantification(imgToCluster, m_CurrentRGBClusteringResults->rgbChannels->b, mask); tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(3); mitk::Image::ConstPointer imgToCluster3 = tmpImg; red_rd = clusterer->PerformQuantification(imgToCluster3, m_CurrentRGBClusteringResults->rgbChannels->r, mask); green_rd = clusterer->PerformQuantification(imgToCluster3, m_CurrentRGBClusteringResults->rgbChannels->g, mask); gray_rd = clusterer->PerformQuantification(imgToCluster3, m_CurrentRGBClusteringResults->rgbChannels->b, mask); tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(4); mitk::Image::ConstPointer imgToCluster4 = tmpImg; red_ad = clusterer->PerformQuantification(imgToCluster4, m_CurrentRGBClusteringResults->rgbChannels->r, mask); green_ad = clusterer->PerformQuantification(imgToCluster4, m_CurrentRGBClusteringResults->rgbChannels->g, mask); gray_ad = clusterer->PerformQuantification(imgToCluster4, m_CurrentRGBClusteringResults->rgbChannels->b, mask); tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(5); mitk::Image::ConstPointer imgToCluster5 = tmpImg; red_md = clusterer->PerformQuantification(imgToCluster5, m_CurrentRGBClusteringResults->rgbChannels->r, mask); green_md = clusterer->PerformQuantification(imgToCluster5, m_CurrentRGBClusteringResults->rgbChannels->g, mask); gray_md = clusterer->PerformQuantification(imgToCluster5, m_CurrentRGBClusteringResults->rgbChannels->b, mask); // clipboard QString clipboardText("FA\t%1\t%2\t\t%3\t%4\t\t%5\t%6\t"); clipboardText = clipboardText .arg(red_fa[0]).arg(red_fa[1]) .arg(gray_fa[0]).arg(gray_fa[1]) .arg(green_fa[0]).arg(green_fa[1]); QString clipboardText3("RD\t%1\t%2\t\t%3\t%4\t\t%5\t%6\t"); clipboardText3 = clipboardText3 .arg(red_rd[0]).arg(red_rd[1]) .arg(gray_rd[0]).arg(gray_rd[1]) .arg(green_rd[0]).arg(green_rd[1]); QString clipboardText4("AD\t%1\t%2\t\t%3\t%4\t\t%5\t%6\t"); clipboardText4 = clipboardText4 .arg(red_ad[0]).arg(red_ad[1]) .arg(gray_ad[0]).arg(gray_ad[1]) .arg(green_ad[0]).arg(green_ad[1]); QString clipboardText5("MD\t%1\t%2\t\t%3\t%4\t\t%5\t%6"); clipboardText5 = clipboardText5 .arg(red_md[0]).arg(red_md[1]) .arg(gray_md[0]).arg(gray_md[1]) .arg(green_md[0]).arg(green_md[1]); QApplication::clipboard()->setText(clipboardText+clipboardText3+clipboardText4+clipboardText5, QClipboard::Clipboard); // now paint infos also on renderwindow QString plainInfoText("%1 %2 %3 \n"); plainInfoText = plainInfoText .arg("Red ", 20) .arg("Gray ", 20) .arg("Green", 20); QString plainInfoText0("FA:%1 ± %2%3 ± %4%5 ± %6\n"); plainInfoText0 = plainInfoText0 .arg(red_fa[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(red_fa[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(gray_fa[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(gray_fa[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(green_fa[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(green_fa[1], -10, 'g', 2, QLatin1Char( ' ' )); QString plainInfoText3("RDx10³:%1 ± %2%3 ± %4%5 ± %6\n"); plainInfoText3 = plainInfoText3 .arg(1000.0 * red_rd[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * red_rd[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(1000.0 * gray_rd[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * gray_rd[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(1000.0 * green_rd[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * green_rd[1], -10, 'g', 2, QLatin1Char( ' ' )); QString plainInfoText4("ADx10³:%1 ± %2%3 ± %4%5 ± %6\n"); plainInfoText4 = plainInfoText4 .arg(1000.0 * red_ad[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * red_ad[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(1000.0 * gray_ad[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * gray_ad[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(1000.0 * green_ad[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * green_ad[1], -10, 'g', 2, QLatin1Char( ' ' )); QString plainInfoText5("MDx10³:%1 ± %2%3 ± %4%5 ± %6"); plainInfoText5 = plainInfoText5 .arg(1000.0 * red_md[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * red_md[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(1000.0 * gray_md[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * gray_md[1], -10, 'g', 2, QLatin1Char( ' ' )) .arg(1000.0 * green_md[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * green_md[1], -10, 'g', 2, QLatin1Char( ' ' )); this->SetMeasurementInfoToRenderWindow(plainInfoText+plainInfoText0+plainInfoText3+plainInfoText4+plainInfoText5); } else { double* green; double* gray; double* red; mitk::Image* tmpImg = m_CurrentStatisticsCalculator->GetInternalImage(); mitk::Image::ConstPointer imgToCluster = tmpImg; red = clusterer->PerformQuantification(imgToCluster, m_CurrentRGBClusteringResults->rgbChannels->r); green = clusterer->PerformQuantification(imgToCluster, m_CurrentRGBClusteringResults->rgbChannels->g); gray = clusterer->PerformQuantification(imgToCluster, m_CurrentRGBClusteringResults->rgbChannels->b); // clipboard QString clipboardText("%1\t%2\t\t%3\t%4\t\t%5\t%6"); clipboardText = clipboardText.arg(red[0]).arg(red[1]) .arg(gray[0]).arg(gray[1]) .arg(green[0]).arg(green[1]); QApplication::clipboard()->setText(clipboardText, QClipboard::Clipboard); // now paint infos also on renderwindow QString plainInfoText("Red: %1 ± %2\nGray: %3 ± %4\nGreen: %5 ± %6"); plainInfoText = plainInfoText.arg(red[0]).arg(red[1]) .arg(gray[0]).arg(gray[1]) .arg(green[0]).arg(green[1]); this->SetMeasurementInfoToRenderWindow(plainInfoText); } clusteredImage = m_CurrentRGBClusteringResults->rgb; } else { if(m_IsTensorImage) { double *red_fa, *red_rd, *red_ad, *red_md; mitk::Image* tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(0); mitk::Image::ConstPointer imgToCluster = tmpImg; red_fa = clusterer->PerformQuantification(imgToCluster, m_CurrentPerformClusteringResults->clusteredImage, mask); tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(3); mitk::Image::ConstPointer imgToCluster3 = tmpImg; red_rd = clusterer->PerformQuantification(imgToCluster3, m_CurrentPerformClusteringResults->clusteredImage, mask); tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(4); mitk::Image::ConstPointer imgToCluster4 = tmpImg; red_ad = clusterer->PerformQuantification(imgToCluster4, m_CurrentPerformClusteringResults->clusteredImage, mask); tmpImg = m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(5); mitk::Image::ConstPointer imgToCluster5 = tmpImg; red_md = clusterer->PerformQuantification(imgToCluster5, m_CurrentPerformClusteringResults->clusteredImage, mask); // clipboard QString clipboardText("FA\t%1\t%2\t"); clipboardText = clipboardText .arg(red_fa[0]).arg(red_fa[1]); QString clipboardText3("RD\t%1\t%2\t"); clipboardText3 = clipboardText3 .arg(red_rd[0]).arg(red_rd[1]); QString clipboardText4("AD\t%1\t%2\t"); clipboardText4 = clipboardText4 .arg(red_ad[0]).arg(red_ad[1]); QString clipboardText5("MD\t%1\t%2\t"); clipboardText5 = clipboardText5 .arg(red_md[0]).arg(red_md[1]); QApplication::clipboard()->setText(clipboardText+clipboardText3+clipboardText4+clipboardText5, QClipboard::Clipboard); // now paint infos also on renderwindow QString plainInfoText("%1 \n"); plainInfoText = plainInfoText .arg("Red ", 20); QString plainInfoText0("FA:%1 ± %2\n"); plainInfoText0 = plainInfoText0 .arg(red_fa[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(red_fa[1], -10, 'g', 2, QLatin1Char( ' ' )); QString plainInfoText3("RDx10³:%1 ± %2\n"); plainInfoText3 = plainInfoText3 .arg(1000.0 * red_rd[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * red_rd[1], -10, 'g', 2, QLatin1Char( ' ' )); QString plainInfoText4("ADx10³:%1 ± %2\n"); plainInfoText4 = plainInfoText4 .arg(1000.0 * red_ad[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * red_ad[1], -10, 'g', 2, QLatin1Char( ' ' )); QString plainInfoText5("MDx10³:%1 ± %2"); plainInfoText5 = plainInfoText5 .arg(1000.0 * red_md[0], 10, 'g', 2, QLatin1Char( ' ' )).arg(1000.0 * red_md[1], -10, 'g', 2, QLatin1Char( ' ' )); this->SetMeasurementInfoToRenderWindow(plainInfoText+plainInfoText0+plainInfoText3+plainInfoText4+plainInfoText5); } else { double* quant; mitk::Image* tmpImg = m_CurrentStatisticsCalculator->GetInternalImage(); mitk::Image::ConstPointer imgToCluster = tmpImg; quant = clusterer->PerformQuantification(imgToCluster, m_CurrentPerformClusteringResults->clusteredImage); // clipboard QString clipboardText("%1\t%2"); clipboardText = clipboardText.arg(quant[0]).arg(quant[1]); QApplication::clipboard()->setText(clipboardText, QClipboard::Clipboard); // now paint infos also on renderwindow QString plainInfoText("Measurement: %1 ± %2"); plainInfoText = plainInfoText.arg(quant[0]).arg(quant[1]); this->SetMeasurementInfoToRenderWindow(plainInfoText); } clusteredImage = m_CurrentPerformClusteringResults->displayImage; } if(mask.IsNotNull()) { typedef itk::Image,3> RGBImageType; typedef mitk::ImageToItk ClusterCasterType; ClusterCasterType::Pointer clCaster = ClusterCasterType::New(); clCaster->SetInput(clusteredImage); clCaster->Update(); clCaster->GetOutput(); typedef itk::MaskImageFilter< RGBImageType, MaskImageType, RGBImageType > MaskType; MaskType::Pointer masker = MaskType::New(); masker->SetInput1(clCaster->GetOutput()); masker->SetInput2(itkmask); masker->Update(); clusteredImage = mitk::Image::New(); clusteredImage->InitializeByItk(masker->GetOutput()); clusteredImage->SetVolume(masker->GetOutput()->GetBufferPointer()); } if(m_ClusteringResult.IsNotNull()) { this->GetDataStorage()->Remove(m_ClusteringResult); } m_ClusteringResult = mitk::DataNode::New(); m_ClusteringResult->SetBoolProperty("helper object", true); m_ClusteringResult->SetIntProperty( "layer", 1000 ); m_ClusteringResult->SetBoolProperty("texture interpolation", m_TexIsOn); m_ClusteringResult->SetData(clusteredImage); m_ClusteringResult->SetName("Clusterprobs"); this->GetDataStorage()->Add(m_ClusteringResult, m_SelectedImageNodes->GetNode()); if(m_SelectedPlanarFigure.IsNotNull() && m_SelectedPlanarFigureNodes->GetNode().IsNotNull()) { m_SelectedPlanarFigureNodes->GetNode()->SetIntProperty( "layer", 1001 ); } this->RequestRenderWindowUpdate(); } void QmitkPartialVolumeAnalysisView::UpdateStatistics() { if(!m_CurrentFigureNodeInitialized && m_SelectedPlanarFigure.IsNotNull()) { MITK_DEBUG << "Selected planar figure not initialized. No stats calculation performed."; return; } // Remove any cached images that are no longer referenced elsewhere this->RemoveOrphanImages(); - - QmitkStdMultiWidget *multiWidget = 0; - QmitkStdMultiWidgetEditor * multiWidgetEdit = 0; - - multiWidgetEdit = dynamic_cast(this->GetRenderWindowPart()); - if(multiWidgetEdit){ - multiWidget = multiWidgetEdit->GetStdMultiWidget(); - } - - if ( multiWidget == NULL ) - { - return; - } - if ( m_SelectedImage.IsNotNull() ) { // Check if a the selected image is a multi-channel image. If yes, statistics // cannot be calculated currently. if ( !m_IsTensorImage && m_SelectedImage->GetPixelType().GetNumberOfComponents() > 1 ) { QMessageBox::information( NULL, "Warning", "Non-tensor multi-component images not supported."); m_Controls->m_HistogramWidget->ClearItemModel(); m_CurrentStatisticsValid = false; return; } m_CurrentStatisticsCalculator = NULL; if(!m_IsTensorImage) { // Retrieve HistogramStatisticsCalculator from has map (or create a new one // for this image if non-existant) PartialVolumeAnalysisMapType::iterator it = m_PartialVolumeAnalysisMap.find( m_SelectedImage ); if ( it != m_PartialVolumeAnalysisMap.end() ) { m_CurrentStatisticsCalculator = it->second; } } if(m_CurrentStatisticsCalculator.IsNull()) { m_CurrentStatisticsCalculator = mitk::PartialVolumeAnalysisHistogramCalculator::New(); m_CurrentStatisticsCalculator->SetPlanarFigureThickness(m_Controls->m_PlanarFiguresThickness->value()); if(m_IsTensorImage) { m_CurrentStatisticsCalculator->SetImage( m_CAImage ); m_CurrentStatisticsCalculator->AddAdditionalResamplingImage( m_FAImage ); m_CurrentStatisticsCalculator->AddAdditionalResamplingImage( m_DirectionComp1Image ); m_CurrentStatisticsCalculator->AddAdditionalResamplingImage( m_DirectionComp2Image ); m_CurrentStatisticsCalculator->AddAdditionalResamplingImage( m_RDImage ); m_CurrentStatisticsCalculator->AddAdditionalResamplingImage( m_ADImage ); m_CurrentStatisticsCalculator->AddAdditionalResamplingImage( m_MDImage ); } else { m_CurrentStatisticsCalculator->SetImage( m_SelectedImage ); } m_PartialVolumeAnalysisMap[m_SelectedImage] = m_CurrentStatisticsCalculator; MITK_DEBUG << "Creating StatisticsCalculator"; } std::string maskName; std::string maskType; unsigned int maskDimension; if ( m_SelectedImageMask.IsNotNull() ) { mitk::PixelType pixelType = m_SelectedImageMask->GetPixelType(); MITK_DEBUG << pixelType.GetPixelTypeAsString(); if(pixelType.GetComponentTypeAsString() == "char") { MITK_DEBUG << "Pixel type is char instead of uchar"; return; } if(pixelType.GetBitsPerComponent() == 16) { //convert from ushort to uchar typedef itk::Image UCharImageType; UCharImageType::Pointer charImage; if(pixelType.GetComponentTypeAsString() == "short" ) { typedef itk::Image ShortImageType; ShortImageType::Pointer shortImage; mitk::CastToItkImage( m_SelectedImageMask, shortImage ); typedef itk::ImageDuplicator< ShortImageType > DuplicatorType; DuplicatorType::Pointer duplicator = DuplicatorType::New(); duplicator->SetInputImage( shortImage ); duplicator->Update(); typedef itk::CastImageFilter ImageCasterType; ImageCasterType::Pointer caster = ImageCasterType::New(); caster->SetInput( duplicator->GetOutput() ); caster->Update(); charImage = caster->GetOutput(); } else { typedef itk::Image UShortImageType; UShortImageType::Pointer shortImage; mitk::CastToItkImage( m_SelectedImageMask, shortImage ); typedef itk::ImageDuplicator< UShortImageType > DuplicatorType; DuplicatorType::Pointer duplicator = DuplicatorType::New(); duplicator->SetInputImage( shortImage ); duplicator->Update(); typedef itk::CastImageFilter ImageCasterType; ImageCasterType::Pointer caster = ImageCasterType::New(); caster->SetInput( duplicator->GetOutput() ); caster->Update(); charImage = caster->GetOutput(); } m_SelectedImageMask = nullptr; m_SelectedImageMask = mitk::Image::New(); m_SelectedImageMask->InitializeByItk( charImage.GetPointer() ); m_SelectedImageMask->SetVolume( charImage->GetBufferPointer() ); mitk::CastToMitkImage(charImage, m_SelectedImageMask); } m_CurrentStatisticsCalculator->SetImageMask( m_SelectedImageMask ); m_CurrentStatisticsCalculator->SetMaskingModeToImage(); maskName = m_SelectedMaskNode->GetName(); maskType = m_SelectedImageMask->GetNameOfClass(); maskDimension = 3; std::stringstream maskLabel; maskLabel << maskName; if ( maskDimension > 0 ) { maskLabel << " [" << maskDimension << "D " << maskType << "]"; } m_Controls->m_SelectedMaskLabel->setText( maskLabel.str().c_str() ); } else if ( m_SelectedPlanarFigure.IsNotNull() && m_SelectedPlanarFigureNodes->GetNode().IsNotNull()) { m_CurrentStatisticsCalculator->SetPlanarFigure( m_SelectedPlanarFigure ); m_CurrentStatisticsCalculator->SetMaskingModeToPlanarFigure(); maskName = m_SelectedPlanarFigureNodes->GetNode()->GetName(); maskType = m_SelectedPlanarFigure->GetNameOfClass(); maskDimension = 2; } else { m_CurrentStatisticsCalculator->SetMaskingModeToNone(); maskName = "-"; maskType = ""; maskDimension = 0; } bool statisticsChanged = false; bool statisticsCalculationSuccessful = false; // Initialize progress bar mitk::ProgressBar::GetInstance()->AddStepsToDo( 100 ); // Install listener for progress events and initialize progress bar typedef itk::SimpleMemberCommand< QmitkPartialVolumeAnalysisView > ITKCommandType; ITKCommandType::Pointer progressListener; progressListener = ITKCommandType::New(); progressListener->SetCallbackFunction( this, &QmitkPartialVolumeAnalysisView::UpdateProgressBar ); unsigned long progressObserverTag = m_CurrentStatisticsCalculator ->AddObserver( itk::ProgressEvent(), progressListener ); ClusteringType::ParamsType *cparams = 0; ClusteringType::ClusterResultType *cresult = 0; ClusteringType::HistType *chist = 0; try { m_CurrentStatisticsCalculator->SetNumberOfBins(m_Controls->m_NumberBins->text().toInt()); m_CurrentStatisticsCalculator->SetUpsamplingFactor(m_Controls->m_Upsampling->text().toDouble()); m_CurrentStatisticsCalculator->SetGaussianSigma(m_Controls->m_GaussianSigma->text().toDouble()); // Compute statistics statisticsChanged = m_CurrentStatisticsCalculator->ComputeStatistics( ); mitk::Image* tmpImg = m_CurrentStatisticsCalculator->GetInternalImage(); mitk::Image::ConstPointer imgToCluster = tmpImg; if(imgToCluster.IsNotNull()) { // perform clustering const HistogramType *histogram = m_CurrentStatisticsCalculator->GetHistogram( ); if(histogram != NULL) { ClusteringType::Pointer clusterer = ClusteringType::New(); clusterer->SetStepsNumIntegration(200); clusterer->SetMaxIt(1000); mitk::Image::Pointer pFiberImg; if(m_QuantifyClass==3) { if(m_Controls->m_Quantiles->isChecked()) { m_CurrentRGBClusteringResults = clusterer->PerformRGBQuantiles(imgToCluster, histogram, m_Controls->m_q1->value(),m_Controls->m_q2->value()); } else { m_CurrentRGBClusteringResults = clusterer->PerformRGBClustering(imgToCluster, histogram); } pFiberImg = m_CurrentRGBClusteringResults->rgbChannels->r; cparams = m_CurrentRGBClusteringResults->params; cresult = m_CurrentRGBClusteringResults->result; chist = m_CurrentRGBClusteringResults->hist; } else { if(m_Controls->m_Quantiles->isChecked()) { m_CurrentPerformClusteringResults = clusterer->PerformQuantiles(imgToCluster, histogram, m_Controls->m_q1->value(),m_Controls->m_q2->value()); } else { m_CurrentPerformClusteringResults = clusterer->PerformClustering(imgToCluster, histogram, m_QuantifyClass); } pFiberImg = m_CurrentPerformClusteringResults->clusteredImage; cparams = m_CurrentPerformClusteringResults->params; cresult = m_CurrentPerformClusteringResults->result; chist = m_CurrentPerformClusteringResults->hist; } if(m_IsTensorImage) { m_AngularErrorImage = clusterer->CaculateAngularErrorImage( m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(1), m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(2), pFiberImg); - // GetDefaultDataStorage()->Remove(m_newnode2); + // GetDataStorage()->Remove(m_newnode2); // m_newnode2 = mitk::DataNode::New(); // m_newnode2->SetData(m_AngularErrorImage); // m_newnode2->SetName(("AngularError")); // m_newnode2->SetIntProperty( "layer", 1003 ); - // GetDefaultDataStorage()->Add(m_newnode2, m_SelectedImageNodes->GetNode()); + // GetDataStorage()->Add(m_newnode2, m_SelectedImageNodes->GetNode()); // newnode = mitk::DataNode::New(); // newnode->SetData(m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(1)); // newnode->SetName(("Comp1")); - // GetDefaultDataStorage()->Add(newnode, m_SelectedImageNodes->GetNode()); + // GetDataStorage()->Add(newnode, m_SelectedImageNodes->GetNode()); // newnode = mitk::DataNode::New(); // newnode->SetData(m_CurrentStatisticsCalculator->GetInternalAdditionalResampledImage(2)); // newnode->SetName(("Comp2")); - // GetDefaultDataStorage()->Add(newnode, m_SelectedImageNodes->GetNode()); + // GetDataStorage()->Add(newnode, m_SelectedImageNodes->GetNode()); } ShowClusteringResults(); } } statisticsCalculationSuccessful = true; } catch ( const std::runtime_error &e ) { QMessageBox::information( NULL, "Warning", e.what()); } catch ( const std::exception &e ) { MITK_ERROR << "Caught exception: " << e.what(); QMessageBox::information( NULL, "Warning", e.what()); } m_CurrentStatisticsCalculator->RemoveObserver( progressObserverTag ); // Make sure that progress bar closes mitk::ProgressBar::GetInstance()->Progress( 100 ); if ( statisticsCalculationSuccessful ) { if ( statisticsChanged ) { // Do not show any error messages m_CurrentStatisticsValid = true; } // m_Controls->m_HistogramWidget->SetHistogramModeToDirectHistogram(); m_Controls->m_HistogramWidget->SetParameters( cparams, cresult, chist ); // m_Controls->m_HistogramWidget->UpdateItemModelFromHistogram(); } else { m_Controls->m_SelectedMaskLabel->setText("mandatory"); // Clear statistics and histogram m_Controls->m_HistogramWidget->ClearItemModel(); m_CurrentStatisticsValid = false; // If a (non-closed) PlanarFigure is selected, display a line profile widget if ( m_SelectedPlanarFigure.IsNotNull() ) { // TODO: enable line profile widget //m_Controls->m_StatisticsWidgetStack->setCurrentIndex( 1 ); //m_Controls->m_LineProfileWidget->SetImage( m_SelectedImage ); //m_Controls->m_LineProfileWidget->SetPlanarFigure( m_SelectedPlanarFigure ); //m_Controls->m_LineProfileWidget->UpdateItemModelFromPath(); } } } } void QmitkPartialVolumeAnalysisView::SetMeasurementInfoToRenderWindow(const QString& text) { FindRenderWindow(m_SelectedPlanarFigureNodes->GetNode()); if(m_LastRenderWindow != m_SelectedRenderWindow) { if(m_LastRenderWindow) { QObject::disconnect( m_LastRenderWindow, SIGNAL( destroyed(QObject*) ) , this, SLOT( OnRenderWindowDelete(QObject*) ) ); } m_LastRenderWindow = m_SelectedRenderWindow; if(m_LastRenderWindow) { QObject::connect( m_LastRenderWindow, SIGNAL( destroyed(QObject*) ) , this, SLOT( OnRenderWindowDelete(QObject*) ) ); } } if(m_LastRenderWindow && m_SelectedPlanarFigureNodes->GetNode().IsNotNull()) { if (!text.isEmpty()) { m_MeasurementInfoAnnotation->SetText(1, text.toLatin1().data()); mitk::VtkLayerController::GetInstance(m_LastRenderWindow->GetRenderWindow())->InsertForegroundRenderer( m_MeasurementInfoRenderer, true); } else { if (mitk::VtkLayerController::GetInstance( m_LastRenderWindow->GetRenderWindow()) ->IsRendererInserted( m_MeasurementInfoRenderer)) mitk::VtkLayerController::GetInstance(m_LastRenderWindow->GetRenderWindow())->RemoveRenderer( m_MeasurementInfoRenderer); } } else { - QmitkStdMultiWidget *multiWidget = 0; - QmitkStdMultiWidgetEditor * multiWidgetEdit = 0; + mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); - multiWidgetEdit = dynamic_cast(this->GetRenderWindowPart()); - if(multiWidgetEdit){ - multiWidget = multiWidgetEdit->GetStdMultiWidget(); - } - - if ( multiWidget == NULL ) + if ( renderWindowPart == nullptr ) { return; } if (!text.isEmpty()) { m_MeasurementInfoAnnotation->SetText(1, text.toLatin1().data()); - mitk::VtkLayerController::GetInstance(multiWidget->GetRenderWindow1()->GetRenderWindow())->InsertForegroundRenderer( + mitk::VtkLayerController::GetInstance(renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderWindow())->InsertForegroundRenderer( m_MeasurementInfoRenderer, true); } else { if (mitk::VtkLayerController::GetInstance( - multiWidget->GetRenderWindow1()->GetRenderWindow()) ->IsRendererInserted( + renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderWindow()) ->IsRendererInserted( m_MeasurementInfoRenderer)) - mitk::VtkLayerController::GetInstance(multiWidget->GetRenderWindow1()->GetRenderWindow())->RemoveRenderer( + mitk::VtkLayerController::GetInstance(renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderWindow())->RemoveRenderer( m_MeasurementInfoRenderer); } } } void QmitkPartialVolumeAnalysisView::UpdateProgressBar() { mitk::ProgressBar::GetInstance()->Progress(); } void QmitkPartialVolumeAnalysisView::RequestStatisticsUpdate() { if ( !m_StatisticsUpdatePending ) { QApplication::postEvent( this, new QmitkRequestStatisticsUpdateEvent ); m_StatisticsUpdatePending = true; } } void QmitkPartialVolumeAnalysisView::RemoveOrphanImages() { PartialVolumeAnalysisMapType::iterator it = m_PartialVolumeAnalysisMap.begin(); while ( it != m_PartialVolumeAnalysisMap.end() ) { mitk::Image *image = it->first; mitk::PartialVolumeAnalysisHistogramCalculator *calculator = it->second; ++it; mitk::NodePredicateData::Pointer hasImage = mitk::NodePredicateData::New( image ); if ( this->GetDataStorage()->GetNode( hasImage ) == NULL ) { if ( m_SelectedImage == image ) { m_SelectedImage = NULL; m_SelectedImageNodes->RemoveAllNodes(); } if ( m_CurrentStatisticsCalculator == calculator ) { m_CurrentStatisticsCalculator = NULL; } m_PartialVolumeAnalysisMap.erase( image ); it = m_PartialVolumeAnalysisMap.begin(); } } } void QmitkPartialVolumeAnalysisView::ExtractTensorImages( mitk::Image::Pointer tensorimage) { typedef itk::Image< itk::DiffusionTensor3D, 3> TensorImageType; typedef mitk::ImageToItk CastType; CastType::Pointer caster = CastType::New(); caster->SetInput(tensorimage); caster->Update(); TensorImageType::Pointer image = caster->GetOutput(); typedef itk::TensorDerivedMeasurementsFilter MeasurementsType; MeasurementsType::Pointer measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(image ); measurementsCalculator->SetMeasure(MeasurementsType::FA); measurementsCalculator->Update(); MeasurementsType::OutputImageType::Pointer fa = measurementsCalculator->GetOutput(); m_FAImage = mitk::Image::New(); m_FAImage->InitializeByItk(fa.GetPointer()); m_FAImage->SetVolume(fa->GetBufferPointer()); // mitk::DataNode::Pointer node = mitk::DataNode::New(); // node->SetData(m_FAImage); - // GetDefaultDataStorage()->Add(node); + // GetDataStorage()->Add(node); measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(image ); measurementsCalculator->SetMeasure(MeasurementsType::CA); measurementsCalculator->Update(); MeasurementsType::OutputImageType::Pointer ca = measurementsCalculator->GetOutput(); m_CAImage = mitk::Image::New(); m_CAImage->InitializeByItk(ca.GetPointer()); m_CAImage->SetVolume(ca->GetBufferPointer()); // node = mitk::DataNode::New(); // node->SetData(m_CAImage); - // GetDefaultDataStorage()->Add(node); + // GetDataStorage()->Add(node); measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(image ); measurementsCalculator->SetMeasure(MeasurementsType::RD); measurementsCalculator->Update(); MeasurementsType::OutputImageType::Pointer rd = measurementsCalculator->GetOutput(); m_RDImage = mitk::Image::New(); m_RDImage->InitializeByItk(rd.GetPointer()); m_RDImage->SetVolume(rd->GetBufferPointer()); // node = mitk::DataNode::New(); // node->SetData(m_CAImage); - // GetDefaultDataStorage()->Add(node); + // GetDataStorage()->Add(node); measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(image ); measurementsCalculator->SetMeasure(MeasurementsType::AD); measurementsCalculator->Update(); MeasurementsType::OutputImageType::Pointer ad = measurementsCalculator->GetOutput(); m_ADImage = mitk::Image::New(); m_ADImage->InitializeByItk(ad.GetPointer()); m_ADImage->SetVolume(ad->GetBufferPointer()); // node = mitk::DataNode::New(); // node->SetData(m_CAImage); - // GetDefaultDataStorage()->Add(node); + // GetDataStorage()->Add(node); measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(image ); measurementsCalculator->SetMeasure(MeasurementsType::RA); measurementsCalculator->Update(); MeasurementsType::OutputImageType::Pointer md = measurementsCalculator->GetOutput(); m_MDImage = mitk::Image::New(); m_MDImage->InitializeByItk(md.GetPointer()); m_MDImage->SetVolume(md->GetBufferPointer()); // node = mitk::DataNode::New(); // node->SetData(m_CAImage); - // GetDefaultDataStorage()->Add(node); + // GetDataStorage()->Add(node); typedef DirectionsFilterType::OutputImageType DirImageType; DirectionsFilterType::Pointer dirFilter = DirectionsFilterType::New(); dirFilter->SetInput(image ); dirFilter->Update(); itk::ImageRegionIterator itd(dirFilter->GetOutput(), dirFilter->GetOutput()->GetLargestPossibleRegion()); itd = itd.Begin(); while( !itd.IsAtEnd() ) { DirImageType::PixelType direction = itd.Get(); direction[0] = fabs(direction[0]); direction[1] = fabs(direction[1]); direction[2] = fabs(direction[2]); itd.Set(direction); ++itd; } typedef itk::CartesianToPolarVectorImageFilter< DirImageType, DirImageType, true> C2PFilterType; C2PFilterType::Pointer cpFilter = C2PFilterType::New(); cpFilter->SetInput(dirFilter->GetOutput()); cpFilter->Update(); DirImageType::Pointer dir = cpFilter->GetOutput(); typedef itk::Image CompImageType; CompImageType::Pointer comp1 = CompImageType::New(); comp1->SetSpacing( dir->GetSpacing() ); // Set the image spacing comp1->SetOrigin( dir->GetOrigin() ); // Set the image origin comp1->SetDirection( dir->GetDirection() ); // Set the image direction comp1->SetRegions( dir->GetLargestPossibleRegion() ); comp1->Allocate(); CompImageType::Pointer comp2 = CompImageType::New(); comp2->SetSpacing( dir->GetSpacing() ); // Set the image spacing comp2->SetOrigin( dir->GetOrigin() ); // Set the image origin comp2->SetDirection( dir->GetDirection() ); // Set the image direction comp2->SetRegions( dir->GetLargestPossibleRegion() ); comp2->Allocate(); itk::ImageRegionConstIterator it(dir, dir->GetLargestPossibleRegion()); itk::ImageRegionIterator it1(comp1, comp1->GetLargestPossibleRegion()); itk::ImageRegionIterator it2(comp2, comp2->GetLargestPossibleRegion()); it = it.Begin(); it1 = it1.Begin(); it2 = it2.Begin(); while( !it.IsAtEnd() ) { it1.Set(it.Get()[1]); it2.Set(it.Get()[2]); ++it; ++it1; ++it2; } m_DirectionComp1Image = mitk::Image::New(); m_DirectionComp1Image->InitializeByItk(comp1.GetPointer()); m_DirectionComp1Image->SetVolume(comp1->GetBufferPointer()); m_DirectionComp2Image = mitk::Image::New(); m_DirectionComp2Image->InitializeByItk(comp2.GetPointer()); m_DirectionComp2Image->SetVolume(comp2->GetBufferPointer()); } void QmitkPartialVolumeAnalysisView::OnRenderWindowDelete(QObject * obj) { if(obj == m_LastRenderWindow) m_LastRenderWindow = 0; if(obj == m_SelectedRenderWindow) m_SelectedRenderWindow = 0; } bool QmitkPartialVolumeAnalysisView::event( QEvent *event ) { if ( event->type() == (QEvent::Type) QmitkRequestStatisticsUpdateEvent::StatisticsUpdateRequest ) { // Update statistics m_StatisticsUpdatePending = false; this->UpdateStatistics(); return true; } return false; } -bool QmitkPartialVolumeAnalysisView::IsExclusiveFunctionality() const -{ - return true; -} - void QmitkPartialVolumeAnalysisView::Activated() { mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDataStorage()->GetAll(); mitk::DataNode* node = 0; mitk::PlanarFigure* figure = 0; mitk::PlanarFigureInteractor::Pointer figureInteractor = 0; // finally add all nodes to the model for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End() ; it++) { node = const_cast(it->Value().GetPointer()); figure = dynamic_cast(node->GetData()); if(figure) { figureInteractor = dynamic_cast(node->GetDataInteractor().GetPointer()); if(figureInteractor.IsNull()) { figureInteractor = mitk::PlanarFigureInteractor::New(); us::Module* planarFigureModule = us::ModuleRegistry::GetModule( "MitkPlanarFigure" ); figureInteractor->LoadStateMachine("PlanarFigureInteraction.xml", planarFigureModule ); figureInteractor->SetEventConfig( "PlanarFigureConfig.xml", planarFigureModule ); figureInteractor->SetDataNode( node ); } } } } void QmitkPartialVolumeAnalysisView::Deactivated() { } void QmitkPartialVolumeAnalysisView::ActivatedZombieView(berry::IWorkbenchPartReference::Pointer reference) { this->SetMeasurementInfoToRenderWindow(""); mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDataStorage()->GetAll(); mitk::DataNode* node = 0; mitk::PlanarFigure* figure = 0; mitk::PlanarFigureInteractor::Pointer figureInteractor = 0; // finally add all nodes to the model for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End() ; it++) { node = const_cast(it->Value().GetPointer()); figure = dynamic_cast(node->GetData()); if(figure) { figureInteractor = dynamic_cast(node->GetDataInteractor().GetPointer()); if(figureInteractor) figureInteractor->SetDataNode( NULL ); } } } void QmitkPartialVolumeAnalysisView::Hidden() { if (m_ClusteringResult.IsNotNull()) { this->GetDataStorage()->Remove(m_ClusteringResult); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } Select(NULL, true, true); m_Visible = false; } void QmitkPartialVolumeAnalysisView::Visible() { m_Visible = true; berry::IWorkbenchPart::Pointer bla; if (!this->GetCurrentSelection().empty()) { this->OnSelectionChanged(bla, this->GetCurrentSelection()); } else { this->OnSelectionChanged(bla, this->GetDataManagerSelection()); } } -void QmitkPartialVolumeAnalysisView::SetFocus() -{ - -} - - void QmitkPartialVolumeAnalysisView::GreenRadio(bool checked) { if(checked) { m_Controls->m_PartialVolumeRadio->setChecked(false); m_Controls->m_BlueRadio->setChecked(false); m_Controls->m_AllRadio->setChecked(false); m_Controls->m_ExportClusteringResultsButton->setEnabled(true); } m_QuantifyClass = 0; RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::PartialVolumeRadio(bool checked) { if(checked) { m_Controls->m_GreenRadio->setChecked(false); m_Controls->m_BlueRadio->setChecked(false); m_Controls->m_AllRadio->setChecked(false); m_Controls->m_ExportClusteringResultsButton->setEnabled(true); } m_QuantifyClass = 1; RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::BlueRadio(bool checked) { if(checked) { m_Controls->m_PartialVolumeRadio->setChecked(false); m_Controls->m_GreenRadio->setChecked(false); m_Controls->m_AllRadio->setChecked(false); m_Controls->m_ExportClusteringResultsButton->setEnabled(true); } m_QuantifyClass = 2; RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::AllRadio(bool checked) { if(checked) { m_Controls->m_BlueRadio->setChecked(false); m_Controls->m_PartialVolumeRadio->setChecked(false); m_Controls->m_GreenRadio->setChecked(false); m_Controls->m_ExportClusteringResultsButton->setEnabled(false); } m_QuantifyClass = 3; RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::NumberBinsChangedSlider(int v ) { m_Controls->m_NumberBins->setText(QString("%1").arg(m_Controls->m_NumberBinsSlider->value()*5.0)); } void QmitkPartialVolumeAnalysisView::UpsamplingChangedSlider( int v) { m_Controls->m_Upsampling->setText(QString("%1").arg(m_Controls->m_UpsamplingSlider->value()/10.0)); } void QmitkPartialVolumeAnalysisView::GaussianSigmaChangedSlider(int v ) { m_Controls->m_GaussianSigma->setText(QString("%1").arg(m_Controls->m_GaussianSigmaSlider->value()/100.0)); } void QmitkPartialVolumeAnalysisView::SimilarAnglesChangedSlider(int v ) { m_Controls->m_SimilarAngles->setText(QString("%1°").arg(90-m_Controls->m_SimilarAnglesSlider->value())); ShowClusteringResults(); } void QmitkPartialVolumeAnalysisView::OpacityChangedSlider(int v ) { if(m_SelectedImageNodes->GetNode().IsNotNull()) { float opacImag = 1.0f-(v-5)/5.0f; opacImag = opacImag < 0 ? 0 : opacImag; m_SelectedImageNodes->GetNode()->SetFloatProperty("opacity", opacImag); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } if(m_ClusteringResult.IsNotNull()) { float opacClust = v/5.0f; opacClust = opacClust > 1 ? 1 : opacClust; m_ClusteringResult->SetFloatProperty("opacity", opacClust); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkPartialVolumeAnalysisView::NumberBinsReleasedSlider( ) { RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::UpsamplingReleasedSlider( ) { RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::GaussianSigmaReleasedSlider( ) { RequestStatisticsUpdate(); } void QmitkPartialVolumeAnalysisView::SimilarAnglesReleasedSlider( ) { } void QmitkPartialVolumeAnalysisView::ToClipBoard() { std::vector* > vals = m_Controls->m_HistogramWidget->m_Vals; QString clipboardText; for (std::vector* >::iterator it = vals.begin(); it != vals.end(); ++it) { for (std::vector::iterator it2 = (**it).begin(); it2 != (**it).end(); ++it2) { clipboardText.append(QString("%1 \t").arg(*it2)); } clipboardText.append(QString("\n")); } QApplication::clipboard()->setText(clipboardText, QClipboard::Clipboard); } void QmitkPartialVolumeAnalysisView::PropertyChanged(const mitk::DataNode* /*node*/, const mitk::BaseProperty* /*prop*/) { } void QmitkPartialVolumeAnalysisView::NodeChanged(const mitk::DataNode* /*node*/) { } void QmitkPartialVolumeAnalysisView::NodeRemoved(const mitk::DataNode* node) { if (dynamic_cast(node->GetData())) this->GetDataStorage()->Remove(m_ClusteringResult); if( node == m_SelectedPlanarFigureNodes->GetNode().GetPointer() || node == m_SelectedMaskNode.GetPointer() ) { this->Select(NULL,true,false); SetMeasurementInfoToRenderWindow(""); } if( node == m_SelectedImageNodes->GetNode().GetPointer() ) { this->Select(NULL,false,true); SetMeasurementInfoToRenderWindow(""); } } void QmitkPartialVolumeAnalysisView::NodeAddedInDataStorage(const mitk::DataNode* node) { if(!m_Visible) return; mitk::DataNode* nonConstNode = const_cast(node); mitk::PlanarFigure* figure = dynamic_cast(nonConstNode->GetData()); if(figure) { // set interactor for new node (if not already set) mitk::PlanarFigureInteractor::Pointer figureInteractor = dynamic_cast(node->GetDataInteractor().GetPointer()); if(figureInteractor.IsNull()) { figureInteractor = mitk::PlanarFigureInteractor::New(); us::Module* planarFigureModule = us::ModuleRegistry::GetModule( "MitkPlanarFigure" ); figureInteractor->LoadStateMachine("PlanarFigureInteraction.xml", planarFigureModule ); figureInteractor->SetEventConfig( "PlanarFigureConfig.xml", planarFigureModule ); figureInteractor->SetDataNode( nonConstNode ); } // remove uninitialized old planars if( m_SelectedPlanarFigureNodes->GetNode().IsNotNull() && m_CurrentFigureNodeInitialized == false ) { this->GetDataStorage()->Remove(m_SelectedPlanarFigureNodes->GetNode()); } } } void QmitkPartialVolumeAnalysisView::TextIntON() { if(m_ClusteringResult.IsNotNull()) { if(m_TexIsOn) { m_Controls->m_TextureIntON->setIcon(*m_IconTexOFF); } else { m_Controls->m_TextureIntON->setIcon(*m_IconTexON); } m_ClusteringResult->SetBoolProperty("texture interpolation", !m_TexIsOn); m_TexIsOn = !m_TexIsOn; this->RequestRenderWindowUpdate(); } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.h index 77cd111de9..75b9d2443b 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.partialvolume/src/internal/QmitkPartialVolumeAnalysisView.h @@ -1,282 +1,272 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #if !defined(QmitkPartialVolumeAnalysisView_H__INCLUDED) #define QmitkPartialVolumeAnalysisView_H__INCLUDED -//#include "QmitkFunctionality.h" #include "ui_QmitkPartialVolumeAnalysisViewControls.h" #include #include #include // berry #include #include // itk #include #include #include // qmitk #include "QmitkStepperAdapter.h" #include "QmitkRenderWindow.h" // mitk #include "mitkPartialVolumeAnalysisHistogramCalculator.h" #include "mitkPlanarLine.h" #include #include "mitkDataStorageSelection.h" #include // vtk #include #include #include //#include "itkProcessObject.h" /*! \brief QmitkPartialVolumeAnalysis - -\sa QmitkFunctionality -\ingroup Functionalities */ class QmitkPartialVolumeAnalysisView : public QmitkAbstractView, public mitk::IZombieViewPart//, public itk::ProcessObject { Q_OBJECT public: /*! \ Convenient typedefs */ typedef mitk::DataStorage::SetOfObjects ConstVector; typedef ConstVector::ConstPointer ConstVectorPointer; typedef ConstVector::ConstIterator ConstVectorIterator; typedef mitk::PartialVolumeAnalysisHistogramCalculator HistogramCalculatorType; typedef HistogramCalculatorType::HistogramType HistogramType; typedef mitk::PartialVolumeAnalysisClusteringCalculator ClusteringType; typedef itk::DiffusionTensorPrincipalDirectionImageFilter DirectionsFilterType; /*! \brief default constructor */ QmitkPartialVolumeAnalysisView(QObject *parent=0, const char *name=0); /*! \brief default destructor */ virtual ~QmitkPartialVolumeAnalysisView(); /*! \brief method for creating the widget containing the application controls, like sliders, buttons etc. */ virtual void CreateQtPartControl(QWidget *parent) override; /*! \brief method for creating the connections of main and control widget */ virtual void CreateConnections(); - bool IsExclusiveFunctionality() const; - virtual bool event( QEvent *event ) override; - virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList &nodes) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; virtual void Activated() override; virtual void Deactivated() override; virtual void ActivatedZombieView(berry::IWorkbenchPartReference::Pointer reference) override; virtual void Hidden() override; virtual void Visible() override; virtual void SetFocus() override; bool AssertDrawingIsPossible(bool checked); virtual void NodeChanged(const mitk::DataNode* node) override; virtual void PropertyChanged(const mitk::DataNode* node, const mitk::BaseProperty* prop); virtual void NodeRemoved(const mitk::DataNode* node) override; virtual void NodeAddedInDataStorage(const mitk::DataNode* node); virtual void AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name, const char *propertyKey = NULL, mitk::BaseProperty *property = NULL ); void PlanarFigureInitialized(); void PlanarFigureFocus(mitk::DataNode* node); void ShowClusteringResults(); static const std::string VIEW_ID; protected slots: void EstimateCircle(); void SetHistogramVisibility(); void SetAdvancedVisibility(); void NumberBinsChangedSlider(int v ); void UpsamplingChangedSlider( int v ); void GaussianSigmaChangedSlider( int v ); void SimilarAnglesChangedSlider(int v ); void OpacityChangedSlider(int v ); void NumberBinsReleasedSlider( ); void UpsamplingReleasedSlider( ); void GaussianSigmaReleasedSlider( ); void SimilarAnglesReleasedSlider( ); void ActionDrawEllipseTriggered(); void ActionDrawRectangleTriggered(); void ActionDrawPolygonTriggered(); void ToClipBoard(); void GreenRadio(bool checked); void PartialVolumeRadio(bool checked); void BlueRadio(bool checked); void AllRadio(bool checked); void OnRenderWindowDelete(QObject * obj); void TextIntON(); void ExportClusteringResults(); protected: - //void StdMultiWidgetAvailable( QmitkStdMultiWidget& stdMultiWidget ); - /** \brief Issues a request to update statistics by sending an event to the * Qt event processing queue. * * Statistics update should only be executed after program execution returns * to the Qt main loop. This mechanism also prevents multiple execution of * updates where only one is required.*/ void RequestStatisticsUpdate(); /** \brief Recalculate statistics for currently selected image and mask and * update the GUI. */ void UpdateStatistics(); /** \brief Listener for progress events to update progress bar. */ void UpdateProgressBar(); /** \brief Removes any cached images which are no longer referenced elsewhere. */ void RemoveOrphanImages(); void Select( mitk::DataNode::Pointer node, bool clearMaskOnFirstArgNULL=false, bool clearImageOnFirstArgNULL=false ); void SetMeasurementInfoToRenderWindow(const QString& text); void FindRenderWindow(mitk::DataNode* node); void ExtractTensorImages( mitk::Image::Pointer tensorimage); typedef std::map< mitk::Image *, mitk::PartialVolumeAnalysisHistogramCalculator::Pointer > PartialVolumeAnalysisMapType; -// void OnSelectionChanged(const QList &nodes); - /*! * controls containing sliders for scrolling through the slices */ Ui::QmitkPartialVolumeAnalysisViewControls *m_Controls; QmitkStepperAdapter* m_TimeStepperAdapter; unsigned int m_CurrentTime; QString m_Clipboard; // result text rendering vtkRenderer * m_MeasurementInfoRenderer; vtkCornerAnnotation *m_MeasurementInfoAnnotation; // Image and mask data mitk::DataStorageSelection::Pointer m_SelectedImageNodes; mitk::Image::Pointer m_SelectedImage; mitk::DataNode::Pointer m_SelectedMaskNode; mitk::Image::Pointer m_SelectedImageMask; mitk::DataStorageSelection::Pointer m_SelectedPlanarFigureNodes; mitk::PlanarFigure::Pointer m_SelectedPlanarFigure; bool m_IsTensorImage; mitk::Image::Pointer m_FAImage; mitk::Image::Pointer m_CAImage; mitk::Image::Pointer m_RDImage; mitk::Image::Pointer m_ADImage; mitk::Image::Pointer m_MDImage; // mitk::Image::Pointer m_DirectionImage; mitk::Image::Pointer m_DirectionComp1Image; mitk::Image::Pointer m_DirectionComp2Image; mitk::Image::Pointer m_AngularErrorImage; QmitkRenderWindow* m_SelectedRenderWindow; QmitkRenderWindow* m_LastRenderWindow; long m_ImageObserverTag; long m_ImageMaskObserverTag; long m_PlanarFigureObserverTag; // Hash map for associating one image statistics calculator with each iamge // (so that previously calculated histograms / statistics can be recovered // if a recalculation is not required) PartialVolumeAnalysisMapType m_PartialVolumeAnalysisMap; HistogramCalculatorType::Pointer m_CurrentStatisticsCalculator; bool m_CurrentStatisticsValid; bool m_StatisticsUpdatePending; bool m_GaussianSigmaChangedSliding; bool m_NumberBinsSliding; bool m_UpsamplingChangedSliding; bool m_Visible; mitk::DataNode::Pointer m_ClusteringResult; int m_EllipseCounter; int m_RectangleCounter; int m_PolygonCounter; unsigned int m_InitializedObserverTag; bool m_CurrentFigureNodeInitialized; int m_QuantifyClass; ClusteringType::HelperStructPerformRGBClusteringRetval* m_CurrentRGBClusteringResults; ClusteringType::HelperStructPerformClusteringRetval *m_CurrentPerformClusteringResults; // mitk::DataNode::Pointer m_newnode; // mitk::DataNode::Pointer m_newnode2; QIcon* m_IconTexOFF; QIcon* m_IconTexON; bool m_TexIsOn; }; #endif // !defined(QmitkPartialVolumeAnalysis_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.cpp index 51552d60d0..17afa5d617 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.cpp @@ -1,2337 +1,2332 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //#define MBILOG_ENABLE_DEBUG #include "QmitkPreprocessingView.h" #include "mitkDiffusionImagingConfigure.h" // qt includes #include // itk includes #include "itkTimeProbe.h" #include "itkB0ImageExtractionImageFilter.h" #include "itkB0ImageExtractionToSeparateImageFilter.h" #include "itkBrainMaskExtractionImageFilter.h" #include "itkCastImageFilter.h" #include "itkVectorContainer.h" #include #include #include #include #include #include // Multishell includes #include // Multishell Functors #include #include #include #include // mitk includes #include "QmitkDataStorageComboBox.h" -#include "QmitkStdMultiWidget.h" #include "mitkProgressBar.h" #include "mitkStatusBar.h" #include "mitkNodePredicateDataType.h" #include "mitkProperties.h" #include "mitkVtkResliceInterpolationProperty.h" #include "mitkLookupTable.h" #include "mitkLookupTableProperty.h" #include "mitkTransferFunction.h" #include "mitkTransferFunctionProperty.h" #include "mitkDataNodeObject.h" #include "mitkOdfNormalizationMethodProperty.h" #include "mitkOdfScaleByProperty.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const std::string QmitkPreprocessingView::VIEW_ID = "org.mitk.views.preprocessing"; #define DI_INFO MITK_INFO("DiffusionImaging") typedef float TTensorPixelType; QmitkPreprocessingView::QmitkPreprocessingView() - : QmitkFunctionality(), - m_Controls(NULL), - m_MultiWidget(NULL) + : QmitkAbstractView(), + m_Controls(NULL) { } QmitkPreprocessingView::~QmitkPreprocessingView() { } void QmitkPreprocessingView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkPreprocessingViewControls; m_Controls->setupUi(parent); this->CreateConnections(); m_Controls->m_MeasurementFrameTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_Controls->m_MeasurementFrameTable->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_Controls->m_DirectionMatrixTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_Controls->m_DirectionMatrixTable->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); } } -void QmitkPreprocessingView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkPreprocessingView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - -void QmitkPreprocessingView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->m_MirrorGradientToHalfSphereButton->setFocus(); } void QmitkPreprocessingView::CreateConnections() { if ( m_Controls ) { m_Controls->m_NormalizationMaskBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_SelctedImageComboBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_MergeDwiBox->SetDataStorage(this->GetDataStorage()); mitk::TNodePredicateDataType::Pointer isMitkImage = mitk::TNodePredicateDataType::New(); mitk::NodePredicateDataType::Pointer isDti = mitk::NodePredicateDataType::New("TensorImage"); mitk::NodePredicateDataType::Pointer isQbi = mitk::NodePredicateDataType::New("QBallImage"); mitk::NodePredicateOr::Pointer isDiffusionImage = mitk::NodePredicateOr::New(isQbi, isDti); mitk::NodePredicateAnd::Pointer noDiffusionImage = mitk::NodePredicateAnd::New(isMitkImage, mitk::NodePredicateNot::New(isDiffusionImage)); mitk::NodePredicateProperty::Pointer isBinaryPredicate = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); mitk::NodePredicateAnd::Pointer binaryNoDiffusionImage = mitk::NodePredicateAnd::New(noDiffusionImage, isBinaryPredicate); m_Controls->m_NormalizationMaskBox->SetPredicate(binaryNoDiffusionImage); m_Controls->m_SelctedImageComboBox->SetPredicate(noDiffusionImage); m_Controls->m_MergeDwiBox->SetPredicate(isMitkImage); m_Controls->m_ExtractBrainMask->setVisible(false); m_Controls->m_BrainMaskIterationsBox->setVisible(false); m_Controls->m_ResampleIntFrame->setVisible(false); connect( (QObject*)(m_Controls->m_ButtonAverageGradients), SIGNAL(clicked()), this, SLOT(AverageGradients()) ); connect( (QObject*)(m_Controls->m_ButtonExtractB0), SIGNAL(clicked()), this, SLOT(ExtractB0()) ); connect( (QObject*)(m_Controls->m_ModifyMeasurementFrame), SIGNAL(clicked()), this, SLOT(DoApplyMesurementFrame()) ); connect( (QObject*)(m_Controls->m_ReduceGradientsButton), SIGNAL(clicked()), this, SLOT(DoReduceGradientDirections()) ); connect( (QObject*)(m_Controls->m_ShowGradientsButton), SIGNAL(clicked()), this, SLOT(DoShowGradientDirections()) ); connect( (QObject*)(m_Controls->m_MirrorGradientToHalfSphereButton), SIGNAL(clicked()), this, SLOT(DoHalfSphereGradientDirections()) ); connect( (QObject*)(m_Controls->m_MergeDwisButton), SIGNAL(clicked()), this, SLOT(MergeDwis()) ); connect( (QObject*)(m_Controls->m_ProjectSignalButton), SIGNAL(clicked()), this, SLOT(DoProjectSignal()) ); connect( (QObject*)(m_Controls->m_B_ValueMap_Rounder_SpinBox), SIGNAL(valueChanged(int)), this, SLOT(UpdateDwiBValueMapRounder(int))); connect( (QObject*)(m_Controls->m_CreateLengthCorrectedDwi), SIGNAL(clicked()), this, SLOT(DoLengthCorrection()) ); connect( (QObject*)(m_Controls->m_CalcAdcButton), SIGNAL(clicked()), this, SLOT(DoAdcCalculation()) ); connect( (QObject*)(m_Controls->m_NormalizeImageValuesButton), SIGNAL(clicked()), this, SLOT(DoDwiNormalization()) ); connect( (QObject*)(m_Controls->m_ModifyDirection), SIGNAL(clicked()), this, SLOT(DoApplyDirectionMatrix()) ); connect( (QObject*)(m_Controls->m_ModifySpacingButton), SIGNAL(clicked()), this, SLOT(DoApplySpacing()) ); connect( (QObject*)(m_Controls->m_ModifyOriginButton), SIGNAL(clicked()), this, SLOT(DoApplyOrigin()) ); connect( (QObject*)(m_Controls->m_ResampleImageButton), SIGNAL(clicked()), this, SLOT(DoResampleImage()) ); connect( (QObject*)(m_Controls->m_ResampleTypeBox), SIGNAL(currentIndexChanged(int)), this, SLOT(DoUpdateInterpolationGui(int)) ); connect( (QObject*)(m_Controls->m_CropImageButton), SIGNAL(clicked()), this, SLOT(DoCropImage()) ); connect( (QObject*)(m_Controls->m_RemoveGradientButton), SIGNAL(clicked()), this, SLOT(DoRemoveGradient()) ); connect( (QObject*)(m_Controls->m_ExtractGradientButton), SIGNAL(clicked()), this, SLOT(DoExtractGradient()) ); connect( (QObject*)(m_Controls->m_FlipAxis), SIGNAL(clicked()), this, SLOT(DoFlipAxis()) ); connect( (QObject*)(m_Controls->m_FlipGradientsButton), SIGNAL(clicked()), this, SLOT(DoFlipGradientDirections()) ); connect( (QObject*)(m_Controls->m_SelctedImageComboBox), SIGNAL(OnSelectionChanged(const mitk::DataNode*)), this, SLOT(OnImageSelectionChanged()) ); m_Controls->m_NormalizationMaskBox->SetZeroEntryText("--"); } } void QmitkPreprocessingView::DoFlipAxis() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(node) ); if (isDiffusionImage) { ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); itk::FixedArray flipAxes; flipAxes[0] = m_Controls->m_FlipX->isChecked(); flipAxes[1] = m_Controls->m_FlipY->isChecked(); flipAxes[2] = m_Controls->m_FlipZ->isChecked(); itk::FlipImageFilter< ItkDwiType >::Pointer flipper = itk::FlipImageFilter< ItkDwiType >::New(); flipper->SetInput(itkVectorImagePointer); flipper->SetFlipAxes(flipAxes); flipper->Update(); mitk::GradientDirectionsProperty::GradientDirectionsContainerType::Pointer oldGradients = static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); mitk::GradientDirectionsProperty::GradientDirectionsContainerType::Pointer newGradients = mitk::GradientDirectionsProperty::GradientDirectionsContainerType::New(); for (unsigned int i=0; iSize(); i++) { mitk::GradientDirectionsProperty::GradientDirectionType g = oldGradients->GetElement(i); mitk::GradientDirectionsProperty::GradientDirectionType newG = g; if (flipAxes[0]) { newG[0] *= -1; } if (flipAxes[1]) { newG[1] *= -1; } if (flipAxes[2]) { newG[2] *= -1; } newGradients->InsertElement(i, newG); } mitk::Image::Pointer newImage = mitk::GrabItkImageMemory( flipper->GetOutput() ); newImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( newGradients ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); newImage->GetGeometry()->SetOrigin(image->GetGeometry()->GetOrigin()); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_flipped").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else if( image->GetPixelType().GetNumberOfComponents() == 1 ) { AccessFixedDimensionByItk(image, TemplatedFlipAxis,3); } else { QMessageBox::warning(NULL,"Warning", QString("Operation not supported in multi-component images") ); } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedFlipAxis(itk::Image* itkImage) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } itk::FixedArray flipAxes; flipAxes[0] = m_Controls->m_FlipX->isChecked(); flipAxes[1] = m_Controls->m_FlipY->isChecked(); flipAxes[2] = m_Controls->m_FlipZ->isChecked(); typename itk::FlipImageFilter< itk::Image >::Pointer flipper = itk::FlipImageFilter< itk::Image >::New(); flipper->SetInput(itkImage); flipper->SetFlipAxes(flipAxes); flipper->Update(); mitk::Image::Pointer newImage = mitk::GrabItkImageMemory( flipper->GetOutput() ); newImage->GetGeometry()->SetOrigin(image->GetGeometry()->GetOrigin()); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_flipped").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPreprocessingView::DoRemoveGradient() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) { return; } std::vector< unsigned int > channelsToRemove; channelsToRemove.push_back(m_Controls->m_RemoveGradientBox->value()); ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); itk::RemoveDwiChannelFilter< short >::Pointer filter = itk::RemoveDwiChannelFilter< short >::New(); filter->SetInput(itkVectorImagePointer); filter->SetChannelIndices(channelsToRemove); filter->SetDirections( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); filter->Update(); mitk::Image::Pointer newImage = mitk::GrabItkImageMemory( filter->GetOutput() ); newImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( filter->GetNewDirections() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_removedgradients").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPreprocessingView::DoExtractGradient() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) { return; } ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); unsigned int channel = m_Controls->m_ExtractGradientBox->value(); itk::ExtractDwiChannelFilter< short >::Pointer filter = itk::ExtractDwiChannelFilter< short >::New(); filter->SetInput( itkVectorImagePointer); filter->SetChannelIndex(channel); filter->Update(); mitk::Image::Pointer newImage = mitk::Image::New(); newImage->InitializeByItk( filter->GetOutput() ); newImage->SetImportChannel( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName( (name+"_direction-"+QString::number(channel)).toStdString().c_str() ); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true); } void QmitkPreprocessingView::DoCropImage() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( isDiffusionImage ) { ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); ItkDwiType::SizeType lower; ItkDwiType::SizeType upper; lower[0] = m_Controls->m_XstartBox->value(); lower[1] = m_Controls->m_YstartBox->value(); lower[2] = m_Controls->m_ZstartBox->value(); upper[0] = m_Controls->m_XendBox->value(); upper[1] = m_Controls->m_YendBox->value(); upper[2] = m_Controls->m_ZendBox->value(); itk::CropImageFilter< ItkDwiType, ItkDwiType >::Pointer cropper = itk::CropImageFilter< ItkDwiType, ItkDwiType >::New(); cropper->SetLowerBoundaryCropSize(lower); cropper->SetUpperBoundaryCropSize(upper); cropper->SetInput( itkVectorImagePointer ); cropper->Update(); ItkDwiType::Pointer itkOutImage = cropper->GetOutput(); ItkDwiType::DirectionType dir = itkOutImage->GetDirection(); itk::Point origin = itkOutImage->GetOrigin(); origin[0] += lower[0]*itkOutImage->GetSpacing()[0]*dir[0][0]/std::fabs(dir[0][0]); origin[1] += lower[1]*itkOutImage->GetSpacing()[1]*dir[1][1]/std::fabs(dir[1][1]); origin[2] += lower[2]*itkOutImage->GetSpacing()[2]*dir[2][2]/std::fabs(dir[2][2]); itkOutImage->SetOrigin(origin); mitk::Image::Pointer newimage = mitk::GrabItkImageMemory( itkOutImage ); newimage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ) ); newimage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ) ); newimage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( newimage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newimage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_cropped").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else if( image->GetPixelType().GetNumberOfComponents() ) { AccessFixedDimensionByItk(image, TemplatedCropImage,3); } else { QMessageBox::warning(NULL,"Warning", QString("Operation not supported in multi-component images") ); } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedCropImage( itk::Image* itkImage) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } ItkDwiType::SizeType lower; ItkDwiType::SizeType upper; lower[0] = m_Controls->m_XstartBox->value(); lower[1] = m_Controls->m_YstartBox->value(); lower[2] = m_Controls->m_ZstartBox->value(); upper[0] = m_Controls->m_XendBox->value(); upper[1] = m_Controls->m_YendBox->value(); upper[2] = m_Controls->m_ZendBox->value(); typedef itk::Image ImageType; typename itk::CropImageFilter< ImageType, ImageType >::Pointer cropper = itk::CropImageFilter< ImageType, ImageType >::New(); cropper->SetLowerBoundaryCropSize(lower); cropper->SetUpperBoundaryCropSize(upper); cropper->SetInput(itkImage); cropper->Update(); typename ImageType::Pointer itkOutImage = cropper->GetOutput(); typename ImageType::DirectionType dir = itkOutImage->GetDirection(); itk::Point origin = itkOutImage->GetOrigin(); origin[0] += lower[0]*itkOutImage->GetSpacing()[0]*dir[0][0]/std::fabs(dir[0][0]); origin[1] += lower[1]*itkOutImage->GetSpacing()[1]*dir[1][1]/std::fabs(dir[1][1]); origin[2] += lower[2]*itkOutImage->GetSpacing()[2]*dir[2][2]/std::fabs(dir[2][2]); itkOutImage->SetOrigin(origin); mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( itkOutImage.GetPointer() ); image->SetVolume( itkOutImage->GetBufferPointer() ); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( image ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_cropped").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPreprocessingView::DoApplySpacing() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( isDiffusionImage ) { mitk::Vector3D spacing; spacing[0] = m_Controls->m_HeaderSpacingX->value(); spacing[1] = m_Controls->m_HeaderSpacingY->value(); spacing[2] = m_Controls->m_HeaderSpacingZ->value(); mitk::Image::Pointer newImage = image->Clone(); newImage->GetGeometry()->SetSpacing( spacing ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_newspacing").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else if( image->GetPixelType().GetNumberOfComponents() ) { AccessFixedDimensionByItk(image, TemplatedSetImageSpacing,3); } else { QMessageBox::warning(NULL,"Warning", QString("Operation not supported in multi-component images") ); } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedSetImageSpacing( itk::Image* itkImage) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) return; mitk::Vector3D spacing; spacing[0] = m_Controls->m_HeaderSpacingX->value(); spacing[1] = m_Controls->m_HeaderSpacingY->value(); spacing[2] = m_Controls->m_HeaderSpacingZ->value(); typedef itk::ImageDuplicator< itk::Image > DuplicateFilterType; typename DuplicateFilterType::Pointer duplicator = DuplicateFilterType::New(); duplicator->SetInputImage( itkImage ); duplicator->Update(); typename itk::Image::Pointer newImage = duplicator->GetOutput(); newImage->SetSpacing(spacing); mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( newImage.GetPointer() ); image->SetVolume( newImage->GetBufferPointer() ); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( image ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_newspacing").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPreprocessingView::DoApplyOrigin() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image)); if ( isDiffusionImage ) { mitk::Vector3D origin; origin[0] = m_Controls->m_HeaderOriginX->value(); origin[1] = m_Controls->m_HeaderOriginY->value(); origin[2] = m_Controls->m_HeaderOriginZ->value(); mitk::Image::Pointer newImage = image->Clone(); newImage->GetGeometry()->SetOrigin( origin ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_neworigin").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else if( image->GetPixelType().GetNumberOfComponents() ) { AccessFixedDimensionByItk(image, TemplatedSetImageOrigin,3); } else { QMessageBox::warning(NULL,"Warning", QString("Operation not supported in multi-component images") ); } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedSetImageOrigin( itk::Image* itkImage) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Vector3D origin; origin[0] = m_Controls->m_HeaderOriginX->value(); origin[1] = m_Controls->m_HeaderOriginY->value(); origin[2] = m_Controls->m_HeaderOriginZ->value(); typedef itk::ImageDuplicator< itk::Image > DuplicateFilterType; typename DuplicateFilterType::Pointer duplicator = DuplicateFilterType::New(); duplicator->SetInputImage( itkImage ); duplicator->Update(); typename itk::Image::Pointer newImage = duplicator->GetOutput(); newImage->SetOrigin(origin); mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( newImage.GetPointer() ); image->SetVolume( newImage->GetBufferPointer() ); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( image ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_neworigin").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPreprocessingView::DoUpdateInterpolationGui(int i) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } switch (i) { case 0: { m_Controls->m_ResampleIntFrame->setVisible(false); m_Controls->m_ResampleDoubleFrame->setVisible(true); break; } case 1: { m_Controls->m_ResampleIntFrame->setVisible(false); m_Controls->m_ResampleDoubleFrame->setVisible(true); mitk::BaseGeometry* geom = image->GetGeometry(); m_Controls->m_ResampleDoubleX->setValue(geom->GetSpacing()[0]); m_Controls->m_ResampleDoubleY->setValue(geom->GetSpacing()[1]); m_Controls->m_ResampleDoubleZ->setValue(geom->GetSpacing()[2]); break; } case 2: { m_Controls->m_ResampleIntFrame->setVisible(true); m_Controls->m_ResampleDoubleFrame->setVisible(false); mitk::BaseGeometry* geom = image->GetGeometry(); m_Controls->m_ResampleIntX->setValue(geom->GetExtent(0)); m_Controls->m_ResampleIntY->setValue(geom->GetExtent(1)); m_Controls->m_ResampleIntZ->setValue(geom->GetExtent(2)); break; } default: { m_Controls->m_ResampleIntFrame->setVisible(false); m_Controls->m_ResampleDoubleFrame->setVisible(true); } } } void QmitkPreprocessingView::DoExtractBrainMask() { } void QmitkPreprocessingView::DoResampleImage() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( isDiffusionImage ) { ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); typedef itk::ResampleDwiImageFilter< short > ResampleFilter; ResampleFilter::Pointer resampler = ResampleFilter::New(); resampler->SetInput( itkVectorImagePointer ); switch (m_Controls->m_ResampleTypeBox->currentIndex()) { case 0: { itk::Vector< double, 3 > samplingFactor; samplingFactor[0] = m_Controls->m_ResampleDoubleX->value(); samplingFactor[1] = m_Controls->m_ResampleDoubleY->value(); samplingFactor[2] = m_Controls->m_ResampleDoubleZ->value(); resampler->SetSamplingFactor(samplingFactor); break; } case 1: { itk::Vector< double, 3 > newSpacing; newSpacing[0] = m_Controls->m_ResampleDoubleX->value(); newSpacing[1] = m_Controls->m_ResampleDoubleY->value(); newSpacing[2] = m_Controls->m_ResampleDoubleZ->value(); resampler->SetNewSpacing(newSpacing); break; } case 2: { itk::ImageRegion<3> newRegion; newRegion.SetSize(0, m_Controls->m_ResampleIntX->value()); newRegion.SetSize(1, m_Controls->m_ResampleIntY->value()); newRegion.SetSize(2, m_Controls->m_ResampleIntZ->value()); resampler->SetNewImageSize(newRegion); break; } default: { MITK_WARN << "Unknown resampling parameters!"; return; } } QString outAdd; switch (m_Controls->m_InterpolatorBox->currentIndex()) { case 0: { resampler->SetInterpolation(ResampleFilter::Interpolate_NearestNeighbour); outAdd = "NearestNeighbour"; break; } case 1: { resampler->SetInterpolation(ResampleFilter::Interpolate_Linear); outAdd = "Linear"; break; } case 2: { resampler->SetInterpolation(ResampleFilter::Interpolate_BSpline); outAdd = "BSpline"; break; } case 3: { resampler->SetInterpolation(ResampleFilter::Interpolate_WindowedSinc); outAdd = "WindowedSinc"; break; } default: { resampler->SetInterpolation(ResampleFilter::Interpolate_NearestNeighbour); outAdd = "NearestNeighbour"; } } resampler->Update(); mitk::Image::Pointer newImage = mitk::GrabItkImageMemory( resampler->GetOutput() ); newImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_resampled_"+outAdd).toStdString().c_str()); imageNode->SetVisibility(false); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); } else if( image->GetPixelType().GetNumberOfComponents() ) { AccessFixedDimensionByItk(image, TemplatedResampleImage,3); } else { QMessageBox::warning(NULL,"Warning", QString("Operation not supported in multi-component images") ); } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedResampleImage( itk::Image* itkImage) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } itk::Vector< double, 3 > newSpacing; itk::ImageRegion<3> newRegion; switch (m_Controls->m_ResampleTypeBox->currentIndex()) { case 0: { itk::Vector< double, 3 > sampling; sampling[0] = m_Controls->m_ResampleDoubleX->value(); sampling[1] = m_Controls->m_ResampleDoubleY->value(); sampling[2] = m_Controls->m_ResampleDoubleZ->value(); newSpacing = itkImage->GetSpacing(); newSpacing[0] /= sampling[0]; newSpacing[1] /= sampling[1]; newSpacing[2] /= sampling[2]; newRegion = itkImage->GetLargestPossibleRegion(); newRegion.SetSize(0, newRegion.GetSize(0)*sampling[0]); newRegion.SetSize(1, newRegion.GetSize(1)*sampling[1]); newRegion.SetSize(2, newRegion.GetSize(2)*sampling[2]); break; } case 1: { newSpacing[0] = m_Controls->m_ResampleDoubleX->value(); newSpacing[1] = m_Controls->m_ResampleDoubleY->value(); newSpacing[2] = m_Controls->m_ResampleDoubleZ->value(); itk::Vector< double, 3 > oldSpacing = itkImage->GetSpacing(); itk::Vector< double, 3 > sampling; sampling[0] = oldSpacing[0]/newSpacing[0]; sampling[1] = oldSpacing[1]/newSpacing[1]; sampling[2] = oldSpacing[2]/newSpacing[2]; newRegion = itkImage->GetLargestPossibleRegion(); newRegion.SetSize(0, newRegion.GetSize(0)*sampling[0]); newRegion.SetSize(1, newRegion.GetSize(1)*sampling[1]); newRegion.SetSize(2, newRegion.GetSize(2)*sampling[2]); break; } case 2: { newRegion.SetSize(0, m_Controls->m_ResampleIntX->value()); newRegion.SetSize(1, m_Controls->m_ResampleIntY->value()); newRegion.SetSize(2, m_Controls->m_ResampleIntZ->value()); itk::ImageRegion<3> oldRegion = itkImage->GetLargestPossibleRegion(); itk::Vector< double, 3 > sampling; sampling[0] = (double)newRegion.GetSize(0)/oldRegion.GetSize(0); sampling[1] = (double)newRegion.GetSize(1)/oldRegion.GetSize(1); sampling[2] = (double)newRegion.GetSize(2)/oldRegion.GetSize(2); newSpacing = itkImage->GetSpacing(); newSpacing[0] /= sampling[0]; newSpacing[1] /= sampling[1]; newSpacing[2] /= sampling[2]; break; } default: { MITK_WARN << "Unknown resampling parameters!"; return; } } itk::Point origin = itkImage->GetOrigin(); origin[0] -= itkImage->GetSpacing()[0]/2; origin[1] -= itkImage->GetSpacing()[1]/2; origin[2] -= itkImage->GetSpacing()[2]/2; origin[0] += newSpacing[0]/2; origin[1] += newSpacing[1]/2; origin[2] += newSpacing[2]/2; typedef itk::Image ImageType; typename ImageType::Pointer outImage = ImageType::New(); outImage->SetSpacing( newSpacing ); outImage->SetOrigin( origin ); outImage->SetDirection( itkImage->GetDirection() ); outImage->SetLargestPossibleRegion( newRegion ); outImage->SetBufferedRegion( newRegion ); outImage->SetRequestedRegion( newRegion ); outImage->Allocate(); typedef itk::ResampleImageFilter ResampleFilter; typename ResampleFilter::Pointer resampler = ResampleFilter::New(); resampler->SetInput(itkImage); resampler->SetOutputParametersFromImage(outImage); QString outAdd; switch (m_Controls->m_InterpolatorBox->currentIndex()) { case 0: { typename itk::NearestNeighborInterpolateImageFunction::Pointer interp = itk::NearestNeighborInterpolateImageFunction::New(); resampler->SetInterpolator(interp); outAdd = "NearestNeighbour"; break; } case 1: { typename itk::LinearInterpolateImageFunction::Pointer interp = itk::LinearInterpolateImageFunction::New(); resampler->SetInterpolator(interp); outAdd = "Linear"; break; } case 2: { typename itk::BSplineInterpolateImageFunction::Pointer interp = itk::BSplineInterpolateImageFunction::New(); resampler->SetInterpolator(interp); outAdd = "BSpline"; break; } case 3: { typename itk::WindowedSincInterpolateImageFunction::Pointer interp = itk::WindowedSincInterpolateImageFunction::New(); resampler->SetInterpolator(interp); outAdd = "WindowedSinc"; break; } default: { typename itk::NearestNeighborInterpolateImageFunction::Pointer interp = itk::NearestNeighborInterpolateImageFunction::New(); resampler->SetInterpolator(interp); outAdd = "NearestNeighbour"; } } resampler->Update(); mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( resampler->GetOutput() ); image->SetVolume( resampler->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( image ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_resampled_"+outAdd).toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); } void QmitkPreprocessingView::DoApplyDirectionMatrix() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( isDiffusionImage ) { ItkDwiType::DirectionType newDirection; for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { QTableWidgetItem* item = m_Controls->m_DirectionMatrixTable->item(r,c); if (!item) return; newDirection[r][c] = item->text().toDouble(); } } ItkDwiType::Pointer itkDwi = ItkDwiType::New(); mitk::CastToItkImage(image, itkDwi); itk::ImageDuplicator::Pointer duplicator = itk::ImageDuplicator::New(); duplicator->SetInputImage(itkDwi); duplicator->Update(); itkDwi = duplicator->GetOutput(); //vnl_matrix_fixed< double,3,3 > oldInverseDirection = itkDwi->GetDirection().GetInverse(); mitk::GradientDirectionsProperty::GradientDirectionsContainerType::Pointer oldGradients = static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::ORIGINALGRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); mitk::GradientDirectionsProperty::GradientDirectionsContainerType::Pointer newGradients = mitk::GradientDirectionsProperty::GradientDirectionsContainerType::New(); for (unsigned int i=0; iSize(); i++) { mitk::GradientDirectionsProperty::GradientDirectionType g = oldGradients->GetElement(i); // double mag = g.magnitude(); // g.normalize(); // mitk::GradientDirectionsProperty::GradientDirectionType newG = oldInverseDirection*g; // newG = newDirection.GetVnlMatrix()*newG; // newG.normalize(); newGradients->InsertElement(i, g); } itkDwi->SetDirection(newDirection); mitk::Image::Pointer newDwi2 = mitk::GrabItkImageMemory( itkDwi.GetPointer() ); newDwi2->SetProperty( mitk::DiffusionPropertyHelper::ORIGINALGRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( newGradients ) ); newDwi2->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ) ); newDwi2->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( newDwi2 ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newDwi2 ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_newdirection").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance() ->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else if( image->GetPixelType().GetNumberOfComponents() ) { AccessFixedDimensionByItk(image, TemplatedApplyRotation,3); } else { QMessageBox::warning(NULL,"Warning", QString("Operation not supported in multi-component images") ); } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedApplyRotation( itk::Image* itkImage) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } ItkDwiType::DirectionType newDirection; for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { QTableWidgetItem* item = m_Controls->m_DirectionMatrixTable->item(r,c); if (!item) return; newDirection[r][c] = item->text().toDouble(); } } typedef itk::Image ImageType; typename ImageType::Pointer newImage = ImageType::New(); newImage->SetSpacing( itkImage->GetSpacing() ); newImage->SetOrigin( itkImage->GetOrigin() ); newImage->SetDirection( newDirection ); newImage->SetLargestPossibleRegion( itkImage->GetLargestPossibleRegion() ); newImage->SetBufferedRegion( itkImage->GetLargestPossibleRegion() ); newImage->SetRequestedRegion( itkImage->GetLargestPossibleRegion() ); newImage->Allocate(); newImage->FillBuffer(0); itk::ImageRegionIterator< itk::Image > it(itkImage, itkImage->GetLargestPossibleRegion()); while(!it.IsAtEnd()) { newImage->SetPixel(it.GetIndex(), it.Get()); ++it; } mitk::Image::Pointer newMitkImage = mitk::Image::New(); newMitkImage->InitializeByItk(newImage.GetPointer()); newMitkImage->SetVolume(newImage->GetBufferPointer()); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newMitkImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_newdirection").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); mitk::RenderingManager::GetInstance()->InitializeViews( imageNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkPreprocessingView::DoProjectSignal() { switch(m_Controls->m_ProjectionMethodBox->currentIndex()) { case 0: DoADCAverage(); break; case 1: DoAKCFit(); break; case 2: DoBiExpFit(); break; default: DoADCAverage(); } } void QmitkPreprocessingView::DoDwiNormalization() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( ! isDiffusionImage ) { return; } GradientDirectionContainerType::Pointer gradientContainer = static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); int b0Index = -1; for (unsigned int i=0; isize(); i++) { GradientDirectionType g = gradientContainer->GetElement(i); if (g.magnitude()<0.001) { b0Index = i; break; } } if (b0Index==-1) { return; } typedef itk::DwiNormilzationFilter FilterType; ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); FilterType::Pointer filter = FilterType::New(); filter->SetInput( itkVectorImagePointer ); filter->SetGradientDirections( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); filter->SetNewMean(m_Controls->m_NewMean->value()); filter->SetNewStdev(m_Controls->m_NewStdev->value()); UcharImageType::Pointer itkImage = NULL; if (m_Controls->m_NormalizationMaskBox->GetSelectedNode().IsNotNull()) { itkImage = UcharImageType::New(); if ( dynamic_cast(m_Controls->m_NormalizationMaskBox->GetSelectedNode()->GetData()) != nullptr ) { mitk::CastToItkImage( dynamic_cast(m_Controls->m_NormalizationMaskBox->GetSelectedNode()->GetData()), itkImage ); } filter->SetMaskImage(itkImage); } filter->Update(); mitk::Image::Pointer newImage = mitk::GrabItkImageMemory( filter->GetOutput() ); newImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_normalized").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); } void QmitkPreprocessingView::DoLengthCorrection() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( ! isDiffusionImage ) { return; } typedef itk::DwiGradientLengthCorrectionFilter FilterType; ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); FilterType::Pointer filter = FilterType::New(); filter->SetRoundingValue( m_Controls->m_B_ValueMap_Rounder_SpinBox->value()); filter->SetReferenceBValue( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); filter->SetReferenceGradientDirectionContainer( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); filter->Update(); mitk::Image::Pointer newImage = mitk::Image::New();//mitk::ImportItkImage( itkVectorImagePointer ); newImage->InitializeByItk( itkVectorImagePointer.GetPointer() ); newImage->SetImportVolume( itkVectorImagePointer->GetBufferPointer(), 0, 0, mitk::Image::CopyMemory); itkVectorImagePointer->GetPixelContainer()->ContainerManageMemoryOff(); newImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( filter->GetOutputGradientDirectionContainer() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( filter->GetNewBValue() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast(image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() )->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_rounded").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); } void QmitkPreprocessingView::UpdateDwiBValueMapRounder(int i) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(node) ); if ( ! isDiffusionImage ) { return; } UpdateBValueTableWidget(i); } void QmitkPreprocessingView:: CallMultishellToSingleShellFilter( itk::DWIVoxelFunctor * functor, mitk::Image::Pointer image, QString imageName, mitk::DataNode* parent ) { typedef itk::RadialMultishellToSingleshellImageFilter FilterType; // filter input parameter const mitk::BValueMapProperty::BValueMap& originalShellMap = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ) ->GetBValueMap(); ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); ItkDwiType* vectorImage = itkVectorImagePointer.GetPointer(); const mitk::GradientDirectionsProperty::GradientDirectionsContainerType::Pointer gradientContainer = static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); const unsigned int& bValue = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue(); mitk::DataNode::Pointer imageNode = 0; // filter call FilterType::Pointer filter = FilterType::New(); filter->SetInput(vectorImage); filter->SetOriginalGradientDirections(gradientContainer); filter->SetOriginalBValueMap(originalShellMap); filter->SetOriginalBValue(bValue); filter->SetFunctor(functor); filter->Update(); // create new DWI image mitk::Image::Pointer outImage = mitk::GrabItkImageMemory( filter->GetOutput() ); outImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( filter->GetTargetGradientDirections() ) ); outImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( m_Controls->m_targetBValueSpinBox->value() ) ); outImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( outImage ); propertyHelper.InitializeImage(); imageNode = mitk::DataNode::New(); imageNode->SetData( outImage ); imageNode->SetName(imageName.toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, parent); + GetDataStorage()->Add(imageNode, parent); // if(m_Controls->m_OutputRMSErrorImage->isChecked()){ // // create new Error image // FilterType::ErrorImageType::Pointer errImage = filter->GetErrorImage(); // mitk::Image::Pointer mitkErrImage = mitk::Image::New(); // mitkErrImage->InitializeByItk(errImage); // mitkErrImage->SetVolume(errImage->GetBufferPointer()); // imageNode = mitk::DataNode::New(); // imageNode->SetData( mitkErrImage ); // imageNode->SetName((imageName+"_Error").toStdString().c_str()); - // GetDefaultDataStorage()->Add(imageNode); + // GetDataStorage()->Add(imageNode); // } } void QmitkPreprocessingView::DoBiExpFit() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( ! isDiffusionImage ) { return; } itk::BiExpFitFunctor::Pointer functor = itk::BiExpFitFunctor::New(); QString name(node->GetName().c_str()); const mitk::BValueMapProperty::BValueMap& originalShellMap = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ) ->GetBValueMap(); mitk::BValueMapProperty::BValueMap::const_iterator it = originalShellMap.begin(); ++it;/* skip b=0*/ unsigned int s = 0; /*shell index */ vnl_vector bValueList(originalShellMap.size()-1); while( it != originalShellMap.end() ) { bValueList.put(s++,(it++)->first); } const double targetBValue = m_Controls->m_targetBValueSpinBox->value(); functor->setListOfBValues(bValueList); functor->setTargetBValue(targetBValue); CallMultishellToSingleShellFilter(functor,image,name + "_BiExp", node); } void QmitkPreprocessingView::DoAKCFit() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( ! isDiffusionImage ) { return; } itk::KurtosisFitFunctor::Pointer functor = itk::KurtosisFitFunctor::New(); QString name(node->GetName().c_str()); const mitk::BValueMapProperty::BValueMap& originalShellMap = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ) ->GetBValueMap(); mitk::BValueMapProperty::BValueMap::const_iterator it = originalShellMap.begin(); ++it;/* skip b=0*/ unsigned int s = 0; /*shell index */ vnl_vector bValueList(originalShellMap.size()-1); while(it != originalShellMap.end()) bValueList.put(s++,(it++)->first); const double targetBValue = m_Controls->m_targetBValueSpinBox->value(); functor->setListOfBValues(bValueList); functor->setTargetBValue(targetBValue); CallMultishellToSingleShellFilter(functor,image,name + "_AKC", node); } void QmitkPreprocessingView::DoADCFit() { // later } void QmitkPreprocessingView::DoADCAverage() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( ! isDiffusionImage ) return; itk::ADCAverageFunctor::Pointer functor = itk::ADCAverageFunctor::New(); QString name(node->GetName().c_str()); const mitk::BValueMapProperty::BValueMap &originalShellMap = static_cast(image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() )->GetBValueMap(); mitk::BValueMapProperty::BValueMap::const_iterator it = originalShellMap.begin(); ++it;/* skip b=0*/ unsigned int s = 0; /*shell index */ vnl_vector bValueList(originalShellMap.size()-1); while(it != originalShellMap.end()) bValueList.put(s++,(it++)->first); const double targetBValue = m_Controls->m_targetBValueSpinBox->value(); functor->setListOfBValues(bValueList); functor->setTargetBValue(targetBValue); CallMultishellToSingleShellFilter(functor,image,name + "_ADC", node); } void QmitkPreprocessingView::DoAdcCalculation() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( ! isDiffusionImage ) { return; } typedef itk::AdcImageFilter< DiffusionPixelType, double > FilterType; ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); FilterType::Pointer filter = FilterType::New(); filter->SetInput( itkVectorImagePointer ); filter->SetGradientDirections( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); filter->SetB_value( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); filter->Update(); mitk::Image::Pointer newImage = mitk::Image::New(); newImage->InitializeByItk( filter->GetOutput() ); newImage->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_ADC").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); } void QmitkPreprocessingView::CleanBValueTableWidget() { m_Controls->m_B_ValueMap_TableWidget->clear(); m_Controls->m_B_ValueMap_TableWidget->setRowCount(1); QStringList headerList; headerList << "b-Value" << "Number of gradients"; m_Controls->m_B_ValueMap_TableWidget->setHorizontalHeaderLabels(headerList); m_Controls->m_B_ValueMap_TableWidget->setItem(0,0,new QTableWidgetItem("-")); m_Controls->m_B_ValueMap_TableWidget->setItem(0,1,new QTableWidgetItem("-")); } void QmitkPreprocessingView::UpdateBValueTableWidget(int) { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { CleanBValueTableWidget(); return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage(false); isDiffusionImage = mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image); if ( ! isDiffusionImage ) { CleanBValueTableWidget(); } else { typedef mitk::BValueMapProperty::BValueMap BValueMap; typedef mitk::BValueMapProperty::BValueMap::iterator BValueMapIterator; BValueMapIterator it; BValueMap roundedBValueMap = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ) ->GetBValueMap(); m_Controls->m_B_ValueMap_TableWidget->clear(); m_Controls->m_B_ValueMap_TableWidget->setRowCount(roundedBValueMap.size() ); QStringList headerList; headerList << "b-Value" << "Number of gradients"; m_Controls->m_B_ValueMap_TableWidget->setHorizontalHeaderLabels(headerList); int i = 0 ; for(it = roundedBValueMap.begin() ;it != roundedBValueMap.end(); it++) { m_Controls->m_B_ValueMap_TableWidget->setItem(i,0,new QTableWidgetItem(QString::number(it->first))); QTableWidgetItem* item = m_Controls->m_B_ValueMap_TableWidget->item(i,0); item->setFlags(item->flags() & ~Qt::ItemIsEditable); m_Controls->m_B_ValueMap_TableWidget->setItem(i,1,new QTableWidgetItem(QString::number(it->second.size()))); i++; } } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedUpdateGui( itk::Image* itkImage) { for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { QTableWidgetItem* item = m_Controls->m_DirectionMatrixTable->item(r,c); delete item; item = new QTableWidgetItem(); item->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter); item->setText(QString::number(itkImage->GetDirection()[r][c])); m_Controls->m_DirectionMatrixTable->setItem(r,c,item); } } } template < typename TPixel, unsigned int VImageDimension > void QmitkPreprocessingView::TemplatedUpdateGui( itk::VectorImage* itkImage) { for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { QTableWidgetItem* item = m_Controls->m_DirectionMatrixTable->item(r,c); delete item; item = new QTableWidgetItem(); item->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter); item->setText(QString::number(itkImage->GetDirection()[r][c])); m_Controls->m_DirectionMatrixTable->setItem(r,c,item); } } } -void QmitkPreprocessingView::OnSelectionChanged( std::vector nodes ) +void QmitkPreprocessingView::OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) { (void) nodes; this->OnImageSelectionChanged(); } void QmitkPreprocessingView::OnImageSelectionChanged() { bool foundImageVolume = true; mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } bool foundDwiVolume( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( node ) ); mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool multiComponentVolume = (image->GetPixelType().GetNumberOfComponents() > 1); bool threeDplusTVolume = (image->GetTimeSteps() > 1); // we do not support multi-component and 3D+t images in the widget, check early to avoid access exception bool foundSingleImageVolume = foundDwiVolume || (foundImageVolume && (!multiComponentVolume) && (!threeDplusTVolume) ); m_Controls->m_ButtonAverageGradients->setEnabled(foundDwiVolume); m_Controls->m_ButtonExtractB0->setEnabled(foundDwiVolume); m_Controls->m_CheckExtractAll->setEnabled(foundDwiVolume); m_Controls->m_ModifyMeasurementFrame->setEnabled(foundDwiVolume); m_Controls->m_MeasurementFrameTable->setEnabled(foundDwiVolume); m_Controls->m_ReduceGradientsButton->setEnabled(foundDwiVolume); m_Controls->m_ShowGradientsButton->setEnabled(foundDwiVolume); m_Controls->m_MirrorGradientToHalfSphereButton->setEnabled(foundDwiVolume); m_Controls->m_MergeDwisButton->setEnabled(foundDwiVolume); m_Controls->m_B_ValueMap_Rounder_SpinBox->setEnabled(foundDwiVolume); m_Controls->m_ProjectSignalButton->setEnabled(foundDwiVolume); m_Controls->m_CreateLengthCorrectedDwi->setEnabled(foundDwiVolume); m_Controls->m_CalcAdcButton->setEnabled(foundDwiVolume); m_Controls->m_targetBValueSpinBox->setEnabled(foundDwiVolume); m_Controls->m_NormalizeImageValuesButton->setEnabled(foundDwiVolume); m_Controls->m_DirectionMatrixTable->setEnabled(foundSingleImageVolume); m_Controls->m_ModifyDirection->setEnabled(foundSingleImageVolume); m_Controls->m_ExtractBrainMask->setEnabled(foundSingleImageVolume); m_Controls->m_ResampleImageButton->setEnabled(foundSingleImageVolume); m_Controls->m_ModifySpacingButton->setEnabled(foundSingleImageVolume); m_Controls->m_ModifyOriginButton->setEnabled(foundSingleImageVolume); m_Controls->m_CropImageButton->setEnabled(foundSingleImageVolume); m_Controls->m_RemoveGradientButton->setEnabled(foundDwiVolume); m_Controls->m_ExtractGradientButton->setEnabled(foundDwiVolume); m_Controls->m_FlipAxis->setEnabled(foundSingleImageVolume); m_Controls->m_FlipGradientsButton->setEnabled(foundDwiVolume); // reset sampling frame to 1 and update all ealted components m_Controls->m_B_ValueMap_Rounder_SpinBox->setValue(1); UpdateBValueTableWidget(m_Controls->m_B_ValueMap_Rounder_SpinBox->value()); DoUpdateInterpolationGui(m_Controls->m_ResampleTypeBox->currentIndex()); if (foundDwiVolume) { m_Controls->m_InputData->setTitle("Input Data"); vnl_matrix_fixed< double, 3, 3 > mf = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame(); for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { // Measurement frame { QTableWidgetItem* item = m_Controls->m_MeasurementFrameTable->item( r, c ); delete item; item = new QTableWidgetItem(); item->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter); item->setText(QString::number(mf.get(r,c))); m_Controls->m_MeasurementFrameTable->setItem( r, c, item ); } // Direction matrix { ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); QTableWidgetItem* item = m_Controls->m_DirectionMatrixTable->item( r, c ); delete item; item = new QTableWidgetItem(); item->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter); item->setText(QString::number(itkVectorImagePointer->GetDirection()[r][c])); m_Controls->m_DirectionMatrixTable->setItem( r, c, item ); } } } //calculate target bValue for MultishellToSingleShellfilter const mitk::BValueMapProperty::BValueMap & bValMap = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ) ->GetBValueMap(); mitk::BValueMapProperty::BValueMap::const_iterator it = bValMap.begin(); unsigned int targetBVal = 0; while(it != bValMap.end()) { targetBVal += (it++)->first; } targetBVal /= (float)bValMap.size()-1; m_Controls->m_targetBValueSpinBox->setValue(targetBVal); m_Controls->m_HeaderSpacingX->setValue(image->GetGeometry()->GetSpacing()[0]); m_Controls->m_HeaderSpacingY->setValue(image->GetGeometry()->GetSpacing()[1]); m_Controls->m_HeaderSpacingZ->setValue(image->GetGeometry()->GetSpacing()[2]); m_Controls->m_HeaderOriginX->setValue(image->GetGeometry()->GetOrigin()[0]); m_Controls->m_HeaderOriginY->setValue(image->GetGeometry()->GetOrigin()[1]); m_Controls->m_HeaderOriginZ->setValue(image->GetGeometry()->GetOrigin()[2]); m_Controls->m_XstartBox->setMaximum(image->GetGeometry()->GetExtent(0)-1); m_Controls->m_YstartBox->setMaximum(image->GetGeometry()->GetExtent(1)-1); m_Controls->m_ZstartBox->setMaximum(image->GetGeometry()->GetExtent(2)-1); m_Controls->m_XendBox->setMaximum(image->GetGeometry()->GetExtent(0)-1); m_Controls->m_YendBox->setMaximum(image->GetGeometry()->GetExtent(1)-1); m_Controls->m_ZendBox->setMaximum(image->GetGeometry()->GetExtent(2)-1); m_Controls->m_RemoveGradientBox->setMaximum(static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer()->Size()-1); m_Controls->m_ExtractGradientBox->setMaximum(static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer()->Size()-1); } else if (foundSingleImageVolume) { for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { QTableWidgetItem* item = m_Controls->m_MeasurementFrameTable->item(r,c); delete item; item = new QTableWidgetItem(); m_Controls->m_MeasurementFrameTable->setItem(r,c,item); } } m_Controls->m_HeaderSpacingX->setValue(image->GetGeometry()->GetSpacing()[0]); m_Controls->m_HeaderSpacingY->setValue(image->GetGeometry()->GetSpacing()[1]); m_Controls->m_HeaderSpacingZ->setValue(image->GetGeometry()->GetSpacing()[2]); m_Controls->m_HeaderOriginX->setValue(image->GetGeometry()->GetOrigin()[0]); m_Controls->m_HeaderOriginY->setValue(image->GetGeometry()->GetOrigin()[1]); m_Controls->m_HeaderOriginZ->setValue(image->GetGeometry()->GetOrigin()[2]); m_Controls->m_XstartBox->setMaximum(image->GetGeometry()->GetExtent(0)-1); m_Controls->m_YstartBox->setMaximum(image->GetGeometry()->GetExtent(1)-1); m_Controls->m_ZstartBox->setMaximum(image->GetGeometry()->GetExtent(2)-1); m_Controls->m_XendBox->setMaximum(image->GetGeometry()->GetExtent(0)-1); m_Controls->m_YendBox->setMaximum(image->GetGeometry()->GetExtent(1)-1); m_Controls->m_ZendBox->setMaximum(image->GetGeometry()->GetExtent(2)-1); AccessFixedDimensionByItk(image, TemplatedUpdateGui,3); } else { for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { { QTableWidgetItem* item = m_Controls->m_MeasurementFrameTable->item( r, c ); delete item; item = new QTableWidgetItem(); m_Controls->m_MeasurementFrameTable->setItem( r, c, item ); } { QTableWidgetItem* item = m_Controls->m_DirectionMatrixTable->item( r, c ); delete item; item = new QTableWidgetItem(); m_Controls->m_DirectionMatrixTable->setItem( r, c, item ); } } } } } -void QmitkPreprocessingView::Visible() +void QmitkPreprocessingView::Activated() +{ +} + +void QmitkPreprocessingView::Deactivated() { - QmitkFunctionality::Visible(); OnImageSelectionChanged(); } -void QmitkPreprocessingView::Activated() +void QmitkPreprocessingView::Visible() { - QmitkFunctionality::Activated(); + OnImageSelectionChanged(); } -void QmitkPreprocessingView::Deactivated() +void QmitkPreprocessingView::Hidden() { - QmitkFunctionality::Deactivated(); } void QmitkPreprocessingView::DoFlipGradientDirections() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } mitk::Image::Pointer newDwi = image->Clone(); GradientDirectionContainerType::Pointer gradientContainer = static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); GradientDirectionContainerType::Pointer new_gradientContainer = GradientDirectionContainerType::New(); for (unsigned int j=0; jSize(); j++) { GradientDirectionType g = gradientContainer->at(j); if (m_Controls->m_FlipGradBoxX->isChecked()) { g[0] *= -1; } if (m_Controls->m_FlipGradBoxY->isChecked()) { g[1] *= -1; } if (m_Controls->m_FlipGradBoxZ->isChecked()) { g[2] *= -1; } new_gradientContainer->push_back(g); } newDwi->GetPropertyList()->ReplaceProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( new_gradientContainer ) ); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newDwi ); QString name = node->GetName().c_str(); imageNode->SetName( (name+"_GradientFlip").toStdString().c_str() ); GetDefaultDataStorage()->Add( imageNode, node ); } void QmitkPreprocessingView::DoHalfSphereGradientDirections() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } mitk::Image::Pointer newDwi = image->Clone(); GradientDirectionContainerType::Pointer gradientContainer = static_cast ( newDwi->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); for (unsigned int j=0; jSize(); j++) { if (gradientContainer->at(j)[0]<0) { gradientContainer->at(j) = -gradientContainer->at(j); } } newDwi->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( gradientContainer ) ); mitk::DiffusionPropertyHelper propertyHelper( newDwi ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newDwi ); QString name = node->GetName().c_str(); imageNode->SetName( (name+"_halfsphere").toStdString().c_str() ); - GetDefaultDataStorage()->Add( imageNode, node ); + GetDataStorage()->Add( imageNode, node ); } void QmitkPreprocessingView::DoApplyMesurementFrame() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) return; vnl_matrix_fixed< double, 3, 3 > mf; for (int r=0; r<3; r++) { for (int c=0; c<3; c++) { QTableWidgetItem* item = m_Controls->m_MeasurementFrameTable->item(r,c); if (!item) return; mf[r][c] = item->text().toDouble(); } } mitk::Image::Pointer newDwi = image->Clone(); newDwi->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( mf ) ); mitk::DiffusionPropertyHelper propertyHelper( newDwi ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newDwi ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_new-MF").toStdString().c_str()); - GetDefaultDataStorage()->Add( imageNode, node ); + GetDataStorage()->Add( imageNode, node ); } void QmitkPreprocessingView::DoShowGradientDirections() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) { return; } int maxIndex = 0; unsigned int maxSize = image->GetDimension(0); if (maxSizeGetDimension(1)) { maxSize = image->GetDimension(1); maxIndex = 1; } if (maxSizeGetDimension(2)) { maxSize = image->GetDimension(2); maxIndex = 2; } mitk::Point3D origin = image->GetGeometry()->GetOrigin(); mitk::PointSet::Pointer originSet = mitk::PointSet::New(); typedef mitk::BValueMapProperty::BValueMap BValueMap; typedef mitk::BValueMapProperty::BValueMap::iterator BValueMapIterator; BValueMap bValMap = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ) ->GetBValueMap(); GradientDirectionContainerType::Pointer gradientContainer = static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); mitk::BaseGeometry::Pointer geometry = image->GetGeometry(); int shellCount = 1; for(BValueMapIterator it = bValMap.begin(); it!=bValMap.end(); ++it) { mitk::PointSet::Pointer pointset = mitk::PointSet::New(); for (unsigned int j=0; jsecond.size(); j++) { mitk::Point3D ip; vnl_vector_fixed< double, 3 > v = gradientContainer->at(it->second[j]); if (v.magnitude()>mitk::eps) { ip[0] = v[0]*maxSize*geometry->GetSpacing()[maxIndex]/2 + origin[0]-0.5*geometry->GetSpacing()[0] + geometry->GetSpacing()[0]*image->GetDimension(0)/2; ip[1] = v[1]*maxSize*geometry->GetSpacing()[maxIndex]/2 + origin[1]-0.5*geometry->GetSpacing()[1] + geometry->GetSpacing()[1]*image->GetDimension(1)/2; ip[2] = v[2]*maxSize*geometry->GetSpacing()[maxIndex]/2 + origin[2]-0.5*geometry->GetSpacing()[2] + geometry->GetSpacing()[2]*image->GetDimension(2)/2; pointset->InsertPoint(j, ip); } else if (originSet->IsEmpty()) { ip[0] = v[0]*maxSize*geometry->GetSpacing()[maxIndex]/2 + origin[0]-0.5*geometry->GetSpacing()[0] + geometry->GetSpacing()[0]*image->GetDimension(0)/2; ip[1] = v[1]*maxSize*geometry->GetSpacing()[maxIndex]/2 + origin[1]-0.5*geometry->GetSpacing()[1] + geometry->GetSpacing()[1]*image->GetDimension(1)/2; ip[2] = v[2]*maxSize*geometry->GetSpacing()[maxIndex]/2 + origin[2]-0.5*geometry->GetSpacing()[2] + geometry->GetSpacing()[2]*image->GetDimension(2)/2; originSet->InsertPoint(j, ip); } } if ( it->first < mitk::eps ) { continue; } // add shell to datastorage mitk::DataNode::Pointer newNode = mitk::DataNode::New(); newNode->SetData(pointset); QString name = node->GetName().c_str(); name += "_Shell_"; name += QString::number( it->first ); newNode->SetName( name.toStdString().c_str() ); newNode->SetProperty( "pointsize", mitk::FloatProperty::New((float)maxSize / 50) ); int b0 = shellCount % 2; int b1 = 0; int b2 = 0; if (shellCount>4) { b2 = 1; } if (shellCount%4 >= 2) { b1 = 1; } newNode->SetProperty("color", mitk::ColorProperty::New( b2, b1, b0 )); - GetDefaultDataStorage()->Add( newNode, node ); + GetDataStorage()->Add( newNode, node ); shellCount++; } // add origin to datastorage mitk::DataNode::Pointer newNode = mitk::DataNode::New(); newNode->SetData(originSet); QString name = node->GetName().c_str(); name += "_Origin"; newNode->SetName(name.toStdString().c_str()); newNode->SetProperty("pointsize", mitk::FloatProperty::New((float)maxSize/50)); newNode->SetProperty("color", mitk::ColorProperty::New(1,1,1)); - GetDefaultDataStorage()->Add(newNode, node); + GetDataStorage()->Add(newNode, node); } void QmitkPreprocessingView::DoReduceGradientDirections() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) { return; } typedef itk::ElectrostaticRepulsionDiffusionGradientReductionFilter FilterType; typedef mitk::BValueMapProperty::BValueMap BValueMap; // GetShellSelection from GUI BValueMap shellSlectionMap; BValueMap originalShellMap = static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ) ->GetBValueMap(); std::vector newNumGradientDirections; int shellCounter = 0; QString name = node->GetName().c_str(); for (int i=0; im_B_ValueMap_TableWidget->rowCount(); i++) { double BValue = m_Controls->m_B_ValueMap_TableWidget->item(i,0)->text().toDouble(); shellSlectionMap[BValue] = originalShellMap[BValue]; unsigned int num = m_Controls->m_B_ValueMap_TableWidget->item(i,1)->text().toUInt(); newNumGradientDirections.push_back(num); name += "_"; name += QString::number(num); shellCounter++; } if (newNumGradientDirections.empty()) { return; } GradientDirectionContainerType::Pointer gradientContainer = static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer(); ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); FilterType::Pointer filter = FilterType::New(); filter->SetInput( itkVectorImagePointer ); filter->SetOriginalGradientDirections(gradientContainer); filter->SetNumGradientDirections(newNumGradientDirections); filter->SetOriginalBValueMap(originalShellMap); filter->SetShellSelectionBValueMap(shellSlectionMap); filter->Update(); mitk::Image::Pointer newImage = mitk::GrabItkImageMemory( filter->GetOutput() ); newImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( filter->GetGradientDirections() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() ) ->GetMeasurementFrame() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ) ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); imageNode->SetName(name.toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); // update the b-value widget to remove the modified number of gradients used for extraction this->CleanBValueTableWidget(); this->UpdateBValueTableWidget(0); } void QmitkPreprocessingView::MergeDwis() { typedef mitk::GradientDirectionsProperty::GradientDirectionsContainerType GradientContainerType; mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) { return; } mitk::DataNode::Pointer node2 = m_Controls->m_MergeDwiBox->GetSelectedNode(); if (node2.IsNull()) { return; } mitk::Image::Pointer image2 = dynamic_cast(node2->GetData()); if ( image2 == nullptr ) { return; } typedef itk::VectorImage DwiImageType; typedef DwiImageType::PixelType DwiPixelType; typedef DwiImageType::RegionType DwiRegionType; typedef std::vector< DwiImageType::Pointer > DwiImageContainerType; typedef std::vector< GradientContainerType::Pointer > GradientListContainerType; DwiImageContainerType imageContainer; GradientListContainerType gradientListContainer; std::vector< double > bValueContainer; QString name = ""; { ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); imageContainer.push_back( itkVectorImagePointer ); gradientListContainer.push_back( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); bValueContainer.push_back( static_cast (image->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); name += node->GetName().c_str(); } { ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image2, itkVectorImagePointer); imageContainer.push_back( itkVectorImagePointer ); gradientListContainer.push_back( static_cast ( image2->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); bValueContainer.push_back( static_cast (image2->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() ) ->GetValue() ); name += "+"; name += node2->GetName().c_str(); } typedef itk::MergeDiffusionImagesFilter FilterType; FilterType::Pointer filter = FilterType::New(); filter->SetImageVolumes(imageContainer); filter->SetGradientLists(gradientListContainer); filter->SetBValues(bValueContainer); filter->Update(); vnl_matrix_fixed< double, 3, 3 > mf; mf.set_identity(); mitk::Image::Pointer newImage = mitk::GrabItkImageMemory( filter->GetOutput() ); newImage->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( filter->GetOutputGradients() ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( mf ) ); newImage->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( filter->GetB_Value() ) ); mitk::DiffusionPropertyHelper propertyHelper( newImage ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newImage ); imageNode->SetName(name.toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode); + GetDataStorage()->Add(imageNode); } void QmitkPreprocessingView::ExtractB0() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) { return; } typedef mitk::GradientDirectionsProperty::GradientDirectionsContainerType GradientContainerType; // call the extraction withou averaging if the check-box is checked if( this->m_Controls->m_CheckExtractAll->isChecked() ) { DoExtractBOWithoutAveraging(); return; } ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); // Extract image using found index typedef itk::B0ImageExtractionImageFilter FilterType; FilterType::Pointer filter = FilterType::New(); filter->SetInput( itkVectorImagePointer ); filter->SetDirections( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); filter->Update(); mitk::Image::Pointer mitkImage = mitk::Image::New(); mitkImage->InitializeByItk( filter->GetOutput() ); mitkImage->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer newNode=mitk::DataNode::New(); newNode->SetData( mitkImage ); newNode->SetProperty( "name", mitk::StringProperty::New(node->GetName() + "_B0")); - GetDefaultDataStorage()->Add(newNode, node); + GetDataStorage()->Add(newNode, node); } void QmitkPreprocessingView::DoExtractBOWithoutAveraging() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) { return; } // typedefs typedef mitk::GradientDirectionsProperty::GradientDirectionsContainerType GradientContainerType; typedef itk::B0ImageExtractionToSeparateImageFilter< short, short> FilterType; ItkDwiType::Pointer itkVectorImagePointer = ItkDwiType::New(); mitk::CastToItkImage(image, itkVectorImagePointer); // Extract image using found index FilterType::Pointer filter = FilterType::New(); filter->SetInput( itkVectorImagePointer ); filter->SetDirections( static_cast ( image->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() ) ->GetGradientDirectionsContainer() ); filter->Update(); mitk::Image::Pointer mitkImage = mitk::Image::New(); mitkImage->InitializeByItk( filter->GetOutput() ); mitkImage->SetImportChannel( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer newNode=mitk::DataNode::New(); newNode->SetData( mitkImage ); newNode->SetProperty( "name", mitk::StringProperty::New(node->GetName() + "_B0_ALL")); - GetDefaultDataStorage()->Add(newNode, node); + GetDataStorage()->Add(newNode, node); /*A reinitialization is needed to access the time channels via the ImageNavigationController The Global-Geometry can not recognize the time channel without a re-init. (for a new selection in datamanger a automatically updated of the Global-Geometry should be done - if it contains the time channel)*/ mitk::RenderingManager::GetInstance()->InitializeViews( newNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true); } void QmitkPreprocessingView::AverageGradients() { mitk::DataNode::Pointer node = m_Controls->m_SelctedImageComboBox->GetSelectedNode(); if (node.IsNull()) { return; } mitk::Image::Pointer image = dynamic_cast(node->GetData()); if ( image == nullptr ) { return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(image) ); if ( !isDiffusionImage ) return; mitk::Image::Pointer newDwi = image->Clone(); newDwi->SetPropertyList( image->GetPropertyList()->Clone() ); mitk::DiffusionPropertyHelper propertyHelper(newDwi); propertyHelper.AverageRedundantGradients(m_Controls->m_Blur->value()); propertyHelper.InitializeImage(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( newDwi ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_averaged").toStdString().c_str()); - GetDefaultDataStorage()->Add(imageNode, node); + GetDataStorage()->Add(imageNode, node); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.h index 9e7fc32804..3200646d92 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.preprocessing/src/internal/QmitkPreprocessingView.h @@ -1,168 +1,169 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKPREPROCESSINGVIEW_H_INCLUDED #define _QMITKPREPROCESSINGVIEW_H_INCLUDED -#include +#include +#include #include "ui_QmitkPreprocessingViewControls.h" // st includes #include // itk includes #include #include // mitk includes #include #include "itkDWIVoxelFunctor.h" #include typedef short DiffusionPixelType; struct PrpSelListener; /*! * \ingroup org_mitk_gui_qt_preprocessing_internal * * \brief Viewing and modifying diffusion weighted images (gradient reduction, resampling, b-value projection, ...) * - * \sa QmitkFunctionality */ -class QmitkPreprocessingView : public QmitkFunctionality +class QmitkPreprocessingView : public QmitkAbstractView, public mitk::ILifecycleAwarePart { friend struct PrpSelListener; // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; typedef mitk::DiffusionPropertyHelper::GradientDirectionType GradientDirectionType; typedef mitk::DiffusionPropertyHelper::GradientDirectionsContainerType GradientDirectionContainerType; typedef itk::VectorImage< short, 3 > ItkDwiType; typedef itk::Image< unsigned char, 3 > UcharImageType; typedef itk::Image< double, 3 > ItkDoubleImageType; QmitkPreprocessingView(); virtual ~QmitkPreprocessingView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Called when the functionality is activated virtual void Activated() override; virtual void Deactivated() override; virtual void Visible() override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + virtual void Hidden() override; + + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; static const int nrconvkernels; protected slots: void AverageGradients(); void ExtractB0(); void MergeDwis(); void DoApplySpacing(); void DoApplyOrigin(); void DoApplyDirectionMatrix(); void DoApplyMesurementFrame(); void DoReduceGradientDirections(); void DoShowGradientDirections(); void DoHalfSphereGradientDirections(); void UpdateDwiBValueMapRounder(int i); void DoLengthCorrection(); void DoAdcCalculation(); void DoDwiNormalization(); void DoProjectSignal(); void DoExtractBrainMask(); void DoResampleImage(); void DoCropImage(); void DoUpdateInterpolationGui(int i); void DoRemoveGradient(); void DoExtractGradient(); void DoFlipAxis(); void OnImageSelectionChanged(); void DoFlipGradientDirections(); protected: void DoADCFit(); void DoAKCFit(); void DoBiExpFit(); void DoADCAverage(); template < typename TPixel, unsigned int VImageDimension > void TemplatedFlipAxis( itk::Image* itkImage); template < typename TPixel, unsigned int VImageDimension > void TemplatedCropImage( itk::Image* itkImage); template < typename TPixel, unsigned int VImageDimension > void TemplatedApplyRotation( itk::Image* itkImage); template < typename TPixel, unsigned int VImageDimension > void TemplatedUpdateGui( itk::Image* itkImage); template < typename TPixel, unsigned int VImageDimension > void TemplatedUpdateGui( itk::VectorImage* itkImage); template < typename TPixel, unsigned int VImageDimension > void TemplatedResampleImage( itk::Image* itkImage); template < typename TPixel, unsigned int VImageDimension > void TemplatedSetImageSpacing( itk::Image* itkImage); template < typename TPixel, unsigned int VImageDimension > void TemplatedSetImageOrigin( itk::Image* itkImage); /** Called by ExtractB0 if check-box activated, extracts all b0 images without averaging */ void DoExtractBOWithoutAveraging(); void UpdateBValueTableWidget(int); - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; // why not? + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkPreprocessingViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - void SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name); void CallMultishellToSingleShellFilter( itk::DWIVoxelFunctor * functor, mitk::Image::Pointer ImPtr, QString imageName, mitk::DataNode* parent ); void CleanBValueTableWidget(); }; #endif // _QMITKPREPROCESSINGVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.cpp index 507ee54a37..81e42adb18 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.cpp @@ -1,569 +1,550 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkDiffusionQuantificationView.h" #include "mitkDiffusionImagingConfigure.h" #include "itkTimeProbe.h" #include "itkImage.h" #include "mitkNodePredicateDataType.h" #include "mitkDataNodeObject.h" #include "mitkQBallImage.h" #include #include "mitkImageCast.h" #include "mitkStatusBar.h" #include "itkDiffusionQballGeneralizedFaImageFilter.h" #include "itkShiftScaleImageFilter.h" #include "itkTensorFractionalAnisotropyImageFilter.h" #include "itkTensorRelativeAnisotropyImageFilter.h" #include "itkTensorDerivedMeasurementsFilter.h" #include "QmitkDataStorageComboBox.h" -#include "QmitkStdMultiWidget.h" #include #include "berryIWorkbenchWindow.h" #include "berryISelectionService.h" const std::string QmitkDiffusionQuantificationView::VIEW_ID = "org.mitk.views.diffusionquantification"; QmitkDiffusionQuantificationView::QmitkDiffusionQuantificationView() - : QmitkFunctionality(), - m_Controls(NULL), - m_MultiWidget(NULL) + : QmitkAbstractView(), + m_Controls(NULL) { m_QBallImages = mitk::DataStorage::SetOfObjects::New(); m_TensorImages = mitk::DataStorage::SetOfObjects::New(); } QmitkDiffusionQuantificationView::QmitkDiffusionQuantificationView(const QmitkDiffusionQuantificationView& other) { Q_UNUSED(other) throw std::runtime_error("Copy constructor not implemented"); } QmitkDiffusionQuantificationView::~QmitkDiffusionQuantificationView() { } void QmitkDiffusionQuantificationView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkDiffusionQuantificationViewControls; m_Controls->setupUi(parent); this->CreateConnections(); GFACheckboxClicked(); #ifndef DIFFUSION_IMAGING_EXTENDED m_Controls->m_StandardGFACheckbox->setVisible(false); m_Controls->frame_3->setVisible(false); m_Controls->m_CurvatureButton->setVisible(false); #endif } } -void QmitkDiffusionQuantificationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - -void QmitkDiffusionQuantificationView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - void QmitkDiffusionQuantificationView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_StandardGFACheckbox), SIGNAL(clicked()), this, SLOT(GFACheckboxClicked()) ); connect( (QObject*)(m_Controls->m_GFAButton), SIGNAL(clicked()), this, SLOT(GFA()) ); connect( (QObject*)(m_Controls->m_CurvatureButton), SIGNAL(clicked()), this, SLOT(Curvature()) ); connect( (QObject*)(m_Controls->m_FAButton), SIGNAL(clicked()), this, SLOT(FA()) ); connect( (QObject*)(m_Controls->m_RAButton), SIGNAL(clicked()), this, SLOT(RA()) ); connect( (QObject*)(m_Controls->m_ADButton), SIGNAL(clicked()), this, SLOT(AD()) ); connect( (QObject*)(m_Controls->m_RDButton), SIGNAL(clicked()), this, SLOT(RD()) ); connect( (QObject*)(m_Controls->m_MDButton), SIGNAL(clicked()), this, SLOT(MD()) ); connect( (QObject*)(m_Controls->m_ClusteringAnisotropy), SIGNAL(clicked()), this, SLOT(ClusterAnisotropy()) ); } } -void QmitkDiffusionQuantificationView::OnSelectionChanged( std::vector nodes ) +void QmitkDiffusionQuantificationView::SetFocus() +{ + m_Controls->m_ScaleImageValuesBox->setFocus(); +} + +void QmitkDiffusionQuantificationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { m_QBallImages = mitk::DataStorage::SetOfObjects::New(); m_TensorImages = mitk::DataStorage::SetOfObjects::New(); bool foundQBIVolume = false; bool foundTensorVolume = false; mitk::DataNode::Pointer selNode = NULL; int c=0; - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; - if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { foundQBIVolume = true; m_QBallImages->push_back(node); selNode = node; c++; } else if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { foundTensorVolume = true; m_TensorImages->push_back(node); selNode = node; c++; } } m_Controls->m_GFAButton->setEnabled(foundQBIVolume); m_Controls->m_CurvatureButton->setEnabled(foundQBIVolume); if (c>0) { m_Controls->m_InputData->setTitle("Input Data"); m_Controls->m_InputImageLabel->setText(selNode->GetName().c_str()); } else { m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->m_InputImageLabel->setText("mandatory"); } m_Controls->m_FAButton->setEnabled(foundTensorVolume); m_Controls->m_RAButton->setEnabled(foundTensorVolume); m_Controls->m_ADButton->setEnabled(foundTensorVolume); m_Controls->m_RDButton->setEnabled(foundTensorVolume); m_Controls->m_MDButton->setEnabled(foundTensorVolume); m_Controls->m_ClusteringAnisotropy->setEnabled(foundTensorVolume); } -void QmitkDiffusionQuantificationView::Activated() -{ - QmitkFunctionality::Activated(); -} - -void QmitkDiffusionQuantificationView::Deactivated() -{ - QmitkFunctionality::Deactivated(); -} - void QmitkDiffusionQuantificationView::GFACheckboxClicked() { m_Controls->frame_2->setVisible(m_Controls->m_StandardGFACheckbox->isChecked()); } void QmitkDiffusionQuantificationView::GFA() { if(m_Controls->m_StandardGFACheckbox->isChecked()) { QBIQuantify(13); } else { QBIQuantify(0); } } void QmitkDiffusionQuantificationView::Curvature() { QBIQuantify(12); } void QmitkDiffusionQuantificationView::FA() { TensorQuantify(0); } void QmitkDiffusionQuantificationView::RA() { TensorQuantify(1); } void QmitkDiffusionQuantificationView::AD() { TensorQuantify(2); } void QmitkDiffusionQuantificationView::RD() { TensorQuantify(3); } void QmitkDiffusionQuantificationView::ClusterAnisotropy() { TensorQuantify(4); } void QmitkDiffusionQuantificationView::MD() { TensorQuantify(5); } void QmitkDiffusionQuantificationView::QBIQuantify(int method) { QBIQuantification(m_QBallImages, method); } void QmitkDiffusionQuantificationView::TensorQuantify(int method) { TensorQuantification(m_TensorImages, method); } void QmitkDiffusionQuantificationView::QBIQuantification( mitk::DataStorage::SetOfObjects::Pointer inImages, int method) { itk::TimeProbe clock; QString status; int nrFiles = inImages->size(); if (!nrFiles) return; mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); std::vector nodes; while ( itemiter != itemiterend ) // for all items { typedef float TOdfPixelType; const int odfsize = QBALL_ODFSIZE; typedef itk::Vector OdfVectorType; typedef itk::Image OdfVectorImgType; mitk::Image* vol = static_cast((*itemiter)->GetData()); OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename; (*itemiter)->GetStringProperty("name", nodename); ++itemiter; float p1 = m_Controls->m_ParamKEdit->text().toFloat(); float p2 = m_Controls->m_ParamPEdit->text().toFloat(); // COMPUTE RA clock.Start(); MBI_INFO << "Computing GFA "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing GFA for %s", nodename.c_str()).toLatin1()); typedef OdfVectorType::ValueType RealValueType; typedef itk::Image< RealValueType, 3 > RAImageType; typedef itk::DiffusionQballGeneralizedFaImageFilter GfaFilterType; GfaFilterType::Pointer gfaFilter = GfaFilterType::New(); gfaFilter->SetInput(itkvol); std::string newname; newname.append(nodename); switch(method) { case 0: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_STANDARD); newname.append("GFA"); break; } case 1: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILES_HIGH_LOW); newname.append("01"); break; } case 2: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILE_HIGH); newname.append("02"); break; } case 3: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_MAX_ODF_VALUE); newname.append("03"); break; } case 4: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_DECONVOLUTION_COEFFS); newname.append("04"); break; } case 5: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_MIN_MAX_NORMALIZED_STANDARD); newname.append("05"); break; } case 6: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_NORMALIZED_ENTROPY); newname.append("06"); break; } case 7: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_NEMATIC_ORDER_PARAMETER); newname.append("07"); break; } case 8: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILES_LOW_HIGH); newname.append("08"); break; } case 9: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILE_LOW); newname.append("09"); break; } case 10: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_MIN_ODF_VALUE); newname.append("10"); break; } case 11: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_STD_BY_MAX); newname.append("11"); break; } case 12: { p1 = m_Controls->MinAngle->text().toFloat(); p2 = m_Controls->MaxAngle->text().toFloat(); gfaFilter->SetComputationMethod(GfaFilterType::GFA_PRINCIPLE_CURVATURE); QString paramString; paramString = paramString.append("PC%1-%2").arg(p1).arg(p2); newname.append(paramString.toLatin1()); gfaFilter->SetParam1(p1); gfaFilter->SetParam2(p2); break; } case 13: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_GENERALIZED_GFA); QString paramString; paramString = paramString.append("GFAK%1P%2").arg(p1).arg(p2); newname.append(paramString.toLatin1()); gfaFilter->SetParam1(p1); gfaFilter->SetParam2(p2); break; } default: { newname.append("0"); gfaFilter->SetComputationMethod(GfaFilterType::GFA_STANDARD); } } gfaFilter->Update(); clock.Stop(); typedef itk::Image ImgType; ImgType::Pointer img = ImgType::New(); img->SetSpacing( gfaFilter->GetOutput()->GetSpacing() ); // Set the image spacing img->SetOrigin( gfaFilter->GetOutput()->GetOrigin() ); // Set the image origin img->SetDirection( gfaFilter->GetOutput()->GetDirection() ); // Set the image direction img->SetLargestPossibleRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion()); img->SetBufferedRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion() ); img->Allocate(); itk::ImageRegionIterator ot (img, img->GetLargestPossibleRegion() ); ot.GoToBegin(); itk::ImageRegionConstIterator it (gfaFilter->GetOutput(), gfaFilter->GetOutput()->GetLargestPossibleRegion() ); for (it.GoToBegin(); !it.IsAtEnd(); ++it) { GfaFilterType::OutputImageType::PixelType val = it.Get(); ot.Set(val * m_Controls->m_ScaleImageValuesBox->value()); ++ot; } // GFA TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( img.GetPointer() ); image->SetVolume( img->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); node->SetProperty( "name", mitk::StringProperty::New(newname) ); nodes.push_back(node); mitk::StatusBar::GetInstance()->DisplayText("Computation complete."); } std::vector::iterator nodeIt; for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt) - GetDefaultDataStorage()->Add(*nodeIt); + GetDataStorage()->Add(*nodeIt); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); } void QmitkDiffusionQuantificationView::TensorQuantification( mitk::DataStorage::SetOfObjects::Pointer inImages, int method) { itk::TimeProbe clock; QString status; int nrFiles = inImages->size(); if (!nrFiles) return; mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); std::vector nodes; while ( itemiter != itemiterend ) // for all items { typedef float TTensorPixelType; typedef itk::DiffusionTensor3D< TTensorPixelType > TensorPixelType; typedef itk::Image< TensorPixelType, 3 > TensorImageType; mitk::Image* vol = static_cast((*itemiter)->GetData()); TensorImageType::Pointer itkvol = TensorImageType::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename; (*itemiter)->GetStringProperty("name", nodename); ++itemiter; // COMPUTE FA clock.Start(); MBI_INFO << "Computing FA "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing FA for %s", nodename.c_str()).toLatin1()); typedef itk::Image< TTensorPixelType, 3 > FAImageType; typedef itk::ShiftScaleImageFilter ShiftScaleFilterType; ShiftScaleFilterType::Pointer multi = ShiftScaleFilterType::New(); multi->SetShift(0.0); multi->SetScale(m_Controls->m_ScaleImageValuesBox->value());//itk::NumericTraits::max() typedef itk::TensorDerivedMeasurementsFilter MeasurementsType; if(method == 0) //FA { /* typedef itk::TensorFractionalAnisotropyImageFilter< TensorImageType, FAImageType > FilterType; FilterType::Pointer anisotropyFilter = FilterType::New(); anisotropyFilter->SetInput( itkvol.GetPointer() ); anisotropyFilter->Update(); multi->SetInput(anisotropyFilter->GetOutput()); nodename = QString(nodename.c_str()).append("_FA").toStdString();*/ MeasurementsType::Pointer measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(itkvol.GetPointer() ); measurementsCalculator->SetMeasure(MeasurementsType::FA); measurementsCalculator->Update(); multi->SetInput(measurementsCalculator->GetOutput()); nodename = QString(nodename.c_str()).append("_FA").toStdString(); } else if(method == 1) //RA { /*typedef itk::TensorRelativeAnisotropyImageFilter< TensorImageType, FAImageType > FilterType; FilterType::Pointer anisotropyFilter = FilterType::New(); anisotropyFilter->SetInput( itkvol.GetPointer() ); anisotropyFilter->Update(); multi->SetInput(anisotropyFilter->GetOutput()); nodename = QString(nodename.c_str()).append("_RA").toStdString();*/ MeasurementsType::Pointer measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(itkvol.GetPointer() ); measurementsCalculator->SetMeasure(MeasurementsType::RA); measurementsCalculator->Update(); multi->SetInput(measurementsCalculator->GetOutput()); nodename = QString(nodename.c_str()).append("_RA").toStdString(); } else if(method == 2) // AD (Axial diffusivity) { MeasurementsType::Pointer measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(itkvol.GetPointer() ); measurementsCalculator->SetMeasure(MeasurementsType::AD); measurementsCalculator->Update(); multi->SetInput(measurementsCalculator->GetOutput()); nodename = QString(nodename.c_str()).append("_AD").toStdString(); } else if(method == 3) // RD (Radial diffusivity, (Lambda2+Lambda3)/2 { MeasurementsType::Pointer measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(itkvol.GetPointer() ); measurementsCalculator->SetMeasure(MeasurementsType::RD); measurementsCalculator->Update(); multi->SetInput(measurementsCalculator->GetOutput()); nodename = QString(nodename.c_str()).append("_RD").toStdString(); } else if(method == 4) // 1-(Lambda2+Lambda3)/(2*Lambda1) { MeasurementsType::Pointer measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(itkvol.GetPointer() ); measurementsCalculator->SetMeasure(MeasurementsType::CA); measurementsCalculator->Update(); multi->SetInput(measurementsCalculator->GetOutput()); nodename = QString(nodename.c_str()).append("_CA").toStdString(); } else if(method == 5) // MD (Mean Diffusivity, (Lambda1+Lambda2+Lambda3)/3 ) { MeasurementsType::Pointer measurementsCalculator = MeasurementsType::New(); measurementsCalculator->SetInput(itkvol.GetPointer() ); measurementsCalculator->SetMeasure(MeasurementsType::MD); measurementsCalculator->Update(); multi->SetInput(measurementsCalculator->GetOutput()); nodename = QString(nodename.c_str()).append("_MD").toStdString(); } multi->Update(); clock.Stop(); // FA TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( multi->GetOutput() ); image->SetVolume( multi->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); node->SetProperty( "name", mitk::StringProperty::New(nodename) ); nodes.push_back(node); mitk::StatusBar::GetInstance()->DisplayText("Computation complete."); } std::vector::iterator nodeIt; for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt) - GetDefaultDataStorage()->Add(*nodeIt); + GetDataStorage()->Add(*nodeIt); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.h index fcfe9984a4..d16fb881f9 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkDiffusionQuantificationView.h @@ -1,102 +1,96 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKDIFFUSIONQUANTIFICATIONVIEW_H_INCLUDED #define _QMITKDIFFUSIONQUANTIFICATIONVIEW_H_INCLUDED -#include +#include #include #include "ui_QmitkDiffusionQuantificationViewControls.h" /*! * \ingroup org_mitk_gui_qt_diffusionquantification_internal * * \brief QmitkDiffusionQuantificationView * * Document your class here. - * - * \sa QmitkFunctionality */ -class QmitkDiffusionQuantificationView : public QmitkFunctionality +class QmitkDiffusionQuantificationView : public QmitkAbstractView { friend struct DqSelListener; // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkDiffusionQuantificationView(); QmitkDiffusionQuantificationView(const QmitkDiffusionQuantificationView& other); virtual ~QmitkDiffusionQuantificationView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Called when the functionality is activated - virtual void Activated() override; - - virtual void Deactivated() override; - - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void GFACheckboxClicked(); void GFA(); void Curvature(); void FA(); void RA(); void AD(); void RD(); void ClusterAnisotropy(); void MD(); void QBIQuantify(int method); void QBIQuantification(mitk::DataStorage::SetOfObjects::Pointer inImages, int method) ; void TensorQuantify(int method); void TensorQuantification(mitk::DataStorage::SetOfObjects::Pointer inImages, int method) ; protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkDiffusionQuantificationViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; mitk::DataStorage::SetOfObjects::Pointer m_QBallImages; mitk::DataStorage::SetOfObjects::Pointer m_TensorImages; static const float m_ScaleDAIValues; }; #endif // _QMITKDIFFUSIONQUANTIFICATIONVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.cpp index 39d369fabc..deb4db3e65 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.cpp @@ -1,387 +1,385 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkODFDetailsView.h" #include #include #include #include #include #include #include #include #include #include #include #include const std::string QmitkODFDetailsView::VIEW_ID = "org.mitk.views.odfdetails"; QmitkODFDetailsView::QmitkODFDetailsView() : QmitkAbstractView() , m_Controls( 0 ) , m_OdfNormalization(0) , m_ImageNode(NULL) { m_VtkActor = vtkActor::New(); m_VtkMapper = vtkPolyDataMapper::New(); m_Renderer = vtkRenderer::New(); m_VtkRenderWindow = vtkRenderWindow::New(); m_RenderWindowInteractor = vtkRenderWindowInteractor::New(); m_Camera = vtkCamera::New(); m_VtkRenderWindow->SetSize(300,300); } QmitkODFDetailsView::~QmitkODFDetailsView() { if (m_ImageNode.IsNotNull()) m_ImageNode->RemoveObserver( m_PropertyObserverTag ); } +void QmitkODFDetailsView::Activated() +{ +} + +void QmitkODFDetailsView::Deactivated() +{ +} + void QmitkODFDetailsView::Visible() { mitk::IRenderWindowPart* renderWindow = this->GetRenderWindowPart(); if (renderWindow) { { mitk::SliceNavigationController* slicer = renderWindow->GetQmitkRenderWindow(QString("axial"))->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkODFDetailsView::OnSliceChanged ); m_SliceObserverTag1 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } { mitk::SliceNavigationController* slicer = renderWindow->GetQmitkRenderWindow(QString("sagittal"))->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkODFDetailsView::OnSliceChanged ); m_SliceObserverTag2 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } { mitk::SliceNavigationController* slicer = renderWindow->GetQmitkRenderWindow(QString("coronal"))->GetSliceNavigationController(); itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkODFDetailsView::OnSliceChanged ); m_SliceObserverTag3 = slicer->AddObserver( mitk::SliceNavigationController::GeometrySliceEvent(NULL, 0), command ); } } } void QmitkODFDetailsView::Hidden() { mitk::IRenderWindowPart* renderWindow = this->GetRenderWindowPart(); if (renderWindow) { mitk::SliceNavigationController* slicer = renderWindow->GetQmitkRenderWindow(QString("axial"))->GetSliceNavigationController(); slicer->RemoveObserver(m_SliceObserverTag1); slicer = renderWindow->GetQmitkRenderWindow(QString("sagittal"))->GetSliceNavigationController(); slicer->RemoveObserver(m_SliceObserverTag2); slicer = renderWindow->GetQmitkRenderWindow(QString("coronal"))->GetSliceNavigationController(); slicer->RemoveObserver(m_SliceObserverTag3); } } -void QmitkODFDetailsView::Activated() -{ -} - -void QmitkODFDetailsView::Deactivated() -{ -} - void QmitkODFDetailsView::SetFocus() { - this->m_Controls->m_ODFRenderWidget->setFocus(); + this->m_Controls->m_OverviewTextEdit->setFocus(); } void QmitkODFDetailsView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkODFDetailsViewControls; m_Controls->setupUi( parent ); m_Controls->m_OdfBox->setVisible(false); m_Controls->m_ODFRenderWidget->setVisible(false); } } -void QmitkODFDetailsView::OnSelectionChanged( berry::IWorkbenchPart::Pointer source, - const QList& nodes ) +void QmitkODFDetailsView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { if (m_ImageNode.IsNotNull()) m_ImageNode->RemoveObserver( m_PropertyObserverTag ); m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->m_InputImageLabel->setText("mandatory"); m_ImageNode = NULL; // iterate selection - foreach( mitk::DataNode::Pointer node, nodes ) + for (mitk::DataNode::Pointer node: nodes) { - if( node.IsNotNull() && (dynamic_cast(node->GetData()) || dynamic_cast(node->GetData())) ) { m_Controls->m_InputImageLabel->setText(node->GetName().c_str()); m_ImageNode = node; } } UpdateOdf(); if (m_ImageNode.IsNotNull()) { itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkODFDetailsView::OnSliceChanged ); m_PropertyObserverTag = m_ImageNode->AddObserver( itk::ModifiedEvent(), command ); m_Controls->m_InputData->setTitle("Input Data"); } } void QmitkODFDetailsView::UpdateOdf() { try { m_Controls->m_OverviewBox->setVisible(true); if (m_ImageNode.IsNull() || !this->GetRenderWindowPart()) { m_Controls->m_ODFRenderWidget->setVisible(false); m_Controls->m_OdfBox->setVisible(false); m_Controls->m_OverviewBox->setVisible(false); return; } // restore the input image label ( needed in case the last run resulted into an exception ) m_Controls->m_InputImageLabel->setText(m_ImageNode->GetName().c_str()); // ODF Normalization Property mitk::OdfNormalizationMethodProperty* nmp = dynamic_cast(m_ImageNode->GetProperty( "Normalization" )); if(nmp) m_OdfNormalization = nmp->GetNormalization(); m_TemplateOdf = itk::OrientationDistributionFunction::GetBaseMesh(); m_OdfTransform = vtkSmartPointer::New(); m_OdfTransform->Identity(); m_OdfVals = vtkSmartPointer::New(); m_OdfSource = vtkSmartPointer::New(); itk::OrientationDistributionFunction odf; mitk::Point3D world = this->GetRenderWindowPart()->GetSelectedPosition(); mitk::Point3D index; mitk::Image::Pointer img = dynamic_cast(m_ImageNode->GetData()); unsigned int *img_dimension = img->GetDimensions(); img->GetGeometry()->WorldToIndex(world, index); float sum = 0; float max = itk::NumericTraits::NonpositiveMin(); float min = itk::NumericTraits::max(); QString values; QString overviewText; // check if dynamic_cast successfull and if the crosshair position is inside of the geometry of the ODF data // otherwise possible crash for a scenario with multiple nodes if (dynamic_cast(m_ImageNode->GetData()) && ( m_ImageNode->GetData()->GetGeometry()->IsInside(world) ) ) { m_Controls->m_ODFRenderWidget->setVisible(true); m_Controls->m_OdfBox->setVisible(true); try { const mitk::QBallImage* qball_image = dynamic_cast< mitk::QBallImage* >( m_ImageNode->GetData() ); // get access to the qball image data with explicitely allowing exceptions if memory locked mitk::ImageReadAccessor readAccess( qball_image, qball_image->GetVolumeData(0), mitk::ImageAccessorBase::ExceptionIfLocked ); const float* qball_cPtr = static_cast< const float*>(readAccess.GetData()); OdfVectorImgType::IndexType ind; ind[0] = (int)(index[0]+0.5); ind[1] = (int)(index[1]+0.5); ind[2] = (int)(index[2]+0.5); // pixel size = QBALL_ODFSIZE // position offset = standard offset unsigned int offset_to_data = QBALL_ODFSIZE * (ind[2] * img_dimension[1] * img_dimension[0] + ind[1] * img_dimension[0] + ind[0]); const float *pixel_data = qball_cPtr + offset_to_data; for (int i=0; imax) max = val; if (val pd = odf.GetDirection(odf.GetPrincipleDiffusionDirection()); overviewText += "Main Diffusion:\n "+QString::number(pd[0])+"\n "+QString::number(pd[1])+"\n "+QString::number(pd[2])+"\n"; m_Controls->m_OdfValuesTextEdit->setText(values); m_Controls->m_OverviewTextEdit->setVisible(true); } catch( mitk::Exception &e ) { MITK_WARN << "LOCKED : " << e.what(); m_Controls->m_ODFRenderWidget->setVisible(false); m_Controls->m_OdfBox->setVisible(false); m_Controls->m_OverviewTextEdit->setVisible(false); // reset the selection m_Controls->m_InputImageLabel->setText("Click image to restore rendering!"); } } else if (dynamic_cast(m_ImageNode->GetData()) && ( m_ImageNode->GetData()->GetGeometry()->IsInside(world) ) ) { m_Controls->m_ODFRenderWidget->setVisible(true); m_Controls->m_OdfBox->setVisible(false); const mitk::TensorImage* qball_image = dynamic_cast< mitk::TensorImage*>(m_ImageNode->GetData()); // pixel access block try { // get access to the qball image data with explicitely allowing exceptions if memory locked mitk::ImageReadAccessor readAccess( qball_image, qball_image->GetVolumeData(0), mitk::ImageAccessorBase::ExceptionIfLocked ); const float* qball_cPtr = static_cast< const float*>(readAccess.GetData()); TensorImageType::IndexType ind; ind[0] = (int)(index[0]+0.5); ind[1] = (int)(index[1]+0.5); ind[2] = (int)(index[2]+0.5); // 6 - tensorsize // remaining computation - standard offset unsigned int offset_to_data = 6 * (ind[2] * img_dimension[1] * img_dimension[0] + ind[1] * img_dimension[0] + ind[0]); const float *pixel_data = qball_cPtr + offset_to_data; float tensorelems[6] = { *(pixel_data ), *(pixel_data + 1), *(pixel_data + 2), *(pixel_data + 3), *(pixel_data + 4), *(pixel_data + 5), }; itk::DiffusionTensor3D tensor(tensorelems); odf.InitFromTensor(tensor); /** Array of eigen-values. */ typedef itk::FixedArray EigenValuesArrayType; /** Matrix of eigen-vectors. */ typedef itk::Matrix MatrixType; typedef itk::Matrix EigenVectorsMatrixType; EigenValuesArrayType eigenValues; EigenVectorsMatrixType eigenvectors; QString pos = QString::number(ind[0])+", "+QString::number(ind[1])+", "+QString::number(ind[2]); overviewText += "Coordinates: "+pos+"\n"; overviewText += "FA: "+QString::number(tensor.GetFractionalAnisotropy())+"\n"; overviewText += "RA: "+QString::number(tensor.GetRelativeAnisotropy())+"\n"; overviewText += "Trace: "+QString::number(tensor.GetTrace())+"\n"; tensor.ComputeEigenAnalysis(eigenValues,eigenvectors); overviewText += "Eigenvalues:\n "+QString::number(eigenValues[2])+"\n "+QString::number(eigenValues[1])+"\n "+QString::number(eigenValues[0])+"\n"; overviewText += "Main Diffusion:\n "+QString::number(eigenvectors(2, 0))+"\n "+QString::number(eigenvectors(2, 1))+"\n "+QString::number(eigenvectors(2, 2))+"\n"; overviewText += "Values:\n "+QString::number(tensorelems[0])+"\n "+QString::number(tensorelems[1])+"\n "+QString::number(tensorelems[2])+"\n "+QString::number(tensorelems[3])+"\n "+QString::number(tensorelems[4])+"\n "+QString::number(tensorelems[5])+"\n "+"\n"; m_Controls->m_OverviewTextEdit->setVisible(true); } // end pixel access block catch(mitk::Exception &e ) { MITK_WARN << "LOCKED : " << e.what(); m_Controls->m_ODFRenderWidget->setVisible(false); m_Controls->m_OdfBox->setVisible(false); m_Controls->m_OverviewTextEdit->setVisible(false); // reset the selection m_Controls->m_InputImageLabel->setText("Click image to restore rendering!"); } } else { m_Controls->m_ODFRenderWidget->setVisible(false); m_Controls->m_OdfBox->setVisible(false); overviewText += "Please reinit image geometry.\n"; } // proceed only if the render widget is visible which indicates that the // predecessing computations were successfull if( m_Controls->m_ODFRenderWidget->isVisible() ) { m_Controls->m_ODFDetailsWidget->SetParameters(odf); switch(m_OdfNormalization) { case 0: odf = odf.MinMaxNormalize(); break; case 1: odf = odf.MaxNormalize(); break; case 2: odf = odf.MaxNormalize(); break; default: odf = odf.MinMaxNormalize(); } m_Controls->m_ODFRenderWidget->GenerateODF(odf); m_Controls->m_OverviewTextEdit->setText(overviewText.toStdString().c_str()); } } catch(...) { QMessageBox::critical(0, "Error", "Data could not be analyzed. The image might be corrupted."); } } void QmitkODFDetailsView::OnSliceChanged(const itk::EventObject& /*e*/) { UpdateOdf(); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.h index d221c196f2..edbacbe82d 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkODFDetailsView.h @@ -1,118 +1,115 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKQmitkODFDetailsView_H_INCLUDED #define _QMITKQmitkODFDetailsView_H_INCLUDED #include #include #include "mitkILifecycleAwarePart.h" #include "ui_QmitkODFDetailsViewControls.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /*! \brief View displaying details of the orientation distribution function in the voxel at the current crosshair position. - - \sa QmitkFunctionality - \ingroup Functionalities */ class QmitkODFDetailsView : public QmitkAbstractView, public mitk::ILifecycleAwarePart { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkODFDetailsView(); virtual ~QmitkODFDetailsView(); typedef float TOdfPixelType; typedef itk::Vector OdfVectorType; typedef itk::Image OdfVectorImgType; typedef itk::DiffusionTensor3D< TOdfPixelType > TensorPixelType; typedef itk::Image< TensorPixelType, 3 > TensorImageType; virtual void CreateQtPartControl(QWidget *parent) override; void OnSliceChanged(const itk::EventObject& e); protected slots: protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( berry::IWorkbenchPart::Pointer source, - const QList& nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; virtual void SetFocus() override; - void Visible() override; - void Hidden() override; - void Activated() override; - void Deactivated() override; + + virtual void Activated() override; + virtual void Deactivated() override; + virtual void Visible() override; + virtual void Hidden() override; void UpdateOdf(); ///< called if slice position or datamanager selection has changed Ui::QmitkODFDetailsViewControls* m_Controls; /** observer flags */ int m_SliceObserverTag1; int m_SliceObserverTag2; int m_SliceObserverTag3; int m_PropertyObserverTag; /** ODF related variables like mesh structure, values etc. */ vtkPolyData* m_TemplateOdf; ///< spherical base mesh vtkSmartPointer m_OdfTransform; vtkSmartPointer m_OdfVals; vtkSmartPointer m_OdfSource; int m_OdfNormalization; ///< normalization method defined in the visualization view /** rendering of the ODF */ vtkActor* m_VtkActor; vtkPolyDataMapper* m_VtkMapper; vtkRenderer* m_Renderer; vtkRenderWindow* m_VtkRenderWindow; vtkRenderWindowInteractor* m_RenderWindowInteractor; vtkCamera* m_Camera; mitk::DataNode::Pointer m_ImageNode; }; #endif // _QmitkODFDetailsView_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.cpp index 6702344ba4..ac3b100368 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.cpp @@ -1,1118 +1,1128 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //#define MBILOG_ENABLE_DEBUG #include "QmitkQBallReconstructionView.h" // qt includes #include // itk includes #include "itkTimeProbe.h" // mitk includes #include "mitkProgressBar.h" #include "mitkStatusBar.h" #include "mitkNodePredicateDataType.h" #include "QmitkDataStorageComboBox.h" -#include "QmitkStdMultiWidget.h" #include "itkDiffusionQballReconstructionImageFilter.h" #include "itkAnalyticalDiffusionQballReconstructionImageFilter.h" #include "itkDiffusionMultiShellQballReconstructionImageFilter.h" #include "itkVectorContainer.h" #include "itkB0ImageExtractionImageFilter.h" #include #include "mitkQBallImage.h" #include "mitkProperties.h" #include "mitkVtkResliceInterpolationProperty.h" #include "mitkLookupTable.h" #include "mitkLookupTableProperty.h" #include "mitkTransferFunction.h" #include "mitkTransferFunctionProperty.h" #include "mitkDataNodeObject.h" #include "mitkOdfNormalizationMethodProperty.h" #include "mitkOdfScaleByProperty.h" #include #include "mitkDiffusionImagingConfigure.h" #include "berryIStructuredSelection.h" #include "berryIWorkbenchWindow.h" #include "berryISelectionService.h" #include const std::string QmitkQBallReconstructionView::VIEW_ID = "org.mitk.views.qballreconstruction"; typedef float TTensorPixelType; const int QmitkQBallReconstructionView::nrconvkernels = 252; struct QbrShellSelection { typedef mitk::DiffusionPropertyHelper::GradientDirectionType GradientDirectionType; typedef mitk::DiffusionPropertyHelper::GradientDirectionsContainerType GradientDirectionContainerType; typedef mitk::DiffusionPropertyHelper::BValueMapType BValueMapType; typedef itk::VectorImage< DiffusionPixelType, 3 > ITKDiffusionImageType; QmitkQBallReconstructionView* m_View; mitk::DataNode * m_Node; std::string m_NodeName; std::vector m_CheckBoxes; QLabel * m_Label; mitk::Image * m_Image; QbrShellSelection(QmitkQBallReconstructionView* view, mitk::DataNode * node) : m_View(view), m_Node(node), m_NodeName(node->GetName()) { m_Image = dynamic_cast (node->GetData()); if(!m_Image) { MITK_ERROR << "QmitkQBallReconstructionView::QbrShellSelection : no image selected"; return; } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(m_Node->GetData())) ); if( !isDiffusionImage ) { MITK_ERROR << "QmitkQBallReconstructionView::QbrShellSelection : selected image contains no diffusion information"; return; } GenerateCheckboxes(); } void GenerateCheckboxes() { BValueMapType origMap = static_cast(m_Image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() )->GetBValueMap(); BValueMapType::iterator itStart = origMap.begin(); itStart++; BValueMapType::iterator itEnd = origMap.end(); m_Label = new QLabel(m_NodeName.c_str()); m_Label->setVisible(true); m_View->m_Controls->m_QBallSelectionBox->layout()->addWidget(m_Label); for(BValueMapType::iterator it = itStart ; it!= itEnd; it++) { QCheckBox * box = new QCheckBox(QString::number(it->first)); m_View->m_Controls->m_QBallSelectionBox->layout()->addWidget(box); box->setChecked(true); box->setCheckable(true); // box->setVisible(true); m_CheckBoxes.push_back(box); } } void SetVisible(bool vis) { foreach(QCheckBox * box, m_CheckBoxes) { box->setVisible(vis); } } BValueMapType GetBValueSelctionMap() { BValueMapType inputMap = static_cast(m_Image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() )->GetBValueMap(); BValueMapType outputMap; unsigned int val = 0; if(inputMap.find(0) == inputMap.end()){ MITK_INFO << "QbrShellSelection: return empty BValueMap from GUI Selection"; return outputMap; }else{ outputMap[val] = inputMap[val]; MITK_INFO << val; } foreach(QCheckBox * box, m_CheckBoxes) { if(box->isChecked()){ val = box->text().toDouble(); outputMap[val] = inputMap[val]; MITK_INFO << val; } } return outputMap; } ~QbrShellSelection() { m_View->m_Controls->m_QBallSelectionBox->layout()->removeWidget(m_Label); delete m_Label; for(std::vector::iterator it = m_CheckBoxes.begin() ; it!= m_CheckBoxes.end(); it++) { m_View->m_Controls->m_QBallSelectionBox->layout()->removeWidget((*it)); delete (*it); } m_CheckBoxes.clear(); } }; using namespace berry; struct QbrSelListener : ISelectionListener { QbrSelListener(QmitkQBallReconstructionView* view) { m_View = view; } void DoSelectionChanged(ISelection::ConstPointer selection) { // save current selection in member variable m_View->m_CurrentSelection = selection.Cast(); // do something with the selected items if(m_View->m_CurrentSelection) { bool foundDwiVolume = false; m_View->m_Controls->m_DiffusionImageLabel->setText("mandatory"); m_View->m_Controls->m_InputData->setTitle("Please Select Input Data"); QString selected_images = ""; mitk::DataStorage::SetOfObjects::Pointer set = mitk::DataStorage::SetOfObjects::New(); int at = 0; // iterate selection for (IStructuredSelection::iterator i = m_View->m_CurrentSelection->Begin(); i != m_View->m_CurrentSelection->End(); ++i) { // extract datatree node if (mitk::DataNodeObject::Pointer nodeObj = i->Cast()) { mitk::DataNode::Pointer node = nodeObj->GetDataNode(); bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())) ); mitk::Image* diffusionImage = dynamic_cast(node->GetData()); // only look at interesting types if(diffusionImage && isDiffusionImage) { foundDwiVolume = true; selected_images += QString(node->GetName().c_str()); if(i + 1 != m_View->m_CurrentSelection->End()) selected_images += "\n"; set->InsertElement(at++, node); } } } m_View->GenerateShellSelectionUI(set); m_View->m_Controls->m_DiffusionImageLabel->setText(selected_images); m_View->m_Controls->m_ButtonStandard->setEnabled(foundDwiVolume); if (foundDwiVolume) m_View->m_Controls->m_InputData->setTitle("Input Data"); else m_View->m_Controls->m_DiffusionImageLabel->setText("mandatory"); } } void SelectionChanged(const IWorkbenchPart::Pointer& part, const ISelection::ConstPointer& selection) override { // check, if selection comes from datamanager if (part) { QString partname = part->GetPartName(); if(partname == "Data Manager") { // apply selection DoSelectionChanged(selection); } } } QmitkQBallReconstructionView* m_View; }; // --------------- QmitkQBallReconstructionView----------------- // QmitkQBallReconstructionView::QmitkQBallReconstructionView() - : QmitkFunctionality(), - m_Controls(NULL), - m_MultiWidget(NULL) + : QmitkAbstractView(), + m_Controls(NULL) { } QmitkQBallReconstructionView::~QmitkQBallReconstructionView() { this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->RemovePostSelectionListener(/*"org.mitk.views.datamanager",*/ m_SelListener.data()); } void QmitkQBallReconstructionView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkQBallReconstructionViewControls; m_Controls->setupUi(parent); this->CreateConnections(); m_Controls->m_DiffusionImageLabel->setText("mandatory"); QStringList items; items << "2" << "4" << "6" << "8" << "10" << "12"; m_Controls->m_QBallReconstructionMaxLLevelComboBox->addItems(items); m_Controls->m_QBallReconstructionMaxLLevelComboBox->setCurrentIndex(1); MethodChoosen(m_Controls->m_QBallReconstructionMethodComboBox->currentIndex()); #ifndef DIFFUSION_IMAGING_EXTENDED m_Controls->m_QBallReconstructionMethodComboBox->removeItem(3); #endif AdvancedCheckboxClicked(); } m_SelListener.reset(new QbrSelListener(this)); this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener(/*"org.mitk.views.datamanager",*/ m_SelListener.data()); berry::ISelection::ConstPointer sel( this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); m_CurrentSelection = sel.Cast(); static_cast(m_SelListener.data())->DoSelectionChanged(sel); } -void QmitkQBallReconstructionView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkQBallReconstructionView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - -void QmitkQBallReconstructionView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->m_AdvancedCheckbox->setFocus(); } void QmitkQBallReconstructionView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_ButtonStandard), SIGNAL(clicked()), this, SLOT(ReconstructStandard()) ); connect( (QObject*)(m_Controls->m_AdvancedCheckbox), SIGNAL(clicked()), this, SLOT(AdvancedCheckboxClicked()) ); connect( (QObject*)(m_Controls->m_QBallReconstructionMethodComboBox), SIGNAL(currentIndexChanged(int)), this, SLOT(MethodChoosen(int)) ); connect( (QObject*)(m_Controls->m_QBallReconstructionThreasholdEdit), SIGNAL(valueChanged(int)), this, SLOT(PreviewThreshold(int)) ); } } -void QmitkQBallReconstructionView::OnSelectionChanged( std::vector ) +void QmitkQBallReconstructionView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& /*nodes*/) { } void QmitkQBallReconstructionView::Activated() { - QmitkFunctionality::Activated(); - berry::ISelection::ConstPointer sel( this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); m_CurrentSelection = sel.Cast(); static_cast(m_SelListener.data())->DoSelectionChanged(sel); } void QmitkQBallReconstructionView::Deactivated() { - mitk::DataStorage::SetOfObjects::ConstPointer objects = this->GetDefaultDataStorage()->GetAll(); + mitk::DataStorage::SetOfObjects::ConstPointer objects = this->GetDataStorage()->GetAll(); mitk::DataStorage::SetOfObjects::const_iterator itemiter( objects->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( objects->end() ); while ( itemiter != itemiterend ) // for all items { mitk::DataNode::Pointer node = *itemiter; if (node.IsNull()) continue; // only look at interesting types bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())) ); if( isDiffusionImage ) { - if (this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) + if (this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) { - node = this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); - this->GetDefaultDataStorage()->Remove(node); + node = this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); + this->GetDataStorage()->Remove(node); } } itemiter++; } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Deactivated(); +} + +void QmitkQBallReconstructionView::Visible() +{ +} + +void QmitkQBallReconstructionView::Hidden() +{ } void QmitkQBallReconstructionView::ReconstructStandard() { int index = m_Controls->m_QBallReconstructionMethodComboBox->currentIndex(); #ifndef DIFFUSION_IMAGING_EXTENDED if(index>=3) { index = index + 1; } #endif switch(index) { case 0: { // Numerical Reconstruct(0,0); break; } case 1: { // Standard Reconstruct(1,0); break; } case 2: { // Solid Angle Reconstruct(1,6); break; } case 3: { // Constrained Solid Angle Reconstruct(1,7); break; } case 4: { // ADC Reconstruct(1,4); break; } case 5: { // Raw Signal Reconstruct(1,5); break; } case 6: { // Q-Ball reconstruction Reconstruct(2,0); break; } } } void QmitkQBallReconstructionView::MethodChoosen(int method) { #ifndef DIFFUSION_IMAGING_EXTENDED if(method>=3) { method = method + 1; } #endif m_Controls->m_QBallSelectionBox->setHidden(true); m_Controls->m_OutputCoeffsImage->setHidden(true); if (method==0) m_Controls->m_ShFrame->setVisible(false); else m_Controls->m_ShFrame->setVisible(true); switch(method) { case 0: m_Controls->m_Description->setText("Numerical recon. (Tuch 2004)"); break; case 1: m_Controls->m_Description->setText("Spherical harmonics recon. (Descoteaux 2007)"); m_Controls->m_OutputCoeffsImage->setHidden(false); break; case 2: m_Controls->m_Description->setText("SH recon. with solid angle consideration (Aganj 2009)"); m_Controls->m_OutputCoeffsImage->setHidden(false); break; case 3: m_Controls->m_Description->setText("SH solid angle with non-neg. constraint (Goh 2009)"); m_Controls->m_OutputCoeffsImage->setHidden(false); break; case 4: m_Controls->m_Description->setText("SH recon. of the plain ADC-profiles"); m_Controls->m_OutputCoeffsImage->setHidden(false); break; case 5: m_Controls->m_Description->setText("SH recon. of the raw diffusion signal"); m_Controls->m_OutputCoeffsImage->setHidden(false); break; case 6: m_Controls->m_Description->setText("SH recon. of the multi shell diffusion signal (Aganj 2010)"); m_Controls->m_QBallSelectionBox->setHidden(false); m_Controls->m_OutputCoeffsImage->setHidden(false); break; } } void QmitkQBallReconstructionView::AdvancedCheckboxClicked() { bool check = m_Controls->m_AdvancedCheckbox->isChecked(); m_Controls->m_QBallReconstructionMaxLLevelTextLabel_2->setVisible(check); m_Controls->m_QBallReconstructionMaxLLevelComboBox->setVisible(check); m_Controls->m_QBallReconstructionLambdaTextLabel_2->setVisible(check); m_Controls->m_QBallReconstructionLambdaLineEdit->setVisible(check); m_Controls->m_QBallReconstructionThresholdLabel_2->setVisible(check); m_Controls->m_QBallReconstructionThreasholdEdit->setVisible(check); m_Controls->label_2->setVisible(check); m_Controls->frame_2->setVisible(check); } void QmitkQBallReconstructionView::Reconstruct(int method, int normalization) { if (m_CurrentSelection) { mitk::DataStorage::SetOfObjects::Pointer set = mitk::DataStorage::SetOfObjects::New(); int at = 0; for (IStructuredSelection::iterator i = m_CurrentSelection->Begin(); i != m_CurrentSelection->End(); ++i) { if (mitk::DataNodeObject::Pointer nodeObj = i->Cast()) { mitk::DataNode::Pointer node = nodeObj->GetDataNode(); bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())) ); if ( isDiffusionImage ) { set->InsertElement(at++, node); } } } if(method == 0) { NumericalQBallReconstruction(set, normalization); } else { #if BOOST_VERSION / 100000 > 0 #if BOOST_VERSION / 100 % 1000 > 34 if(method == 1) { AnalyticalQBallReconstruction(set, normalization); } if(method == 2) { MultiQBallReconstruction(set); } #else std::cout << "ERROR: Boost 1.35 minimum required" << std::endl; QMessageBox::warning(NULL,"ERROR","Boost 1.35 minimum required"); #endif #else std::cout << "ERROR: Boost 1.35 minimum required" << std::endl; QMessageBox::warning(NULL,"ERROR","Boost 1.35 minimum required"); #endif } } } void QmitkQBallReconstructionView::NumericalQBallReconstruction (mitk::DataStorage::SetOfObjects::Pointer inImages, int normalization) { try { itk::TimeProbe clock; int nrFiles = inImages->size(); if (!nrFiles) return; QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles); mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); while ( itemiter != itemiterend ) // for all items { mitk::Image* vols = static_cast( (*itemiter)->GetData()); std::string nodename; (*itemiter)->GetStringProperty("name", nodename); // QBALL RECONSTRUCTION clock.Start(); MITK_INFO << "QBall reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "QBall reconstruction for %s", nodename.c_str()).toLatin1()); typedef itk::DiffusionQballReconstructionImageFilter QballReconstructionImageFilterType; ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(vols, itkVectorImagePointer); QballReconstructionImageFilterType::Pointer filter = QballReconstructionImageFilterType::New(); filter->SetGradientImage( static_cast( vols->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), itkVectorImagePointer ); filter->SetBValue( static_cast(vols->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ); filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdEdit->value() ); std::string nodePostfix; switch(normalization) { case 0: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD); nodePostfix = "_Numerical_Qball"; break; } case 1: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO_B_VALUE); nodePostfix = "_Numerical_ZeroBvalueNormalization_Qball"; break; } case 2: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO); nodePostfix = "_NumericalQball_ZeroNormalization_Qball"; break; } case 3: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_NONE); nodePostfix = "_NumericalQball_NoNormalization_Qball"; break; } default: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD); nodePostfix = "_NumericalQball_Qball"; } } filter->Update(); clock.Stop(); MITK_DEBUG << "took " << clock.GetMean() << "s." ; // ODFs TO DATATREE mitk::QBallImage::Pointer image = mitk::QBallImage::New(); image->InitializeByItk( filter->GetOutput() ); image->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); SetDefaultNodeProperties(node, nodename+nodePostfix); mitk::ProgressBar::GetInstance()->Progress(); - GetDefaultDataStorage()->Add(node, *itemiter); + GetDataStorage()->Add(node, *itemiter); ++itemiter; } mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toLatin1()); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); } catch (itk::ExceptionObject &ex) { MITK_INFO << ex ; QMessageBox::information(0, "Reconstruction not possible:", ex.GetDescription()); return ; } } void QmitkQBallReconstructionView::AnalyticalQBallReconstruction( mitk::DataStorage::SetOfObjects::Pointer inImages, int normalization) { try { itk::TimeProbe clock; int nrFiles = inImages->size(); if (!nrFiles) return; std::vector lambdas; float minLambda = m_Controls->m_QBallReconstructionLambdaLineEdit->value(); lambdas.push_back(minLambda); int nLambdas = lambdas.size(); QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles*nLambdas); mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); std::vector* nodes = new std::vector(); while ( itemiter != itemiterend ) // for all items { // QBALL RECONSTRUCTION clock.Start(); MITK_INFO << "QBall reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("QBall reconstruction for %s", (*itemiter)->GetName().c_str()).toLatin1()); for(int i=0; im_QBallReconstructionMaxLLevelComboBox->currentIndex()) { case 0: { TemplatedAnalyticalQBallReconstruction<2>(*itemiter, currentLambda, normalization); break; } case 1: { TemplatedAnalyticalQBallReconstruction<4>(*itemiter, currentLambda, normalization); break; } case 2: { TemplatedAnalyticalQBallReconstruction<6>(*itemiter, currentLambda, normalization); break; } case 3: { TemplatedAnalyticalQBallReconstruction<8>(*itemiter, currentLambda, normalization); break; } case 4: { TemplatedAnalyticalQBallReconstruction<10>(*itemiter, currentLambda, normalization); break; } case 5: { TemplatedAnalyticalQBallReconstruction<12>(*itemiter, currentLambda, normalization); break; } } clock.Stop(); MITK_DEBUG << "took " << clock.GetMean() << "s." ; mitk::ProgressBar::GetInstance()->Progress(); itemiter++; } } std::vector::iterator nodeIt; for(nodeIt = nodes->begin(); nodeIt != nodes->end(); ++nodeIt) - GetDefaultDataStorage()->Add(*nodeIt); + GetDataStorage()->Add(*nodeIt); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toLatin1()); } catch (itk::ExceptionObject &ex) { MITK_INFO << ex; QMessageBox::information(0, "Reconstruction not possible:", ex.GetDescription()); return; } } template void QmitkQBallReconstructionView::TemplatedAnalyticalQBallReconstruction(mitk::DataNode* dataNodePointer, float lambda, int normalization) { typedef itk::AnalyticalDiffusionQballReconstructionImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); mitk::Image* vols = dynamic_cast(dataNodePointer->GetData()); ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(vols, itkVectorImagePointer); filter->SetGradientImage( static_cast( vols->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), itkVectorImagePointer ); filter->SetBValue( static_cast(vols->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ); filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdEdit->value() ); filter->SetLambda(lambda); std::string nodePostfix; switch(normalization) { case 0: { filter->SetNormalizationMethod(FilterType::QBAR_STANDARD); nodePostfix = "_SH_Qball"; break; } case 1: { filter->SetNormalizationMethod(FilterType::QBAR_B_ZERO_B_VALUE); nodePostfix = "_SH_1_Qball"; break; } case 2: { filter->SetNormalizationMethod(FilterType::QBAR_B_ZERO); nodePostfix = "_SH_2_Qball"; break; } case 3: { filter->SetNormalizationMethod(FilterType::QBAR_NONE); nodePostfix = "_SH_3_Qball"; break; } case 4: { filter->SetNormalizationMethod(FilterType::QBAR_ADC_ONLY); nodePostfix = "_AdcProfile"; break; } case 5: { filter->SetNormalizationMethod(FilterType::QBAR_RAW_SIGNAL); nodePostfix = "_RawSignal"; break; } case 6: { filter->SetNormalizationMethod(FilterType::QBAR_SOLID_ANGLE); nodePostfix = "_SH_CSA_Qball"; break; } case 7: { filter->SetNormalizationMethod(FilterType::QBAR_NONNEG_SOLID_ANGLE); nodePostfix = "_SH_NonNegCSA_Qball"; break; } default: { filter->SetNormalizationMethod(FilterType::QBAR_STANDARD); } } filter->Update(); if(m_Controls->m_OutputCoeffsImage->isChecked()) { mitk::Image::Pointer coeffsImage = mitk::Image::New(); coeffsImage->InitializeByItk( filter->GetCoefficientImage().GetPointer() ); coeffsImage->SetVolume( filter->GetCoefficientImage()->GetBufferPointer() ); mitk::DataNode::Pointer coeffsNode=mitk::DataNode::New(); coeffsNode->SetData( coeffsImage ); coeffsNode->SetProperty( "name", mitk::StringProperty::New(dataNodePointer->GetName()+"_SH-Coefficients") ); GetDefaultDataStorage()->Add(coeffsNode, dataNodePointer); } // ODFs TO DATATREE mitk::QBallImage::Pointer image = mitk::QBallImage::New(); image->InitializeByItk( filter->GetOutput() ); image->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); SetDefaultNodeProperties(node, dataNodePointer->GetName()+nodePostfix); GetDefaultDataStorage()->Add(node, dataNodePointer); + + if(m_Controls->m_OutputCoeffsImage->isChecked()) + { + mitk::Image::Pointer coeffsImage = mitk::Image::New(); + coeffsImage->InitializeByItk( filter->GetCoefficientImage().GetPointer() ); + coeffsImage->SetVolume( filter->GetCoefficientImage()->GetBufferPointer() ); + mitk::DataNode::Pointer coeffsNode=mitk::DataNode::New(); + coeffsNode->SetData( coeffsImage ); + coeffsNode->SetProperty( "name", mitk::StringProperty::New(dataNodePointer->GetName()+"_SH-Coeffs") ); + coeffsNode->SetVisibility(false); + GetDataStorage()->Add(coeffsNode, node); + } } void QmitkQBallReconstructionView::MultiQBallReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages) { try { itk::TimeProbe clock; int nrFiles = inImages->size(); if (!nrFiles) return; std::vector lambdas; float minLambda = m_Controls->m_QBallReconstructionLambdaLineEdit->value(); lambdas.push_back(minLambda); int nLambdas = lambdas.size(); QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles*nLambdas); mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); while ( itemiter != itemiterend ) // for all items { mitk::DataNode* nodePointer = (*itemiter).GetPointer(); std::string nodename; (*itemiter)->GetStringProperty("name",nodename); itemiter++; // QBALL RECONSTRUCTION clock.Start(); MITK_INFO << "QBall reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("QBall reconstruction for %s", nodename.c_str()).toLatin1()); for(int i=0; im_QBallReconstructionMaxLLevelComboBox->currentIndex()) { case 0: { TemplatedMultiQBallReconstruction<2>(currentLambda, nodePointer); break; } case 1: { TemplatedMultiQBallReconstruction<4>(currentLambda, nodePointer); break; } case 2: { TemplatedMultiQBallReconstruction<6>(currentLambda, nodePointer); break; } case 3: { TemplatedMultiQBallReconstruction<8>(currentLambda, nodePointer); break; } case 4: { TemplatedMultiQBallReconstruction<10>(currentLambda, nodePointer); break; } case 5: { TemplatedMultiQBallReconstruction<12>(currentLambda, nodePointer); break; } } clock.Stop(); MITK_DEBUG << "took " << clock.GetMean() << "s." ; mitk::ProgressBar::GetInstance()->Progress(); } } - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toLatin1()); } catch (itk::ExceptionObject &ex) { MITK_INFO << ex ; QMessageBox::information(0, "Reconstruction not possible:", ex.GetDescription()); return ; } } template void QmitkQBallReconstructionView::TemplatedMultiQBallReconstruction(float lambda, mitk::DataNode* dataNodePointer) { typedef itk::DiffusionMultiShellQballReconstructionImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); std::string nodename; dataNodePointer->GetStringProperty("name",nodename); mitk::Image* dwi = dynamic_cast(dataNodePointer->GetData()); BValueMapType currSelectionMap = m_ShellSelectorMap[dataNodePointer]->GetBValueSelctionMap(); if(currSelectionMap.size() != 4 && currSelectionMap.find(0) != currSelectionMap.end()) { QMessageBox::information(0, "Reconstruction not possible:" ,QString("Only three shells in a equidistant configuration is supported. (ImageName: " + QString(nodename.c_str()) + ")")); return; } BValueMapType::reverse_iterator it1 = currSelectionMap.rbegin(); BValueMapType::reverse_iterator it2 = currSelectionMap.rbegin(); ++it2; // Get average distance int avdistance = 0; for(; it2 != currSelectionMap.rend(); ++it1,++it2) avdistance += (int)it1->first - (int)it2->first; avdistance /= currSelectionMap.size()-1; // Check if all shells are using the same averae distance it1 = currSelectionMap.rbegin(); it2 = currSelectionMap.rbegin(); ++it2; for(; it2 != currSelectionMap.rend(); ++it1,++it2) if(avdistance != (int)it1->first - (int)it2->first) { QMessageBox::information(0, "Reconstruction not possible:" ,QString("Selected Shells are not in a equidistant configuration. (ImageName: " + QString(nodename.c_str()) + ")")); return; } ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(dwi, itkVectorImagePointer); filter->SetBValueMap(m_ShellSelectorMap[dataNodePointer]->GetBValueSelctionMap()); filter->SetGradientImage( static_cast( dwi->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(), itkVectorImagePointer, static_cast(dwi->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ); filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdEdit->value() ); filter->SetLambda(lambda); filter->Update(); if(m_Controls->m_OutputCoeffsImage->isChecked()) { mitk::Image::Pointer coeffsImage = mitk::Image::New(); coeffsImage->InitializeByItk( filter->GetCoefficientImage().GetPointer() ); coeffsImage->SetVolume( filter->GetCoefficientImage()->GetBufferPointer() ); mitk::DataNode::Pointer coeffsNode=mitk::DataNode::New(); coeffsNode->SetData( coeffsImage ); coeffsNode->SetProperty( "name", mitk::StringProperty::New( QString(nodename.c_str()).append("_SH-Coefficients").toStdString()) ); GetDefaultDataStorage()->Add(coeffsNode, dataNodePointer); } // ODFs TO DATATREE mitk::QBallImage::Pointer image = mitk::QBallImage::New(); image->InitializeByItk( filter->GetOutput() ); image->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); SetDefaultNodeProperties(node, nodename+"_SH_MultiShell_Qball"); GetDefaultDataStorage()->Add(node, dataNodePointer); } void QmitkQBallReconstructionView::SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name) { node->SetProperty( "ShowMaxNumber", mitk::IntProperty::New( 500 ) ); node->SetProperty( "Scaling", mitk::FloatProperty::New( 1.0 ) ); node->SetProperty( "Normalization", mitk::OdfNormalizationMethodProperty::New()); node->SetProperty( "ScaleBy", mitk::OdfScaleByProperty::New()); node->SetProperty( "IndexParam1", mitk::FloatProperty::New(2)); node->SetProperty( "IndexParam2", mitk::FloatProperty::New(1)); node->SetProperty( "visible", mitk::BoolProperty::New( true ) ); node->SetProperty( "VisibleOdfs", mitk::BoolProperty::New( false ) ); node->SetProperty ("layer", mitk::IntProperty::New(100)); node->SetProperty( "DoRefresh", mitk::BoolProperty::New( true ) ); node->SetProperty( "name", mitk::StringProperty::New(name) ); } void QmitkQBallReconstructionView::GenerateShellSelectionUI(mitk::DataStorage::SetOfObjects::Pointer set) { m_DiffusionImages = set; std::map tempMap; const mitk::DataStorage::SetOfObjects::iterator setEnd( set->end() ); mitk::DataStorage::SetOfObjects::iterator NodeIt( set->begin() ); while(NodeIt != setEnd) { if(m_ShellSelectorMap.find( (*NodeIt).GetPointer() ) != m_ShellSelectorMap.end()) { tempMap[(*NodeIt).GetPointer()] = m_ShellSelectorMap[(*NodeIt).GetPointer()]; m_ShellSelectorMap.erase((*NodeIt).GetPointer()); }else { tempMap[(*NodeIt).GetPointer()] = new QbrShellSelection(this, (*NodeIt) ); tempMap[(*NodeIt).GetPointer()]->SetVisible(true); } NodeIt++; } for(std::map::iterator it = m_ShellSelectorMap.begin(); it != m_ShellSelectorMap.end();it ++) { delete it->second; } m_ShellSelectorMap.clear(); m_ShellSelectorMap = tempMap; } void QmitkQBallReconstructionView::PreviewThreshold(int threshold) { mitk::DataStorage::SetOfObjects::const_iterator itemiter( m_DiffusionImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( m_DiffusionImages->end() ); while ( itemiter != itemiterend ) // for all items { mitk::Image* vols = static_cast( (*itemiter)->GetData()); // Extract b0 image ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(vols, itkVectorImagePointer); typedef itk::B0ImageExtractionImageFilter FilterType; FilterType::Pointer filterB0 = FilterType::New(); filterB0->SetInput( itkVectorImagePointer ); filterB0->SetDirections( static_cast( vols->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer() ); filterB0->Update(); mitk::Image::Pointer mitkImage = mitk::Image::New(); typedef itk::Image ImageType; typedef itk::Image SegmentationType; typedef itk::BinaryThresholdImageFilter ThresholdFilterType; // apply threshold ThresholdFilterType::Pointer filterThreshold = ThresholdFilterType::New(); filterThreshold->SetInput(filterB0->GetOutput()); filterThreshold->SetLowerThreshold(threshold); filterThreshold->SetInsideValue(0); filterThreshold->SetOutsideValue(1); // mark cut off values red filterThreshold->Update(); mitkImage->InitializeByItk( filterThreshold->GetOutput() ); mitkImage->SetVolume( filterThreshold->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node; - if (this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) + if (this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) { - node = this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); + node = this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); } else { // create a new node, to show thresholded values node = mitk::DataNode::New(); - GetDefaultDataStorage()->Add( node, *itemiter ); + GetDataStorage()->Add( node, *itemiter ); node->SetProperty( "name", mitk::StringProperty::New("ThresholdOverlay")); node->SetBoolProperty("helper object", true); } node->SetData( mitkImage ); itemiter++; mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.h index 07800c0942..792fa3aa2d 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkQBallReconstructionView.h @@ -1,138 +1,144 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKQBALLRECONSTRUCTIONVIEW_H_INCLUDED #define _QMITKQBALLRECONSTRUCTIONVIEW_H_INCLUDED -#include +#include +#include #include #include "ui_QmitkQBallReconstructionViewControls.h" #include #include #include #include #include #include typedef short DiffusionPixelType; struct QbrSelListener; struct QbrShellSelection; /*! * \ingroup org_mitk_gui_qt_qballreconstruction_internal * * \brief QmitkQBallReconstructionView * * Document your class here. - * - * \sa QmitkFunctionality */ -class QmitkQBallReconstructionView : public QmitkFunctionality +class QmitkQBallReconstructionView : public QmitkAbstractView, public mitk::ILifecycleAwarePart { friend struct QbrSelListener; friend struct QbrShellSelection; typedef mitk::DiffusionPropertyHelper::GradientDirectionType GradientDirectionType; typedef mitk::DiffusionPropertyHelper::GradientDirectionsContainerType GradientDirectionContainerType; typedef mitk::DiffusionPropertyHelper::BValueMapType BValueMapType; typedef itk::VectorImage< DiffusionPixelType, 3 > ITKDiffusionImageType; // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkQBallReconstructionView(); virtual ~QmitkQBallReconstructionView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Called when the functionality is activated + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + + /// \brief Called when the view gets activated virtual void Activated() override; + /// \brief Called when the view gets deactivated virtual void Deactivated() override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// \brief Called when the view becomes visible + virtual void Visible() override; + + /// \brief Called when the view becomes hidden + virtual void Hidden() override; static const int nrconvkernels; protected slots: void ReconstructStandard(); void AdvancedCheckboxClicked(); void MethodChoosen(int method); void Reconstruct(int method, int normalization); void NumericalQBallReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages, int normalization); void AnalyticalQBallReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages, int normalization); void MultiQBallReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages); /** * @brief PreviewThreshold Generates a preview of the values that are cut off by the thresholds * @param threshold */ void PreviewThreshold(int threshold); protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkQBallReconstructionViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - template void TemplatedAnalyticalQBallReconstruction(mitk::DataNode* dataNodePointer, float lambda, int normalization); template void TemplatedMultiQBallReconstruction(float lambda, mitk::DataNode*); void SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name); //void Create QScopedPointer m_SelListener; berry::IStructuredSelection::ConstPointer m_CurrentSelection; mitk::DataStorage::SetOfObjects::Pointer m_DiffusionImages; private: std::map< const mitk::DataNode *, QbrShellSelection * > m_ShellSelectorMap; void GenerateShellSelectionUI(mitk::DataStorage::SetOfObjects::Pointer set); }; #endif // _QMITKQBALLRECONSTRUCTIONVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.cpp index fc890225ad..7f0afd2094 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.cpp @@ -1,1068 +1,1064 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkTensorReconstructionView.h" #include "mitkDiffusionImagingConfigure.h" // qt includes #include #include #include #include #include // itk includes #include "itkTimeProbe.h" //#include "itkTensor.h" // mitk includes #include "mitkProgressBar.h" #include "mitkStatusBar.h" #include "mitkNodePredicateDataType.h" #include "QmitkDataStorageComboBox.h" -#include "QmitkStdMultiWidget.h" #include "mitkTeemDiffusionTensor3DReconstructionImageFilter.h" #include "itkDiffusionTensor3DReconstructionImageFilter.h" #include "itkTensorImageToDiffusionImageFilter.h" #include "itkPointShell.h" #include "itkVector.h" #include "itkB0ImageExtractionImageFilter.h" #include "itkTensorReconstructionWithEigenvalueCorrectionFilter.h" #include "mitkImageCast.h" #include "mitkImageAccessByItk.h" #include #include #include "mitkProperties.h" #include "mitkDataNodeObject.h" #include "mitkOdfNormalizationMethodProperty.h" #include "mitkOdfScaleByProperty.h" #include "mitkLookupTableProperty.h" #include "mitkLookupTable.h" #include "mitkImageStatisticsHolder.h" #include #include #include #include #include #include const std::string QmitkTensorReconstructionView::VIEW_ID = "org.mitk.views.tensorreconstruction"; typedef float TTensorPixelType; typedef itk::DiffusionTensor3D< TTensorPixelType > TensorPixelType; typedef itk::Image< TensorPixelType, 3 > TensorImageType; using namespace berry; QmitkTensorReconstructionView::QmitkTensorReconstructionView() - : QmitkFunctionality(), - m_Controls(NULL), - m_MultiWidget(NULL) + : QmitkAbstractView(), + m_Controls(NULL) { m_DiffusionImages = mitk::DataStorage::SetOfObjects::New(); m_TensorImages = mitk::DataStorage::SetOfObjects::New(); } QmitkTensorReconstructionView::~QmitkTensorReconstructionView() { } void QmitkTensorReconstructionView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkTensorReconstructionViewControls; m_Controls->setupUi(parent); this->CreateConnections(); Advanced1CheckboxClicked(); } } -void QmitkTensorReconstructionView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkTensorReconstructionView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - -void QmitkTensorReconstructionView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->m_Advanced1->setFocus(); } void QmitkTensorReconstructionView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_StartReconstruction), SIGNAL(clicked()), this, SLOT(Reconstruct()) ); connect( (QObject*)(m_Controls->m_Advanced1), SIGNAL(clicked()), this, SLOT(Advanced1CheckboxClicked()) ); connect( (QObject*)(m_Controls->m_TensorsToDWIButton), SIGNAL(clicked()), this, SLOT(TensorsToDWI()) ); connect( (QObject*)(m_Controls->m_TensorsToQbiButton), SIGNAL(clicked()), this, SLOT(TensorsToQbi()) ); connect( (QObject*)(m_Controls->m_ResidualButton), SIGNAL(clicked()), this, SLOT(ResidualCalculation()) ); connect( (QObject*)(m_Controls->m_PerSliceView), SIGNAL(pointSelected(int, int)), this, SLOT(ResidualClicked(int, int)) ); connect( (QObject*)(m_Controls->m_TensorReconstructionThreshold), SIGNAL(valueChanged(int)), this, SLOT(PreviewThreshold(int)) ); } } void QmitkTensorReconstructionView::ResidualClicked(int slice, int volume) { // Use image coord to reset crosshair // Find currently selected diffusion image // Update Label // to do: This position should be modified in order to skip B0 volumes that are not taken into account // when calculating residuals // Find the diffusion image mitk::Image* diffImage; mitk::DataNode::Pointer correctNode; mitk::BaseGeometry* geometry; bool isDiffusionImage(false); if (m_DiffusionImage.IsNotNull()) { isDiffusionImage = mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(m_DiffusionImage->GetData())) ; diffImage = static_cast(m_DiffusionImage->GetData()); geometry = m_DiffusionImage->GetData()->GetGeometry(); // Remember the node whose display index must be updated correctNode = mitk::DataNode::New(); correctNode = m_DiffusionImage; } if( isDiffusionImage ) { GradientDirectionContainerType::Pointer dirs = static_cast( diffImage->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(); for(unsigned int i=0; iSize() && i<=volume; i++) { GradientDirectionType grad = dirs->ElementAt(i); // check if image is b0 weighted if(fabs(grad[0]) < 0.001 && fabs(grad[1]) < 0.001 && fabs(grad[2]) < 0.001) { volume++; } } QString pos = "Volume: "; pos.append(QString::number(volume)); pos.append(", Slice: "); pos.append(QString::number(slice)); m_Controls->m_PositionLabel->setText(pos); if(correctNode) { int oldDisplayVal; correctNode->GetIntProperty("DisplayChannel", oldDisplayVal); QString oldVal = QString::number(oldDisplayVal); QString newVal = QString::number(volume); correctNode->SetIntProperty("DisplayChannel",volume); correctNode->SetSelected(true); this->FirePropertyChanged("DisplayChannel", oldVal, newVal); correctNode->UpdateOutputInformation(); - mitk::Point3D p3 = m_MultiWidget->GetCrossPosition(); + mitk::Point3D p3 = this->GetRenderWindowPart()->GetSelectedPosition(); itk::Index<3> ix; geometry->WorldToIndex(p3, ix); // ix[2] = slice; mitk::Vector3D vec; vec[0] = ix[0]; vec[1] = ix[1]; vec[2] = slice; mitk::Vector3D v3New; geometry->IndexToWorld(vec, v3New); mitk::Point3D origin = geometry->GetOrigin(); mitk::Point3D p3New; p3New[0] = v3New[0] + origin[0]; p3New[1] = v3New[1] + origin[1]; p3New[2] = v3New[2] + origin[2]; - m_MultiWidget->MoveCrossToPosition(p3New); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->SetSelectedPosition(p3New); + this->GetRenderWindowPart()->RequestUpdate(); } } } void QmitkTensorReconstructionView::Advanced1CheckboxClicked() { bool check = m_Controls-> m_Advanced1->isChecked(); m_Controls->frame->setVisible(check); } void QmitkTensorReconstructionView::Activated() { - QmitkFunctionality::Activated(); - } void QmitkTensorReconstructionView::Deactivated() { // Get all current nodes - mitk::DataStorage::SetOfObjects::ConstPointer objects = this->GetDefaultDataStorage()->GetAll(); + mitk::DataStorage::SetOfObjects::ConstPointer objects = this->GetDataStorage()->GetAll(); mitk::DataStorage::SetOfObjects::const_iterator itemiter( objects->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( objects->end() ); while ( itemiter != itemiterend ) // for all items { mitk::DataNode::Pointer node = *itemiter; if (node.IsNull()) continue; // only look at interesting types if( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage(dynamic_cast(node->GetData()))) { - if (this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) + if (this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) { - node = this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); - this->GetDefaultDataStorage()->Remove(node); + node = this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); + this->GetDataStorage()->Remove(node); } } itemiter++; } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); +} - QmitkFunctionality::Deactivated(); +void QmitkTensorReconstructionView::Visible() +{ +} + +void QmitkTensorReconstructionView::Hidden() +{ } void QmitkTensorReconstructionView::ResidualCalculation() { // Extract dwi and dti from current selection // In case of multiple selections, take the first one, since taking all combinations is not meaningful mitk::DataStorage::SetOfObjects::Pointer set = mitk::DataStorage::SetOfObjects::New(); mitk::Image::Pointer diffImage = mitk::Image::New(); TensorImageType::Pointer tensorImage; std::string nodename; if(m_DiffusionImage.IsNotNull()) { diffImage = static_cast(m_DiffusionImage->GetData()); } else return; if(m_TensorImage.IsNotNull()) { mitk::TensorImage* mitkVol; mitkVol = static_cast(m_TensorImage->GetData()); mitk::CastToItkImage(mitkVol, tensorImage); m_TensorImage->GetStringProperty("name", nodename); } else return; typedef itk::TensorImageToDiffusionImageFilter< TTensorPixelType, DiffusionPixelType > FilterType; GradientDirectionContainerType* gradients = static_cast( diffImage->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(); // Find the min and the max values from a baseline image mitk::ImageStatisticsHolder *stats = diffImage->GetStatistics(); //Initialize filter that calculates the modeled diffusion weighted signals FilterType::Pointer filter = FilterType::New(); filter->SetInput( tensorImage ); filter->SetBValue( static_cast(diffImage->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue()); filter->SetGradientList(gradients); filter->SetMin(stats->GetScalarValueMin()); filter->SetMax(stats->GetScalarValueMax()); filter->Update(); // TENSORS TO DATATREE mitk::Image::Pointer image = mitk::GrabItkImageMemory( filter->GetOutput() ); image->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( gradients ) ); image->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( static_cast(diffImage->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ) ); image->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New( static_cast(diffImage->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() )->GetMeasurementFrame() ) ); mitk::DiffusionPropertyHelper propertyHelper( image ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( image ); mitk::ImageVtkMapper2D::SetDefaultProperties(node); QString newname; newname = newname.append(nodename.c_str()); newname = newname.append("_Estimated DWI"); node->SetName(newname.toLatin1()); - GetDefaultDataStorage()->Add(node, m_TensorImage); + GetDataStorage()->Add(node, m_TensorImage); BValueMapType map = static_cast(image->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() )->GetBValueMap();; std::vector< unsigned int > b0Indices = map[0]; typedef itk::ResidualImageFilter ResidualImageFilterType; ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(diffImage, itkVectorImagePointer); ITKDiffusionImageType::Pointer itkSecondVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(image, itkSecondVectorImagePointer); ResidualImageFilterType::Pointer residualFilter = ResidualImageFilterType::New(); residualFilter->SetInput( itkVectorImagePointer ); residualFilter->SetSecondDiffusionImage( itkSecondVectorImagePointer ); residualFilter->SetGradients(gradients); residualFilter->SetB0Index(b0Indices[0]); residualFilter->SetB0Threshold(30); residualFilter->Update(); itk::Image::Pointer residualImage = itk::Image::New(); residualImage = residualFilter->GetOutput(); mitk::Image::Pointer mitkResImg = mitk::Image::New(); mitk::CastToMitkImage(residualImage, mitkResImg); stats = mitkResImg->GetStatistics(); float min = stats->GetScalarValueMin(); float max = stats->GetScalarValueMax(); mitk::LookupTableProperty::Pointer lutProp = mitk::LookupTableProperty::New(); mitk::LookupTable::Pointer lut = mitk::LookupTable::New(); vtkSmartPointer lookupTable = vtkSmartPointer::New(); lookupTable->SetTableRange(min, max); // If you don't want to use the whole color range, you can use // SetValueRange, SetHueRange, and SetSaturationRange lookupTable->Build(); vtkSmartPointer reversedlookupTable = vtkSmartPointer::New(); reversedlookupTable->SetTableRange(min+1, max); reversedlookupTable->Build(); for(int i=0; i<256; i++) { double* rgba = reversedlookupTable->GetTableValue(255-i); lookupTable->SetTableValue(i, rgba[0], rgba[1], rgba[2], rgba[3]); } lut->SetVtkLookupTable(lookupTable); lutProp->SetLookupTable(lut); // Create lookuptable mitk::DataNode::Pointer resNode=mitk::DataNode::New(); resNode->SetData( mitkResImg ); resNode->SetName("Residuals"); resNode->SetProperty("LookupTable", lutProp); bool b; resNode->GetBoolProperty("use color", b); resNode->SetBoolProperty("use color", false); - GetDefaultDataStorage()->Add(resNode, m_TensorImage); + GetDataStorage()->Add(resNode, m_TensorImage); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); // Draw Graph std::vector means = residualFilter->GetMeans(); std::vector q1s = residualFilter->GetQ1(); std::vector q3s = residualFilter->GetQ3(); std::vector percentagesOfOUtliers = residualFilter->GetPercentagesOfOutliers(); m_Controls->m_ResidualAnalysis->SetMeans(means); m_Controls->m_ResidualAnalysis->SetQ1(q1s); m_Controls->m_ResidualAnalysis->SetQ3(q3s); m_Controls->m_ResidualAnalysis->SetPercentagesOfOutliers(percentagesOfOUtliers); if(m_Controls->m_PercentagesOfOutliers->isChecked()) { m_Controls->m_ResidualAnalysis->DrawPercentagesOfOutliers(); } else { m_Controls->m_ResidualAnalysis->DrawMeans(); } // Draw Graph for volumes per slice in the QGraphicsView std::vector< std::vector > outliersPerSlice = residualFilter->GetOutliersPerSlice(); int xSize = outliersPerSlice.size(); if(xSize == 0) { return; } int ySize = outliersPerSlice[0].size(); // Find maximum in outliersPerSlice double maxOutlier= 0.0; for(int i=0; imaxOutlier) { maxOutlier = outliersPerSlice[i][j]; } } } // Create some QImage QImage qImage(xSize, ySize, QImage::Format_RGB32); QImage legend(1, 256, QImage::Format_RGB32); QRgb value; vtkSmartPointer lookup = vtkSmartPointer::New(); lookup->SetTableRange(0.0, maxOutlier); lookup->Build(); reversedlookupTable->SetTableRange(0, maxOutlier); reversedlookupTable->Build(); for(int i=0; i<256; i++) { double* rgba = reversedlookupTable->GetTableValue(255-i); lookup->SetTableValue(i, rgba[0], rgba[1], rgba[2], rgba[3]); } // Fill qImage for(int i=0; iMapValue(out); int r, g, b; r = _rgba[0]; g = _rgba[1]; b = _rgba[2]; value = qRgb(r, g, b); qImage.setPixel(i,j,value); } } for(int i=0; i<256; i++) { double* rgba = lookup->GetTableValue(i); int r, g, b; r = rgba[0]*255; g = rgba[1]*255; b = rgba[2]*255; value = qRgb(r, g, b); legend.setPixel(0,255-i,value); } QString upper = QString::number(maxOutlier, 'g', 3); upper.append(" %"); QString lower = QString::number(0.0); lower.append(" %"); m_Controls->m_UpperLabel->setText(upper); m_Controls->m_LowerLabel->setText(lower); QPixmap pixmap(QPixmap::fromImage(qImage)); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap); item->setTransform(QTransform::fromScale(10.0, 3.0), true); QPixmap pixmap2(QPixmap::fromImage(legend)); QGraphicsPixmapItem *item2 = new QGraphicsPixmapItem(pixmap2); item2->setTransform(QTransform::fromScale(20.0, 1.0), true); m_Controls->m_PerSliceView->SetResidualPixmapItem(item); QGraphicsScene* scene = new QGraphicsScene; QGraphicsScene* scene2 = new QGraphicsScene; scene->addItem(item); scene2->addItem(item2); m_Controls->m_PerSliceView->setScene(scene); m_Controls->m_LegendView->setScene(scene2); m_Controls->m_PerSliceView->show(); m_Controls->m_PerSliceView->repaint(); m_Controls->m_LegendView->setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ); m_Controls->m_LegendView->setVerticalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ); m_Controls->m_LegendView->show(); m_Controls->m_LegendView->repaint(); } void QmitkTensorReconstructionView::Reconstruct() { int method = m_Controls->m_ReconctructionMethodBox->currentIndex(); switch (method) { case 0: ItkTensorReconstruction(m_DiffusionImages); break; case 1: TensorReconstructionWithCorr(m_DiffusionImages); break; default: ItkTensorReconstruction(m_DiffusionImages); } } void QmitkTensorReconstructionView::TensorReconstructionWithCorr (mitk::DataStorage::SetOfObjects::Pointer inImages) { try { int nrFiles = inImages->size(); if (!nrFiles) return; QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles); mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); while ( itemiter != itemiterend ) // for all items { mitk::Image* vols = static_cast((*itemiter)->GetData()); std::string nodename; (*itemiter)->GetStringProperty("name", nodename); // TENSOR RECONSTRUCTION MITK_INFO << "Tensor reconstruction with correction for negative eigenvalues"; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Tensor reconstruction for %s", nodename.c_str()).toLatin1()); typedef itk::TensorReconstructionWithEigenvalueCorrectionFilter< DiffusionPixelType, TTensorPixelType > ReconstructionFilter; float b0Threshold = m_Controls->m_TensorReconstructionThreshold->value(); GradientDirectionContainerType::Pointer gradientContainerCopy = GradientDirectionContainerType::New(); for(GradientDirectionContainerType::ConstIterator it = static_cast( vols->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer()->Begin(); it != static_cast( vols->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer()->End(); it++) { gradientContainerCopy->push_back(it.Value()); } ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(vols, itkVectorImagePointer); ReconstructionFilter::Pointer reconFilter = ReconstructionFilter::New(); reconFilter->SetGradientImage( gradientContainerCopy, itkVectorImagePointer); reconFilter->SetBValue( static_cast(vols->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ); reconFilter->SetB0Threshold(b0Threshold); reconFilter->Update(); typedef itk::Image, 3> TensorImageType; TensorImageType::Pointer outputTensorImg = reconFilter->GetOutput(); typedef itk::ImageRegionIterator TensorImageIteratorType; TensorImageIteratorType tensorIt(outputTensorImg, outputTensorImg->GetRequestedRegion()); tensorIt.GoToBegin(); int negatives = 0; while(!tensorIt.IsAtEnd()) { typedef itk::DiffusionTensor3D TensorType; TensorType tensor = tensorIt.Get(); TensorType::EigenValuesArrayType ev; tensor.ComputeEigenValues(ev); for(unsigned int i=0; iInitializeByItk( outputTensorImg.GetPointer() ); image->SetVolume( outputTensorImg->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); SetDefaultNodeProperties(node, nodename+"_EigenvalueCorrected_DT"); - GetDefaultDataStorage()->Add(node, *itemiter); + GetDataStorage()->Add(node, *itemiter); mitk::ProgressBar::GetInstance()->Progress(); ++itemiter; } mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toLatin1()); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); } catch (itk::ExceptionObject &ex) { MITK_INFO << ex ; QMessageBox::information(0, "Reconstruction not possible:", ex.GetDescription()); } } void QmitkTensorReconstructionView::ItkTensorReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages) { try { itk::TimeProbe clock; int nrFiles = inImages->size(); if (!nrFiles) return; QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles); mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); while ( itemiter != itemiterend ) // for all items { mitk::Image* vols = static_cast( (*itemiter)->GetData()); std::string nodename; (*itemiter)->GetStringProperty("name", nodename); // TENSOR RECONSTRUCTION clock.Start(); MITK_DEBUG << "Tensor reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Tensor reconstruction for %s", nodename.c_str()).toLatin1()); typedef itk::DiffusionTensor3DReconstructionImageFilter< DiffusionPixelType, DiffusionPixelType, TTensorPixelType > TensorReconstructionImageFilterType; TensorReconstructionImageFilterType::Pointer tensorReconstructionFilter = TensorReconstructionImageFilterType::New(); GradientDirectionContainerType::Pointer gradientContainerCopy = GradientDirectionContainerType::New(); for(GradientDirectionContainerType::ConstIterator it = static_cast( vols->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer()->Begin(); it != static_cast( vols->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer()->End(); it++) { gradientContainerCopy->push_back(it.Value()); } ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(vols, itkVectorImagePointer); tensorReconstructionFilter->SetGradientImage( gradientContainerCopy, itkVectorImagePointer ); tensorReconstructionFilter->SetBValue( static_cast(vols->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue() ); tensorReconstructionFilter->SetThreshold( m_Controls->m_TensorReconstructionThreshold->value() ); tensorReconstructionFilter->Update(); clock.Stop(); MITK_DEBUG << "took " << clock.GetMean() << "s."; // TENSORS TO DATATREE mitk::TensorImage::Pointer image = mitk::TensorImage::New(); typedef itk::Image, 3> TensorImageType; TensorImageType::Pointer tensorImage; tensorImage = tensorReconstructionFilter->GetOutput(); // Check the tensor for negative eigenvalues if(m_Controls->m_CheckNegativeEigenvalues->isChecked()) { typedef itk::ImageRegionIterator TensorImageIteratorType; TensorImageIteratorType tensorIt(tensorImage, tensorImage->GetRequestedRegion()); tensorIt.GoToBegin(); while(!tensorIt.IsAtEnd()) { typedef itk::DiffusionTensor3D TensorType; //typedef itk::Tensor TensorType2; TensorType tensor = tensorIt.Get(); TensorType::EigenValuesArrayType ev; tensor.ComputeEigenValues(ev); for(unsigned int i=0; iSetDirection( itkVectorImagePointer->GetDirection() ); image->InitializeByItk( tensorImage.GetPointer() ); image->SetVolume( tensorReconstructionFilter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); SetDefaultNodeProperties(node, nodename+"_LinearLeastSquares_DT"); - GetDefaultDataStorage()->Add(node, *itemiter); + GetDataStorage()->Add(node, *itemiter); mitk::ProgressBar::GetInstance()->Progress(); ++itemiter; } mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toLatin1()); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); } catch (itk::ExceptionObject &ex) { MITK_INFO << ex ; QMessageBox::information(0, "Reconstruction not possible:", ex.GetDescription()); return; } } void QmitkTensorReconstructionView::SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name) { node->SetProperty( "ShowMaxNumber", mitk::IntProperty::New( 500 ) ); node->SetProperty( "Scaling", mitk::FloatProperty::New( 1.0 ) ); node->SetProperty( "Normalization", mitk::OdfNormalizationMethodProperty::New()); node->SetProperty( "ScaleBy", mitk::OdfScaleByProperty::New()); node->SetProperty( "IndexParam1", mitk::FloatProperty::New(2)); node->SetProperty( "IndexParam2", mitk::FloatProperty::New(1)); node->SetProperty( "visible", mitk::BoolProperty::New( true ) ); node->SetProperty( "VisibleOdfs", mitk::BoolProperty::New( false ) ); node->SetProperty ("layer", mitk::IntProperty::New(100)); node->SetProperty( "DoRefresh", mitk::BoolProperty::New( true ) ); node->SetProperty( "name", mitk::StringProperty::New(name) ); } void QmitkTensorReconstructionView::TensorsToDWI() { DoTensorsToDWI(m_TensorImages); } void QmitkTensorReconstructionView::TensorsToQbi() { for (unsigned int i=0; isize(); i++) { mitk::DataNode::Pointer tensorImageNode = m_TensorImages->at(i); MITK_INFO << "starting Q-Ball estimation"; typedef float TTensorPixelType; typedef itk::DiffusionTensor3D< TTensorPixelType > TensorPixelType; typedef itk::Image< TensorPixelType, 3 > TensorImageType; TensorImageType::Pointer itkvol = TensorImageType::New(); mitk::CastToItkImage(dynamic_cast(tensorImageNode->GetData()), itkvol); typedef itk::TensorImageToQBallImageFilter< TTensorPixelType, TTensorPixelType > FilterType; FilterType::Pointer filter = FilterType::New(); filter->SetInput( itkvol ); filter->Update(); typedef itk::Vector OutputPixelType; typedef itk::Image OutputImageType; mitk::QBallImage::Pointer image = mitk::QBallImage::New(); OutputImageType::Pointer outimg = filter->GetOutput(); image->InitializeByItk( outimg.GetPointer() ); image->SetVolume( outimg->GetBufferPointer() ); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData( image ); node->SetName(tensorImageNode->GetName()+"_Qball"); - GetDefaultDataStorage()->Add(node, tensorImageNode); + GetDataStorage()->Add(node, tensorImageNode); } } -void QmitkTensorReconstructionView::OnSelectionChanged( std::vector nodes ) +void QmitkTensorReconstructionView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { m_DiffusionImages = mitk::DataStorage::SetOfObjects::New(); m_TensorImages = mitk::DataStorage::SetOfObjects::New(); bool foundDwiVolume = false; bool foundTensorVolume = false; m_Controls->m_DiffusionImageLabel->setText("mandatory"); m_DiffusionImage = NULL; m_TensorImage = NULL; m_Controls->m_InputData->setTitle("Please Select Input Data"); // iterate selection - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; if (node.IsNull()) continue; // only look at interesting types bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())) ); if ( isDiffusionImage ) { foundDwiVolume = true; m_Controls->m_DiffusionImageLabel->setText(node->GetName().c_str()); m_DiffusionImages->push_back(node); m_DiffusionImage = node; } else if(dynamic_cast(node->GetData())) { foundTensorVolume = true; m_Controls->m_DiffusionImageLabel->setText(node->GetName().c_str()); m_TensorImages->push_back(node); m_TensorImage = node; } } m_Controls->m_StartReconstruction->setEnabled(foundDwiVolume); m_Controls->m_TensorsToDWIButton->setEnabled(foundTensorVolume); m_Controls->m_TensorsToQbiButton->setEnabled(foundTensorVolume); if (foundDwiVolume || foundTensorVolume) m_Controls->m_InputData->setTitle("Input Data"); m_Controls->m_ResidualButton->setEnabled(foundDwiVolume && foundTensorVolume); m_Controls->m_PercentagesOfOutliers->setEnabled(foundDwiVolume && foundTensorVolume); m_Controls->m_PerSliceView->setEnabled(foundDwiVolume && foundTensorVolume); } template itk::VectorContainer >::Pointer QmitkTensorReconstructionView::MakeGradientList() { itk::VectorContainer >::Pointer retval = itk::VectorContainer >::New(); vnl_matrix_fixed* U = itk::PointShell >::DistributePointShell(); for(int i=0; i v; v[0] = U->get(0,i); v[1] = U->get(1,i); v[2] = U->get(2,i); retval->push_back(v); } // Add 0 vector for B0 vnl_vector_fixed v; v.fill(0.0); retval->push_back(v); return retval; } void QmitkTensorReconstructionView::DoTensorsToDWI(mitk::DataStorage::SetOfObjects::Pointer inImages) { try { itk::TimeProbe clock; int nrFiles = inImages->size(); if (!nrFiles) return; QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles); mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() ); while ( itemiter != itemiterend ) // for all items { std::string nodename; (*itemiter)->GetStringProperty("name", nodename); mitk::TensorImage* vol = static_cast((*itemiter)->GetData()); typedef float TTensorPixelType; typedef itk::DiffusionTensor3D< TTensorPixelType > TensorPixelType; typedef itk::Image< TensorPixelType, 3 > TensorImageType; TensorImageType::Pointer itkvol = TensorImageType::New(); mitk::CastToItkImage(vol, itkvol); typedef itk::TensorImageToDiffusionImageFilter< TTensorPixelType, DiffusionPixelType > FilterType; FilterType::GradientListPointerType gradientList = FilterType::GradientListType::New(); switch(m_Controls->m_TensorsToDWINumDirsSelect->currentIndex()) { case 0: gradientList = MakeGradientList<12>(); break; case 1: gradientList = MakeGradientList<42>(); break; case 2: gradientList = MakeGradientList<92>(); break; case 3: gradientList = MakeGradientList<162>(); break; case 4: gradientList = MakeGradientList<252>(); break; case 5: gradientList = MakeGradientList<362>(); break; case 6: gradientList = MakeGradientList<492>(); break; case 7: gradientList = MakeGradientList<642>(); break; case 8: gradientList = MakeGradientList<812>(); break; case 9: gradientList = MakeGradientList<1002>(); break; default: gradientList = MakeGradientList<92>(); } double bVal = m_Controls->m_TensorsToDWIBValueEdit->text().toDouble(); // DWI ESTIMATION clock.Start(); MBI_INFO << "DWI Estimation "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "DWI Estimation for %s", nodename.c_str()).toLatin1()); FilterType::Pointer filter = FilterType::New(); filter->SetInput( itkvol ); filter->SetBValue(bVal); filter->SetGradientList(gradientList); //filter->SetNumberOfThreads(1); filter->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMean() << "s."; // TENSORS TO DATATREE mitk::Image::Pointer image = mitk::GrabItkImageMemory( filter->GetOutput() ); image->SetProperty( mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str(), mitk::GradientDirectionsProperty::New( gradientList ) ); image->SetProperty( mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str(), mitk::FloatProperty::New( bVal ) ); image->SetProperty( mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str(), mitk::MeasurementFrameProperty::New() ); mitk::DiffusionPropertyHelper propertyHelper( image ); propertyHelper.InitializeImage(); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::ImageVtkMapper2D::SetDefaultProperties(node); node->SetName(nodename+"_DWI"); - GetDefaultDataStorage()->Add(node, *itemiter); + GetDataStorage()->Add(node, *itemiter); mitk::ProgressBar::GetInstance()->Progress(); ++itemiter; } mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toLatin1()); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); } catch (itk::ExceptionObject &ex) { MITK_INFO << ex ; QMessageBox::information(0, "DWI estimation failed:", ex.GetDescription()); return ; } } void QmitkTensorReconstructionView::PreviewThreshold(int threshold) { mitk::DataStorage::SetOfObjects::const_iterator itemiter( m_DiffusionImages->begin() ); mitk::DataStorage::SetOfObjects::const_iterator itemiterend( m_DiffusionImages->end() ); while ( itemiter != itemiterend ) // for all items { mitk::Image* vols = static_cast( (*itemiter)->GetData()); ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(vols, itkVectorImagePointer); // Extract b0 image typedef itk::B0ImageExtractionImageFilter FilterType; FilterType::Pointer filterB0 = FilterType::New(); filterB0->SetInput(itkVectorImagePointer); filterB0->SetDirections(mitk::DiffusionPropertyHelper::GetGradientContainer(vols)); filterB0->Update(); mitk::Image::Pointer mitkImage = mitk::Image::New(); typedef itk::Image ImageType; typedef itk::Image SegmentationType; typedef itk::BinaryThresholdImageFilter ThresholdFilterType; // apply threshold ThresholdFilterType::Pointer filterThreshold = ThresholdFilterType::New(); filterThreshold->SetInput(filterB0->GetOutput()); filterThreshold->SetLowerThreshold(threshold); filterThreshold->SetInsideValue(0); filterThreshold->SetOutsideValue(1); // mark cut off values red filterThreshold->Update(); mitkImage->InitializeByItk( filterThreshold->GetOutput() ); mitkImage->SetVolume( filterThreshold->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node; - if (this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) + if (this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter)) { - node = this->GetDefaultDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); + node = this->GetDataStorage()->GetNamedDerivedNode("ThresholdOverlay", *itemiter); } else { // create a new node, to show thresholded values node = mitk::DataNode::New(); - GetDefaultDataStorage()->Add( node, *itemiter ); + GetDataStorage()->Add( node, *itemiter ); node->SetProperty( "name", mitk::StringProperty::New("ThresholdOverlay")); node->SetBoolProperty("helper object", true); } node->SetData( mitkImage ); itemiter++; mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.h index fbd243ad27..eb83870ab5 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.reconstruction/src/internal/QmitkTensorReconstructionView.h @@ -1,124 +1,130 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKTENSORRECONSTRUCTIONVIEW_H_INCLUDED #define _QMITKTENSORRECONSTRUCTIONVIEW_H_INCLUDED -#include +#include +#include #include #include "ui_QmitkTensorReconstructionViewControls.h" #include #include #include #include typedef short DiffusionPixelType; struct TrSelListener; /*! * \ingroup org_mitk_gui_qt_tensorreconstruction_internal * * \brief QmitkTensorReconstructionView * * Document your class here. - * - * \sa QmitkFunctionality */ -class QmitkTensorReconstructionView : public QmitkFunctionality +class QmitkTensorReconstructionView : public QmitkAbstractView, public mitk::ILifecycleAwarePart { friend struct TrSelListener; // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: typedef mitk::DiffusionPropertyHelper::GradientDirectionType GradientDirectionType; typedef mitk::DiffusionPropertyHelper::GradientDirectionsContainerType GradientDirectionContainerType; typedef mitk::DiffusionPropertyHelper::BValueMapType BValueMapType; typedef itk::VectorImage< DiffusionPixelType, 3 > ITKDiffusionImageType; static const std::string VIEW_ID; QmitkTensorReconstructionView(); virtual ~QmitkTensorReconstructionView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Called when the functionality is activated + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + + /// \brief Called when the view gets activated virtual void Activated() override; + /// \brief Called when the view gets deactivated virtual void Deactivated() override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// \brief Called when the view becomes visible + virtual void Visible() override; + + /// \brief Called when the view becomes hidden + virtual void Hidden() override; static const int nrconvkernels; protected slots: void TensorsToQbi(); void TensorsToDWI(); void DoTensorsToDWI(mitk::DataStorage::SetOfObjects::Pointer inImages); void Advanced1CheckboxClicked(); void Reconstruct(); void ResidualCalculation(); void ResidualClicked(int slice, int volume); /** * @brief PreviewThreshold Generates a preview of the values that are cut off by the thresholds * @param threshold */ void PreviewThreshold(int threshold); protected: void ItkTensorReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages); void TeemTensorReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages); void TensorReconstructionWithCorr(mitk::DataStorage::SetOfObjects::Pointer inImages); - void OnSelectionChanged( std::vector nodes ) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkTensorReconstructionViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - template itk::VectorContainer >::Pointer MakeGradientList(); template void TemplatedAnalyticalTensorReconstruction(mitk::Image* vols, float lambda, std::string nodename, std::vector* nodes, int normalization); void SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name); mitk::DataNode::Pointer m_DiffusionImage; mitk::DataNode::Pointer m_TensorImage; mitk::DataStorage::SetOfObjects::Pointer m_DiffusionImages; mitk::DataStorage::SetOfObjects::Pointer m_TensorImages; }; #endif // _QMITKTENSORRECONSTRUCTIONVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.cpp index a99cb6032d..69f88759bc 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.cpp @@ -1,488 +1,485 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //misc #define _USE_MATH_DEFINES #include // Blueberry #include #include // Qmitk #include "QmitkDiffusionRegistrationView.h" -#include // MITK #include #include #include #include #include #include // Qt #include #include #include #include - +#include #include #define _USE_MATH_DEFINES #include QmitkRegistrationWorker::QmitkRegistrationWorker(QmitkDiffusionRegistrationView* view) : m_View(view) { } void QmitkRegistrationWorker::run() { typedef mitk::DiffusionPropertyHelper::BValueMapType BValueMap; unsigned int totalImagesCount; if( !m_View->m_IsBatch ) { totalImagesCount = m_View->m_SelectedDiffusionNodes.size(); } else { totalImagesCount = m_View->m_BatchList.size(); } m_View->m_TotalFiles = totalImagesCount; QString inputPath = m_View->m_Controls->m_InputFolderTextbox->text(); QString outputPath = m_View->m_Controls->m_OutputFolderTextbox->text(); for(unsigned int i=0; i< totalImagesCount; i++) { if(m_View->m_IsAborted){ m_View->m_RegistrationThread.quit(); return; } m_View->m_CurrentFile = i+1; m_View->m_GlobalRegisterer = QmitkDiffusionRegistrationView::DWIHeadMotionCorrectionFilterType::New(); //mitk::DataNode::Pointer node = m_View->m_SelectedDiffusionNodes.at(i); mitk::Image::Pointer inImage; mitk::DataNode::Pointer node; if( !m_View->m_IsBatch ) { node = m_View->m_SelectedDiffusionNodes.at(i); inImage = dynamic_cast(node->GetData()); } else { mitk::Image::Pointer inImage = mitk::IOUtil::LoadImage( m_View->m_BatchList.at(i).toStdString() ); mitk::GradientDirectionsProperty::Pointer gradDir = static_cast(inImage->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer()); } bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( inImage ) ); if(!isDiffusionImage) { MITK_ERROR << "Error occured: can't get input image. \nAborting"; return; } m_View->m_GlobalRegisterer->SetInput(inImage); try { m_View->m_GlobalRegisterer->Update(); } catch( mitk::Exception e ) { MITK_ERROR << "Internal error occured: " << e.what() << "\nAborting"; } if( m_View->m_GlobalRegisterer->GetIsInValidState() ) { if(! m_View->m_IsBatch) { mitk::Image::Pointer image = m_View->m_GlobalRegisterer->GetOutput(); mitk::DataNode::Pointer imageNode = mitk::DataNode::New(); imageNode->SetData( image ); QString name = node->GetName().c_str(); imageNode->SetName((name+"_MC").toStdString().c_str()); m_View->GetDataStorage()->Add(imageNode); } else { QString name = m_View->m_BatchList.at(i); name = name.replace(".dwi", "_MC.dwi", Qt::CaseInsensitive); name = name.replace(inputPath, outputPath, Qt::CaseInsensitive); try { mitk::IOUtil::Save(m_View->m_GlobalRegisterer->GetOutput(), name.toStdString().c_str()); } catch( const itk::ExceptionObject& e) { MITK_ERROR << "Catched exception: " << e.what(); mitkThrow() << "Failed with exception from subprocess!"; } } } } m_View->m_RegistrationThread.quit(); } const std::string QmitkDiffusionRegistrationView::VIEW_ID = "org.mitk.views.diffusionregistrationview"; QmitkDiffusionRegistrationView::QmitkDiffusionRegistrationView() : QmitkAbstractView() , m_Controls( 0 ) , m_DiffusionImage( NULL ) , m_ThreadIsRunning(false) , m_Steps(100) , m_LastStep(0) , m_GlobalRegisterer(NULL) , m_RegistrationWorker(this) { m_RegistrationWorker.moveToThread(&m_RegistrationThread); connect(&m_RegistrationThread, SIGNAL(started()), this, SLOT(BeforeThread())); connect(&m_RegistrationThread, SIGNAL(started()), &m_RegistrationWorker, SLOT(run())); connect(&m_RegistrationThread, SIGNAL(finished()), this, SLOT(AfterThread())); connect(&m_RegistrationThread, SIGNAL(terminated()), this, SLOT(AfterThread())); m_RegistrationTimer = new QTimer(this); } // Destructor QmitkDiffusionRegistrationView::~QmitkDiffusionRegistrationView() { delete m_RegistrationTimer; } // update Registration status and generate fiber bundle void QmitkDiffusionRegistrationView::TimerUpdate() { int currentStep = m_GlobalRegisterer->GetCurrentStep(); mitk::ProgressBar::GetInstance()->Progress(currentStep-m_LastStep); UpdateRegistrationStatus(); m_LastStep = currentStep; } // update gui elements after registration is finished void QmitkDiffusionRegistrationView::AfterThread() { m_ThreadIsRunning = false; m_RegistrationTimer->stop(); mitk::ProgressBar::GetInstance()->Progress(m_GlobalRegisterer->GetSteps()-m_LastStep+1); UpdateGUI(); if( !m_GlobalRegisterer->GetIsInValidState() ) { QMessageBox::critical( NULL, "Registration", "An internal error occured, or user canceled the Registration.\n Please check the log for details." ); return; } UpdateRegistrationStatus(); m_GlobalRegisterer = 0; } // start Registration timer and update gui elements before Registration is started void QmitkDiffusionRegistrationView::BeforeThread() { m_ThreadIsRunning = true; m_RegistrationTime = QTime::currentTime(); m_ElapsedTime = 0; m_RegistrationTimer->start(1000); m_LastStep = 0; UpdateGUI(); } void QmitkDiffusionRegistrationView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkDiffusionRegistrationViewControls; m_Controls->setupUi( parent ); AdvancedSettings(); connect( m_RegistrationTimer, SIGNAL(timeout()), this, SLOT(TimerUpdate()) ); connect( m_Controls->m_RegistrationStopButton, SIGNAL(clicked()), this, SLOT(StopRegistration()) ); connect( m_Controls->m_RegistrationStartButton, SIGNAL(clicked()), this, SLOT(StartRegistration()) ); connect( m_Controls->m_AdvancedSettingsCheckbox, SIGNAL(clicked()), this, SLOT(AdvancedSettings()) ); connect( m_Controls->m_SelectInputButton, SIGNAL(clicked()), this, SLOT(AddInputFolderName()) ); connect( m_Controls->m_SelectOutputButton, SIGNAL(clicked()), this, SLOT(AddOutputFolderName()) ); connect( m_Controls->m_StartBatchButton, SIGNAL(clicked()), this, SLOT(StartBatch()) ); this->m_Parent = parent; } } // show/hide advanced settings frame void QmitkDiffusionRegistrationView::AdvancedSettings() { m_Controls->m_AdvancedFrame->setVisible(m_Controls->m_AdvancedSettingsCheckbox->isChecked()); } -void QmitkDiffusionRegistrationView::OnSelectionChanged( berry::IWorkbenchPart::Pointer, const QList& nodes ) +void QmitkDiffusionRegistrationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList& nodes) { if (m_ThreadIsRunning) return; bool foundDwiVolume = false; QString tempSelectedNames = ""; m_DiffusionImage = NULL; m_SelectedDiffusionNodes.clear(); // iterate selection - for( int i=0; i(node->GetData())); } if( isDiffusionImage ) { foundDwiVolume = true; m_SelectedDiffusionNodes.push_back(node); if(m_SelectedDiffusionNodes.size() > 0){tempSelectedNames += "\n";} tempSelectedNames += (node->GetName().c_str()); } } m_Controls->m_RegistrationStartButton->setEnabled(foundDwiVolume); if (foundDwiVolume) { m_Controls->m_DiffusionImageLabel->setText(tempSelectedNames); m_Controls->m_InputData->setTitle("Input Data"); } else { m_Controls->m_DiffusionImageLabel->setText("mandatory"); m_Controls->m_InputData->setTitle("Please Select Input Data"); } UpdateGUI(); } // update gui elements displaying Registrations status void QmitkDiffusionRegistrationView::UpdateRegistrationStatus() { if (m_GlobalRegisterer.IsNull()) return; m_ElapsedTime += m_RegistrationTime.elapsed()/1000; m_RegistrationTime.restart(); unsigned long hours = m_ElapsedTime/3600; unsigned long minutes = (m_ElapsedTime%3600)/60; unsigned long seconds = m_ElapsedTime%60; m_Controls->m_RegistrationTimeLabel->setText( QString::number(hours)+QString("h ")+QString::number(minutes)+QString("m ")+QString::number(seconds)+QString("s") ); m_Controls->m_CurrentStepLabel->setText( QString::number((int)(100*(float)(m_GlobalRegisterer->GetCurrentStep()-1)/m_GlobalRegisterer->GetSteps()))+"%" ); m_Controls->m_CurrentFileLabel->setText( QString::number(m_CurrentFile)+" / "+QString::number(m_TotalFiles) ); } void QmitkDiffusionRegistrationView::UpdateGUI() { if (!m_ThreadIsRunning && (m_SelectedDiffusionNodes.size() > 0) ) { m_Controls->m_RegistrationStopButton->setEnabled(false); m_Controls->m_RegistrationStartButton->setEnabled(true); m_Controls->m_StartBatchButton->setEnabled(true); m_Controls->m_AdvancedFrame->setEnabled(true); m_Controls->m_RegistrationStopButton->setText("Stop"); m_Controls->m_RegistrationStartButton->setToolTip("Start Registration"); m_Controls->m_RegistrationStopButton->setToolTip(""); } else if (!m_ThreadIsRunning) { m_Controls->m_RegistrationStopButton->setEnabled(false); m_Controls->m_RegistrationStartButton->setEnabled(false); m_Controls->m_StartBatchButton->setEnabled(true); m_Controls->m_AdvancedFrame->setEnabled(true); m_Controls->m_RegistrationStopButton->setText("Stop"); m_Controls->m_RegistrationStartButton->setToolTip("No Diffusion image selected."); m_Controls->m_RegistrationStopButton->setToolTip(""); } else { m_Controls->m_RegistrationStopButton->setEnabled(true); m_Controls->m_RegistrationStartButton->setEnabled(false); m_Controls->m_StartBatchButton->setEnabled(false); m_Controls->m_AdvancedFrame->setEnabled(false); m_Controls->m_RegistrationStartButton->setToolTip("Registration in progress."); m_Controls->m_RegistrationStopButton->setToolTip("Cancel Registration"); } } void QmitkDiffusionRegistrationView::SetFocus() { m_Controls->m_RegistrationStartButton->setFocus(); } void QmitkDiffusionRegistrationView::StartRegistration() { if(m_ThreadIsRunning) { MITK_WARN("QmitkDiffusionRegistrationView")<<"Thread already running!"; return; } m_GlobalRegisterer = NULL; if (m_SelectedDiffusionNodes.size()<1) { QMessageBox::information( NULL, "Warning", "Please load and select a diffusion image before starting image processing."); return; } m_IsBatch = false; m_IsAborted = false; m_Controls->m_RegistrationStartButton->setEnabled(false); m_Controls->m_StartBatchButton->setEnabled(false); // start worker thread m_RegistrationThread.start(QThread::NormalPriority); return; } void QmitkDiffusionRegistrationView::StopRegistration() { if (m_GlobalRegisterer.IsNull()) return; m_IsAborted = true; m_GlobalRegisterer->SetAbortRegistration(true); m_Controls->m_RegistrationStopButton->setEnabled(false); m_Controls->m_RegistrationStopButton->setText("Stopping ..."); return; } void QmitkDiffusionRegistrationView::AddInputFolderName() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( m_Parent, QString("Select the input folder with DWI files within") ); w->setFileMode( QFileDialog::Directory ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; m_Controls->m_InputFolderTextbox->setText(w->selectedFiles()[0]); } void QmitkDiffusionRegistrationView::AddOutputFolderName() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( m_Parent, QString("Select the output folder") ); w->setFileMode( QFileDialog::Directory ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; m_Controls->m_OutputFolderTextbox->setText(w->selectedFiles()[0]); } void QmitkDiffusionRegistrationView::StartBatch() { QString inputPath = m_Controls->m_InputFolderTextbox->text(); QString outputPath = m_Controls->m_OutputFolderTextbox->text(); if(inputPath == outputPath){ QMessageBox::information( NULL, "Error", "Input and Output folders can't be the same"); return; } QStringList list, filters; filters<<"*.dwi"; QDirIterator dirIterator(inputPath, filters, QDir::Files|QDir::NoSymLinks); while (dirIterator.hasNext()) { dirIterator.next(); list.append(dirIterator.fileInfo().absoluteFilePath()); std::cout << dirIterator.fileInfo().absoluteFilePath().toStdString() << endl; m_BatchList = list; m_IsBatch = true; m_IsAborted = false; if(m_ThreadIsRunning) { MITK_WARN("QmitkDiffusionRegistrationView")<<"Thread already running!"; return; } m_GlobalRegisterer = NULL; if (m_BatchList.size()<1) { QMessageBox::information( NULL, "Error", "No diffusion images were found in the selected input folder."); return; } m_Controls->m_RegistrationStartButton->setEnabled(false); m_Controls->m_StartBatchButton->setEnabled(false); // start worker thread m_RegistrationThread.start(QThread::NormalPriority); } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.h index 9667f12399..9eaac301a2 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.registration/src/internal/QmitkDiffusionRegistrationView.h @@ -1,135 +1,132 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include #include #include "ui_QmitkDiffusionRegistrationViewControls.h" #include #include #include #include typedef short DiffusionPixelType; /*! \brief View for diffusion image registration / head motion correction - -\sa QmitkFunctionality -\ingroup Functionalities */ // Forward Qt class declarations using namespace std; class QmitkDiffusionRegistrationView; class QmitkRegistrationWorker : public QObject { Q_OBJECT public: QmitkRegistrationWorker(QmitkDiffusionRegistrationView* view); public slots: void run(); private: QmitkDiffusionRegistrationView* m_View; }; class QmitkDiffusionRegistrationView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const string VIEW_ID; QmitkDiffusionRegistrationView(); virtual ~QmitkDiffusionRegistrationView(); virtual void CreateQtPartControl(QWidget *parent) override; void SetFocus() override; typedef mitk::DWIHeadMotionCorrectionFilter DWIHeadMotionCorrectionFilterType; protected slots: void StartRegistration(); void StopRegistration(); void AfterThread(); ///< update gui etc. after registrations has finished void BeforeThread(); ///< start timer etc. void TimerUpdate(); void AddInputFolderName(); void AddOutputFolderName(); void StartBatch(); void AdvancedSettings(); protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList&) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkDiffusionRegistrationViewControls* m_Controls; mitk::Image::Pointer m_DiffusionImage; std::vector< mitk::DataNode::Pointer > m_SelectedDiffusionNodes; private: void UpdateRegistrationStatus(); ///< update textual status display of the Registration process void UpdateGUI(); ///< update button activity etc. dpending on current datamanager selection /** flags etc. */ bool m_IsBatch, m_IsAborted; QStringList m_BatchList; bool m_ThreadIsRunning; QTimer* m_RegistrationTimer; QTime m_RegistrationTime; unsigned long m_ElapsedTime; unsigned long m_Steps; int m_LastStep; unsigned int m_CurrentFile; unsigned int m_TotalFiles; // the Qt parent of our GUI (NOT of this object) QWidget* m_Parent; /** global Registerer and friends */ itk::SmartPointer m_GlobalRegisterer; QmitkRegistrationWorker m_RegistrationWorker; QThread m_RegistrationThread; friend class QmitkRegistrationWorker; }; diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.cpp index 9ef3407493..3154134487 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.cpp @@ -1,498 +1,502 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Qmitk #include "QmitkTbssSkeletonizationView.h" #include #include #include #include #include // mitk #include #include #include #include // Qt #include #include //vtk #include #include // Boost #include const std::string QmitkTbssSkeletonizationView::VIEW_ID = "org.mitk.views.tbssskeletonization"; using namespace berry; QmitkTbssSkeletonizationView::QmitkTbssSkeletonizationView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) + , m_Activated(false) { } QmitkTbssSkeletonizationView::~QmitkTbssSkeletonizationView() { } -void QmitkTbssSkeletonizationView::OnSelectionChanged(std::vector nodes) +void QmitkTbssSkeletonizationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { //datamanager selection changed if (!this->IsActivated()) return; bool found3dImage = false; bool found4dImage = false; this->m_Controls->m_TubularName->setText(QString("Tubular Structure Mask: ")); this->m_Controls->m_TubularName->setEnabled(false); this->m_Controls->m_MeanLabel->setText(QString("Mean: ")); this->m_Controls->m_MeanLabel->setEnabled(false); this->m_Controls->m_PatientDataLabel->setText(QString("Patient Data: ")); this->m_Controls->m_PatientDataLabel->setEnabled(false); // iterate selection - for ( int i=0; iGetData(); + mitk::BaseData* nodeData = node->GetData(); std::string name = ""; - nodes[i]->GetStringProperty("name", name); + node->GetStringProperty("name", name); if(nodeData) { if(QString("Image").compare(nodeData->GetNameOfClass())==0) { mitk::Image* img = static_cast(nodeData); if(img->GetDimension() == 3) { bool isBinary(false); - nodes[i]->GetBoolProperty("binary", isBinary); + node->GetBoolProperty("binary", isBinary); if(isBinary) { QString label("Tubular Structure Mask: "); label.append(QString(name.c_str())); this->m_Controls->m_TubularName->setText(label); this->m_Controls->m_TubularName->setEnabled(true); } else { found3dImage = true; QString label("Mean: "); label.append(QString(name.c_str())); this->m_Controls->m_MeanLabel->setText(label); this->m_Controls->m_MeanLabel->setEnabled(true); } } else if(img->GetDimension() == 4) { found4dImage = true; QString label("Patient Data: "); label.append(QString(name.c_str())); this->m_Controls->m_PatientDataLabel->setText(label); this->m_Controls->m_PatientDataLabel->setEnabled(true); } } } } this->m_Controls->m_Skeletonize->setEnabled(found3dImage); this->m_Controls->m_Project->setEnabled(found3dImage && found4dImage); this->m_Controls->m_OutputMask->setEnabled(found3dImage && found4dImage); this->m_Controls->m_OutputDistanceMap->setEnabled(found3dImage && found4dImage); } void QmitkTbssSkeletonizationView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkTbssSkeletonizationViewControls; m_Controls->setupUi( parent ); this->CreateConnections(); } } +void QmitkTbssSkeletonizationView::SetFocus() +{ + m_Controls->m_Skeletonize->setFocus(); +} + void QmitkTbssSkeletonizationView::Activated() { - QmitkFunctionality::Activated(); + m_Activated = true; } void QmitkTbssSkeletonizationView::Deactivated() { - QmitkFunctionality::Deactivated(); + m_Activated = false; } -void QmitkTbssSkeletonizationView::CreateConnections() +bool QmitkTbssSkeletonizationView::IsActivated() const { - if ( m_Controls ) - { - connect( (QObject*)(m_Controls->m_Skeletonize), SIGNAL(clicked()), this, SLOT(Skeletonize() )); - connect( (QObject*)(m_Controls->m_Project), SIGNAL(clicked()), this, SLOT(Project() )); - } + return m_Activated; } - - -void QmitkTbssSkeletonizationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkTbssSkeletonizationView::Visible() { - m_MultiWidget = &stdMultiWidget; } +void QmitkTbssSkeletonizationView::Hidden() +{ +} -void QmitkTbssSkeletonizationView::StdMultiWidgetNotAvailable() +void QmitkTbssSkeletonizationView::CreateConnections() { - m_MultiWidget = NULL; + if ( m_Controls ) + { + connect( (QObject*)(m_Controls->m_Skeletonize), SIGNAL(clicked()), this, SLOT(Skeletonize() )); + connect( (QObject*)(m_Controls->m_Project), SIGNAL(clicked()), this, SLOT(Project() )); + } } + void QmitkTbssSkeletonizationView::Skeletonize() { typedef itk::SkeletonizationFilter SkeletonisationFilterType; SkeletonisationFilterType::Pointer skeletonizer = SkeletonisationFilterType::New(); - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); mitk::Image::Pointer meanImage = mitk::Image::New(); std::string name = ""; - for ( int i=0; iGetData(); + mitk::BaseData* nodeData = node->GetData(); if(nodeData) { if(QString("Image").compare(nodeData->GetNameOfClass())==0) { bool isBinary(false); - nodes[i]->GetBoolProperty("binary", isBinary); + node->GetBoolProperty("binary", isBinary); mitk::Image* img = static_cast(nodeData); if(img->GetDimension() == 3 && !isBinary) { meanImage = img; - name = nodes[i]->GetName(); + name = node->GetName(); } } } } // Calculate skeleton FloatImageType::Pointer itkImg = FloatImageType::New(); mitk::CastToItkImage(meanImage, itkImg); skeletonizer->SetInput(itkImg); skeletonizer->Update(); FloatImageType::Pointer output = skeletonizer->GetOutput(); mitk::Image::Pointer mitkOutput = mitk::Image::New(); mitk::CastToMitkImage(output, mitkOutput); name += "_skeleton"; AddToDataStorage(mitkOutput, name); } void QmitkTbssSkeletonizationView::Project() { typedef itk::SkeletonizationFilter SkeletonisationFilterType; typedef itk::ProjectionFilter ProjectionFilterType; typedef itk::DistanceMapFilter DistanceMapFilterType; SkeletonisationFilterType::Pointer skeletonizer = SkeletonisationFilterType::New(); - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); mitk::Image::Pointer meanImage = mitk::Image::New(); mitk::Image::Pointer subjects = mitk::Image::New(); mitk::Image::Pointer tubular = mitk::Image::New(); - for ( int i=0; iGetData(); + mitk::BaseData* nodeData = node->GetData(); if(nodeData) { if(QString("Image").compare(nodeData->GetNameOfClass())==0) { mitk::Image* img = static_cast(nodeData); if(img->GetDimension() == 3) { bool isBinary(false); - nodes[i]->GetBoolProperty("binary", isBinary); + node->GetBoolProperty("binary", isBinary); if(isBinary) { tubular = img; } else { meanImage = img; } } else if(img->GetDimension() == 4) { subjects = img; } } } } Float4DImageType::Pointer allFA; mitkPixelTypeMultiplex2(ConvertToItk,subjects->GetChannelDescriptor().GetPixelType(),subjects, allFA); // Calculate skeleton FloatImageType::Pointer itkImg = FloatImageType::New(); mitk::CastToItkImage(meanImage, itkImg); skeletonizer->SetInput(itkImg); skeletonizer->Update(); FloatImageType::Pointer output = skeletonizer->GetOutput(); mitk::Image::Pointer mitkOutput = mitk::Image::New(); mitk::CastToMitkImage(output, mitkOutput); AddToDataStorage(mitkOutput, "mean_FA_skeletonised"); // Retrieve direction image needed later by the projection filter DirectionImageType::Pointer directionImg = skeletonizer->GetVectorImage(); // Calculate distance image DistanceMapFilterType::Pointer distanceMapFilter = DistanceMapFilterType::New(); distanceMapFilter->SetInput(output); distanceMapFilter->Update(); FloatImageType::Pointer distanceMap = distanceMapFilter->GetOutput(); if(m_Controls->m_OutputDistanceMap->isChecked()) { mitk::Image::Pointer mitkDistance = mitk::Image::New(); mitk::CastToMitkImage(distanceMap, mitkDistance); AddToDataStorage(mitkDistance, "distance map"); } // Do projection // Ask a threshold to create a skeleton mask double threshold = -1.0; while(threshold == -1.0) { threshold = QInputDialog::getDouble(m_Controls->m_Skeletonize, tr("Specify the FA threshold"), tr("Threshold:"), QLineEdit::Normal, 0.2); if(threshold < 0.0 || threshold > 1.0) { QMessageBox msgBox; msgBox.setText("Please choose a value between 0 and 1"); msgBox.exec(); threshold = -1.0; } } typedef itk::BinaryThresholdImageFilter ThresholdFilterType; ThresholdFilterType::Pointer thresholder = ThresholdFilterType::New(); thresholder->SetInput(output); thresholder->SetLowerThreshold(threshold); thresholder->SetUpperThreshold(std::numeric_limits::max()); thresholder->SetOutsideValue(0); thresholder->SetInsideValue(1); thresholder->Update(); CharImageType::Pointer thresholdedImg = thresholder->GetOutput(); if(m_Controls->m_OutputMask->isChecked()) { mitk::Image::Pointer mitkThresholded = mitk::Image::New(); mitk::CastToMitkImage(thresholdedImg, mitkThresholded); std::string maskName = "skeleton_mask_at_" + boost::lexical_cast(threshold); AddToDataStorage(mitkThresholded, maskName); } CharImageType::Pointer itkTubular = CharImageType::New(); mitk::CastToItkImage(tubular, itkTubular); ProjectionFilterType::Pointer projectionFilter = ProjectionFilterType::New(); projectionFilter->SetDistanceMap(distanceMap); projectionFilter->SetDirections(directionImg); projectionFilter->SetAllFA(allFA); projectionFilter->SetTube(itkTubular); projectionFilter->SetSkeleton(thresholdedImg); projectionFilter->Project(); Float4DImageType::Pointer projected = projectionFilter->GetProjections(); mitk::Image::Pointer mitkProjections = mitk::Image::New(); mitk::CastToMitkImage(projected, mitkProjections); AddToDataStorage(mitkProjections, "all_FA_projected"); } void QmitkTbssSkeletonizationView::AddToDataStorage(mitk::Image* img, std::string name) { mitk::DataNode::Pointer result = mitk::DataNode::New(); result->SetProperty( "name", mitk::StringProperty::New(name) ); result->SetData( img ); // add new image to data storage and set as active to ease further processing - GetDefaultDataStorage()->Add( result ); + GetDataStorage()->Add( result ); } template void QmitkTbssSkeletonizationView::ConvertToItk(mitk::PixelType ptype, mitk::Image* image, Float4DImageType::Pointer output) { output = Float4DImageType::New(); mitk::BaseGeometry* geo = image->GetGeometry(); mitk::Vector3D mitkSpacing = geo->GetSpacing(); mitk::Point3D mitkOrigin = geo->GetOrigin(); Float4DImageType::SpacingType spacing; spacing[0] = mitkSpacing[0]; spacing[1] = mitkSpacing[1]; spacing[2] = mitkSpacing[2]; spacing[3] = 1.0; // todo: check if spacing has length 4 Float4DImageType::PointType origin; origin[0] = mitkOrigin[0]; origin[1] = mitkOrigin[1]; origin[2] = mitkOrigin[2]; origin[3] = 0; Float4DImageType::SizeType size; size[0] = image->GetDimension(0); size[1] = image->GetDimension(1); size[2] = image->GetDimension(2); size[3] = image->GetDimension(3); Float4DImageType::DirectionType dir; vtkLinearTransform* lin = geo->GetVtkTransform(); vtkMatrix4x4 *m = lin->GetMatrix(); dir.Fill(0.0); for(int x=0; x<3; x++) { for(int y=0; y<3; y++) { dir[x][y] = m->GetElement(x,y); } } dir[3][3] = 1; output->SetSpacing(spacing); output->SetOrigin(origin); output->SetRegions(size); output->SetDirection(dir); output->Allocate(); if(image->GetDimension() == 4) { int timesteps = image->GetDimension(3); try{ // REPLACE THIS METHODE()ConvertToItk) WITH mitk::CastToItk // iterate through the subjects and copy data to output for(int t=0; t inAcc(image,image->GetVolumeData(t)); for(int x=0; xGetDimension(0); x++) { for(int y=0; yGetDimension(1); y++) { for(int z=0; zGetDimension(2); z++) { itk::Index<3> ix = {x, y, z}; itk::Index<4> ix4 = {x, y, z, t}; output->SetPixel(ix4, inAcc.GetPixelByIndex(ix)); } } } } } catch(std::exception & e) { MITK_INFO << e.what(); } } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.h index 9726be3290..a0b2c88cc6 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTbssSkeletonizationView.h @@ -1,100 +1,114 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkTbssSkeletonizationView_h #define QmitkTbssSkeletonizationView_h -#include +#include +#include + #include "ui_QmitkTbssSkeletonizationViewControls.h" #include "itkImage.h" #include "mitkPixelType.h" namespace mitk { class Image; } typedef itk::Image FloatImageType; typedef itk::Image CharImageType; typedef itk::Image Float4DImageType; typedef itk::CovariantVector VectorType; typedef itk::Image DirectionImageType; /*! * \brief Implementation of the core functionality of TBSS. * This plugin provides the core functionality of TBSS (see Smith et al., 2009. http://dx.doi.org/10.1016/j.neuroimage.2006.02.024) * It can skeletonize a mean FA image and calculate the projection of all individual subjects to this skeleton. */ -class QmitkTbssSkeletonizationView : public QmitkFunctionality +class QmitkTbssSkeletonizationView : public QmitkAbstractView, public mitk::ILifecycleAwarePart { Q_OBJECT public: static const std::string VIEW_ID; QmitkTbssSkeletonizationView(); virtual ~QmitkTbssSkeletonizationView(); virtual void CreateQtPartControl(QWidget *parent) override; //Creation of the connections of main and control widget virtual void CreateConnections(); - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; - /// \brief Called when the functionality is activated + /// \brief Called when the view gets activated virtual void Activated() override; + /// \brief Called when the view gets deactivated virtual void Deactivated() override; + bool IsActivated() const; + + /// \brief Called when the view gets visible + virtual void Visible() override; + + /// \brief Called when the view gets hidden + virtual void Hidden() override; protected slots: /* \brief Perform skeletonization only */ void Skeletonize(); // Perform skeletonization and Projection of subject data to the skeleton void Project(); protected: - //brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + //brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; Ui::QmitkTbssSkeletonizationViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - void AddToDataStorage(mitk::Image* img, std::string name); template void ConvertToItk(mitk::PixelType, mitk::Image* image, Float4DImageType::Pointer); + private: + + bool m_Activated; + }; #endif // _QMITKTbssSkeletonizationVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.cpp index 2b74d81443..3e6961b76b 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.cpp @@ -1,1132 +1,1141 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Qmitk #include "QmitkTractbasedSpatialStatisticsView.h" -#include "QmitkStdMultiWidget.h" #include "mitkDataNodeObject.h" #include // Qt #include #include #include #include #include #include #include #include #include "vtkPoints.h" #include #include const std::string QmitkTractbasedSpatialStatisticsView::VIEW_ID = "org.mitk.views.tractbasedspatialstatistics"; using namespace berry; QmitkTractbasedSpatialStatisticsView::QmitkTractbasedSpatialStatisticsView() -: QmitkFunctionality() +: QmitkAbstractView() , m_Controls( 0 ) -, m_MultiWidget( NULL ) +, m_Activated(false) { } QmitkTractbasedSpatialStatisticsView::~QmitkTractbasedSpatialStatisticsView() { } void QmitkTractbasedSpatialStatisticsView::PerformChange() { m_Controls->m_RoiPlotWidget->ModifyPlot(m_Controls->m_Segments->value(), m_Controls->m_Average->isChecked()); } -void QmitkTractbasedSpatialStatisticsView::OnSelectionChanged(std::vector nodes) +void QmitkTractbasedSpatialStatisticsView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { //datamanager selection changed if (!this->IsActivated()) return; // Check which datatypes are selected in the datamanager and enable/disable widgets accordingly bool foundTbssRoi = false; bool foundTbss = false; bool found3dImage = false; bool found4dImage = false; bool foundFiberBundle = false; bool foundStartRoi = false; bool foundEndRoi = false; mitk::TbssRoiImage* roiImage; mitk::TbssImage* image; mitk::Image* img; mitk::FiberBundle* fib; mitk::DataNode* start; mitk::DataNode* end; m_CurrentStartRoi = NULL; m_CurrentEndRoi = NULL; - for ( int i=0; iGetData(); + mitk::BaseData* nodeData = node->GetData(); if( nodeData ) { if(QString("TbssRoiImage").compare(nodeData->GetNameOfClass())==0) { foundTbssRoi = true; roiImage = static_cast(nodeData); } else if (QString("TbssImage").compare(nodeData->GetNameOfClass())==0) { foundTbss = true; image = static_cast(nodeData); } else if(QString("Image").compare(nodeData->GetNameOfClass())==0) { img = static_cast(nodeData); if(img->GetDimension() == 3) { found3dImage = true; } else if(img->GetDimension() == 4) { found4dImage = true; } } else if (QString("FiberBundle").compare(nodeData->GetNameOfClass())==0) { foundFiberBundle = true; fib = static_cast(nodeData); - this->m_CurrentFiberNode = nodes[i]; + this->m_CurrentFiberNode = node; } if(QString("PlanarCircle").compare(nodeData->GetNameOfClass())==0) { if(!foundStartRoi) { - start = nodes[i]; - this->m_CurrentStartRoi = nodes[i]; + start = node; + this->m_CurrentStartRoi = node; foundStartRoi = true; } else { - end = nodes[i]; - this->m_CurrentEndRoi = nodes[i]; + end = node; + this->m_CurrentEndRoi = node; foundEndRoi = true; } } } } this->m_Controls->m_CreateRoi->setEnabled(found3dImage); this->m_Controls->m_ImportFsl->setEnabled(found4dImage); if(foundTbss && foundTbssRoi) { this->Plot(image, roiImage); } else if(found3dImage && foundFiberBundle && foundStartRoi && foundEndRoi) { this->PlotFiberBundle(fib, img, start, end); } else if(found3dImage && foundFiberBundle) { this->PlotFiberBundle(fib, img); } else if(foundTbss && foundStartRoi && foundEndRoi && foundFiberBundle) { this->PlotFiber4D(image, fib, start, end); } if(found3dImage) { this->InitPointsets(); } this->m_Controls->m_Cut->setEnabled(foundFiberBundle && foundStartRoi && foundEndRoi); this->m_Controls->m_SegmentLabel->setEnabled(foundFiberBundle && foundStartRoi && foundEndRoi && (found3dImage || foundTbss)); this->m_Controls->m_Segments->setEnabled(foundFiberBundle && foundStartRoi && foundEndRoi && (found3dImage || foundTbss)); this->m_Controls->m_Average->setEnabled(foundFiberBundle && foundStartRoi && foundEndRoi && found3dImage); } void QmitkTractbasedSpatialStatisticsView::InitPointsets() { // Check if PointSetStart exsits, if not create it. - m_P1 = this->GetDefaultDataStorage()->GetNamedNode("PointSetNode"); + m_P1 = this->GetDataStorage()->GetNamedNode("PointSetNode"); if (m_PointSetNode) { //m_PointSetNode = dynamic_cast(m_P1->GetData()); return; } if ((!m_P1) || (!m_PointSetNode)) { // create new ones m_PointSetNode = mitk::PointSet::New(); m_P1 = mitk::DataNode::New(); m_P1->SetData( m_PointSetNode ); m_P1->SetProperty( "name", mitk::StringProperty::New( "PointSet" ) ); m_P1->SetProperty( "opacity", mitk::FloatProperty::New( 1 ) ); m_P1->SetProperty( "helper object", mitk::BoolProperty::New(true) ); // CHANGE if wanted m_P1->SetProperty( "pointsize", mitk::FloatProperty::New( 0.1 ) ); m_P1->SetColor( 1.0, 0.0, 0.0 ); - this->GetDefaultDataStorage()->Add(m_P1); + this->GetDataStorage()->Add(m_P1); m_Controls->m_PointWidget->SetPointSetNode(m_P1); - m_Controls->m_PointWidget->SetMultiWidget(GetActiveStdMultiWidget()); + auto renderWindowPart = this->GetRenderWindowPart(OPEN); + auto axialSnc = renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController(); + auto sagittalSnc = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController(); + auto coronalSnc = renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController(); + m_Controls->m_PointWidget->AddSliceNavigationController(axialSnc); + m_Controls->m_PointWidget->AddSliceNavigationController(sagittalSnc); + m_Controls->m_PointWidget->AddSliceNavigationController(coronalSnc); } } void QmitkTractbasedSpatialStatisticsView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkTractbasedSpatialStatisticsViewControls; m_Controls->setupUi( parent ); this->CreateConnections(); } // Table for the FSL TBSS import m_GroupModel = new QmitkTbssTableModel(); m_Controls->m_GroupInfo->setModel(m_GroupModel); } -void QmitkTractbasedSpatialStatisticsView::Activated() +void QmitkTractbasedSpatialStatisticsView::SetFocus() { - QmitkFunctionality::Activated(); + m_Controls->m_AddGroup->setFocus(); +} +void QmitkTractbasedSpatialStatisticsView::Activated() +{ + m_Activated = true; } void QmitkTractbasedSpatialStatisticsView::Deactivated() { - QmitkFunctionality::Deactivated(); + m_Activated = false; +} + +bool QmitkTractbasedSpatialStatisticsView::IsActivated() const +{ + return m_Activated; +} + +void QmitkTractbasedSpatialStatisticsView::Visible() +{ +} + +void QmitkTractbasedSpatialStatisticsView::Hidden() +{ } void QmitkTractbasedSpatialStatisticsView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_CreateRoi), SIGNAL(clicked()), this, SLOT(CreateRoi()) ); connect( (QObject*)(m_Controls->m_ImportFsl), SIGNAL(clicked()), this, SLOT(TbssImport()) ); connect( (QObject*)(m_Controls->m_AddGroup), SIGNAL(clicked()), this, SLOT(AddGroup()) ); connect( (QObject*)(m_Controls->m_RemoveGroup), SIGNAL(clicked()), this, SLOT(RemoveGroup()) ); connect( (QObject*)(m_Controls->m_Clipboard), SIGNAL(clicked()), this, SLOT(CopyToClipboard()) ); connect( m_Controls->m_RoiPlotWidget->m_PlotPicker, SIGNAL(selected(const QPointF&)), SLOT(Clicked(const QPointF&) ) ); connect( m_Controls->m_RoiPlotWidget->m_PlotPicker, SIGNAL(moved(const QPointF&)), SLOT(Clicked(const QPointF&) ) ); connect( (QObject*)(m_Controls->m_Cut), SIGNAL(clicked()), this, SLOT(Cut()) ); connect( (QObject*)(m_Controls->m_Average), SIGNAL(stateChanged(int)), this, SLOT(PerformChange()) ); connect( (QObject*)(m_Controls->m_Segments), SIGNAL(valueChanged(int)), this, SLOT(PerformChange()) ); } } void QmitkTractbasedSpatialStatisticsView::CopyToClipboard() { if(m_Controls->m_RoiPlotWidget->IsPlottingFiber()) { // Working with fiber bundles std::vector > profiles = m_Controls->m_RoiPlotWidget->GetIndividualProfiles(); QString clipboardText; for (std::vector >::iterator it = profiles.begin(); it != profiles.end(); ++it) { for (std::vector::iterator it2 = (*it).begin(); it2 != (*it).end(); ++it2) { clipboardText.append(QString("%1 \t").arg(*it2)); } clipboardText.append(QString("\n")); } if(m_Controls->m_Average->isChecked()) { std::vector averages = m_Controls->m_RoiPlotWidget->GetAverageProfile(); clipboardText.append(QString("\nAverage\n")); for (std::vector::iterator it2 = averages.begin(); it2 != averages.end(); ++it2) { clipboardText.append(QString("%1 \t").arg(*it2)); } } QApplication::clipboard()->setText(clipboardText, QClipboard::Clipboard); } else{ // Working with TBSS Data if(m_Controls->m_Average->isChecked()) { std::vector > vals = m_Controls->m_RoiPlotWidget->GetVals(); QString clipboardText; for (std::vector >::iterator it = vals.begin(); it != vals.end(); ++it) { for (std::vector::iterator it2 = (*it).begin(); it2 != (*it).end(); ++it2) { clipboardText.append(QString("%1 \t").arg(*it2)); double d = *it2; std::cout << d <setText(clipboardText, QClipboard::Clipboard); } else { std::vector > vals = m_Controls->m_RoiPlotWidget->GetIndividualProfiles(); QString clipboardText; for (std::vector >::iterator it = vals.begin(); it != vals.end(); ++it) { for (std::vector::iterator it2 = (*it).begin(); it2 != (*it).end(); ++it2) { clipboardText.append(QString("%1 \t").arg(*it2)); double d = *it2; std::cout << d <setText(clipboardText, QClipboard::Clipboard); } } } void QmitkTractbasedSpatialStatisticsView::RemoveGroup() { QTableView *temp = static_cast(m_Controls->m_GroupInfo); QItemSelectionModel *selectionModel = temp->selectionModel(); QModelIndexList indices = selectionModel->selectedRows(); QModelIndex index; foreach(index, indices) { int row = index.row(); m_GroupModel->removeRows(row, 1, QModelIndex()); } } void QmitkTractbasedSpatialStatisticsView::AddGroup() { QString group("Group"); int number = 0; QPair pair(group, number); QList< QPair >list = m_GroupModel->getList(); if(!list.contains(pair)) { m_GroupModel->insertRows(0, 1, QModelIndex()); QModelIndex index = m_GroupModel->index(0, 0, QModelIndex()); m_GroupModel->setData(index, group, Qt::EditRole); index = m_GroupModel->index(0, 1, QModelIndex()); m_GroupModel->setData(index, number, Qt::EditRole); } } void QmitkTractbasedSpatialStatisticsView::TbssImport() { // Read groups from the interface mitk::TbssImporter::Pointer importer = mitk::TbssImporter::New(); QList< QPair >list = m_GroupModel->getList(); if(list.size() == 0) { QMessageBox msgBox; msgBox.setText("No study group information has been set yet."); msgBox.exec(); return; } std::vector < std::pair > groups; for(int i=0; i pair = list.at(i); std::string s = pair.first.toStdString(); int n = pair.second; std::pair p; p.first = s; p.second = n; groups.push_back(p); } importer->SetGroupInfo(groups); std::string minfo = m_Controls->m_MeasurementInfo->text().toStdString(); importer->SetMeasurementInfo(minfo); std::string name = ""; - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); - for ( int i=0; iGetData()->GetNameOfClass())==0) + if(QString("Image").compare(node->GetData()->GetNameOfClass())==0) { - mitk::Image* img = static_cast(nodes[i]->GetData()); + mitk::Image* img = static_cast(node->GetData()); if(img->GetDimension() == 4) { importer->SetImportVolume(img); - name = nodes[i]->GetName(); + name = node->GetName(); } } } mitk::TbssImage::Pointer tbssImage; tbssImage = importer->Import(); name += "_tbss"; AddTbssToDataStorage(tbssImage, name); } void QmitkTractbasedSpatialStatisticsView::AddTbssToDataStorage(mitk::Image* image, std::string name) { mitk::LevelWindow levelwindow; levelwindow.SetAuto( image ); mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); levWinProp->SetLevelWindow( levelwindow ); mitk::DataNode::Pointer result = mitk::DataNode::New(); result->SetProperty( "name", mitk::StringProperty::New(name) ); result->SetData( image ); result->SetProperty( "levelwindow", levWinProp ); // add new image to data storage and set as active to ease further processing - GetDefaultDataStorage()->Add( result ); + GetDataStorage()->Add( result ); // show the results mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkTractbasedSpatialStatisticsView::Clicked(const QPointF& pos) { int index = (int)pos.x(); if(m_Roi.size() > 0 && m_CurrentGeometry != NULL && !m_Controls->m_RoiPlotWidget->IsPlottingFiber() ) { index = std::min( (int)m_Roi.size()-1, std::max(0, index) ); itk::Index<3> ix = m_Roi.at(index); mitk::Vector3D i; i[0] = ix[0]; i[1] = ix[1]; i[2] = ix[2]; mitk::Vector3D w; m_CurrentGeometry->IndexToWorld(i, w); mitk::Point3D origin = m_CurrentGeometry->GetOrigin(); mitk::Point3D p; p[0] = w[0] + origin[0]; p[1] = w[1] + origin[1]; p[2] = w[2] + origin[2]; - m_MultiWidget->MoveCrossToPosition(p); + this->GetRenderWindowPart()->SetSelectedPosition(p); m_Controls->m_RoiPlotWidget->drawBar(index); } else if(m_Controls->m_RoiPlotWidget->IsPlottingFiber() ) { mitk::Point3D point = m_Controls->m_RoiPlotWidget->GetPositionInWorld(index); - m_MultiWidget->MoveCrossToPosition(point); + this->GetRenderWindowPart()->SetSelectedPosition(point); } } void QmitkTractbasedSpatialStatisticsView::Cut() { mitk::BaseData* fibData = m_CurrentFiberNode->GetData(); mitk::FiberBundle* fib = static_cast(fibData); mitk::PlaneGeometry* startGeometry2D = const_cast(dynamic_cast(m_CurrentStartRoi->GetData())->GetPlaneGeometry()); mitk::PlaneGeometry* endGeometry2D = const_cast(dynamic_cast(m_CurrentEndRoi->GetData())->GetPlaneGeometry()); mitk::Point3D startCenter = dynamic_cast(m_CurrentStartRoi->GetData())->GetWorldControlPoint(0); //center Point of start roi mitk::Point3D endCenter = dynamic_cast(m_CurrentEndRoi->GetData())->GetWorldControlPoint(0); //center Point of end roi mitk::FiberBundle::Pointer inStart = fib->ExtractFiberSubset(m_CurrentStartRoi, NULL); mitk::FiberBundle::Pointer inBoth = inStart->ExtractFiberSubset(m_CurrentEndRoi, NULL); int num = inBoth->GetNumFibers(); vtkSmartPointer fiberPolyData = inBoth->GetFiberPolyData(); vtkCellArray* lines = fiberPolyData->GetLines(); lines->InitTraversal(); // initialize new vtk polydata vtkSmartPointer points = vtkSmartPointer::New(); vtkSmartPointer polyData = vtkSmartPointer::New(); vtkSmartPointer cells = vtkSmartPointer::New(); int pointIndex=0; // find start and endpoint for( int fiberID( 0 ); fiberID < num; fiberID++ ) { vtkIdType numPointsInCell(0); vtkIdType* pointsInCell(NULL); lines->GetNextCell ( numPointsInCell, pointsInCell ); int startId = 0; int endId = 0; float minDistStart = std::numeric_limits::max(); float minDistEnd = std::numeric_limits::max(); vtkSmartPointer polyLine = vtkSmartPointer::New(); int lineIndex=0; for( int pointInCellID( 0 ); pointInCellID < numPointsInCell ; pointInCellID++) { double *p = fiberPolyData->GetPoint( pointsInCell[ pointInCellID ] ); mitk::Point3D point; point[0] = p[0]; point[1] = p[1]; point[2] = p[2]; float distanceToStart = point.EuclideanDistanceTo(startCenter); float distanceToEnd = point.EuclideanDistanceTo(endCenter); if(distanceToStart < minDistStart) { minDistStart = distanceToStart; startId = pointInCellID; } if(distanceToEnd < minDistEnd) { minDistEnd = distanceToEnd; endId = pointInCellID; } } /* We found the start and end points of of the part that should be plottet for the current fiber. now we need to plot them. If the endId is smaller than the startId the plot order must be reversed*/ if(startId < endId) { double *p = fiberPolyData->GetPoint( pointsInCell[ startId ] ); mitk::Vector3D p0; p0[0] = p[0]; p0[1] = p[1]; p0[2] = p[2]; p = fiberPolyData->GetPoint( pointsInCell[ startId+1 ] ); mitk::Vector3D p1; p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; // Check if p and p2 are both on the same side of the plane mitk::Vector3D normal = startGeometry2D->GetNormal(); mitk::Point3D pStart; pStart[0] = p0[0]; pStart[1] = p0[1]; pStart[2] = p0[2]; bool startOnPositive = startGeometry2D->IsAbove(pStart); mitk::Point3D pSecond; pSecond[0] = p1[0]; pSecond[1] = p1[1]; pSecond[2] = p1[2]; bool secondOnPositive = startGeometry2D->IsAbove(pSecond); // Calculate intersection with the plane mitk::Vector3D onPlane; onPlane[0] = startCenter[0]; onPlane[1] = startCenter[1]; onPlane[2] = startCenter[2]; if(! (secondOnPositive ^ startOnPositive) ) { /* startId and startId+1 lie on the same side of the plane, so we need need startId-1 to calculate the intersection with the planar figure*/ p = fiberPolyData->GetPoint( pointsInCell[ startId-1 ] ); p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; } double d = ( (onPlane-p0)*normal) / ( (p0-p1) * normal ); mitk::Vector3D newPoint = (p0-p1); newPoint[0] = d*newPoint[0] + p0[0]; newPoint[1] = d*newPoint[1] + p0[1]; newPoint[2] = d*newPoint[2] + p0[2]; double insertPoint[3]; insertPoint[0] = newPoint[0]; insertPoint[1] = newPoint[1]; insertPoint[2] = newPoint[2]; // First insert the intersection with the start roi points->InsertNextPoint(insertPoint); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; if(! (secondOnPositive ^ startOnPositive) ) { /* StartId and startId+1 lie on the same side of the plane so startId is also part of the ROI*/ double *start = fiberPolyData->GetPoint( pointsInCell[startId] ); points->InsertNextPoint(start); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } // Insert the rest up and to including endId-1 for( int pointInCellID( startId+1 ); pointInCellID < endId ; pointInCellID++) { // create new polyline for new polydata double *p = fiberPolyData->GetPoint( pointsInCell[ pointInCellID ] ); points->InsertNextPoint(p); // add point to line polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } /* endId must be included if endId and endId-1 lie on the same side of the plane defined by endRoi*/ p = fiberPolyData->GetPoint( pointsInCell[ endId ] ); p0[0] = p[0]; p0[1] = p[1]; p0[2] = p[2]; p = fiberPolyData->GetPoint( pointsInCell[ endId-1 ] ); p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; mitk::Point3D pLast; pLast[0] = p0[0]; pLast[1] = p0[1]; pLast[2] = p0[2]; mitk::Point3D pBeforeLast; pBeforeLast[0] = p1[0]; pBeforeLast[1] = p1[1]; pBeforeLast[2] = p1[2]; bool lastOnPositive = endGeometry2D->IsAbove(pLast); bool secondLastOnPositive = endGeometry2D->IsAbove(pBeforeLast); normal = endGeometry2D->GetNormal(); onPlane[0] = endCenter[0]; onPlane[1] = endCenter[1]; onPlane[2] = endCenter[2]; if(! (lastOnPositive ^ secondLastOnPositive) ) { /* endId and endId-1 lie on the same side of the plane, so we need need endId+1 to calculate the intersection with the planar figure. this should exist since we know that the fiber crosses the planar figure endId is part of the roi so can also be included here*/ p = fiberPolyData->GetPoint( pointsInCell[ endId+1 ] ); p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; double *end = fiberPolyData->GetPoint( pointsInCell[endId] ); points->InsertNextPoint(end); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } d = ( (onPlane-p0)*normal) / ( (p0-p1) * normal ); newPoint = (p0-p1); newPoint[0] = d*newPoint[0] + p0[0]; newPoint[1] = d*newPoint[1] + p0[1]; newPoint[2] = d*newPoint[2] + p0[2]; insertPoint[0] = newPoint[0]; insertPoint[1] = newPoint[1]; insertPoint[2] = newPoint[2]; //Insert the Last Point (intersection with the end roi) points->InsertNextPoint(insertPoint); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } // Need to reverse walking order else{ double *p = fiberPolyData->GetPoint( pointsInCell[ startId ] ); mitk::Vector3D p0; p0[0] = p[0]; p0[1] = p[1]; p0[2] = p[2]; p = fiberPolyData->GetPoint( pointsInCell[ startId-1 ] ); mitk::Vector3D p1; p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; // Check if p and p2 are both on the same side of the plane mitk::Vector3D normal = startGeometry2D->GetNormal(); mitk::Point3D pStart; pStart[0] = p0[0]; pStart[1] = p0[1]; pStart[2] = p0[2]; bool startOnPositive = startGeometry2D->IsAbove(pStart); mitk::Point3D pSecond; pSecond[0] = p1[0]; pSecond[1] = p1[1]; pSecond[2] = p1[2]; bool secondOnPositive = startGeometry2D->IsAbove(pSecond); // Calculate intersection with the plane mitk::Vector3D onPlane; onPlane[0] = startCenter[0]; onPlane[1] = startCenter[1]; onPlane[2] = startCenter[2]; if(! (secondOnPositive ^ startOnPositive) ) { /* startId and startId-1 lie on the same side of the plane, so we need need startId+1 to calculate the intersection with the planar figure*/ p = fiberPolyData->GetPoint( pointsInCell[ startId+1 ] ); p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; } double d = ( (onPlane-p0)*normal) / ( (p0-p1) * normal ); mitk::Vector3D newPoint = (p0-p1); newPoint[0] = d*newPoint[0] + p0[0]; newPoint[1] = d*newPoint[1] + p0[1]; newPoint[2] = d*newPoint[2] + p0[2]; double insertPoint[3]; insertPoint[0] = newPoint[0]; insertPoint[1] = newPoint[1]; insertPoint[2] = newPoint[2]; // First insert the intersection with the start roi points->InsertNextPoint(insertPoint); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; if(! (secondOnPositive ^ startOnPositive) ) { /* startId and startId-1 lie on the same side of the plane so endId is also part of the ROI*/ double *start = fiberPolyData->GetPoint( pointsInCell[startId] ); points->InsertNextPoint(start); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } // Insert the rest up and to including endId-1 for( int pointInCellID( startId-1 ); pointInCellID > endId ; pointInCellID--) { // create new polyline for new polydata double *p = fiberPolyData->GetPoint( pointsInCell[ pointInCellID ] ); points->InsertNextPoint(p); // add point to line polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } /* startId must be included if startId and startId+ lie on the same side of the plane defined by endRoi*/ p = fiberPolyData->GetPoint( pointsInCell[ endId ] ); p0[0] = p[0]; p0[1] = p[1]; p0[2] = p[2]; p = fiberPolyData->GetPoint( pointsInCell[ endId+1 ] ); p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; mitk::Point3D pLast; pLast[0] = p0[0]; pLast[1] = p0[1]; pLast[2] = p0[2]; bool lastOnPositive = endGeometry2D->IsAbove(pLast); mitk::Point3D pBeforeLast; pBeforeLast[0] = p1[0]; pBeforeLast[1] = p1[1]; pBeforeLast[2] = p1[2]; bool secondLastOnPositive = endGeometry2D->IsAbove(pBeforeLast); onPlane[0] = endCenter[0]; onPlane[1] = endCenter[1]; onPlane[2] = endCenter[2]; if(! (lastOnPositive ^ secondLastOnPositive) ) { /* endId and endId+1 lie on the same side of the plane, so we need need endId-1 to calculate the intersection with the planar figure. this should exist since we know that the fiber crosses the planar figure*/ p = fiberPolyData->GetPoint( pointsInCell[ endId-1 ] ); p1[0] = p[0]; p1[1] = p[1]; p1[2] = p[2]; /* endId and endId+1 lie on the same side of the plane so startId is also part of the ROI*/ double *end = fiberPolyData->GetPoint( pointsInCell[endId] ); points->InsertNextPoint(end); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } d = ( (onPlane-p0)*normal) / ( (p0-p1) * normal ); newPoint = (p0-p1); newPoint[0] = d*newPoint[0] + p0[0]; newPoint[1] = d*newPoint[1] + p0[1]; newPoint[2] = d*newPoint[2] + p0[2]; insertPoint[0] = newPoint[0]; insertPoint[1] = newPoint[1]; insertPoint[2] = newPoint[2]; //Insert the Last Point (intersection with the end roi) points->InsertNextPoint(insertPoint); polyLine->GetPointIds()->InsertId(lineIndex,pointIndex); lineIndex++; pointIndex++; } // add polyline to vtk cell array cells->InsertNextCell(polyLine); } // Add the points to the dataset polyData->SetPoints(points); // Add the lines to the dataset polyData->SetLines(cells); mitk::FiberBundle::Pointer cutBundle = mitk::FiberBundle::New(polyData); mitk::DataNode::Pointer cutNode = mitk::DataNode::New(); cutNode->SetData(cutBundle); std::string name = "fiberCut"; cutNode->SetName(name); GetDataStorage()->Add(cutNode); } -void QmitkTractbasedSpatialStatisticsView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkTractbasedSpatialStatisticsView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - - void QmitkTractbasedSpatialStatisticsView::CreateRoi() { bool ok; double threshold = QInputDialog::getDouble(m_Controls->m_CreateRoi, tr("Set an FA threshold"), tr("Threshold:"), 0.2, 0.0, 1.0, 2, &ok); if(!ok) return; mitk::Image::Pointer image; - std::vector nodes = this->GetDataManagerSelection(); + QList nodes = this->GetDataManagerSelection(); - for ( int i=0; iGetData()->GetNameOfClass())==0) + if(QString("Image").compare(node->GetData()->GetNameOfClass())==0) { - mitk::Image* img = static_cast(nodes[i]->GetData()); + mitk::Image* img = static_cast(node->GetData()); if(img->GetDimension() == 3) { image = img; } } } if(image.IsNull()) { return; } mitk::TractAnalyzer analyzer; analyzer.SetInputImage(image); analyzer.SetThreshold(threshold); m_PointSetNode = this->m_Controls->m_PointWidget->GetPointSet(); // Set Pointset to analyzer analyzer.SetPointSet(m_PointSetNode); // Run Analyzer try { analyzer.MakeRoi(); } catch (const mitk::Exception& e) { QMessageBox msgBox; msgBox.setText(QString::fromStdString(e.what())); msgBox.exec(); } // Obtain tbss roi image from analyzer mitk::TbssRoiImage::Pointer tbssRoi = analyzer.GetRoiImage(); tbssRoi->SetStructure(m_Controls->m_Structure->text().toStdString()); // get path description and set to interface std::string pathDescription = analyzer.GetPathDescription(); m_Controls->m_PathTextEdit->setPlainText(QString(pathDescription.c_str())); // Add roi image to datastorage AddTbssToDataStorage(tbssRoi, m_Controls->m_RoiName->text().toStdString()); } void QmitkTractbasedSpatialStatisticsView::PlotFiber4D(mitk::TbssImage* image, mitk::FiberBundle* fib, mitk::DataNode* startRoi, mitk::DataNode* endRoi) { if(m_Controls->m_TabWidget->currentWidget() == m_Controls->m_MeasureTAB) { m_CurrentGeometry = image->GetGeometry(); m_Controls->m_RoiPlotWidget->SetGroups(image->GetGroupInfo()); m_Controls->m_RoiPlotWidget->SetProjections(image->GetImage()); m_Controls->m_RoiPlotWidget->SetMeasure( image->GetMeasurementInfo() ); m_Controls->m_RoiPlotWidget->PlotFiber4D(image, fib, startRoi, endRoi, m_Controls->m_Segments->value()); } } void QmitkTractbasedSpatialStatisticsView:: PlotFiberBundle(mitk::FiberBundle *fib, mitk::Image* img, mitk::DataNode* startRoi, mitk::DataNode* endRoi) { bool avg = m_Controls->m_Average->isChecked(); int segments = m_Controls->m_Segments->value(); m_Controls->m_RoiPlotWidget->PlotFiberBetweenRois(fib, img, startRoi ,endRoi, avg, segments); m_Controls->m_RoiPlotWidget->SetPlottingFiber(true); mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); } void QmitkTractbasedSpatialStatisticsView::Plot(mitk::TbssImage* image, mitk::TbssRoiImage* roiImage) { if(m_Controls->m_TabWidget->currentWidget() == m_Controls->m_MeasureTAB) { std::vector< itk::Index<3> > roi = roiImage->GetRoi(); m_Roi = roi; m_CurrentGeometry = image->GetGeometry(); std::string structure = roiImage->GetStructure(); m_Controls->m_RoiPlotWidget->SetGroups(image->GetGroupInfo()); m_Controls->m_RoiPlotWidget->SetProjections(image->GetImage()); m_Controls->m_RoiPlotWidget->SetRoi(roi); m_Controls->m_RoiPlotWidget->SetStructure(structure); m_Controls->m_RoiPlotWidget->SetMeasure( image->GetMeasurementInfo() ); m_Controls->m_RoiPlotWidget->DrawProfiles(); } m_Controls->m_RoiPlotWidget->SetPlottingFiber(false); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.h index 32bf17a724..51c987a2bc 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tbss/src/internal/QmitkTractbasedSpatialStatisticsView.h @@ -1,177 +1,184 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkTractbasedSpatialStatisticsView_h #define QmitkTractbasedSpatialStatisticsView_h -#include +#include +#include #include "ui_QmitkTractbasedSpatialStatisticsViewControls.h" #include #include #include #include #include #include #include "QmitkTbssTableModel.h" #include "QmitkTbssMetaTableModel.h" #include // Image types typedef short DiffusionPixelType; typedef itk::Image CharImageType; typedef itk::Image UCharImageType; typedef itk::Image Float4DImageType; typedef itk::Image FloatImageType; typedef itk::VectorImage VectorImageType; // Readers/Writers typedef itk::ImageFileReader< CharImageType > CharReaderType; typedef itk::ImageFileReader< UCharImageType > UCharReaderType; typedef itk::ImageFileWriter< CharImageType > CharWriterType; typedef itk::ImageFileReader< FloatImageType > FloatReaderType; typedef itk::ImageFileWriter< FloatImageType > FloatWriterType; typedef itk::ImageFileReader< Float4DImageType > Float4DReaderType; typedef itk::ImageFileWriter< Float4DImageType > Float4DWriterType; /*! * \brief This plugin provides an extension for Tract-based spatial statistics (see Smith et al., 2009. http://dx.doi.org/10.1016/j.neuroimage.2006.02.024) * TBSS enables analyzing the brain by a pipeline of registration, skeletonization, and projection that results in a white matter skeleton * for all subjects that are analyzed statistically in a whole-brain manner. * This plugin provides functionality to select single tracts and analyze them separately. * * Prerequisites: the mean_FA_skeleton and all_FA_skeletonised datasets produced by the FSL TBSS pipeline: http://fsl.fmrib.ox.ac.uk/fsl/fsl4.0/tbss/index */ -class QmitkTractbasedSpatialStatisticsView : public QmitkFunctionality +class QmitkTractbasedSpatialStatisticsView : public QmitkAbstractView, public mitk::ILifecycleAwarePart { Q_OBJECT public: static const std::string VIEW_ID; QmitkTractbasedSpatialStatisticsView(); virtual ~QmitkTractbasedSpatialStatisticsView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; - /// \brief Called when the functionality is activated + /// \brief Called when the view gets activated virtual void Activated() override; + /// \brief Called when the view gets deactivated virtual void Deactivated() override; + bool IsActivated() const; + + /// \brief Called when the view gets visible + virtual void Visible() override; + + /// \brief Called when the view gets hidden + virtual void Hidden() override; protected slots: // Creates Roi void CreateRoi(); void Clicked(const QPointF& pos); // Import of FSL TBSS data void TbssImport(); // Add a group as metadata. This metadata is required by the plotting functionality void AddGroup(); // Remove a group void RemoveGroup(); // Copies the values displayed in the plot widget to clipboard, i.e. exports the data void CopyToClipboard(); // Method to cut away parts of fiber bundles that should not be plotted. void Cut(); // Adjust plot widget void PerformChange(); protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; // Creates a plot using a 4D image containing the projections of all subjects and a region of interest void Plot(mitk::TbssImage*, mitk::TbssRoiImage*); void PlotFiberBundle(mitk::FiberBundle* fib, mitk::Image* img, mitk::DataNode* startRoi=NULL, mitk::DataNode* endRoi=NULL); void PlotFiber4D(mitk::TbssImage*, mitk::FiberBundle* fib, mitk::DataNode *startRoi=NULL, mitk::DataNode *endRoi=NULL); // Create a point set. This point set defines the points through which a region of interest should go void InitPointsets(); // Pointset and DataNode to contain the PointSet used in ROI creation mitk::PointSet::Pointer m_PointSetNode; mitk::DataNode::Pointer m_P1; // GUI widgets Ui::QmitkTractbasedSpatialStatisticsViewControls* m_Controls; - /* A pointer to the QmitkStdMultiWidget. Used for interaction with the plot widget - (clicking in the plot widget makes the image cross jump to the corresponding location - on the skeleton).*/ - QmitkStdMultiWidget* m_MultiWidget; - // Used to save the region of interest in a vector of itk::index. std::vector< itk::Index<3> > m_Roi; mitk::FiberBundle* m_Fib; mitk::BaseGeometry* m_CurrentGeometry; // A table model for saving group information in a name,number pair. QmitkTbssTableModel* m_GroupModel; // Convenience function for adding a new image to the datastorage and giving it a name. void AddTbssToDataStorage(mitk::Image* image, std::string name); mitk::DataNode::Pointer m_CurrentFiberNode; // needed for the index property when interacting with the plot widget // needed when a plot should only show values between a start end end roi mitk::DataNode::Pointer m_CurrentStartRoi; mitk::DataNode::Pointer m_CurrentEndRoi; +private: - + bool m_Activated; }; #endif // _QMITKTRACTBASEDSPATIALSTATISTICSVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/QmitkMlbstTrainingDataWidget.h b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/QmitkMlbstTrainingDataWidget.h index 551248adfd..e728c4810a 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/QmitkMlbstTrainingDataWidget.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/QmitkMlbstTrainingDataWidget.h @@ -1,71 +1,69 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QmitkMlbstTrainingDataWidget_H_INCLUDED #define _QmitkMlbstTrainingDataWidget_H_INCLUDED //QT headers #include #include #include "ui_QmitkMlbstTrainingDataWidgetControls.h" #include #include #include -class QmitkStdMultiWidget; - /** @brief */ class DIFFUSIONIMAGING_TRACTOGRAPHY_EXPORT QmitkMlbstTrainingDataWidget : public QWidget { //this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkMlbstTrainingDataWidget (QWidget* parent = nullptr, Qt::WindowFlags f = nullptr); virtual ~QmitkMlbstTrainingDataWidget(); virtual void CreateQtPartControl(QWidget *parent); mitk::DataNode::Pointer GetImage(){ return m_Controls->image->GetSelectedNode(); } mitk::DataNode::Pointer GetFibers(){ return m_Controls->fibers->GetSelectedNode(); } mitk::DataNode::Pointer GetMask(){ return m_Controls->mask->GetSelectedNode(); } mitk::DataNode::Pointer GetWhiteMatter(){ return m_Controls->whiteMatter->GetSelectedNode(); } void SetDataStorage(mitk::DataStorage::Pointer ds) { m_Controls->image->SetDataStorage(ds); m_Controls->fibers->SetDataStorage(ds); m_Controls->mask->SetDataStorage(ds); m_Controls->whiteMatter->SetDataStorage(ds); m_Controls->mask->SetZeroEntryText("--"); m_Controls->whiteMatter->SetZeroEntryText("--"); } public slots: protected: // member variables Ui::QmitkMlbstTrainingDataWidgetControls* m_Controls; private: }; #endif // _QmitkMlbstTrainingDataWidget_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.cpp index b4234588dd..68aeb52ba3 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.cpp @@ -1,648 +1,636 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkGibbsTrackingView.h" -#include // Qt #include #include #include +#include // MITK #include #include #include #include #include // ITK #include #include #include // MISC #include QmitkTrackingWorker::QmitkTrackingWorker(QmitkGibbsTrackingView* view) : m_View(view) { } void QmitkTrackingWorker::run() { m_View->m_GlobalTracker = QmitkGibbsTrackingView::GibbsTrackingFilterType::New(); m_View->m_GlobalTracker->SetQBallImage(m_View->m_ItkQBallImage); m_View->m_GlobalTracker->SetTensorImage(m_View->m_ItkTensorImage); m_View->m_GlobalTracker->SetMaskImage(m_View->m_MaskImage); m_View->m_GlobalTracker->SetStartTemperature((float)m_View->m_Controls->m_StartTempSlider->value()/100); m_View->m_GlobalTracker->SetEndTemperature((float)m_View->m_Controls->m_EndTempSlider->value()/10000); m_View->m_GlobalTracker->SetIterations(m_View->m_Controls->m_IterationsBox->text().toDouble()); m_View->m_GlobalTracker->SetParticleWeight((float)m_View->m_Controls->m_ParticleWeightSlider->value()/10000); m_View->m_GlobalTracker->SetParticleWidth((float)(m_View->m_Controls->m_ParticleWidthSlider->value())/10); m_View->m_GlobalTracker->SetParticleLength((float)(m_View->m_Controls->m_ParticleLengthSlider->value())/10); m_View->m_GlobalTracker->SetInexBalance((float)m_View->m_Controls->m_InExBalanceSlider->value()/10); m_View->m_GlobalTracker->SetMinFiberLength(m_View->m_Controls->m_FiberLengthSlider->value()); m_View->m_GlobalTracker->SetCurvatureThreshold(cos((float)m_View->m_Controls->m_CurvatureThresholdSlider->value()*M_PI/180)); m_View->m_GlobalTracker->SetRandomSeed(m_View->m_Controls->m_RandomSeedSlider->value()); try{ m_View->m_GlobalTracker->Update(); } catch( mitk::Exception e ) { MITK_ERROR << "Internal error occured: " << e.what() << "\nAborting"; } m_View->m_TrackingThread.quit(); } const std::string QmitkGibbsTrackingView::VIEW_ID = "org.mitk.views.gibbstracking"; QmitkGibbsTrackingView::QmitkGibbsTrackingView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget(NULL) , m_FiberBundle(NULL) , m_MaskImage(NULL) , m_TensorImage(NULL) , m_QBallImage(NULL) , m_ItkQBallImage(NULL) , m_ItkTensorImage(NULL) , m_ImageNode(NULL) , m_MaskImageNode(NULL) , m_FiberBundleNode(NULL) , m_ThreadIsRunning(false) , m_ElapsedTime(0) , m_GlobalTracker(NULL) , m_TrackingWorker(this) , m_TrackingNode(NULL) { m_TrackingWorker.moveToThread(&m_TrackingThread); connect(&m_TrackingThread, SIGNAL(started()), this, SLOT(BeforeThread())); connect(&m_TrackingThread, SIGNAL(started()), &m_TrackingWorker, SLOT(run())); connect(&m_TrackingThread, SIGNAL(finished()), this, SLOT(AfterThread())); connect(&m_TrackingThread, SIGNAL(terminated()), this, SLOT(AfterThread())); m_TrackingTimer = new QTimer(this); } QmitkGibbsTrackingView::~QmitkGibbsTrackingView() { if (m_GlobalTracker.IsNull()) return; m_GlobalTracker->SetAbortTracking(true); m_TrackingThread.wait(); } // update tracking status and generate fiber bundle void QmitkGibbsTrackingView::TimerUpdate() { UpdateTrackingStatus(); GenerateFiberBundle(); } // tell global tractography filter to stop after current step void QmitkGibbsTrackingView::StopGibbsTracking() { if (m_GlobalTracker.IsNull()) return; m_GlobalTracker->SetAbortTracking(true); m_Controls->m_TrackingStop->setEnabled(false); m_Controls->m_TrackingStop->setText("Stopping Tractography ..."); m_TrackingNode = NULL; } // update gui elements and generate fiber bundle after tracking is finished void QmitkGibbsTrackingView::AfterThread() { m_ThreadIsRunning = false; m_TrackingTimer->stop(); UpdateGUI(); if( !m_GlobalTracker->GetIsInValidState() ) { QMessageBox::critical( NULL, "Gibbs Tracking", "An internal error occured. Tracking aborted.\n Please check the log for details." ); m_FiberBundleNode = NULL; return; } UpdateTrackingStatus(); if(m_Controls->m_ParticleWeightSlider->value()==0) { m_Controls->m_ParticleWeightLabel->setText(QString::number(m_GlobalTracker->GetParticleWeight())); m_Controls->m_ParticleWeightSlider->setValue(m_GlobalTracker->GetParticleWeight()*10000); } if(m_Controls->m_ParticleWidthSlider->value()==0) { m_Controls->m_ParticleWidthLabel->setText(QString::number(m_GlobalTracker->GetParticleWidth())); m_Controls->m_ParticleWidthSlider->setValue(m_GlobalTracker->GetParticleWidth()*10); } if(m_Controls->m_ParticleLengthSlider->value()==0) { m_Controls->m_ParticleLengthLabel->setText(QString::number(m_GlobalTracker->GetParticleLength())); m_Controls->m_ParticleLengthSlider->setValue(m_GlobalTracker->GetParticleLength()*10); } GenerateFiberBundle(); m_FiberBundleNode = 0; m_GlobalTracker = 0; // images not needed anymore ( relevant only for computation ) // we need to release them to remove the memory access block created through CastToItk<> calls this->m_ItkQBallImage = 0; this->m_ItkTensorImage = 0; } // start tracking timer and update gui elements before tracking is started void QmitkGibbsTrackingView::BeforeThread() { m_ThreadIsRunning = true; m_TrackingTime = QTime::currentTime(); m_ElapsedTime = 0; m_TrackingTimer->start(1000); UpdateGUI(); } // setup gui elements and signal/slot connections void QmitkGibbsTrackingView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkGibbsTrackingViewControls; m_Controls->setupUi( parent ); AdvancedSettings(); connect( m_TrackingTimer, SIGNAL(timeout()), this, SLOT(TimerUpdate()) ); connect( m_Controls->m_TrackingStop, SIGNAL(clicked()), this, SLOT(StopGibbsTracking()) ); connect( m_Controls->m_TrackingStart, SIGNAL(clicked()), this, SLOT(StartGibbsTracking()) ); connect( m_Controls->m_AdvancedSettingsCheckbox, SIGNAL(clicked()), this, SLOT(AdvancedSettings()) ); connect( m_Controls->m_SaveTrackingParameters, SIGNAL(clicked()), this, SLOT(SaveTrackingParameters()) ); connect( m_Controls->m_LoadTrackingParameters, SIGNAL(clicked()), this, SLOT(LoadTrackingParameters()) ); connect( m_Controls->m_ParticleWidthSlider, SIGNAL(valueChanged(int)), this, SLOT(SetParticleWidth(int)) ); connect( m_Controls->m_ParticleLengthSlider, SIGNAL(valueChanged(int)), this, SLOT(SetParticleLength(int)) ); connect( m_Controls->m_InExBalanceSlider, SIGNAL(valueChanged(int)), this, SLOT(SetInExBalance(int)) ); connect( m_Controls->m_FiberLengthSlider, SIGNAL(valueChanged(int)), this, SLOT(SetFiberLength(int)) ); connect( m_Controls->m_ParticleWeightSlider, SIGNAL(valueChanged(int)), this, SLOT(SetParticleWeight(int)) ); connect( m_Controls->m_StartTempSlider, SIGNAL(valueChanged(int)), this, SLOT(SetStartTemp(int)) ); connect( m_Controls->m_EndTempSlider, SIGNAL(valueChanged(int)), this, SLOT(SetEndTemp(int)) ); connect( m_Controls->m_CurvatureThresholdSlider, SIGNAL(valueChanged(int)), this, SLOT(SetCurvatureThreshold(int)) ); connect( m_Controls->m_RandomSeedSlider, SIGNAL(valueChanged(int)), this, SLOT(SetRandomSeed(int)) ); connect( m_Controls->m_OutputFileButton, SIGNAL(clicked()), this, SLOT(SetOutputFile()) ); } } +void QmitkGibbsTrackingView::SetFocus() +{ + m_Controls->m_TrackingStart->setFocus(); +} + void QmitkGibbsTrackingView::SetInExBalance(int value) { m_Controls->m_InExBalanceLabel->setText(QString::number((float)value/10)); } void QmitkGibbsTrackingView::SetFiberLength(int value) { m_Controls->m_FiberLengthLabel->setText(QString::number(value)+"mm"); } void QmitkGibbsTrackingView::SetRandomSeed(int value) { if (value>=0) m_Controls->m_RandomSeedLabel->setText(QString::number(value)); else m_Controls->m_RandomSeedLabel->setText("auto"); } void QmitkGibbsTrackingView::SetParticleWeight(int value) { if (value>0) m_Controls->m_ParticleWeightLabel->setText(QString::number((float)value/10000)); else m_Controls->m_ParticleWeightLabel->setText("auto"); } void QmitkGibbsTrackingView::SetStartTemp(int value) { m_Controls->m_StartTempLabel->setText(QString::number((float)value/100)); } void QmitkGibbsTrackingView::SetEndTemp(int value) { m_Controls->m_EndTempLabel->setText(QString::number((float)value/10000)); } void QmitkGibbsTrackingView::SetParticleWidth(int value) { if (value>0) m_Controls->m_ParticleWidthLabel->setText(QString::number((float)value/10)+" mm"); else m_Controls->m_ParticleWidthLabel->setText("auto"); } void QmitkGibbsTrackingView::SetParticleLength(int value) { if (value>0) m_Controls->m_ParticleLengthLabel->setText(QString::number((float)value/10)+" mm"); else m_Controls->m_ParticleLengthLabel->setText("auto"); } void QmitkGibbsTrackingView::SetCurvatureThreshold(int value) { m_Controls->m_CurvatureThresholdLabel->setText(QString::number(value)+"°"); } -void QmitkGibbsTrackingView::StdMultiWidgetAvailable(QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - -void QmitkGibbsTrackingView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - // called if datamanager selection changes -void QmitkGibbsTrackingView::OnSelectionChanged( std::vector nodes ) +void QmitkGibbsTrackingView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { if (m_ThreadIsRunning) return; m_ImageNode = NULL; m_MaskImageNode = NULL; // iterate all selected objects - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; - if( node.IsNotNull() && dynamic_cast(node->GetData()) ) m_ImageNode = node; else if( node.IsNotNull() && dynamic_cast(node->GetData()) ) m_ImageNode = node; else if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { mitk::Image::Pointer img = dynamic_cast(node->GetData()); if (img->GetPixelType().GetPixelType()==itk::ImageIOBase::SCALAR) m_MaskImageNode = node; } } UpdateGUI(); } void QmitkGibbsTrackingView::NodeRemoved(const mitk::DataNode * node) { if (m_ThreadIsRunning) { if (node==m_TrackingNode.GetPointer()) { StopGibbsTracking(); } } } // update gui elements displaying trackings status void QmitkGibbsTrackingView::UpdateTrackingStatus() { if (m_GlobalTracker.IsNull()) return; m_ElapsedTime += m_TrackingTime.elapsed()/1000; m_TrackingTime.restart(); unsigned long hours = m_ElapsedTime/3600; unsigned long minutes = (m_ElapsedTime%3600)/60; unsigned long seconds = m_ElapsedTime%60; m_Controls->m_ProposalAcceptance->setText(QString::number(m_GlobalTracker->GetProposalAcceptance()*100)+"%"); m_Controls->m_TrackingTimeLabel->setText( QString::number(hours)+QString("h ")+QString::number(minutes)+QString("m ")+QString::number(seconds)+QString("s") ); m_Controls->m_NumConnectionsLabel->setText( QString::number(m_GlobalTracker->GetNumConnections()) ); m_Controls->m_NumParticlesLabel->setText( QString::number(m_GlobalTracker->GetNumParticles()) ); m_Controls->m_CurrentStepLabel->setText( QString::number(100*m_GlobalTracker->GetCurrentIteration()/m_GlobalTracker->GetIterations())+"%" ); m_Controls->m_AcceptedFibersLabel->setText( QString::number(m_GlobalTracker->GetNumAcceptedFibers()) ); } // update gui elements (enable/disable elements and set tooltips) void QmitkGibbsTrackingView::UpdateGUI() { if (m_ImageNode.IsNotNull()) { m_Controls->m_QballImageLabel->setText(m_ImageNode->GetName().c_str()); m_Controls->m_DataFrame->setTitle("Input Data"); } else { m_Controls->m_QballImageLabel->setText("mandatory"); m_Controls->m_DataFrame->setTitle("Please Select Input Data"); } if (m_MaskImageNode.IsNotNull()) m_Controls->m_MaskImageLabel->setText(m_MaskImageNode->GetName().c_str()); else m_Controls->m_MaskImageLabel->setText("optional"); if (!m_ThreadIsRunning && m_ImageNode.IsNotNull()) { m_Controls->m_TrackingStop->setEnabled(false); m_Controls->m_TrackingStart->setEnabled(true); m_Controls->m_LoadTrackingParameters->setEnabled(true); m_Controls->m_IterationsBox->setEnabled(true); m_Controls->m_AdvancedFrame->setEnabled(true); m_Controls->m_TrackingStop->setText("Stop Tractography"); m_Controls->m_TrackingStart->setToolTip("Start tractography. No further change of parameters possible."); m_Controls->m_TrackingStop->setToolTip(""); } else if (!m_ThreadIsRunning) { m_Controls->m_TrackingStop->setEnabled(false); m_Controls->m_TrackingStart->setEnabled(false); m_Controls->m_LoadTrackingParameters->setEnabled(true); m_Controls->m_IterationsBox->setEnabled(true); m_Controls->m_AdvancedFrame->setEnabled(true); m_Controls->m_TrackingStop->setText("Stop Tractography"); m_Controls->m_TrackingStart->setToolTip("No Q-Ball image selected."); m_Controls->m_TrackingStop->setToolTip(""); } else { m_Controls->m_TrackingStop->setEnabled(true); m_Controls->m_TrackingStart->setEnabled(false); m_Controls->m_LoadTrackingParameters->setEnabled(false); m_Controls->m_IterationsBox->setEnabled(false); m_Controls->m_AdvancedFrame->setEnabled(false); m_Controls->m_AdvancedFrame->setVisible(false); m_Controls->m_AdvancedSettingsCheckbox->setChecked(false); m_Controls->m_TrackingStart->setToolTip("Tracking in progress."); m_Controls->m_TrackingStop->setToolTip("Stop tracking and display results."); } } // show/hide advanced settings frame void QmitkGibbsTrackingView::AdvancedSettings() { m_Controls->m_AdvancedFrame->setVisible(m_Controls->m_AdvancedSettingsCheckbox->isChecked()); } // set mask image data node void QmitkGibbsTrackingView::SetMask() { - std::vector nodes = GetDataManagerSelection(); + QList nodes = GetDataManagerSelection(); if (nodes.empty()) { m_MaskImageNode = NULL; m_Controls->m_MaskImageLabel->setText("-"); return; } - for( std::vector::iterator it = nodes.begin(); - it != nodes.end(); - ++it ) + for (auto node: nodes) { - mitk::DataNode::Pointer node = *it; - if (node.IsNotNull() && dynamic_cast(node->GetData())) { m_MaskImageNode = node; m_Controls->m_MaskImageLabel->setText(node->GetName().c_str()); return; } } } // check for mask and qbi and start tracking thread void QmitkGibbsTrackingView::StartGibbsTracking() { if(m_ThreadIsRunning) { MITK_WARN("QmitkGibbsTrackingView")<<"Thread already running!"; return; } m_GlobalTracker = NULL; if (m_ImageNode.IsNull()) { QMessageBox::information( NULL, "Warning", "Please load and select a qball image before starting image processing."); return; } if (dynamic_cast(m_ImageNode->GetData())) m_QBallImage = dynamic_cast(m_ImageNode->GetData()); else if (dynamic_cast(m_ImageNode->GetData())) m_TensorImage = dynamic_cast(m_ImageNode->GetData()); if (m_QBallImage.IsNull() && m_TensorImage.IsNull()) return; // cast qbi to itk m_TrackingNode = m_ImageNode; m_ItkTensorImage = NULL; m_ItkQBallImage = NULL; m_MaskImage = NULL; if (m_QBallImage.IsNotNull()) { m_ItkQBallImage = ItkQBallImgType::New(); mitk::CastToItkImage(m_QBallImage, m_ItkQBallImage); } else { m_ItkTensorImage = ItkTensorImage::New(); mitk::CastToItkImage(m_TensorImage, m_ItkTensorImage); } // mask image found? // catch exceptions thrown by the itkAccess macros try{ if(m_MaskImageNode.IsNotNull()) { if (dynamic_cast(m_MaskImageNode->GetData())) mitk::CastToItkImage(dynamic_cast(m_MaskImageNode->GetData()), m_MaskImage); } } catch(...){}; // start worker thread m_TrackingThread.start(QThread::LowestPriority); } // generate mitkFiberBundle from tracking filter output void QmitkGibbsTrackingView::GenerateFiberBundle() { if (m_GlobalTracker.IsNull() || (!(m_Controls->m_VisualizationCheckbox->isChecked() || m_Controls->m_VisualizeOnceButton->isChecked()) && m_ThreadIsRunning)) return; if (m_Controls->m_VisualizeOnceButton->isChecked()) m_Controls->m_VisualizeOnceButton->setChecked(false); vtkSmartPointer fiberBundle = m_GlobalTracker->GetFiberBundle(); if ( m_GlobalTracker->GetNumAcceptedFibers()==0 ) return; m_FiberBundle = mitk::FiberBundle::New(fiberBundle); m_FiberBundle->SetReferenceGeometry(dynamic_cast(m_ImageNode->GetData())->GetGeometry()); if (m_FiberBundleNode.IsNotNull()){ - GetDefaultDataStorage()->Remove(m_FiberBundleNode); + GetDataStorage()->Remove(m_FiberBundleNode); m_FiberBundleNode = 0; } m_FiberBundleNode = mitk::DataNode::New(); m_FiberBundleNode->SetData(m_FiberBundle); QString name("FiberBundle_"); name += m_ImageNode->GetName().c_str(); name += "_Gibbs"; m_FiberBundleNode->SetName(name.toStdString()); m_FiberBundleNode->SetVisibility(true); if (!m_OutputFileName.isEmpty() && !m_ThreadIsRunning) { try { mitk::IOUtil::Save(m_FiberBundle.GetPointer(),m_OutputFileName.toStdString()); QMessageBox::information(NULL, "Fiber bundle saved to", m_OutputFileName); } catch (itk::ExceptionObject &ex) { QMessageBox::information(NULL, "Fiber bundle could not be saved", QString("%1\n%2\n%3\n%4\n%5\n%6").arg(ex.GetNameOfClass()).arg(ex.GetFile()).arg(ex.GetLine()).arg(ex.GetLocation()).arg(ex.what()).arg(ex.GetDescription())); } } if(m_ImageNode.IsNull()) GetDataStorage()->Add(m_FiberBundleNode); else GetDataStorage()->Add(m_FiberBundleNode, m_ImageNode); } void QmitkGibbsTrackingView::SetOutputFile() { // SELECT FOLDER DIALOG m_OutputFileName = QFileDialog::getSaveFileName(0, tr("Set file name"), QDir::currentPath()+"/FiberBundle.fib", tr("Fiber Bundle (*.fib)") ); if (m_OutputFileName.isEmpty()) m_Controls->m_OutputFileLabel->setText("N/A"); else m_Controls->m_OutputFileLabel->setText(m_OutputFileName); } // save current tracking paramters as xml file (.gtp) void QmitkGibbsTrackingView::SaveTrackingParameters() { TiXmlDocument documentXML; TiXmlDeclaration* declXML = new TiXmlDeclaration( "1.0", "", "" ); documentXML.LinkEndChild( declXML ); TiXmlElement* mainXML = new TiXmlElement("global_tracking_parameter_file"); mainXML->SetAttribute("file_version", "0.1"); documentXML.LinkEndChild(mainXML); TiXmlElement* paramXML = new TiXmlElement("parameter_set"); paramXML->SetAttribute("iterations", m_Controls->m_IterationsBox->text().toStdString()); paramXML->SetAttribute("particle_length", QString::number((float)m_Controls->m_ParticleLengthSlider->value()/10).toStdString()); paramXML->SetAttribute("particle_width", QString::number((float)m_Controls->m_ParticleWidthSlider->value()/10).toStdString()); paramXML->SetAttribute("particle_weight", QString::number((float)m_Controls->m_ParticleWeightSlider->value()/10000).toStdString()); paramXML->SetAttribute("temp_start", QString::number((float)m_Controls->m_StartTempSlider->value()/100).toStdString()); paramXML->SetAttribute("temp_end", QString::number((float)m_Controls->m_EndTempSlider->value()/10000).toStdString()); paramXML->SetAttribute("inexbalance", QString::number((float)m_Controls->m_InExBalanceSlider->value()/10).toStdString()); paramXML->SetAttribute("fiber_length", QString::number(m_Controls->m_FiberLengthSlider->value()).toStdString()); paramXML->SetAttribute("curvature_threshold", QString::number(m_Controls->m_CurvatureThresholdSlider->value()).toStdString()); mainXML->LinkEndChild(paramXML); QString filename = QFileDialog::getSaveFileName( 0, tr("Save Parameters"), QDir::currentPath()+"/param.gtp", tr("Global Tracking Parameters (*.gtp)") ); if(filename.isEmpty() || filename.isNull()) return; if(!filename.endsWith(".gtp")) filename += ".gtp"; documentXML.SaveFile( filename.toStdString() ); } // load current tracking paramters from xml file (.gtp) void QmitkGibbsTrackingView::LoadTrackingParameters() { QString filename = QFileDialog::getOpenFileName(0, tr("Load Parameters"), QDir::currentPath(), tr("Global Tracking Parameters (*.gtp)") ); if(filename.isEmpty() || filename.isNull()) return; TiXmlDocument doc( filename.toStdString() ); doc.LoadFile(); TiXmlHandle hDoc(&doc); TiXmlElement* pElem; TiXmlHandle hRoot(0); pElem = hDoc.FirstChildElement().Element(); hRoot = TiXmlHandle(pElem); pElem = hRoot.FirstChildElement("parameter_set").Element(); QString iterations(pElem->Attribute("iterations")); m_Controls->m_IterationsBox->setText(iterations); QString particleLength(pElem->Attribute("particle_length")); float pLength = particleLength.toFloat(); QString particleWidth(pElem->Attribute("particle_width")); float pWidth = particleWidth.toFloat(); if (pLength==0) m_Controls->m_ParticleLengthLabel->setText("auto"); else m_Controls->m_ParticleLengthLabel->setText(particleLength+" mm"); if (pWidth==0) m_Controls->m_ParticleWidthLabel->setText("auto"); else m_Controls->m_ParticleWidthLabel->setText(particleWidth+" mm"); m_Controls->m_ParticleWidthSlider->setValue(pWidth*10); m_Controls->m_ParticleLengthSlider->setValue(pLength*10); QString partWeight(pElem->Attribute("particle_weight")); m_Controls->m_ParticleWeightSlider->setValue(partWeight.toFloat()*10000); m_Controls->m_ParticleWeightLabel->setText(partWeight); QString startTemp(pElem->Attribute("temp_start")); m_Controls->m_StartTempSlider->setValue(startTemp.toFloat()*100); m_Controls->m_StartTempLabel->setText(startTemp); QString endTemp(pElem->Attribute("temp_end")); m_Controls->m_EndTempSlider->setValue(endTemp.toFloat()*10000); m_Controls->m_EndTempLabel->setText(endTemp); QString inExBalance(pElem->Attribute("inexbalance")); m_Controls->m_InExBalanceSlider->setValue(inExBalance.toFloat()*10); m_Controls->m_InExBalanceLabel->setText(inExBalance); QString fiberLength(pElem->Attribute("fiber_length")); m_Controls->m_FiberLengthSlider->setValue(fiberLength.toInt()); m_Controls->m_FiberLengthLabel->setText(fiberLength+"mm"); QString curvThres(pElem->Attribute("curvature_threshold")); m_Controls->m_CurvatureThresholdSlider->setValue(curvThres.toInt()); m_Controls->m_CurvatureThresholdLabel->setText(curvThres+"°"); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.h index bddb82499c..cb1163d8d1 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkGibbsTrackingView.h @@ -1,164 +1,163 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkGibbsTrackingView_h #define QmitkGibbsTrackingView_h #include -#include +#include #include "ui_QmitkGibbsTrackingViewControls.h" #include #include #include #include #include #include #include #include #include class QmitkGibbsTrackingView; class QmitkTrackingWorker : public QObject { Q_OBJECT public: QmitkTrackingWorker(QmitkGibbsTrackingView* view); public slots: void run(); private: QmitkGibbsTrackingView* m_View; }; /*! \brief View for global fiber tracking (Gibbs tracking) - - \sa QmitkFunctionality - \ingroup Functionalities */ typedef itk::Image< float, 3 > FloatImageType; namespace itk { template class GibbsTrackingFilter; } -class QmitkGibbsTrackingView : public QmitkFunctionality +class QmitkGibbsTrackingView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: typedef itk::Image ItkFloatImageType; typedef itk::Vector OdfVectorType; typedef itk::Image ItkQBallImgType; typedef itk::Image< itk::DiffusionTensor3D, 3 > ItkTensorImage; typedef itk::GibbsTrackingFilter< ItkQBallImgType > GibbsTrackingFilterType; static const std::string VIEW_ID; QmitkGibbsTrackingView(); virtual ~QmitkGibbsTrackingView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; signals: protected slots: void StartGibbsTracking(); void StopGibbsTracking(); void AfterThread(); ///< update gui etc. after tracking has finished void BeforeThread(); ///< start timer etc. void TimerUpdate(); void SetMask(); void AdvancedSettings(); ///< show/hide advanced tracking options void SaveTrackingParameters(); ///< save tracking parameters to xml file void LoadTrackingParameters(); ///< load tracking parameters from xml file /** update labels if parameters have changed */ void SetParticleWidth(int value); void SetParticleLength(int value); void SetInExBalance(int value); void SetFiberLength(int value); void SetParticleWeight(int value); void SetStartTemp(int value); void SetEndTemp(int value); void SetCurvatureThreshold(int value); void SetRandomSeed(int value); void SetOutputFile(); private: // Visualization & GUI void GenerateFiberBundle(); ///< generate fiber bundle from tracking output and add to datanode void UpdateGUI(); ///< update button activity etc. dpending on current datamanager selection void UpdateTrackingStatus(); ///< update textual status display of the tracking process - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + /// \brief called when DataNode is removed to stop gibbs tracking after node is removed virtual void NodeRemoved(const mitk::DataNode * node) override; void UpdateIteraionsGUI(unsigned long iterations); ///< update iterations label text Ui::QmitkGibbsTrackingViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; /** data objects */ mitk::DataNode::Pointer m_TrackingNode; ///< actual node that is tracked mitk::FiberBundle::Pointer m_FiberBundle; ///< tracking output ItkFloatImageType::Pointer m_MaskImage; ///< used to reduce the algorithms search space. tracking only inside of the mask. mitk::TensorImage::Pointer m_TensorImage; ///< actual image that is tracked mitk::QBallImage::Pointer m_QBallImage; ///< actual image that is tracked ItkQBallImgType::Pointer m_ItkQBallImage; ///< actual image that is tracked ItkTensorImage::Pointer m_ItkTensorImage; ///< actual image that is tracked /** data nodes */ mitk::DataNode::Pointer m_ImageNode; mitk::DataNode::Pointer m_MaskImageNode; mitk::DataNode::Pointer m_FiberBundleNode; /** flags etc. */ bool m_ThreadIsRunning; QTimer* m_TrackingTimer; QTime m_TrackingTime; unsigned long m_ElapsedTime; QString m_OutputFileName; /** global tracker and friends */ itk::SmartPointer m_GlobalTracker; QmitkTrackingWorker m_TrackingWorker; QThread m_TrackingThread; friend class QmitkTrackingWorker; }; #endif // _QMITKGibbsTrackingVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.cpp index 8821b864b6..e54ab3dfb2 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.cpp @@ -1,450 +1,437 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkMLBTView.h" -#include "QmitkStdMultiWidget.h" // Qt #include #include #include #include #include #include #include #include #include #include #include #include #include #define _USE_MATH_DEFINES #include const std::string QmitkMLBTView::VIEW_ID = "org.mitk.views.mlbtview"; using namespace berry; QmitkMLBTView::QmitkMLBTView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) { m_TrackingTimer = std::make_shared(this); m_LastLoadedForestName = "(none)"; m_ForestHandler = new mitk::TrackingHandlerRandomForest<6,100>(); } // Destructor QmitkMLBTView::~QmitkMLBTView() { delete m_ForestHandler; } void QmitkMLBTView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkMLBTViewControls; m_Controls->setupUi( parent ); connect( m_Controls->m_StartTrainingButton, SIGNAL ( clicked() ), this, SLOT( StartTrainingThread() ) ); connect( &m_TrainingWatcher, SIGNAL ( finished() ), this, SLOT( OnTrainingThreadStop() ) ); connect( m_Controls->m_StartTrackingButton, SIGNAL ( clicked() ), this, SLOT( StartTrackingThread() ) ); connect( &m_TrackingWatcher, SIGNAL ( finished() ), this, SLOT( OnTrackingThreadStop() ) ); connect( m_Controls->m_SaveForestButton, SIGNAL ( clicked() ), this, SLOT( SaveForest() ) ); connect( m_Controls->m_LoadForestButton, SIGNAL ( clicked() ), this, SLOT( LoadForest() ) ); connect( m_TrackingTimer.get(), SIGNAL(timeout()), this, SLOT(BuildFibers()) ); connect( m_Controls->m_TimerIntervalBox, SIGNAL(valueChanged(int)), this, SLOT( ChangeTimerInterval(int) )); connect( m_Controls->m_DemoModeBox, SIGNAL(stateChanged(int)), this, SLOT( ToggleDemoMode(int) )); connect( m_Controls->m_PauseTrackingButton, SIGNAL ( clicked() ), this, SLOT( PauseTracking() ) ); connect( m_Controls->m_AbortTrackingButton, SIGNAL ( clicked() ), this, SLOT( AbortTracking() ) ); connect( m_Controls->m_AddTwButton, SIGNAL ( clicked() ), this, SLOT( AddTrainingWidget() ) ); connect( m_Controls->m_RemoveTwButton, SIGNAL ( clicked() ), this, SLOT( RemoveTrainingWidget() ) ); m_Controls->m_TrackingMaskImageBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_TrackingSeedImageBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_TrackingStopImageBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_TrackingRawImageBox->SetDataStorage(this->GetDataStorage()); m_Controls->m_FourTTImageBox->SetDataStorage(this->GetDataStorage()); mitk::NodePredicateIsDWI::Pointer isDiffusionImage = mitk::NodePredicateIsDWI::New(); mitk::TNodePredicateDataType::Pointer isMitkImage = mitk::TNodePredicateDataType::New(); mitk::NodePredicateNot::Pointer noDiffusionImage = mitk::NodePredicateNot::New(isDiffusionImage); mitk::NodePredicateAnd::Pointer finalPredicate = mitk::NodePredicateAnd::New(isMitkImage, noDiffusionImage); m_Controls->m_FourTTImageBox->SetPredicate(finalPredicate); mitk::NodePredicateProperty::Pointer isBinaryPredicate = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); finalPredicate = mitk::NodePredicateAnd::New(finalPredicate, isBinaryPredicate); m_Controls->m_TrackingMaskImageBox->SetPredicate(finalPredicate); m_Controls->m_TrackingSeedImageBox->SetPredicate(finalPredicate); m_Controls->m_TrackingStopImageBox->SetPredicate(finalPredicate); m_Controls->m_TrackingRawImageBox->SetPredicate(isDiffusionImage); m_Controls->m_TrackingMaskImageBox->SetZeroEntryText("--"); m_Controls->m_TrackingSeedImageBox->SetZeroEntryText("--"); m_Controls->m_TrackingStopImageBox->SetZeroEntryText("--"); m_Controls->m_FourTTImageBox->SetZeroEntryText("--"); AddTrainingWidget(); UpdateGui(); } } void QmitkMLBTView::AddTrainingWidget() { std::shared_ptr tw = std::make_shared(); tw->SetDataStorage(this->GetDataStorage()); m_Controls->m_TwFrame->layout()->addWidget(tw.get()); m_TrainingWidgets.push_back(tw); } void QmitkMLBTView::RemoveTrainingWidget() { if(m_TrainingWidgets.size()>1) { m_TrainingWidgets.back().reset(); m_TrainingWidgets.pop_back(); } } void QmitkMLBTView::UpdateGui() { if (m_ForestHandler->IsForestValid()) { std::string label_text="Random forest available: "+m_LastLoadedForestName; m_Controls->statusLabel->setText( QString(label_text.c_str()) ); m_Controls->m_SaveForestButton->setEnabled(true); m_Controls->m_StartTrackingButton->setEnabled(true); } else { m_Controls->statusLabel->setText("Please load or train random forest!"); m_Controls->m_SaveForestButton->setEnabled(false); m_Controls->m_StartTrackingButton->setEnabled(false); } } +void QmitkMLBTView::SetFocus() +{ + m_Controls->toolBox->setFocus(); +} + void QmitkMLBTView::AbortTracking() { if (tracker.IsNotNull()) { tracker->m_AbortTracking = true; } } void QmitkMLBTView::PauseTracking() { if (tracker.IsNotNull()) { tracker->m_PauseTracking = !tracker->m_PauseTracking; } } void QmitkMLBTView::ChangeTimerInterval(int value) { m_TrackingTimer->setInterval(value); } void QmitkMLBTView::ToggleDemoMode(int state) { if (tracker.IsNotNull()) { tracker->SetDemoMode(m_Controls->m_DemoModeBox->isChecked()); tracker->m_Stop = false; } } void QmitkMLBTView::BuildFibers() { if (m_Controls->m_DemoModeBox->isChecked() && tracker.IsNotNull() && tracker->m_BuildFibersFinished) { vtkSmartPointer< vtkPolyData > poly = tracker->GetFiberPolyData(); mitk::FiberBundle::Pointer outFib = mitk::FiberBundle::New(poly); outFib->SetFiberColors(255,255,255); m_TractogramNode->SetData(outFib); m_SamplingPointsNode->SetData(tracker->m_SamplingPointset); m_AlternativePointsNode->SetData(tracker->m_AlternativePointset); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); tracker->m_BuildFibersFinished = false; tracker->m_BuildFibersReady = 0; tracker->m_Stop = false; } } void QmitkMLBTView::LoadForest() { QString filename = QFileDialog::getOpenFileName(0, tr("Load Forest"), QDir::currentPath(), tr("HDF5 random forest file (*.rf)") ); if(filename.isEmpty() || filename.isNull()) return; m_ForestHandler->LoadForest( filename.toStdString() ); QFileInfo fi( filename ); m_LastLoadedForestName = QString( fi.baseName() + "." + fi.completeSuffix() ).toStdString(); UpdateGui(); } void QmitkMLBTView::StartTrackingThread() { m_TractogramNode = mitk::DataNode::New(); m_TractogramNode->SetName("MLBT Result"); //m_TractogramNode->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(20)); m_TractogramNode->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(true)); m_TractogramNode->SetProperty("LineWidth", mitk::IntProperty::New(1)); //m_TractogramNode->SetProperty("color",mitk::ColorProperty::New(0, 1, 1)); this->GetDataStorage()->Add(m_TractogramNode); m_SamplingPointsNode = mitk::DataNode::New(); m_SamplingPointsNode->SetName("SamplingPoints"); m_SamplingPointsNode->SetProperty("pointsize", mitk::FloatProperty::New(0.2)); m_SamplingPointsNode->SetProperty("color", mitk::ColorProperty::New(1,1,1)); mitk::PointSetShapeProperty::Pointer bla = mitk::PointSetShapeProperty::New(); bla->SetValue(8); m_SamplingPointsNode->SetProperty("Pointset.2D.shape", bla); m_SamplingPointsNode->SetProperty("Pointset.2D.distance to plane", mitk::FloatProperty::New(1.5)); m_SamplingPointsNode->SetProperty("point 2D size", mitk::FloatProperty::New(0.1)); m_SamplingPointsNode->SetProperty("Pointset.2D.fill shape", mitk::BoolProperty::New(true)); this->GetDataStorage()->Add(m_SamplingPointsNode); m_AlternativePointsNode = mitk::DataNode::New(); m_AlternativePointsNode->SetName("AlternativePoints"); m_AlternativePointsNode->SetProperty("pointsize", mitk::FloatProperty::New(0.2)); m_AlternativePointsNode->SetProperty("color", mitk::ColorProperty::New(1,0,0)); m_AlternativePointsNode->SetProperty("Pointset.2D.shape", bla); m_AlternativePointsNode->SetProperty("Pointset.2D.distance to plane", mitk::FloatProperty::New(1.5)); m_AlternativePointsNode->SetProperty("point 2D size", mitk::FloatProperty::New(0.1)); m_AlternativePointsNode->SetProperty("Pointset.2D.fill shape", mitk::BoolProperty::New(true)); this->GetDataStorage()->Add(m_AlternativePointsNode); QFuture future = QtConcurrent::run( this, &QmitkMLBTView::StartTracking ); m_TrackingWatcher.setFuture(future); m_TrackingThreadIsRunning = true; m_Controls->m_StartTrackingButton->setEnabled(false); m_TrackingTimer->start(m_Controls->m_TimerIntervalBox->value()); } void QmitkMLBTView::OnTrackingThreadStop() { m_TrackingThreadIsRunning = false; m_Controls->m_StartTrackingButton->setEnabled(true); vtkSmartPointer< vtkPolyData > poly = tracker->GetFiberPolyData(); mitk::FiberBundle::Pointer outFib = mitk::FiberBundle::New(poly); m_TractogramNode->SetData(outFib); m_TractogramNode->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(1)); if (m_Controls->m_DemoModeBox->isChecked()) { m_SamplingPointsNode->SetData(tracker->m_SamplingPointset); m_AlternativePointsNode->SetData(tracker->m_AlternativePointset); } tracker = NULL; m_TrackingTimer->stop(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkMLBTView::StartTracking() { if ( m_Controls->m_TrackingRawImageBox->GetSelectedNode().IsNull() || !m_ForestHandler->IsForestValid()) return; mitk::Image::Pointer dwi = dynamic_cast(m_Controls->m_TrackingRawImageBox->GetSelectedNode()->GetData()); m_ForestHandler->AddDwi(dwi); // int numThread = itk::MultiThreader::GetGlobalDefaultNumberOfThreads(); tracker = TrackerType::New(); tracker->SetDemoMode(m_Controls->m_DemoModeBox->isChecked()); if (m_Controls->m_DemoModeBox->isChecked()) tracker->SetNumberOfThreads(1); if (m_Controls->m_TrackingMaskImageBox->GetSelectedNode().IsNotNull()) { mitk::Image::Pointer mask = dynamic_cast(m_Controls->m_TrackingMaskImageBox->GetSelectedNode()->GetData()); ItkUcharImgType::Pointer itkMask = ItkUcharImgType::New(); mitk::CastToItkImage(mask, itkMask); tracker->SetMaskImage(itkMask); } if (m_Controls->m_TrackingSeedImageBox->GetSelectedNode().IsNotNull()) { mitk::Image::Pointer img = dynamic_cast(m_Controls->m_TrackingSeedImageBox->GetSelectedNode()->GetData()); ItkUcharImgType::Pointer itkImg = ItkUcharImgType::New(); mitk::CastToItkImage(img, itkImg); tracker->SetSeedImage(itkImg); } if (m_Controls->m_TrackingStopImageBox->GetSelectedNode().IsNotNull()) { mitk::Image::Pointer img = dynamic_cast(m_Controls->m_TrackingStopImageBox->GetSelectedNode()->GetData()); ItkUcharImgType::Pointer itkImg = ItkUcharImgType::New(); mitk::CastToItkImage(img, itkImg); tracker->SetStoppingRegions(itkImg); } if (m_Controls->m_FourTTImageBox->GetSelectedNode().IsNotNull()) { mitk::Image::Pointer img = dynamic_cast(m_Controls->m_FourTTImageBox->GetSelectedNode()->GetData()); ItkUcharImgType::Pointer itkImg = ItkUcharImgType::New(); mitk::CastToItkImage(img, itkImg); tracker->SetFourTTImage(itkImg); } tracker->SetSeedsPerVoxel(m_Controls->m_NumberOfSeedsBox->value()); tracker->SetStepSize(m_Controls->m_TrackingStepSizeBox->value()); tracker->SetMinTractLength(m_Controls->m_MinLengthBox->value()); tracker->SetMaxTractLength(m_Controls->m_MaxLengthBox->value()); tracker->SetAposterioriCurvCheck(m_Controls->m_Curvcheck2->isChecked()); tracker->SetNumberOfSamples(m_Controls->m_NumSamplesBox->value()); tracker->SetAvoidStop(m_Controls->m_AvoidStop->isChecked()); tracker->SetTrackingHandler(m_ForestHandler); tracker->SetSamplingDistance(m_Controls->m_SamplingDistanceBox->value()); tracker->SetDeflectionMod(m_Controls->m_DeflectionModBox->value()); tracker->SetRandomSampling(m_Controls->m_RandomSampling->isChecked()); tracker->SetUseStopVotes(m_Controls->m_UseStopVotes->isChecked()); tracker->SetOnlyForwardSamples(m_Controls->m_OnlyForwardSamples->isChecked()); tracker->SetNumPreviousDirections(m_Controls->m_NumPrevDirs->value()); tracker->SetSeedOnlyGm(m_Controls->m_SeedGm->isChecked()); tracker->SetAngularThreshold(45); tracker->Update(); } void QmitkMLBTView::SaveForest() { if (!m_ForestHandler->IsForestValid()) { UpdateGui(); return; } QString filename = QFileDialog::getSaveFileName(0, tr("Save Forest"), QDir::currentPath()+"/forest.rf", tr("HDF5 random forest file (*.rf)") ); if(filename.isEmpty() || filename.isNull()) return; if(!filename.endsWith(".rf")) filename += ".rf"; m_ForestHandler->SaveForest( filename.toStdString() ); } void QmitkMLBTView::StartTrainingThread() { if (!this->IsTrainingInputValid()) { QMessageBox::warning(nullptr, "Training aborted", "Training could not be started. Not all necessary datasets were selected."); return; } QFuture future = QtConcurrent::run( this, &QmitkMLBTView::StartTraining ); m_TrainingWatcher.setFuture(future); m_Controls->m_StartTrainingButton->setEnabled(false); m_Controls->m_SaveForestButton->setEnabled(false); m_Controls->m_LoadForestButton->setEnabled(false); } void QmitkMLBTView::OnTrainingThreadStop() { m_Controls->m_StartTrainingButton->setEnabled(true); m_Controls->m_SaveForestButton->setEnabled(true); m_Controls->m_LoadForestButton->setEnabled(true); UpdateGui(); } void QmitkMLBTView::StartTraining() { std::vector< mitk::Image::Pointer > m_SelectedDiffImages; std::vector< mitk::FiberBundle::Pointer > m_SelectedFB; std::vector< ItkUcharImgType::Pointer > m_MaskImages; std::vector< ItkUcharImgType::Pointer > m_WhiteMatterImages; for (auto w : m_TrainingWidgets) { m_SelectedDiffImages.push_back(dynamic_cast(w->GetImage()->GetData())); m_SelectedFB.push_back(dynamic_cast(w->GetFibers()->GetData())); if (w->GetMask().IsNotNull()) { mitk::Image::Pointer img = dynamic_cast(w->GetMask()->GetData()); ItkUcharImgType::Pointer itkMask = ItkUcharImgType::New(); mitk::CastToItkImage(img, itkMask); m_MaskImages.push_back(itkMask); } else m_MaskImages.push_back(nullptr); if (w->GetWhiteMatter().IsNotNull()) { mitk::Image::Pointer img = dynamic_cast(w->GetWhiteMatter()->GetData()); ItkUcharImgType::Pointer itkMask = ItkUcharImgType::New(); mitk::CastToItkImage(img, itkMask); m_WhiteMatterImages.push_back(itkMask); } else m_WhiteMatterImages.push_back(nullptr); } m_ForestHandler->SetDwis(m_SelectedDiffImages); m_ForestHandler->SetTractograms(m_SelectedFB); m_ForestHandler->SetMaskImages(m_MaskImages); m_ForestHandler->SetWhiteMatterImages(m_WhiteMatterImages); m_ForestHandler->SetNumTrees(m_Controls->m_NumTreesBox->value()); m_ForestHandler->SetMaxTreeDepth(m_Controls->m_MaxDepthBox->value()); m_ForestHandler->SetGrayMatterSamplesPerVoxel(m_Controls->m_GmSamplingBox->value()); m_ForestHandler->SetSampleFraction(m_Controls->m_SampleFractionBox->value()); m_ForestHandler->SetStepSize(m_Controls->m_TrainingStepSizeBox->value()); m_ForestHandler->SetNumPreviousDirections(m_Controls->m_NumPrevDirs->value()); m_ForestHandler->SetBidirectionalFiberSampling(m_Controls->m_BidirectionalSampling->isChecked()); m_ForestHandler->SetZeroDirWmFeatures(m_Controls->m_ZeroDirBox->isChecked()); m_ForestHandler->StartTraining(); } -void QmitkMLBTView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkMLBTView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - -void QmitkMLBTView::Activated() -{ - -} - bool QmitkMLBTView::IsTrainingInputValid(void) const { for (auto widget : m_TrainingWidgets) { if (widget->GetImage().IsNull() || widget->GetFibers().IsNull()) { return false; } } return true; } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.h index d4b3f42e0d..fb30db5304 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkMLBTView.h @@ -1,112 +1,112 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ -#include +#include #include "ui_QmitkMLBTViewControls.h" #ifndef Q_MOC_RUN #include "mitkDataStorage.h" #include "mitkDataStorageSelection.h" #include #include #endif #include #include #include #include #include #include /*! \brief View to perform machine learning based fiber tractography. Includes training of the random forst classifier as well as the actual tractography. */ // Forward Qt class declarations -class QmitkMLBTView : public QmitkFunctionality +class QmitkMLBTView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; typedef itk::Image ItkUcharImgType; typedef itk::StreamlineTrackingFilter TrackerType; QmitkMLBTView(); virtual ~QmitkMLBTView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; - virtual void Activated() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void StartTrackingThread(); void OnTrackingThreadStop(); void StartTrainingThread(); void OnTrainingThreadStop(); void SaveForest(); void LoadForest(); void BuildFibers(); void ChangeTimerInterval(int value); void ToggleDemoMode(int state); void PauseTracking(); void AbortTracking(); void AddTrainingWidget(); void RemoveTrainingWidget(); protected: void StartTracking(); void StartTraining(); void UpdateGui(); Ui::QmitkMLBTViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; mitk::TrackingHandlerRandomForest<6,100>* m_ForestHandler; QFutureWatcher m_TrainingWatcher; QFutureWatcher m_TrackingWatcher; bool m_TrackingThreadIsRunning; TrackerType::Pointer tracker; std::shared_ptr m_TrackingTimer; mitk::DataNode::Pointer m_TractogramNode; mitk::DataNode::Pointer m_SamplingPointsNode; mitk::DataNode::Pointer m_AlternativePointsNode; std::vector< std::shared_ptr > m_TrainingWidgets; private: bool IsTrainingInputValid(void) const; std::string m_LastLoadedForestName; }; diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.cpp index 8edbb0fa2a..58825fba4f 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.cpp @@ -1,288 +1,278 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include #include // Qmitk #include "QmitkStochasticFiberTrackingView.h" -#include "QmitkStdMultiWidget.h" // Qt #include // MITK #include #include #include // VTK #include #include #include #include #include #include const std::string QmitkStochasticFiberTrackingView::VIEW_ID = "org.mitk.views.stochasticfibertracking"; const std::string id_DataManager = "org.mitk.views.datamanager"; using namespace berry; QmitkStochasticFiberTrackingView::QmitkStochasticFiberTrackingView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls( 0 ) - , m_MultiWidget( NULL ) , m_SeedRoi( NULL ) , m_DiffusionImage( NULL ) { } // Destructor QmitkStochasticFiberTrackingView::~QmitkStochasticFiberTrackingView() { } void QmitkStochasticFiberTrackingView::CreateQtPartControl( QWidget *parent ) { if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkStochasticFiberTrackingViewControls; m_Controls->setupUi( parent ); connect( m_Controls->commandLinkButton, SIGNAL(clicked()), this, SLOT(DoFiberTracking()) ); connect( m_Controls->m_SeedsPerVoxelSlider, SIGNAL(valueChanged(int)), this, SLOT(OnSeedsPerVoxelChanged(int)) ); connect( m_Controls->m_MaxCacheSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(OnMaxCacheSizeChanged(int)) ); connect( m_Controls->m_MaxTractLengthSlider, SIGNAL(valueChanged(int)), this, SLOT(OnMaxTractLengthChanged(int)) ); } } +void QmitkStochasticFiberTrackingView::SetFocus() +{ + m_Controls->commandLinkButton->setFocus(); +} + void QmitkStochasticFiberTrackingView::OnSeedsPerVoxelChanged(int value) { m_Controls->m_SeedsPerVoxelLabel->setText(QString("Seeds per Voxel: ")+QString::number(value)); } void QmitkStochasticFiberTrackingView::OnMaxTractLengthChanged(int value) { m_Controls->m_MaxTractLengthLabel->setText(QString("Max. Tract Length: ")+QString::number(value)); } void QmitkStochasticFiberTrackingView::OnMaxCacheSizeChanged(int value) { m_Controls->m_MaxCacheSizeLabel->setText(QString("Max. Cache Size: ")+QString::number(value)+"GB"); } -void QmitkStochasticFiberTrackingView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkStochasticFiberTrackingView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - -void QmitkStochasticFiberTrackingView::OnSelectionChanged( std::vector nodes ) +void QmitkStochasticFiberTrackingView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { m_DiffusionImageNode = NULL; m_DiffusionImage = NULL; m_SeedRoi = NULL; m_Controls->m_DiffusionImageLabel->setText("mandatory"); m_Controls->m_RoiImageLabel->setText("mandatory"); - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; - if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())) ); if ( isDiffusionImage ) { m_DiffusionImageNode = node; m_DiffusionImage = dynamic_cast(node->GetData()); m_Controls->m_DiffusionImageLabel->setText(node->GetName().c_str()); } else { bool isBinary = false; node->GetPropertyValue("binary", isBinary); if (isBinary) { m_SeedRoi = dynamic_cast(node->GetData()); m_Controls->m_RoiImageLabel->setText(node->GetName().c_str()); } } } } if(m_DiffusionImage.IsNotNull() && m_SeedRoi.IsNotNull()) { m_Controls->m_InputData->setTitle("Input Data"); m_Controls->commandLinkButton->setEnabled(true); } else { m_Controls->m_InputData->setTitle("Please Select Input Data"); m_Controls->commandLinkButton->setEnabled(false); } } void QmitkStochasticFiberTrackingView::DoFiberTracking() { typedef itk::VectorImage< short int, 3 > DWIVectorImageType; typedef itk::Image< float, 3 > FloatImageType; typedef itk::Image< unsigned int, 3 > CImageType; typedef itk::StochasticTractographyFilter< DWIVectorImageType, FloatImageType, CImageType > TrackingFilterType; typedef itk::DTITubeSpatialObject<3> DTITubeType; typedef itk::DTITubeSpatialObjectPoint<3> DTITubePointType; typedef itk::SceneSpatialObject<3> SceneSpatialObjectType; /* get Gradients/Direction of dwi */ GradientDirectionContainerType::Pointer Pdir = static_cast( m_DiffusionImage->GetProperty(mitk::DiffusionPropertyHelper::GRADIENTCONTAINERPROPERTYNAME.c_str()).GetPointer() )->GetGradientDirectionsContainer(); /* bValueContainer, Container includes b-values according to corresponding gradient-direction*/ TrackingFilterType::bValueContainerType::Pointer vecCont = TrackingFilterType::bValueContainerType::New(); /* for each gradient set b-Value; for 0-gradient set b-value eq. 0 */ for ( int i=0; i<(int)Pdir->size(); ++i) { vnl_vector_fixed valsGrad = Pdir->at(i); if (valsGrad.get(0) == 0 && valsGrad.get(1) == 0 && valsGrad.get(2) == 0) { //set 0-Gradient to bValue 0 vecCont->InsertElement(i,0); }else{ vecCont->InsertElement(i, static_cast(m_DiffusionImage->GetProperty(mitk::DiffusionPropertyHelper::REFERENCEBVALUEPROPERTYNAME.c_str()).GetPointer() )->GetValue()); } } /* define measurement frame (identity-matrix 3x3) */ TrackingFilterType::MeasurementFrameType measurement_frame = static_cast(m_DiffusionImage->GetProperty(mitk::DiffusionPropertyHelper::MEASUREMENTFRAMEPROPERTYNAME.c_str()).GetPointer() )->GetMeasurementFrame(); /* generate white matterImage (dummy?)*/ ITKDiffusionImageType::Pointer itkVectorImagePointer = ITKDiffusionImageType::New(); mitk::CastToItkImage(m_DiffusionImage, itkVectorImagePointer); FloatImageType::Pointer wmImage = FloatImageType::New(); wmImage->SetSpacing( itkVectorImagePointer->GetSpacing() ); wmImage->SetOrigin( itkVectorImagePointer->GetOrigin() ); wmImage->SetDirection( itkVectorImagePointer->GetDirection() ); wmImage->SetLargestPossibleRegion( itkVectorImagePointer->GetLargestPossibleRegion() ); wmImage->SetBufferedRegion( wmImage->GetLargestPossibleRegion() ); wmImage->SetRequestedRegion( wmImage->GetLargestPossibleRegion() ); wmImage->Allocate(); wmImage->FillBuffer(1); /* init TractographyFilter */ TrackingFilterType::Pointer trackingFilter = TrackingFilterType::New(); trackingFilter->SetPrimaryInput(itkVectorImagePointer.GetPointer()); trackingFilter->SetbValues(vecCont); trackingFilter->SetGradients(Pdir); trackingFilter->SetMeasurementFrame(measurement_frame); trackingFilter->SetWhiteMatterProbabilityImage(wmImage); trackingFilter->SetTotalTracts(m_Controls->m_SeedsPerVoxelSlider->value()); trackingFilter->SetMaxLikelihoodCacheSize(m_Controls->m_MaxCacheSizeSlider->value()*1000); trackingFilter->SetMaxTractLength(m_Controls->m_MaxTractLengthSlider->value()); BinaryImageType::Pointer mask = BinaryImageType::New(); mitk::CastToItkImage(m_SeedRoi, mask); vtkSmartPointer vPoints = vtkSmartPointer::New(); vtkSmartPointer vCellArray = vtkSmartPointer::New(); itk::ImageRegionConstIterator< BinaryImageType > it(mask, mask->GetRequestedRegion()); it.GoToBegin(); mitk::BaseGeometry* geom = m_DiffusionImage->GetGeometry(); while(!it.IsAtEnd()) { itk::ImageConstIterator::PixelType tmpPxValue = it.Get(); if(tmpPxValue != 0){ mitk::Point3D point; itk::ImageRegionConstIterator< BinaryImageType >::IndexType seedIdx = it.GetIndex(); trackingFilter->SetSeedIndex(seedIdx); trackingFilter->Update(); /* get results from Filter */ /* write each single tract into member container */ TrackingFilterType::TractContainerType::Pointer container_tmp = trackingFilter->GetOutputTractContainer(); TrackingFilterType::TractContainerType::Iterator elIt = container_tmp->Begin(); TrackingFilterType::TractContainerType::Iterator end = container_tmp->End(); bool addTract = true; while( elIt != end ){ TrackingFilterType::TractContainerType::Element tract = elIt.Value(); TrackingFilterType::TractContainerType::Element::ObjectType::VertexListType::ConstPointer vertexlist = tract->GetVertexList(); vtkSmartPointer vPolyLine = vtkSmartPointer::New(); for( int j=0; j<(int)vertexlist->Size(); j++) { TrackingFilterType::TractContainerType::Element::ObjectType::VertexListType::Element vertex = vertexlist->GetElement(j); mitk::Point3D index; index[0] = (float)vertex[0]; index[1] = (float)vertex[1]; index[2] = (float)vertex[2]; if (geom->IsIndexInside(index)) { geom->IndexToWorld(index, point); vtkIdType id = vPoints->InsertNextPoint(point.GetDataPointer()); vPolyLine->GetPointIds()->InsertNextId(id); } else { addTract = false; break; } } if (addTract) vCellArray->InsertNextCell(vPolyLine); ++elIt; } } ++it; } vtkSmartPointer fiberPolyData = vtkSmartPointer::New(); fiberPolyData->SetPoints(vPoints); fiberPolyData->SetLines(vCellArray); mitk::FiberBundle::Pointer fib = mitk::FiberBundle::New(fiberPolyData); fib->SetReferenceGeometry(dynamic_cast(m_DiffusionImageNode->GetData())->GetGeometry()); mitk::DataNode::Pointer fbNode = mitk::DataNode::New(); fbNode->SetData(fib); QString name("FiberBundle_"); name += m_DiffusionImageNode->GetName().c_str(); name += "_Probabilistic"; fbNode->SetName(name.toStdString()); fbNode->SetVisibility(true); GetDataStorage()->Add(fbNode, m_DiffusionImageNode); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.h index b27fac2d7f..8b22ccdfa6 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStochasticFiberTrackingView.h @@ -1,89 +1,90 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkStochasticFiberTrackingView_h #define QmitkStochasticFiberTrackingView_h -#include +#include #include "ui_QmitkStochasticFiberTrackingViewControls.h" #include #include #include #include #include #include #include #include /*! \brief View for probabilistic streamline fiber tracking -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkStochasticFiberTrackingView : public QmitkFunctionality +class QmitkStochasticFiberTrackingView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: typedef short DiffusionPixelType; typedef mitk::DiffusionPropertyHelper::GradientDirectionType GradientDirectionType; typedef mitk::DiffusionPropertyHelper::GradientDirectionsContainerType GradientDirectionContainerType; typedef mitk::DiffusionPropertyHelper::BValueMapType BValueMapType; typedef itk::VectorImage< DiffusionPixelType, 3 > ITKDiffusionImageType; typedef itk::Image< unsigned char, 3 > BinaryImageType; static const std::string VIEW_ID; QmitkStochasticFiberTrackingView(); virtual ~QmitkStochasticFiberTrackingView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void DoFiberTracking(); ///< start fiber tracking protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + Ui::QmitkStochasticFiberTrackingViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; protected slots: /** update labels if parameters have changed */ void OnSeedsPerVoxelChanged(int value); void OnMaxTractLengthChanged(int value); void OnMaxCacheSizeChanged(int value); private: mitk::Image::Pointer m_SeedRoi; ///< binary image defining seed voxels for tracking process mitk::Image::Pointer m_DiffusionImage; ///< input image mitk::DataNode::Pointer m_DiffusionImageNode; ///< data node containing input image }; #endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStreamlineTrackingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStreamlineTrackingView.h index 721bef797c..589f6e68fc 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStreamlineTrackingView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.tractography/src/internal/QmitkStreamlineTrackingView.h @@ -1,88 +1,88 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkStreamlineTrackingView_h #define QmitkStreamlineTrackingView_h -#include +#include #include "ui_QmitkStreamlineTrackingViewControls.h" #include #include #include #include #include #include #include #include /*! \brief View for tensor based deterministic streamline fiber tracking. -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkStreamlineTrackingView : public QmitkFunctionality +class QmitkStreamlineTrackingView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; typedef itk::Image< unsigned char, 3 > ItkUCharImageType; typedef itk::Image< float, 3 > ItkFloatImageType; QmitkStreamlineTrackingView(); virtual ~QmitkStreamlineTrackingView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void DoFiberTracking(); ///< start fiber tracking protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + Ui::QmitkStreamlineTrackingViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; protected slots: /** update labels if parameters have changed */ void OnSeedsPerVoxelChanged(int value); void OnMinTractLengthChanged(int value); void OnfChanged(int value); void OngChanged(int value); private: std::vector< mitk::DataNode::Pointer > m_InputImageNodes; ///< input images std::vector< mitk::Image::Pointer > m_InputImages; ///< input image datanode }; #endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.diffusionimaging/manifest_headers.cmake index 5b31ce21fb..9fa658aee6 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Diffusion Imaging") set(Plugin-Version "0.1") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy org.mitk.gui.qt.common) +set(Require-Plugin org.mitk.gui.qt.common org.mitk.gui.qt.common) diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.cpp index cd2dad1a5e..ae5a977d09 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.cpp @@ -1,1214 +1,1188 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkControlVisualizationPropertiesView.h" #include "mitkNodePredicateDataType.h" #include "mitkDataNodeObject.h" #include "mitkOdfNormalizationMethodProperty.h" #include "mitkOdfScaleByProperty.h" #include "mitkResliceMethodProperty.h" #include "mitkRenderingManager.h" #include "mitkTbssImage.h" #include "mitkPlanarFigure.h" #include "mitkFiberBundle.h" #include "QmitkDataStorageComboBox.h" -#include "QmitkStdMultiWidget.h" #include "mitkPlanarFigureInteractor.h" #include #include #include #include #include #include "usModuleRegistry.h" +#include #include "mitkPlaneGeometry.h" +#include #include "berryIWorkbenchWindow.h" #include "berryIWorkbenchPage.h" #include "berryISelectionService.h" #include "berryConstants.h" #include "berryPlatformUI.h" #include "itkRGBAPixel.h" #include #include "qwidgetaction.h" #include "qcolordialog.h" #include #include #include #define ROUND(a) ((a)>0 ? (int)((a)+0.5) : -(int)(0.5-(a))) const std::string QmitkControlVisualizationPropertiesView::VIEW_ID = "org.mitk.views.controlvisualizationpropertiesview"; using namespace berry; QmitkControlVisualizationPropertiesView::QmitkControlVisualizationPropertiesView() - : QmitkFunctionality(), + : QmitkAbstractView(), m_Controls(NULL), - m_MultiWidget(NULL), m_NodeUsedForOdfVisualization(NULL), m_IconTexOFF(new QIcon(":/QmitkDiffusionImaging/texIntOFFIcon.png")), m_IconTexON(new QIcon(":/QmitkDiffusionImaging/texIntONIcon.png")), m_IconGlyOFF_T(new QIcon(":/QmitkDiffusionImaging/glyphsoff_T.png")), m_IconGlyON_T(new QIcon(":/QmitkDiffusionImaging/glyphson_T.png")), m_IconGlyOFF_C(new QIcon(":/QmitkDiffusionImaging/glyphsoff_C.png")), m_IconGlyON_C(new QIcon(":/QmitkDiffusionImaging/glyphson_C.png")), m_IconGlyOFF_S(new QIcon(":/QmitkDiffusionImaging/glyphsoff_S.png")), m_IconGlyON_S(new QIcon(":/QmitkDiffusionImaging/glyphson_S.png")), m_CurrentSelection(0), m_CurrentPickingNode(0), m_GlyIsOn_S(false), m_GlyIsOn_C(false), m_GlyIsOn_T(false), m_FiberBundleObserverTag(0), m_FiberBundleObserveOpacityTag(0), m_Color(NULL) { currentThickSlicesMode = 1; m_MyMenu = NULL; int numThread = itk::MultiThreader::GetGlobalMaximumNumberOfThreads(); if (numThread > 12) numThread = 12; itk::MultiThreader::SetGlobalDefaultNumberOfThreads(numThread); } QmitkControlVisualizationPropertiesView::~QmitkControlVisualizationPropertiesView() { this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->RemovePostSelectionListener(/*"org.mitk.views.datamanager",*/ m_SelListener.data()); } void QmitkControlVisualizationPropertiesView::OnThickSlicesModeSelected( QAction* action ) { currentThickSlicesMode = action->data().toInt(); switch( currentThickSlicesMode ) { case 0: // toInt() returns 0 'otherwise'. { return; // dummy code/todo: implement stuff. break; } case 1: { this->m_Controls->m_TSMenu->setText("MIP"); break; } case 2: { this->m_Controls->m_TSMenu->setText("SUM"); break; } case 3: { this->m_Controls->m_TSMenu->setText("WEIGH"); break; } default: { return; // dummy code/todo: implement stuff. break; } } - if( this->m_MultiWidget ) + if (auto renderWindowPart = this->GetRenderWindowPart(OPEN)) { - mitk::DataNode* n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane1(); - if(n) { n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); } + /// TODO There is no way to access the individual crosshair planes through the render window part API. + /// There could be a new 'mitk::DataNode* mitk::ILinkedRenderWindowPart::GetSlicingPlane(const std::string& name) const' + /// function for this purpose. For the time being, I comment out the lines below, but they are valid + /// and they have to be re-enabled after the crosshair planes can be accessed again. - n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane2(); - if(n) { n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); } +// mitk::DataNode* n; +// n = renderWindowPart->GetSlicingPlane("axial"); +// if (n) { n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); } - n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane3(); - if(n) { n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); } +// n = renderWindowPart->GetSlicingPlane("sagittal"); +// if (n) { n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); } +// n = renderWindowPart->GetSlicingPlane("coronal"); +// if (n) { n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); } - mitk::BaseRenderer::Pointer renderer = nullptr; - renderer = this->GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer(); - if(renderer.IsNotNull()) { renderer->SendUpdateSlice(); } - renderer = nullptr; - renderer = this->GetActiveStdMultiWidget()->GetRenderWindow2()->GetRenderer(); - if(renderer.IsNotNull()) { renderer->SendUpdateSlice(); } + mitk::BaseRenderer::Pointer renderer; + renderer = renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer(); + if (renderer.IsNotNull()) { renderer->SendUpdateSlice(); } - renderer = nullptr; - renderer = this->GetActiveStdMultiWidget()->GetRenderWindow3()->GetRenderer(); - if(renderer.IsNotNull()) { renderer->SendUpdateSlice(); } + renderer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer(); + if (renderer.IsNotNull()) { renderer->SendUpdateSlice(); } + + renderer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer(); + if (renderer.IsNotNull()) { renderer->SendUpdateSlice(); } renderer->GetRenderingManager()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::OnTSNumChanged( int num ) { - if( this->m_MultiWidget ) + if (auto renderWindowPart = this->GetRenderWindowPart(OPEN)) { - if( num==0 ) - { - mitk::DataNode* n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane1(); - if(n) - { - n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( 0 ) ); - n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); - n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( false ) ); - } - - n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane2(); - if(n) - { - n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( 0 ) ); - n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); - n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( false ) ); - } - n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane3(); - if(n) - { - n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( 0 ) ); - n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); - n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( false ) ); - } - } - else - { - mitk::DataNode* n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane1(); - if(n) - { - n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); - n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); - n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( (num>0) ) ); - } - - n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane2(); - if(n) - { - n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); - n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); - n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( (num>0) ) ); - } - - n = nullptr; - n = this->m_MultiWidget->GetWidgetPlane3(); - if(n) - { - n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); - n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); - n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( (num>0) ) ); - } - } + /// TODO There is no way to access the individual crosshair planes through the render window part API. + /// There could be a new 'mitk::DataNode* mitk::ILinkedRenderWindowPart::GetSlicingPlane(const std::string& name) const' + /// function for this purpose. For the time being, I comment out the lines below, but they are valid + /// and they have to be re-enabled after the crosshair planes can be accessed again. + +// if(num==0) +// { +// mitk::DataNode* n; +// n = renderWindowPart->GetSlicingPlane("axial"); +// if(n) n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( 0 ) ); +// if(n) n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); +// if(n) n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( false ) ); +// +// n = renderWindowPart->GetSlicingPlane("sagittal"); +// if(n) n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( 0 ) ); +// if(n) n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); +// if(n) n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( false ) ); +// +// n = renderWindowPart->GetSlicingPlane("coronal"); +// if(n) n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( 0 ) ); +// if(n) n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); +// if(n) n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( false ) ); +// } +// else +// { +// mitk::DataNode* n; +// n = renderWindowPart->GetSlicingPlane("axial"); +// if(n) n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); +// if(n) n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); +// if(n) n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( (num>0) ) ); +// +// n = renderWindowPart->GetSlicingPlane("sagittal"); +// if(n) n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); +// if(n) n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); +// if(n) n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( (num>0) ) ); +// +// n = renderWindowPart->GetSlicingPlane("coronal"); +// if(n) n->SetProperty( "reslice.thickslices", mitk::ResliceMethodProperty::New( currentThickSlicesMode ) ); +// if(n) n->SetProperty( "reslice.thickslices.num", mitk::IntProperty::New( num ) ); +// if(n) n->SetProperty( "reslice.thickslices.showarea", mitk::BoolProperty::New( (num>0) ) ); +// } m_TSLabel->setText(QString::number( num*2 + 1 )); - mitk::BaseRenderer::Pointer renderer = nullptr; - renderer = this->GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer(); + mitk::BaseRenderer::Pointer renderer; + renderer = renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer(); if(renderer.IsNotNull()) { renderer->SendUpdateSlice(); } renderer = nullptr; - renderer = this->GetActiveStdMultiWidget()->GetRenderWindow2()->GetRenderer(); + renderer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer(); if(renderer.IsNotNull()) { renderer->SendUpdateSlice(); } renderer = nullptr; - renderer = this->GetActiveStdMultiWidget()->GetRenderWindow3()->GetRenderer(); + renderer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer(); if(renderer.IsNotNull()) { renderer->SendUpdateSlice(); } renderer->GetRenderingManager()->RequestUpdateAll(mitk::RenderingManager::REQUEST_UPDATE_2DWINDOWS); } } void QmitkControlVisualizationPropertiesView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkControlVisualizationPropertiesViewControls; m_Controls->setupUi(parent); this->CreateConnections(); // hide warning (ODFs in rotated planes) m_Controls->m_lblRotatedPlanesWarning->hide(); m_MyMenu = new QMenu(parent); m_Controls->m_TSMenu->setMenu( m_MyMenu ); QIcon iconFiberFade(":/QmitkDiffusionImaging/MapperEfx2D.png"); m_Controls->m_FiberFading2D->setIcon(iconFiberFade); #ifndef DIFFUSION_IMAGING_EXTENDED int size = m_Controls->m_AdditionalScaling->count(); for(int t=0; tm_AdditionalScaling->itemText(t).toStdString() == "Scale by ASR") { m_Controls->m_AdditionalScaling->removeItem(t); } } #endif m_Controls->m_ScalingFrame->setVisible(false); m_Controls->m_NormalizationFrame->setVisible(false); } } - -void QmitkControlVisualizationPropertiesView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkControlVisualizationPropertiesView::SetFocus() { - m_MultiWidget = &stdMultiWidget; + m_Controls->m_TSMenu->setFocus(); } void QmitkControlVisualizationPropertiesView::SliceRotation(const itk::EventObject&) { // test if plane rotated if( m_GlyIsOn_T || m_GlyIsOn_C || m_GlyIsOn_S ) { if( this->IsPlaneRotated() ) { // show label m_Controls->m_lblRotatedPlanesWarning->show(); } else { //hide label m_Controls->m_lblRotatedPlanesWarning->hide(); } } } -void QmitkControlVisualizationPropertiesView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - - void QmitkControlVisualizationPropertiesView::NodeRemoved(const mitk::DataNode* /*node*/) { } #include void QmitkControlVisualizationPropertiesView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_VisibleOdfsON_T), SIGNAL(clicked()), this, SLOT(VisibleOdfsON_T()) ); connect( (QObject*)(m_Controls->m_VisibleOdfsON_S), SIGNAL(clicked()), this, SLOT(VisibleOdfsON_S()) ); connect( (QObject*)(m_Controls->m_VisibleOdfsON_C), SIGNAL(clicked()), this, SLOT(VisibleOdfsON_C()) ); connect( (QObject*)(m_Controls->m_ShowMaxNumber), SIGNAL(editingFinished()), this, SLOT(ShowMaxNumberChanged()) ); connect( (QObject*)(m_Controls->m_NormalizationDropdown), SIGNAL(currentIndexChanged(int)), this, SLOT(NormalizationDropdownChanged(int)) ); connect( (QObject*)(m_Controls->m_ScalingFactor), SIGNAL(valueChanged(double)), this, SLOT(ScalingFactorChanged(double)) ); connect( (QObject*)(m_Controls->m_AdditionalScaling), SIGNAL(currentIndexChanged(int)), this, SLOT(AdditionalScaling(int)) ); connect( (QObject*)(m_Controls->m_ScalingCheckbox), SIGNAL(clicked()), this, SLOT(ScalingCheckbox()) ); connect((QObject*) m_Controls->m_ResetColoring, SIGNAL(clicked()), (QObject*) this, SLOT(BundleRepresentationResetColoring())); connect((QObject*) m_Controls->m_FiberFading2D, SIGNAL(clicked()), (QObject*) this, SLOT( Fiber2DfadingEFX() ) ); connect((QObject*) m_Controls->m_FiberThicknessSlider, SIGNAL(sliderReleased()), (QObject*) this, SLOT( FiberSlicingThickness2D() ) ); connect((QObject*) m_Controls->m_FiberThicknessSlider, SIGNAL(valueChanged(int)), (QObject*) this, SLOT( FiberSlicingUpdateLabel(int) )); connect((QObject*) m_Controls->m_Crosshair, SIGNAL(clicked()), (QObject*) this, SLOT(SetInteractor())); connect((QObject*) m_Controls->m_LineWidth, SIGNAL(editingFinished()), (QObject*) this, SLOT(LineWidthChanged())); connect((QObject*) m_Controls->m_TubeWidth, SIGNAL(editingFinished()), (QObject*) this, SLOT(TubeRadiusChanged())); connect( (QObject*) m_Controls->m_EllipsoidViewRadioButton, SIGNAL(toggled(bool)), (QObject*) this, SLOT(OnTensorViewChanged() ) ); connect( (QObject*) m_Controls->m_colouriseRainbowRadioButton, SIGNAL(toggled(bool)), (QObject*) this, SLOT(OnColourisationModeChanged() ) ); connect( (QObject*) m_Controls->m_randomModeRadioButton, SIGNAL(toggled(bool)), (QObject*) this, SLOT(OnRandomModeChanged() ) ); } } -void QmitkControlVisualizationPropertiesView::Activated() -{ -} - - -void QmitkControlVisualizationPropertiesView::Deactivated() -{ -} - - // set diffusion image channel to b0 volume void QmitkControlVisualizationPropertiesView::NodeAdded(const mitk::DataNode *node) { mitk::DataNode* notConst = const_cast(node); bool isDiffusionImage( mitk::DiffusionPropertyHelper::IsDiffusionWeightedImage( dynamic_cast(node->GetData())) ); if (isDiffusionImage) { mitk::Image::Pointer dimg = dynamic_cast(notConst->GetData()); // if there is no b0 image in the dataset, the GetB0Indices() returns a vector of size 0 // and hence we cannot set the Property directly to .front() int displayChannelPropertyValue = 0; mitk::BValueMapProperty* bmapproperty = static_cast (dimg->GetProperty(mitk::DiffusionPropertyHelper::BVALUEMAPPROPERTYNAME.c_str()).GetPointer() ); mitk::DiffusionPropertyHelper::BValueMapType map = bmapproperty->GetBValueMap(); if( map[0].size() > 0) { displayChannelPropertyValue = map[0].front(); } notConst->SetIntProperty("DisplayChannel", displayChannelPropertyValue ); } } /* OnSelectionChanged is registered to SelectionService, therefore no need to implement SelectionService Listener explicitly */ -void QmitkControlVisualizationPropertiesView::OnSelectionChanged( std::vector nodes ) +void QmitkControlVisualizationPropertiesView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { m_Controls->m_BundleControlsFrame->setVisible(false); m_Controls->m_ImageControlsFrame->setVisible(false); if (nodes.size()>1) // only do stuff if one node is selected return; m_Controls->m_NumberGlyphsFrame->setVisible(false); m_Controls->m_GlyphFrame->setVisible(false); m_Controls->m_TSMenu->setVisible(false); m_SelectedNode = NULL; int numOdfImages = 0; - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (mitk::DataNode::Pointer node: nodes) { - mitk::DataNode::Pointer node = *it; if(node.IsNull()) continue; mitk::BaseData* nodeData = node->GetData(); if(nodeData == NULL) continue; m_SelectedNode = node; if (dynamic_cast(nodeData)) { // handle fiber bundle property observers if (m_Color.IsNotNull()) { m_Color->RemoveObserver(m_FiberBundleObserverTag); } itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); command->SetCallbackFunction( this, &QmitkControlVisualizationPropertiesView::SetFiberBundleCustomColor ); m_Color = dynamic_cast(node->GetProperty("color", NULL)); if (m_Color.IsNotNull()) m_FiberBundleObserverTag = m_Color->AddObserver( itk::ModifiedEvent(), command ); if (m_Opacity.IsNotNull()) { m_Opacity->RemoveObserver(m_FiberBundleObserveOpacityTag); } itk::ReceptorMemberCommand::Pointer command2 = itk::ReceptorMemberCommand::New(); command2->SetCallbackFunction( this, &QmitkControlVisualizationPropertiesView::SetFiberBundleOpacity ); m_Opacity = dynamic_cast(node->GetProperty("opacity", NULL)); if (m_Opacity.IsNotNull()) { m_FiberBundleObserveOpacityTag = m_Opacity->AddObserver( itk::ModifiedEvent(), command2 ); } m_Controls->m_BundleControlsFrame->setVisible(true); if(m_CurrentPickingNode != 0 && node.GetPointer() != m_CurrentPickingNode) { m_Controls->m_Crosshair->setEnabled(false); } else { m_Controls->m_Crosshair->setEnabled(true); } int width; node->GetIntProperty("shape.linewidth", width); m_Controls->m_LineWidth->setValue(width); float radius; node->GetFloatProperty("shape.tuberadius", radius); m_Controls->m_TubeWidth->setValue(radius); float range; node->GetFloatProperty("Fiber2DSliceThickness",range); mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); mitk::BaseGeometry::Pointer geo = fib->GetGeometry(); mitk::ScalarType max = geo->GetExtentInMM(0); max = std::max(max, geo->GetExtentInMM(1)); max = std::max(max, geo->GetExtentInMM(2)); m_Controls->m_FiberThicknessSlider->setMaximum(max * 10); m_Controls->m_FiberThicknessSlider->setValue(range * 10); } else if(dynamic_cast(nodeData) || dynamic_cast(nodeData)) { m_Controls->m_ImageControlsFrame->setVisible(true); m_Controls->m_NumberGlyphsFrame->setVisible(true); m_Controls->m_GlyphFrame->setVisible(true); m_Controls->m_NormalizationFrame->setVisible(true); if(m_NodeUsedForOdfVisualization.IsNotNull()) { m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_S", false); m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_C", false); m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_T", false); } m_NodeUsedForOdfVisualization = node; m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_S", m_GlyIsOn_S); m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_C", m_GlyIsOn_C); m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_T", m_GlyIsOn_T); int val; node->GetIntProperty("ShowMaxNumber", val); m_Controls->m_ShowMaxNumber->setValue(val); m_Controls->m_NormalizationDropdown ->setCurrentIndex(dynamic_cast(node->GetProperty("Normalization")) ->GetValueAsId()); float fval; node->GetFloatProperty("Scaling",fval); m_Controls->m_ScalingFactor->setValue(fval); m_Controls->m_AdditionalScaling ->setCurrentIndex(dynamic_cast(node->GetProperty("ScaleBy"))->GetValueAsId()); bool switchTensorViewValue = false; node->GetBoolProperty( "DiffusionCore.Rendering.OdfVtkMapper.SwitchTensorView", switchTensorViewValue ); if( dynamic_cast(nodeData) ) { m_Controls-> m_EllipsoidViewRadioButton-> setEnabled( true ); m_Controls-> m_EllipsoidViewRadioButton-> setChecked( switchTensorViewValue ); } else { m_Controls-> m_EllipsoidViewRadioButton-> setEnabled( false ); m_Controls-> m_EllipsoidViewRadioButton-> setChecked( false ); } bool colourisationModeBit = false; node-> GetBoolProperty( "DiffusionCore.Rendering.OdfVtkMapper.ColourisationModeBit", colourisationModeBit ); m_Controls-> m_colouriseSimpleRadioButton-> setChecked( colourisationModeBit ); bool randomModeBit = false; node-> GetBoolProperty( "DiffusionCore.Rendering.OdfVtkMapper.RandomModeBit", randomModeBit ); m_Controls-> m_randomModeRadioButton-> setChecked( randomModeBit ); numOdfImages++; } else if(dynamic_cast(nodeData)) { PlanarFigureFocus(); } else if( dynamic_cast(nodeData) ) { m_Controls->m_ImageControlsFrame->setVisible(true); m_Controls->m_TSMenu->setVisible(true); } } if( nodes.empty() ) { return; } mitk::DataNode::Pointer node = nodes.at(0); if( node.IsNull() ) { return; } QMenu *myMenu = m_MyMenu; myMenu->clear(); QActionGroup* thickSlicesActionGroup = new QActionGroup(myMenu); thickSlicesActionGroup->setExclusive(true); int currentTSMode = 0; { mitk::ResliceMethodProperty::Pointer m = dynamic_cast(node->GetProperty( "reslice.thickslices" )); if( m.IsNotNull() ) currentTSMode = m->GetValueAsId(); } int maxTS = 30; - for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) + for (auto node: nodes) { - mitk::Image* image = dynamic_cast((*it)->GetData()); + mitk::Image* image = dynamic_cast(node->GetData()); if (image) { int size = std::max(image->GetDimension(0), std::max(image->GetDimension(1), image->GetDimension(2))); if (size>maxTS) { maxTS=size; } } } maxTS /= 2; int currentNum = 0; { mitk::IntProperty::Pointer m = dynamic_cast(node->GetProperty( "reslice.thickslices.num" )); if( m.IsNotNull() ) { currentNum = m->GetValue(); if(currentNum < 0) { currentNum = 0; } if(currentNum > maxTS) { currentNum = maxTS; } } } if(currentTSMode==0) { currentNum=0; } QSlider *m_TSSlider = new QSlider(myMenu); m_TSSlider->setMinimum(0); m_TSSlider->setMaximum(maxTS-1); m_TSSlider->setValue(currentNum); m_TSSlider->setOrientation(Qt::Horizontal); connect( m_TSSlider, SIGNAL( valueChanged(int) ), this, SLOT( OnTSNumChanged(int) ) ); QHBoxLayout* _TSLayout = new QHBoxLayout; _TSLayout->setContentsMargins(4,4,4,4); _TSLayout->addWidget(m_TSSlider); _TSLayout->addWidget(m_TSLabel=new QLabel(QString::number(currentNum*2+1),myMenu)); QWidget* _TSWidget = new QWidget; _TSWidget->setLayout(_TSLayout); QActionGroup* thickSliceModeActionGroup = new QActionGroup(myMenu); thickSliceModeActionGroup->setExclusive(true); QWidgetAction *m_TSSliderAction = new QWidgetAction(myMenu); m_TSSliderAction->setDefaultWidget(_TSWidget); myMenu->addAction(m_TSSliderAction); QAction* mipThickSlicesAction = new QAction(myMenu); mipThickSlicesAction->setActionGroup(thickSliceModeActionGroup); mipThickSlicesAction->setText("MIP (max. intensity proj.)"); mipThickSlicesAction->setCheckable(true); mipThickSlicesAction->setChecked(currentThickSlicesMode==1); mipThickSlicesAction->setData(1); myMenu->addAction( mipThickSlicesAction ); QAction* sumThickSlicesAction = new QAction(myMenu); sumThickSlicesAction->setActionGroup(thickSliceModeActionGroup); sumThickSlicesAction->setText("SUM (sum intensity proj.)"); sumThickSlicesAction->setCheckable(true); sumThickSlicesAction->setChecked(currentThickSlicesMode==2); sumThickSlicesAction->setData(2); myMenu->addAction( sumThickSlicesAction ); QAction* weightedThickSlicesAction = new QAction(myMenu); weightedThickSlicesAction->setActionGroup(thickSliceModeActionGroup); weightedThickSlicesAction->setText("WEIGHTED (gaussian proj.)"); weightedThickSlicesAction->setCheckable(true); weightedThickSlicesAction->setChecked(currentThickSlicesMode==3); weightedThickSlicesAction->setData(3); myMenu->addAction( weightedThickSlicesAction ); connect( thickSliceModeActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(OnThickSlicesModeSelected(QAction*)) ); } void QmitkControlVisualizationPropertiesView::VisibleOdfsON_S() { m_GlyIsOn_S = m_Controls->m_VisibleOdfsON_S->isChecked(); if (m_NodeUsedForOdfVisualization.IsNull()) { MITK_WARN << "ODF visualization activated but m_NodeUsedForOdfVisualization is NULL"; return; } m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_S", m_GlyIsOn_S); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkControlVisualizationPropertiesView::VisibleOdfsON_T() { m_GlyIsOn_T = m_Controls->m_VisibleOdfsON_T->isChecked(); if (m_NodeUsedForOdfVisualization.IsNull()) { MITK_WARN << "ODF visualization activated but m_NodeUsedForOdfVisualization is NULL"; return; } m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_T", m_GlyIsOn_T); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkControlVisualizationPropertiesView::VisibleOdfsON_C() { m_GlyIsOn_C = m_Controls->m_VisibleOdfsON_C->isChecked(); if (m_NodeUsedForOdfVisualization.IsNull()) { MITK_WARN << "ODF visualization activated but m_NodeUsedForOdfVisualization is NULL"; return; } m_NodeUsedForOdfVisualization->SetBoolProperty("VisibleOdfs_C", m_GlyIsOn_C); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } bool QmitkControlVisualizationPropertiesView::IsPlaneRotated() { mitk::Image* currentImage = dynamic_cast( m_NodeUsedForOdfVisualization->GetData() ); if( currentImage == NULL ) { MITK_ERROR << " Casting problems. Returning false"; return false; } mitk::Vector3D imageNormal0 = currentImage->GetSlicedGeometry()->GetAxisVector(0); mitk::Vector3D imageNormal1 = currentImage->GetSlicedGeometry()->GetAxisVector(1); mitk::Vector3D imageNormal2 = currentImage->GetSlicedGeometry()->GetAxisVector(2); imageNormal0.Normalize(); imageNormal1.Normalize(); imageNormal2.Normalize(); + auto renderWindowPart = this->GetRenderWindowPart(); + double eps = 0.000001; - // for all 2D renderwindows of m_MultiWidget check alignment + // for all 2D renderwindows of the render window part check alignment { mitk::PlaneGeometry::ConstPointer displayPlane = dynamic_cast - ( m_MultiWidget->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D() ); + ( renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer()->GetCurrentWorldGeometry2D() ); if (displayPlane.IsNull()) { return false; } mitk::Vector3D normal = displayPlane->GetNormal(); normal.Normalize(); int test = 0; if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal0.GetVnlVector()))-1) > eps ) { test++; } if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal1.GetVnlVector()))-1) > eps ) { test++; } if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal2.GetVnlVector()))-1) > eps ) { test++; } if (test==3) { return true; } } { mitk::PlaneGeometry::ConstPointer displayPlane = dynamic_cast - ( m_MultiWidget->GetRenderWindow2()->GetRenderer()->GetCurrentWorldGeometry2D() ); + ( renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer()->GetCurrentWorldGeometry2D() ); if (displayPlane.IsNull()) { return false; } mitk::Vector3D normal = displayPlane->GetNormal(); normal.Normalize(); int test = 0; if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal0.GetVnlVector()))-1) > eps ) { test++; } if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal1.GetVnlVector()))-1) > eps ) { test++; } if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal2.GetVnlVector()))-1) > eps ) { test++; } if (test==3) { return true; } } { mitk::PlaneGeometry::ConstPointer displayPlane = dynamic_cast - ( m_MultiWidget->GetRenderWindow3()->GetRenderer()->GetCurrentWorldGeometry2D() ); + ( renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer()->GetCurrentWorldGeometry2D() ); if (displayPlane.IsNull()) { return false; } mitk::Vector3D normal = displayPlane->GetNormal(); normal.Normalize(); int test = 0; if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal0.GetVnlVector()))-1) > eps ) { test++; } if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal1.GetVnlVector()))-1) > eps ) { test++; } if( fabs(fabs(dot_product(normal.GetVnlVector(),imageNormal2.GetVnlVector()))-1) > eps ) { test++; } if (test==3) { return true; } } return false; } void QmitkControlVisualizationPropertiesView::ShowMaxNumberChanged() { int maxNr = m_Controls->m_ShowMaxNumber->value(); if ( maxNr < 1 ) { m_Controls->m_ShowMaxNumber->setValue( 1 ); maxNr = 1; } if ( dynamic_cast(m_SelectedNode->GetData()) || dynamic_cast(m_SelectedNode->GetData()) ) { m_SelectedNode->SetIntProperty("ShowMaxNumber", maxNr); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkControlVisualizationPropertiesView::NormalizationDropdownChanged(int normDropdown) { typedef mitk::OdfNormalizationMethodProperty PropType; PropType::Pointer normMeth = PropType::New(); switch(normDropdown) { case 0: normMeth->SetNormalizationToMinMax(); break; case 1: normMeth->SetNormalizationToMax(); break; case 2: normMeth->SetNormalizationToNone(); break; case 3: normMeth->SetNormalizationToGlobalMax(); break; default: normMeth->SetNormalizationToMinMax(); } if ( dynamic_cast(m_SelectedNode->GetData()) || dynamic_cast(m_SelectedNode->GetData()) ) { m_SelectedNode->SetProperty("Normalization", normMeth.GetPointer()); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkControlVisualizationPropertiesView::ScalingFactorChanged(double scalingFactor) { if ( dynamic_cast(m_SelectedNode->GetData()) || dynamic_cast(m_SelectedNode->GetData()) ) { m_SelectedNode->SetFloatProperty("Scaling", scalingFactor); } - if(m_MultiWidget){ m_MultiWidget->RequestUpdate(); } + if (auto renderWindowPart = this->GetRenderWindowPart()) + { + renderWindowPart->RequestUpdate(); + } } void QmitkControlVisualizationPropertiesView::AdditionalScaling(int additionalScaling) { typedef mitk::OdfScaleByProperty PropType; PropType::Pointer scaleBy = PropType::New(); switch(additionalScaling) { case 0: scaleBy->SetScaleByNothing(); break; case 1: scaleBy->SetScaleByGFA(); //m_Controls->params_frame->setVisible(true); break; #ifdef DIFFUSION_IMAGING_EXTENDED case 2: scaleBy->SetScaleByPrincipalCurvature(); // commented in for SPIE paper, Principle curvature scaling //m_Controls->params_frame->setVisible(true); break; #endif default: scaleBy->SetScaleByNothing(); } if ( dynamic_cast(m_SelectedNode->GetData()) || dynamic_cast(m_SelectedNode->GetData()) ) { m_SelectedNode->SetProperty("Normalization", scaleBy.GetPointer()); } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkControlVisualizationPropertiesView::ScalingCheckbox() { m_Controls->m_ScalingFrame->setVisible( m_Controls->m_ScalingCheckbox->isChecked() ); if( ! m_Controls->m_ScalingCheckbox->isChecked() ) { m_Controls->m_AdditionalScaling->setCurrentIndex(0); m_Controls->m_ScalingFactor->setValue(1.0); } } void QmitkControlVisualizationPropertiesView::Fiber2DfadingEFX() { if (m_SelectedNode && dynamic_cast(m_SelectedNode->GetData()) ) { bool currentMode; m_SelectedNode->GetBoolProperty("Fiber2DfadeEFX", currentMode); m_SelectedNode->SetProperty("Fiber2DfadeEFX", mitk::BoolProperty::New(!currentMode)); dynamic_cast(m_SelectedNode->GetData())->RequestUpdate2D(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::FiberSlicingThickness2D() { if (m_SelectedNode && dynamic_cast(m_SelectedNode->GetData())) { float fibThickness = m_Controls->m_FiberThicknessSlider->value() * 0.1; float currentThickness = 0; m_SelectedNode->GetFloatProperty("Fiber2DSliceThickness", currentThickness); if ( fabs(fibThickness-currentThickness) < 0.001 ) { return; } m_SelectedNode->SetProperty("Fiber2DSliceThickness", mitk::FloatProperty::New(fibThickness)); dynamic_cast(m_SelectedNode->GetData())->RequestUpdate2D(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::FiberSlicingUpdateLabel(int value) { QString label = "Range %1 mm"; label = label.arg(value * 0.1); m_Controls->label_range->setText(label); FiberSlicingThickness2D(); } void QmitkControlVisualizationPropertiesView::SetFiberBundleOpacity(const itk::EventObject& /*e*/) { if(m_SelectedNode) { mitk::FiberBundle::Pointer fib = dynamic_cast(m_SelectedNode->GetData()); fib->RequestUpdate(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::SetFiberBundleCustomColor(const itk::EventObject& /*e*/) { if(m_SelectedNode && dynamic_cast(m_SelectedNode->GetData())) { float color[3]; m_SelectedNode->GetColor(color); mitk::FiberBundle::Pointer fib = dynamic_cast(m_SelectedNode->GetData()); fib->SetFiberColors(color[0]*255, color[1]*255, color[2]*255); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::BundleRepresentationResetColoring() { if(m_SelectedNode && dynamic_cast(m_SelectedNode->GetData())) { mitk::FiberBundle::Pointer fib = dynamic_cast(m_SelectedNode->GetData()); fib->ColorFibersByOrientation(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::PlanarFigureFocus() { if(m_SelectedNode) { mitk::PlanarFigure* _PlanarFigure = 0; _PlanarFigure = dynamic_cast (m_SelectedNode->GetData()); if (_PlanarFigure && _PlanarFigure->GetPlaneGeometry()) { QmitkRenderWindow* selectedRenderWindow = 0; bool PlanarFigureInitializedWindow = false; - QmitkRenderWindow* RenderWindow1 = - this->GetActiveStdMultiWidget()->GetRenderWindow1(); + auto renderWindowPart = this->GetRenderWindowPart(OPEN); + + QmitkRenderWindow* axialRenderWindow = + renderWindowPart->GetQmitkRenderWindow("axial"); if (m_SelectedNode->GetBoolProperty("PlanarFigureInitializedWindow", - PlanarFigureInitializedWindow, RenderWindow1->GetRenderer())) + PlanarFigureInitializedWindow, axialRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow1; + selectedRenderWindow = axialRenderWindow; } - QmitkRenderWindow* RenderWindow2 = - this->GetActiveStdMultiWidget()->GetRenderWindow2(); + QmitkRenderWindow* sagittalRenderWindow = + renderWindowPart->GetQmitkRenderWindow("sagittal"); if (!selectedRenderWindow && m_SelectedNode->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, - RenderWindow2->GetRenderer())) + sagittalRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow2; + selectedRenderWindow = sagittalRenderWindow; } - QmitkRenderWindow* RenderWindow3 = - this->GetActiveStdMultiWidget()->GetRenderWindow3(); + QmitkRenderWindow* coronalRenderWindow = + renderWindowPart->GetQmitkRenderWindow("coronal"); if (!selectedRenderWindow && m_SelectedNode->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, - RenderWindow3->GetRenderer())) + coronalRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow3; + selectedRenderWindow = coronalRenderWindow; } - QmitkRenderWindow* RenderWindow4 = - this->GetActiveStdMultiWidget()->GetRenderWindow4(); + QmitkRenderWindow* _3DRenderWindow = + renderWindowPart->GetQmitkRenderWindow("3d"); if (!selectedRenderWindow && m_SelectedNode->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, - RenderWindow4->GetRenderer())) + _3DRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow4; + selectedRenderWindow = _3DRenderWindow; } const mitk::PlaneGeometry* _PlaneGeometry = _PlanarFigure->GetPlaneGeometry(); mitk::VnlVector normal = _PlaneGeometry->GetNormalVnl(); mitk::Geometry2D::ConstPointer worldGeometry1 = - RenderWindow1->GetRenderer()->GetCurrentWorldGeometry2D(); + axialRenderWindow->GetRenderer()->GetCurrentWorldGeometry2D(); mitk::PlaneGeometry::ConstPointer _Plane1 = dynamic_cast( worldGeometry1.GetPointer() ); mitk::VnlVector normal1 = _Plane1->GetNormalVnl(); mitk::Geometry2D::ConstPointer worldGeometry2 = - RenderWindow2->GetRenderer()->GetCurrentWorldGeometry2D(); + sagittalRenderWindow->GetRenderer()->GetCurrentWorldGeometry2D(); mitk::PlaneGeometry::ConstPointer _Plane2 = dynamic_cast( worldGeometry2.GetPointer() ); mitk::VnlVector normal2 = _Plane2->GetNormalVnl(); mitk::Geometry2D::ConstPointer worldGeometry3 = - RenderWindow3->GetRenderer()->GetCurrentWorldGeometry2D(); + coronalRenderWindow->GetRenderer()->GetCurrentWorldGeometry2D(); mitk::PlaneGeometry::ConstPointer _Plane3 = dynamic_cast( worldGeometry3.GetPointer() ); mitk::VnlVector normal3 = _Plane3->GetNormalVnl(); normal[0] = fabs(normal[0]); normal[1] = fabs(normal[1]); normal[2] = fabs(normal[2]); normal1[0] = fabs(normal1[0]); normal1[1] = fabs(normal1[1]); normal1[2] = fabs(normal1[2]); normal2[0] = fabs(normal2[0]); normal2[1] = fabs(normal2[1]); normal2[2] = fabs(normal2[2]); normal3[0] = fabs(normal3[0]); normal3[1] = fabs(normal3[1]); normal3[2] = fabs(normal3[2]); double ang1 = angle(normal, normal1); double ang2 = angle(normal, normal2); double ang3 = angle(normal, normal3); if(ang1 < ang2 && ang1 < ang3) { - selectedRenderWindow = RenderWindow1; + selectedRenderWindow = axialRenderWindow; } else { if(ang2 < ang3) { - selectedRenderWindow = RenderWindow2; + selectedRenderWindow = sagittalRenderWindow; } else { - selectedRenderWindow = RenderWindow3; + selectedRenderWindow = coronalRenderWindow; } } // make node visible if (selectedRenderWindow) { const mitk::Point3D& centerP = _PlaneGeometry->GetOrigin(); selectedRenderWindow->GetSliceNavigationController()->ReorientSlices( centerP, _PlaneGeometry->GetNormal()); } } // set interactor for new node (if not already set) mitk::PlanarFigureInteractor::Pointer figureInteractor = dynamic_cast(m_SelectedNode->GetDataInteractor().GetPointer()); if(figureInteractor.IsNull()) { figureInteractor = mitk::PlanarFigureInteractor::New(); us::Module* planarFigureModule = us::ModuleRegistry::GetModule( "MitkPlanarFigure" ); figureInteractor->LoadStateMachine("PlanarFigureInteraction.xml", planarFigureModule ); figureInteractor->SetEventConfig( "PlanarFigureConfig.xml", planarFigureModule ); figureInteractor->SetDataNode( m_SelectedNode ); } m_SelectedNode->SetProperty("planarfigure.iseditable",mitk::BoolProperty::New(true)); } } void QmitkControlVisualizationPropertiesView::SetInteractor() { // BUG 19179 // typedef std::vector Container; // Container _NodeSet = this->GetDataManagerSelection(); // mitk::DataNode* node = 0; // mitk::FiberBundle* bundle = 0; // mitk::FiberBundleInteractor::Pointer bundleInteractor = 0; // // finally add all nodes to the model // for(Container::const_iterator it=_NodeSet.begin(); it!=_NodeSet.end() // ; it++) // { // node = const_cast(*it); // bundle = dynamic_cast(node->GetData()); // if(bundle) // { // bundleInteractor = dynamic_cast(node->GetInteractor()); // if(bundleInteractor.IsNotNull()) // mitk::GlobalInteraction::GetInstance()->RemoveInteractor(bundleInteractor); // if(!m_Controls->m_Crosshair->isChecked()) // { // m_Controls->m_Crosshair->setChecked(false); // this->GetActiveStdMultiWidget()->GetRenderWindow4()->setCursor(Qt::ArrowCursor); // m_CurrentPickingNode = 0; // } // else // { // m_Controls->m_Crosshair->setChecked(true); // bundleInteractor = mitk::FiberBundleInteractor::New("FiberBundleInteractor", node); // mitk::GlobalInteraction::GetInstance()->AddInteractor(bundleInteractor); // this->GetActiveStdMultiWidget()->GetRenderWindow4()->setCursor(Qt::CrossCursor); // m_CurrentPickingNode = node; // } // } // } } void QmitkControlVisualizationPropertiesView::TubeRadiusChanged() { if(m_SelectedNode && dynamic_cast(m_SelectedNode->GetData())) { float newRadius = m_Controls->m_TubeWidth->value(); m_SelectedNode->SetFloatProperty("shape.tuberadius", newRadius); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::LineWidthChanged() { if(m_SelectedNode && dynamic_cast(m_SelectedNode->GetData())) { int newWidth = m_Controls->m_LineWidth->value(); int currentWidth = 0; m_SelectedNode->GetIntProperty("shape.linewidth", currentWidth); if (currentWidth==newWidth) return; m_SelectedNode->SetIntProperty("shape.linewidth", newWidth); dynamic_cast(m_SelectedNode->GetData())->RequestUpdate(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkControlVisualizationPropertiesView::Welcome() { berry::PlatformUI::GetWorkbench()->GetIntroManager() ->ShowIntro(GetSite()->GetWorkbenchWindow(), false); } void QmitkControlVisualizationPropertiesView::OnTensorViewChanged() { if( m_NodeUsedForOdfVisualization.IsNotNull() ) { if( m_Controls-> m_EllipsoidViewRadioButton-> isChecked() ) { if ( m_SelectedNode and dynamic_cast( m_SelectedNode->GetData() ) ) { m_SelectedNode-> SetProperty( "DiffusionCore.Rendering.OdfVtkMapper.SwitchTensorView", mitk::BoolProperty::New( true ) ); mitk::OdfNormalizationMethodProperty::Pointer normalizationProperty = mitk::OdfNormalizationMethodProperty::New( mitk::ODFN_MAX ); m_SelectedNode-> SetProperty( "Normalization", normalizationProperty ); // type OdfNormalizationMethodProperty m_Controls-> m_NormalizationDropdown->setCurrentIndex ( dynamic_cast( m_SelectedNode->GetProperty("Normalization") )->GetValueAsId() ); } else { m_SelectedNode-> SetProperty( "DiffusionCore.Rendering.OdfVtkMapper.SwitchTensorView", mitk::BoolProperty::New( false ) ); m_Controls-> m_OdfViewRadioButton-> setChecked(true); m_Controls-> m_EllipsoidViewRadioButton-> setEnabled(false); } } else if( m_Controls-> m_OdfViewRadioButton-> isChecked() ) { m_SelectedNode-> SetProperty( "DiffusionCore.Rendering.OdfVtkMapper.SwitchTensorView", mitk::BoolProperty::New( false ) ); } mitk::RenderingManager::GetInstance()-> RequestUpdateAll(); } else { MITK_DEBUG << "QmitkControlVisualizationPropertiesView::OnTensorViewChanged()" " was called but m_NodeUsedForOdfVisualization was Null."; } } void QmitkControlVisualizationPropertiesView::OnColourisationModeChanged() { if( m_SelectedNode and m_NodeUsedForOdfVisualization.IsNotNull() ) { if( m_Controls-> m_colouriseRainbowRadioButton-> isChecked() ) { m_SelectedNode-> SetProperty( "DiffusionCore.Rendering.OdfVtkMapper.ColourisationModeBit", mitk::BoolProperty::New( false ) ); } else if ( m_Controls-> m_colouriseSimpleRadioButton-> isChecked() ) { m_SelectedNode-> SetProperty( "DiffusionCore.Rendering.OdfVtkMapper.ColourisationModeBit", mitk::BoolProperty::New( true ) ); } mitk::RenderingManager::GetInstance()-> RequestUpdateAll(); } else { MITK_DEBUG << "QmitkControlVisualizationPropertiesView::OnColourisationModeChanged()" " was called but m_NodeUsedForOdfVisualization was Null."; } } void QmitkControlVisualizationPropertiesView::OnRandomModeChanged() { if( m_SelectedNode and m_NodeUsedForOdfVisualization.IsNotNull() ) { if( m_Controls-> m_randomModeRadioButton-> isChecked() ) { m_SelectedNode-> SetProperty( "DiffusionCore.Rendering.OdfVtkMapper.RandomModeBit", mitk::BoolProperty::New( true ) ); } else if ( m_Controls-> m_orderedModeRadioButton-> isChecked() ) { m_SelectedNode-> SetProperty( "DiffusionCore.Rendering.OdfVtkMapper.RandomModeBit", mitk::BoolProperty::New( false ) ); } mitk::RenderingManager::GetInstance()-> RequestUpdateAll(); } else { MITK_DEBUG << "QmitkControlVisualizationPropertiesView::OnRandomModeChanged()" " was called but m_NodeUsedForOdfVisualization was Null."; } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.h b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.h index 0317958355..3b82573dfd 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkControlVisualizationPropertiesView.h @@ -1,160 +1,153 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKControlVisualizationPropertiesView_H_INCLUDED #define _QMITKControlVisualizationPropertiesView_H_INCLUDED -#include +#include #include #include "berryISelectionListener.h" #include "berryIStructuredSelection.h" #include "berryISizeProvider.h" #include "ui_QmitkControlVisualizationPropertiesViewControls.h" #include "mitkEnumerationProperty.h" /*! * \ingroup org_mitk_gui_qt_diffusionquantification_internal * * \brief QmitkControlVisualizationPropertiesView * * Document your class here. - * - * \sa QmitkFunctionality */ -class QmitkControlVisualizationPropertiesView : public QmitkFunctionality//, public berry::ISizeProvider +class QmitkControlVisualizationPropertiesView : public QmitkAbstractView//, public berry::ISizeProvider { friend struct CvpSelListener; // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkControlVisualizationPropertiesView(); virtual ~QmitkControlVisualizationPropertiesView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Called when the functionality is activated - virtual void Activated() override; - - virtual void Deactivated() override; - - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void VisibleOdfsON_S(); void VisibleOdfsON_T(); void VisibleOdfsON_C(); void ShowMaxNumberChanged(); void NormalizationDropdownChanged(int); void ScalingFactorChanged(double); void AdditionalScaling(int); void ScalingCheckbox(); void OnThickSlicesModeSelected( QAction* action ); void OnTSNumChanged(int num); void BundleRepresentationResetColoring(); void PlanarFigureFocus(); void Fiber2DfadingEFX(); void FiberSlicingThickness2D(); void FiberSlicingUpdateLabel(int); void LineWidthChanged(); void TubeRadiusChanged(); void SetInteractor(); void Welcome(); /// \brief Slot function for switching tensor view between ODF q-balls and ellipsoids from tensors. void OnTensorViewChanged(); /// \brief Slot function for switching colourisation mode of glyphs. void OnColourisationModeChanged(); /// \brief Slot function for switching glyph placement mode. void OnRandomModeChanged(); protected: virtual void NodeRemoved(const mitk::DataNode* node) override; - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; virtual void NodeAdded(const mitk::DataNode *node) override; void SetFiberBundleCustomColor(const itk::EventObject& /*e*/); void SetFiberBundleOpacity(const itk::EventObject& /*e*/); bool IsPlaneRotated(); void SliceRotation(const itk::EventObject&); Ui::QmitkControlVisualizationPropertiesViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - QScopedPointer m_SelListener; berry::IStructuredSelection::ConstPointer m_CurrentSelection; mitk::DataNode::Pointer m_NodeUsedForOdfVisualization; QIcon* m_IconTexOFF; QIcon* m_IconTexON; QIcon* m_IconGlyOFF_T; QIcon* m_IconGlyON_T; QIcon* m_IconGlyOFF_C; QIcon* m_IconGlyON_C; QIcon* m_IconGlyOFF_S; QIcon* m_IconGlyON_S; bool m_TexIsOn; bool m_GlyIsOn_T; bool m_GlyIsOn_C; bool m_GlyIsOn_S; int currentThickSlicesMode; QLabel* m_TSLabel; QMenu* m_MyMenu; // for planarfigure and bundle handling: mitk::DataNode::Pointer m_SelectedNode; mitk::DataNode* m_CurrentPickingNode; unsigned long m_FiberBundleObserverTag; unsigned long m_FiberBundleObserveOpacityTag; mitk::ColorProperty::Pointer m_Color; mitk::FloatProperty::Pointer m_Opacity; }; #endif // _QMITKControlVisualizationPropertiesView_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.cpp index 6930ce34df..91e0be3a3f 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.cpp @@ -1,558 +1,558 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkDiffusionDicomImportView.h" // qt includes #include // itk includes #include "itkTimeProbesCollectorBase.h" #include "itkGDCMSeriesFileNames.h" #include "itksys/SystemTools.hxx" // mitk includes #include "mitkProgressBar.h" #include "mitkStatusBar.h" #include "mitkProperties.h" #include "mitkRenderingManager.h" #include "mitkMemoryUtilities.h" #include "mitkIOUtil.h" // diffusion module includes #include "mitkDicomDiffusionImageHeaderReader.h" #include "mitkDicomDiffusionImageReader.h" #include "mitkImage.h" #include #include "mitkDiffusionDICOMFileReader.h" #include "mitkDICOMTagBasedSorter.h" #include "mitkDICOMSortByTag.h" #include "mitkSortByImagePositionPatient.h" #include "gdcmDirectory.h" #include "gdcmScanner.h" #include "gdcmSorter.h" #include "gdcmIPPSorter.h" #include "gdcmAttribute.h" #include "gdcmVersion.h" #include #include #include const std::string QmitkDiffusionDicomImport::VIEW_ID = "org.mitk.views.diffusiondicomimport"; QmitkDiffusionDicomImport::QmitkDiffusionDicomImport(QObject* /*parent*/, const char* /*name*/) - : QmitkFunctionality(), m_Controls(NULL), m_MultiWidget(NULL), + : QmitkAbstractView(), m_Controls(NULL), m_OutputFolderName(""), m_OutputFolderNameSet(false) { } QmitkDiffusionDicomImport::QmitkDiffusionDicomImport(const QmitkDiffusionDicomImport& other) { Q_UNUSED(other) throw std::runtime_error("Copy constructor not implemented"); } QmitkDiffusionDicomImport::~QmitkDiffusionDicomImport() {} void QmitkDiffusionDicomImport::CreateQtPartControl(QWidget *parent) { m_Parent = parent; if (m_Controls == NULL) { m_Controls = new Ui::QmitkDiffusionDicomImportControls; m_Controls->setupUi(parent); this->CreateConnections(); m_Controls->m_DicomLoadRecursiveCheckbox->setChecked(false); m_Controls->m_DicomLoadAverageDuplicatesCheckbox->setChecked(false); m_Controls->m_DicomLoadRecursiveCheckbox->setVisible(true); m_Controls->m_OverrideOptionCheckbox->setVisible(false); m_Controls->m_SubdirPrefixLineEdit->setVisible(false); m_Controls->m_SetPrefixButton->setVisible(false); m_Controls->m_ResetPrefixButton->setVisible(false); AverageClicked(); } } void QmitkDiffusionDicomImport::CreateConnections() { if ( m_Controls ) { connect( m_Controls->m_AddFoldersButton, SIGNAL(clicked()), this, SLOT(DicomLoadAddFolderNames()) ); connect( m_Controls->m_DeleteFoldersButton, SIGNAL(clicked()), this, SLOT(DicomLoadDeleteFolderNames()) ); //connect( m_Controls->m_DicomLoadStartLoadButton, SIGNAL(clicked()), this, SLOT(DicomLoadStartLoad()) ); connect( m_Controls->m_DicomLoadStartLoadButton, SIGNAL(clicked()), this, SLOT(NewDicomLoadStartLoad()) ); connect( m_Controls->m_DicomLoadAverageDuplicatesCheckbox, SIGNAL(clicked()), this, SLOT(AverageClicked()) ); connect( m_Controls->m_OutputSetButton, SIGNAL(clicked()), this, SLOT(OutputSet()) ); connect( m_Controls->m_OutputClearButton, SIGNAL(clicked()), this, SLOT(OutputClear()) ); connect( m_Controls->m_Remove, SIGNAL(clicked()), this, SLOT(Remove()) ); connect( m_Controls->m_SetPrefixButton, SIGNAL(clicked()), this, SLOT(SetPrefixButtonPushed())); connect( m_Controls->m_ResetPrefixButton, SIGNAL(clicked()), this, SLOT(ResetPrefixButtonPushed())); connect( m_Controls->m_DicomLoadRecursiveCheckbox, SIGNAL(clicked()), this, SLOT(RecursiveSettingsChanged()) ); } } +void QmitkDiffusionDicomImport::SetFocus() +{ + m_Controls->textBrowser->setFocus(); +} + void QmitkDiffusionDicomImport::RecursiveSettingsChanged() { m_Controls->m_SubdirPrefixLineEdit->setVisible( m_Controls->m_DicomLoadRecursiveCheckbox->isChecked() ); m_Controls->m_SetPrefixButton->setVisible( m_Controls->m_DicomLoadRecursiveCheckbox->isChecked() ); m_Controls->m_SubdirPrefixLineEdit->clear(); this->m_Controls->m_SubdirPrefixLineEdit->setEnabled(true); } void QmitkDiffusionDicomImport::SetPrefixButtonPushed() { m_Prefix = this->m_Controls->m_SubdirPrefixLineEdit->text().toStdString(); if( !this->m_Controls->m_ResetPrefixButton->isVisible() ) this->m_Controls->m_ResetPrefixButton->setVisible(true); this->m_Controls->m_SubdirPrefixLineEdit->setEnabled(false); this->m_Controls->m_ResetPrefixButton->setEnabled(true); this->m_Controls->m_SetPrefixButton->setEnabled(false); } void QmitkDiffusionDicomImport::ResetPrefixButtonPushed() { m_Controls->m_SubdirPrefixLineEdit->clear(); this->m_Controls->m_SubdirPrefixLineEdit->setEnabled(true); this->m_Controls->m_ResetPrefixButton->setEnabled(false); this->m_Controls->m_SetPrefixButton->setEnabled(true); } void QmitkDiffusionDicomImport::Remove() { int i = m_Controls->listWidget->currentRow(); m_Controls->listWidget->takeItem(i); } void QmitkDiffusionDicomImport::OutputSet() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( m_Parent, QString("Select folders containing DWI data") ); w->setFileMode( QFileDialog::Directory ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; m_OutputFolderName = w->selectedFiles()[0]; m_OutputFolderNameSet = true; m_Controls->m_OutputLabel->setText(m_OutputFolderName); // show file override option checkbox m_Controls->m_OverrideOptionCheckbox->setVisible(true); } void QmitkDiffusionDicomImport::OutputClear() { m_OutputFolderName = ""; m_OutputFolderNameSet = false; m_Controls->m_OutputLabel->setText("... optional out-folder ..."); // hide file override option checkbox - no output specified m_Controls->m_OverrideOptionCheckbox->setVisible(false); } void QmitkDiffusionDicomImport::AverageClicked() { m_Controls->m_Blur->setEnabled(m_Controls->m_DicomLoadAverageDuplicatesCheckbox->isChecked()); } -void QmitkDiffusionDicomImport::Activated() -{ - QmitkFunctionality::Activated(); -} - void QmitkDiffusionDicomImport::DicomLoadDeleteFolderNames() { m_Controls->listWidget->clear(); } void QmitkDiffusionDicomImport::DicomLoadAddFolderNames() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( m_Parent, QString("Select folders containing DWI data") ); w->setFileMode( QFileDialog::Directory ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; m_Controls->listWidget->addItems(w->selectedFiles()); } bool SortBySeriesUID(gdcm::DataSet const & ds1, gdcm::DataSet const & ds2 ) { gdcm::Attribute<0x0020,0x000e> at1; at1.Set( ds1 ); gdcm::Attribute<0x0020,0x000e> at2; at2.Set( ds2 ); return at1 < at2; } bool SortByAcquisitionNumber(gdcm::DataSet const & ds1, gdcm::DataSet const & ds2 ) { gdcm::Attribute<0x0020,0x0012> at1; at1.Set( ds1 ); gdcm::Attribute<0x0020,0x0012> at2; at2.Set( ds2 ); return at1 < at2; } bool SortBySeqName(gdcm::DataSet const & ds1, gdcm::DataSet const & ds2 ) { gdcm::Attribute<0x0018, 0x0024> at1; at1.Set( ds1 ); gdcm::Attribute<0x0018, 0x0024> at2; at2.Set( ds2 ); std::string str1 = at1.GetValue().Trim(); std::string str2 = at2.GetValue().Trim(); return std::lexicographical_compare(str1.begin(), str1.end(), str2.begin(), str2.end() ); } void QmitkDiffusionDicomImport::Status(QString status) { mitk::StatusBar::GetInstance()->DisplayText(status.toLatin1()); MITK_INFO << status.toStdString().c_str(); } void QmitkDiffusionDicomImport::Status(std::string status) { mitk::StatusBar::GetInstance()->DisplayText(status.c_str()); MITK_INFO << status.c_str(); } void QmitkDiffusionDicomImport::Status(const char* status) { mitk::StatusBar::GetInstance()->DisplayText(status); MITK_INFO << status; } void QmitkDiffusionDicomImport::Error(QString status) { mitk::StatusBar::GetInstance()->DisplayErrorText(status.toLatin1()); MITK_ERROR << status.toStdString().c_str(); } void QmitkDiffusionDicomImport::Error(std::string status) { mitk::StatusBar::GetInstance()->DisplayErrorText(status.c_str()); MITK_ERROR << status.c_str(); } void QmitkDiffusionDicomImport::Error(const char* status) { mitk::StatusBar::GetInstance()->DisplayErrorText(status); MITK_ERROR << status; } void QmitkDiffusionDicomImport::PrintMemoryUsage() { size_t processSize = mitk::MemoryUtilities::GetProcessMemoryUsage(); size_t totalSize = mitk::MemoryUtilities::GetTotalSizeOfPhysicalRam(); float percentage = ( (float) processSize / (float) totalSize ) * 100.0; MITK_INFO << "Current memory usage: " << GetMemoryDescription( processSize, percentage ); } std::string QmitkDiffusionDicomImport::FormatMemorySize( size_t size ) { double val = size; std::string descriptor("B"); if ( val >= 1000.0 ) { val /= 1024.0; descriptor = "KB"; } if ( val >= 1000.0 ) { val /= 1024.0; descriptor = "MB"; } if ( val >= 1000.0 ) { val /= 1024.0; descriptor = "GB"; } std::ostringstream str; str << std::fixed << std::setprecision(2) << val << " " << descriptor; return str.str(); } std::string QmitkDiffusionDicomImport::FormatPercentage( double val ) { std::ostringstream str; str << std::fixed << std::setprecision(2) << val << " " << "%"; return str.str(); } std::string QmitkDiffusionDicomImport::GetMemoryDescription( size_t processSize, float percentage ) { std::ostringstream str; str << FormatMemorySize(processSize) << " (" << FormatPercentage( percentage ) <<")" ; return str.str(); } void QmitkDiffusionDicomImport::NewDicomLoadStartLoad() { itk::TimeProbesCollectorBase clock; bool imageSuccessfullySaved = true; bool has_prefix = true; try { const std::string& locale = "C"; const std::string& currLocale = setlocale( LC_ALL, NULL ); if ( locale.compare(currLocale)!=0 ) { try { MITK_INFO << " ** Changing locale from " << setlocale(LC_ALL, NULL) << " to '" << locale << "'"; setlocale(LC_ALL, locale.c_str()); } catch(...) { MITK_INFO << "Could not set locale " << locale; } } int nrFolders = m_Controls->listWidget->count(); if(!nrFolders) { Error(QString("No input folders were selected. ABORTING.")); return; } Status(QString("GDCM %1 used for DICOM parsing and sorting!").arg(gdcm::Version::GetVersion())); PrintMemoryUsage(); QString status; mitk::DataNode::Pointer node; mitk::ProgressBar::GetInstance()->AddStepsToDo(2*nrFolders); gdcm::Directory::FilenamesType complete_list; while(m_Controls->listWidget->count()) { // RETREIVE FOLDERNAME QListWidgetItem * item = m_Controls->listWidget->takeItem(0); QString folderName = item->text(); if( this->m_Controls->m_DicomLoadRecursiveCheckbox->isChecked() ) { std::string subdir_prefix = ""; if( has_prefix ) { subdir_prefix = this->m_Prefix; } itksys::Directory rootdir; rootdir.Load( folderName.toStdString().c_str() ); for( unsigned int idx=0; idxm_Controls->m_DicomLoadRecursiveCheckbox->isChecked() ); // recursive ! const gdcm::Directory::FilenamesType &l1 = d.GetFilenames(); const unsigned int ntotalfiles = l1.size(); Status(QString(" ... found %1 different files").arg(ntotalfiles)); for( unsigned int i=0; i< ntotalfiles; i++) { complete_list.push_back( l1.at(i) ); } } } { mitk::DiffusionDICOMFileReader::Pointer gdcmReader = mitk::DiffusionDICOMFileReader::New(); mitk::DICOMTagBasedSorter::Pointer tagSorter = mitk::DICOMTagBasedSorter::New(); // Use tags as in Qmitk // all the things that split by tag in DicomSeriesReader tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0010) ); // Number of Rows tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0011) ); // Number of Columns tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0030) ); // Pixel Spacing tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0018, 0x1164) ); // Imager Pixel Spacing tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0020, 0x0037) ); // Image Orientation (Patient) // TODO add tolerance parameter (l. 1572 of original code) // TODO handle as real vectors! cluster with configurable errors! tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0020, 0x000e) ); // Series Instance UID tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0018, 0x0050) ); // Slice Thickness tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0028, 0x0008) ); // Number of Frames //tagSorter->AddDistinguishingTag( mitk::DICOMTag(0x0020, 0x0052) ); // Frame of Reference UID // gdcmReader->AddSortingElement( tagSorter ); //mitk::DICOMFileReaderTestHelper::TestOutputsContainInputs( gdcmReader ); mitk::DICOMSortCriterion::ConstPointer sorting = mitk::SortByImagePositionPatient::New( // Image Position (Patient) //mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0020, 0x0013), // instance number mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0020, 0x0012), // aqcuisition number mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0008, 0x0032), // aqcuisition time mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0018, 0x1060), // trigger time mitk::DICOMSortByTag::New( mitk::DICOMTag(0x0008, 0x0018) // SOP instance UID (last resort, not really meaningful but decides clearly) ).GetPointer() ).GetPointer() ).GetPointer() ).GetPointer() // ).GetPointer() ).GetPointer(); tagSorter->SetSortCriterion( sorting ); // mosaic gdcmReader->SetResolveMosaic( this->m_Controls->m_SplitMosaicCheckBox->isChecked() ); gdcmReader->AddSortingElement( tagSorter ); gdcmReader->SetInputFiles( complete_list ); try { gdcmReader->AnalyzeInputFiles(); } catch( const itk::ExceptionObject &e) { MITK_ERROR << "Failed to analyze data. " << e.what(); } catch( const std::exception &se) { MITK_ERROR << "Std Exception " << se.what(); } gdcmReader->LoadImages(); for( int o = 0; o < gdcmReader->GetNumberOfOutputs(); o++ ) { mitk::Image::Pointer loaded_image = gdcmReader->GetOutput(o).GetMitkImage(); std::stringstream ss; ss << "ImportedData_" << o; node = mitk::DataNode::New(); node->SetData( loaded_image ); std::string outname; loaded_image->GetPropertyList()->GetStringProperty("diffusion.dicom.importname", outname ); node->SetName( outname.c_str() ); - GetDefaultDataStorage()->Add(node); + GetDataStorage()->Add(node); //SetDwiNodeProperties(node, ss.str() ); //Status(QString("Image %1 added to datastorage").arg(descr)); } } Status("Timing information"); clock.Report(); if(!m_OutputFolderNameSet && node.IsNotNull()) { mitk::BaseData::Pointer basedata = node->GetData(); if (basedata.IsNotNull()) { mitk::RenderingManager::GetInstance()->InitializeViews( basedata->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); } } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); try { MITK_INFO << " ** Changing locale back from " << setlocale(LC_ALL, NULL) << " to '" << currLocale << "'"; setlocale(LC_ALL, currLocale.c_str()); } catch(...) { MITK_INFO << "Could not reset locale " << currLocale; } } catch (itk::ExceptionObject &ex) { Error(QString("%1\n%2\n%3\n%4\n%5\n%6").arg(ex.GetNameOfClass()).arg(ex.GetFile()).arg(ex.GetLine()).arg(ex.GetLocation()).arg(ex.what()).arg(ex.GetDescription())); return ; } if (!imageSuccessfullySaved) QMessageBox::warning(NULL,"WARNING","One or more files could not be saved! The according files where moved to the datastorage."); Status(QString("Finished import with memory:")); PrintMemoryUsage(); } void QmitkDiffusionDicomImport::SetDwiNodeProperties(mitk::DataNode::Pointer node, std::string name) { node->SetProperty( "IsDWIRawVolume", mitk::BoolProperty::New( true ) ); // set foldername as string property mitk::StringProperty::Pointer nameProp = mitk::StringProperty::New( name ); node->SetProperty( "name", nameProp ); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.h b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.h index 623b1c97e6..2cf66c213b 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkDiffusionDicomImportView.h @@ -1,115 +1,113 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkDiffusionDicomImportView_H__INCLUDED #define QmitkDiffusionDicomImportView_H__INCLUDED -#include "QmitkFunctionality.h" +#include #include "ui_QmitkDiffusionDicomImportViewControls.h" /*! \brief QmitkDiffusionDicomImport - -\sa QmitkFunctionality -\ingroup Functionalities */ -class QmitkDiffusionDicomImport : public QmitkFunctionality +class QmitkDiffusionDicomImport : public QmitkAbstractView { Q_OBJECT public: static const std::string VIEW_ID; /*! \ Convenient typedefs */ typedef mitk::DataStorage::SetOfObjects ConstVector; typedef ConstVector::ConstPointer ConstVectorPointer; typedef ConstVector::ConstIterator ConstVectorIterator; /*! \brief default constructor */ QmitkDiffusionDicomImport(QObject *parent=0, const char *name=0); QmitkDiffusionDicomImport(const QmitkDiffusionDicomImport& other); /*! \brief default destructor */ virtual ~QmitkDiffusionDicomImport(); /*! \brief method for creating the widget containing the application controls, like sliders, buttons etc. */ virtual void CreateQtPartControl(QWidget *parent) override; /*! \brief method for creating the connections of main and control widget */ virtual void CreateConnections(); - virtual void Activated() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; void SetDwiNodeProperties(mitk::DataNode::Pointer node, std::string name); protected slots: void DicomLoadAddFolderNames(); void DicomLoadDeleteFolderNames(); void NewDicomLoadStartLoad() ; void AverageClicked(); void OutputSet(); void OutputClear(); void Remove(); void RecursiveSettingsChanged(); void SetPrefixButtonPushed(); void ResetPrefixButtonPushed(); protected: void Status(QString status); void Status(std::string status); void Status(const char* status); void Error(QString status); void Error(std::string status); void Error(const char* status); void PrintMemoryUsage(); std::string FormatMemorySize( size_t size ); std::string FormatPercentage( double val ); std::string GetMemoryDescription( size_t processSize, float percentage ); /*! * controls containing sliders for scrolling through the slices */ Ui::QmitkDiffusionDicomImportControls *m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - QWidget *m_Parent; QString m_OutputFolderName; bool m_OutputFolderNameSet; std::string m_Prefix; }; #endif // !defined(QmitkDiffusionDicomImport_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.cpp index e4cffca1d7..cabac3a25d 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.cpp @@ -1,2499 +1,2499 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "itkTimeProbe.h" #include "QmitkDiffusionTensorEstimation.h" #include "QmitkDiffusionTensorEstimationControls.h" #include #include "QmitkDataTreeComboBox.h" #include "QmitkDataTreeListView.h" -#include "QmitkStdMultiWidget.h" #include "QmitkDiffusionTensorIcon.h" #include #include "QmitkPropertyViewFactory.h" #include #include #include #include #include #include #include // properties #include "mitkStringProperty.h" #include "mitkProperties.h" #include "mitkMaterialProperty.h" #include "mitkLevelWindowProperty.h" #include "mitkVtkRepresentationProperty.h" #include "mitkVtkInterpolationProperty.h" #include "mitkVtkScalarModeProperty.h" #include "mitkLookupTableProperty.h" #include "mitkLookupTable.h" #include "mitkTransferFunctionProperty.h" #include "mitkGridRepresentationProperty.h" #include "mitkGridVolumeMapperProperty.h" #include "mitkVtkResliceInterpolationProperty.h" #include "mitkVectorImageMapper2D.h" #include "mitkOdfVtkMapper2D.h" #include "itkOrientedImage.h" #include "itkVectorImage.h" #include "itkImageSeriesReader.h" #include "itkImageFileWriter.h" #include "itkExceptionObject.h" #include "itkDiffusionTensor3DReconstructionImageFilter.h" #include "itkDiffusionTensor3D.h" #include "itkTensorFractionalAnisotropyImageFilter.h" #include "itkTensorRelativeAnisotropyImageFilter.h" #include "itkGDCMSeriesFileNames.h" #include "itkImageRegionConstIterator.h" #include "itkRescaleIntensityImageFilter.h" #include "itkDiffusionQballReconstructionImageFilter.h" #include "itkAnalyticalDiffusionQballReconstructionImageFilter.h" #include "itkPointShell.h" #include "itkRGBPixel.h" #include "itkOrientationDistributionFunction.h" #include "itkDiffusionQballPrincipleDirectionsImageFilter.h" #include "itkDiffusionQballGeneralizedFaImageFilter.h" #include "itkShiftScaleImageFilter.h" #include "itkDiffusionQballPrepareVisualizationImageFilter.h" #include "itkDiffusionTensorPrincipleDirectionImageFilter.h" #include "itkDiffusionQballSphericalDeconvolutionImageFilter.h" #include "itkVectorImagesAngularErrorImageFilter.h" #include "mitkDicomDiffusionVolumeHeaderReader.h" #include "mitkGroupDiffusionHeadersFilter.h" #include "mitkDicomDiffusionVolumesReader.h" #include "mitkNrrdDiffusionVolumesWriter.h" #include "mitkNrrdDiffusionVolumesReader.h" #include "mitkDiffusionVolumes.h" #include "mitkDataTreeFilterFunctions.h" #include "mitkProgressBar.h" #include "mitkStatusBar.h" #include "mitkTeemDiffusionTensor3DReconstructionImageFilter.h" #include "mitkSurface.h" #include "mitkDataNodeFactory.h" #include "vtkPolyData.h" #include "vtkPoints.h" #include "vtkCellArray.h" #include "vtkDelaunay2D.h" #include "vtkCleanPolyData.h" #include "vtkAppendPolyData.h" #include "mitkImageCast.h" #include #include #include #define _USE_MATH_DEFINES #include #define DIFF_EST_PI M_PI typedef float TTensorPixelType; typedef itk::DiffusionTensor3D< TTensorPixelType > TensorPixelType; typedef itk::Image< TensorPixelType, 3 > TensorImageType; typedef itk::VectorImage< DiffusionPixelType, 3 > DiffusionImageType; //CAST_N_VEC(3) //CAST_N_VEC(42) //CAST_N_VEC(92) //CAST_N_VEC(162) //CAST_N_VEC(252) //CAST_N_VEC(362) //CAST_N_VEC(492) //CAST_N_VEC(642) //CAST_N_VEC(812) //CAST_N_VEC(1002) const int QmitkDiffusionTensorEstimation::odfsize = 252; const int QmitkDiffusionTensorEstimation::nrconvkernels = 252; // Compile-time Square Root Computation: ceil(sqrt(N)) template struct Root; template struct Root { static const int root = Mid; }; template struct Root { static const int mean = (Low + High)/2; static const bool down = (mean * mean >= Size); static const int root = Root::root; }; -QmitkDiffusionTensorEstimation::QmitkDiffusionTensorEstimation(QObject *parent, const char *name, QmitkStdMultiWidget *mitkStdMultiWidget, mitk::DataTreeIteratorBase* it) -: QmitkFunctionality(parent, name, it), m_MultiWidget(mitkStdMultiWidget), m_Controls(NULL) +QmitkDiffusionTensorEstimation::QmitkDiffusionTensorEstimation(QObject *parent, const char *name, mitk::DataTreeIteratorBase* it) +: QmitkAbstractView(parent, name, it), m_Controls(NULL) { SetAvailability(true); m_FilterInitialized = false; } QmitkDiffusionTensorEstimation::~QmitkDiffusionTensorEstimation() {} -QWidget * QmitkDiffusionTensorEstimation::CreateMainWidget(QWidget *parent) -{ - if ( m_MultiWidget == NULL ) - { - m_MultiWidget = new QmitkStdMultiWidget( parent ); - } - return m_MultiWidget; -} - QWidget * QmitkDiffusionTensorEstimation::CreateControlWidget(QWidget *parent) { if (m_Controls == NULL) { m_Controls = new QmitkDiffusionTensorEstimationControls(parent); } m_Controls->m_TensorEstimationTeemErrorImage->setChecked(false); m_Controls->m_TensorEstimationTeemSigmaEdit->setText("NaN"); m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("LLS (Linear Least Squares)"); m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("MLE (Maximum Likelihood)"); m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("NLS (Nonlinear Least Squares)"); m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("WLS (Weighted Least Squares)"); m_Controls->m_TensorEstimationTeemNumItsSpin->setValue(1); m_Controls->m_TensorEstimationTeemConfThresholdEdit->setText("NaN"); m_Controls->m_TensorEstimationTeemFuzzyEdit->setText("0.0"); m_Controls->m_TensorEstimationTeemMinValEdit->setText("1.0"); m_Controls->m_QBallReconstructionThreasholdEdit->setText("0.0"); m_Controls->m_QBallStandardAlgorithmsOrderSpinbox->setValue(0); m_Controls->m_QBallStandardAlgorithmsProbThreshEdit->setText(QString::number(1.0/double(odfsize))); m_Controls->m_QBallReconstructionNumberThreadsSpinbox->setValue(4); m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("2") ); m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("4") ); m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("6") ); m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("8") ); m_Controls->m_QBallReconstructionMaxLLevelComboBox->setCurrentItem( 3 ); m_Controls->m_QBallReconstructionNumberThreadsAnalyticalSpinbox->setValue(4); m_Controls->m_QBallReconstructionThreasholdAnalyticalEdit->setText("0.0"); m_Controls->m_QBallReconstructionLambdaLineEdit->setText("0.006"); m_Controls->m_QBallStandardAlgorithmsNumberThreadsSpinbox->setValue(4); m_Controls->m_QBallStandardAlgorithmsDeconvNumberThreadsSpinbox->setValue(4); m_Controls->m_QBallStandardAlgorithmsDeconvolutionThreshEdit->setText("0.1"); m_Controls->m_QBallStandardAlgorithmsDeconvolutionAngResThresholdEdit->setText("15"); m_Controls->m_QBallStandardAlgorithmsGFAParam1->setText("2"); m_Controls->m_QBallStandardAlgorithmsGFAParam2->setText("1"); return m_Controls; } void QmitkDiffusionTensorEstimation::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_TensorEstimationButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorEstimationButton())); connect( (QObject*)(m_Controls->m_QBallReconstructionButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallReconstructionButton())); connect( (QObject*)(m_Controls->m_QBallReconstructionAnalyticalButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallReconstructionAnalyticalButton())); connect( (QObject*)(m_Controls->m_TensorEstimationTeemEstimateButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorEstimationTeemEstimateButton())); connect( (QObject*)(m_Controls->m_TensorVolumesSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorVolumesSaveButton())); connect( (QObject*)(m_Controls->m_TensorVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorVolumesLoadButton())); connect( (QObject*)(m_Controls->m_TensorVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorVolumesRemoveButton())); connect( (QObject*)(m_Controls->m_StandardAlgorithmsFAButton), SIGNAL(clicked()),(QObject*) this, SLOT(StandardAlgorithmsFAButton())); connect( (QObject*)(m_Controls->m_StandardAlgorithmsRAButton), SIGNAL(clicked()),(QObject*) this, SLOT(StandardAlgorithmsRAButton())); connect( (QObject*)(m_Controls->m_StandardAlgorithmsDirectionButton), SIGNAL(clicked()),(QObject*) this, SLOT(StandardAlgorithmsDirectionButton())); connect( (QObject*)(m_Controls->m_QBallVolumesSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesSaveButton())); connect( (QObject*)(m_Controls->m_QBallVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesLoadButton())); connect( (QObject*)(m_Controls->m_QBallVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesRemoveButton())); connect( (QObject*)(m_Controls->m_QBallStandardAlgorithmsDirectionButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallStandardAlgorithmsDirectionButton())); connect( (QObject*)(m_Controls->m_QBallStandardAlgorithmsDeconvolutionButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallStandardAlgorithmsDeconvolutionButton())); connect( (QObject*)(m_Controls->m_QBallStandardAlgorithmsGFAButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallStandardAlgorithmsGFAButton())); connect( (QObject*)(m_Controls->m_QBallVolumesVisualizeSelectedButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesVisualizeSelectedButton())); connect( (QObject*)(m_Controls->m_DirectionVolumesSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesSaveButton())); connect( (QObject*)(m_Controls->m_DirectionVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesLoadButton())); connect( (QObject*)(m_Controls->m_DirectionVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesRemoveButton())); connect( (QObject*)(m_Controls->m_DirectionVolumesAngularErrorButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesAngularErrorButton())); connect( (QObject*)(m_Controls->m_DiffusionVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumesLoadButton())); connect( (QObject*)(m_Controls->m_DiffusionVolumeSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumeSaveButton())); connect( (QObject*)(m_Controls->m_DiffusionVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumesRemoveButton())); connect( (QObject*)(m_Controls->m_TensorEstimationDiffusionVolumesSelectAllButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumesSelectAll())); } } QAction * QmitkDiffusionTensorEstimation::CreateAction(QActionGroup *parent) { //action = new QAction( tr( "Brain Atrophy" ), pixmap, tr( "BrainAtrophy" ), 0, parent, "BrainAtrophy" ); QImage icon = qembed_findImage("QmitkDiffusionTensorEstimation"); QPixmap pixmap(icon); QAction* action; action = new QAction( tr( "Diffusion Tensor Estimation" ), pixmap, tr( "QmitkDiffusionTensorEstimation menu" ), 0, parent, "QmitkDiffusionTensorEstimation" ); return action; } void QmitkDiffusionTensorEstimation::TreeChanged() { m_Controls->m_TensorEstimationDiffusionVolumesSelector->Update(); m_Controls->m_TensorVolumesSelector->Update(); m_Controls->m_QBallVolumesSelector->Update(); m_Controls->m_DirectionVolumesSelector->Update(); if(m_DiffusionVolumesDataTreeFilter &&m_DiffusionVolumesDataTreeFilter->GetItems()->Size() > 0) { m_Controls->m_TensorEstimationButton->setEnabled(true); m_Controls->m_QBallReconstructionButton->setEnabled(true); m_Controls->m_QBallReconstructionAnalyticalButton->setEnabled(true); } else { m_Controls->m_QBallReconstructionButton->setEnabled(false); m_Controls->m_QBallReconstructionAnalyticalButton->setEnabled(false); m_Controls->m_TensorEstimationButton->setEnabled(false); } if(m_TensorVolumesDataTreeFilter && m_TensorVolumesDataTreeFilter->GetItems()->Size() > 0) { m_Controls->m_TensorVolumesSaveButton->setEnabled(true); m_Controls->m_TensorVolumesRemoveButton->setEnabled(true); } else { m_Controls->m_TensorVolumesSaveButton->setEnabled(false); m_Controls->m_TensorVolumesRemoveButton->setEnabled(false); } if(m_QballVolumesDataTreeFilter && m_QballVolumesDataTreeFilter->GetItems()->Size() > 0) { m_Controls->m_QBallVolumesSaveButton->setEnabled(true); m_Controls->m_QBallVolumesRemoveButton->setEnabled(true); m_Controls->m_QBallVolumesVisualizeSelectedButton->setEnabled(true); } else { m_Controls->m_QBallVolumesSaveButton->setEnabled(false); m_Controls->m_QBallVolumesRemoveButton->setEnabled(false); m_Controls->m_QBallVolumesVisualizeSelectedButton->setEnabled(false); } if(m_DirectionVolumesDataTreeFilter && m_DirectionVolumesDataTreeFilter->GetItems()->Size() > 0) { m_Controls->m_DirectionVolumesSaveButton->setEnabled(true); m_Controls->m_DirectionVolumesRemoveButton->setEnabled(true); } else { m_Controls->m_DirectionVolumesSaveButton->setEnabled(false); m_Controls->m_DirectionVolumesRemoveButton->setEnabled(false); } if(m_DirectionVolumesDataTreeFilter && m_DirectionVolumesDataTreeFilter->GetItems()->Size() > 1) { m_Controls->m_DirectionVolumesAngularErrorButton->setEnabled(true); } else { m_Controls->m_DirectionVolumesAngularErrorButton->setEnabled(false); } } void QmitkDiffusionTensorEstimation::Activated() { - QmitkFunctionality::Activated(); - if (m_FilterInitialized) return; // diffusion volumes filter m_DiffusionVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() ); m_DiffusionVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::MULTI_SELECT); m_DiffusionVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY); m_DiffusionVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataType >() ); // show diffusion volumes mitk::DataTreeFilter::PropertyList visible_props; visible_props.push_back("name"); m_DiffusionVolumesDataTreeFilter->SetVisibleProperties(visible_props); mitk::DataTreeFilter::PropertyList property_labels; property_labels.push_back("Diffusion Volumes"); m_DiffusionVolumesDataTreeFilter->SetPropertiesLabels(property_labels); m_Controls->m_TensorEstimationDiffusionVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() ); m_Controls->m_TensorEstimationDiffusionVolumesSelector->SetFilter( m_DiffusionVolumesDataTreeFilter ); m_Controls->m_TensorEstimationDiffusionVolumesSelector->SetAutoUpdate( false ); m_Controls->m_TensorEstimationDiffusionVolumesSelector->setStretchedColumn(1); // tensor volumes filter m_TensorVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() ); m_TensorVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::SINGLE_SELECT); m_TensorVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY); m_TensorVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataTypeWithBoolProperty("IsTensorVolume") ); // show tensor volumes m_TensorVolumesDataTreeFilter->SetVisibleProperties(visible_props); mitk::DataTreeFilter::PropertyList tensor_property_labels; tensor_property_labels.push_back("Tensor Volumes"); m_TensorVolumesDataTreeFilter->SetPropertiesLabels(tensor_property_labels); m_Controls->m_TensorVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() ); m_Controls->m_TensorVolumesSelector->SetFilter( m_TensorVolumesDataTreeFilter ); m_Controls->m_TensorVolumesSelector->SetAutoUpdate( false ); m_Controls->m_TensorVolumesSelector->setStretchedColumn(1); // qBall volumes filter m_QballVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() ); m_QballVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::MULTI_SELECT); m_QballVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY); m_QballVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataTypeWithBoolProperty("IsQBallVolume") ); m_QballVolumesDataTreeFilter->SetVisibleProperties(visible_props); mitk::DataTreeFilter::PropertyList qball_property_labels; qball_property_labels.push_back("Q-Ball Volumes"); m_QballVolumesDataTreeFilter->SetPropertiesLabels(qball_property_labels); m_Controls->m_QBallVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() ); m_Controls->m_QBallVolumesSelector->SetFilter( m_QballVolumesDataTreeFilter ); m_Controls->m_QBallVolumesSelector->SetAutoUpdate( false ); m_Controls->m_QBallVolumesSelector->setStretchedColumn(1); // direction volumes filter m_DirectionVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() ); m_DirectionVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::MULTI_SELECT); m_DirectionVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY); m_DirectionVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataTypeWithBoolProperty("IsDirectionVolume") ); m_DirectionVolumesDataTreeFilter->SetVisibleProperties(visible_props); mitk::DataTreeFilter::PropertyList direction_property_labels; direction_property_labels.push_back("Direction Volumes"); m_DirectionVolumesDataTreeFilter->SetPropertiesLabels(direction_property_labels); m_Controls->m_DirectionVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() ); m_Controls->m_DirectionVolumesSelector->SetFilter( m_DirectionVolumesDataTreeFilter ); m_Controls->m_DirectionVolumesSelector->SetAutoUpdate( false ); m_Controls->m_DirectionVolumesSelector->setStretchedColumn(1); m_FilterInitialized = true; TreeChanged(); } +void QmitkDiffusionTensorEstimation::Deactivated() +{ +} + +void QmitkDiffusionTensorEstimation::Visible() +{ +} + +void QmitkDiffusionTensorEstimation::Hidden() +{ +} + void QmitkDiffusionTensorEstimation::TensorVolumesSaveButton() { // GET SELECTED ITEM const mitk::DataTreeFilter::Item* selectedItem = m_TensorVolumesDataTreeFilter->GetSelectedItem(); if( !selectedItem ) return; mitk::Image::Pointer tensorVol = static_cast(selectedItem->GetNode()->GetData()); TensorImageType::Pointer itkTensorVol = TensorImageType::New(); mitk::CastToItkImage(tensorVol, itkTensorVol); // SELECT FILE DIALOG std::string sName = selectedItem->GetNode()->GetName(); QString qName; qName.sprintf("%s.nhdr",sName.c_str()); QString filename = QFileDialog::getSaveFileName( qName, "Nrrd Images (*.nrrd *.nhdr)", this->m_Controls, "save file dialog", "Select Nrrd Outputfile" ); if ( !filename ) return; // WRITING TENSORS TO FILE MBI_INFO << "Writing tensors "; typedef itk::ImageFileWriter TensorWriterType; TensorWriterType::Pointer tensorWriter = TensorWriterType::New(); tensorWriter->SetFileName(filename.ascii()); tensorWriter->SetInput(itkTensorVol); tensorWriter->Update(); } void QmitkDiffusionTensorEstimation::TensorVolumesLoadButton() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE ); w->setMode( QFileDialog::ExistingFiles ); w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; QStringList filenames = w->selectedFiles(); QStringList::Iterator it = filenames.begin(); while( it != filenames.end() ) { std::string filename = ( *it ).ascii(); ++it; // READING TENSOR VOLUME typedef itk::ImageFileReader ReaderType; ReaderType::Pointer tensorReader = ReaderType::New(); tensorReader->SetFileName(filename); try { tensorReader->Update(); } catch (itk::ExceptionObject e) { std::cout << e << std::endl; } // Tensorvolume mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( tensorReader->GetOutput() ); image->SetVolume( tensorReader->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename)); node->SetProperty( "IsTensorVolume", mitk::BoolProperty::New( true ) ); TreeChanged(); } } void QmitkDiffusionTensorEstimation::TensorVolumesRemoveButton() { m_TensorVolumesDataTreeFilter->DeleteSelectedItems(); } void QmitkDiffusionTensorEstimation::QBallVolumesSaveButton() { // GET SELECTED ITEM const mitk::DataTreeFilter::Item* selectedItem = m_QballVolumesDataTreeFilter->GetSelectedItem(); if( !selectedItem ) return; mitk::Image::Pointer qBallVol = static_cast(selectedItem->GetNode()->GetData()); if( !qBallVol)return; typedef itk::Image,3 > IType; IType::Pointer itkQBallVol = IType::New(); mitk::CastToItkImage(qBallVol, itkQBallVol); typedef itk::VectorImage VarVecImgType; VarVecImgType::Pointer vecImg = VarVecImgType::New(); vecImg->SetSpacing( itkQBallVol->GetSpacing() ); // Set the image spacing vecImg->SetOrigin( itkQBallVol->GetOrigin() ); // Set the image origin vecImg->SetDirection( itkQBallVol->GetDirection() ); // Set the image direction vecImg->SetLargestPossibleRegion( itkQBallVol->GetLargestPossibleRegion()); vecImg->SetBufferedRegion( itkQBallVol->GetLargestPossibleRegion() ); vecImg->SetVectorLength(odfsize); vecImg->Allocate(); itk::ImageRegionIterator ot (vecImg, vecImg->GetLargestPossibleRegion() ); ot = ot.Begin(); itk::ImageRegionIterator it (itkQBallVol, itkQBallVol->GetLargestPossibleRegion() ); it = it.Begin(); MBI_DEBUG << it.Get(); for (it = it.Begin(); !it.IsAtEnd(); ++it) { itk::Vector vec = it.Get(); VarVecImgType::PixelType varvec(vec.GetDataPointer(), odfsize); ot.Set(varvec); ++ot; } // SELECT FILE DIALOG std::string sName = selectedItem->GetNode()->GetName(); QString qName; qName.sprintf("%s.nhdr",sName.c_str()); QString filename = QFileDialog::getSaveFileName( qName, "Nrrd Images (*.nrrd *.nhdr)", this->m_Controls, "save file dialog", "Select Nrrd Outputfile" ); if ( !filename ) return; // WRITING TENSORS TO FILE MBI_INFO << "Writing data "; typedef itk::ImageFileWriter QBallWriterType; QBallWriterType::Pointer qballWriter = QBallWriterType::New(); qballWriter->SetFileName(filename.ascii()); qballWriter->SetInput(vecImg); qballWriter->Update(); } void QmitkDiffusionTensorEstimation::QBallVolumesLoadButton() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE ); w->setMode( QFileDialog::ExistingFiles ); w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; QStringList filenames = w->selectedFiles(); QStringList::Iterator it = filenames.begin(); while( it != filenames.end() ) { std::string filename = ( *it ).ascii(); ++it; // READING TENSOR VOLUME typedef itk::Image,3 > IVType; typedef itk::ImageFileReader ReaderType; ReaderType::Pointer qballReader = ReaderType::New(); qballReader->SetFileName(filename); try { qballReader->Update(); } catch (itk::ExceptionObject e) { MBI_LOG << e; } //itk::ImageRegionConstIterator it (qballReader->GetOutput(), qballReader->GetOutput()->GetLargestPossibleRegion() ); //it = it.Begin(); //std::cout << it.Get() << std::endl; // Tensorvolume mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( qballReader->GetOutput() ); image->SetVolume( qballReader->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename)); node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) ); node->SetProperty( "visible", mitk::BoolProperty::New( false ) ); TreeChanged(); } } void QmitkDiffusionTensorEstimation::QBallVolumesRemoveButton() { m_QballVolumesDataTreeFilter->DeleteSelectedItems(); } void QmitkDiffusionTensorEstimation::QBallVolumesVisualizeSelectedButton() { itk::TimeProbe clock; QString status; const mitk::DataTreeFilter::Item* item = m_QballVolumesDataTreeFilter->GetSelectedItem(); if(!item)return; typedef itk::Vector OdfVectorType; typedef itk::Image OdfVectorImgType; mitk::Image* vol = static_cast(item->GetNode()->GetData()); OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename = item->GetProperty("name"); // PREPARE FOR VISUALIZATION clock.Start(); MBI_INFO << "Preparing for Visualization "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Preparing for Visualization of %s", nodename.c_str())); typedef itk::DiffusionQballPrepareVisualizationImageFilter FilterType; FilterType::Pointer filter = FilterType::New(); filter->SetInput(itkvol); filter->SetNumberOfThreads(4); switch(m_Controls->m_QBallVolumesVisualizeNormalizationMethod->currentItem()) { case 0: { filter->SetNormalizationMethod(FilterType::PV_MIN_MAX); break; } case 1: { filter->SetNormalizationMethod(FilterType::PV_NONE); break; } case 2: { filter->SetNormalizationMethod(FilterType::PV_MAX); break; } case 3: { filter->SetNormalizationMethod(FilterType::PV_GLOBAL_MAX); break; } case 4: { filter->SetNormalizationMethod(FilterType::PV_MIN_MAX_INVERT); break; } default: { filter->SetNormalizationMethod(FilterType::PV_MIN_MAX); break; } } if(m_Controls->m_QBallVolumesVisualizeScaleGfaCheckbox->isChecked() ) { typedef itk::DiffusionQballGeneralizedFaImageFilter GfaFilterType; filter->SetDoScaleGfa(true); float p1 = m_Controls->m_QBallStandardAlgorithmsGFAParam1->text().toFloat(); float p2 = m_Controls->m_QBallStandardAlgorithmsGFAParam2->text().toFloat(); switch(m_Controls->m_QBallStandardAlgorithmsGFAMethod->currentItem()) { case 0: filter->SetScaleByGfaType(GfaFilterType::GFA_STANDARD); break; case 1: filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILES_HIGH_LOW); break; case 2: filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILE_HIGH); break; case 3: filter->SetScaleByGfaType(GfaFilterType::GFA_MAX_ODF_VALUE); break; case 4: filter->SetScaleByGfaType(GfaFilterType::GFA_DECONVOLUTION_COEFFS); break; case 5: filter->SetScaleByGfaType(GfaFilterType::GFA_MIN_MAX_NORMALIZED_STANDARD); break; case 6: filter->SetScaleByGfaType(GfaFilterType::GFA_NORMALIZED_ENTROPY); break; case 7: filter->SetScaleByGfaType(GfaFilterType::GFA_NEMATIC_ORDER_PARAMETER); break; case 8: filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILES_LOW_HIGH); break; case 9: filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILE_LOW); break; case 10: filter->SetScaleByGfaType(GfaFilterType::GFA_MIN_ODF_VALUE); break; case 11: filter->SetScaleByGfaType(GfaFilterType::GFA_STD_BY_MAX); break; case 12: filter->SetScaleByGfaType(GfaFilterType::GFA_PRINCIPLE_CURVATURE); filter->SetGfaParam1(p1); break; case 13: filter->SetScaleByGfaType(GfaFilterType::GFA_GENERALIZED_GFA); filter->SetGfaParam1(p1); filter->SetGfaParam2(p2); break; default: filter->SetScaleByGfaType(GfaFilterType::GFA_STANDARD); } } filter->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s."; // VIZ TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( filter->GetOutput() ); image->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, nodename.append(" Viz")); node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) ); node->SetProperty( "ShowMaxNumber", mitk::IntProperty::New( 1500 ) ); node->SetProperty( "DoRefresh", mitk::BoolProperty::New( true ) ); node->SetProperty( "layer", mitk::IntProperty::New( 1 ) ); node->SetProperty( "global_scaling", mitk::FloatProperty::New( 1.0 ) ); mitk::OdfVtkMapper2D::Pointer odfMapper = mitk::OdfVtkMapper2D::New(); node->SetMapper(1,odfMapper); mitk::StatusBar::GetInstance()->DisplayText("Computation complete."); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } void QmitkDiffusionTensorEstimation::DirectionVolumesSaveButton() { // GET SELECTED ITEM const mitk::DataTreeFilter::Item* selectedItem = m_DirectionVolumesDataTreeFilter->GetSelectedItem(); if( !selectedItem ) return; mitk::Image::Pointer vol = static_cast(selectedItem->GetNode()->GetData()); if( !vol)return; typedef itk::Image,3 > IType; IType::Pointer itkVol = IType::New(); mitk::CastToItkImage(vol, itkVol); typedef itk::VectorImage VarVecImgType; VarVecImgType::Pointer vecImg = VarVecImgType::New(); vecImg->SetSpacing( itkVol->GetSpacing() ); // Set the image spacing vecImg->SetOrigin( itkVol->GetOrigin() ); // Set the image origin vecImg->SetDirection( itkVol->GetDirection() ); // Set the image direction vecImg->SetLargestPossibleRegion( itkVol->GetLargestPossibleRegion()); vecImg->SetBufferedRegion( itkVol->GetLargestPossibleRegion() ); vecImg->SetVectorLength(3); vecImg->Allocate(); itk::ImageRegionIterator ot (vecImg, vecImg->GetLargestPossibleRegion() ); ot = ot.Begin(); itk::ImageRegionIterator it (itkVol, itkVol->GetLargestPossibleRegion() ); it = it.Begin(); for (it = it.Begin(); !it.IsAtEnd(); ++it) { itk::Vector vec = it.Get(); VarVecImgType::PixelType varvec(vec.GetDataPointer(), 3); ot.Set(varvec); ++ot; } // SELECT FILE DIALOG std::string sName = selectedItem->GetNode()->GetName(); QString qName; qName.sprintf("%s.nhdr",sName.c_str()); QString filename = QFileDialog::getSaveFileName( qName, "Nrrd Images (*.nrrd *.nhdr)", this->m_Controls, "save file dialog", "Select Nrrd Outputfile" ); if ( !filename ) return; // WRITING TENSORS TO FILE MBI_INFO << "Writing data "; typedef itk::ImageFileWriter WriterType; WriterType::Pointer writer = WriterType::New(); writer->SetFileName(filename.ascii()); writer->SetInput(vecImg); writer->Update(); } void QmitkDiffusionTensorEstimation::DirectionVolumesLoadButton() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE ); w->setMode( QFileDialog::ExistingFiles ); w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; QStringList filenames = w->selectedFiles(); QStringList::Iterator it = filenames.begin(); while( it != filenames.end() ) { std::string filename = ( *it ).ascii(); ++it; // READING VOLUME typedef itk::Image,3 > IType; typedef itk::ImageFileReader ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(filename); try { reader->Update(); } catch (itk::ExceptionObject e) { MBI_INFO << e << std::endl; } // Tensorvolume mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( reader->GetOutput() ); image->SetVolume( reader->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename)); node->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) ); mitk::VectorImageMapper2D::Pointer mapper = mitk::VectorImageMapper2D::New(); node->SetMapper(1,mapper); TreeChanged(); } } void QmitkDiffusionTensorEstimation::DirectionVolumesRemoveButton() { m_DirectionVolumesDataTreeFilter->DeleteSelectedItems(); } void QmitkDiffusionTensorEstimation::TensorEstimationTeemEstimateButton() { try { itk::TimeProbe clock; const mitk::DataTreeFilter::ItemSet* selectedItems = m_DiffusionVolumesDataTreeFilter->GetSelectedItems(); int nrFiles = selectedItems->size(); if (!nrFiles) return; QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles); mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() ); mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() ); std::vector nodes; while ( itemiter != itemiterend ) // for all items { mitk::DiffusionVolumes* vols = static_cast*>( (*itemiter)->GetNode()->GetData()); std::string nodename = (*itemiter)->GetProperty("name"); itemiter++; // TENSOR RECONSTRUCTION clock.Start(); MBI_INFO << "Teem Tensor reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Teem Tensor reconstruction for %s", nodename.c_str())); typedef mitk::TeemDiffusionTensor3DReconstructionImageFilter< DiffusionPixelType, TTensorPixelType > TensorReconstructionImageFilterType; TensorReconstructionImageFilterType::Pointer tensorReconstructionFilter = TensorReconstructionImageFilterType::New(); tensorReconstructionFilter->SetInput( vols ); tensorReconstructionFilter->SetEstimateErrorImage( m_Controls->m_TensorEstimationTeemErrorImage->isChecked() ); if(!m_Controls->m_TensorEstimationTeemSigmaEdit->text().contains(QString("NaN"))) tensorReconstructionFilter->SetSigma( m_Controls->m_TensorEstimationTeemSigmaEdit->text().toFloat() ); switch(m_Controls->m_TensorEstimationTeemEstimationMethodCombo->currentItem()) { case 0: tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsLLS); break; case 1: tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsNLS); break; case 2: tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsWLS); break; case 3: tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsMLE); break; default: tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsLLS); } tensorReconstructionFilter->SetNumIterations( m_Controls->m_TensorEstimationTeemNumItsSpin->value() ); if(!m_Controls->m_TensorEstimationTeemConfThresholdEdit->text().contains(QString("NaN"))) tensorReconstructionFilter->SetConfidenceThreshold( m_Controls->m_TensorEstimationTeemConfThresholdEdit->text().toDouble() ); tensorReconstructionFilter->SetConfidenceFuzzyness( m_Controls->m_TensorEstimationTeemFuzzyEdit->text().toFloat() ); tensorReconstructionFilter->SetMinPlausibleValue( m_Controls->m_TensorEstimationTeemMinValEdit->text().toDouble() ); tensorReconstructionFilter->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s."; // TENSORS TO DATATREE //mitk::DataNode::Pointer node=mitk::DataNode::New(); //node->SetData( tensorReconstructionFilter->GetOutput() ); //mitk::DataStorage::GetInstance()->Add(node); //SetDefaultNodeProperties(node, nodename.append(" tensors")); //node->SetProperty( "IsConfidenceTensorVolume", mitk::BoolProperty::New( true ) ); mitk::DataNode::Pointer node2=mitk::DataNode::New(); node2->SetData( tensorReconstructionFilter->GetOutputItk() ); SetDefaultNodeProperties(node2, nodename.append(" (itk)")); node2->SetProperty( "IsTensorVolume", mitk::BoolProperty::New( true ) ); nodes.push_back(node2); mitk::ProgressBar::GetInstance()->Progress(); } std::vector::iterator nodeIt; for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt) mitk::DataStorage::GetInstance()->Add(*nodeIt); mitk::ProgressBar::GetInstance()->Progress(); TreeChanged(); m_Controls->update(); mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles)); } catch (itk::ExceptionObject &ex) { MBI_INFO << ex; return ; } } void QmitkDiffusionTensorEstimation::TensorEstimationButton() { try { itk::TimeProbe clock; const mitk::DataTreeFilter::ItemSet* selectedItems = m_DiffusionVolumesDataTreeFilter->GetSelectedItems(); int nrFiles = selectedItems->size(); if (!nrFiles) return; QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles); mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() ); mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() ); std::vector nodes; while ( itemiter != itemiterend ) // for all items { mitk::DiffusionVolumes* vols = static_cast*>( (*itemiter)->GetNode()->GetData()); std::string nodename = (*itemiter)->GetProperty("name"); itemiter++; // TENSOR RECONSTRUCTION clock.Start(); MBI_INFO << "Tensor reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Tensor reconstruction for %s", nodename.c_str())); typedef itk::DiffusionTensor3DReconstructionImageFilter< DiffusionPixelType, DiffusionPixelType, TTensorPixelType > TensorReconstructionImageFilterType; TensorReconstructionImageFilterType::Pointer tensorReconstructionFilter = TensorReconstructionImageFilterType::New(); tensorReconstructionFilter->SetGradientImage( vols->GetDirections(), vols->GetImage() ); tensorReconstructionFilter->SetNumberOfThreads( m_Controls->m_TensorEstimationNumberThreadsSpinbox->value() ); tensorReconstructionFilter->SetBValue(vols->GetB_Value()); tensorReconstructionFilter->SetThreshold( m_Controls->m_TensorEstimationThreasholdEdit->text().toFloat() ); tensorReconstructionFilter->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s."; // TENSORS TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( tensorReconstructionFilter->GetOutput() ); image->SetVolume( tensorReconstructionFilter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); SetDefaultNodeProperties(node, nodename.append(" tensors")); node->SetProperty( "IsTensorVolume", mitk::BoolProperty::New( true ) ); nodes.push_back(node); mitk::ProgressBar::GetInstance()->Progress(); } std::vector::iterator nodeIt; for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt) mitk::DataStorage::GetInstance()->Add(*nodeIt); mitk::ProgressBar::GetInstance()->Progress(); TreeChanged(); m_Controls->update(); mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles)); } catch (itk::ExceptionObject &ex) { MBI_INFO << ex; return ; } } void QmitkDiffusionTensorEstimation::QBallReconstructionButton() { try { itk::TimeProbe clock; const mitk::DataTreeFilter::ItemSet* selectedItems = m_DiffusionVolumesDataTreeFilter->GetSelectedItems(); int nrFiles = selectedItems->size(); if (!nrFiles) return; QString status; mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles); mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() ); mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() ); std::vector nodes; while ( itemiter != itemiterend ) // for all items { mitk::DiffusionVolumes* vols = static_cast*>( (*itemiter)->GetNode()->GetData()); std::string nodename = (*itemiter)->GetProperty("name"); ++itemiter; // QBALL RECONSTRUCTION clock.Start(); MBI_INFO << "QBall reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "QBall reconstruction for %s", nodename.c_str())); typedef itk::DiffusionQballReconstructionImageFilter< DiffusionPixelType, DiffusionPixelType, TTensorPixelType, odfsize> //int NOdfDirections = 162, QballReconstructionImageFilterType; QballReconstructionImageFilterType::Pointer filter = QballReconstructionImageFilterType::New(); filter->SetGradientImage( vols->GetDirections(), vols->GetImage() ); filter->SetNumberOfThreads( m_Controls->m_QBallReconstructionNumberThreadsSpinbox->value() ); filter->SetBValue(vols->GetB_Value()); filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdEdit->text().toFloat() ); int normalization = m_Controls->m_QBallReconstructionPostprocessingMethod->currentItem(); switch(normalization) { case 0: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD); break; } case 1: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO_B_VALUE); break; } case 2: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO); break; } case 3: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_NONE); break; } default: { filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD); } } filter->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s." << std::endl; // ODFs TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( filter->GetOutput() ); //image->SetImportVolume( filter->GetOutput()->GetBufferPointer(), 0, 0, mitk::Image::ImportMemoryManagementType::ManageMemory ); image->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); QString newname; newname = newname.append(nodename.c_str()); newname = newname.append("_QN%1").arg(normalization); SetDefaultNodeProperties(node, newname.ascii()); node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) ); nodes.push_back(node); // B-Zero TO DATATREE mitk::Image::Pointer image4 = mitk::Image::New(); image4->InitializeByItk( filter->GetBZeroImage().GetPointer() ); image4->SetVolume( filter->GetBZeroImage()->GetBufferPointer() ); mitk::DataNode::Pointer node4=mitk::DataNode::New(); node4->SetData( image4 ); SetDefaultNodeProperties(node4, nodename.append("B0")); nodes.push_back(node4); mitk::ProgressBar::GetInstance()->Progress(); } std::vector::iterator nodeIt; for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt) mitk::DataStorage::GetInstance()->Add(*nodeIt); mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles)); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } catch (itk::ExceptionObject &ex) { MBI_INFO << ex; return ; } } template void QmitkDiffusionTensorEstimation::ReconstructAnalytically( mitk::DiffusionVolumes* vols, float lambda, std::string nodename, std::vector* nodes) { typedef itk::AnalyticalDiffusionQballReconstructionImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); filter->SetGradientImage( vols->GetDirections(), vols->GetImage() ); filter->SetNumberOfThreads( m_Controls->m_QBallReconstructionNumberThreadsAnalyticalSpinbox->value() ); filter->SetBValue(vols->GetB_Value()); filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdAnalyticalEdit->text().toFloat() ); filter->SetLambda(lambda); filter->SetAdcProfileOnly(m_Controls->m_QBallReconstructionAdcOnlyCheckbox->isChecked()); int normalization = m_Controls->m_QBallReconstructionPostprocessingMethodAnalytical->currentItem(); switch(normalization) { case 0: { filter->SetNormalizationMethod(FilterType::QBAR_STANDARD); break; } case 1: { filter->SetNormalizationMethod(FilterType::QBAR_B_ZERO_B_VALUE); break; } case 2: { filter->SetNormalizationMethod(FilterType::QBAR_B_ZERO); break; } case 3: { filter->SetNormalizationMethod(FilterType::QBAR_NONE); break; } default: { filter->SetNormalizationMethod(FilterType::QBAR_STANDARD); } } filter->Update(); // ODFs TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( filter->GetOutput() ); image->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); nodes->push_back(node); QString newname; newname = newname.append(nodename.c_str()); newname = newname.append("_QA%1").arg(normalization); SetDefaultNodeProperties(node, newname.ascii()); node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) ); // B-Zero TO DATATREE mitk::Image::Pointer image4 = mitk::Image::New(); image4->InitializeByItk( filter->GetBZeroImage().GetPointer() ); image4->SetVolume( filter->GetBZeroImage()->GetBufferPointer() ); mitk::DataNode::Pointer node4=mitk::DataNode::New(); node4->SetData( image4 ); nodes->push_back(node4); SetDefaultNodeProperties(node4, nodename.append("B0")); } void QmitkDiffusionTensorEstimation::QBallReconstructionAnalyticalButton() { try { itk::TimeProbe clock; const mitk::DataTreeFilter::ItemSet* selectedItems = m_DiffusionVolumesDataTreeFilter->GetSelectedItems(); int nrFiles = selectedItems->size(); if (!nrFiles) return; std::vector lambdas; float minLambda = m_Controls->m_QBallReconstructionLambdaLineEdit->text().toFloat(); if(m_Controls->m_QBallReconstructionLambdaMultiCheckbox->isChecked()) { float stepLambda = m_Controls->m_QBallReconstructionLambdaStepLineEdit->text().toFloat(); float maxLambda = m_Controls->m_QBallReconstructionLambdaMaxLineEdit->text().toFloat(); for(float l=minLambda; lAddStepsToDo(nrFiles*nLambdas); mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() ); mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() ); std::vector* nodes = new std::vector(); while ( itemiter != itemiterend ) // for all items { mitk::DiffusionVolumes* vols = static_cast*>( (*itemiter)->GetNode()->GetData()); std::string nodename = (*itemiter)->GetProperty("name"); itemiter++; // QBALL RECONSTRUCTION clock.Start(); MBI_INFO << "QBall reconstruction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "QBall reconstruction for %s", nodename.c_str())); for(int i=0; im_QBallReconstructionMaxLLevelComboBox->currentItem()) { case 0: { ReconstructAnalytically<2>(vols, currentLambda, nodename, nodes); break; } case 1: { ReconstructAnalytically<4>(vols, currentLambda, nodename, nodes); break; } case 2: { ReconstructAnalytically<6>(vols, currentLambda, nodename, nodes); break; } case 3: { ReconstructAnalytically<8>(vols, currentLambda, nodename, nodes); break; } } clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s."; mitk::ProgressBar::GetInstance()->Progress(); } } std::vector::iterator nodeIt; for(nodeIt = nodes->begin(); nodeIt != nodes->end(); ++nodeIt) mitk::DataStorage::GetInstance()->Add(*nodeIt); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles)); } catch (itk::ExceptionObject &ex) { MBI_INFO << ex; return ; } } void QmitkDiffusionTensorEstimation::StandardAlgorithmsFAButton() { itk::TimeProbe clock; QString status; const mitk::DataTreeFilter::Item* item = m_TensorVolumesDataTreeFilter->GetSelectedItem(); if(!item)return; mitk::Image* vol = static_cast(item->GetNode()->GetData()); itk::Image::Pointer itkvol = itk::Image::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename = item->GetProperty("name"); // COMPUTE FA clock.Start(); MBI_INFO << "Computing FA "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing FA for %s", nodename.c_str())); typedef TensorPixelType::RealValueType RealValueType; typedef itk::Image< RealValueType, 3 > FAImageType; typedef itk::TensorFractionalAnisotropyImageFilter< TensorImageType, FAImageType > FAFilterType; FAFilterType::Pointer fractionalAnisotropyFilter = FAFilterType::New(); fractionalAnisotropyFilter->SetInput( itkvol ); typedef itk::ShiftScaleImageFilter ShiftScaleFilterType; ShiftScaleFilterType::Pointer multi = ShiftScaleFilterType::New(); multi->SetShift(0); multi->SetScale(200);//itk::NumericTraits::max() multi->SetInput(fractionalAnisotropyFilter->GetOutput()); multi->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s."; // FA TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( multi->GetOutput() ); image->SetVolume( multi->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, nodename.append(" FA")); node->SetProperty( "IsFAVolume", mitk::BoolProperty::New( true ) ); mitk::StatusBar::GetInstance()->DisplayText("Computation complete."); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } void QmitkDiffusionTensorEstimation::StandardAlgorithmsRAButton() { itk::TimeProbe clock; QString status; const mitk::DataTreeFilter::Item* item = m_TensorVolumesDataTreeFilter->GetSelectedItem(); if(!item)return; mitk::Image* vol = static_cast(item->GetNode()->GetData()); itk::Image::Pointer itkvol = itk::Image::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename = item->GetProperty("name"); // COMPUTE RA clock.Start(); MBI_INFO << "Computing RA "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing RA for %s", nodename.c_str())); typedef TensorPixelType::RealValueType RealValueType; typedef itk::Image< RealValueType, 3 > RAImageType; typedef itk::TensorRelativeAnisotropyImageFilter< TensorImageType, RAImageType > RAFilterType; RAFilterType::Pointer relativeAnisotropyFilter = RAFilterType::New(); relativeAnisotropyFilter->SetInput( itkvol ); relativeAnisotropyFilter->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s."; // FA TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( relativeAnisotropyFilter->GetOutput() ); image->SetVolume( relativeAnisotropyFilter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, nodename.append(" RA")); node->SetProperty( "IsRAVolume", mitk::BoolProperty::New( true ) ); mitk::StatusBar::GetInstance()->DisplayText("Computation complete."); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } void QmitkDiffusionTensorEstimation::StandardAlgorithmsDirectionButton() { itk::TimeProbe clock; QString status; const mitk::DataTreeFilter::Item* item = m_TensorVolumesDataTreeFilter->GetSelectedItem(); if(!item)return; typedef itk::DiffusionTensor3D TensorType; typedef itk::Image TensorImgType; mitk::Image* vol = static_cast(item->GetNode()->GetData()); TensorImgType::Pointer itkvol = TensorImgType::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename = item->GetProperty("name"); clock.Start(); MBI_INFO << "Computing Diffusion Direction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing Diffusion Direction for %s", nodename.c_str())); typedef itk::DiffusionTensorPrincipleDirectionImageFilter FilterType; FilterType::Pointer filter = FilterType::New(); filter->SetInput(itkvol); filter->SetNumberOfThreads(4); filter->Update(); itk::ImageRegionIterator it (filter->GetOutput(), filter->GetOutput()->GetLargestPossibleRegion() ); it = it.Begin(); // VECTORFIELD MBI_DEBUG << "Converting to Vectorfield"; typedef itk::Image, 3> VecImgType2; VecImgType2::Pointer vecImg5 = VecImgType2::New(); vecImg5->SetSpacing( itkvol->GetSpacing() ); // Set the image spacing vecImg5->SetOrigin( itkvol->GetOrigin() ); // Set the image origin vecImg5->SetDirection( itkvol->GetDirection() ); // Set the image direction vecImg5->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion()); vecImg5->SetBufferedRegion( vecImg5->GetLargestPossibleRegion() ); vecImg5->Allocate(); itk::ImageRegionIterator ot5 (vecImg5, vecImg5->GetLargestPossibleRegion() ); ot5 = ot5.Begin(); typedef FilterType::OutputImageType::PixelType VecPixType; for (it = it.Begin(); !it.IsAtEnd(); ++it) { VecPixType vec = it.Get(); itk::Vector pix; TTensorPixelType uvec[3] = {(TTensorPixelType)(vec[0]),(TTensorPixelType)(vec[1]),(TTensorPixelType)(vec[2])}; //TTensorPixelType uvec[3] = {(TTensorPixelType)(vec[1]),(TTensorPixelType)(-vec[0]),(TTensorPixelType)(vec[2])}; pix = uvec; ot5.Set(pix); ++ot5; } // Vectors TO DATATREE mitk::Image::Pointer image5 = mitk::Image::New(); image5->InitializeByItk( vecImg5.GetPointer() ); image5->SetVolume( vecImg5->GetBufferPointer() ); mitk::DataNode::Pointer node5=mitk::DataNode::New(); node5->SetData( image5 ); node5->SetName( nodename.append(" vecs").c_str()); mitk::DataStorage::GetInstance()->Add(node5); node5->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) ); node5->SetProperty( "NormalizeVecs", mitk::BoolProperty::New( true ) ); node5->SetProperty( "Scale", mitk::FloatProperty::New( 1.0 ) ); node5->SetProperty( "LineWidth", mitk::FloatProperty::New( 1 ) ); mitk::VectorImageMapper2D::Pointer vecMapper5 = mitk::VectorImageMapper2D::New(); node5->SetMapper(1,vecMapper5); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } void QmitkDiffusionTensorEstimation::QBallStandardAlgorithmsGFAButton() { itk::TimeProbe clock; QString status; const mitk::DataTreeFilter::ItemSet* selectedItems = m_QballVolumesDataTreeFilter->GetSelectedItems(); int nrFiles = selectedItems->size(); if (!nrFiles) return; mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() ); mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() ); std::vector nodes; while ( itemiter != itemiterend ) // for all items { typedef itk::Vector OdfVectorType; typedef itk::Image OdfVectorImgType; mitk::Image* vol = static_cast((*itemiter)->GetNode()->GetData()); OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename = (*itemiter)->GetProperty("name"); ++itemiter; float p1 = m_Controls->m_QBallStandardAlgorithmsGFAParam1->text().toFloat(); float p2 = m_Controls->m_QBallStandardAlgorithmsGFAParam2->text().toFloat(); // COMPUTE RA clock.Start(); MBI_INFO << "Computing GFA "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing GFA for %s", nodename.c_str())); typedef OdfVectorType::ValueType RealValueType; typedef itk::Image< RealValueType, 3 > RAImageType; typedef itk::DiffusionQballGeneralizedFaImageFilter GfaFilterType; GfaFilterType::Pointer gfaFilter = GfaFilterType::New(); gfaFilter->SetInput(itkvol); gfaFilter->SetNumberOfThreads(4); double scale = 1; std::string newname; newname.append(nodename); newname.append(" GFA"); switch(m_Controls->m_QBallStandardAlgorithmsGFAMethod->currentItem()) { case 0: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_STANDARD); newname.append("00"); scale = 200.0; break; } case 1: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILES_HIGH_LOW); newname.append("01"); scale = 200.0; break; } case 2: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILE_HIGH); newname.append("02"); scale = 200.0; break; } case 3: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_MAX_ODF_VALUE); newname.append("03"); scale = 200.0; break; } case 4: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_DECONVOLUTION_COEFFS); newname.append("04"); scale = 200.0; break; } case 5: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_MIN_MAX_NORMALIZED_STANDARD); newname.append("05"); scale = 200.0; break; } case 6: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_NORMALIZED_ENTROPY); newname.append("06"); break; } case 7: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_NEMATIC_ORDER_PARAMETER); newname.append("07"); scale = 200.0; break; } case 8: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILES_LOW_HIGH); newname.append("08"); scale = 200.0; break; } case 9: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILE_LOW); newname.append("09"); scale = 200.0; break; } case 10: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_MIN_ODF_VALUE); newname.append("10"); scale = 200.0; break; } case 11: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_STD_BY_MAX); newname.append("11"); scale = 200.0; break; } case 12: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_PRINCIPLE_CURVATURE); newname.append("12"); gfaFilter->SetParam1(p1); scale = 200.0; break; } case 13: { gfaFilter->SetComputationMethod(GfaFilterType::GFA_GENERALIZED_GFA); QString paramString; paramString = paramString.append(" K%1P%2").arg(p1).arg(p2); newname.append("13").append(paramString.ascii()); gfaFilter->SetParam1(p1); gfaFilter->SetParam2(p2); scale = 200.0; break; } default: { newname.append("0"); gfaFilter->SetComputationMethod(GfaFilterType::GFA_STANDARD); scale = 200.0; } } gfaFilter->Update(); clock.Stop(); MBI_DEBUG << "took " << clock.GetMeanTime() << "s."; typedef itk::Image ImgType; ImgType::Pointer img = ImgType::New(); img->SetSpacing( gfaFilter->GetOutput()->GetSpacing() ); // Set the image spacing img->SetOrigin( gfaFilter->GetOutput()->GetOrigin() ); // Set the image origin img->SetDirection( gfaFilter->GetOutput()->GetDirection() ); // Set the image direction img->SetLargestPossibleRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion()); img->SetBufferedRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion() ); img->Allocate(); itk::ImageRegionIterator ot (img, img->GetLargestPossibleRegion() ); ot = ot.Begin(); itk::ImageRegionConstIterator it (gfaFilter->GetOutput(), gfaFilter->GetOutput()->GetLargestPossibleRegion() ); it = it.Begin(); for (it = it.Begin(); !it.IsAtEnd(); ++it) { GfaFilterType::OutputImageType::PixelType val = it.Get(); ot.Set(val * scale); ++ot; } // GFA TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( img.GetPointer() ); image->SetVolume( img->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); nodes.push_back(node); SetDefaultNodeProperties(node, newname.c_str()); node->SetProperty( "IsGFAVolume", mitk::BoolProperty::New( true ) ); mitk::StatusBar::GetInstance()->DisplayText("Computation complete."); } std::vector::iterator nodeIt; for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt) mitk::DataStorage::GetInstance()->Add(*nodeIt); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } void QmitkDiffusionTensorEstimation::QBallStandardAlgorithmsDirectionButton() { itk::TimeProbe clock; QString status; const mitk::DataTreeFilter::Item* item = m_QballVolumesDataTreeFilter->GetSelectedItem(); if(!item)return; typedef itk::Vector OdfVectorType; typedef itk::Image OdfVectorImgType; mitk::Image* vol = static_cast(item->GetNode()->GetData()); OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename = item->GetProperty("name"); clock.Start(); MBI_INFO << "Computing Diffusion Direction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing Diffusion Direction for %s", nodename.c_str())); typedef itk::DiffusionQballGeneralizedFaImageFilter GfaFilterType; GfaFilterType::Pointer gfaFilter = GfaFilterType::New(); gfaFilter->SetInput(itkvol); gfaFilter->SetNumberOfThreads(4); gfaFilter->Update(); itk::ImageRegionIterator itGfa (gfaFilter->GetOutput(), gfaFilter->GetOutput()->GetLargestPossibleRegion() ); itGfa = itGfa.Begin(); int numdir = m_Controls->m_QBallStandardAlgorithmsOrderSpinbox->value(); typedef itk::DiffusionQballPrincipleDirectionsImageFilter PrincipleDirectionsFilterType; PrincipleDirectionsFilterType::Pointer principleDirectionsFilter = PrincipleDirectionsFilterType::New(); principleDirectionsFilter->SetThreshold(m_Controls->m_QBallStandardAlgorithmsProbThreshEdit->text().toFloat()); principleDirectionsFilter->SetNrDirectionToExtract(numdir); principleDirectionsFilter->SetInput(itkvol); principleDirectionsFilter->SetNumberOfThreads(m_Controls->m_QBallStandardAlgorithmsNumberThreadsSpinbox->value()); principleDirectionsFilter->SetMultiplyGfa(false); principleDirectionsFilter->Update(); itk::ImageRegionIterator it (principleDirectionsFilter->GetOutput(), principleDirectionsFilter->GetOutput()->GetLargestPossibleRegion() ); if(numdir == 0) { MBI_INFO << "Converting to RGB"; typedef itk::Image, 3> VecImgType; VecImgType::Pointer vecImg = VecImgType::New(); vecImg->SetSpacing( itkvol->GetSpacing() ); // Set the image spacing vecImg->SetOrigin( itkvol->GetOrigin() ); // Set the image origin vecImg->SetDirection( itkvol->GetDirection() ); // Set the image direction vecImg->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion()); vecImg->SetBufferedRegion( vecImg->GetLargestPossibleRegion() ); vecImg->Allocate(); itk::ImageRegionIterator ot (vecImg, vecImg->GetLargestPossibleRegion() ); ot = ot.Begin(); typedef PrincipleDirectionsFilterType::OutputImageType::PixelType VecPixType; for (it = it.Begin(); !it.IsAtEnd(); ++it) { VecPixType vec = it.Get(); itk::RGBPixel pix; vec*=200*itGfa.Get(); vec[0] = abs(vec[0]); vec[1] = abs(vec[1]); vec[2] = abs(vec[2]); if(vec[0] > 255 || vec[1] > 255 || vec[2] > 255) { // should never get in here double max = vec[0]; max = maxInitializeByItk( vecImg.GetPointer() ); image2->SetVolume( vecImg->GetBufferPointer() ); mitk::DataNode::Pointer node2=mitk::DataNode::New(); node2->SetData( image2 ); mitk::DataStorage::GetInstance()->Add(node2); switch(numdir) { case 0: { SetDefaultNodeProperties(node2, nodename.append(" PD0")); break; } case 1: { SetDefaultNodeProperties(node2, nodename.append(" PD1")); } case 2: { SetDefaultNodeProperties(node2, nodename.append(" PD2")); } default: { SetDefaultNodeProperties(node2, nodename.append(" PDn")); } } node2->SetProperty( "IsRGBVolume", mitk::BoolProperty::New( true ) ); } // VECTORFIELD MBI_DEBUG << "Converting to Vectorfield"; typedef itk::Image, 3> VecImgType2; VecImgType2::Pointer vecImg5 = VecImgType2::New(); vecImg5->SetSpacing( itkvol->GetSpacing() ); // Set the image spacing vecImg5->SetOrigin( itkvol->GetOrigin() ); // Set the image origin vecImg5->SetDirection( itkvol->GetDirection() ); // Set the image direction vecImg5->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion()); vecImg5->SetBufferedRegion( vecImg5->GetLargestPossibleRegion() ); vecImg5->Allocate(); itk::ImageRegionIterator ot5 (vecImg5, vecImg5->GetLargestPossibleRegion() ); ot5 = ot5.Begin(); typedef PrincipleDirectionsFilterType::OutputImageType::PixelType VecPixType; for (it = it.Begin(); !it.IsAtEnd(); ++it) { VecPixType vec = it.Get(); itk::Vector pix; TTensorPixelType uvec[3] = {(TTensorPixelType)(vec[0]),(TTensorPixelType)(vec[1]),(TTensorPixelType)(vec[2])}; pix = uvec; ot5.Set(pix); ++ot5; } // Vectors TO DATATREE mitk::Image::Pointer image5 = mitk::Image::New(); image5->InitializeByItk( vecImg5.GetPointer() ); image5->SetVolume( vecImg5->GetBufferPointer() ); mitk::DataNode::Pointer node5=mitk::DataNode::New(); node5->SetData( image5 ); mitk::DataStorage::GetInstance()->Add(node5); switch(numdir) { case 0: { SetDefaultNodeProperties(node5, nodename.append(" Vec0")); break; } case 1: { SetDefaultNodeProperties(node5, nodename.append(" Vec1")); } case 2: { SetDefaultNodeProperties(node5, nodename.append(" Vec2")); } default: { SetDefaultNodeProperties(node5, nodename.append(" Vecn")); } } node5->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) ); node5->SetProperty( "NormalizeVecs", mitk::BoolProperty::New( true ) ); node5->SetProperty( "Scale", mitk::FloatProperty::New( 0.8 ) ); node5->SetProperty( "LineWidth", mitk::FloatProperty::New( 3 ) ); mitk::VectorImageMapper2D::Pointer vecMapper5 = mitk::VectorImageMapper2D::New(); node5->SetMapper(1,vecMapper5); m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } void QmitkDiffusionTensorEstimation::QBallStandardAlgorithmsDeconvolutionButton() { itk::TimeProbe clock; QString status; const mitk::DataTreeFilter::Item* item = m_QballVolumesDataTreeFilter->GetSelectedItem(); if(!item)return; typedef itk::Vector OdfVectorType; typedef itk::Image OdfVectorImgType; mitk::Image* vol = static_cast(item->GetNode()->GetData()); OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New(); mitk::CastToItkImage(vol, itkvol); std::string nodename = item->GetProperty("name"); clock.Start(); MBI_INFO << "Computing Diffusion Direction "; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( "Computing Diffusion Direction for %s", nodename.c_str())); typedef itk::DiffusionQballGeneralizedFaImageFilter GfaFilterType; GfaFilterType::Pointer gfaFilter = GfaFilterType::New(); gfaFilter->SetInput(itkvol); gfaFilter->SetNumberOfThreads(4); gfaFilter->Update(); itk::ImageRegionIterator itGfa (gfaFilter->GetOutput(), gfaFilter->GetOutput()->GetLargestPossibleRegion() ); itGfa = itGfa.Begin(); int numdirs = m_Controls->m_QBallStandardAlgorithmsDeconvolutionSpinbox->value(); //vnl_matrix_fixed* kernels // = new vnl_matrix_fixed(); //itk::ImageRegionIterator inIt(itkvol, itkvol->GetLargestPossibleRegion()); //inIt.GoToBegin(); //for(int i=0; i DeconvolutionFilterType; DeconvolutionFilterType::Pointer devonvolutionFilter = DeconvolutionFilterType::New(); devonvolutionFilter->SetFractionalThreshold(m_Controls->m_QBallStandardAlgorithmsDeconvolutionThreshEdit->text().toFloat()); if(!m_Controls->m_QBallStandardAlgorithmsDeconvolutionAngResThresholdEdit->text().contains(QString("NaN"))) { float angRes = m_Controls->m_QBallStandardAlgorithmsDeconvolutionAngResThresholdEdit->text().toFloat(); angRes /= 360/DIFF_EST_PI; devonvolutionFilter->SetAngularResolutionThreshold(angRes); } devonvolutionFilter->SetSamplingQuantileStart(m_Controls->m_QBallStandardAlgorithmsDeconvQuantStart->text().toFloat()); devonvolutionFilter->SetSamplingQuantileStep(m_Controls->m_QBallStandardAlgorithmsDeconvQuantStep->text().toFloat()); devonvolutionFilter->SetMinimumNumberOfSamples(m_Controls->m_QBallStandardAlgorithmsDeconvQuantMinNr->text().toInt()); devonvolutionFilter->SetIterateQuantiles(m_Controls->m_QBallStandardAlgorithmsDeconvQuantMulti->isChecked()); devonvolutionFilter->SetNrDirectionsToExtract(numdirs); devonvolutionFilter->SetInput(itkvol); devonvolutionFilter->SetNumberOfThreads(m_Controls->m_QBallStandardAlgorithmsDeconvNumberThreadsSpinbox->value()); devonvolutionFilter->SetGfaImage(gfaFilter->GetOutput()); //devonvolutionFilter->SetPresetConvolutionKernels(kernels); devonvolutionFilter->Update(); for(int i=0; i it (devonvolutionFilter->GetOutput(i), devonvolutionFilter->GetOutput()->GetLargestPossibleRegion() ); it = it.Begin(); if(i==0) { MBI_INFO << "Converting to RGB"; typedef itk::Image, 3> VecImgType; VecImgType::Pointer vecImg = VecImgType::New(); vecImg->SetSpacing( itkvol->GetSpacing() ); // Set the image spacing vecImg->SetOrigin( itkvol->GetOrigin() ); // Set the image origin vecImg->SetDirection( itkvol->GetDirection() ); // Set the image direction vecImg->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion()); vecImg->SetBufferedRegion( vecImg->GetLargestPossibleRegion() ); vecImg->Allocate(); itk::ImageRegionIterator ot (vecImg, vecImg->GetLargestPossibleRegion() ); ot = ot.Begin(); typedef DeconvolutionFilterType::OutputImageType::PixelType VecPixType; for (it = it.Begin(); !it.IsAtEnd(); ++it) { VecPixType vec = it.Get(); vnl_vector_fixed vnlvec = vec.GetVnlVector(); TTensorPixelType len = vnlvec.two_norm(); vnlvec = vnlvec.normalize(); itk::RGBPixel pix; vnlvec*=200*itGfa.Get(); vnlvec[0] = abs(vnlvec[0]); vnlvec[1] = abs(vnlvec[1]); vnlvec[2] = abs(vnlvec[2]); if(vnlvec[0] > 255 || vnlvec[1] > 255 || vnlvec[2] > 255) { //should never get in here double max = vnlvec[0]; max = maxInitializeByItk( vecImg.GetPointer() ); image2->SetVolume( vecImg->GetBufferPointer() ); mitk::DataNode::Pointer node2=mitk::DataNode::New(); node2->SetData( image2 ); mitk::DataStorage::GetInstance()->Add(node2); switch(i) { case 0: { SetDefaultNodeProperties(node2, nodename.append(" PD0")); break; } case 1: { SetDefaultNodeProperties(node2, nodename.append(" PD1")); break; } case 2: { SetDefaultNodeProperties(node2, nodename.append(" PD2")); break; } default: { SetDefaultNodeProperties(node2, nodename.append(" PDn")); break; } } node2->SetProperty( "IsRGBVolume", mitk::BoolProperty::New( true ) ); } // VECTORFIELD MBI_INFO << "Converting to Vectorfield"; typedef itk::Image, 3> VecImgType2; VecImgType2::Pointer vecImg5 = VecImgType2::New(); vecImg5->SetSpacing( itkvol->GetSpacing() ); // Set the image spacing vecImg5->SetOrigin( itkvol->GetOrigin() ); // Set the image origin vecImg5->SetDirection( itkvol->GetDirection() ); // Set the image direction vecImg5->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion()); vecImg5->SetBufferedRegion( vecImg5->GetLargestPossibleRegion() ); vecImg5->Allocate(); itk::ImageRegionIterator ot5 (vecImg5, vecImg5->GetLargestPossibleRegion() ); ot5 = ot5.Begin(); typedef DeconvolutionFilterType::OutputImageType::PixelType VecPixType; for (it = it.Begin(); !it.IsAtEnd(); ++it) { VecPixType vec = it.Get(); vnl_vector_fixed vnlvec = vec.GetVnlVector(); vnlvec = vnlvec.normalize(); itk::Vector pix; TTensorPixelType uvec[3] = {(TTensorPixelType)(vnlvec[0]),(TTensorPixelType)(vnlvec[1]),(TTensorPixelType)(vnlvec[2])}; pix = uvec; ot5.Set(pix); ++ot5; } // Vectors TO DATATREE mitk::Image::Pointer image5 = mitk::Image::New(); image5->InitializeByItk( vecImg5.GetPointer() ); image5->SetVolume( vecImg5->GetBufferPointer() ); mitk::DataNode::Pointer node5=mitk::DataNode::New(); node5->SetData( image5 ); mitk::DataStorage::GetInstance()->Add(node5); switch(i) { case 0: { SetDefaultNodeProperties(node5, nodename.append(" Vec0")); break; } case 1: { SetDefaultNodeProperties(node5, nodename.append(" Vec1")); break; } case 2: { SetDefaultNodeProperties(node5, nodename.append(" Vec2")); break; } default: { SetDefaultNodeProperties(node5, nodename.append(" Vecn")); break; } } node5->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) ); node5->SetProperty( "NormalizeVecs", mitk::BoolProperty::New( true ) ); node5->SetProperty( "Scale", mitk::FloatProperty::New( 0.8 ) ); node5->SetProperty( "LineWidth", mitk::FloatProperty::New( 3 ) ); mitk::VectorImageMapper2D::Pointer vecMapper5 = mitk::VectorImageMapper2D::New(); node5->SetMapper(1,vecMapper5); } m_DataTreeIterator->GetTree()->Modified(); - m_MultiWidget->RequestUpdate(); + this->GetRenderWindowPart()->RequestUpdate(); TreeChanged(); m_Controls->update(); } void QmitkDiffusionTensorEstimation::SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name) { node->SetProperty( "volumerendering", mitk::BoolProperty::New( false ) ); node->SetProperty( "use color", mitk::BoolProperty::New( true ) ); node->SetProperty( "texture interpolation", mitk::BoolProperty::New( true ) ); node->SetProperty( "reslice interpolation", mitk::VtkResliceInterpolationProperty::New() ); node->SetProperty( "layer", mitk::IntProperty::New(0)); node->SetProperty( "in plane resample extent by geometry", mitk::BoolProperty::New( false ) ); node->SetOpacity(1.0f); node->SetColor(1.0,1.0,1.0); node->SetVisibility(true); mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); mitk::LevelWindow levelwindow; // levelwindow.SetAuto( image ); levWinProp->SetLevelWindow( levelwindow ); node->GetPropertyList()->SetProperty( "levelwindow", levWinProp ); // add a default rainbow lookup table for color mapping if(!node->GetProperty("LookupTable")) { mitk::LookupTable::Pointer mitkLut = mitk::LookupTable::New(); vtkLookupTable* vtkLut = mitkLut->GetVtkLookupTable(); vtkLut->SetHueRange(0.6667, 0.0); vtkLut->SetTableRange(0.0, 20.0); vtkLut->Build(); mitk::LookupTableProperty::Pointer mitkLutProp = mitk::LookupTableProperty::New(); mitkLutProp->SetLookupTable(mitkLut); node->SetProperty( "LookupTable", mitkLutProp ); } if(!node->GetProperty("binary")) node->SetProperty( "binary", mitk::BoolProperty::New( false ) ); // add a default transfer function mitk::TransferFunction::Pointer tf = mitk::TransferFunction::New(); node->SetProperty ( "TransferFunction", mitk::TransferFunctionProperty::New ( tf.GetPointer() ) ); // set foldername as string property mitk::StringProperty::Pointer nameProp = mitk::StringProperty::New( name ); node->SetProperty( "name", nameProp ); } void QmitkDiffusionTensorEstimation::DirectionVolumesAngularErrorButton() { try { const mitk::DataTreeFilter::ItemSet* selectedItems = m_DirectionVolumesDataTreeFilter->GetSelectedItems(); int nrFiles = selectedItems->size(); if (nrFiles != 2) return; mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() ); mitk::Image::Pointer vol1 = static_cast((*itemiter)->GetNode()->GetData()); if( !vol1)return; std::string nodename1 = (*itemiter)->GetProperty("name"); itemiter++; mitk::Image::Pointer vol2 = static_cast((*itemiter)->GetNode()->GetData()); if( !vol2)return; std::string nodename2 = (*itemiter)->GetProperty("name"); typedef itk::Image,3 > IType; IType::Pointer itkVol1 = IType::New(); mitk::CastToItkImage(vol1, itkVol1); IType::Pointer itkVol2 = IType::New(); mitk::CastToItkImage(vol2, itkVol2); typedef itk::VectorImagesAngularErrorImageFilter FilterType; FilterType::Pointer filter = FilterType::New(); filter->SetInput(itkVol1); filter->SetImage2(itkVol2.GetPointer()); filter->SetNumberOfThreads(4); filter->Update(); // Angluar Error TO DATATREE mitk::Image::Pointer image = mitk::Image::New(); image->InitializeByItk( filter->GetOutput() ); image->SetVolume( filter->GetOutput()->GetBufferPointer() ); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( image ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, nodename1.append(" ").append(nodename2).append(" ERR")); node->SetProperty( "IsErrorVolume", mitk::BoolProperty::New( true ) ); TreeChanged(); m_Controls->update(); QString status; mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished computing Angular Error")); } catch (itk::ExceptionObject &ex) { MBI_INFO << ex; return ; } } //void QmitkDiffusionTensorEstimation::DwiStandardAlgorithmsGFAButton() //{ // // itk::TimeProbe clock; // QString status; // const mitk::DataTreeFilter::Item* item // = m_DiffusionVolumesDataTreeFilter->GetSelectedItem(); // if(!item)return; // // typedef itk::Vector OdfVectorType; // typedef itk::Image OdfVectorImgType; // mitk::Image* vol = // static_cast(item->GetNode()->GetData()); // OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New(); // mitk::CastToItkImage(vol, itkvol); // std::string nodename = item->GetProperty("name"); // // // COMPUTE RA // clock.Start(); // std::cout << "Computing GFA "; // mitk::StatusBar::GetInstance()->DisplayText(status.sprintf( // "Computing GFA for %s", nodename.c_str())); // typedef OdfVectorType::ValueType RealValueType; // typedef itk::Image< RealValueType, 3 > RAImageType; // typedef itk::DiffusionQballGeneralizedFaImageFilter // GfaFilterType; // GfaFilterType::Pointer gfaFilter = GfaFilterType::New(); // gfaFilter->SetInput(itkvol); // gfaFilter->SetNumberOfThreads(4); // switch(m_Controls->m_QBallStandardAlgorithmsGFAMethodSpinbox->value()) // { // case 1: // { // gfaFilter->SetComputationMethod(GfaFilterType::STANDARD); // break; // } // case 2: // { // gfaFilter->SetComputationMethod(GfaFilterType::QUANTILES_HIGH_LOW); // break; // } // case 3: // { // gfaFilter->SetComputationMethod(GfaFilterType::QUANTILES_MIDDLE); // break; // } // case 4: // { // gfaFilter->SetComputationMethod(GfaFilterType::MAX_ODF_VALUE); // break; // } // case 5: // { // gfaFilter->SetComputationMethod(GfaFilterType::DECONVOLUTION_COEFFS); // break; // } // default: // { // gfaFilter->SetComputationMethod(GfaFilterType::STANDARD); // } // } // gfaFilter->Update(); // clock.Stop(); // std::cout << "took " << clock.GetMeanTime() << "s." << std::endl; // // typedef itk::Image ImgType; // ImgType::Pointer img = ImgType::New(); // img->SetSpacing( gfaFilter->GetOutput()->GetSpacing() ); // Set the image spacing // img->SetOrigin( gfaFilter->GetOutput()->GetOrigin() ); // Set the image origin // img->SetDirection( gfaFilter->GetOutput()->GetDirection() ); // Set the image direction // img->SetLargestPossibleRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion()); // img->SetBufferedRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion() ); // img->Allocate(); // itk::ImageRegionIterator ot (img, img->GetLargestPossibleRegion() ); // ot = ot.Begin(); // itk::ImageRegionConstIterator it // (gfaFilter->GetOutput(), gfaFilter->GetOutput()->GetLargestPossibleRegion() ); // it = it.Begin(); // // for (it = it.Begin(); !it.IsAtEnd(); ++it) // { // GfaFilterType::OutputImageType::PixelType val = it.Get(); // ot.Set(val * 200); // ++ot; // } // // // // GFA TO DATATREE // mitk::Image::Pointer image = mitk::Image::New(); // image->InitializeByItk( img.GetPointer() ); // image->SetVolume( img->GetBufferPointer() ); // mitk::DataNode::Pointer node=mitk::DataNode::New(); // node->SetData( image ); // mitk::DataStorage::GetInstance()->Add(node); // SetDefaultNodeProperties(node, nodename.append(" GFA")); // node->SetProperty( "IsGFAVolume", mitk::BoolProperty::New( true ) ); // // mitk::StatusBar::GetInstance()->DisplayText("Computation complete."); // // m_DataTreeIterator->GetTree()->Modified(); -// m_MultiWidget->RequestUpdate(); +// this->GetRenderWindowPart()->RequestUpdate(); // TreeChanged(); // m_Controls->update(); // //} void QmitkDiffusionTensorEstimation::DiffusionVolumeSaveButton() { // GET SELECTED ITEM const mitk::DataTreeFilter::Item* selectedItem = m_DiffusionVolumesDataTreeFilter->GetSelectedItem(); if( !selectedItem ) return; mitk::DiffusionVolumes::Pointer diffVolumes = static_cast*>(selectedItem->GetNode()->GetData()); std::string sName = selectedItem->GetNode()->GetName(); QString qName; qName.sprintf("%s.nhdr",sName.c_str()); // SELECT FILE DIALOG //QFileDialog::getSaveFileName() //QFileDialog* w = new QFileDialog( this->m_Controls, "Select Nrrd Outputfile", TRUE ); //w->setMode( QFileDialog::AnyFile ); //w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" ); //w->setName(qName); //if ( w->exec() != QDialog::Accepted ) // return; //QString filename = w->selectedFile(); QString filename = QFileDialog::getSaveFileName( qName, "Nrrd Images (*.nrrd *.nhdr)", this->m_Controls, "save file dialog", "Select Nrrd Outputfile" ); if ( !filename ) return; // WRITING DWIs TO NRRD VOLUME typedef mitk::NrrdDiffusionVolumesWriter WriterType; WriterType::Pointer nrrdWriter = WriterType::New(); nrrdWriter->SetInput( diffVolumes->GetImage() ); nrrdWriter->SetDirections(diffVolumes->GetDirections()); nrrdWriter->SetB_Value(diffVolumes->GetB_Value()); nrrdWriter->SetFileName(filename.ascii()); try { nrrdWriter->Update(); } catch (itk::ExceptionObject e) { MBI_INFO << e; } } void QmitkDiffusionTensorEstimation::DiffusionVolumesLoadButton() { // SELECT FOLDER DIALOG QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE ); w->setMode( QFileDialog::ExistingFiles ); w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" ); // RETRIEVE SELECTION if ( w->exec() != QDialog::Accepted ) return; QStringList filenames = w->selectedFiles(); QStringList::Iterator it = filenames.begin(); while( it != filenames.end() ) { std::string filename = ( *it ).ascii(); ++it; // READING NRRD DWI VOLUMES typedef mitk::NrrdDiffusionVolumesReader ReaderType; ReaderType::Pointer nrrdReader = ReaderType::New(); nrrdReader->SetFileName(filename); try { nrrdReader->Update(); // DWI TO DATATREE typedef mitk::DiffusionVolumes DiffVolumesType; DiffVolumesType::Pointer diffVolumes = DiffVolumesType::New(); diffVolumes->SetDirections(nrrdReader->GetDiffusionVectors()); diffVolumes->SetB_Value(nrrdReader->GetB_Value()); diffVolumes->SetImage(nrrdReader->GetOutput()); mitk::DataNode::Pointer node=mitk::DataNode::New(); node->SetData( diffVolumes ); mitk::DataStorage::GetInstance()->Add(node); SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename)); TreeChanged(); } catch (itk::ExceptionObject e) { MBI_INFO << e; } } } void QmitkDiffusionTensorEstimation::DiffusionVolumesRemoveButton() { m_DiffusionVolumesDataTreeFilter->DeleteSelectedItems(); } void QmitkDiffusionTensorEstimation::DiffusionVolumesSelectAll() { const mitk::DataTreeFilter::ItemList* items = m_DiffusionVolumesDataTreeFilter->GetItems(); mitk::DataTreeFilter::ConstItemIterator itemiter( items->Begin() ); mitk::DataTreeFilter::ConstItemIterator itemiterend( items->End() ); while ( itemiter != itemiterend ) { m_DiffusionVolumesDataTreeFilter->SelectItem(*itemiter); ++itemiter; } } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.h b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.h index 4fb52f0e3d..81dae74b39 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/deprecated/QmitkDiffusionTensorEstimation.h @@ -1,163 +1,158 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #if !defined(QmitkDiffusionTensorEstimation_H__INCLUDED) #define QmitkDiffusionTensorEstimation_H__INCLUDED -#include "QmitkFunctionality.h" +#include +#include #include "mitkDiffusionVolumes.h" -class QmitkStdMultiWidget; class QmitkDiffusionTensorEstimationControls; typedef short DiffusionPixelType; /*! \brief QmitkDiffusionTensorEstimation -One needs to reimplement the methods CreateControlWidget(..), CreateMainWidget(..) -and CreateAction(..) from QmitkFunctionality. - -\sa QmitkFunctionality -\ingroup Functionalities +One needs to reimplement the methods CreateControlWidget(..), +and CreateAction(..). */ -class QmitkDiffusionTensorEstimation : public QmitkFunctionality +class QmitkDiffusionTensorEstimation : public QmitkAbstractView, public mitk::ILifecycleAwarePart { Q_OBJECT public: /*! \brief default constructor */ - QmitkDiffusionTensorEstimation(QObject *parent=0, const char *name=0, QmitkStdMultiWidget *mitkStdMultiWidget = NULL, mitk::DataTreeIteratorBase* dataIt = NULL); + QmitkDiffusionTensorEstimation(QObject *parent=0, const char *name=0, mitk::DataTreeIteratorBase* dataIt = NULL); /*! \brief default destructor */ virtual ~QmitkDiffusionTensorEstimation(); /*! \brief method for creating the widget containing the application controls, like sliders, buttons etc. */ virtual QWidget * CreateControlWidget(QWidget *parent); - /*! - \brief method for creating the applications main widget - */ - virtual QWidget * CreateMainWidget(QWidget * parent); - /*! \brief method for creating the connections of main and control widget */ virtual void CreateConnections(); + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + /*! \brief method for creating an QAction object, i.e. button & menu entry @param parent the parent QWidget */ virtual QAction * CreateAction(QActionGroup *parent); - virtual void Activated(); + virtual void Activated() override; + virtual void Deactivated() override; + virtual void Visible() override; + virtual void Hidden() override; protected slots: void TreeChanged(); void TensorVolumesSaveButton(); void TensorVolumesLoadButton(); void TensorVolumesRemoveButton(); void QBallVolumesSaveButton(); void QBallVolumesLoadButton(); void QBallVolumesRemoveButton(); void DirectionVolumesSaveButton(); void DirectionVolumesLoadButton(); void DirectionVolumesRemoveButton(); void DirectionVolumesAngularErrorButton(); void TensorEstimationTeemEstimateButton(); void QBallReconstructionButton(); void QBallReconstructionAnalyticalButton(); void TensorEstimationButton(); void StandardAlgorithmsFAButton(); void StandardAlgorithmsRAButton(); void StandardAlgorithmsDirectionButton(); void QBallStandardAlgorithmsDirectionButton(); void QBallStandardAlgorithmsDeconvolutionButton(); void QBallStandardAlgorithmsGFAButton(); void QBallVolumesVisualizeSelectedButton(); void DiffusionVolumeSaveButton(); void DiffusionVolumesLoadButton(); void DiffusionVolumesRemoveButton(); void DiffusionVolumesSelectAll(); //void DwiStandardAlgorithmsGFAButton(); void SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name); protected: - /*! - * default main widget containing 4 windows showing 3 - * orthogonal slices of the volume and a 3d render window - */ - QmitkStdMultiWidget * m_MultiWidget; /*! * controls containing sliders for scrolling through the slices */ QmitkDiffusionTensorEstimationControls * m_Controls; mitk::DataTreeFilter::Pointer m_DiffusionVolumesDataTreeFilter; mitk::DataTreeFilter::Pointer m_TensorVolumesDataTreeFilter; mitk::DataTreeFilter::Pointer m_QballVolumesDataTreeFilter; mitk::DataTreeFilter::Pointer m_DirectionVolumesDataTreeFilter; bool m_FilterInitialized; static const int odfsize; static const int nrconvkernels; template void ReconstructAnalytically(mitk::DiffusionVolumes* vols, float lambda, std::string nodename, std::vector* nodes); }; #endif // !defined(QmitkDiffusionTensorEstimation_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenDicomEditorAction.cpp b/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenDicomEditorAction.cpp index 165f4e4a67..67c51f3e6e 100644 --- a/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenDicomEditorAction.cpp +++ b/Plugins/org.mitk.gui.qt.ext/src/QmitkOpenDicomEditorAction.cpp @@ -1,111 +1,81 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkOpenDicomEditorAction.h" #include #include #include "mitkCoreObjectFactory.h" #include "mitkSceneIO.h" #include "mitkProgressBar.h" #include #include #include #include #include #include #include #include "mitkProperties.h" #include "mitkNodePredicateData.h" #include "mitkNodePredicateNot.h" #include "mitkNodePredicateProperty.h" -//#include - QmitkOpenDicomEditorAction::QmitkOpenDicomEditorAction(berry::IWorkbenchWindow::Pointer window) : QAction(0) { this->init(window); } QmitkOpenDicomEditorAction::QmitkOpenDicomEditorAction(const QIcon & icon, berry::IWorkbenchWindow::Pointer window) : QAction(0) { this->setIcon(icon); this->init(window); } void QmitkOpenDicomEditorAction::init(berry::IWorkbenchWindow::Pointer window) { m_Window = window; this->setParent(static_cast(m_Window->GetShell()->GetControl())); this->setText("&DICOM"); this->setToolTip("Open dicom tool"); berry::IPreferencesService* prefService = berry::Platform::GetPreferencesService(); m_GeneralPreferencesNode = prefService->GetSystemPreferences()->Node("/General"); this->connect(this, SIGNAL(triggered(bool)), this, SLOT(Run())); } void QmitkOpenDicomEditorAction::Run() { // check if there is an open perspective, if not open the default perspective if (m_Window->GetActivePage().IsNull()) { QString defaultPerspId = m_Window->GetWorkbench()->GetPerspectiveRegistry()->GetDefaultPerspective(); m_Window->GetWorkbench()->ShowPerspective(defaultPerspId, m_Window); } - //mitk::DataStorageEditorInput::Pointer editorInput; - //mitk::DataStorage::Pointer dataStorage; - //QmitkStdMultiWidgetEditor::Pointer multiWidgetEditor; - //berry::IEditorPart::Pointer editor = m_Window->GetActivePage()->GetActiveEditor(); - - - - //if (editor.Cast().IsNull()) - //{ - // editorInput = new mitk::DataStorageEditorInput(); - // dataStorage = editorInput->GetDataStorageReference()->GetDataStorage(); - //} - //else - //{ - // multiWidgetEditor = editor.Cast(); - // dataStorage = multiWidgetEditor->GetEditorInput().Cast()->GetDataStorageReference()->GetDataStorage(); - //} - - //if (multiWidgetEditor.IsNull()) - //{ - // //berry::IEditorPart::Pointer editor = m_Window->GetActivePage()->OpenEditor(editorInput, QmitkStdMultiWidgetEditor::EDITOR_ID); - // multiWidgetEditor = editor.Cast(); - //} - //else - //{ - // multiWidgetEditor->GetStdMultiWidget()->RequestUpdate(); - //} - - berry::IEditorInput::Pointer editorInput2(new berry::FileEditorInput(QString())); - m_Window->GetActivePage()->OpenEditor(editorInput2, "org.mitk.editors.dicomeditor"); + berry::IEditorInput::Pointer editorInput2(new berry::FileEditorInput(QString())); + m_Window->GetActivePage()->OpenEditor(editorInput2, "org.mitk.editors.dicomeditor"); } diff --git a/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.cpp b/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.cpp index ad9171aae5..d2e20fde5b 100644 --- a/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.cpp +++ b/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.cpp @@ -1,213 +1,213 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //Blueberry #include #include //Qmitk #include "QmitkGeometryToolsView.h" //mitk #include #include //micro services #include #include const std::string QmitkGeometryToolsView::VIEW_ID = "org.mitk.views.geometrytools"; void QmitkGeometryToolsView::SetFocus() { m_Controls.m_AddInteractor->setFocus(); } void QmitkGeometryToolsView::CreateQtPartControl( QWidget *parent ) { m_Controls.setupUi( parent ); connect( m_Controls.m_AddInteractor, SIGNAL(clicked()), this, SLOT(AddInteractor()) ); connect( m_Controls.m_RemoveInteractor, SIGNAL(clicked()), this, SLOT(RemoveInteractor()) ); connect( m_Controls.m_TranslationStep, SIGNAL(valueChanged(double)), this, SLOT(OnTranslationSpinBoxChanged(double)) ); connect( m_Controls.m_RotationStep, SIGNAL(valueChanged(double)), this, SLOT(OnRotationSpinBoxChanged(double)) ); connect( m_Controls.m_ScaleFactor, SIGNAL(valueChanged(double)), this, SLOT(OnScaleSpinBoxChanged(double)) ); connect( m_Controls.m_AnchorPointX, SIGNAL(valueChanged(double)), this, SLOT(OnAnchorPointChanged(double)) ); connect( m_Controls.m_AnchorPointY, SIGNAL(valueChanged(double)), this, SLOT(OnAnchorPointChanged(double)) ); connect( m_Controls.m_AnchorPointZ, SIGNAL(valueChanged(double)), this, SLOT(OnAnchorPointChanged(double)) ); connect( m_Controls.m_UsageInfoCheckBox, SIGNAL(clicked(bool)), this, SLOT(OnUsageInfoBoxChanged(bool)) ); connect( m_Controls.m_CustomAnchorPointRadioButton, SIGNAL(toggled(bool)), this, SLOT(OnCustomPointRadioButtonToggled(bool)) ); connect( m_Controls.m_OriginPointRadioButton, SIGNAL(clicked(bool)), this, SLOT(OnOriginPointRadioButton(bool)) ); connect( m_Controls.m_CenterPointRadioButton, SIGNAL(clicked(bool)), this, SLOT(OnCenterPointRadioButton(bool)) ); m_Controls.m_UsageInfo->hide(); m_Controls.m_CustomAnchorPoint->hide(); } void QmitkGeometryToolsView::OnUsageInfoBoxChanged(bool flag) { m_Controls.m_UsageInfo->setVisible(flag); } void QmitkGeometryToolsView::OnSelectionChanged( berry::IWorkbenchPart::Pointer /*source*/, const QList& nodes ) { - foreach( mitk::DataNode::Pointer node, nodes ) + for (mitk::DataNode::Pointer node: nodes) { if( node.IsNotNull() ) { m_Controls.m_AddInteractor->setEnabled( true ); return; } } m_Controls.m_AddInteractor->setEnabled( false ); } void QmitkGeometryToolsView::OnCustomPointRadioButtonToggled(bool status) { m_Controls.m_CustomAnchorPoint->setVisible(status); //change the anchor point to be the custom point OnAnchorPointChanged(0.0); } void QmitkGeometryToolsView::OnCenterPointRadioButton(bool) { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( node.IsNotNull() && (node->GetDataInteractor().IsNotNull()) ) { node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point X", node->GetData()->GetGeometry()->GetCenter()[0]); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Y", node->GetData()->GetGeometry()->GetCenter()[1]); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Z", node->GetData()->GetGeometry()->GetCenter()[2]); } } } void QmitkGeometryToolsView::OnOriginPointRadioButton(bool) { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( node.IsNotNull() && (node->GetDataInteractor().IsNotNull()) ) { node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point X", node->GetData()->GetGeometry()->GetOrigin()[0]); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Y", node->GetData()->GetGeometry()->GetOrigin()[1]); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Z", node->GetData()->GetGeometry()->GetOrigin()[2]); } } } void QmitkGeometryToolsView::AddInteractor() { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( node.IsNotNull() ) { mitk::AffineBaseDataInteractor3D::Pointer affineDataInteractor = mitk::AffineBaseDataInteractor3D::New(); if (m_Controls.m_KeyboardMode->isChecked()) { affineDataInteractor->LoadStateMachine("AffineInteraction3D.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); affineDataInteractor->SetEventConfig("AffineKeyConfig.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); } else if(m_Controls.m_MouseMode->isChecked()) { affineDataInteractor->LoadStateMachine("AffineInteraction3D.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); affineDataInteractor->SetEventConfig("AffineMouseConfig.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); } affineDataInteractor->SetDataNode(node); node->SetBoolProperty("pickable", true); node->SetFloatProperty("AffineBaseDataInteractor3D.Translation Step Size", m_Controls.m_TranslationStep->value()); node->SetFloatProperty("AffineBaseDataInteractor3D.Rotation Step Size", m_Controls.m_RotationStep->value()); node->SetFloatProperty("AffineBaseDataInteractor3D.Scale Step Size", m_Controls.m_ScaleFactor->value()); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point X", m_Controls.m_AnchorPointX->value()); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Y", m_Controls.m_AnchorPointY->value()); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Z", m_Controls.m_AnchorPointZ->value()); } } } void QmitkGeometryToolsView::RemoveInteractor() { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( (node.IsNotNull()) && (node->GetDataInteractor().IsNotNull()) ) { node->SetDataInteractor(nullptr); } } } void QmitkGeometryToolsView::OnTranslationSpinBoxChanged(double step) { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( node.IsNotNull() && (node->GetDataInteractor().IsNotNull()) ) { node->SetFloatProperty("AffineBaseDataInteractor3D.Translation Step Size", step); } } } void QmitkGeometryToolsView::OnRotationSpinBoxChanged(double step) { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( node.IsNotNull() && (node->GetDataInteractor().IsNotNull()) ) { node->SetFloatProperty("AffineBaseDataInteractor3D.Rotation Step Size", step); } } } void QmitkGeometryToolsView::OnScaleSpinBoxChanged(double factor) { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( node.IsNotNull() && (node->GetDataInteractor().IsNotNull()) ) { node->SetFloatProperty("AffineBaseDataInteractor3D.Scale Step Size", factor); } } } void QmitkGeometryToolsView::OnAnchorPointChanged(double /*value*/) { QList nodes = this->GetDataManagerSelection(); foreach( mitk::DataNode::Pointer node, nodes ) { if( node.IsNotNull() && (node->GetDataInteractor().IsNotNull()) ) { node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point X", m_Controls.m_AnchorPointX->value()); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Y", m_Controls.m_AnchorPointY->value()); node->SetFloatProperty("AffineBaseDataInteractor3D.Anchor Point Z", m_Controls.m_AnchorPointZ->value()); } } } diff --git a/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.h b/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.h index 679945ca60..517618529a 100644 --- a/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.h +++ b/Plugins/org.mitk.gui.qt.geometrytools/src/internal/QmitkGeometryToolsView.h @@ -1,107 +1,107 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkGeometryToolsView_h #define QmitkGeometryToolsView_h #include #include #include #include "ui_QmitkGeometryToolsViewControls.h" /** \brief QmitkGeometryToolsView to modify geometry of mitkBaseData via interaction. \warning This is an experimental view to play with the geometry of all mitkBaseDatas. The current implementation allows to translate, rotate and scale objects with the keyboard. \warning Scaling is not supported for images, yet. \sa QmitkAbstractView \ingroup ${plugin_target}_internal */ class QmitkGeometryToolsView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; public slots: protected slots: /** * @brief Add/remove the affine interactor. */ void AddInteractor(); void RemoveInteractor(); /** * @brief Slots to adapt the step size for interaction. */ void OnRotationSpinBoxChanged(double step); void OnScaleSpinBoxChanged(double factor); void OnTranslationSpinBoxChanged(double step); /** * @brief OnUsageInfoBoxChanged show help. * @param flag yes/no. */ void OnUsageInfoBoxChanged(bool flag); /** * @brief OnCustomPointRadioButtonToggled hide/show custom anchor point * */ void OnCustomPointRadioButtonToggled(bool status); /** * @brief OnAnchorPointChanged sets the anchor point for rotation or translation. */ void OnAnchorPointChanged(double); /** * @brief OnOriginPointRadioButton sets the anchor point to the origin of the * mitk::DataNode mitk::BaseGeometry. */ void OnOriginPointRadioButton(bool); /** * @brief OnCenterPointRadioButton sets the anchor point to the center of the * mitk::DataNode mitk::BaseGeometry. */ void OnCenterPointRadioButton(bool); protected: virtual void CreateQtPartControl(QWidget *parent) override; virtual void SetFocus() override; - /// \brief called by QmitkFunctionality when DataManager's selection has changed + /// \brief called by QmitkAbstractView when DataManager's selection has changed virtual void OnSelectionChanged( berry::IWorkbenchPart::Pointer source, const QList& nodes ) override; Ui::QmitkGeometryToolsViewControls m_Controls; }; #endif // QmitkGeometryToolsView_h diff --git a/Plugins/org.mitk.gui.qt.igtexamples/documentation/doxygen/modules.dox b/Plugins/org.mitk.gui.qt.igtexamples/documentation/doxygen/modules.dox index 73c3a9d64d..113d81ff81 100644 --- a/Plugins/org.mitk.gui.qt.igtexamples/documentation/doxygen/modules.dox +++ b/Plugins/org.mitk.gui.qt.igtexamples/documentation/doxygen/modules.dox @@ -1,24 +1,24 @@ /** \defgroup org_mitk_gui_qt_igtexamples org.mitk.gui.qt.igtexamples \ingroup MITKPlugins \brief QmitkIGTExamples shows a small typically navigation MITK functionality. Any kind of navigation application will start with the connection to a tracking system and as we do image guided procedures we want to show something on the screen. In this tutorial we connect to the NDI Polaris tracking system (or alternatively use a virtual tracking device) - and we will show the movement of a tool as cone in the StdMultiWidget editor. + and we will show the movement of a tool as cone in the render window part. */ /** \defgroup org_mitk_gui_qt_igtexamples_internal Internal \ingroup org_mitk_gui_qt_igtexamples \brief This subcategory includes the internal classes of the org.mitk.gui.qt.igtexamples plugin. Other plugins must not rely on these classes. They contain implementation details and their interface may change at any time. We mean it. QmitkIGTExamples does not contain any internal classes. */ diff --git a/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTrackingLabView.cpp b/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTrackingLabView.cpp index 2ad530037d..0bf94838b3 100644 --- a/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTrackingLabView.cpp +++ b/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTrackingLabView.cpp @@ -1,737 +1,736 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkIGTTrackingLabView.h" -#include "QmitkStdMultiWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Qt #include #include #include // vtk #include const std::string QmitkIGTTrackingLabView::VIEW_ID = "org.mitk.views.igttrackinglab"; QmitkIGTTrackingLabView::QmitkIGTTrackingLabView() : QmitkAbstractView() ,m_Source(NULL) ,m_PermanentRegistrationFilter(NULL) ,m_Visualizer(NULL) ,m_VirtualView(NULL) ,m_PSRecordingPointSet(NULL) ,m_PointSetRecording(false) ,m_PermanentRegistration(false) ,m_CameraView(false) ,m_ImageFiducialsDataNode(NULL) ,m_TrackerFiducialsDataNode(NULL) ,m_PermanentRegistrationSourcePoints(NULL) { } //############################################################################################### //############################################################################################### //############################## Timer method for IGT pipeline updating ######################### //############################################################################################### //############################################################################################### void QmitkIGTTrackingLabView::UpdateTimer() { if (m_PermanentRegistration && m_PermanentRegistrationFilter.IsNotNull()) { if(IsTransformDifferenceHigh(m_ObjectmarkerNavigationData, m_ObjectmarkerNavigationDataLastUpdate)) { m_ObjectmarkerNavigationDataLastUpdate->Graft(m_ObjectmarkerNavigationData); m_PermanentRegistrationFilter->Update(); } } if (m_CameraView && m_VirtualView.IsNotNull()) {m_VirtualView->Update();} if(m_PointSetRecording && m_PSRecordingPointSet.IsNotNull()) { int size = m_PSRecordingPointSet->GetSize(); mitk::NavigationData::Pointer nd = m_PointSetRecordingNavigationData; if(size > 0) { mitk::Point3D p = m_PSRecordingPointSet->GetPoint(size-1); if(p.EuclideanDistanceTo(nd->GetPosition()) > (double) m_Controls.m_PSRecordingSpinBox->value()) m_PSRecordingPointSet->InsertPoint(size, nd->GetPosition()); } else m_PSRecordingPointSet->InsertPoint(size, nd->GetPosition()); } } //############################################################################################### //############################################################################################### //############################## Slots of CONFIGURATION step #################################### //############################################################################################### //############################################################################################### void QmitkIGTTrackingLabView::OnSetupNavigation() { if(m_Source.IsNotNull()) if(m_Source->IsTracking()) return; mitk::DataStorage* ds = this->GetDataStorage(); if(ds == NULL) { MITK_WARN << "IGTSurfaceTracker: Error", "can not access DataStorage. Navigation not possible"; return; } //Building up the filter pipeline try { this->InitializeRegistration(); } catch(mitk::IGTException& e) { MITK_WARN << "Error while building the IGT-Pipeline: " << e.GetDescription(); this->DestroyIGTPipeline(); // destroy the pipeline if building is incomplete return; } catch(...) { MITK_WARN << "Unexpected error while building the IGT-Pipeline"; this->DestroyIGTPipeline(); return; } } void QmitkIGTTrackingLabView::OnInstrumentSelected() { if (m_Controls.m_TrackingDeviceSelectionWidget->GetSelectedNavigationDataSource().IsNotNull()) { m_InstrumentNavigationData = m_Controls.m_TrackingDeviceSelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_Controls.m_TrackingDeviceSelectionWidget->GetSelectedToolID()); } else { m_Controls.m_PointerNameLabel->setText(""); return; } if (m_InstrumentNavigationData.IsNotNull()) { m_Controls.m_PointerNameLabel->setText(m_InstrumentNavigationData->GetName()); } else { m_Controls.m_PointerNameLabel->setText(""); } } void QmitkIGTTrackingLabView::OnObjectmarkerSelected() { if (m_Controls.m_TrackingDeviceSelectionWidget->GetSelectedNavigationDataSource().IsNotNull()) { m_ObjectmarkerNavigationData = m_Controls.m_TrackingDeviceSelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_Controls.m_TrackingDeviceSelectionWidget->GetSelectedToolID()); MITK_INFO << "Objectmarker rotation: " << m_ObjectmarkerNavigationData->GetOrientation(); } else { m_Controls.m_ObjectmarkerNameLabel->setText(""); return; } if (m_ObjectmarkerNavigationData.IsNotNull()) { m_Controls.m_ObjectmarkerNameLabel->setText(m_ObjectmarkerNavigationData->GetName()); } else { m_Controls.m_ObjectmarkerNameLabel->setText(""); } } //############################################################################################### //############################################################################################### //####################### Slots of INITIAL REGISTRATION step #################################### //############################################################################################### //############################################################################################### void QmitkIGTTrackingLabView::OnInitialRegistration() { //Check for initialization if (!CheckRegistrationInitialization()) return; /* retrieve fiducials from data storage */ mitk::DataStorage* ds = this->GetDataStorage(); mitk::PointSet::Pointer imageFiducials = dynamic_cast(m_ImageFiducialsDataNode->GetData()); mitk::PointSet::Pointer trackerFiducials = dynamic_cast(m_TrackerFiducialsDataNode->GetData()); //############### conversion to vtk data types (we will use the vtk landmark based transform) ########################## //convert point sets to vtk poly data vtkSmartPointer sourcePoints = vtkSmartPointer::New(); vtkSmartPointer targetPoints = vtkSmartPointer::New(); for (int i=0; iGetSize(); i++) { double point[3] = {imageFiducials->GetPoint(i)[0],imageFiducials->GetPoint(i)[1],imageFiducials->GetPoint(i)[2]}; sourcePoints->InsertNextPoint(point); double point_targets[3] = {trackerFiducials->GetPoint(i)[0],trackerFiducials->GetPoint(i)[1],trackerFiducials->GetPoint(i)[2]}; targetPoints->InsertNextPoint(point_targets); } //########################### here, the actual transform is computed ########################## //compute transform vtkSmartPointer transform = vtkSmartPointer::New(); transform->SetSourceLandmarks(sourcePoints); transform->SetTargetLandmarks(targetPoints); transform->SetModeToRigidBody(); transform->Modified(); transform->Update(); //compute FRE of transform double FRE = mitk::StaticIGTHelperFunctions::ComputeFRE(imageFiducials, trackerFiducials, transform); m_Controls.m_RegistrationWidget->SetQualityDisplayText("FRE: " + QString::number(FRE) + " mm"); //############################################################################################# //############### conversion back to itk/mitk data types ########################## //convert from vtk to itk data types itk::Matrix rotationFloat = itk::Matrix(); itk::Vector translationFloat = itk::Vector(); itk::Matrix rotationDouble = itk::Matrix(); itk::Vector translationDouble = itk::Vector(); vtkSmartPointer m = transform->GetMatrix(); for(int k=0; k<3; k++) for(int l=0; l<3; l++) { rotationFloat[k][l] = m->GetElement(k,l); rotationDouble[k][l] = m->GetElement(k,l); } for(int k=0; k<3; k++) { translationFloat[k] = m->GetElement(k,3); translationDouble[k] = m->GetElement(k,3); } //create affine transform 3D surface mitk::AffineTransform3D::Pointer mitkTransform = mitk::AffineTransform3D::New(); mitkTransform->SetMatrix(rotationDouble); mitkTransform->SetOffset(translationDouble); //############################################################################################# //############### object is transformed ########################## //save transform m_T_ObjectReg = mitk::NavigationData::New(mitkTransform); // this is stored in a member because it is needed for permanent registration later on //transform surface if(m_Controls.m_SurfaceActive->isChecked() && m_Controls.m_ObjectComboBox->GetSelectedNode().IsNotNull()) { m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(mitkTransform); } //################################################################ //############### if activated: ct image is also transformed ########################## //transform ct image //todo: Erklären, dass hier AffineTransform3D verwendet wird, weil NavigationData kein Spacing unterstützt! if(m_Controls.m_ImageActive->isChecked() && m_Controls.m_ImageComboBox->GetSelectedNode().IsNotNull()) { //first we have to store the original ct image transform to compose it with the new transform later mitk::AffineTransform3D::Pointer imageTransform = m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->GetIndexToWorldTransform(); m_T_ImageGeo = mitk::AffineTransform3D::New(); // this is also stored in a member because it is needed for permanent registration later on //now the new transform of the ct image is computed m_T_ImageGeo->Compose(imageTransform); imageTransform->Compose(mitkTransform); mitk::AffineTransform3D::Pointer newImageTransform = mitk::AffineTransform3D::New(); //create new image transform... setting the composed directly leads to an error itk::Matrix rotationFloatNew = imageTransform->GetMatrix(); itk::Vector translationFloatNew = imageTransform->GetOffset(); newImageTransform->SetMatrix(rotationFloatNew); newImageTransform->SetOffset(translationFloatNew); m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(newImageTransform); m_T_ImageReg = m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->GetIndexToWorldTransform(); } //################################################################ } void QmitkIGTTrackingLabView::OnAddRegistrationTrackingFiducial() { mitk::NavigationData::Pointer nd = m_InstrumentNavigationData; if( nd.IsNull() || !nd->IsDataValid()) { QMessageBox::warning( 0, "Invalid tracking data", "Navigation data is not available or invalid!", QMessageBox::Ok ); return; } if(m_TrackerFiducialsDataNode.IsNotNull() && m_TrackerFiducialsDataNode->GetData() != NULL) { mitk::PointSet::Pointer ps = dynamic_cast(m_TrackerFiducialsDataNode->GetData()); ps->InsertPoint(ps->GetSize(), nd->GetPosition()); } else QMessageBox::warning(NULL, "IGTSurfaceTracker: Error", "Can not access Tracker Fiducials. Adding fiducial not possible!"); } void QmitkIGTTrackingLabView::InitializeRegistration() { mitk::DataStorage* ds = this->GetDataStorage(); if( ds == NULL ) return; // let the registration widget know about the slice navigation controllers // in the active render window part (crosshair updates) foreach(QmitkRenderWindow* renderWindow, this->GetRenderWindowPart()->GetQmitkRenderWindows().values()) { m_Controls.m_RegistrationWidget->AddSliceNavigationController(renderWindow->GetSliceNavigationController()); } if(m_ImageFiducialsDataNode.IsNull()) { m_ImageFiducialsDataNode = mitk::DataNode::New(); mitk::PointSet::Pointer ifPS = mitk::PointSet::New(); m_ImageFiducialsDataNode->SetData(ifPS); mitk::Color color; color.Set(1.0f, 0.0f, 0.0f); m_ImageFiducialsDataNode->SetName("Image Fiducials"); m_ImageFiducialsDataNode->SetColor(color); m_ImageFiducialsDataNode->SetBoolProperty( "updateDataOnRender", false ); ds->Add(m_ImageFiducialsDataNode); } m_Controls.m_RegistrationWidget->SetImageFiducialsNode(m_ImageFiducialsDataNode); if(m_TrackerFiducialsDataNode.IsNull()) { m_TrackerFiducialsDataNode = mitk::DataNode::New(); mitk::PointSet::Pointer tfPS = mitk::PointSet::New(); m_TrackerFiducialsDataNode->SetData(tfPS); mitk::Color color; color.Set(0.0f, 1.0f, 0.0f); m_TrackerFiducialsDataNode->SetName("Tracking Fiducials"); m_TrackerFiducialsDataNode->SetColor(color); m_TrackerFiducialsDataNode->SetBoolProperty( "updateDataOnRender", false ); ds->Add(m_TrackerFiducialsDataNode); } m_Controls.m_RegistrationWidget->SetTrackerFiducialsNode(m_TrackerFiducialsDataNode); } //############################################################################################### //############################################################################################### //####################### Slots of PERMANENT REGISTRATION step ################################## //############################################################################################### //############################################################################################### void QmitkIGTTrackingLabView::OnPermanentRegistration(bool on) { if(on) { //###################################################################### //######################## inititalization ############################# //###################################################################### //some initial checks if(!CheckRegistrationInitialization()) { m_Controls.m_UsePermanentRegistrationToggle->setChecked(false); return; } //remember initial object transform to calculate the object to marker transform later on and convert it to navigation data mitk::AffineTransform3D::Pointer transform = this->m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->GetIndexToWorldTransform(); mitk::NavigationData::Pointer T_Object = mitk::NavigationData::New(transform,false); //TODO: catch exception during conversion? //then reset the transform because we will now start to calculate the permanent registration this->m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIdentity(); if(m_Controls.m_ImageActive->isChecked()) {this->m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(m_T_ImageGeo);} //create the permanent registration filter m_PermanentRegistrationFilter = mitk::NavigationDataObjectVisualizationFilter::New(); //###################################################################### //first: initialize permanent registration of surface (always activated) //###################################################################### //connect filter to source m_PermanentRegistrationFilter->SetInput(0,this->m_ObjectmarkerNavigationData); //set representation object m_PermanentRegistrationFilter->SetRepresentationObject(0,this->m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()); //get the marker transform out of the navigation data mitk::NavigationData::Pointer T_Marker = m_ObjectmarkerNavigationData; //compute transform from object to marker (T_MarkerRel = T_Object * T_Marker^-1) mitk::NavigationData::Pointer T_MarkerRel = mitk::NavigationData::New(); T_MarkerRel->Compose(T_Object); T_MarkerRel->Compose(T_Marker->GetInverse()); m_T_MarkerRel = T_MarkerRel; m_PermanentRegistrationFilter->SetOffset(0,m_T_MarkerRel->GetAffineTransform3D()); //###################################################################### //second: initialize permanent registration of image (if activated) //###################################################################### if (m_Controls.m_ImageActive->isChecked() && (m_Controls.m_ImageComboBox->GetSelectedNode().IsNotNull())) { mitk::DataNode::Pointer imageNode = this->m_Controls.m_ImageComboBox->GetSelectedNode(); imageNode->AddProperty( "reslice interpolation", mitk::VtkResliceInterpolationProperty::New(VTK_RESLICE_LINEAR) ); m_PermanentRegistrationFilter->SetInput(1,this->m_ObjectmarkerNavigationData); m_PermanentRegistrationFilter->SetRepresentationObject(1,imageNode->GetData()); //for the image we can't use NavigationData objects as transforms because an image needs additional geometry information, e.g., spacing //thus we use mitk::AffineTransform3D objects //computer transform from image to marker (T_ImageRel = T_ImageGeo * T_MarkerRel) mitk::AffineTransform3D::Pointer T_ImageRel = mitk::AffineTransform3D::New(); T_ImageRel->SetIdentity(); T_ImageRel->Compose(m_T_ImageGeo); T_ImageRel->Compose(m_T_MarkerRel->GetAffineTransform3D()); m_PermanentRegistrationFilter->SetOffset(1,T_ImageRel); } //some general stuff m_PermanentRegistration = true; m_ObjectmarkerNavigationDataLastUpdate = mitk::NavigationData::New(); } else //if off = disable the permanent registration { //stop permanent registration m_PermanentRegistration = false; //restore old registration if(m_T_ObjectReg.IsNotNull()) {this->m_Controls.m_ObjectComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(m_T_ObjectReg->GetAffineTransform3D());} if(m_T_ImageReg.IsNotNull()) {this->m_Controls.m_ImageComboBox->GetSelectedNode()->GetData()->GetGeometry()->SetIndexToWorldTransform(m_T_ImageReg);} //delete filter m_PermanentRegistrationFilter = NULL; } } //############################################################################################### //############################################################################################### //####################### Slots of POINT SET RECORDING step ##################################### //############################################################################################### //############################################################################################### void QmitkIGTTrackingLabView::OnPointSetRecording(bool record) { mitk::DataStorage* ds = this->GetDataStorage(); if(record) { if (m_Controls.m_PointSetRecordingToolSelectionWidget->GetSelectedToolID() == -1) { QMessageBox::warning(NULL, "Error", "No tool selected for point set recording!"); m_Controls.m_PointSetRecordCheckBox->setChecked(false); return; } m_PointSetRecordingNavigationData = m_Controls.m_PointSetRecordingToolSelectionWidget->GetSelectedNavigationDataSource()->GetOutput(m_Controls.m_PointSetRecordingToolSelectionWidget->GetSelectedToolID()); //initialize point set mitk::DataNode::Pointer psRecND = ds->GetNamedNode("Recorded Points"); if(m_PSRecordingPointSet.IsNull() || psRecND.IsNull()) { m_PSRecordingPointSet = NULL; m_PSRecordingPointSet = mitk::PointSet::New(); mitk::DataNode::Pointer dn = mitk::DataNode::New(); dn->SetName("Recorded Points"); dn->SetColor(0.,1.,0.); dn->SetData(m_PSRecordingPointSet); ds->Add(dn); } else { m_PSRecordingPointSet->Clear(); } m_PointSetRecording = true; } else { m_PointSetRecording = false; } } //############################################################################################### //############################################################################################### //####################### Slots of VIRTUAL CAMERA VIEW step ##################################### //############################################################################################### //############################################################################################### void QmitkIGTTrackingLabView::OnVirtualCamera(bool on) { if (m_Controls.m_CameraViewSelection->GetSelectedToolID() == -1) { m_Controls.m_ActivateNeedleView->setChecked(false); QMessageBox::warning(NULL, "Error", "No tool selected for camera view!"); return; } if(on) { m_VirtualView = mitk::CameraVisualization::New(); m_VirtualView->SetInput(m_Controls.m_CameraViewSelection->GetSelectedNavigationDataSource()->GetOutput(m_Controls.m_CameraViewSelection->GetSelectedToolID())); mitk::Vector3D viewDirection; viewDirection[0] = (int)(m_Controls.m_NeedleViewX->isChecked()); viewDirection[1] = (int)(m_Controls.m_NeedleViewY->isChecked()); viewDirection[2] = (int)(m_Controls.m_NeedleViewZ->isChecked()); if (m_Controls.m_NeedleViewInvert->isChecked()) viewDirection *= -1; m_VirtualView->SetDirectionOfProjectionInToolCoordinates(viewDirection); mitk::Vector3D viewUpVector; viewUpVector[0] = (int)(m_Controls.m_NeedleUpX->isChecked()); viewUpVector[1] = (int)(m_Controls.m_NeedleUpY->isChecked()); viewUpVector[2] = (int)(m_Controls.m_NeedleUpZ->isChecked()); if (m_Controls.m_NeedleUpInvert->isChecked()) viewUpVector *= -1; m_VirtualView->SetViewUpInToolCoordinates(viewUpVector); m_VirtualView->SetRenderer(this->GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderer()); //next line: better code when this plugin is migrated to mitk::abstractview //m_VirtualView->SetRenderer(mitk::BaseRenderer::GetInstance(this->GetRenderWindowPart()->GetRenderWindow("3d")->GetRenderWindow())); m_CameraView = true; //make pointer itself invisible m_Controls.m_CameraViewSelection->GetSelectedNavigationTool()->GetDataNode()->SetBoolProperty("visible",false); //disable UI elements m_Controls.m_ViewDirectionBox->setEnabled(false); m_Controls.m_ViewUpBox->setEnabled(false); } else { m_VirtualView = NULL; m_CameraView = false; m_Controls.m_CameraViewSelection->GetSelectedNavigationTool()->GetDataNode()->SetBoolProperty("visible",true); m_Controls.m_ViewDirectionBox->setEnabled(true); m_Controls.m_ViewUpBox->setEnabled(true); } } //############################################################################################### //############################################################################################### //############################## some general UI methods, always needed ######################### //############################################################################################### //############################################################################################### QmitkIGTTrackingLabView::~QmitkIGTTrackingLabView() { if (m_Timer->isActive()) m_Timer->stop(); } void QmitkIGTTrackingLabView::CreateQtPartControl( QWidget *parent ) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi( parent ); this->CreateBundleWidgets( parent ); this->CreateConnections(); } void QmitkIGTTrackingLabView::CreateBundleWidgets( QWidget* parent ) { //initialize registration widget m_Controls.m_RegistrationWidget->HideStaticRegistrationRadioButton(true); m_Controls.m_RegistrationWidget->HideContinousRegistrationRadioButton(true); m_Controls.m_RegistrationWidget->HideUseICPRegistrationCheckbox(true); } void QmitkIGTTrackingLabView::CreateConnections() { //initialize timer m_Timer = new QTimer(this); //create connections connect(m_Timer, SIGNAL(timeout()), this, SLOT(UpdateTimer())); connect( m_Controls.m_UsePermanentRegistrationToggle, SIGNAL(toggled(bool)), this, SLOT(OnPermanentRegistration(bool)) ); connect( m_Controls.m_TrackingDeviceSelectionWidget, SIGNAL(NavigationDataSourceSelected(mitk::NavigationDataSource::Pointer)), this, SLOT(OnSetupNavigation()) ); connect( m_Controls.m_UseAsPointerButton, SIGNAL(clicked()), this, SLOT(OnInstrumentSelected()) ); connect( m_Controls.m_UseAsObjectmarkerButton, SIGNAL(clicked()), this, SLOT(OnObjectmarkerSelected()) ); connect( m_Controls.m_RegistrationWidget, SIGNAL(AddedTrackingFiducial()), this, SLOT(OnAddRegistrationTrackingFiducial()) ); connect( m_Controls.m_RegistrationWidget, SIGNAL(PerformFiducialRegistration()), this, SLOT(OnInitialRegistration()) ); connect( m_Controls.m_PointSetRecordCheckBox, SIGNAL(toggled(bool)), this, SLOT(OnPointSetRecording(bool)) ); connect( m_Controls.m_ActivateNeedleView, SIGNAL(toggled(bool)), this, SLOT(OnVirtualCamera(bool)) ); //start timer m_Timer->start(30); //initialize Combo Boxes m_Controls.m_ObjectComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.m_ObjectComboBox->SetAutoSelectNewItems(false); m_Controls.m_ObjectComboBox->SetPredicate(mitk::NodePredicateDataType::New("Surface")); m_Controls.m_ImageComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.m_ImageComboBox->SetAutoSelectNewItems(false); m_Controls.m_ImageComboBox->SetPredicate(mitk::NodePredicateDataType::New("Image")); } void QmitkIGTTrackingLabView::SetFocus() { m_Controls.m_UseAsPointerButton->setFocus(); } //############################################################################################### //############################################################################################### //####################### some additional slots and help methods ################################ //####################### for cleaner code - not that important ################################ //####################### to understand the basic functions ################################ //############################################################################################### //############################################################################################### void QmitkIGTTrackingLabView::DestroyIGTPipeline() { if(m_Source.IsNotNull()) { m_Source->StopTracking(); m_Source->Disconnect(); m_Source = NULL; } m_PermanentRegistrationFilter = NULL; m_Visualizer = NULL; m_VirtualView = NULL; } bool QmitkIGTTrackingLabView::CheckRegistrationInitialization() { // a couple of variables which we need in this method std::string warningMessage = ""; bool initializationErrorDetected = false; mitk::PointSet::Pointer imageFiducials,trackerFiducials; // check some initialization stuff if (m_ImageFiducialsDataNode.IsNull() || m_TrackerFiducialsDataNode.IsNull()) { warningMessage = "Initialization not finished!"; MITK_WARN << warningMessage; QMessageBox::warning(NULL, "Registration not possible", warningMessage.c_str()); return false; } else { imageFiducials = dynamic_cast(m_ImageFiducialsDataNode->GetData()); trackerFiducials = dynamic_cast(m_TrackerFiducialsDataNode->GetData()); } // now, do a lot of other checks... if (m_Controls.m_SurfaceActive->isChecked() && m_Controls.m_ObjectComboBox->GetSelectedNode().IsNull()) { warningMessage = "No surface selected for registration.\nRegistration is not possible"; initializationErrorDetected = true; } else if (m_Controls.m_ImageActive->isChecked() && m_Controls.m_ImageComboBox->GetSelectedNode().IsNull()) { warningMessage = "No image selected for registration.\nRegistration is not possible"; initializationErrorDetected = true; } else if (imageFiducials.IsNull() || trackerFiducials.IsNull()) { warningMessage = "Fiducial data objects not found. \n" "Please set 3 or more fiducials in the image and with the tracking system.\n\n" "Registration is not possible"; initializationErrorDetected = true; } else if ((imageFiducials->GetSize() < 3) || (trackerFiducials->GetSize() < 3) || (imageFiducials->GetSize() != trackerFiducials->GetSize())) { warningMessage = "Not enough fiducial pairs found. At least 3 fiducial must exist for the image and the tracking system respectively."; initializationErrorDetected = true; } // finaly: if an err was detected, give a warning and an error popup, then return false if(initializationErrorDetected) { MITK_WARN << warningMessage; QMessageBox::warning(NULL, "Registration not possible", warningMessage.c_str()); return false; } //if no error was detected simply return true else {return true;} } bool QmitkIGTTrackingLabView::IsTransformDifferenceHigh(mitk::NavigationData::Pointer transformA, mitk::NavigationData::Pointer transformB, double euclideanDistanceThreshold, double angularDifferenceThreshold) { if(transformA.IsNull() || transformA.IsNull()) {return false;} mitk::Point3D posA,posB; posA = transformA->GetPosition(); posB = transformB->GetPosition(); if(posA.EuclideanDistanceTo(posB) > euclideanDistanceThreshold) {return true;} double returnValue; mitk::Quaternion rotA,rotB; rotA = transformA->GetOrientation(); rotB = transformB->GetOrientation(); itk::Vector point; //caution 5D-Tools: Vector must lie in the YZ-plane for a correct result. point[0] = 0.0; point[1] = 0.0; point[2] = 100000.0; rotA.normalize(); rotB.normalize(); itk::Matrix rotMatrixA; for(int i=0; i<3; i++) for(int j=0; j<3; j++) rotMatrixA[i][j] = rotA.rotation_matrix_transpose().transpose()[i][j]; itk::Matrix rotMatrixB; for(int i=0; i<3; i++) for(int j=0; j<3; j++) rotMatrixB[i][j] = rotB.rotation_matrix_transpose().transpose()[i][j]; itk::Vector pt1 = rotMatrixA * point; itk::Vector pt2 = rotMatrixB * point; returnValue = (pt1[0]*pt2[0]+pt1[1]*pt2[1]+pt1[2]*pt2[2]) / ( sqrt(pow(pt1[0],2.0)+pow(pt1[1],2.0)+pow(pt1[2],2.0)) * sqrt(pow(pt2[0],2.0)+pow(pt2[1],2.0)+pow(pt2[2],2.0))); returnValue = acos(returnValue); if(returnValue*57.3 > angularDifferenceThreshold){return true;} return false; } diff --git a/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.cpp b/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.cpp index 0d7c0cc7af..b650a8d773 100644 --- a/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.cpp +++ b/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.cpp @@ -1,263 +1,261 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkIGTTutorialView.h" -#include "QmitkStdMultiWidget.h" - #include "mitkNDIPassiveTool.h" #include "mitkNDITrackingDevice.h" #include "mitkVirtualTrackingDevice.h" #include "mitkStandardFileLocations.h" #include "mitkSerialCommunication.h" #include "mitkCone.h" #include #include #include "mitkNDIPolarisTypeInformation.h" const std::string QmitkIGTTutorialView::VIEW_ID = "org.mitk.views.igttutorial"; QmitkIGTTutorialView::QmitkIGTTutorialView() : QmitkAbstractView(), m_Controls(NULL), m_Source(NULL), m_Visualizer(NULL), m_Timer(NULL) { } QmitkIGTTutorialView::~QmitkIGTTutorialView() { } void QmitkIGTTutorialView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widget m_Controls = new Ui::QmitkIGTTutorialViewControls; m_Controls->setupUi(parent); this->CreateConnections(); } } void QmitkIGTTutorialView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(m_Controls->m_StartButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnStartIGT())); connect( (QObject*)(m_Controls->m_StopButton), SIGNAL(clicked()),(QObject*) this, SLOT(OnStopIGT())); } } void QmitkIGTTutorialView::SetFocus() { m_Controls->m_virtualTrackingRadioButton->setFocus(); } //The next line starts a snippet to display this code in the documentation. If you don't revise the documentation, don't remove it! //! [OnStart 1] void QmitkIGTTutorialView::OnStartIGT() { //This method is called when the "Start Image Guided Therapy" button is pressed. Any kind of navigation application will //start with the connection to a tracking system and as we do image guided procedures we want to show //something on the screen. In this tutorial we connect to the NDI Polaris tracking system pr a virtual tracking device and we will //show the movement of a tool as cone in MITK. //! [OnStart 1] //! [OnStart 2] try { if(m_Controls->m_NDITrackingRadioButton->isChecked()) { /**************** Variant 1: Use a NDI Polaris Tracking Device ****************/ //Here we want to use the NDI Polaris tracking device. Therefore we instantiate a object of the class //NDITrackingDevice and make some settings which are necessary for a proper connection to the device. MITK_INFO << "NDI tracking"; QMessageBox::warning ( NULL, "Warning", "You have to set the parameters for the NDITracking device inside the code (QmitkIGTTutorialView::OnStartIGT()) before you can use it."); mitk::NDITrackingDevice::Pointer tracker = mitk::NDITrackingDevice::New(); //instantiate tracker->SetPortNumber(mitk::SerialCommunication::COM4); //set the comport tracker->SetBaudRate(mitk::SerialCommunication::BaudRate115200); //set the baud rate tracker->SetType(mitk::NDIPolarisTypeInformation::GetTrackingDeviceName()); //set the type there you can choose between Polaris and Aurora //The tools represent the sensors of the tracking device. In this case we have one pointer tool. //The TrackingDevice object it self fills the tool with data. So we have to add the tool to the //TrackingDevice object. // The Polaris system needs a ".rom" file which describes the geometry of the markers related to the tool tip. //NDI provides an own software (NDI architect) to generate those files. tracker->AddTool("MyInstrument", "c:\\myinstrument.rom"); //! [OnStart 2] /**************** End of Variant 1 ****************/ //! [OnStart 3] //The tracking device object is used for the physical connection to the device. To use the //data inside of our tracking pipeline we need a source. This source encapsulate the tracking device //and provides objects of the type mitk::NavigationData as output. The NavigationData objects stores //position, orientation, if the data is valid or not and special error informations in a covariance //matrix. // //Typically the start of a pipeline is a TrackingDeviceSource. To work correct we have to set a //TrackingDevice object. Attention you have to set the tools before you set the whole TrackingDevice //object to the TrackingDeviceSource because the source need to know how many outputs should be //generated. m_Source = mitk::TrackingDeviceSource::New(); //We need the filter objects to stay alive, //therefore they must be members. m_Source->SetTrackingDevice(tracker); //Here we set the tracking device to the source of the pipeline. //! [OnStart 3] } //! [OnStart 4] else { /**************** Variant 2: Emulate a Tracking Device with mitk::VirtualTrackingDevice ****************/ // For tests, it is useful to simulate a tracking device in software. This is what mitk::VirtualTrackingDevice does. // It will produce random position, orientation and error values for each tool that is added. MITK_INFO << "virtual tracking"<SetBounds(bounds); tracker->AddTool("MyInstrument"); // add a tool to tracker //The tracking device object is used for the physical connection to the device. To use the //data inside of our tracking pipeline we need a source. This source encapsulate the tracking device //and provides objects of the type mitk::NavigationData as output. The NavigationData objects stores //position, orientation, if the data is valid or not and special error informations in a covariance //matrix. // //Typically the start of a pipeline is a TrackingDeviceSource. To work correct we have to set a //TrackingDevice object. Attention you have to set the tools before you set the whole TrackingDevice //object to the TrackingDeviceSource because the source need to know how many outputs should be //generated. m_Source = mitk::TrackingDeviceSource::New(); //We need the filter objects to stay alive, //therefore they must be members. m_Source->SetTrackingDevice(tracker); //Here we set the tracking device to the source of the pipeline. /**************** End of Variant 2 ****************/ } //! [OnStart 4] //! [OnStart 5] m_Source->Connect(); //Now we connect to the tracking system. //Note we do not call this on the TrackingDevice object //! [OnStart 5] //! [OnStart 6] //As we wish to visualize our tool we need to have a PolyData which shows us the movement of our tool. //Here we take a cone shaped PolyData. In MITK you have to add the PolyData as a node into the DataStorage //to show it inside of the rendering windows. After that you can change the properties of the cone //to manipulate rendering, e.g. the position and orientation as in our case. mitk::Cone::Pointer cone = mitk::Cone::New(); //instantiate a new cone double scale[] = {10.0, 10.0, 10.0}; cone->GetGeometry()->SetSpacing(scale); //scale it a little that so we can see something mitk::DataNode::Pointer node = mitk::DataNode::New(); //generate a new node to store the cone into //the DataStorage. node->SetData(cone); //The data of that node is our cone. node->SetName("My tracked object"); //The node has additional properties like a name node->SetColor(1.0, 0.0, 0.0); //or the color. Here we make it red. this->GetDataStorage()->Add(node); //After adding the Node with the cone in it to the //DataStorage, MITK will show the cone in the //render windows. //! [OnStart 6] //! [OnStart 7] //For updating the render windows we use another filter of the MITK-IGT pipeline concept. The //NavigationDataObjectVisualizationFilter needs as input a NavigationData and a //PolyData. In our case the input is the source and the PolyData our cone. //First we create a new filter for the visualization update. m_Visualizer = mitk::NavigationDataObjectVisualizationFilter::New(); m_Visualizer->SetInput(0, m_Source->GetOutput()); //Then we connect to the pipeline. m_Visualizer->SetRepresentationObject(0, cone); //After that we have to assign the cone to the input //Now this simple pipeline is ready, so we can start the tracking. Here again: We do not call the //StartTracking method from the tracker object itself. Instead we call this method from our source. m_Source->StartTracking(); //! [OnStart 7] //! [OnStart 8] //Now every call of m_Visualizer->Update() will show us the cone at the position and orientation //given from the tracking device. //We use a QTimer object to call this Update() method in a fixed interval. if (m_Timer == NULL) { m_Timer = new QTimer(this); //create a new timer } connect(m_Timer, SIGNAL(timeout()), this, SLOT(OnTimer())); //connect the timer to the method OnTimer() m_Timer->start(100); //Every 100ms the method OnTimer() is called. -> 10fps //! [OnStart 8] //! [OnStart 8a] //disable the tracking device selection this->m_Controls->m_NDITrackingRadioButton->setDisabled(true); this->m_Controls->m_virtualTrackingRadioButton->setDisabled(true); //! [OnStart 8a] } //! [OnStart 9] catch (std::exception& e) { // add cleanup MITK_INFO << "Error in QmitkIGTTutorial::OnStartIGT():" << e.what(); } //! [OnStart 9] } //![OnTimer] void QmitkIGTTutorialView::OnTimer() { //Here we call the Update() method from the Visualization Filter. Internally the filter checks if //new NavigationData is available. If we have a new NavigationData the cone position and orientation //will be adapted. m_Visualizer->Update(); mitk::TimeGeometry::Pointer geo = this->GetDataStorage()->ComputeBoundingGeometry3D(this->GetDataStorage()->GetAll()); mitk::RenderingManager::GetInstance()->InitializeViews( geo ); this->RequestRenderWindowUpdate(); } //![OnTimer] //![OnStop] void QmitkIGTTutorialView::OnStopIGT() { //This method is called when the Stop button is pressed. Here we disconnect the pipeline. if (m_Timer == NULL) { MITK_INFO << "No Timer was set yet!"; return; } //To disconnect the pipeline in a save way we first stop the timer than we disconnect the tracking device. //After that we destroy all filters with changing them to NULL. m_Timer->stop(); disconnect(m_Timer, SIGNAL(timeout()), this, SLOT(OnTimer())); m_Timer = NULL; m_Source->StopTracking(); m_Source->Disconnect(); m_Source = NULL; m_Visualizer = NULL; m_Source = NULL; this->GetDataStorage()->Remove(this->GetDataStorage()->GetNamedNode("My tracked object")); //enable the tracking device selection this->m_Controls->m_NDITrackingRadioButton->setEnabled(true); this->m_Controls->m_virtualTrackingRadioButton->setEnabled(true); } //![OnStop] diff --git a/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.h b/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.h index afca84667c..843dadad33 100644 --- a/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.h +++ b/Plugins/org.mitk.gui.qt.igtexamples/src/internal/QmitkIGTTutorialView.h @@ -1,89 +1,89 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKIGTTUTORIALVIEW_H_INCLUDED #define _QMITKIGTTUTORIALVIEW_H_INCLUDED #include #include #include "ui_QmitkIGTTutorialViewControls.h" #include "mitkTrackingDeviceSource.h" #include "mitkNavigationDataObjectVisualizationFilter.h" /** * \brief QmitkIGTTutorial shows a small typically navigation MITK view * * Any kind of navigation application will start with the connection to a tracking system * and as we do image guided procedures we want to show something on the screen. In this * tutorial we connect to the NDI Polaris tracking system (or alternatively use a virtual tracking device) -* and we will show the movement of a tool as cone in the StdMultiWidget editor. +* and we will show the movement of a tool as cone in the render window part. * * \sa also take a look at the CMakeLists.txt of this view to see how to * link to the mitkIGT library. */ class QmitkIGTTutorialView : public QmitkAbstractView { // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkIGTTutorialView(); virtual ~QmitkIGTTutorialView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); virtual void SetFocus() override; protected slots: /** * \brief Execute MITK-IGT Tutorial */ void OnStartIGT(); /** * \brief stop IGT scene and clean up */ void OnStopIGT(); /** * \brief timer based update of IGT scene */ void OnTimer(); protected: Ui::QmitkIGTTutorialViewControls* m_Controls; mitk::TrackingDeviceSource::Pointer m_Source; ///< source filer that connects to the tracking device mitk::NavigationDataObjectVisualizationFilter::Pointer m_Visualizer; ///< visualization filter uses output from m_Source QTimer* m_Timer; ///< timer for continuous tracking update }; #endif // _QMITKIGTTUTORIALVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.igttracking/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.igttracking/manifest_headers.cmake index 5216322fcc..bdbd9bd0d4 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.igttracking/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "IGT Tracking") set(Plugin-Version "0.1") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "") -set(Require-Plugin org.mitk.gui.qt.common.legacy) \ No newline at end of file +set(Require-Plugin org.mitk.gui.qt.common) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTNavigationToolManagerView.cpp b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTNavigationToolManagerView.cpp index f3205dd8f2..19a76d84c6 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTNavigationToolManagerView.cpp +++ b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTNavigationToolManagerView.cpp @@ -1,79 +1,78 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkMITKIGTNavigationToolManagerView.h" -#include "QmitkStdMultiWidget.h" // MITK #include // Qt #include const std::string QmitkMITKIGTNavigationToolManagerView::VIEW_ID = "org.mitk.views.mitkigtnavigationtoolmanager"; QmitkMITKIGTNavigationToolManagerView::QmitkMITKIGTNavigationToolManagerView() : QmitkAbstractView() , m_Controls(0) { } QmitkMITKIGTNavigationToolManagerView::~QmitkMITKIGTNavigationToolManagerView() { for (int i = 0; i < m_AllStoragesHandledByThisWidget.size(); i++) m_AllStoragesHandledByThisWidget.at(i)->UnRegisterMicroservice(); } void QmitkMITKIGTNavigationToolManagerView::CreateQtPartControl(QWidget *parent) { // build up qt view, unless already done if (!m_Controls) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkMITKIGTNavigationToolManagerViewControls; m_Controls->setupUi(parent); connect((QObject*)(m_Controls->m_toolManagerWidget), SIGNAL(NewStorageAdded(mitk::NavigationToolStorage::Pointer, std::string)), this, SLOT(NewStorageByWidget(mitk::NavigationToolStorage::Pointer, std::string))); connect((QObject*)(m_Controls->m_ToolStorageListWidget), SIGNAL(NavigationToolStorageSelected(mitk::NavigationToolStorage::Pointer)), this, SLOT(ToolStorageSelected(mitk::NavigationToolStorage::Pointer))); } m_Controls->m_toolManagerWidget->Initialize(this->GetDataStorage()); } void QmitkMITKIGTNavigationToolManagerView::SetFocus() { m_Controls->m_ToolStorageListWidget->setFocus(); } void QmitkMITKIGTNavigationToolManagerView::NewStorageByWidget(mitk::NavigationToolStorage::Pointer storage, std::string storageName) { storage->RegisterAsMicroservice(storageName); m_AllStoragesHandledByThisWidget.push_back(storage); } void QmitkMITKIGTNavigationToolManagerView::ToolStorageSelected(mitk::NavigationToolStorage::Pointer storage) { if (storage.IsNull()) //no storage selected { //reset everything return; } this->m_Controls->m_toolManagerWidget->LoadStorage(storage); -} \ No newline at end of file +} diff --git a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.cpp b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.cpp index b7b6bf2b04..f6ca2dd4e0 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.cpp +++ b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.cpp @@ -1,1531 +1,1524 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkMITKIGTTrackingToolboxView.h" #include "QmitkTrackingDeviceConfigurationWidget.h" -#include "QmitkStdMultiWidget.h" // Qt #include #include #include // MITK #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mitkNDIAuroraTypeInformation.h" // vtk #include //for exceptions #include #include //for Microservice #include "mitkPluginActivator.h" #include #include #include "usServiceReference.h" const std::string QmitkMITKIGTTrackingToolboxView::VIEW_ID = "org.mitk.views.mitkigttrackingtoolbox"; QmitkMITKIGTTrackingToolboxView::QmitkMITKIGTTrackingToolboxView() - : QmitkFunctionality() + : QmitkAbstractView() , m_Controls(nullptr) - , m_MultiWidget(nullptr) , m_DeviceTypeCollection(nullptr) { m_TrackingLoggingTimer = new QTimer(this); m_TrackingRenderTimer = new QTimer(this); m_TimeoutTimer = new QTimer(this); m_tracking = false; m_connected = false; m_logging = false; m_loggedFrames = 0; //create filename for autosaving of tool storage QString loggingPathWithoutFilename = QString(mitk::LoggingBackend::GetLogFile().c_str()); if (!loggingPathWithoutFilename.isEmpty()) //if there already is a path for the MITK logging file use this one { //extract path from path+filename (if someone knows a better way to do this feel free to change it) int lengthOfFilename = QFileInfo(QString::fromStdString(mitk::LoggingBackend::GetLogFile())).fileName().size(); loggingPathWithoutFilename.resize(loggingPathWithoutFilename.size() - lengthOfFilename); m_AutoSaveFilename = loggingPathWithoutFilename + "TrackingToolboxAutoSave.IGTToolStorage"; } else //if not: use a temporary path from IOUtil { m_AutoSaveFilename = QString(mitk::IOUtil::GetTempPath().c_str()) + "TrackingToolboxAutoSave.IGTToolStorage"; } MITK_INFO("IGT Tracking Toolbox") << "Filename for auto saving of IGT ToolStorages: " << m_AutoSaveFilename.toStdString(); //! [Thread 1] //initialize worker thread m_WorkerThread = new QThread(); m_Worker = new QmitkMITKIGTTrackingToolboxViewWorker(); //! [Thread 1] ctkPluginContext* pluginContext = mitk::PluginActivator::GetContext(); if (pluginContext) { QString interfaceName = QString::fromStdString(us_service_interface_iid()); QList serviceReference = pluginContext->getServiceReferences(interfaceName); if (serviceReference.size() > 0) { m_DeviceTypeServiceReference = serviceReference.at(0); const ctkServiceReference& r = serviceReference.at(0); m_DeviceTypeCollection = pluginContext->getService(r); } else { MITK_INFO << "No Tracking Device Collection!"; } } } QmitkMITKIGTTrackingToolboxView::~QmitkMITKIGTTrackingToolboxView() { this->StoreUISettings(); m_TrackingLoggingTimer->stop(); m_TrackingRenderTimer->stop(); m_TimeoutTimer->stop(); delete m_TrackingLoggingTimer; delete m_TrackingRenderTimer; delete m_TimeoutTimer; try { //! [Thread 2] // wait for thread to finish m_WorkerThread->terminate(); m_WorkerThread->wait(); //clean up worker thread if (m_WorkerThread) { delete m_WorkerThread; } if (m_Worker) { delete m_Worker; } //! [Thread 2] //remove the tracking volume this->GetDataStorage()->Remove(m_TrackingVolumeNode); //unregister microservices if (m_toolStorage) { m_toolStorage->UnRegisterMicroservice(); } if (m_TrackingDeviceSource) { m_TrackingDeviceSource->UnRegisterMicroservice(); } if (m_IGTLMessageProvider.IsNotNull()){ m_IGTLMessageProvider->UnRegisterMicroservice(); } } catch (std::exception& e) { MITK_WARN << "Unexpected exception during clean up of tracking toolbox view: " << e.what(); } catch (...) { MITK_WARN << "Unexpected unknown error during clean up of tracking toolbox view!"; } //store tool storage and UI settings for persistence this->AutoSaveToolStorage(); this->StoreUISettings(); m_DeviceTypeCollection = nullptr; mitk::PluginActivator::GetContext()->ungetService(m_DeviceTypeServiceReference); } void QmitkMITKIGTTrackingToolboxView::CreateQtPartControl(QWidget *parent) { // build up qt view, unless already done if (!m_Controls) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkMITKIGTTrackingToolboxViewControls; m_Controls->setupUi(parent); //create connections connect(m_Controls->m_LoadTools, SIGNAL(clicked()), this, SLOT(OnLoadTools())); connect(m_Controls->m_ConnectDisconnectButton, SIGNAL(clicked()), this, SLOT(OnConnectDisconnect())); connect(m_Controls->m_StartStopTrackingButton, SIGNAL(clicked()), this, SLOT(OnStartStopTracking())); connect(m_Controls->m_FreezeUnfreezeTrackingButton, SIGNAL(clicked()), this, SLOT(OnFreezeUnfreezeTracking())); connect(m_TrackingLoggingTimer, SIGNAL(timeout()), this, SLOT(UpdateLoggingTrackingTimer())); connect(m_TrackingRenderTimer, SIGNAL(timeout()), this, SLOT(UpdateRenderTrackingTimer())); connect(m_TimeoutTimer, SIGNAL(timeout()), this, SLOT(OnTimeOut())); connect(m_Controls->m_ChooseFile, SIGNAL(clicked()), this, SLOT(OnChooseFileClicked())); connect(m_Controls->m_StartLogging, SIGNAL(clicked()), this, SLOT(StartLogging())); connect(m_Controls->m_StopLogging, SIGNAL(clicked()), this, SLOT(StopLogging())); connect(m_Controls->m_VolumeSelectionBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(OnTrackingVolumeChanged(QString))); connect(m_Controls->m_ShowTrackingVolume, SIGNAL(clicked()), this, SLOT(OnShowTrackingVolumeChanged())); connect(m_Controls->m_AutoDetectTools, SIGNAL(clicked()), this, SLOT(OnAutoDetectTools())); connect(m_Controls->m_ResetTools, SIGNAL(clicked()), this, SLOT(OnResetTools())); connect(m_Controls->m_AddSingleTool, SIGNAL(clicked()), this, SLOT(OnAddSingleTool())); connect(m_Controls->m_NavigationToolCreationWidget, SIGNAL(NavigationToolFinished()), this, SLOT(OnAddSingleToolFinished())); connect(m_Controls->m_NavigationToolCreationWidget, SIGNAL(Canceled()), this, SLOT(OnAddSingleToolCanceled())); connect(m_Controls->m_csvFormat, SIGNAL(clicked()), this, SLOT(OnToggleFileExtension())); connect(m_Controls->m_xmlFormat, SIGNAL(clicked()), this, SLOT(OnToggleFileExtension())); connect(m_Controls->m_UseDifferentUpdateRates, SIGNAL(clicked()), this, SLOT(OnToggleDifferentUpdateRates())); connect(m_Controls->m_RenderUpdateRate, SIGNAL(valueChanged(int)), this, SLOT(OnChangeRenderUpdateRate())); connect(m_Controls->m_DisableAllTimers, SIGNAL(stateChanged(int)), this, SLOT(EnableDisableTimerButtons(int))); //connections for the tracking device configuration widget connect(m_Controls->m_configurationWidget, SIGNAL(TrackingDeviceSelectionChanged()), this, SLOT(OnTrackingDeviceChanged())); //! [Thread 3] //connect worker thread connect(m_Worker, SIGNAL(AutoDetectToolsFinished(bool, QString)), this, SLOT(OnAutoDetectToolsFinished(bool, QString))); connect(m_Worker, SIGNAL(ConnectDeviceFinished(bool, QString)), this, SLOT(OnConnectFinished(bool, QString))); connect(m_Worker, SIGNAL(StartTrackingFinished(bool, QString)), this, SLOT(OnStartTrackingFinished(bool, QString))); connect(m_Worker, SIGNAL(StopTrackingFinished(bool, QString)), this, SLOT(OnStopTrackingFinished(bool, QString))); connect(m_Worker, SIGNAL(DisconnectDeviceFinished(bool, QString)), this, SLOT(OnDisconnectFinished(bool, QString))); connect(m_WorkerThread, SIGNAL(started()), m_Worker, SLOT(ThreadFunc())); //move the worker to the thread m_Worker->moveToThread(m_WorkerThread); //! [Thread 3] //initialize widgets m_Controls->m_TrackingToolsStatusWidget->SetShowPositions(true); m_Controls->m_TrackingToolsStatusWidget->SetTextAlignment(Qt::AlignLeft); //initialize tracking volume node m_TrackingVolumeNode = mitk::DataNode::New(); m_TrackingVolumeNode->SetName("TrackingVolume"); m_TrackingVolumeNode->SetBoolProperty("Backface Culling", true); mitk::Color red; red.SetRed(1); m_TrackingVolumeNode->SetColor(red); //initialize buttons m_Controls->m_AutoDetectTools->setVisible(false); //only visible if tracking device is Aurora m_Controls->m_StartStopTrackingButton->setEnabled(false); m_Controls->m_FreezeUnfreezeTrackingButton->setEnabled(false); //initialize warning labels m_Controls->m_renderWarningLabel->setVisible(false); m_Controls->m_TrackingFrozenLabel->setVisible(false); //Update List of available models for selected tool. std::vector Compatibles; if ((m_Controls == NULL) || //check all these stuff for NULL, latterly this causes crashes from time to time (m_Controls->m_configurationWidget == NULL) || (m_Controls->m_configurationWidget->GetTrackingDevice().IsNull())) { MITK_ERROR << "Couldn't get current tracking device or an object is NULL, something went wrong!"; return; } else { Compatibles = m_DeviceTypeCollection->GetDeviceDataForLine(m_Controls->m_configurationWidget->GetTrackingDevice()->GetType()); } m_Controls->m_VolumeSelectionBox->clear(); for (std::size_t i = 0; i < Compatibles.size(); i++) { m_Controls->m_VolumeSelectionBox->addItem(Compatibles[i].Model.c_str()); } //initialize tool storage m_toolStorage = mitk::NavigationToolStorage::New(GetDataStorage()); m_toolStorage->SetName("TrackingToolbox Default Storage"); m_toolStorage->RegisterAsMicroservice("no tracking device"); //set home directory as default path for logfile m_Controls->m_LoggingFileName->setText(QDir::toNativeSeparators(QDir::homePath()) + QDir::separator() + "logfile.csv"); //tracking device may be changed already by the persistence of the //QmitkTrackingDeciveConfigurationWidget this->OnTrackingDeviceChanged(); this->LoadUISettings(); //add tracking volume node only to data storage this->GetDataStorage()->Add(m_TrackingVolumeNode); if (!m_Controls->m_ShowTrackingVolume->isChecked()) m_TrackingVolumeNode->SetOpacity(0.0); else m_TrackingVolumeNode->SetOpacity(0.25); //Update List of available models for selected tool. m_Controls->m_VolumeSelectionBox->clear(); for (std::size_t i = 0; i < Compatibles.size(); i++) { m_Controls->m_VolumeSelectionBox->addItem(Compatibles[i].Model.c_str()); } } } -void QmitkMITKIGTTrackingToolboxView::StdMultiWidgetAvailable(QmitkStdMultiWidget &stdMultiWidget) +void QmitkMITKIGTTrackingToolboxView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - -void QmitkMITKIGTTrackingToolboxView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->m_configurationWidget->setFocus(); } void QmitkMITKIGTTrackingToolboxView::OnLoadTools() { //read in filename QString filename = QFileDialog::getOpenFileName(NULL, tr("Open Tool Storage"), "/", tr("Tool Storage Files (*.IGTToolStorage)")); if (filename.isNull()) return; //read tool storage from disk std::string errorMessage = ""; mitk::NavigationToolStorageDeserializer::Pointer myDeserializer = mitk::NavigationToolStorageDeserializer::New(GetDataStorage()); // try-catch block for exceptions try { this->ReplaceCurrentToolStorage(myDeserializer->Deserialize(filename.toStdString()), filename.toStdString()); } catch (mitk::IGTException) { std::string errormessage = "Error during loading the tool storage file. Please only load tool storage files created with the NavigationToolManager view."; QMessageBox::warning(NULL, "Tool Storage Loading Error", errormessage.c_str()); return; } if (m_toolStorage->isEmpty()) { errorMessage = myDeserializer->GetErrorMessage(); MessageBox(errorMessage); return; } //update label UpdateToolStorageLabel(filename); //update tool preview m_Controls->m_TrackingToolsStatusWidget->RemoveStatusLabels(); m_Controls->m_TrackingToolsStatusWidget->PreShowTools(m_toolStorage); //save filename for persistent storage m_ToolStorageFilename = filename; } void QmitkMITKIGTTrackingToolboxView::OnResetTools() { this->ReplaceCurrentToolStorage(mitk::NavigationToolStorage::New(GetDataStorage()), "TrackingToolbox Default Storage"); m_Controls->m_TrackingToolsStatusWidget->RemoveStatusLabels(); QString toolLabel = QString(""); m_Controls->m_toolLabel->setText(toolLabel); m_ToolStorageFilename = ""; } void QmitkMITKIGTTrackingToolboxView::OnStartStopTracking() { if (!m_connected) { MITK_WARN << "Can't start tracking if no device is connected. Aborting"; return; } if (m_tracking) { OnStopTracking(); } else { OnStartTracking(); } } void QmitkMITKIGTTrackingToolboxView::OnFreezeUnfreezeTracking() { if (m_Controls->m_FreezeUnfreezeTrackingButton->text() == "Freeze Tracking") { m_TrackingDeviceSource->Freeze(); m_Controls->m_FreezeUnfreezeTrackingButton->setText("Unfreeze Tracking"); m_Controls->m_TrackingFrozenLabel->setVisible(true); } else if (m_Controls->m_FreezeUnfreezeTrackingButton->text() == "Unfreeze Tracking") { m_TrackingDeviceSource->UnFreeze(); m_Controls->m_FreezeUnfreezeTrackingButton->setText("Freeze Tracking"); m_Controls->m_TrackingFrozenLabel->setVisible(false); } } void QmitkMITKIGTTrackingToolboxView::OnConnectDisconnect() { if (m_connected) { OnDisconnect(); } else { OnConnect(); } } void QmitkMITKIGTTrackingToolboxView::OnConnect() { MITK_INFO << "Connect Clicked"; //check if everything is ready to start tracking if (this->m_toolStorage.IsNull()) { MessageBox("Error: No Tools Loaded Yet!"); return; } else if (this->m_toolStorage->GetToolCount() == 0) { MessageBox("Error: No Way To Track Without Tools!"); return; } //parse tracking device data mitk::TrackingDeviceData data = mitk::UnspecifiedTrackingTypeInformation::GetDeviceDataUnspecified(); QString qstr = m_Controls->m_VolumeSelectionBox->currentText(); if ((!qstr.isNull()) || (!qstr.isEmpty())) { std::string str = qstr.toStdString(); data = m_DeviceTypeCollection->GetDeviceDataByName(str); //Data will be set later, after device generation } //! [Thread 4] //initialize worker thread m_Worker->SetWorkerMethod(QmitkMITKIGTTrackingToolboxViewWorker::eConnectDevice); m_Worker->SetTrackingDevice(this->m_Controls->m_configurationWidget->GetTrackingDevice()); m_Worker->SetInverseMode(m_Controls->m_InverseMode->isChecked()); m_Worker->SetNavigationToolStorage(this->m_toolStorage); m_Worker->SetTrackingDeviceData(data); //start worker thread m_WorkerThread->start(); //! [Thread 4] //disable buttons this->m_Controls->m_MainWidget->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::EnableDisableTimerButtons(int enable) { bool enableBool = enable; m_Controls->m_UpdateRateOptionsGroupBox->setEnabled(!enableBool); m_Controls->m_renderWarningLabel->setVisible(enableBool); } void QmitkMITKIGTTrackingToolboxView::OnConnectFinished(bool success, QString errorMessage) { m_WorkerThread->quit(); m_WorkerThread->wait(); //enable buttons this->m_Controls->m_MainWidget->setEnabled(true); if (!success) { MITK_WARN << errorMessage.toStdString(); MessageBox(errorMessage.toStdString()); return; } //! [Thread 6] //get data from worker thread m_TrackingDeviceSource = m_Worker->GetTrackingDeviceSource(); m_TrackingDeviceData = m_Worker->GetTrackingDeviceData(); m_ToolVisualizationFilter = m_Worker->GetToolVisualizationFilter(); //! [Thread 6] //enable/disable Buttons DisableOptionsButtons(); DisableTrackingConfigurationButtons(); m_Controls->m_TrackingControlLabel->setText("Status: connected"); m_Controls->m_ConnectDisconnectButton->setText("Disconnect"); m_Controls->m_StartStopTrackingButton->setEnabled(true); m_connected = true; } void QmitkMITKIGTTrackingToolboxView::OnDisconnect() { m_Worker->SetWorkerMethod(QmitkMITKIGTTrackingToolboxViewWorker::eDisconnectDevice); m_WorkerThread->start(); m_Controls->m_MainWidget->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::OnDisconnectFinished(bool success, QString errorMessage) { m_WorkerThread->quit(); m_WorkerThread->wait(); m_Controls->m_MainWidget->setEnabled(true); if (!success) { MITK_WARN << errorMessage.toStdString(); MessageBox(errorMessage.toStdString()); return; } //enable/disable Buttons m_Controls->m_StartStopTrackingButton->setEnabled(false); EnableOptionsButtons(); EnableTrackingConfigurationButtons(); m_Controls->m_TrackingControlLabel->setText("Status: disconnected"); m_Controls->m_ConnectDisconnectButton->setText("Connect"); m_Controls->m_FreezeUnfreezeTrackingButton->setText("Freeze Tracking"); m_Controls->m_TrackingFrozenLabel->setVisible(false); m_connected = false; } void QmitkMITKIGTTrackingToolboxView::OnStartTracking() { //show tracking volume this->OnTrackingVolumeChanged(m_Controls->m_VolumeSelectionBox->currentText()); //Reset the view to a defined start. Do it here and not in OnStartTrackingFinished, to give other tracking devices the chance to reset the view to a different direction. this->GlobalReinit(); m_Worker->SetWorkerMethod(QmitkMITKIGTTrackingToolboxViewWorker::eStartTracking); m_WorkerThread->start(); this->m_Controls->m_MainWidget->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::OnStartTrackingFinished(bool success, QString errorMessage) { //! [Thread 5] m_WorkerThread->quit(); m_WorkerThread->wait(); //! [Thread 5] this->m_Controls->m_MainWidget->setEnabled(true); if (!success) { MessageBox(errorMessage.toStdString()); MITK_WARN << errorMessage.toStdString(); return; } if (!(m_Controls->m_DisableAllTimers->isChecked())) { if (m_Controls->m_UseDifferentUpdateRates->isChecked()) { if (m_Controls->m_RenderUpdateRate->value() != 0) m_TrackingRenderTimer->start(1000 / (m_Controls->m_RenderUpdateRate->value())); m_TrackingLoggingTimer->start(1000 / (m_Controls->m_LogUpdateRate->value())); } else { m_TrackingRenderTimer->start(1000 / (m_Controls->m_UpdateRate->value())); m_TrackingLoggingTimer->start(1000 / (m_Controls->m_UpdateRate->value())); } } m_Controls->m_TrackingControlLabel->setText("Status: tracking"); //connect the tool visualization widget for (std::size_t i = 0; i < m_TrackingDeviceSource->GetNumberOfOutputs(); i++) { m_Controls->m_TrackingToolsStatusWidget->AddNavigationData(m_TrackingDeviceSource->GetOutput(i)); } m_Controls->m_TrackingToolsStatusWidget->ShowStatusLabels(); if (m_Controls->m_ShowToolQuaternions->isChecked()) { m_Controls->m_TrackingToolsStatusWidget->SetShowQuaternions(true); } else { m_Controls->m_TrackingToolsStatusWidget->SetShowQuaternions(false); } //if activated enable open IGT link microservice if (m_Controls->m_EnableOpenIGTLinkMicroService->isChecked()) { //create convertion filter m_IGTLConversionFilter = mitk::NavigationDataToIGTLMessageFilter::New(); m_IGTLConversionFilter->SetName("IGT Tracking Toolbox"); m_IGTLConversionFilter->ConnectTo(m_ToolVisualizationFilter); m_IGTLConversionFilter->SetOperationMode(mitk::NavigationDataToIGTLMessageFilter::ModeSendTDataMsg); m_IGTLConversionFilter->RegisterAsMicroservice(); //create server and message provider m_IGTLServer = mitk::IGTLServer::New(false); m_IGTLServer->SetName("Tracking Toolbox IGTL Server"); m_IGTLMessageProvider = mitk::IGTLMessageProvider::New(); m_IGTLMessageProvider->SetIGTLDevice(m_IGTLServer); m_IGTLMessageProvider->RegisterAsMicroservice(); } m_tracking = true; m_Controls->m_ConnectDisconnectButton->setEnabled(false); m_Controls->m_StartStopTrackingButton->setText("Stop Tracking"); m_Controls->m_FreezeUnfreezeTrackingButton->setEnabled(true); } void QmitkMITKIGTTrackingToolboxView::OnStopTracking() { if (!m_tracking) return; m_TrackingRenderTimer->stop(); m_TrackingLoggingTimer->stop(); m_Worker->SetWorkerMethod(QmitkMITKIGTTrackingToolboxViewWorker::eStopTracking); m_WorkerThread->start(); m_Controls->m_MainWidget->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::OnStopTrackingFinished(bool success, QString errorMessage) { m_WorkerThread->quit(); m_WorkerThread->wait(); m_Controls->m_MainWidget->setEnabled(true); if (!success) { MessageBox(errorMessage.toStdString()); MITK_WARN << errorMessage.toStdString(); return; } m_Controls->m_TrackingControlLabel->setText("Status: connected"); if (m_logging) StopLogging(); m_Controls->m_TrackingToolsStatusWidget->RemoveStatusLabels(); m_Controls->m_TrackingToolsStatusWidget->PreShowTools(m_toolStorage); m_tracking = false; m_Controls->m_StartStopTrackingButton->setText("Start Tracking"); m_Controls->m_ConnectDisconnectButton->setEnabled(true); m_Controls->m_FreezeUnfreezeTrackingButton->setEnabled(false); //unregister open IGT link micro service if (m_Controls->m_EnableOpenIGTLinkMicroService->isChecked()) { m_IGTLConversionFilter->UnRegisterMicroservice(); m_IGTLMessageProvider->UnRegisterMicroservice(); } } void QmitkMITKIGTTrackingToolboxView::OnTrackingDeviceChanged() { mitk::TrackingDeviceType Type; if (m_Controls->m_configurationWidget->GetTrackingDevice().IsNotNull()) { Type = m_Controls->m_configurationWidget->GetTrackingDevice()->GetType(); //enable controls because device is valid m_Controls->m_TrackingToolsGoupBox->setEnabled(true); m_Controls->m_TrackingControlsGroupBox->setEnabled(true); } else { Type = mitk::UnspecifiedTrackingTypeInformation::GetTrackingDeviceName(); MessageBox("Error: This tracking device is not included in this project. Please make sure that the device is installed and activated in your MITK build."); m_Controls->m_TrackingToolsGoupBox->setEnabled(false); m_Controls->m_TrackingControlsGroupBox->setEnabled(false); return; } // Code to enable/disable device specific buttons if (Type == mitk::NDIAuroraTypeInformation::GetTrackingDeviceName()) //Aurora { m_Controls->m_AutoDetectTools->setVisible(true); m_Controls->m_AddSingleTool->setEnabled(false); } else //Polaris or Microntracker { m_Controls->m_AutoDetectTools->setVisible(false); m_Controls->m_AddSingleTool->setEnabled(true); } // Code to select appropriate tracking volume for current type std::vector Compatibles = m_DeviceTypeCollection->GetDeviceDataForLine(Type); m_Controls->m_VolumeSelectionBox->clear(); for (std::size_t i = 0; i < Compatibles.size(); i++) { m_Controls->m_VolumeSelectionBox->addItem(Compatibles[i].Model.c_str()); } } void QmitkMITKIGTTrackingToolboxView::OnTrackingVolumeChanged(QString qstr) { if (qstr.isNull()) return; if (qstr.isEmpty()) return; mitk::TrackingVolumeGenerator::Pointer volumeGenerator = mitk::TrackingVolumeGenerator::New(); std::string str = qstr.toStdString(); mitk::TrackingDeviceData data = m_DeviceTypeCollection->GetDeviceDataByName(str); m_TrackingDeviceData = data; volumeGenerator->SetTrackingDeviceData(data); volumeGenerator->Update(); mitk::Surface::Pointer volumeSurface = volumeGenerator->GetOutput(); m_TrackingVolumeNode->SetData(volumeSurface); if (!m_Controls->m_ShowTrackingVolume->isChecked()) m_TrackingVolumeNode->SetOpacity(0.0); else m_TrackingVolumeNode->SetOpacity(0.25); GlobalReinit(); } void QmitkMITKIGTTrackingToolboxView::OnShowTrackingVolumeChanged() { if (m_Controls->m_ShowTrackingVolume->isChecked()) { OnTrackingVolumeChanged(m_Controls->m_VolumeSelectionBox->currentText()); m_TrackingVolumeNode->SetOpacity(0.25); } else { m_TrackingVolumeNode->SetOpacity(0.0); } } void QmitkMITKIGTTrackingToolboxView::OnAutoDetectTools() { if (m_Controls->m_configurationWidget->GetTrackingDevice()->GetType() == mitk::NDIAuroraTypeInformation::GetTrackingDeviceName()) { DisableTrackingConfigurationButtons(); m_Worker->SetWorkerMethod(QmitkMITKIGTTrackingToolboxViewWorker::eAutoDetectTools); m_Worker->SetTrackingDevice(m_Controls->m_configurationWidget->GetTrackingDevice().GetPointer()); m_Worker->SetDataStorage(this->GetDataStorage()); m_WorkerThread->start(); m_TimeoutTimer->start(5000); MITK_INFO << "Timeout Timer started"; //disable controls until worker thread is finished this->m_Controls->m_MainWidget->setEnabled(false); } } void QmitkMITKIGTTrackingToolboxView::OnAutoDetectToolsFinished(bool success, QString errorMessage) { m_TimeoutTimer->stop(); m_WorkerThread->quit(); m_WorkerThread->wait(); //enable controls again this->m_Controls->m_MainWidget->setEnabled(true); EnableTrackingConfigurationButtons(); if (!success) { MITK_WARN << errorMessage.toStdString(); MessageBox(errorMessage.toStdString()); EnableTrackingConfigurationButtons(); return; } mitk::NavigationToolStorage::Pointer autoDetectedStorage = m_Worker->GetNavigationToolStorage(); //save detected tools this->ReplaceCurrentToolStorage(autoDetectedStorage, "Autodetected NDI Aurora Storage"); //auto save the new storage to hard disc (for persistence) AutoSaveToolStorage(); //update label QString toolLabel = QString("Loaded Tools: ") + QString::number(m_toolStorage->GetToolCount()) + " Tools (Auto Detected)"; m_Controls->m_toolLabel->setText(toolLabel); //update tool preview m_Controls->m_TrackingToolsStatusWidget->RemoveStatusLabels(); m_Controls->m_TrackingToolsStatusWidget->PreShowTools(m_toolStorage); EnableTrackingConfigurationButtons(); if (m_toolStorage->GetToolCount() > 0) { //ask the user if he wants to save the detected tools QMessageBox msgBox; switch (m_toolStorage->GetToolCount()) { case 1: msgBox.setText("Found one tool!"); break; default: msgBox.setText("Found " + QString::number(m_toolStorage->GetToolCount()) + " tools!"); } msgBox.setInformativeText("Do you want to save this tools as tool storage, so you can load them again?"); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); if (ret == 16384) //yes { //ask the user for a filename QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save File"), "/", tr("*.IGTToolStorage")); //check for empty filename if (fileName == "") { return; } mitk::NavigationToolStorageSerializer::Pointer mySerializer = mitk::NavigationToolStorageSerializer::New(); //when Serialize method is used exceptions are thrown, need to be adapted //try-catch block for exception handling in Serializer try { mySerializer->Serialize(fileName.toStdString(), m_toolStorage); } catch (mitk::IGTException) { std::string errormessage = "Error during serialization. Please check the Zip file."; QMessageBox::warning(NULL, "IGTPlayer: Error", errormessage.c_str()); } return; } else if (ret == 65536) //no { return; } } //print a logging message about the detected tools switch (m_toolStorage->GetToolCount()) { case 0: MITK_INFO("IGT Tracking Toolbox") << "Found no tools. Empty ToolStorage was autosaved to " << m_ToolStorageFilename.toStdString(); break; case 1: MITK_INFO("IGT Tracking Toolbox") << "Found one tool. ToolStorage was autosaved to " << m_ToolStorageFilename.toStdString(); break; default: MITK_INFO("IGT Tracking Toolbox") << "Found " << m_toolStorage->GetToolCount() << " tools. ToolStorage was autosaved to " << m_ToolStorageFilename.toStdString(); } } void QmitkMITKIGTTrackingToolboxView::MessageBox(std::string s) { QMessageBox msgBox; msgBox.setText(s.c_str()); msgBox.exec(); } void QmitkMITKIGTTrackingToolboxView::UpdateRenderTrackingTimer() { //update filter m_ToolVisualizationFilter->Update(); MITK_DEBUG << "Number of outputs ToolVisualizationFilter: " << m_ToolVisualizationFilter->GetNumberOfIndexedOutputs(); MITK_DEBUG << "Number of inputs ToolVisualizationFilter: " << m_ToolVisualizationFilter->GetNumberOfIndexedInputs(); //update tool colors to show tool status for (unsigned int i = 0; i < m_ToolVisualizationFilter->GetNumberOfIndexedOutputs(); i++) { mitk::NavigationData::Pointer currentTool = m_ToolVisualizationFilter->GetOutput(i); if (currentTool->IsDataValid()) { this->m_toolStorage->GetTool(i)->GetDataNode()->SetColor(mitk::IGTColor_VALID); } else { this->m_toolStorage->GetTool(i)->GetDataNode()->SetColor(mitk::IGTColor_WARNING); } } //refresh view and status widget mitk::RenderingManager::GetInstance()->RequestUpdateAll(); m_Controls->m_TrackingToolsStatusWidget->Refresh(); //code to better isolate bug 17713, could be removed when bug 17713 is fixed static int i = 0; static mitk::Point3D lastPositionTool1 = m_ToolVisualizationFilter->GetOutput(0)->GetPosition(); static itk::TimeStamp lastTimeStamp = m_ToolVisualizationFilter->GetOutput(0)->GetTimeStamp(); i++; //every 20 frames: check if tracking is frozen if (i > 20) { i = 0; if (m_ToolVisualizationFilter->GetOutput(0)->IsDataValid()) { if (mitk::Equal(lastPositionTool1, m_ToolVisualizationFilter->GetOutput(0)->GetPosition(), 0.000000001, false) && m_Controls->m_configurationWidget->GetTrackingDevice()->GetType() != "Da Vinci") { MITK_WARN << "Seems as tracking (of at least tool 1) is frozen which means that bug 17713 occurred. Restart tracking might help."; //display further information to find the bug MITK_WARN << "Timestamp of current navigation data: " << m_ToolVisualizationFilter->GetOutput(0)->GetTimeStamp(); MITK_WARN << "Timestamp of last navigation data (which holds the same values): " << lastTimeStamp; } lastPositionTool1 = m_ToolVisualizationFilter->GetOutput(0)->GetPosition(); lastTimeStamp = m_ToolVisualizationFilter->GetOutput(0)->GetTimeStamp(); } } } void QmitkMITKIGTTrackingToolboxView::UpdateLoggingTrackingTimer() { //update logging if (m_logging) { this->m_loggingFilter->Update(); m_loggedFrames = this->m_loggingFilter->GetNumberOfRecordedSteps(); this->m_Controls->m_LoggedFramesLabel->setText("Logged Frames: " + QString::number(m_loggedFrames)); //check if logging stopped automatically if ((m_loggedFrames > 1) && (!m_loggingFilter->GetRecording())){ StopLogging(); } } //refresh status widget m_Controls->m_TrackingToolsStatusWidget->Refresh(); } void QmitkMITKIGTTrackingToolboxView::OnChooseFileClicked() { QDir currentPath = QFileInfo(m_Controls->m_LoggingFileName->text()).dir(); // if no path was selected (QDir would select current working dir then) or the // selected path does not exist -> use home directory if (currentPath == QDir() || !currentPath.exists()) { currentPath = QDir(QDir::homePath()); } QString filename = QFileDialog::getSaveFileName(NULL, tr("Choose Logging File"), currentPath.absolutePath(), "*.*"); if (filename == "") return; this->m_Controls->m_LoggingFileName->setText(filename); this->OnToggleFileExtension(); } // bug-16470: toggle file extension after clicking on radio button void QmitkMITKIGTTrackingToolboxView::OnToggleFileExtension() { QString currentInputText = this->m_Controls->m_LoggingFileName->text(); QString currentFile = QFileInfo(currentInputText).baseName(); QDir currentPath = QFileInfo(currentInputText).dir(); if (currentFile.isEmpty()) { currentFile = "logfile"; } // Setting currentPath to default home path when currentPath is empty or it does not exist if (currentPath == QDir() || !currentPath.exists()) { currentPath = QDir::homePath(); } // check if csv radio button is clicked if (this->m_Controls->m_csvFormat->isChecked()) { // you needn't add a seperator to the input text when currentpath is the rootpath if (currentPath.isRoot()) { this->m_Controls->m_LoggingFileName->setText(QDir::toNativeSeparators(currentPath.absolutePath()) + currentFile + ".csv"); } else { this->m_Controls->m_LoggingFileName->setText(QDir::toNativeSeparators(currentPath.absolutePath()) + QDir::separator() + currentFile + ".csv"); } } // check if xml radio button is clicked else if (this->m_Controls->m_xmlFormat->isChecked()) { // you needn't add a seperator to the input text when currentpath is the rootpath if (currentPath.isRoot()) { this->m_Controls->m_LoggingFileName->setText(QDir::toNativeSeparators(currentPath.absolutePath()) + currentFile + ".xml"); } else { this->m_Controls->m_LoggingFileName->setText(QDir::toNativeSeparators(currentPath.absolutePath()) + QDir::separator() + currentFile + ".xml"); } } } void QmitkMITKIGTTrackingToolboxView::OnToggleDifferentUpdateRates() { if (m_Controls->m_UseDifferentUpdateRates->isChecked()) { if (m_Controls->m_RenderUpdateRate->value() == 0) m_Controls->m_renderWarningLabel->setVisible(true); else m_Controls->m_renderWarningLabel->setVisible(false); m_Controls->m_UpdateRate->setEnabled(false); m_Controls->m_OptionsUpdateRateLabel->setEnabled(false); m_Controls->m_RenderUpdateRate->setEnabled(true); m_Controls->m_OptionsRenderUpdateRateLabel->setEnabled(true); m_Controls->m_LogUpdateRate->setEnabled(true); m_Controls->m_OptionsLogUpdateRateLabel->setEnabled(true); } else { m_Controls->m_renderWarningLabel->setVisible(false); m_Controls->m_UpdateRate->setEnabled(true); m_Controls->m_OptionsUpdateRateLabel->setEnabled(true); m_Controls->m_RenderUpdateRate->setEnabled(false); m_Controls->m_OptionsRenderUpdateRateLabel->setEnabled(false); m_Controls->m_LogUpdateRate->setEnabled(false); m_Controls->m_OptionsLogUpdateRateLabel->setEnabled(false); } } void QmitkMITKIGTTrackingToolboxView::OnChangeRenderUpdateRate() { if (m_Controls->m_RenderUpdateRate->value() == 0) m_Controls->m_renderWarningLabel->setVisible(true); else m_Controls->m_renderWarningLabel->setVisible(false); } void QmitkMITKIGTTrackingToolboxView::StartLogging() { if (m_ToolVisualizationFilter.IsNull()) { MessageBox("Cannot activate logging without a connected device. Configure and connect a tracking device first."); return; } if (!m_logging) { //initialize logging filter m_loggingFilter = mitk::NavigationDataRecorder::New(); m_loggingFilter->ConnectTo(m_ToolVisualizationFilter); if (m_Controls->m_LoggingLimit->isChecked()){ m_loggingFilter->SetRecordCountLimit(m_Controls->m_LoggedFramesLimit->value()); } //start filter with try-catch block for exceptions try { m_loggingFilter->StartRecording(); } catch (mitk::IGTException) { std::string errormessage = "Error during start recording. Recorder already started recording?"; QMessageBox::warning(NULL, "IGTPlayer: Error", errormessage.c_str()); m_loggingFilter->StopRecording(); return; } //update labels / logging variables this->m_Controls->m_LoggingLabel->setText("Logging ON"); this->m_Controls->m_LoggedFramesLabel->setText("Logged Frames: 0"); m_loggedFrames = 0; m_logging = true; DisableLoggingButtons(); } } void QmitkMITKIGTTrackingToolboxView::StopLogging() { if (m_logging) { //stop logging m_loggingFilter->StopRecording(); m_logging = false; //update GUI this->m_Controls->m_LoggingLabel->setText("Logging OFF"); EnableLoggingButtons(); //write the results to a file if (m_Controls->m_csvFormat->isChecked()) { mitk::IOUtil::SaveBaseData(m_loggingFilter->GetNavigationDataSet(), this->m_Controls->m_LoggingFileName->text().toStdString()); } else if (m_Controls->m_xmlFormat->isChecked()) { mitk::IOUtil::SaveBaseData(m_loggingFilter->GetNavigationDataSet(), this->m_Controls->m_LoggingFileName->text().toStdString()); } } } void QmitkMITKIGTTrackingToolboxView::OnAddSingleTool() { QString Identifier = "Tool#"; QString Name = "NewTool"; if (m_toolStorage.IsNotNull()) { Identifier += QString::number(m_toolStorage->GetToolCount()); Name += QString::number(m_toolStorage->GetToolCount()); } else { Identifier += "0"; Name += "0"; } m_Controls->m_NavigationToolCreationWidget->Initialize(GetDataStorage(), Identifier.toStdString(), Name.toStdString()); m_Controls->m_NavigationToolCreationWidget->SetTrackingDeviceType(m_Controls->m_configurationWidget->GetTrackingDevice()->GetType(), false); m_Controls->m_TrackingToolsWidget->setCurrentIndex(1); //disable tracking volume during tool editing lastTrackingVolumeState = m_Controls->m_ShowTrackingVolume->isChecked(); if (lastTrackingVolumeState) m_Controls->m_ShowTrackingVolume->click(); GlobalReinit(); } void QmitkMITKIGTTrackingToolboxView::OnAddSingleToolFinished() { m_Controls->m_TrackingToolsWidget->setCurrentIndex(0); if (this->m_toolStorage.IsNull()) { //this shouldn't happen! MITK_WARN << "No ToolStorage available, cannot add tool, aborting!"; return; } m_toolStorage->AddTool(m_Controls->m_NavigationToolCreationWidget->GetCreatedTool()); m_Controls->m_TrackingToolsStatusWidget->PreShowTools(m_toolStorage); m_Controls->m_toolLabel->setText(""); //auto save current storage for persistence MITK_INFO << "Auto saving manually added tools for persistence."; AutoSaveToolStorage(); //enable tracking volume again if (lastTrackingVolumeState) m_Controls->m_ShowTrackingVolume->click(); GlobalReinit(); } void QmitkMITKIGTTrackingToolboxView::OnAddSingleToolCanceled() { m_Controls->m_TrackingToolsWidget->setCurrentIndex(0); //enable tracking volume again if (lastTrackingVolumeState) m_Controls->m_ShowTrackingVolume->click(); GlobalReinit(); } void QmitkMITKIGTTrackingToolboxView::GlobalReinit() { // get all nodes that have not set "includeInBoundingBox" to false mitk::NodePredicateNot::Pointer pred = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("includeInBoundingBox", mitk::BoolProperty::New(false))); mitk::DataStorage::SetOfObjects::ConstPointer rs = this->GetDataStorage()->GetSubset(pred); // calculate bounding geometry of these nodes mitk::TimeGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(rs, "visible"); // initialize the views to the bounding geometry mitk::RenderingManager::GetInstance()->InitializeViews(bounds); } void QmitkMITKIGTTrackingToolboxView::DisableLoggingButtons() { m_Controls->m_StartLogging->setEnabled(false); m_Controls->m_LoggingFileName->setEnabled(false); m_Controls->m_ChooseFile->setEnabled(false); m_Controls->m_LoggingLimit->setEnabled(false); m_Controls->m_LoggedFramesLimit->setEnabled(false); m_Controls->m_csvFormat->setEnabled(false); m_Controls->m_xmlFormat->setEnabled(false); m_Controls->m_StopLogging->setEnabled(true); } void QmitkMITKIGTTrackingToolboxView::EnableLoggingButtons() { m_Controls->m_StartLogging->setEnabled(true); m_Controls->m_LoggingFileName->setEnabled(true); m_Controls->m_ChooseFile->setEnabled(true); m_Controls->m_LoggingLimit->setEnabled(true); m_Controls->m_LoggedFramesLimit->setEnabled(true); m_Controls->m_csvFormat->setEnabled(true); m_Controls->m_xmlFormat->setEnabled(true); m_Controls->m_StopLogging->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::DisableOptionsButtons() { m_Controls->m_ShowTrackingVolume->setEnabled(false); m_Controls->m_UseDifferentUpdateRates->setEnabled(false); m_Controls->m_UpdateRate->setEnabled(false); m_Controls->m_OptionsUpdateRateLabel->setEnabled(false); m_Controls->m_RenderUpdateRate->setEnabled(false); m_Controls->m_OptionsRenderUpdateRateLabel->setEnabled(false); m_Controls->m_LogUpdateRate->setEnabled(false); m_Controls->m_OptionsLogUpdateRateLabel->setEnabled(false); m_Controls->m_DisableAllTimers->setEnabled(false); m_Controls->m_OtherOptionsGroupBox->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::EnableOptionsButtons() { m_Controls->m_ShowTrackingVolume->setEnabled(true); m_Controls->m_UseDifferentUpdateRates->setEnabled(true); m_Controls->m_DisableAllTimers->setEnabled(true); m_Controls->m_OtherOptionsGroupBox->setEnabled(true); OnToggleDifferentUpdateRates(); } void QmitkMITKIGTTrackingToolboxView::EnableTrackingControls() { m_Controls->m_TrackingControlsGroupBox->setEnabled(true); } void QmitkMITKIGTTrackingToolboxView::DisableTrackingControls() { m_Controls->m_TrackingControlsGroupBox->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::EnableTrackingConfigurationButtons() { m_Controls->m_AutoDetectTools->setEnabled(true); if (m_Controls->m_configurationWidget->GetTrackingDevice()->GetType() != mitk::NDIAuroraTypeInformation::GetTrackingDeviceName()) m_Controls->m_AddSingleTool->setEnabled(true); m_Controls->m_LoadTools->setEnabled(true); m_Controls->m_ResetTools->setEnabled(true); } void QmitkMITKIGTTrackingToolboxView::DisableTrackingConfigurationButtons() { m_Controls->m_AutoDetectTools->setEnabled(false); if (m_Controls->m_configurationWidget->GetTrackingDevice()->GetType() != mitk::NDIAuroraTypeInformation::GetTrackingDeviceName()) m_Controls->m_AddSingleTool->setEnabled(false); m_Controls->m_LoadTools->setEnabled(false); m_Controls->m_ResetTools->setEnabled(false); } void QmitkMITKIGTTrackingToolboxView::ReplaceCurrentToolStorage(mitk::NavigationToolStorage::Pointer newStorage, std::string newStorageName) { //first: get rid of the old one //don't reset if there is no tool storage. BugFix #17793 if (m_toolStorage.IsNotNull()){ m_toolStorage->UnLockStorage(); //only to be sure... m_toolStorage->UnRegisterMicroservice(); m_toolStorage = nullptr; } //now: replace by the new one m_toolStorage = newStorage; m_toolStorage->SetName(newStorageName); m_toolStorage->RegisterAsMicroservice("no tracking device"); } void QmitkMITKIGTTrackingToolboxView::OnTimeOut() { MITK_INFO << "Time Out"; m_WorkerThread->terminate(); m_WorkerThread->wait(); m_TimeoutTimer->stop(); } //! [StoreUISettings] void QmitkMITKIGTTrackingToolboxView::StoreUISettings() { // persistence service does not directly work in plugins for now // -> using QSettings QSettings settings; settings.beginGroup(QString::fromStdString(VIEW_ID)); // set the values of some widgets and attrbutes to the QSettings settings.setValue("ShowTrackingVolume", QVariant(m_Controls->m_ShowTrackingVolume->isChecked())); settings.setValue("toolStorageFilename", QVariant(m_ToolStorageFilename)); settings.setValue("VolumeSelectionBox", QVariant(m_Controls->m_VolumeSelectionBox->currentIndex())); settings.endGroup(); } //! [StoreUISettings] //! [LoadUISettings] void QmitkMITKIGTTrackingToolboxView::LoadUISettings() { // persistence service does not directly work in plugins for now // -> using QSettings QSettings settings; settings.beginGroup(QString::fromStdString(VIEW_ID)); // set some widgets and attributes by the values from the QSettings m_Controls->m_ShowTrackingVolume->setChecked(settings.value("ShowTrackingVolume", true).toBool()); m_Controls->m_VolumeSelectionBox->setCurrentIndex(settings.value("VolumeSelectionBox", 0).toInt()); m_ToolStorageFilename = settings.value("toolStorageFilename", QVariant("")).toString(); settings.endGroup(); //! [LoadUISettings] //! [LoadToolStorage] // try to deserialize the tool storage from the given tool storage file name if (!m_ToolStorageFilename.isEmpty()) { // try-catch block for exceptions try { mitk::NavigationToolStorageDeserializer::Pointer myDeserializer = mitk::NavigationToolStorageDeserializer::New(GetDataStorage()); m_toolStorage->UnRegisterMicroservice(); m_toolStorage = myDeserializer->Deserialize(m_ToolStorageFilename.toStdString()); m_toolStorage->RegisterAsMicroservice("no tracking device"); //update label UpdateToolStorageLabel(m_ToolStorageFilename); //update tool preview m_Controls->m_TrackingToolsStatusWidget->RemoveStatusLabels(); m_Controls->m_TrackingToolsStatusWidget->PreShowTools(m_toolStorage); } catch (mitk::IGTException) { MITK_WARN("QmitkMITKIGTTrackingToolBoxView") << "Error during restoring tools. Problems with file (" << m_ToolStorageFilename.toStdString() << "), please check the file?"; this->OnResetTools(); //if there where errors reset the tool storage to avoid problems later on } } //! [LoadToolStorage] } void QmitkMITKIGTTrackingToolboxView::UpdateToolStorageLabel(QString pathOfLoadedStorage) { QFileInfo myPath(pathOfLoadedStorage); //use this to seperate filename from path QString toolLabel = myPath.fileName(); if (toolLabel.size() > 45) //if the tool storage name is to long trimm the string { toolLabel.resize(40); toolLabel += "[...]"; } m_Controls->m_toolLabel->setText(toolLabel); } void QmitkMITKIGTTrackingToolboxView::AutoSaveToolStorage() { m_ToolStorageFilename = m_AutoSaveFilename; mitk::NavigationToolStorageSerializer::Pointer mySerializer = mitk::NavigationToolStorageSerializer::New(); mySerializer->Serialize(m_ToolStorageFilename.toStdString(), m_toolStorage); } void QmitkMITKIGTTrackingToolboxViewWorker::SetWorkerMethod(WorkerMethod w) { m_WorkerMethod = w; } void QmitkMITKIGTTrackingToolboxViewWorker::SetTrackingDevice(mitk::TrackingDevice::Pointer t) { m_TrackingDevice = t; } void QmitkMITKIGTTrackingToolboxViewWorker::SetDataStorage(mitk::DataStorage::Pointer d) { m_DataStorage = d; } void QmitkMITKIGTTrackingToolboxViewWorker::SetInverseMode(bool mode) { m_InverseMode = mode; } void QmitkMITKIGTTrackingToolboxViewWorker::SetTrackingDeviceData(mitk::TrackingDeviceData d) { m_TrackingDeviceData = d; } void QmitkMITKIGTTrackingToolboxViewWorker::SetNavigationToolStorage(mitk::NavigationToolStorage::Pointer n) { m_NavigationToolStorage = n; } //! [Thread 7] void QmitkMITKIGTTrackingToolboxViewWorker::ThreadFunc() { switch (m_WorkerMethod) { case eAutoDetectTools: this->AutoDetectTools(); break; case eConnectDevice: this->ConnectDevice(); break; case eStartTracking: this->StartTracking(); break; case eStopTracking: this->StopTracking(); break; case eDisconnectDevice: this->DisconnectDevice(); break; default: MITK_WARN << "Undefined worker method was set ... something went wrong!"; break; } } //! [Thread 7] void QmitkMITKIGTTrackingToolboxViewWorker::AutoDetectTools() { mitk::ProgressBar::GetInstance()->AddStepsToDo(4); mitk::NavigationToolStorage::Pointer autoDetectedStorage = mitk::NavigationToolStorage::New(m_DataStorage); mitk::NDITrackingDevice::Pointer currentDevice = dynamic_cast(m_TrackingDevice.GetPointer()); try { currentDevice->OpenConnection(); mitk::ProgressBar::GetInstance()->Progress(); currentDevice->StartTracking(); } catch (mitk::Exception& e) { QString message = QString("Warning, can not auto-detect tools! (") + QString(e.GetDescription()) + QString(")"); //MessageBox(message.toStdString()); //TODO: give message to the user here! MITK_WARN << message.toStdString(); mitk::ProgressBar::GetInstance()->Progress(4); emit AutoDetectToolsFinished(false, message.toStdString().c_str()); return; } for (unsigned int i = 0; i < currentDevice->GetToolCount(); i++) { //create a navigation tool with sphere as surface std::stringstream toolname; toolname << "AutoDetectedTool" << i; mitk::NavigationTool::Pointer newTool = mitk::NavigationTool::New(); newTool->SetSerialNumber(dynamic_cast(currentDevice->GetTool(i))->GetSerialNumber()); newTool->SetIdentifier(toolname.str()); newTool->SetTrackingDeviceType(mitk::NDIAuroraTypeInformation::GetTrackingDeviceName()); mitk::DataNode::Pointer newNode = mitk::DataNode::New(); mitk::Surface::Pointer mySphere = mitk::Surface::New(); vtkSphereSource *vtkData = vtkSphereSource::New(); vtkData->SetRadius(3.0f); vtkData->SetCenter(0.0, 0.0, 0.0); vtkData->Update(); mySphere->SetVtkPolyData(vtkData->GetOutput()); vtkData->Delete(); newNode->SetData(mySphere); newNode->SetName(toolname.str()); newTool->SetDataNode(newNode); autoDetectedStorage->AddTool(newTool); } m_NavigationToolStorage = autoDetectedStorage; currentDevice->StopTracking(); mitk::ProgressBar::GetInstance()->Progress(); currentDevice->CloseConnection(); emit AutoDetectToolsFinished(true, ""); mitk::ProgressBar::GetInstance()->Progress(4); } void QmitkMITKIGTTrackingToolboxViewWorker::ConnectDevice() { std::string message = ""; mitk::ProgressBar::GetInstance()->AddStepsToDo(10); //build the IGT pipeline mitk::TrackingDevice::Pointer trackingDevice = m_TrackingDevice; trackingDevice->SetData(m_TrackingDeviceData); //set device to rotation mode transposed becaus we are working with VNL style quaternions if (m_InverseMode) { trackingDevice->SetRotationMode(mitk::TrackingDevice::RotationTransposed); } //Get Tracking Volume Data mitk::TrackingDeviceData data = m_TrackingDeviceData; mitk::ProgressBar::GetInstance()->Progress(); //Create Navigation Data Source with the factory class mitk::TrackingDeviceSourceConfigurator::Pointer myTrackingDeviceSourceFactory = mitk::TrackingDeviceSourceConfigurator::New(m_NavigationToolStorage, trackingDevice); m_TrackingDeviceSource = myTrackingDeviceSourceFactory->CreateTrackingDeviceSource(m_ToolVisualizationFilter); mitk::ProgressBar::GetInstance()->Progress(); if (m_TrackingDeviceSource.IsNull()) { message = std::string("Cannot connect to device: ") + myTrackingDeviceSourceFactory->GetErrorMessage(); emit ConnectDeviceFinished(false, QString(message.c_str())); return; } //set filter to rotation mode transposed becaus we are working with VNL style quaternions if (m_InverseMode) m_ToolVisualizationFilter->SetRotationMode(mitk::NavigationDataObjectVisualizationFilter::RotationTransposed); //First check if the created object is valid if (m_TrackingDeviceSource.IsNull()) { message = myTrackingDeviceSourceFactory->GetErrorMessage(); emit ConnectDeviceFinished(false, QString(message.c_str())); return; } MITK_INFO << "Number of tools: " << m_TrackingDeviceSource->GetNumberOfOutputs(); mitk::ProgressBar::GetInstance()->Progress(); //The tools are maybe reordered after initialization, e.g. in case of auto-detected tools of NDI Aurora mitk::NavigationToolStorage::Pointer toolsInNewOrder = myTrackingDeviceSourceFactory->GetUpdatedNavigationToolStorage(); if ((toolsInNewOrder.IsNotNull()) && (toolsInNewOrder->GetToolCount() > 0)) { //so delete the old tools in wrong order and add them in the right order //we cannot simply replace the tool storage because the new storage is //not correctly initialized with the right data storage /* m_NavigationToolStorage->DeleteAllTools(); for (int i=0; i < toolsInNewOrder->GetToolCount(); i++) {m_NavigationToolStorage->AddTool(toolsInNewOrder->GetTool(i));} This was replaced and thereby fixed Bug 18318 DeleteAllTools() is not Threadsafe! */ for (int i = 0; i < toolsInNewOrder->GetToolCount(); i++) { m_NavigationToolStorage->AssignToolNumber(toolsInNewOrder->GetTool(i)->GetIdentifier(), i); } } mitk::ProgressBar::GetInstance()->Progress(); //connect to device try { m_TrackingDeviceSource->Connect(); mitk::ProgressBar::GetInstance()->Progress(); //Microservice registration: m_TrackingDeviceSource->RegisterAsMicroservice(); m_NavigationToolStorage->UnRegisterMicroservice(); m_NavigationToolStorage->RegisterAsMicroservice(m_TrackingDeviceSource->GetMicroserviceID()); m_NavigationToolStorage->LockStorage(); } catch (...) //todo: change to mitk::IGTException { message = "Error on connecting the tracking device."; emit ConnectDeviceFinished(false, QString(message.c_str())); return; } emit ConnectDeviceFinished(true, QString(message.c_str())); mitk::ProgressBar::GetInstance()->Progress(10); } void QmitkMITKIGTTrackingToolboxViewWorker::StartTracking() { QString errorMessage = ""; try { m_TrackingDeviceSource->StartTracking(); } catch (...) //todo: change to mitk::IGTException { errorMessage += "Error while starting the tracking device!"; emit StartTrackingFinished(false, errorMessage); return; } //remember the original colors of the tools m_OriginalColors = std::map(); for (int i = 0; i < this->m_NavigationToolStorage->GetToolCount(); i++) { mitk::DataNode::Pointer currentToolNode = m_NavigationToolStorage->GetTool(i)->GetDataNode(); float c[3]; currentToolNode->GetColor(c); mitk::Color color; color.SetRed(c[0]); color.SetGreen(c[1]); color.SetBlue(c[2]); m_OriginalColors[currentToolNode] = color; } emit StartTrackingFinished(true, errorMessage); } void QmitkMITKIGTTrackingToolboxViewWorker::StopTracking() { //stop tracking try { m_TrackingDeviceSource->StopTracking(); } catch (mitk::Exception& e) { emit StopTrackingFinished(false, e.GetDescription()); } //restore the original colors of the tools for (int i = 0; i < this->m_NavigationToolStorage->GetToolCount(); i++) { mitk::DataNode::Pointer currentToolNode = m_NavigationToolStorage->GetTool(i)->GetDataNode(); if (m_OriginalColors.find(currentToolNode) == m_OriginalColors.end()) { MITK_WARN << "Cannot restore original color of tool " << m_NavigationToolStorage->GetTool(i)->GetToolName(); } else { currentToolNode->SetColor(m_OriginalColors[currentToolNode]); } } //emit signal emit StopTrackingFinished(true, ""); } void QmitkMITKIGTTrackingToolboxViewWorker::DisconnectDevice() { try { if (m_TrackingDeviceSource->IsTracking()) { m_TrackingDeviceSource->StopTracking(); } m_TrackingDeviceSource->Disconnect(); m_TrackingDeviceSource->UnRegisterMicroservice(); m_NavigationToolStorage->UnLockStorage(); } catch (mitk::Exception& e) { emit DisconnectDeviceFinished(false, e.GetDescription()); } emit DisconnectDeviceFinished(true, ""); } \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.h b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.h index 406dcfafd6..ac58bbf9cc 100644 --- a/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.h +++ b/Plugins/org.mitk.gui.qt.igttracking/src/internal/QmitkMITKIGTTrackingToolboxView.h @@ -1,306 +1,302 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkMITKIGTTrackingToolboxView_h #define QmitkMITKIGTTrackingToolboxView_h #include -#include +#include #include "ui_QmitkMITKIGTTrackingToolboxViewControls.h" //mitk headers #include #include #include #include #include #include #include //QT headers #include class QmitkMITKIGTTrackingToolboxViewWorker; /*! \brief QmitkMITKIGTTrackingToolboxView This is the view of the bundle IGT Tracking Toolbox. The IGT Tracking Toolbox can be used to access tracking devices with MITK-IGT. The Tracking Toolbox can be used to log tracking data in XML or CSV format for measurement purposes. The Tracking Toolbox further allows for visualization of tools with given surfaces in combination with the NaviagtionToolManager. - - \sa QmitkFunctionality - \ingroup Functionalities */ -class QmitkMITKIGTTrackingToolboxView : public QmitkFunctionality +class QmitkMITKIGTTrackingToolboxView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkMITKIGTTrackingToolboxView(); virtual ~QmitkMITKIGTTrackingToolboxView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: /** @brief changes name of the filename when switching fileextension by radio button */ void OnToggleFileExtension(); /** @brief This slot is called if the user wants to load a new tool file. A new window opens where the user can choose a file. If the chosen file is corrupt or not valid the user gets an error message. If the file was loaded successfully the tools are show in the tool status widget. */ void OnLoadTools(); /** Starts tracking if tracking is stopped / stops tracking if tracking is started. */ void OnStartStopTracking(); /** Connects the device if it is disconnected / disconnects the device if it is connected. */ void OnConnectDisconnect(); /** Freezes the device if it is not frozen / unfreezes the device if it is frozen. */ void OnFreezeUnfreezeTracking(); /** @brief This slot connects to the device. In status "connected" configuration of the device is disabled. */ void OnConnect(); /** @brief This slot disconnects from the device. */ void OnDisconnect(); /** @brief This slot tries to start tracking with the current device. If start tracking fails the user gets an error message and tracking stays off.*/ void OnStartTracking(); /** @brief This slot stops tracking. If tracking is not strated it does nothing.*/ void OnStopTracking(); /** @brief This slot is called if the user want's to choose a file name for logging. A new windows to navigate through the file system and choose a file opens.*/ void OnChooseFileClicked(); /** @brief This slot starts logging. Logging is only possible if a device is tracking. If not the logging mechanism start when the start tracking is called.*/ void StartLogging(); /** @brief This slot stops logging. If logging is not running it does nothing.*/ void StopLogging(); /** @brief This slot enables / disables UI elements depending on the tracking device after a device is changed.*/ void OnTrackingDeviceChanged(); /** @brief This slot selects the Tracking Volume appropriate for a given model */ void OnTrackingVolumeChanged(QString qstr); /** @brief Shows or hides the tracking volume according to the checkboxe's state */ void OnShowTrackingVolumeChanged(); /** @brief This slot auto detects tools of a NDI Aurora tracking device. If tools where found they will be stored internally as a tool storage. The user is also asked if he wants to save this tool storage to load it later. Only call it if a Aurora device was configured because other devices don't support auto detection.*/ void OnAutoDetectTools(); /** @brief Slot for tracking timer. The timer updates the IGT pipline and also the logging filter if logging is activated.*/ void UpdateRenderTrackingTimer(); void UpdateLoggingTrackingTimer(); /** @brief Slot for showing the rendering disabled warning label*/ void OnChangeRenderUpdateRate(); /** @brief Resets the Tracking Tools: this means all tools are removed. */ void OnResetTools(); /** @brief Opens a dialog where a new navigation tool can be created. */ void OnAddSingleTool(); /** @brief This slot is called if the user finishes the creation of a new tool. */ void OnAddSingleToolFinished(); /** @brief This slot is called if the user cancels the creation of a new tool. */ void OnAddSingleToolCanceled(); void OnTimeOut(); protected slots: //help slots for enable/disable buttons void DisableLoggingButtons(); void EnableLoggingButtons(); void DisableOptionsButtons(); void EnableOptionsButtons(); void EnableTrackingConfigurationButtons(); void DisableTrackingConfigurationButtons(); void EnableTrackingControls(); void DisableTrackingControls(); void EnableDisableTimerButtons(int enable); void OnToggleDifferentUpdateRates(); //slots for worker thread void OnAutoDetectToolsFinished(bool success, QString errorMessage); void OnConnectFinished(bool success, QString errorMessage); void OnStartTrackingFinished(bool success, QString errorMessage); void OnStopTrackingFinished(bool success, QString errorMessage); void OnDisconnectFinished(bool success, QString errorMessage); protected: Ui::QmitkMITKIGTTrackingToolboxViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - bool m_tracking; ///> bool which is true if tracking is running, false if not bool m_connected; ///> bool that is true when a tracking device is connected bool m_logging; ///> bool which is true if logging is running, false if not int m_loggedFrames; ///> stores the current number of logged frames if logging is on mitk::NavigationToolStorage::Pointer m_toolStorage; ///>stores the loaded tools mitk::DataNode::Pointer m_TrackingVolumeNode; ///>holds the data node of the tracking volume if volume is visualized bool lastTrackingVolumeState; ///>temporary holds the state of the tracking volume (activated/not activated) during some methods QString m_ToolStorageFilename; ///>stores the filename of the current tool storage QString m_AutoSaveFilename; ///>a filename for auto saving tools if no m_ToolStorageFilename was given by the user /** @brief Shows a message box with the text given as parameter. */ void MessageBox(std::string s); /** @brief reinits the view globally. */ void GlobalReinit(); //members for the filter pipeline mitk::TrackingDeviceSource::Pointer m_TrackingDeviceSource; ///> member for the source of the IGT pipeline mitk::TrackingDeviceData m_TrackingDeviceData; ///> stores the tracking device data as long as this is not handled by the tracking device configuration widget mitk::NavigationDataObjectVisualizationFilter::Pointer m_ToolVisualizationFilter; ///> holds the tool visualization filter (second filter of the IGT pipeline) mitk::NavigationDataRecorder::Pointer m_loggingFilter; ///> holds the logging filter if logging is on (third filter of the IGT pipeline) //members for open IGT link server mitk::NavigationDataToIGTLMessageFilter::Pointer m_IGTLConversionFilter; ///> Converts the navigation data as open IGT link message and makes this filter available as microservice mitk::IGTLServer::Pointer m_IGTLServer; mitk::IGTLMessageProvider::Pointer m_IGTLMessageProvider; /** @brief This timer updates the IGT pipline and also the logging filter if logging is activated.*/ QTimer* m_TrackingRenderTimer; QTimer* m_TrackingLoggingTimer; QTimer* m_TimeoutTimer; /** Replaces the current navigation tool storage which is stored in m_toolStorage. * Basically handles the microservice stuff: unregisteres the old storage, then * replaces the storage and registers the new one. */ void ReplaceCurrentToolStorage(mitk::NavigationToolStorage::Pointer newStorage, std::string newStorageName); /** * \brief Stores the properties of some QWidgets (and the tool storage file name) to QSettings. */ void StoreUISettings(); /** * \brief Loads the properties of some QWidgets (and the tool storage file name) from QSettings. */ void LoadUISettings(); /** * Help method for updating the tool label */ void UpdateToolStorageLabel(QString pathOfLoadedStorage); /** * Auto saves the current tool storage to a temporary file. This ist used for persistence. */ void AutoSaveToolStorage(); //members for worker thread QThread* m_WorkerThread; QmitkMITKIGTTrackingToolboxViewWorker* m_Worker; private: ctkServiceReference m_DeviceTypeServiceReference; mitk::TrackingDeviceTypeCollection* m_DeviceTypeCollection; }; /** * Worker thread class for this view. */ class QmitkMITKIGTTrackingToolboxViewWorker : public QObject { Q_OBJECT public: enum WorkerMethod{ eAutoDetectTools = 0, eConnectDevice = 1, eStartTracking = 2, eStopTracking = 3, eDisconnectDevice = 4 }; void SetWorkerMethod(WorkerMethod w); void SetTrackingDevice(mitk::TrackingDevice::Pointer t); void SetDataStorage(mitk::DataStorage::Pointer d); void SetInverseMode(bool mode); void SetTrackingDeviceData(mitk::TrackingDeviceData d); void SetNavigationToolStorage(mitk::NavigationToolStorage::Pointer n); itkGetMacro(NavigationToolStorage,mitk::NavigationToolStorage::Pointer); itkGetMacro(TrackingDeviceSource,mitk::TrackingDeviceSource::Pointer); itkGetMacro(TrackingDeviceData,mitk::TrackingDeviceData); itkGetMacro(ToolVisualizationFilter,mitk::NavigationDataObjectVisualizationFilter::Pointer); public slots: void ThreadFunc(); signals: void AutoDetectToolsFinished(bool success, QString errorMessage); void ConnectDeviceFinished(bool success, QString errorMessage); void StartTrackingFinished(bool success, QString errorMessage); void StopTrackingFinished(bool success, QString errorMessage); void DisconnectDeviceFinished(bool success, QString errorMessage); protected: mitk::TrackingDevice::Pointer m_TrackingDevice; WorkerMethod m_WorkerMethod; mitk::DataStorage::Pointer m_DataStorage; mitk::NavigationToolStorage::Pointer m_NavigationToolStorage; //members for the filter pipeline which is created in the worker thread during ConnectDevice() mitk::TrackingDeviceSource::Pointer m_TrackingDeviceSource; ///> member for the source of the IGT pipeline mitk::TrackingDeviceData m_TrackingDeviceData; ///> stores the tracking device data as long as this is not handled by the tracking device configuration widget mitk::NavigationDataObjectVisualizationFilter::Pointer m_ToolVisualizationFilter; ///> holds the tool visualization filter (second filter of the IGT pipeline) //members some internal flags bool m_InverseMode; //flag that is true when the inverse mode is enabled //stores the original colors of the tracking tools std::map m_OriginalColors; //internal methods void AutoDetectTools(); void ConnectDevice(); void StartTracking(); void StopTracking(); void DisconnectDevice(); }; #endif // _QMITKMITKIGTTRACKINGTOOLBOXVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.imagecropper/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.imagecropper/manifest_headers.cmake index d5d8e19154..7caa5b0638 100644 --- a/Plugins/org.mitk.gui.qt.imagecropper/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.imagecropper/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Image Cropper") set(Plugin-Version "1.0.0") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy) \ No newline at end of file +set(Require-Plugin org.mitk.gui.qt.common) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp index fe224fcf22..94349b9a39 100644 --- a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp +++ b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp @@ -1,532 +1,532 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkImageCropper.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Includes for image casting between ITK and MITK: added after using Plugin Generator #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const std::string QmitkImageCropper::VIEW_ID = "org.mitk.views.qmitkimagecropper"; QmitkImageCropper::QmitkImageCropper(QObject *parent) : m_ParentWidget(0), m_ImageNode(nullptr), m_CroppingObject(nullptr), m_CroppingObjectNode(nullptr), m_BoundingShapeInteractor(nullptr), m_CropOutsideValue(0), m_Advanced(0), m_Active(0), m_ScrollEnabled(true) { CreateBoundingShapeInteractor(false); } QmitkImageCropper::~QmitkImageCropper() { //delete pointer objects m_CroppingObjectNode = nullptr; m_CroppingObject = nullptr; //disable interactor if (m_BoundingShapeInteractor != nullptr) { m_BoundingShapeInteractor->SetDataNode(nullptr); m_BoundingShapeInteractor->EnableInteraction(false); } } void QmitkImageCropper::SetFocus() { m_Controls.buttonCreateNewBoundingBox->setFocus(); } void QmitkImageCropper::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Controls.boundingShapeSelector->SetDataStorage(this->GetDataStorage()); m_Controls.boundingShapeSelector->SetPredicate(mitk::NodePredicateAnd::New( mitk::TNodePredicateDataType::New(), mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object")))); m_CroppingObjectNode = m_Controls.boundingShapeSelector->GetSelectedNode(); connect(m_Controls.buttonCropping, SIGNAL(clicked()), this, SLOT(DoCropping())); connect(m_Controls.buttonMasking, SIGNAL(clicked()), this, SLOT(DoMasking())); connect(m_Controls.boundingShapeSelector, SIGNAL(OnSelectionChanged(const mitk::DataNode*)), this, SLOT(OnDataSelectionChanged(const mitk::DataNode*))); connect(m_Controls.buttonCreateNewBoundingBox, SIGNAL(clicked()), this, SLOT(DoCreateNewBoundingObject())); connect(m_Controls.buttonAdvancedSettings, SIGNAL(clicked()), this, SLOT(OnAdvancedSettingsButtonToggled())); connect(m_Controls.spinBox, SIGNAL(valueChanged(int)), this, SLOT(OnSliderValueChanged(int))); m_Controls.spinBox->setValue(-1000); m_Controls.spinBox->setEnabled(false); m_Controls.buttonCreateNewBoundingBox->setEnabled(false); m_Controls.buttonCropping->setEnabled(false); m_Controls.boundingShapeSelector->setEnabled(false); m_Controls.labelWarningRotation->setVisible(false); m_Controls.buttonAdvancedSettings->setEnabled(false); m_Advanced = false; this->OnAdvancedSettingsButtonToggled(); m_ParentWidget = parent; } void QmitkImageCropper::OnDataSelectionChanged(const mitk::DataNode* node) { m_Controls.boundingShapeSelector->setEnabled(true); m_CroppingObjectNode = m_Controls.boundingShapeSelector->GetSelectedNode(); if (m_CroppingObjectNode.IsNotNull() && dynamic_cast(this->m_CroppingObjectNode->GetData())) { m_Controls.buttonAdvancedSettings->setEnabled(true); m_Controls.labelWarningBB->setText(QString::fromStdString("")); m_CroppingObject = dynamic_cast(m_CroppingObjectNode->GetData()); m_Advanced = true; mitk::RenderingManager::GetInstance()->InitializeViews(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else { m_Controls.buttonAdvancedSettings->setEnabled(false); m_CroppingObject = nullptr; m_BoundingShapeInteractor->EnableInteraction(false); m_BoundingShapeInteractor->SetDataNode(nullptr); m_Advanced = false; this->OnAdvancedSettingsButtonToggled(); } } void QmitkImageCropper::OnAdvancedSettingsButtonToggled() { m_Controls.groupImageSettings->setVisible(m_Advanced); m_Advanced = !m_Advanced; } void QmitkImageCropper::CreateBoundingShapeInteractor(bool rotationEnabled) { if (m_BoundingShapeInteractor.IsNull()) { m_BoundingShapeInteractor = mitk::BoundingShapeInteractor::New(); m_BoundingShapeInteractor->LoadStateMachine("BoundingShapeInteraction.xml", us::ModuleRegistry::GetModule("MitkBoundingShape")); m_BoundingShapeInteractor->SetEventConfig("BoundingShapeMouseConfig.xml", us::ModuleRegistry::GetModule("MitkBoundingShape")); } m_BoundingShapeInteractor->SetRotationEnabled(rotationEnabled); } mitk::Geometry3D::Pointer QmitkImageCropper::InitializeWithImageGeometry(mitk::BaseGeometry::Pointer geometry) { // convert a basegeometry into a Geometry3D (otherwise IO is not working properly) if (geometry == nullptr) mitkThrow() << "Geometry is not valid."; auto boundingGeometry = mitk::Geometry3D::New(); boundingGeometry->SetBounds(geometry->GetBounds()); boundingGeometry->SetImageGeometry(geometry->GetImageGeometry()); boundingGeometry->SetOrigin(geometry->GetOrigin()); boundingGeometry->SetSpacing(geometry->GetSpacing()); boundingGeometry->SetIndexToWorldTransform(geometry->GetIndexToWorldTransform()); boundingGeometry->Modified(); return boundingGeometry; } void QmitkImageCropper::DoCreateNewBoundingObject() { if (m_ImageNode.IsNotNull()) { bool ok = false; QString name = QInputDialog::getText(QApplication::activeWindow() , "Add cropping shape...", "Enter name for the new cropping shape", QLineEdit::Normal, "BoundingShape", &ok); if (!ok) return; m_Controls.buttonCropping->setEnabled(true); m_Controls.buttonMasking->setEnabled(true); m_Controls.boundingShapeSelector->setEnabled(true); - // to do: check whether stdmulti.widget is valid - // get current timestep to support 3d+t images //to do: check if stdmultiwidget is valid - int timeStep = mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget1"))->GetTimeStep(); + // get current timestep to support 3d+t images + auto renderWindowPart = this->GetRenderWindowPart(OPEN); + int timeStep = renderWindowPart->GetTimeNavigationController()->GetTime()->GetPos(); mitk::BaseGeometry::Pointer imageGeometry = static_cast(m_ImageNode->GetData()->GetGeometry(timeStep)); m_CroppingObject = mitk::GeometryData::New(); m_CroppingObject->SetGeometry(static_cast(this->InitializeWithImageGeometry(imageGeometry))); m_CroppingObjectNode = mitk::DataNode::New(); m_CroppingObjectNode->SetData(m_CroppingObject); m_CroppingObjectNode->SetProperty("name", mitk::StringProperty::New(name.toStdString())); m_CroppingObjectNode->SetProperty("color", mitk::ColorProperty::New(1.0, 1.0, 1.0)); m_CroppingObjectNode->SetProperty("opacity", mitk::FloatProperty::New(0.6)); m_CroppingObjectNode->SetProperty("layer", mitk::IntProperty::New(99)); m_CroppingObjectNode->AddProperty("handle size factor", mitk::DoubleProperty::New(1.0 / 40.0)); m_CroppingObjectNode->SetBoolProperty("pickable", true); if (!this->GetDataStorage()->Exists(m_CroppingObjectNode)) { GetDataStorage()->Add(m_CroppingObjectNode, m_ImageNode); m_Controls.boundingShapeSelector->SetSelectedNode(m_CroppingObjectNode); m_CroppingObjectNode->SetVisibility(true); m_BoundingShapeInteractor->EnableInteraction(true); m_BoundingShapeInteractor->SetDataNode(this->m_CroppingObjectNode); this->OnDataSelectionChanged(m_CroppingObjectNode); } } // Adjust coordinate system by doing a reinit on auto tempDataStorage = mitk::DataStorage::SetOfObjects::New(); tempDataStorage->InsertElement(0, m_CroppingObjectNode); //// initialize the views to the bounding geometry //mitk::TimeGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(tempDataStorage); //mitk::RenderingManager::GetInstance()->InitializeViews(bounds); //mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkImageCropper::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { bool rotationEnabled = false; if (nodes.empty()) { m_Controls.labelWarningImage->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelWarningImage->setText(QString::fromStdString("Select an image.")); m_Controls.labelWarningBB->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelWarningBB->setText(QString::fromStdString("Create a bounding shape below.")); m_Controls.buttonCreateNewBoundingBox->setEnabled(false); m_Controls.buttonCropping->setEnabled(false); m_Controls.buttonMasking->setEnabled(false); m_Controls.labelWarningRotation->setVisible(false); return; } m_ParentWidget->setEnabled(true); foreach(mitk::DataNode::Pointer node, nodes) { if (node.IsNotNull() && dynamic_cast(node->GetData())) { m_ImageNode = nodes[0]; m_Controls.groupBoundingObject->setEnabled(true); m_Controls.labelWarningImage->setStyleSheet(" QLabel { color: rgb(0, 0, 0) }"); m_Controls.labelWarningImage->setText(QString::fromStdString("File name: " + m_ImageNode->GetName())); m_Controls.buttonCreateNewBoundingBox->setEnabled(true); mitk::Image::Pointer image = dynamic_cast(m_ImageNode->GetData()); if (image != nullptr) { vtkSmartPointer imageMat = image->GetGeometry()->GetVtkMatrix(); // check whether the image geometry is rotated, if so, no pixel aligned cropping or masking can be performed if ((imageMat->GetElement(1, 0) == 0.0) && (imageMat->GetElement(0, 1) == 0.0) && (imageMat->GetElement(1, 2) == 0.0) && (imageMat->GetElement(2, 1) == 0.0) && (imageMat->GetElement(2, 0) == 0.0) && (imageMat->GetElement(0, 2) == 0.0)) { rotationEnabled = false; m_Controls.labelWarningRotation->setVisible(false); } else { rotationEnabled = true; m_Controls.labelWarningRotation->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelWarningRotation->setVisible(true); } this->CreateBoundingShapeInteractor(rotationEnabled); m_CroppingObjectNode = m_Controls.boundingShapeSelector->GetSelectedNode(); if (m_CroppingObjectNode != nullptr) { this->OnDataSelectionChanged(m_CroppingObjectNode); m_BoundingShapeInteractor->EnableInteraction(true); m_BoundingShapeInteractor->SetDataNode(this->m_CroppingObjectNode); m_Controls.boundingShapeSelector->setEnabled(true); } if (image->GetPixelType().GetPixelType() == itk::ImageIOBase::SCALAR) { // Might be changed with the upcoming new image statistics plugin int minPixelValue = static_cast(image->GetScalarValueMinNoRecompute()); //static_castimage->GetStatistics()->GetScalarValueMinNoRecompute(); int maxPixelValue = static_cast(image->GetScalarValueMaxNoRecompute()); //static_castimage->GetStatistics()->GetScalarValueMaxNoRecompute(); m_Controls.spinBox->setEnabled(true); m_Controls.spinBox->setMaximum(maxPixelValue); m_Controls.spinBox->setMinimum(minPixelValue); m_Controls.spinBox->setValue(minPixelValue); } else m_Controls.spinBox->setEnabled(false); unsigned int dim = image->GetDimension(); if (dim < 2 || dim > 4) { m_Controls.labelWarningImage->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelWarningImage->setText(QString::fromStdString("Select an image.")); m_ParentWidget->setEnabled(false); } if (m_CroppingObjectNode != nullptr) { m_Controls.buttonCropping->setEnabled(true); m_Controls.buttonMasking->setEnabled(true); m_Controls.boundingShapeSelector->setEnabled(true); m_Controls.labelWarningBB->setVisible(false); } else { m_Controls.buttonCropping->setEnabled(false); m_Controls.buttonMasking->setEnabled(false); m_Controls.boundingShapeSelector->setEnabled(false); m_Controls.labelWarningBB->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelWarningBB->setText(QString::fromStdString("Create a bounding shape below.")); } return; } // iterate all selected objects, adjust warning visibility m_Controls.labelWarningImage->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }"); m_Controls.labelWarningImage->setText(QString::fromStdString("Select an image.")); m_Controls.buttonCropping->setEnabled(false); m_Controls.buttonMasking->setEnabled(false); m_Controls.buttonCreateNewBoundingBox->setEnabled(false); m_Controls.boundingShapeSelector->setEnabled(false); m_ParentWidget->setEnabled(true); m_Controls.labelWarningRotation->setVisible(false); } } } void QmitkImageCropper::OnComboBoxSelectionChanged(const mitk::DataNode* node) { mitk::DataNode* selectedNode = const_cast(node); if (selectedNode != nullptr) { if (m_ImageNode.IsNotNull()) selectedNode->SetDataInteractor(m_ImageNode->GetDataInteractor()); // m_ImageNode->GetDataInteractor()->SetDataNode(selectedNode); m_ImageNode = selectedNode; } } void QmitkImageCropper::OnSliderValueChanged(int slidervalue) { m_CropOutsideValue = slidervalue; } void QmitkImageCropper::DoMasking() { this->ProcessImage(true); } void QmitkImageCropper::DoCropping() { this->ProcessImage(false); } void QmitkImageCropper::ProcessImage(bool mask) { // cropping only possible if valid bounding shape as well as a valid image are loaded QList nodes = this->GetDataManagerSelection(); - // to do: check whether stdmultiwidget is valid - int timeStep = mitk::BaseRenderer::GetInstance(mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget1"))->GetTimeStep(); + auto renderWindowPart = this->GetRenderWindowPart(OPEN); + int timeStep = renderWindowPart->GetTimeNavigationController()->GetTime()->GetPos(); if (nodes.empty()) return; mitk::DataNode* node = nodes[0]; if (node == nullptr) { QMessageBox::information(nullptr, "Warning", "Please load and select an image before starting image processing."); return; } if (m_CroppingObject == nullptr) { QMessageBox::information(nullptr, "Warning", "Please load and select a cropping object before starting image processing."); return; } mitk::BaseData* data = node->GetData(); //get data from node if (data != nullptr) { QString imageName; if (mask) imageName = QString::fromStdString(node->GetName() + "_masked"); else imageName = QString::fromStdString(node->GetName() + "_cropped"); if (m_Controls.checkBoxCropTimeStepOnly->isChecked()) imageName = imageName + "_T" + QString::number(timeStep); // image and bounding shape ok, set as input auto croppedImageNode = mitk::DataNode::New(); auto cutter = mitk::BoundingShapeCropper::New(); cutter->SetGeometry(m_CroppingObject); // adjustable in advanced settings cutter->SetUseWholeInputRegion(mask); //either mask (mask=true) or crop (mask=false) cutter->SetOutsideValue(m_CropOutsideValue); cutter->SetUseCropTimeStepOnly(m_Controls.checkBoxCropTimeStepOnly->isChecked()); cutter->SetCurrentTimeStep(timeStep); // TODO: Add support for MultiLayer (right now only Mulitlabel support) mitk::LabelSetImage* labelsetImageInput = dynamic_cast(data); if (labelsetImageInput != nullptr) { cutter->SetInput(labelsetImageInput); // do the actual cutting try { cutter->Update(); } catch (const itk::ExceptionObject& e) { std::string message = std::string("The Cropping filter could not process because of: \n ") + e.GetDescription(); QMessageBox::warning(nullptr, tr("Cropping not possible!"), tr(message.c_str()), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); return; } auto labelSetImage = mitk::LabelSetImage::New(); labelSetImage->InitializeByLabeledImage(cutter->GetOutput()); for (int i = 0; i < labelsetImageInput->GetNumberOfLayers(); i++) { labelSetImage->AddLabelSetToLayer(i, labelsetImageInput->GetLabelSet(i)); } croppedImageNode->SetData(labelSetImage); croppedImageNode->SetProperty("name", mitk::StringProperty::New(imageName.toStdString())); //add cropping result to the current data storage as child node to the image node if (!m_Controls.checkOverwriteImage->isChecked()) { if (!this->GetDataStorage()->Exists(croppedImageNode)) { this->GetDataStorage()->Add(croppedImageNode, m_ImageNode); } } else // original image will be overwritten by the result image and the bounding box of the result is adjusted { node->SetData(labelSetImage); node->Modified(); // Adjust coordinate system by doing a reinit on auto tempDataStorage = mitk::DataStorage::SetOfObjects::New(); tempDataStorage->InsertElement(0, node); // initialize the views to the bounding geometry mitk::TimeGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(tempDataStorage); mitk::RenderingManager::GetInstance()->InitializeViews(bounds); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } else { mitk::Image::Pointer imageInput = dynamic_cast(data); if (imageInput != nullptr) { cutter->SetInput(imageInput); // do the actual cutting try { cutter->Update(); } catch (const itk::ExceptionObject& e) { std::string message = std::string("The Cropping filter could not process because of: \n ") + e.GetDescription(); QMessageBox::warning(nullptr, tr("Cropping not possible!"), tr(message.c_str()), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); return; } //add cropping result to the current data storage as child node to the image node if (!m_Controls.checkOverwriteImage->isChecked()) { croppedImageNode->SetData(cutter->GetOutput()); croppedImageNode->SetProperty("name", mitk::StringProperty::New(imageName.toStdString())); croppedImageNode->SetProperty("color", mitk::ColorProperty::New(1.0, 1.0, 1.0)); croppedImageNode->SetProperty("layer", mitk::IntProperty::New(99)); // arbitrary, copied from segmentation functionality if (!this->GetDataStorage()->Exists(croppedImageNode)) { this->GetDataStorage()->Add(croppedImageNode, m_ImageNode); } } else // original image will be overwritten by the result image and the bounding box of the result is adjusted { node->SetData(cutter->GetOutput()); node->Modified(); // Adjust coordinate system by doing a reinit on auto tempDataStorage = mitk::DataStorage::SetOfObjects::New(); tempDataStorage->InsertElement(0, node); // initialize the views to the bounding geometry mitk::TimeGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(tempDataStorage); mitk::RenderingManager::GetInstance()->InitializeViews(bounds); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } } } else { QMessageBox::information(nullptr, "Warning", "Please load and select an image before starting image processing."); } } diff --git a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h index 72eb0fe5db..0a5972dfba 100644 --- a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h +++ b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h @@ -1,167 +1,168 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision$ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef QmitkImageCropper_h #define QmitkImageCropper_h #include #ifdef WIN32 #pragma warning( disable : 4250 ) #endif #include #include "QVTKWidget.h" #include "QmitkRegisterClasses.h" #include "itkCommand.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "ui_ImageCropperControls.h" #include "usServiceRegistration.h" /*! @brief QmitkImageCropperView \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. \sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkImageCropper : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) private: Q_OBJECT public: /*! @brief Constructor. Called by SampleApp (or other apps that use functionalities) */ QmitkImageCropper(QObject *parent = 0); virtual ~QmitkImageCropper(); static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent); + virtual void SetFocus() override; + /*! @brief Creates the Qt connections needed */ QWidget* GetControls(); /// @brief Called when the user clicks the GUI button protected slots: /*! * @brief Creates a new bounding object */ virtual void DoCreateNewBoundingObject(); /*! * @brief Whenever Crop button is pressed, issue a cropping action */ void DoCropping(); /*! * @brief Whenever Mask button is pressed, issue a masking action */ void DoMasking(); /*! * @brief Dis- or enable the advanced setting section */ void OnAdvancedSettingsButtonToggled(); /*! * @brief Updates current selection of the bounding object */ void OnDataSelectionChanged(const mitk::DataNode* node); /*! * @brief Sets the scalar value for outside pixels in case of masking */ void OnSliderValueChanged(int slidervalue); protected: - virtual void SetFocus(); /*! @brief called by QmitkFunctionality when DataManager's selection has changed */ void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; /*! @brief Sets the selected bounding object as current bounding object and set up interactor */ void OnComboBoxSelectionChanged(const mitk::DataNode* node); /*! * @brief Initializes a new bounding shape using the selected image geometry. */ mitk::Geometry3D::Pointer InitializeWithImageGeometry(mitk::BaseGeometry::Pointer geometry); void CreateBoundingShapeInteractor(bool rotationEnabled); private: /*! * The parent QWidget */ QWidget* m_ParentWidget; /*! * @brief A pointer to the node of the image to be cropped. */ mitk::WeakPointer m_ImageNode; /*! * @brief The cuboid used for cropping. */ mitk::GeometryData::Pointer m_CroppingObject; /*! * @brief Tree node of the cuboid used for cropping. */ mitk::DataNode::Pointer m_CroppingObjectNode; /*! * @brief Interactor for moving and scaling the cuboid */ mitk::BoundingShapeInteractor::Pointer m_BoundingShapeInteractor; void ProcessImage(bool crop); // cropping parameter mitk::ScalarType m_CropOutsideValue; bool m_Advanced; bool m_Active; bool m_ScrollEnabled; Ui::ImageCropperControls m_Controls; }; #endif // QmitkImageCropper_h \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.materialeditor/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.materialeditor/manifest_headers.cmake index d0433db23a..8f72fc2fe3 100644 --- a/Plugins/org.mitk.gui.qt.materialeditor/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.materialeditor/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Material Editor") set(Plugin-Version "0.9") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy) \ No newline at end of file +set(Require-Plugin org.mitk.gui.qt.common) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.cpp b/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.cpp index 077fc2b67a..394e931b29 100644 --- a/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.cpp +++ b/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.cpp @@ -1,267 +1,249 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkMITKSurfaceMaterialEditorView.h" #include "mitkBaseRenderer.h" #include "mitkNodePredicateDataType.h" #include "mitkProperties.h" #include "mitkIDataStorageService.h" #include "mitkDataNodeObject.h" #include "berryIEditorPart.h" #include "berryIWorkbenchPage.h" #include "mitkShaderProperty.h" #include "QmitkDataStorageComboBox.h" -#include "QmitkStdMultiWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mitkStandaloneDataStorage.h" const std::string QmitkMITKSurfaceMaterialEditorView::VIEW_ID = "org.mitk.views.mitksurfacematerialeditor"; QmitkMITKSurfaceMaterialEditorView::QmitkMITKSurfaceMaterialEditorView() -: QmitkFunctionality(), - m_Controls(NULL), - m_MultiWidget(NULL) +: QmitkAbstractView(), + m_Controls(NULL) { fixedProperties.push_back( "shader" ); fixedProperties.push_back( "material.representation" ); fixedProperties.push_back( "color" ); fixedProperties.push_back( "opacity" ); fixedProperties.push_back( "material.wireframeLineWidth" ); fixedProperties.push_back( "material.ambientCoefficient" ); fixedProperties.push_back( "material.diffuseCoefficient" ); fixedProperties.push_back( "material.ambientColor" ); fixedProperties.push_back( "material.diffuseColor" ); fixedProperties.push_back( "material.specularColor" ); fixedProperties.push_back( "material.specularCoefficient" ); fixedProperties.push_back( "material.specularPower" ); fixedProperties.push_back( "material.interpolation" ); shaderProperties.push_back( "shader" ); shaderProperties.push_back( "material.representation" ); shaderProperties.push_back( "color" ); shaderProperties.push_back( "opacity" ); shaderProperties.push_back( "material.wireframeLineWidth" ); observerAllocated = false; } QmitkMITKSurfaceMaterialEditorView::~QmitkMITKSurfaceMaterialEditorView() { } void QmitkMITKSurfaceMaterialEditorView::InitPreviewWindow() { usedTimer=0; vtkSphereSource* sphereSource = vtkSphereSource::New(); sphereSource->SetThetaResolution(25); sphereSource->SetPhiResolution(25); sphereSource->Update(); vtkPolyData* sphere = sphereSource->GetOutput(); m_Surface = mitk::Surface::New(); m_Surface->SetVtkPolyData( sphere ); m_DataNode = mitk::DataNode::New(); m_DataNode->SetData( m_Surface ); m_DataTree = mitk::StandaloneDataStorage::New(); m_DataTree->Add( m_DataNode , (mitk::DataNode *)0 ); m_Controls->m_PreviewRenderWindow->GetRenderer()->SetDataStorage( m_DataTree ); m_Controls->m_PreviewRenderWindow->GetRenderer()->SetMapperID( mitk::BaseRenderer::Standard3D ); sphereSource->Delete(); } void QmitkMITKSurfaceMaterialEditorView::RefreshPropertiesList() { mitk::DataNode* SrcND = m_SelectedDataNode; mitk::DataNode* DstND = m_DataNode; mitk::PropertyList* DstPL = DstND->GetPropertyList(); m_Controls->m_ShaderPropertyList->SetPropertyList( 0 ); DstPL->Clear(); if(observerAllocated) { observedProperty->RemoveObserver( observerIndex ); observerAllocated=false; } if(SrcND) { mitk::PropertyList* SrcPL = SrcND->GetPropertyList(); mitk::ShaderProperty::Pointer shaderEnum = dynamic_cast(SrcPL->GetProperty("shader")); std::string shaderState = "fixed"; if(shaderEnum.IsNotNull()) { shaderState = shaderEnum->GetValueAsString(); itk::MemberCommand::Pointer propertyModifiedCommand = itk::MemberCommand::New(); propertyModifiedCommand->SetCallbackFunction(this, &QmitkMITKSurfaceMaterialEditorView::shaderEnumChange); observerIndex = shaderEnum->AddObserver(itk::ModifiedEvent(), propertyModifiedCommand); observedProperty = shaderEnum; observerAllocated=true; } MITK_INFO << "PROPERTIES SCAN BEGIN"; for(mitk::PropertyList::PropertyMap::const_iterator it=SrcPL->GetMap()->begin(); it!=SrcPL->GetMap()->end(); it++) { std::string name=it->first; mitk::BaseProperty *p=it->second; // MITK_INFO << "property '" << name << "' found"; if(shaderState.compare("fixed")==0) { if(std::find(fixedProperties.begin(), fixedProperties.end(), name) != fixedProperties.end()) { DstPL->SetProperty(name,p); } } else { //if(std::find(shaderProperties.begin(), shaderProperties.end(), name) != shaderProperties.end()) { DstPL->SetProperty(name,p); } } } MITK_INFO << "PROPERTIES SCAN END"; } m_Controls->m_ShaderPropertyList->SetPropertyList( DstPL ); //m_Controls->m_PreviewRenderWindow->GetRenderer()->GetVtkRenderer()->ResetCameraClippingRange(); } void QmitkMITKSurfaceMaterialEditorView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { // create GUI widgets m_Controls = new Ui::QmitkMITKSurfaceMaterialEditorViewControls; m_Controls->setupUi(parent); this->CreateConnections(); InitPreviewWindow(); RefreshPropertiesList(); } } -void QmitkMITKSurfaceMaterialEditorView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) +void QmitkMITKSurfaceMaterialEditorView::SetFocus() { - m_MultiWidget = &stdMultiWidget; -} - -void QmitkMITKSurfaceMaterialEditorView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; + m_Controls->m_ShaderPropertyList->setFocus(); } void QmitkMITKSurfaceMaterialEditorView::CreateConnections() { } -void QmitkMITKSurfaceMaterialEditorView::Activated() -{ - QmitkFunctionality::Activated(); -} - -void QmitkMITKSurfaceMaterialEditorView::Deactivated() -{ - QmitkFunctionality::Deactivated(); -} - - -void QmitkMITKSurfaceMaterialEditorView::OnSelectionChanged(std::vector nodes) +void QmitkMITKSurfaceMaterialEditorView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { if(!nodes.empty()) { m_SelectedDataNode = nodes.at(0); MITK_INFO << "Node '" << m_SelectedDataNode->GetName() << "' selected"; SurfaceSelected(); } } void QmitkMITKSurfaceMaterialEditorView::SurfaceSelected() { postRefresh(); } void QmitkMITKSurfaceMaterialEditorView::shaderEnumChange(const itk::Object * /*caller*/, const itk::EventObject & /*event*/) { postRefresh(); } void QmitkMITKSurfaceMaterialEditorView::postRefresh() { if(usedTimer) return; usedTimer=startTimer(0); } void QmitkMITKSurfaceMaterialEditorView::timerEvent( QTimerEvent *e ) { if(usedTimer!=e->timerId()) { MITK_ERROR << "INTERNAL ERROR: usedTimer[" << usedTimer << "] != timerId[" << e->timerId() << "]"; } if(usedTimer) { killTimer(usedTimer); usedTimer=0; } RefreshPropertiesList(); } diff --git a/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.h b/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.h index 475a20caad..d3e5a42d92 100644 --- a/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.h +++ b/Plugins/org.mitk.gui.qt.materialeditor/src/internal/QmitkMITKSurfaceMaterialEditorView.h @@ -1,122 +1,115 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKMITKSURFACEMATERIALEDITORVIEW_H_INCLUDED #define _QMITKMITKSURFACEMATERIALEDITORVIEW_H_INCLUDED -#include +#include #include #include #include "ui_QmitkMITKSurfaceMaterialEditorViewControls.h" /* #include #include #include #include #include #include #include "QtGui/QMenubarUpdatedEvent" */ #include "QmitkRenderWindow.h" #include "mitkCommon.h" #include "mitkDataStorage.h" #include "mitkDataNode.h" #include "mitkShaderProperty.h" #include "mitkSurface.h" #include "vtkRenderer.h" #include "vtkTextActor.h" /*! \brief QmitkMITKSurfaceMaterialEditorView - - \sa QmitkFunctionality - \ingroup Functionalities */ -class QmitkMITKSurfaceMaterialEditorView : public QmitkFunctionality +class QmitkMITKSurfaceMaterialEditorView : public QmitkAbstractView { // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkMITKSurfaceMaterialEditorView(); virtual ~QmitkMITKSurfaceMaterialEditorView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Called when the functionality is activated - virtual void Activated() override; - - virtual void Deactivated() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; - virtual void OnSelectionChanged(std::vector nodes) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; protected slots: void SurfaceSelected(); protected: Ui::QmitkMITKSurfaceMaterialEditorViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - private: mitk::Surface::Pointer m_Surface; mitk::DataStorage::Pointer m_DataTree; mitk::DataNode::Pointer m_DataNode; mitk::DataNode::Pointer m_SelectedDataNode; std::list fixedProperties; std::list shaderProperties; unsigned long observerIndex; bool observerAllocated; mitk::ShaderProperty::Pointer observedProperty; void InitPreviewWindow(); int usedTimer; void timerEvent( QTimerEvent *e ) override; void RefreshPropertiesList(); void postRefresh(); void shaderEnumChange(const itk::Object *caller, const itk::EventObject &event); berry::IStructuredSelection::ConstPointer m_CurrentSelection; }; #endif // _QMITKMITKSURFACEMATERIALEDITORVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.cpp b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.cpp index 866bc036cd..b54da9ccf5 100644 --- a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.cpp +++ b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.cpp @@ -1,1361 +1,1361 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkImageStatisticsView.h" // Qt includes #include #include #include // berry includes #include // mitk includes #include "mitkNodePredicateDataType.h" #include "mitkNodePredicateOr.h" #include "mitkPlanarFigureInteractor.h" // itk includes #include "itksys/SystemTools.hxx" #include #include #include const std::string QmitkImageStatisticsView::VIEW_ID = "org.mitk.views.imagestatistics"; const int QmitkImageStatisticsView::STAT_TABLE_BASE_HEIGHT = 180; QmitkImageStatisticsView::QmitkImageStatisticsView(QObject* /*parent*/, const char* /*name*/) : m_Controls( NULL ), m_TimeStepperAdapter( NULL ), m_SelectedImage( NULL ), m_SelectedImageMask( NULL ), m_SelectedPlanarFigure( NULL ), m_ImageObserverTag( -1 ), m_ImageMaskObserverTag( -1 ), m_PlanarFigureObserverTag( -1 ), m_TimeObserverTag( -1 ), m_CurrentStatisticsValid( false ), m_StatisticsUpdatePending( false ), m_DataNodeSelectionChanged ( false ), m_Visible(false) { this->m_CalculationThread = new QmitkImageStatisticsCalculationThread; } QmitkImageStatisticsView::~QmitkImageStatisticsView() { if ( m_SelectedImage != NULL ) m_SelectedImage->RemoveObserver( m_ImageObserverTag ); if ( m_SelectedImageMask != NULL ) m_SelectedImageMask->RemoveObserver( m_ImageMaskObserverTag ); if ( m_SelectedPlanarFigure != NULL ) m_SelectedPlanarFigure->RemoveObserver( m_PlanarFigureObserverTag ); while(this->m_CalculationThread->isRunning()) // wait until thread has finished { itksys::SystemTools::Delay(100); } delete this->m_CalculationThread; } void QmitkImageStatisticsView::CreateQtPartControl(QWidget *parent) { if (m_Controls == NULL) { m_Controls = new Ui::QmitkImageStatisticsViewControls; m_Controls->setupUi(parent); CreateConnections(); m_Controls->m_ErrorMessageLabel->hide(); m_Controls->m_StatisticsWidgetStack->setCurrentIndex( 0 ); m_Controls->m_BinSizeFrame->setVisible(false); } } void QmitkImageStatisticsView::CreateConnections() { if ( m_Controls ) { connect( (QObject*)(this->m_Controls->m_ButtonCopyHistogramToClipboard), SIGNAL(clicked()),(QObject*) this, SLOT(OnClipboardHistogramButtonClicked()) ); connect( (QObject*)(this->m_Controls->m_ButtonCopyStatisticsToClipboard), SIGNAL(clicked()),(QObject*) this, SLOT(OnClipboardStatisticsButtonClicked()) ); connect( (QObject*)(this->m_Controls->m_IgnoreZerosCheckbox), SIGNAL(clicked()),(QObject*) this, SLOT(OnIgnoreZerosCheckboxClicked()) ); connect( (QObject*) this->m_CalculationThread, SIGNAL(finished()),this, SLOT( OnThreadedStatisticsCalculationEnds()),Qt::QueuedConnection); connect( (QObject*) this, SIGNAL(StatisticsUpdate()),this, SLOT( RequestStatisticsUpdate()), Qt::QueuedConnection); connect( (QObject*) this->m_Controls->m_StatisticsTable, SIGNAL(cellDoubleClicked(int,int)),this, SLOT( JumpToCoordinates(int,int)) ); connect((QObject*)(this->m_Controls->m_barRadioButton), SIGNAL(clicked()), (QObject*)(this), SLOT(OnBarRadioButtonSelected())); connect((QObject*)(this->m_Controls->m_lineRadioButton), SIGNAL(clicked()), (QObject*)(this), SLOT(OnLineRadioButtonSelected())); connect( (QObject*) (this->m_Controls->m_HistogramBinSizeSpinbox), SIGNAL(editingFinished()), this, SLOT(OnHistogramBinSizeBoxValueChanged())); connect((QObject*)(this->m_Controls->m_UseDefaultBinSizeBox), SIGNAL(clicked()), (QObject*) this, SLOT(OnDefaultBinSizeBoxChanged())); connect((QObject*)(this->m_Controls->m_ShowSubchartCheckBox), SIGNAL(clicked()), (QObject*) this, SLOT(OnShowSubchartBoxChanged())); } } void QmitkImageStatisticsView::OnDefaultBinSizeBoxChanged() { m_Controls->m_BinSizeFrame->setVisible(!m_Controls->m_UseDefaultBinSizeBox->isChecked()); if (m_CalculationThread != NULL){ m_Controls->m_HistogramBinSizeSpinbox->setValue(m_CalculationThread->GetHistogramBinSize()); m_CalculationThread->SetUseDefaultNBins(m_Controls->m_UseDefaultBinSizeBox->isChecked()); } this->UpdateStatistics(); } void QmitkImageStatisticsView::OnShowSubchartBoxChanged() { this->m_Controls->m_JSHistogram->SetAppearance( this->m_Controls->m_lineRadioButton->isChecked(), this->m_Controls->m_ShowSubchartCheckBox->isChecked()); QString useLineChart = "false"; if (this->m_Controls->m_lineRadioButton->isChecked()) useLineChart = "true"; QString showSubchart = "false"; if (this->m_Controls->m_ShowSubchartCheckBox->isChecked()) showSubchart = "true"; this->m_Controls->m_JSHistogram->SendCommand( "ReloadChart(" + useLineChart + "," + showSubchart + ")"); } void QmitkImageStatisticsView::OnBarRadioButtonSelected() { this->m_Controls->m_JSHistogram->TransformView("bar"); } void QmitkImageStatisticsView::OnLineRadioButtonSelected() { this->m_Controls->m_JSHistogram->TransformView("line"); } void QmitkImageStatisticsView::PartClosed(const berry::IWorkbenchPartReference::Pointer& ) { } void QmitkImageStatisticsView::OnTimeChanged(const itk::EventObject& e) { if (this->m_SelectedDataNodes.isEmpty() || this->m_SelectedImage == NULL) return; const mitk::SliceNavigationController::GeometryTimeEvent* timeEvent = dynamic_cast(&e); assert(timeEvent != NULL); unsigned int timestep = timeEvent->GetPos(); if (this->m_SelectedImage->GetTimeSteps() > 1) { for (int x = 0; x < this->m_Controls->m_StatisticsTable->columnCount(); x++) { for (int y = 0; y < this->m_Controls->m_StatisticsTable->rowCount(); y++) { QTableWidgetItem* item = this->m_Controls->m_StatisticsTable->item(y, x); if (item == NULL) break; if (x == timestep) { item->setBackgroundColor(Qt::yellow); } else { if (y % 2 == 0) item->setBackground(this->m_Controls->m_StatisticsTable->palette().base()); else item->setBackground(this->m_Controls->m_StatisticsTable->palette().alternateBase()); } } } this->m_Controls->m_StatisticsTable->viewport()->update(); } if ((this->m_SelectedImage->GetTimeSteps() == 1 && timestep == 0) || this->m_SelectedImage->GetTimeSteps() > 1) { // display histogram for selected timestep this->m_Controls->m_JSHistogram->ClearHistogram(); QmitkImageStatisticsCalculationThread::HistogramType::Pointer histogram = this->m_CalculationThread->GetTimeStepHistogram(timestep); if (histogram.IsNotNull()) { bool closedFigure = this->m_CalculationThread->GetStatisticsUpdateSuccessFlag(); if ( closedFigure ) { this->m_Controls->m_JSHistogram->ComputeHistogram( histogram.GetPointer(), this->m_Controls->m_lineRadioButton->isChecked(), this->m_Controls->m_ShowSubchartCheckBox->isChecked() ); } //this->m_Controls->m_JSHistogram->ComputeHistogram(histogram.GetPointer()); /*else { m_Controls->m_JSHistogram->ComputeIntensityProfile(timestep, true); }*/ // this->m_Controls->m_JSHistogram->SignalGraphChanged(); // hacky way to make sure the protected SignalGraphChanged() is called //if (this->m_Controls->m_JSHistogram->GetUseLineGraph()) //{ //this->m_Controls->m_JSHistogram->OnBarRadioButtonSelected(); //this->m_Controls->m_JSHistogram->OnLineRadioButtonSelected(); //} //else //{ //this->m_Controls->m_JSHistogram->OnLineRadioButtonSelected(); //this->m_Controls->m_JSHistogram->OnBarRadioButtonSelected(); //} } } } void QmitkImageStatisticsView::JumpToCoordinates(int row ,int col) { if(m_SelectedDataNodes.isEmpty()) { MITK_WARN("QmitkImageStatisticsView") << "No data node selected for statistics calculation." ; return; } mitk::Point3D world; if (row==4 && !m_WorldMinList.empty()) world = m_WorldMinList[col]; else if (row==3 && !m_WorldMaxList.empty()) world = m_WorldMaxList[col]; else return; mitk::IRenderWindowPart* part = this->GetRenderWindowPart(); if (part) { part->GetQmitkRenderWindow("axial")->GetSliceNavigationController()->SelectSliceByPoint(world); part->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()->SelectSliceByPoint(world); part->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()->SelectSliceByPoint(world); mitk::SliceNavigationController::GeometryTimeEvent timeEvent(this->m_SelectedImage->GetTimeGeometry(), col); part->GetQmitkRenderWindow("axial")->GetSliceNavigationController()->SetGeometryTime(timeEvent); } } void QmitkImageStatisticsView::OnIgnoreZerosCheckboxClicked() { emit StatisticsUpdate(); } void QmitkImageStatisticsView::OnClipboardHistogramButtonClicked() { if ( m_CurrentStatisticsValid && !( m_SelectedPlanarFigure != NULL)) { const unsigned int t = this->GetRenderWindowPart()->GetTimeNavigationController()->GetTime()->GetPos(); typedef mitk::ImageStatisticsCalculator::HistogramType HistogramType; const HistogramType *histogram = this->m_CalculationThread->GetTimeStepHistogram(t).GetPointer(); QString clipboard( "Measurement \t Frequency\n" ); for ( HistogramType::ConstIterator it = histogram->Begin(); it != histogram->End(); ++it ) { if( m_Controls->m_HistogramBinSizeSpinbox->value() == 1.0) { clipboard = clipboard.append( "%L1 \t %L2\n" ) .arg( it.GetMeasurementVector()[0], 0, 'f', 0 ) .arg( it.GetFrequency() ); } else { clipboard = clipboard.append( "%L1 \t %L2\n" ) .arg( it.GetMeasurementVector()[0], 0, 'f', 2 ) .arg( it.GetFrequency() ); } } QApplication::clipboard()->setText( clipboard, QClipboard::Clipboard ); } // If a (non-closed) PlanarFigure is selected, display a line profile widget else if ( m_CurrentStatisticsValid && (m_SelectedPlanarFigure != NULL )) { /*auto intensity = m_Controls->m_JSHistogram->GetFrequency(); auto pixel = m_Controls->m_JSHistogram->GetMeasurement(); QString clipboard( "Pixel \t Intensity\n" ); auto j = pixel.begin(); for (auto i = intensity.begin(); i < intensity.end(); i++) { assert(j != pixel.end()); clipboard = clipboard.append( "%L1 \t %L2\n" ) .arg( (*j).toString()) .arg( (*i).toString()); j++; } QApplication::clipboard()->setText( clipboard, QClipboard::Clipboard ); */ } else { QApplication::clipboard()->clear(); } } void QmitkImageStatisticsView::OnClipboardStatisticsButtonClicked() { QLocale tempLocal; QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates)); if ( m_CurrentStatisticsValid && !( m_SelectedPlanarFigure != NULL)) { const std::vector &statistics = this->m_CalculationThread->GetStatisticsData(); // Set time borders for for loop ;) unsigned int startT, endT; if(this->m_Controls->m_CheckBox4dCompleteTable->checkState()==Qt::CheckState::Unchecked) { startT = this->GetRenderWindowPart()->GetTimeNavigationController()->GetTime()-> GetPos(); endT = startT+1; } else { startT = 0; endT = statistics.size(); } QVector< QVector > statisticsTable; QStringList headline; // Create Headline headline << " " << "Mean" << "Median" << "StdDev" << "RMS" << "Max" << "Min" << "NumberOfVoxels" << "Skewness" << "Kurtosis" << "Uniformity" << "Entropy" << "MPP" << "UPP" << "V [mm³]"; for(int i=0;i row; row.append(headline.at(i)); statisticsTable.append(row); } // Fill Table for(unsigned int t=startT;tGetMean()) << QString::number(statistics[t]->GetMedian()) << QString::number(statistics[t]->GetStd()) << QString::number(statistics[t]->GetRMS()) << QString::number(statistics[t]->GetMax()) << QString::number(statistics[t]->GetMin()) << QString::number(statistics[t]->GetN()) << QString::number(statistics[t]->GetSkewness()) << QString::number(statistics[t]->GetKurtosis()) << QString::number(statistics[t]->GetUniformity()) << QString::number(statistics[t]->GetEntropy()) << QString::number(statistics[t]->GetMPP()) << QString::number(statistics[t]->GetUPP()) << QString::number(m_Controls->m_StatisticsTable->item(7, 0)->data(Qt::DisplayRole).toDouble()); for(int z=0;zsetText(clipboard, QClipboard::Clipboard); } else { QApplication::clipboard()->clear(); } QLocale::setDefault(tempLocal); } void QmitkImageStatisticsView::OnSelectionChanged( berry::IWorkbenchPart::Pointer /*part*/, - const QList &selectedNodes ) + const QList &nodes ) { if (this->m_Visible) { - this->SelectionChanged( selectedNodes ); + this->SelectionChanged( nodes ); } else { this->m_DataNodeSelectionChanged = true; } } void QmitkImageStatisticsView::SelectionChanged(const QList &selectedNodes) { if( this->m_StatisticsUpdatePending ) { this->m_DataNodeSelectionChanged = true; return; // not ready for new data now! } if (selectedNodes.size() == this->m_SelectedDataNodes.size()) { int i = 0; for (; i < selectedNodes.size(); ++i) { if (selectedNodes.at(i) != this->m_SelectedDataNodes.at(i)) { break; } } // node selection did not change if (i == selectedNodes.size()) return; } //reset the feature image and image mask field m_Controls->m_SelectedFeatureImageLabel->setText("None"); m_Controls->m_SelectedMaskLabel->setText("None"); this->ReinitData(); if (selectedNodes.isEmpty()) { m_Controls->m_JSHistogram->ClearHistogram(); m_Controls->m_lineRadioButton->setEnabled(true); m_Controls->m_barRadioButton->setEnabled(true); m_Controls->m_HistogramBinSizeSpinbox->setEnabled(true); m_Controls->m_HistogramBinSizeCaptionLabel->setEnabled(true); // m_Controls->m_HistogramBinSizeLabel->setEnabled(true); m_Controls->m_InfoLabel->setText(QString("")); // m_Controls->horizontalLayout_3->setEnabled(false); m_Controls->groupBox->setEnabled(false); m_Controls->groupBox_3->setEnabled(false); } else { // m_Controls->horizontalLayout_3->setEnabled(true); m_Controls->groupBox->setEnabled(true); m_Controls->groupBox_3->setEnabled(true); } if(selectedNodes.size() == 1 || selectedNodes.size() == 2) { bool isBinary = false; selectedNodes.value(0)->GetBoolProperty("binary",isBinary); mitk::NodePredicateDataType::Pointer isLabelSet = mitk::NodePredicateDataType::New("LabelSetImage"); isBinary |= isLabelSet->CheckNode(selectedNodes.value(0)); if(isBinary) { m_Controls->m_JSHistogram->ClearHistogram(); m_Controls->m_lineRadioButton->setEnabled(true); m_Controls->m_barRadioButton->setEnabled(true); m_Controls->m_HistogramBinSizeSpinbox->setEnabled(true); m_Controls->m_HistogramBinSizeCaptionLabel->setEnabled(true); // m_Controls->m_HistogramBinSizeLabel->setEnabled(true); m_Controls->m_InfoLabel->setText(QString("")); } for (int i= 0; i< selectedNodes.size(); ++i) { this->m_SelectedDataNodes.push_back(selectedNodes.at(i)); } this->m_DataNodeSelectionChanged = false; this->m_Controls->m_ErrorMessageLabel->setText( "" ); this->m_Controls->m_ErrorMessageLabel->hide(); emit StatisticsUpdate(); } else { this->m_DataNodeSelectionChanged = false; } } void QmitkImageStatisticsView::ReinitData() { while( this->m_CalculationThread->isRunning()) // wait until thread has finished { itksys::SystemTools::Delay(100); } if(this->m_SelectedImage != NULL) { this->m_SelectedImage->RemoveObserver( this->m_ImageObserverTag); this->m_SelectedImage = NULL; } if(this->m_SelectedImageMask != NULL) { this->m_SelectedImageMask->RemoveObserver( this->m_ImageMaskObserverTag); this->m_SelectedImageMask = NULL; } if(this->m_SelectedPlanarFigure != NULL) { this->m_SelectedPlanarFigure->RemoveObserver( this->m_PlanarFigureObserverTag); this->m_SelectedPlanarFigure = NULL; } this->m_SelectedDataNodes.clear(); this->m_StatisticsUpdatePending = false; m_Controls->m_ErrorMessageLabel->setText( "" ); m_Controls->m_ErrorMessageLabel->hide(); this->InvalidateStatisticsTableView(); m_Controls->m_JSHistogram->ClearHistogram(); m_Controls->m_StatisticsWidgetStack->setCurrentIndex( 0 ); } void QmitkImageStatisticsView::OnThreadedStatisticsCalculationEnds() { std::stringstream message; message << ""; m_Controls->m_ErrorMessageLabel->setText( message.str().c_str() ); m_Controls->m_ErrorMessageLabel->hide(); this->WriteStatisticsToGUI(); } void QmitkImageStatisticsView::UpdateStatistics() { mitk::IRenderWindowPart* renderPart = this->GetRenderWindowPart(); if ( renderPart == NULL ) { this->m_StatisticsUpdatePending = false; return; } m_WorldMinList.clear(); m_WorldMaxList.clear(); // classify selected nodes mitk::NodePredicateDataType::Pointer isImage = mitk::NodePredicateDataType::New("Image"); mitk::NodePredicateDataType::Pointer isLabelSet = mitk::NodePredicateDataType::New("LabelSetImage"); mitk::NodePredicateOr::Pointer imagePredicate = mitk::NodePredicateOr::New(isImage, isLabelSet); std::string maskName = std::string(); std::string maskType = std::string(); std::string featureImageName = std::string(); unsigned int maskDimension = 0; // reset data from last run ITKCommandType::Pointer changeListener = ITKCommandType::New(); changeListener->SetCallbackFunction( this, &QmitkImageStatisticsView::SelectedDataModified ); mitk::DataNode::Pointer planarFigureNode; for( int i= 0 ; i < this->m_SelectedDataNodes.size(); ++i) { mitk::PlanarFigure::Pointer planarFig = dynamic_cast(this->m_SelectedDataNodes.at(i)->GetData()); if( imagePredicate->CheckNode(this->m_SelectedDataNodes.at(i)) ) { bool isMask = false; this->m_SelectedDataNodes.at(i)->GetPropertyValue("binary", isMask); isMask |= isLabelSet->CheckNode(this->m_SelectedDataNodes.at(i)); if( this->m_SelectedImageMask == NULL && isMask) { this->m_SelectedImageMask = dynamic_cast(this->m_SelectedDataNodes.at(i)->GetData()); this->m_ImageMaskObserverTag = this->m_SelectedImageMask->AddObserver(itk::ModifiedEvent(), changeListener); maskName = this->m_SelectedDataNodes.at(i)->GetName(); maskType = m_SelectedImageMask->GetNameOfClass(); maskDimension = 3; } else if( !isMask ) { if(this->m_SelectedImage == NULL) { this->m_SelectedImage = static_cast(this->m_SelectedDataNodes.at(i)->GetData()); this->m_ImageObserverTag = this->m_SelectedImage->AddObserver(itk::ModifiedEvent(), changeListener); } featureImageName = this->m_SelectedDataNodes.at(i)->GetName(); } } else if (planarFig.IsNotNull()) { if(this->m_SelectedPlanarFigure == NULL) { this->m_SelectedPlanarFigure = planarFig; this->m_PlanarFigureObserverTag = this->m_SelectedPlanarFigure->AddObserver(mitk::EndInteractionPlanarFigureEvent(), changeListener); maskName = this->m_SelectedDataNodes.at(i)->GetName(); maskType = this->m_SelectedPlanarFigure->GetNameOfClass(); maskDimension = 2; planarFigureNode = m_SelectedDataNodes.at(i); } } else { std::stringstream message; message << "" << "Invalid data node type!" << ""; m_Controls->m_ErrorMessageLabel->setText( message.str().c_str() ); m_Controls->m_ErrorMessageLabel->show(); } } if(maskName == "") { maskName = "None"; maskType = ""; maskDimension = 0; } if(featureImageName == "") { featureImageName = "None"; } if (m_SelectedPlanarFigure != NULL && m_SelectedImage == NULL) { mitk::DataStorage::SetOfObjects::ConstPointer parentSet = this->GetDataStorage()->GetSources(planarFigureNode); for (int i=0; iSize(); i++) { mitk::DataNode::Pointer node = parentSet->ElementAt(i); if( imagePredicate->CheckNode(node) ) { bool isMask = false; node->GetPropertyValue("binary", isMask); isMask |= isLabelSet->CheckNode(node); if( !isMask ) { if(this->m_SelectedImage == NULL) { this->m_SelectedImage = static_cast(node->GetData()); this->m_ImageObserverTag = this->m_SelectedImage->AddObserver(itk::ModifiedEvent(), changeListener); } } } } } unsigned int timeStep = renderPart->GetTimeNavigationController()->GetTime()->GetPos(); if ( m_SelectedImage != NULL && m_SelectedImage->IsInitialized()) { // Check if a the selected image is a multi-channel image. If yes, statistics // cannot be calculated currently. if ( m_SelectedImage->GetPixelType().GetNumberOfComponents() > 1 ) { std::stringstream message; message << "Multi-component images not supported."; m_Controls->m_ErrorMessageLabel->setText( message.str().c_str() ); m_Controls->m_ErrorMessageLabel->show(); this->InvalidateStatisticsTableView(); m_Controls->m_StatisticsWidgetStack->setCurrentIndex( 0 ); m_Controls->m_JSHistogram->ClearHistogram(); m_CurrentStatisticsValid = false; this->m_StatisticsUpdatePending = false; m_Controls->m_lineRadioButton->setEnabled(true); m_Controls->m_barRadioButton->setEnabled(true); m_Controls->m_HistogramBinSizeSpinbox->setEnabled(true); m_Controls->m_HistogramBinSizeCaptionLabel->setEnabled(true); // m_Controls->m_HistogramBinSizeLabel->setEnabled(true); m_Controls->m_InfoLabel->setText(QString("")); return; } std::stringstream maskLabel; maskLabel << maskName; if ( maskDimension > 0 ) { maskLabel << " [" << maskDimension << "D " << maskType << "]"; } m_Controls->m_SelectedMaskLabel->setText( maskLabel.str().c_str() ); m_Controls->m_SelectedFeatureImageLabel->setText(featureImageName.c_str()); // check time step validity if(m_SelectedImage->GetDimension() <= 3 && timeStep > m_SelectedImage->GetDimension(3)-1) { timeStep = m_SelectedImage->GetDimension(3)-1; } // Add the used mask time step to the mask label so the user knows which mask time step was used // if the image time step is bigger than the total number of mask time steps (see // ImageStatisticsCalculator::ExtractImageAndMask) if (m_SelectedImageMask != NULL) { unsigned int maskTimeStep = timeStep; if (maskTimeStep >= m_SelectedImageMask->GetTimeSteps()) { maskTimeStep = m_SelectedImageMask->GetTimeSteps() - 1; } m_Controls->m_SelectedMaskLabel->setText(m_Controls->m_SelectedMaskLabel->text() + QString(" (t=") + QString::number(maskTimeStep) + QString(")")); } //// initialize thread and trigger it this->m_CalculationThread->SetIgnoreZeroValueVoxel( m_Controls->m_IgnoreZerosCheckbox->isChecked() ); this->m_CalculationThread->Initialize( m_SelectedImage, m_SelectedImageMask, m_SelectedPlanarFigure ); this->m_CalculationThread->SetTimeStep( timeStep ); std::stringstream message; message << "Calculating statistics..."; m_Controls->m_ErrorMessageLabel->setText( message.str().c_str() ); m_Controls->m_ErrorMessageLabel->show(); try { // Compute statistics // this->m_CalculationThread->SetUseDefaultBinSize(m_Controls->m_UseDefaultBinSizeBox->isChecked()); this->m_CalculationThread->start(); } catch ( const mitk::Exception& e) { std::stringstream message; message << "" << e.GetDescription() << ""; m_Controls->m_ErrorMessageLabel->setText( message.str().c_str() ); m_Controls->m_ErrorMessageLabel->show(); this->m_StatisticsUpdatePending = false; } catch ( const std::runtime_error &e ) { // In case of exception, print error message on GUI std::stringstream message; message << "" << e.what() << ""; m_Controls->m_ErrorMessageLabel->setText( message.str().c_str() ); m_Controls->m_ErrorMessageLabel->show(); this->m_StatisticsUpdatePending = false; } catch ( const std::exception &e ) { MITK_ERROR << "Caught exception: " << e.what(); // In case of exception, print error message on GUI std::stringstream message; message << "Error! Unequal Dimensions of Image and Segmentation. No recompute possible "; m_Controls->m_ErrorMessageLabel->setText( message.str().c_str() ); m_Controls->m_ErrorMessageLabel->show(); this->m_StatisticsUpdatePending = false; } } else { this->m_StatisticsUpdatePending = false; } } void QmitkImageStatisticsView::SelectedDataModified() { if( !m_StatisticsUpdatePending ) { emit StatisticsUpdate(); } } void QmitkImageStatisticsView::NodeRemoved(const mitk::DataNode *node) { while(this->m_CalculationThread->isRunning()) // wait until thread has finished { itksys::SystemTools::Delay(100); } if (node->GetData() == m_SelectedImage) { m_SelectedImage = NULL; } } void QmitkImageStatisticsView::RequestStatisticsUpdate() { if ( !m_StatisticsUpdatePending ) { if(this->m_DataNodeSelectionChanged) { this->SelectionChanged(this->GetCurrentSelection()); } else { this->m_StatisticsUpdatePending = true; this->UpdateStatistics(); } } if (this->GetRenderWindowPart()) this->GetRenderWindowPart()->RequestUpdate(); } void QmitkImageStatisticsView::OnHistogramBinSizeBoxValueChanged() { if (m_Controls->m_HistogramBinSizeSpinbox->value() != m_HistogramBinSize) { m_HistogramBinSize = m_Controls->m_HistogramBinSizeSpinbox->value(); this->m_CalculationThread->SetHistogramBinSize(m_Controls->m_HistogramBinSizeSpinbox->value()); this->UpdateStatistics(); } } void QmitkImageStatisticsView::WriteStatisticsToGUI() { disconnect((QObject*)(this->m_Controls->m_JSHistogram), SIGNAL(PageSuccessfullyLoaded()), 0, 0); m_Controls->m_lineRadioButton->setEnabled(true); m_Controls->m_barRadioButton->setEnabled(true); m_Controls->m_HistogramBinSizeSpinbox->setEnabled(true); m_Controls->m_HistogramBinSizeCaptionLabel->setEnabled(true); // m_Controls->m_HistogramBinSizeLabel->setEnabled(true); m_Controls->m_InfoLabel->setText(QString("")); if(m_DataNodeSelectionChanged) { this->m_StatisticsUpdatePending = false; this->RequestStatisticsUpdate(); return; // stop visualization of results and calculate statistics of new selection } if ( this->m_CalculationThread->GetStatisticsUpdateSuccessFlag()) { if ( this->m_CalculationThread->GetStatisticsChangedFlag() ) { // Do not show any error messages m_Controls->m_ErrorMessageLabel->hide(); m_CurrentStatisticsValid = true; } if (m_Controls->m_barRadioButton->isChecked()) { //m_Controls->m_JSHistogram->OnBarRadioButtonSelected(); } m_Controls->m_StatisticsWidgetStack->setCurrentIndex( 0 ); m_Controls->m_HistogramBinSizeSpinbox->setValue( this->m_CalculationThread->GetHistogramBinSize() ); //m_Controls->m_JSHistogram->ComputeHistogram( this->m_CalculationThread->GetTimeStepHistogram(this->m_CalculationThread->GetTimeStep()).GetPointer() ); this->FillStatisticsTableView( this->m_CalculationThread->GetStatisticsData(), this->m_CalculationThread->GetStatisticsImage()); m_CurrentStatisticsValid = true; } else { m_Controls->m_SelectedMaskLabel->setText( "None" ); m_Controls->m_ErrorMessageLabel->setText( m_CalculationThread->GetLastErrorMessage().c_str() ); m_Controls->m_ErrorMessageLabel->show(); // Clear statistics and histogram this->InvalidateStatisticsTableView(); m_Controls->m_StatisticsWidgetStack->setCurrentIndex( 0 ); //m_Controls->m_JSHistogram->clearHistogram(); m_CurrentStatisticsValid = false; // If a (non-closed) PlanarFigure is selected, display a line profile widget if ( m_SelectedPlanarFigure != NULL ) { // Check if the (closed) planar figure is out of bounds and so no image mask could be calculated--> Intensity Profile can not be calculated bool outOfBounds = false; if ( m_SelectedPlanarFigure->IsClosed() && m_SelectedImageMask == NULL) { outOfBounds = true; std::stringstream message; message << "Planar figure is on a rotated image plane or outside the image bounds."; m_Controls->m_InfoLabel->setText(message.str().c_str()); } // check whether PlanarFigure is initialized const mitk::PlaneGeometry *planarFigurePlaneGeometry = m_SelectedPlanarFigure->GetPlaneGeometry(); if ( !(planarFigurePlaneGeometry == NULL || outOfBounds)) { unsigned int timeStep = this->GetRenderWindowPart()->GetTimeNavigationController()->GetTime()->GetPos(); m_Controls->m_JSHistogram->SetImage(this->m_CalculationThread->GetStatisticsImage()); m_Controls->m_JSHistogram->SetPlanarFigure(m_SelectedPlanarFigure); connect((QObject*)(this->m_Controls->m_JSHistogram), SIGNAL(PageSuccessfullyLoaded()), (QObject*) this, SLOT(OnLineRadioButtonSelected())); m_Controls->m_JSHistogram->ComputeIntensityProfile(timeStep, true); //m_Controls->m_JSHistogram->ComputeIntensityProfile(timeStep); //this->ComputeIntensityProfile(m_SelectedPlanarFigure, this->m_CalculationThread->GetStatisticsImage(), timeStep, true); m_Controls->m_lineRadioButton->setChecked(true); m_Controls->m_lineRadioButton->setEnabled(false); m_Controls->m_barRadioButton->setEnabled(false); m_Controls->m_HistogramBinSizeSpinbox->setEnabled(false); m_Controls->m_HistogramBinSizeCaptionLabel->setEnabled(false); // m_Controls->m_HistogramBinSizeLabel->setEnabled(false); this->FillLinearProfileStatisticsTableView( this->m_CalculationThread->GetStatisticsImage() ); std::stringstream message; message << "Only linegraph available for an intensity profile!"; m_Controls->m_InfoLabel->setText(message.str().c_str()); m_CurrentStatisticsValid = true; } else { // Clear statistics, histogram, and GUI this->InvalidateStatisticsTableView(); m_Controls->m_StatisticsWidgetStack->setCurrentIndex( 0 ); m_Controls->m_JSHistogram->ClearHistogram(); m_CurrentStatisticsValid = false; m_Controls->m_ErrorMessageLabel->hide(); m_Controls->m_SelectedMaskLabel->setText( "None" ); this->m_StatisticsUpdatePending = false; m_Controls->m_lineRadioButton->setEnabled(true); m_Controls->m_barRadioButton->setEnabled(true); m_Controls->m_HistogramBinSizeSpinbox->setEnabled(true); m_Controls->m_HistogramBinSizeCaptionLabel->setEnabled(true); // m_Controls->m_HistogramBinSizeLabel->setEnabled(true); if (!outOfBounds) m_Controls->m_InfoLabel->setText(QString("")); return; // Sebastian Wirkert: would suggest to remove this return, since it is an artifact of previous // code architecture. However, removing it will cause m_StatisticsUpdatePending to be set to false // in case of invalid statistics which it previously was not. } } } this->m_StatisticsUpdatePending = false; } void QmitkImageStatisticsView::FillStatisticsTableView( const std::vector &s, const mitk::Image *image ) { this->m_Controls->m_StatisticsTable->setColumnCount(image->GetTimeSteps()); this->m_Controls->m_StatisticsTable->horizontalHeader()->setVisible(image->GetTimeSteps() > 1); // Set Checkbox for complete copy of statistic table if(image->GetTimeSteps()>1) { this->m_Controls->m_CheckBox4dCompleteTable->setEnabled(true); } else { this->m_Controls->m_CheckBox4dCompleteTable->setEnabled(false); this->m_Controls->m_CheckBox4dCompleteTable->setChecked(false); } int decimals = 2; mitk::PixelType doublePix = mitk::MakeScalarPixelType< double >(); mitk::PixelType floatPix = mitk::MakeScalarPixelType< float >(); if (image->GetPixelType()==doublePix || image->GetPixelType()==floatPix) { decimals = 5; } for (unsigned int t = 0; t < image->GetTimeSteps(); t++) { this->m_Controls->m_StatisticsTable->setHorizontalHeaderItem(t, new QTableWidgetItem(QString::number(t))); if (s[t]->GetMaxIndex().size()==3) { mitk::Point3D index, max, min; index[0] = s[t]->GetMaxIndex()[0]; index[1] = s[t]->GetMaxIndex()[1]; index[2] = s[t]->GetMaxIndex()[2]; m_SelectedImage->GetGeometry()->IndexToWorld(index, max); this->m_WorldMaxList.push_back(max); index[0] = s[t]->GetMinIndex()[0]; index[1] = s[t]->GetMinIndex()[1]; index[2] = s[t]->GetMinIndex()[2]; m_SelectedImage->GetGeometry()->IndexToWorld(index, min); this->m_WorldMinList.push_back(min); } typedef mitk::ImageStatisticsCalculator::StatisticsContainer::RealType RealType; RealType maxVal = std::numeric_limits::max(); this->m_Controls->m_StatisticsTable->setItem( 0, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetMean(), 0, 'f', decimals) ) ); this->m_Controls->m_StatisticsTable->setItem( 1, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetMedian(), 0, 'f', decimals) ) ); this->m_Controls->m_StatisticsTable->setItem( 2, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetStd(), 0, 'f', decimals) ) ); this->m_Controls->m_StatisticsTable->setItem( 3, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetRMS(), 0, 'f', decimals) ) ); QString max; max.append(QString("%1").arg(s[t]->GetMax(), 0, 'f', decimals)); max += " ("; for (int i=0; iGetMaxIndex().size(); i++) { max += QString::number(s[t]->GetMaxIndex()[i]); if (iGetMaxIndex().size()-1) max += ","; } max += ")"; this->m_Controls->m_StatisticsTable->setItem( 4, t, new QTableWidgetItem( max ) ); QString min; min.append(QString("%1").arg(s[t]->GetMin(), 0, 'f', decimals)); min += " ("; for (int i=0; iGetMinIndex().size(); i++) { min += QString::number(s[t]->GetMinIndex()[i]); if (iGetMinIndex().size()-1) min += ","; } min += ")"; this->m_Controls->m_StatisticsTable->setItem( 5, t, new QTableWidgetItem( min ) ); this->m_Controls->m_StatisticsTable->setItem( 6, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetN()) ) ); const mitk::BaseGeometry *geometry = image->GetGeometry(); if ( geometry != NULL ) { const mitk::Vector3D &spacing = image->GetGeometry()->GetSpacing(); double volume = spacing[0] * spacing[1] * spacing[2] * (double) s[t]->GetN(); this->m_Controls->m_StatisticsTable->setItem( 7, t, new QTableWidgetItem( QString("%1").arg(volume, 0, 'f', decimals) ) ); } else { this->m_Controls->m_StatisticsTable->setItem( 7, t, new QTableWidgetItem( "NA" ) ); } //statistics of higher order should have 5 decimal places because they used to be very small this->m_Controls->m_StatisticsTable->setItem( 8, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetSkewness(), 0, 'f', 5) ) ); this->m_Controls->m_StatisticsTable->setItem( 9, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetKurtosis(), 0, 'f', 5) ) ); this->m_Controls->m_StatisticsTable->setItem( 10, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetUniformity(), 0, 'f', 5) ) ); this->m_Controls->m_StatisticsTable->setItem( 11, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetEntropy(), 0, 'f', 5) ) ); this->m_Controls->m_StatisticsTable->setItem( 12, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetMPP(), 0, 'f', decimals) ) ); this->m_Controls->m_StatisticsTable->setItem( 13, t, new QTableWidgetItem( QString("%1").arg(s[t]->GetUPP(), 0, 'f', 5) ) ); } this->m_Controls->m_StatisticsTable->resizeColumnsToContents(); int height = STAT_TABLE_BASE_HEIGHT; if (this->m_Controls->m_StatisticsTable->horizontalHeader()->isVisible()) height += this->m_Controls->m_StatisticsTable->horizontalHeader()->height(); if (this->m_Controls->m_StatisticsTable->horizontalScrollBar()->isVisible()) height += this->m_Controls->m_StatisticsTable->horizontalScrollBar()->height(); this->m_Controls->m_StatisticsTable->setMinimumHeight(height); // make sure the current timestep's column is highlighted (and the correct histogram is displayed) unsigned int t = this->GetRenderWindowPart()->GetTimeNavigationController()->GetTime()-> GetPos(); mitk::SliceNavigationController::GeometryTimeEvent timeEvent(this->m_SelectedImage->GetTimeGeometry(), t); this->OnTimeChanged(timeEvent); t = std::min(image->GetTimeSteps() - 1, t); // See bug 18340 /*QString hotspotMean; hotspotMean.append(QString("%1").arg(s[t].GetHotspotStatistics().GetMean(), 0, 'f', decimals)); hotspotMean += " ("; for (int i=0; im_Controls->m_StatisticsTable->setItem( 7, t, new QTableWidgetItem( hotspotMean ) ); QString hotspotMax; hotspotMax.append(QString("%1").arg(s[t].GetHotspotStatistics().GetMax(), 0, 'f', decimals)); hotspotMax += " ("; for (int i=0; im_Controls->m_StatisticsTable->setItem( 8, t, new QTableWidgetItem( hotspotMax ) ); QString hotspotMin; hotspotMin.append(QString("%1").arg(s[t].GetHotspotStatistics().GetMin(), 0, 'f', decimals)); hotspotMin += " ("; for (int i=0; im_Controls->m_StatisticsTable->setItem( 9, t, new QTableWidgetItem( hotspotMin ) );*/ } std::vector QmitkImageStatisticsView::CalculateStatisticsForPlanarFigure( const mitk::Image *image) { std::vector result; int decimals = 2; mitk::PixelType doublePix = mitk::MakeScalarPixelType< double >(); mitk::PixelType floatPix = mitk::MakeScalarPixelType< float >(); if (image->GetPixelType()==doublePix || image->GetPixelType()==floatPix) { decimals = 5; } mitk::ImageStatisticsCalculator::StatisticsContainer::Pointer stats = m_Controls->m_JSHistogram->GetStatistics(); typedef mitk::ImageStatisticsCalculator::StatisticsContainer::RealType RealType; RealType maxVal = std::numeric_limits::max(); if (stats->GetMean() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetMean(), 0, 'f', decimals)); } if (stats->GetMedian() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetMedian(), 0, 'f', decimals)); } if (stats->GetStd() == maxVal) { result.push_back(QString("NA")); } else { result.push_back( QString("%1").arg( stats->GetStd(), 0, 'f', decimals)); } if (stats->GetRMS() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg( stats->GetRMS(), 0, 'f', decimals)); } if (stats->GetMax() == maxVal) { result.push_back(QString("NA")); } else { QString max; max.append(QString("%1").arg(stats->GetMax(), 0, 'f', decimals)); result.push_back(max); } if (stats->GetMin() == maxVal) { result.push_back(QString("NA")); } else { QString min; min.append(QString("%1").arg(stats->GetMin(), 0, 'f', decimals)); result.push_back(min); } if (stats->GetN() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetN())); } result.push_back(QString("NA")); //statistics of higher order should have 5 decimal places because they used to be very small if (stats->GetSkewness() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetSkewness(), 0, 'f', 5 )); } if (stats->GetKurtosis() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetKurtosis(), 0, 'f', 5) ); } if (stats->GetUniformity() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetUniformity(), 0, 'f', 5) ); } if (stats->GetEntropy() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetEntropy(), 0, 'f', 5) ); } if (stats->GetMPP() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetMPP(), 0, 'f', decimals) ); } if (stats->GetUPP() == maxVal) { result.push_back(QString("NA")); } else { result.push_back(QString("%1").arg(stats->GetUPP(), 0, 'f', 5) ); } return result; } void QmitkImageStatisticsView::FillLinearProfileStatisticsTableView( const mitk::Image *image ) { this->m_Controls->m_StatisticsTable->setColumnCount(1); this->m_Controls->m_StatisticsTable->horizontalHeader()->setVisible(false); m_PlanarFigureStatistics = this->CalculateStatisticsForPlanarFigure(image); for (int i = 0; i< m_PlanarFigureStatistics.size(); i++) { this->m_Controls->m_StatisticsTable->setItem( i, 0, new QTableWidgetItem(m_PlanarFigureStatistics[i] )); } this->m_Controls->m_StatisticsTable->resizeColumnsToContents(); int height = STAT_TABLE_BASE_HEIGHT; if (this->m_Controls->m_StatisticsTable->horizontalHeader()->isVisible()) height += this->m_Controls->m_StatisticsTable->horizontalHeader()->height(); if (this->m_Controls->m_StatisticsTable->horizontalScrollBar()->isVisible()) height += this->m_Controls->m_StatisticsTable->horizontalScrollBar()->height(); this->m_Controls->m_StatisticsTable->setMinimumHeight(height); } void QmitkImageStatisticsView::InvalidateStatisticsTableView() { this->m_Controls->m_StatisticsTable->horizontalHeader()->setVisible(false); this->m_Controls->m_StatisticsTable->setColumnCount(1); for ( unsigned int i = 0; i < this->m_Controls->m_StatisticsTable->rowCount(); ++i ) { { this->m_Controls->m_StatisticsTable->setItem( i, 0, new QTableWidgetItem( "NA" ) ); } } this->m_Controls->m_StatisticsTable->setMinimumHeight(STAT_TABLE_BASE_HEIGHT); } void QmitkImageStatisticsView::Activated() { } void QmitkImageStatisticsView::Deactivated() { } void QmitkImageStatisticsView::Visible() { m_Visible = true; mitk::IRenderWindowPart* renderWindow = GetRenderWindowPart(); if (renderWindow) { itk::ReceptorMemberCommand::Pointer cmdTimeEvent = itk::ReceptorMemberCommand::New(); cmdTimeEvent->SetCallbackFunction(this, &QmitkImageStatisticsView::OnTimeChanged); // It is sufficient to add the observer to the axial render window since the GeometryTimeEvent // is always triggered by all views. m_TimeObserverTag = renderWindow->GetQmitkRenderWindow("axial")-> GetSliceNavigationController()-> AddObserver(mitk::SliceNavigationController::GeometryTimeEvent(NULL, 0), cmdTimeEvent); } if (m_DataNodeSelectionChanged) { if (this->IsCurrentSelectionValid()) { this->SelectionChanged(this->GetCurrentSelection()); } else { this->SelectionChanged(this->GetDataManagerSelection()); } m_DataNodeSelectionChanged = false; } } void QmitkImageStatisticsView::Hidden() { m_Visible = false; // The slice navigation controller observer is removed here instead of in the destructor. // If it was called in the destructor, the application would freeze because the view's // destructor gets called after the render windows have been destructed. if ( m_TimeObserverTag != NULL ) { mitk::IRenderWindowPart* renderWindow = GetRenderWindowPart(); if (renderWindow) { renderWindow->GetQmitkRenderWindow("axial")->GetSliceNavigationController()-> RemoveObserver( m_TimeObserverTag ); } m_TimeObserverTag = NULL; } } void QmitkImageStatisticsView::SetFocus() { } diff --git a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.h b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.h index 2770e2a0ac..5593ae2e65 100644 --- a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.h +++ b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsView.h @@ -1,197 +1,195 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkImageStatisticsView_H__INCLUDED #define QmitkImageStatisticsView_H__INCLUDED #include "ui_QmitkImageStatisticsViewControls.h" // Qmitk includes #include #include "QmitkStepperAdapter.h" #include "QmitkImageStatisticsCalculationThread.h" #include // mitk includes -#include "mitkImageStatisticsCalculator.h" -#include "mitkILifecycleAwarePart.h" -#include "mitkPlanarLine.h" +#include +#include +#include /*! \brief QmitkImageStatisticsView is a bundle that allows statistics calculation from images. Three modes are supported: 1. Statistics of one image, 2. Statistics of an image and a segmentation, 3. Statistics of an image and a Planar Figure. The statistics calculation is realized in a seperate thread to keep the gui accessable during calculation. \ingroup Plugins/org.mitk.gui.qt.measurementtoolbox */ class QmitkImageStatisticsView : public QmitkAbstractView, public mitk::ILifecycleAwarePart, public berry::IPartListener { Q_OBJECT private: /*! \ Convenient typedefs */ typedef mitk::DataStorage::SetOfObjects ConstVector; typedef ConstVector::ConstPointer ConstVectorPointer; typedef ConstVector::ConstIterator ConstVectorIterator; typedef std::map< mitk::Image *, mitk::ImageStatisticsCalculator::Pointer > ImageStatisticsMapType; typedef QList SelectedDataNodeVectorType; typedef itk::SimpleMemberCommand< QmitkImageStatisticsView > ITKCommandType; public: /*! \brief default constructor */ QmitkImageStatisticsView(QObject *parent=nullptr, const char *name=nullptr); /*! \brief default destructor */ virtual ~QmitkImageStatisticsView(); /*! \brief method for creating the widget containing the application controls, like sliders, buttons etc. */ virtual void CreateQtPartControl(QWidget *parent) override; /*! \brief method for creating the connections of main and control widget */ virtual void CreateConnections(); /*! - \brief not implemented*/ - //bool IsExclusiveFunctionality() const; - /*! \brief Is called from the selection mechanism once the data manager selection has changed*/ - void OnSelectionChanged( berry::IWorkbenchPart::Pointer part, const QList &nodes ) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; static const std::string VIEW_ID; static const int STAT_TABLE_BASE_HEIGHT; public slots: /** \brief Called when the statistics update is finished, sets the results to GUI.*/ void OnThreadedStatisticsCalculationEnds(); /** \brief Update bin size for histogram resolution. */ void OnHistogramBinSizeBoxValueChanged(); protected slots: /** \brief Saves the histogram to the clipboard */ void OnClipboardHistogramButtonClicked(); /** \brief Saves the statistics to the clipboard */ void OnClipboardStatisticsButtonClicked(); /** \brief Indicates if zeros should be excluded from statistics calculation */ void OnIgnoreZerosCheckboxClicked( ); /** \brief Checks if update is possible and calls StatisticsUpdate() possible */ void RequestStatisticsUpdate(); /** \brief Jump to coordinates stored in the double clicked cell */ void JumpToCoordinates(int row, int col); /** \brief Toogle GUI elements if histogram default bin size checkbox value changed. */ void OnDefaultBinSizeBoxChanged(); void OnShowSubchartBoxChanged(); void OnBarRadioButtonSelected(); void OnLineRadioButtonSelected(); signals: /** \brief Method to set the data to the member and start the threaded statistics update */ void StatisticsUpdate(); protected: /** \brief Writes the calculated statistics to the GUI */ void FillStatisticsTableView(const std::vector &s, const mitk::Image *image ); std::vector CalculateStatisticsForPlanarFigure( const mitk::Image *image); void FillLinearProfileStatisticsTableView( const mitk::Image *image ); /** \brief Removes statistics from the GUI */ void InvalidateStatisticsTableView(); /** \brief Recalculate statistics for currently selected image and mask and * update the GUI. */ void UpdateStatistics(); /** \brief Listener for progress events to update progress bar. */ void UpdateProgressBar(); /** \brief Removes any cached images which are no longer referenced elsewhere. */ void RemoveOrphanImages(); /** \brief Computes an Intensity Profile along line and updates the histogram widget with it. */ void ComputeIntensityProfile( mitk::PlanarLine* line ); /** \brief Removes all Observers to images, masks and planar figures and sets corresponding members to zero */ void ClearObservers(); - void Activated() override; - void Deactivated() override; - void Visible() override; - void Hidden() override; - void SetFocus() override; + virtual void Activated() override; + virtual void Deactivated() override; + virtual void Visible() override; + virtual void Hidden() override; + + virtual void SetFocus() override; /** \brief Method called when itkModifiedEvent is called by selected data. */ void SelectedDataModified(); /** \brief Method called when the data manager selection changes */ void SelectionChanged(const QList &selectedNodes); /** \brief Method called to remove old selection when a new selection is present */ void ReinitData(); /** \brief writes the statistics to the gui*/ void WriteStatisticsToGUI(); void NodeRemoved(const mitk::DataNode *node) override; /** \brief Is called right before the view closes (before the destructor) */ virtual void PartClosed(const berry::IWorkbenchPartReference::Pointer& ) override; /** \brief Is called from the image navigator once the time step has changed */ void OnTimeChanged( const itk::EventObject& ); /** \brief Required for berry::IPartListener */ virtual Events::Types GetPartEventTypes() const override { return Events::CLOSED; } // member variables Ui::QmitkImageStatisticsViewControls *m_Controls; // if you have a planar figure selected, the statistics values will be saved in this one. std::vector m_PlanarFigureStatistics; QmitkImageStatisticsCalculationThread* m_CalculationThread; QmitkStepperAdapter* m_TimeStepperAdapter; unsigned int m_CurrentTime; QString m_Clipboard; // Image and mask data mitk::Image* m_SelectedImage; mitk::Image* m_SelectedImageMask; mitk::PlanarFigure* m_SelectedPlanarFigure; // observer tags long m_ImageObserverTag; long m_ImageMaskObserverTag; long m_PlanarFigureObserverTag; long m_TimeObserverTag; SelectedDataNodeVectorType m_SelectedDataNodes; bool m_CurrentStatisticsValid; bool m_StatisticsUpdatePending; bool m_StatisticsIntegrationPending; bool m_DataNodeSelectionChanged; bool m_Visible; double m_HistogramBinSize; std::vector m_WorldMinList; std::vector m_WorldMaxList; }; #endif // QmitkImageStatisticsView_H__INCLUDED diff --git a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkMeasurementView.h b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkMeasurementView.h index 6823b4dd84..d8a7da9c60 100644 --- a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkMeasurementView.h +++ b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkMeasurementView.h @@ -1,93 +1,91 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITK_MEASUREMENT_H__INCLUDED #define QMITK_MEASUREMENT_H__INCLUDED #include #include -#include #include "usServiceRegistration.h" /// forward declarations struct QmitkMeasurementViewData; namespace mitk { class PlanarFigure; } /// /// A view for doing measurements in digital images by means of /// mitk::Planarfigures which can represent drawing primitives (Lines, circles, ...). /// The view consists of only three main elements: /// 1. A toolbar for activating PlanarFigure drawing /// 2. A textbrowser which shows details for the selected PlanarFigures /// 3. A button for copying all details to the clipboard /// class QmitkMeasurementView : public QmitkAbstractView { Q_OBJECT public: static const std::string VIEW_ID; QmitkMeasurementView(); virtual ~QmitkMeasurementView(); void CreateQtPartControl(QWidget* parent) override; void SetFocus() override; - virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, - const QList &nodes) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; void NodeAdded(const mitk::DataNode* node) override; void NodeChanged(const mitk::DataNode* node) override; void NodeRemoved(const mitk::DataNode* node) override; void PlanarFigureSelected( itk::Object* object, const itk::EventObject& ); protected slots: void OnDrawLineTriggered( bool checked = false ); void OnDrawPathTriggered( bool checked = false ); void OnDrawAngleTriggered( bool checked = false ); void OnDrawFourPointAngleTriggered( bool checked = false ); void OnDrawCircleTriggered( bool checked = false ); void OnDrawEllipseTriggered( bool checked = false ); void OnDrawDoubleEllipseTriggered( bool checked = false ); void OnDrawRectangleTriggered( bool checked = false ); void OnDrawPolygonTriggered( bool checked = false ); void OnDrawBezierCurveTriggered( bool checked = false ); void OnDrawSubdivisionPolygonTriggered( bool checked = false ); void OnCopyToClipboard( bool checked = false ); private: void CreateConnections(); mitk::DataNode::Pointer AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name); void UpdateMeasurementText(); void AddAllInteractors(); mitk::DataNode::Pointer DetectTopMostVisibleImage(); void EnableCrosshairNavigation(); void DisableCrosshairNavigation(); void PlanarFigureInitialized(); void CheckForTopMostVisibleImage(mitk::DataNode* nodeToNeglect = nullptr); mitk::DataStorage::SetOfObjects::ConstPointer GetAllPlanarFigures() const; QmitkMeasurementViewData* d; // holds configuration objects that have been deactivated std::map m_DisplayInteractorConfigs; }; #endif // QMITK_MEASUREMENT_H__INCLUDED diff --git a/Plugins/org.mitk.gui.qt.moviemaker/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.moviemaker/manifest_headers.cmake index 0273e2802e..f19fb46278 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.moviemaker/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Movie Maker") set(Plugin-Version "0.9") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common org.mitk.gui.qt.common.legacy org.mitk.gui.qt.ext) \ No newline at end of file +set(Require-Plugin org.mitk.gui.qt.common org.mitk.gui.qt.ext) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp index ea986977d7..30946d73b1 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp +++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp @@ -1,464 +1,446 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkScreenshotMaker.h" //#include "QmitkMovieMakerControls.h" #include "QmitkStepperAdapter.h" -#include "QmitkStdMultiWidget.h" #include "mitkVtkPropRenderer.h" +#include + #include #include #include #include #include #include #include #include #include #include #include #include "qapplication.h" #include "vtkImageWriter.h" #include "vtkJPEGWriter.h" #include "vtkPNGWriter.h" #include "vtkRenderLargeImage.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkTestUtilities.h" #include #include "vtkMitkRenderProp.h" #include #include #include "vtkRenderWindowInteractor.h" #include #include "mitkSliceNavigationController.h" #include "mitkPlanarFigure.h" QmitkScreenshotMaker::QmitkScreenshotMaker(QObject *parent, const char * /*name*/) - - : - QmitkFunctionality(), m_Controls(nullptr), - m_SelectedNode(0), - m_BackgroundColor(QColor(0,0,0)) + : QmitkAbstractView(), + m_Controls(nullptr), + m_SelectedNode(0), + m_BackgroundColor(QColor(0,0,0)) { - - parentWidget = parent; - + parentWidget = parent; } QmitkScreenshotMaker::~QmitkScreenshotMaker() { } void QmitkScreenshotMaker::CreateConnections() { if (m_Controls) { connect((QObject*) m_Controls->m_AllViews, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanar3DHighresScreenshot())); connect((QObject*) m_Controls->m_View1, SIGNAL(clicked()), (QObject*) this, SLOT(View1())); connect((QObject*) m_Controls->m_View2, SIGNAL(clicked()), (QObject*) this, SLOT(View2())); connect((QObject*) m_Controls->m_View3, SIGNAL(clicked()), (QObject*) this, SLOT(View3())); connect((QObject*) m_Controls->m_Shot, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanarScreenshots())); connect((QObject*) m_Controls->m_BackgroundColor, SIGNAL(clicked()), (QObject*) this, SLOT(SelectBackgroundColor())); connect((QObject*) m_Controls->btnScreenshot, SIGNAL(clicked()), this, SLOT(GenerateScreenshot())); connect((QObject*) m_Controls->m_HRScreenshot, SIGNAL(clicked()), this, SLOT(Generate3DHighresScreenshot())); QString styleSheet = "background-color:rgb(0,0,0)"; m_Controls->m_BackgroundColor->setStyleSheet(styleSheet); } } -void QmitkScreenshotMaker::Activated() -{ - QmitkFunctionality::Activated(); -} - -void QmitkScreenshotMaker::Deactivated() -{ - QmitkFunctionality::Deactivated(); -} - void QmitkScreenshotMaker::GenerateScreenshot() { if (m_LastFile.size()==0) m_LastFile = QDir::currentPath()+"/screenshot.png"; QString filter; QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter); if (fileName.size()>0) m_LastFile = fileName; - vtkRenderWindow* renderWindow = mitk::RenderingManager::GetInstance()->GetFocusedRenderWindow(); - mitk::BaseRenderer* baserenderer = mitk::BaseRenderer::GetInstance(renderWindow); + auto renderWindowPart = this->GetRenderWindowPart(OPEN); + mitk::BaseRenderer* renderer = renderWindowPart->GetActiveQmitkRenderWindow()->GetRenderer(); - if (baserenderer == nullptr) + if (renderer == nullptr) { - mitk::RenderingManager::GetInstance()->SetRenderWindowFocus(m_MultiWidget->mitkWidget1->GetRenderWindow()); - vtkRenderWindow* renderWindow = mitk::RenderingManager::GetInstance()->GetFocusedRenderWindow(); - baserenderer = mitk::BaseRenderer::GetInstance(renderWindow); - - if( baserenderer == nullptr ) + renderer = renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer(); + if (renderer == nullptr) return; } - this->TakeScreenshot(baserenderer->GetVtkRenderer(), 1, fileName, filter); + this->TakeScreenshot(renderer->GetVtkRenderer(), 1, fileName, filter); } void QmitkScreenshotMaker::GenerateMultiplanarScreenshots() { if (m_LastPath.size()==0) m_LastPath = QDir::currentPath(); QString filePath = QFileDialog::getExistingDirectory(nullptr, "Save screenshots to...", m_LastPath); if (filePath.size()>0) m_LastPath = filePath; if( filePath.isEmpty() ) { return; } //emit StartBlockControls(); - m_MultiWidget->SetCornerAnnotationVisibility(false); - - mitk::DataNode* n; + auto renderWindowPart = this->GetRenderWindowPart(OPEN); + renderWindowPart->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); QString fileName = "/axial.png"; int c = 1; while (QFile::exists(filePath+fileName)) { fileName = QString("/axial_"); fileName += QString::number(c); fileName += ".png"; c++; } - vtkRenderer* renderer = m_MultiWidget->mitkWidget1->GetRenderer()->GetVtkRenderer(); + vtkRenderer* renderer = renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer()->GetVtkRenderer(); if (renderer != nullptr) this->TakeScreenshot(renderer, 1, filePath+fileName); fileName = "/sagittal.png"; c = 1; while (QFile::exists(filePath+fileName)) { fileName = QString("/sagittal_"); fileName += QString::number(c); fileName += ".png"; c++; } - renderer = m_MultiWidget->mitkWidget2->GetRenderer()->GetVtkRenderer(); + renderer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer()->GetVtkRenderer(); if (renderer != nullptr) this->TakeScreenshot(renderer, 1, filePath+fileName); fileName = "/coronal.png"; c = 1; while (QFile::exists(filePath+fileName)) { fileName = QString("/coronal_"); fileName += QString::number(c); fileName += ".png"; c++; } - renderer = m_MultiWidget->mitkWidget3->GetRenderer()->GetVtkRenderer(); + renderer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer()->GetVtkRenderer(); if (renderer != nullptr) this->TakeScreenshot(renderer, 1, filePath+fileName); - n = this->m_MultiWidget->GetWidgetPlane1(); - if(n) - { - n->SetProperty( "color", mitk::ColorProperty::New( 1,0,0 ) ); - } - - n = this->m_MultiWidget->GetWidgetPlane2(); - if(n) - { - n->SetProperty( "color", mitk::ColorProperty::New( 0,1,0 ) ); - } - - n = this->m_MultiWidget->GetWidgetPlane3(); - if(n) - { - n->SetProperty( "color", mitk::ColorProperty::New( 0,0,1 ) ); - } - - m_MultiWidget->SetCornerAnnotationVisibility(true); + /// TODO I do not find a simple way of doing this through the render window part API, + /// however, I am also not convinced that this code is needed at all. The colour + /// of the crosshair planes is never set to any colour other than these. + /// I suggest a new 'mitk::DataNode* mitk::ILinkedRendererPart::GetSlicingPlane(const std::string& name) const' + /// function to introduce that could return the individual ("axial", "sagittal" or + /// "coronal" crosshair planes. + +// mitk::DataNode* n = renderWindowPart->GetSlicingPlane("axial"); +// if (n) +// { +// n->SetProperty( "color", mitk::ColorProperty::New( 1,0,0 ) ); +// } +// +// n = renderWindowPart->GetSlicingPlane("sagittal"); +// if (n) +// { +// n->SetProperty( "color", mitk::ColorProperty::New( 0,1,0 ) ); +// } +// +// n = renderWindowPart->GetSlicingPlane("coronal"); +// if (n) +// { +// n->SetProperty( "color", mitk::ColorProperty::New( 0,0,1 ) ); +// } + + renderWindowPart->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); } void QmitkScreenshotMaker::Generate3DHighresScreenshot() { if (m_LastFile.size()==0) m_LastFile = QDir::currentPath()+"/3D_screenshot.png"; QString filter; QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter); if (fileName.size()>0) m_LastFile = fileName; GenerateHR3DAtlasScreenshots(fileName, filter); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkScreenshotMaker::GenerateMultiplanar3DHighresScreenshot() { if (m_LastPath.size()==0) m_LastPath = QDir::currentPath(); QString filePath = QFileDialog::getExistingDirectory( nullptr, "Save screenshots to...", m_LastPath); if (filePath.size()>0) m_LastPath = filePath; if( filePath.isEmpty() ) { return; } QString fileName = "/3D_View1.png"; int c = 1; while (QFile::exists(filePath+fileName)) { fileName = QString("/3D_View1_"); fileName += QString::number(c); fileName += ".png"; c++; } GetCam()->Azimuth( -7.5 ); GetCam()->Roll(-4); GenerateHR3DAtlasScreenshots(filePath+fileName); GetCam()->Roll(4); fileName = "/3D_View2.png"; c = 1; while (QFile::exists(filePath+fileName)) { fileName = QString("/3D_View2_"); fileName += QString::number(c); fileName += ".png"; c++; } GetCam()->Azimuth( 90 ); GetCam()->Elevation( 4 ); GenerateHR3DAtlasScreenshots(filePath+fileName); fileName = "/3D_View3.png"; c = 1; while (QFile::exists(filePath+fileName)) { fileName = QString("/3D_View3_"); fileName += QString::number(c); fileName += ".png"; c++; } GetCam()->Elevation( 90 ); GetCam()->Roll( -2.5 ); GenerateHR3DAtlasScreenshots(filePath+fileName); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkScreenshotMaker::GenerateHR3DAtlasScreenshots(QString fileName, QString filter) { // only works correctly for 3D RenderWindow - m_MultiWidget->SetCornerAnnotationVisibility(false); - vtkRenderer* renderer = m_MultiWidget->mitkWidget4->GetRenderer()->GetVtkRenderer(); + this->GetRenderWindowPart()->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); + vtkRenderer* renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderer()->GetVtkRenderer(); if (renderer == nullptr) return; this->TakeScreenshot(renderer, this->m_Controls->m_MagFactor->text().toFloat(), fileName, filter); - m_MultiWidget->SetCornerAnnotationVisibility(true); + this->GetRenderWindowPart()->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); } vtkCamera* QmitkScreenshotMaker::GetCam() { - mitk::BaseRenderer* renderer = mitk::BaseRenderer::GetInstance(GetActiveStdMultiWidget()->mitkWidget4->GetRenderWindow()); + mitk::BaseRenderer* renderer = this->GetRenderWindowPart(OPEN)->GetQmitkRenderWindow("3d")->GetRenderer(); vtkCamera* cam = 0; const mitk::VtkPropRenderer *propRenderer = dynamic_cast( renderer ); if (propRenderer) { // get vtk renderer vtkRenderer* vtkrenderer = propRenderer->GetVtkRenderer(); if (vtkrenderer) { // get vtk camera vtkCamera* vtkcam = vtkrenderer->GetActiveCamera(); if (vtkcam) { // vtk smart pointer handling cam = vtkcam; cam->Register( nullptr ); } } } return cam; } void QmitkScreenshotMaker::View1() { GetCam()->Elevation( 45 ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkScreenshotMaker::View2() { GetCam()->Azimuth(45); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkScreenshotMaker::View3() { GetCam()->Roll(45); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } -void QmitkScreenshotMaker::OnSelectionChanged( std::vector nodes ) +void QmitkScreenshotMaker::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { if(nodes.size()) m_SelectedNode = nodes[0]; } void QmitkScreenshotMaker::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { + m_Parent = parent; m_Controls = new Ui::QmitkScreenshotMakerControls; m_Controls->setupUi(parent); // Initialize "Selected Window" combo box const mitk::RenderingManager::RenderWindowVector rwv = mitk::RenderingManager::GetInstance()->GetAllRegisteredRenderWindows(); } this->CreateConnections(); } -void QmitkScreenshotMaker::StdMultiWidgetAvailable(QmitkStdMultiWidget& stdMultiWidget) +void QmitkScreenshotMaker::SetFocus() +{ + m_Controls->btnScreenshot->setFocus(); +} + +void QmitkScreenshotMaker::RenderWindowPartActivated(mitk::IRenderWindowPart* /*renderWindowPart*/) { - m_MultiWidget = &stdMultiWidget; m_Parent->setEnabled(true); } -void QmitkScreenshotMaker::StdMultiWidgetNotAvailable() +void QmitkScreenshotMaker::RenderWindowPartDeactivated(mitk::IRenderWindowPart* /*renderWindowPart*/) { - m_MultiWidget = nullptr; m_Parent->setEnabled(false); } void QmitkScreenshotMaker::TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter) { if ((renderer == nullptr) ||(magnificationFactor < 1) || fileName.isEmpty()) return; bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() ); renderer->GetRenderWindow()->DoubleBufferOff(); vtkImageWriter* fileWriter = nullptr; QFileInfo fi(fileName); QString suffix = fi.suffix().toLower(); if (suffix.isEmpty() || (suffix != "png" && suffix != "jpg" && suffix != "jpeg")) { if (filter == m_PNGExtension) { suffix = "png"; } else if (filter == m_JPGExtension) { suffix = "jpg"; } fileName += "." + suffix; } if (suffix.compare("jpg", Qt::CaseInsensitive) == 0 || suffix.compare("jpeg", Qt::CaseInsensitive) == 0) { vtkJPEGWriter* w = vtkJPEGWriter::New(); w->SetQuality(100); w->ProgressiveOff(); fileWriter = w; } else //default is png { fileWriter = vtkPNGWriter::New(); } vtkRenderLargeImage* magnifier = vtkRenderLargeImage::New(); magnifier->SetInput(renderer); magnifier->SetMagnification(magnificationFactor); //magnifier->Update(); fileWriter->SetInputConnection(magnifier->GetOutputPort()); fileWriter->SetFileName(fileName.toLatin1()); // vtkRenderLargeImage has problems with different layers, therefore we have to // temporarily deactivate all other layers. // we set the background to white, because it is nicer than black... double oldBackground[3]; renderer->GetBackground(oldBackground); // QColor color = QColorDialog::getColor(); double bgcolor[] = {m_BackgroundColor.red()/255.0, m_BackgroundColor.green()/255.0, m_BackgroundColor.blue()/255.0}; renderer->SetBackground(bgcolor); - m_MultiWidget->DisableColoredRectangles(); - m_MultiWidget->DisableDepartmentLogo(); - m_MultiWidget->DisableGradientBackground(); - m_MultiWidget->SetCornerAnnotationVisibility(false); + mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); - m_MultiWidget->mitkWidget1->ActivateMenuWidget( false ); - m_MultiWidget->mitkWidget2->ActivateMenuWidget( false ); - m_MultiWidget->mitkWidget3->ActivateMenuWidget( false ); - m_MultiWidget->mitkWidget4->ActivateMenuWidget( false ); + renderWindowPart->EnableDecorations(false); fileWriter->Write(); fileWriter->Delete(); - m_MultiWidget->mitkWidget1->ActivateMenuWidget( true, m_MultiWidget ); - m_MultiWidget->mitkWidget2->ActivateMenuWidget( true, m_MultiWidget ); - m_MultiWidget->mitkWidget3->ActivateMenuWidget( true, m_MultiWidget ); - m_MultiWidget->mitkWidget4->ActivateMenuWidget( true, m_MultiWidget ); + renderWindowPart->EnableDecorations(true); - m_MultiWidget->EnableColoredRectangles(); - m_MultiWidget->EnableDepartmentLogo(); - m_MultiWidget->EnableGradientBackground(); - m_MultiWidget->SetCornerAnnotationVisibility(true); renderer->SetBackground(oldBackground); renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering); } void QmitkScreenshotMaker::SelectBackgroundColor() { m_BackgroundColor = QColorDialog::getColor(); m_Controls->m_BackgroundColor->setAutoFillBackground(true); QString styleSheet = "background-color:rgb("; styleSheet.append(QString::number(m_BackgroundColor.red())); styleSheet.append(","); styleSheet.append(QString::number(m_BackgroundColor.green())); styleSheet.append(","); styleSheet.append(QString::number(m_BackgroundColor.blue())); styleSheet.append(")"); m_Controls->m_BackgroundColor->setStyleSheet(styleSheet); } diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h index ea2184ff90..66b6a70b0a 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h +++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h @@ -1,133 +1,134 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #if !defined(QMITK_ScreenshotMaker_H__INCLUDED) #define QMITK_ScreenshotMaker_H__INCLUDED -#include "QmitkFunctionality.h" +#include +#include + #include "mitkCameraRotationController.h" #include "mitkStepper.h" #include "mitkMultiStepper.h" #include "mitkMovieGenerator.h" #include "itkCommand.h" #include "QVTKWidget.h" #include "vtkEventQtSlotConnect.h" #include "vtkRenderWindow.h" #include "mitkVtkPropRenderer.h" #include "ui_QmitkScreenshotMakerControls.h" //#include "../MovieMakerDll.h" -//class QmitkStdMultiWidget; //class QmitkMovieMakerControls; class QmitkStepperAdapter; class vtkCamera; class QTimer; class QTime; /** - * \brief Functionality for creating movies (AVIs) - * \ingroup Functionalities + * \brief View for creating movies (AVIs) */ -class QmitkScreenshotMaker: public QmitkFunctionality +class QmitkScreenshotMaker: public QmitkAbstractView, public mitk::IRenderWindowPartListener { Q_OBJECT public: /** \brief Constructor. */ QmitkScreenshotMaker(QObject *parent=0, const char *name=0); /** \brief Destructor. */ virtual ~QmitkScreenshotMaker(); /** \brief Method for creating the widget containing the application * controls, like sliders, buttons etc. */ - void CreateQtPartControl(QWidget *parent) override; + virtual void CreateQtPartControl(QWidget *parent) override; // virtual QWidget * CreateControlWidget(QWidget *parent); + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + /** \brief Method for creating the connections of main and control widget. */ virtual void CreateConnections(); /** \brief Method for creating an QAction object, i.e. button & menu entry. * @param parent the parent QWidget */ // virtual QAction * CreateAction(QActionGroup *parent); - virtual void Activated() override; - - virtual void Deactivated() override; - /// - /// Called when a StdMultiWidget is available. + /// Called when a RenderWindowPart becomes available. /// - virtual void StdMultiWidgetAvailable(QmitkStdMultiWidget& stdMultiWidget) override; + virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; /// - /// Called when no StdMultiWidget is available. + /// Called when a RenderWindowPart becomes unavailable. /// - virtual void StdMultiWidgetNotAvailable() override; + virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; signals: protected slots: void GenerateScreenshot(); void GenerateMultiplanarScreenshots(); void Generate3DHighresScreenshot(); void GenerateMultiplanar3DHighresScreenshot(); void View1(); void View2(); void View3(); void SelectBackgroundColor(); protected: QObject *parentWidget; + QWidget* m_Parent; QVTKWidget * widget; - QmitkStdMultiWidget* m_MultiWidget; vtkEventQtSlotConnect * connections; vtkRenderWindow * renderWindow; mitk::VtkPropRenderer::Pointer m_PropRenderer; Ui::QmitkScreenshotMakerControls* m_Controls; private: - void OnSelectionChanged( std::vector nodes ) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; vtkCamera* GetCam(); void GenerateHR3DAtlasScreenshots(QString fileName, QString filter = ""); void GenerateMultiplanarScreenshots(QString fileName); /*! \brief taking a screenshot "from" the specified renderer \param magnificationFactor specifying the quality of the screenshot (the magnification of the actual RenderWindow size) \param fileName file location and name where the screenshot should be saved */ void TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter = ""); QColor m_BackgroundColor; mitk::DataNode* m_SelectedNode; QString m_LastPath; QString m_LastFile; QString m_PNGExtension = "PNG File (*.png)"; QString m_JPGExtension = "JPEG File (*.jpg)"; }; #endif // !defined(QMITK_ScreenshotMaker_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkAutocropAction.h b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkAutocropAction.h index acb9ae57d9..c5784f8e2d 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkAutocropAction.h +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkAutocropAction.h @@ -1,56 +1,54 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITK_AUTOCROPACTION_H #define QMITK_AUTOCROPACTION_H #include "mitkIContextMenuAction.h" #include "org_mitk_gui_qt_multilabelsegmentation_Export.h" #include "vector" #include "mitkDataNode.h" #include "mitkImage.h" -class QmitkStdMultiWidget; - class MITK_QT_SEGMENTATION QmitkAutocropAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkAutocropAction(); virtual ~QmitkAutocropAction(); //interface methods void Run( const QList& selectedNodes ); void SetDataStorage(mitk::DataStorage* dataStorage); void SetSmoothed(bool smoothed); void SetDecimated(bool decimated); void SetFunctionality(berry::QtViewPart* functionality); protected: mitk::Image::Pointer IncreaseCroppedImageSize( mitk::Image::Pointer image ); private: typedef QList NodeList; }; #endif // QMITK_AUTOCROPACTION_H diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertMaskToLabelAction.h b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertMaskToLabelAction.h index cc89d03990..2986fac803 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertMaskToLabelAction.h +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertMaskToLabelAction.h @@ -1,54 +1,52 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef __QmitkConvertMaskToLabelAction_H_ #define __QmitkConvertMaskToLabelAction_H_ #include "mitkIContextMenuAction.h" #include "org_mitk_gui_qt_multilabelsegmentation_Export.h" #include "vector" #include "mitkDataNode.h" #include "mitkImage.h" -class QmitkStdMultiWidget; - class MITK_QT_SEGMENTATION QmitkConvertMaskToLabelAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkConvertMaskToLabelAction(); virtual ~QmitkConvertMaskToLabelAction(); //interface methods void Run( const QList& selectedNodes ); void SetDataStorage(mitk::DataStorage* dataStorage); void SetSmoothed(bool smoothed); void SetDecimated(bool decimated); void SetFunctionality(berry::QtViewPart* functionality); protected: private: typedef QList NodeList; }; #endif // __QmitkConvertMaskToLabelAction_H_ diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertSurfaceToLabelAction.h b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertSurfaceToLabelAction.h index 5cbde8ed99..dc240cd2de 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertSurfaceToLabelAction.h +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkConvertSurfaceToLabelAction.h @@ -1,54 +1,52 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef __QmitkConvertSurfaceToLabelAction_H_ #define __QmitkConvertSurfaceToLabelAction_H_ #include "mitkIContextMenuAction.h" #include "org_mitk_gui_qt_multilabelsegmentation_Export.h" #include "vector" #include "mitkDataNode.h" #include "mitkImage.h" -class QmitkStdMultiWidget; - class MITK_QT_SEGMENTATION QmitkConvertSurfaceToLabelAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkConvertSurfaceToLabelAction(); virtual ~QmitkConvertSurfaceToLabelAction(); //interface methods void Run( const QList& selectedNodes ); void SetDataStorage(mitk::DataStorage* dataStorage); void SetSmoothed(bool smoothed); void SetDecimated(bool decimated); void SetFunctionality(berry::QtViewPart* functionality); protected: private: typedef QList NodeList; }; #endif // __QmitkConvertSurfaceToLabelAction_H_ diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.cpp b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.cpp index 3dd81c60f2..9d3d6c8ad7 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.cpp +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.cpp @@ -1,173 +1,171 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkCreatePolygonModelAction.h" // MITK #include #include #include #include -#include - #include -#include +#include // Blueberry #include #include #include #include #include using namespace berry; using namespace mitk; using namespace std; QmitkCreatePolygonModelAction::QmitkCreatePolygonModelAction() { } QmitkCreatePolygonModelAction::~QmitkCreatePolygonModelAction() { } void QmitkCreatePolygonModelAction::Run(const QList &selectedNodes) { DataNode::Pointer selectedNode = selectedNodes[0]; Image::Pointer image = dynamic_cast(selectedNode->GetData()); if (image.IsNull()) return; try { if (!m_IsSmoothed) { ShowSegmentationAsSurface::Pointer surfaceFilter = ShowSegmentationAsSurface::New(); itk::SimpleMemberCommand::Pointer successCommand = itk::SimpleMemberCommand::New(); successCommand->SetCallbackFunction(this, &QmitkCreatePolygonModelAction::OnSurfaceCalculationDone); surfaceFilter->AddObserver(ResultAvailable(), successCommand); itk::SimpleMemberCommand::Pointer errorCommand = itk::SimpleMemberCommand::New(); errorCommand->SetCallbackFunction(this, &QmitkCreatePolygonModelAction::OnSurfaceCalculationDone); surfaceFilter->AddObserver(ProcessingError(), errorCommand); surfaceFilter->SetDataStorage(*m_DataStorage); surfaceFilter->SetPointerParameter("Input", image); surfaceFilter->SetPointerParameter("Group node", selectedNode); surfaceFilter->SetParameter("Show result", true); surfaceFilter->SetParameter("Sync visibility", false); surfaceFilter->SetParameter("Smooth", false); surfaceFilter->SetParameter("Apply median", false); surfaceFilter->SetParameter("Median kernel size", 3u); surfaceFilter->SetParameter("Gaussian SD", 1.5f); surfaceFilter->SetParameter("Decimate mesh", m_IsDecimated); surfaceFilter->SetParameter("Decimation rate", 0.8f); StatusBar::GetInstance()->DisplayText("Surface creation started in background..."); surfaceFilter->StartAlgorithm(); } else { ShowSegmentationAsSmoothedSurface::Pointer surfaceFilter = ShowSegmentationAsSmoothedSurface::New(); itk::SimpleMemberCommand::Pointer successCommand = itk::SimpleMemberCommand::New(); successCommand->SetCallbackFunction(this, &QmitkCreatePolygonModelAction::OnSurfaceCalculationDone); surfaceFilter->AddObserver(mitk::ResultAvailable(), successCommand); itk::SimpleMemberCommand::Pointer errorCommand = itk::SimpleMemberCommand::New(); errorCommand->SetCallbackFunction(this, &QmitkCreatePolygonModelAction::OnSurfaceCalculationDone); surfaceFilter->AddObserver(mitk::ProcessingError(), errorCommand); surfaceFilter->SetDataStorage(*m_DataStorage); surfaceFilter->SetPointerParameter("Input", image); surfaceFilter->SetPointerParameter("Group node", selectedNode); berry::IWorkbenchPart::Pointer activePart = berry::PlatformUI::GetWorkbench()->GetActiveWorkbenchWindow()->GetActivePage()->GetActivePart(); mitk::IRenderWindowPart* renderPart = dynamic_cast(activePart.GetPointer()); mitk::SliceNavigationController* timeNavController = 0; if (renderPart != 0) { - timeNavController = renderPart->GetRenderingManager()->GetTimeNavigationController(); + timeNavController = renderPart->GetTimeNavigationController(); } int timeNr = timeNavController != 0 ? timeNavController->GetTime()->GetPos() : 0; surfaceFilter->SetParameter("TimeNr", timeNr); IPreferencesService* prefService = berry::Platform::GetPreferencesService(); IPreferences::Pointer segPref = prefService->GetSystemPreferences()->Node("/org.mitk.views.multilabelsegmentation"); bool smoothingHint = segPref->GetBool("smoothing hint", true); ScalarType smoothing = segPref->GetDouble("smoothing value", 1.0); ScalarType decimation = segPref->GetDouble("decimation rate", 0.5); ScalarType closing = segPref->GetDouble("closing ratio", 0.0); if (smoothingHint) { smoothing = 0.0; Vector3D spacing = image->GetGeometry()->GetSpacing(); for (Vector3D::Iterator iter = spacing.Begin(); iter != spacing.End(); ++iter) smoothing = max(smoothing, *iter); } surfaceFilter->SetParameter("Smoothing", smoothing); surfaceFilter->SetParameter("Decimation", decimation); surfaceFilter->SetParameter("Closing", closing); ProgressBar::GetInstance()->AddStepsToDo(8); StatusBar::GetInstance()->DisplayText("Smoothed surface creation started in background..."); try { surfaceFilter->StartAlgorithm(); } catch (...) { MITK_ERROR<<"Error creating smoothed polygon model: Not enough memory!"; } } } catch(...) { MITK_ERROR << "Surface creation failed!"; } } void QmitkCreatePolygonModelAction::OnSurfaceCalculationDone() { StatusBar::GetInstance()->Clear(); } void QmitkCreatePolygonModelAction::SetDataStorage(DataStorage *dataStorage) { m_DataStorage = dataStorage; } void QmitkCreatePolygonModelAction::SetSmoothed(bool smoothed) { m_IsSmoothed = smoothed; } void QmitkCreatePolygonModelAction::SetDecimated(bool decimated) { m_IsDecimated = decimated; } void QmitkCreatePolygonModelAction::SetFunctionality(QtViewPart *) { } diff --git a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.h b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.h index b7adfaaed8..c34943a5c0 100644 --- a/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.h +++ b/Plugins/org.mitk.gui.qt.multilabelsegmentation/src/internal/QmitkCreatePolygonModelAction.h @@ -1,57 +1,55 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKCREATEPOLYGONMODELACTION_H #define QMITKCREATEPOLYGONMODELACTION_H #include // Parent classes #include #include // Data members #include -class QmitkStdMultiWidget; - class MITK_QT_SEGMENTATION QmitkCreatePolygonModelAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkCreatePolygonModelAction(); ~QmitkCreatePolygonModelAction(); // IContextMenuAction void Run(const QList &selectedNodes); void SetDataStorage(mitk::DataStorage *dataStorage); void SetSmoothed(bool smoothed); void SetDecimated(bool decimated); void SetFunctionality(berry::QtViewPart *functionality); void OnSurfaceCalculationDone(); private: QmitkCreatePolygonModelAction(const QmitkCreatePolygonModelAction &); QmitkCreatePolygonModelAction & operator=(const QmitkCreatePolygonModelAction &); mitk::DataStorage::Pointer m_DataStorage; bool m_IsSmoothed; bool m_IsDecimated; }; #endif diff --git a/Plugins/org.mitk.gui.qt.pointsetinteraction/documentation/UserManual/QmitkPointSetInteraction.dox b/Plugins/org.mitk.gui.qt.pointsetinteraction/documentation/UserManual/QmitkPointSetInteraction.dox index 65f82f63f2..012e67114d 100644 --- a/Plugins/org.mitk.gui.qt.pointsetinteraction/documentation/UserManual/QmitkPointSetInteraction.dox +++ b/Plugins/org.mitk.gui.qt.pointsetinteraction/documentation/UserManual/QmitkPointSetInteraction.dox @@ -1,47 +1,47 @@ /** \page org_mitk_views_pointsetinteraction The Point Set Interaction View \imageMacro{QmitkPointSetInteraction_Icon.png,"Icon of the Point Set Interaction View",2.00} Available sections: - \ref QmitkPointSetInteractionUserManualOverview - \ref QmitkPointSetInteractionUserManualDetails \section QmitkPointSetInteractionUserManualOverview Overview -This functionality allows you to define multiple sets of points, to fill them with points and to save them in so called PointSets. +This view allows you to define multiple sets of points, to fill them with points and to save them in so called PointSets. -\imageMacro{QmitkPointSetInteraction_Screenshot.png,"MITK with the QmitkPointSetInteraction functionality",16.00} +\imageMacro{QmitkPointSetInteraction_Screenshot.png,"MITK with the QmitkPointSetInteraction view",16.00} -This document will tell you how to use this functionality, but it is assumed that you already know how to navigate through the slices of an image using the +This document will tell you how to use this view, but it is assumed that you already know how to navigate through the slices of an image using the four window view. Please read the application manual for more information. \section QmitkPointSetInteractionUserManualDetails Details -First of all you have to select a PointSet to use this functionality. Therefore, you have to select the point set in the data manager. +First of all you have to select a PointSet to use this view. Therefore, you have to select the point set in the data manager. If there are currently no point sets in the data tree, you have to first add a new point set to the data tree. This is done by clicking the "Add pointset..." button. \imageMacro{QmitkPointSetInteraction_AddPointSet.png,"The Add pointset... dialog",8.64} In the pop-up dialog, you have to specify a name for the new point set. This is also the node for the new data tree item. \imageMacro{QmitkPointSetInteraction_CurrentPointSetArea.png,"The Current pointset area",6.52} The "Current pointset" area contains a list of points. Within this area, all points for the current point set node are listed. To set points you have to toggle the "Set Points" button, the leftmost of the four buttons on the bottom of the view. Points can be defined by performing a left mouse button click while holding the "Shift"-key pressed in the four window view. To erase all points from the list press the next button. The user is prompted to confirm the decision. If you want to delete only a single point, left click on it in the list and then press delete on your keyboard. With the third button, a previously saved point set can be loaded and all of its points are shown in the list and the four window view. The user is prompted to select the file to be loaded. The file extension is ".mps". On the right of this button is the save button. With this function the entire point set can be saved to the harddrive. The user is prompted to select a filename. Pointsets are saved in XML fileformat but have to have a ".mps" file extension. You can select points in the render window, if the "Set Points" button is toggled, with a left mouse button click on them. If you keep the mouse button pressed, you can move the points by moving the mouse and then releasing the mouse button. With the delete key you can remove the selected points. */ \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.pointsetinteraction/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.pointsetinteraction/manifest_headers.cmake index 71e38a204d..12c8ebbc7c 100644 --- a/Plugins/org.mitk.gui.qt.pointsetinteraction/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.pointsetinteraction/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Pointset Interaction") set(Plugin-Version "0.9") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy) \ No newline at end of file +set(Require-Plugin org.mitk.gui.qt.common) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml b/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml index abd1ee41bd..88d98d53b9 100644 --- a/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml +++ b/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml @@ -1,12 +1,9 @@ - - + - - diff --git a/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.cpp b/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.cpp index e0aab62392..741d400124 100755 --- a/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.cpp +++ b/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.cpp @@ -1,150 +1,143 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Qmitk related includes #include "QmitkPointSetInteractionView.h" #include "ui_QmitkPointSetInteractionViewControls.h" #include #include #include #include #include #include #include #include +const std::string QmitkPointSetInteractionView::VIEW_ID = "org.mitk.views.pointsetinteraction"; + QmitkPointSetInteractionView::QmitkPointSetInteractionView( QObject* /*parent*/ ) : m_Controls(0) { } QmitkPointSetInteractionView::~QmitkPointSetInteractionView() { } void QmitkPointSetInteractionView::CreateQtPartControl( QWidget *parent ) { m_Controls = new Ui::QmitkPointSetInteractionControls; m_Controls->setupUi(parent); m_Controls->m_PbAddPointSet->connect( m_Controls->m_PbAddPointSet, SIGNAL( clicked() ) , this, SLOT( OnAddPointSetClicked() ) ); } -void QmitkPointSetInteractionView::Activated() -{ - // emulate datamanager selection - std::vector selection = this->GetDataManagerSelection(); - this->OnSelectionChanged( selection ); -} - -void QmitkPointSetInteractionView::Deactivated() +void QmitkPointSetInteractionView::SetFocus() { - // emulate empty selection - std::vector selection; - this->OnSelectionChanged( selection ); - m_Controls->m_PointListWidget->DeactivateInteractor(true); + m_Controls->m_PbAddPointSet->setFocus(); } void QmitkPointSetInteractionView::OnAddPointSetClicked() { //Ask for the name of the point set bool ok = false; QString name = QInputDialog::getText( QApplication::activeWindow() , tr("Add point set..."), tr("Enter name for the new point set"), QLineEdit::Normal, tr("PointSet"), &ok ); if ( ! ok || name.isEmpty() ) return; // //Create a new empty pointset // mitk::PointSet::Pointer pointSet = mitk::PointSet::New(); // // Create a new data tree node // mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New(); // // fill the data tree node with the appropriate information // pointSetNode->SetData( pointSet ); pointSetNode->SetProperty( "name", mitk::StringProperty::New( name.toStdString() ) ); pointSetNode->SetProperty( "opacity", mitk::FloatProperty::New( 1 ) ); pointSetNode->SetColor( 1.0, 1.0, 0.0 ); // // add the node to the ds // - this->GetDefaultDataStorage()->Add(pointSetNode); + this->GetDataStorage()->Add(pointSetNode); // make new selection and emulate selection for this - std::vector selection; - selection.push_back( pointSetNode ); - this->FireNodesSelected( selection ); - this->OnSelectionChanged( selection ); + berry::IWorkbenchPart::Pointer nullPart; + QList selection; + selection.push_back(pointSetNode); + this->OnSelectionChanged(nullPart, selection); } -void QmitkPointSetInteractionView::OnSelectionChanged(std::vector nodes) +void QmitkPointSetInteractionView::OnSelectionChanged(berry::IWorkbenchPart::Pointer, const QList& nodes) { - mitk::DataNode* selectedNode = 0; - if(nodes.size() > 0) + mitk::DataNode::Pointer selectedNode; + + if(!nodes.empty()) selectedNode = nodes.front(); - mitk::PointSet* pointSet = 0; - if(selectedNode) - pointSet = dynamic_cast ( selectedNode->GetData() ); + mitk::PointSet::Pointer pointSet; + + if(selectedNode.IsNotNull()) + pointSet = dynamic_cast(selectedNode->GetData()); - if (pointSet) + if (pointSet.IsNotNull()) { m_SelectedPointSetNode = selectedNode; m_Controls->m_CurrentPointSetLabel->setText(QString::fromStdString(selectedNode->GetName())); m_Controls->m_PointListWidget->SetPointSetNode(selectedNode); } else { m_Controls->m_CurrentPointSetLabel->setText(tr("None")); m_Controls->m_PointListWidget->SetPointSetNode(nullptr); - std::vector emptyList; - emptyList.push_back(nullptr); - this->FireNodesSelected( emptyList ); } - -} - -bool QmitkPointSetInteractionView::IsExclusiveFunctionality() const -{ - return true; } void QmitkPointSetInteractionView::NodeChanged( const mitk::DataNode* node ) { if(node == m_SelectedPointSetNode && m_Controls->m_CurrentPointSetLabel->text().toStdString() != node->GetName()) { m_Controls->m_CurrentPointSetLabel->setText(QString::fromStdString(node->GetName())); } } -void QmitkPointSetInteractionView::StdMultiWidgetAvailable( QmitkStdMultiWidget& stdMultiWidget ) +void QmitkPointSetInteractionView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { - if(m_Controls) - m_Controls->m_PointListWidget->SetMultiWidget( &stdMultiWidget ); + if(m_Controls) + { + m_Controls->m_PointListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); + m_Controls->m_PointListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); + m_Controls->m_PointListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); + } } -void QmitkPointSetInteractionView::StdMultiWidgetClosed( QmitkStdMultiWidget& /*stdMultiWidget*/ ) +void QmitkPointSetInteractionView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) { - if(m_Controls) - m_Controls->m_PointListWidget->SetMultiWidget( 0 ); + if(m_Controls) + { + m_Controls->m_PointListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); + m_Controls->m_PointListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); + m_Controls->m_PointListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); + } } diff --git a/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.h b/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.h index b98bfba683..e6b0fc143d 100755 --- a/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.h +++ b/Plugins/org.mitk.gui.qt.pointsetinteraction/src/internal/QmitkPointSetInteractionView.h @@ -1,56 +1,63 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #if !defined(QmitkPointSetInteraction_H__INCLUDED) #define QmitkPointSetInteraction_H__INCLUDED #include -#include +#include +#include +#include #include #include namespace Ui { class QmitkPointSetInteractionControls; }; /*! \brief QmitkPointSetInteractionView */ -class QmitkPointSetInteractionView : public QmitkFunctionality +class QmitkPointSetInteractionView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { Q_OBJECT public: + static const std::string VIEW_ID; + QmitkPointSetInteractionView(QObject *parent=0); virtual ~QmitkPointSetInteractionView(); virtual void CreateQtPartControl(QWidget *parent) override; - void OnSelectionChanged(std::vector nodes) override; - void Activated() override; - void Deactivated() override; - void NodeChanged(const mitk::DataNode* node) override; - bool IsExclusiveFunctionality() const override; - virtual void StdMultiWidgetAvailable(QmitkStdMultiWidget& stdMultiWidget) override; - virtual void StdMultiWidgetClosed(QmitkStdMultiWidget& stdMultiWidget) override; + + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + virtual void NodeChanged(const mitk::DataNode* node) override; + virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; + virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; protected slots: void OnAddPointSetClicked(); protected: Ui::QmitkPointSetInteractionControls * m_Controls; mitk::WeakPointer m_SelectedPointSetNode; }; #endif // !defined(QmitkPointSetInteraction_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h index d1f2f2eaf9..424843b71c 100644 --- a/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h +++ b/Plugins/org.mitk.gui.qt.properties/src/internal/QmitkPropertyTreeView.h @@ -1,87 +1,87 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkPropertyTreeView_h #define QmitkPropertyTreeView_h #include #include #include #include class QmitkPropertyItemDelegate; class QmitkPropertyItemModel; class QmitkPropertyItemSortFilterProxyModel; namespace mitk { class IPropertyAliases; class IPropertyDescriptions; class IPropertyPersistence; } class QmitkPropertyTreeView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { Q_OBJECT public: static const std::string VIEW_ID; berryObjectMacro(QmitkPropertyTreeView); QmitkPropertyTreeView(); ~QmitkPropertyTreeView(); void SetFocus() override; void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; void RenderWindowPartDeactivated(mitk::IRenderWindowPart*) override; protected: void CreateQtPartControl(QWidget* parent) override; private: QString GetPropertyNameOrAlias(const QModelIndex& index); void OnPreferencesChanged(const berry::IBerryPreferences* preferences) override; void OnPropertyNameChanged(const itk::EventObject& event); - void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; private slots: void OnCurrentRowChanged(const QModelIndex& current, const QModelIndex& previous); void OnPropertyListChanged(int index); void OnAddNewProperty(); void OnFilterTextChanged(const QString& filter); void OnModelReset(); private: QWidget* m_Parent; unsigned long m_PropertyNameChangedTag; std::string m_SelectionClassName; mitk::IPropertyAliases* m_PropertyAliases; mitk::IPropertyDescriptions* m_PropertyDescriptions; mitk::IPropertyPersistence* m_PropertyPersistence; bool m_ShowAliasesInDescription; bool m_ShowPersistenceInDescription; bool m_DeveloperMode; Ui::QmitkPropertyTreeView m_Controls; QmitkPropertyItemSortFilterProxyModel* m_ProxyModel; QmitkPropertyItemModel* m_Model; QmitkPropertyItemDelegate* m_Delegate; mitk::DataNode::Pointer m_SelectedNode; mitk::BaseRenderer* m_Renderer; }; #endif diff --git a/Plugins/org.mitk.gui.qt.registration/CMakeLists.txt b/Plugins/org.mitk.gui.qt.registration/CMakeLists.txt deleted file mode 100644 index d56d16ddb5..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# The project name must correspond to the directory name of your plug-in -# and must not contain periods. -project(org_mitk_gui_qt_registration) - -mitk_create_plugin( - EXPORT_DIRECTIVE REGISTRATION_EXPORT - EXPORTED_INCLUDE_SUFFIXES src - MODULE_DEPENDS MitkQtWidgetsExt MitkMapperExt MitkDeformableRegistration MitkDeformableRegistrationUI MitkRigidRegistration MitkRigidRegistrationUI MitkSegmentation -) - diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkDeformableRegistrationUserManual.dox b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkDeformableRegistrationUserManual.dox deleted file mode 100644 index 1a003a5838..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkDeformableRegistrationUserManual.dox +++ /dev/null @@ -1,52 +0,0 @@ -/** -\page org_mitk_views_deformableregistration The Deformable Image Registration View - -Available sections: - - \ref DeformableRegistrationUserManualOverview - - \ref DeformableRegistrationUserManualDetails - -\section DeformableRegistrationUserManualOverview Overview - -This view allows you to register 2D as well as 3D images in a deformable manner. Register means to align two images, so that they become as similar as -possible. Registration results will directly be applied to the Moving Image. - -\imageMacro{QmitkRegistration_DeformableRegistration_small.png,"MITK with the DeformableRegistration view",16.00} - -This document will tell you how to use this view, but it is assumed that you already know how to navigate through the slices of an image using the -multi-widget. - -\section DeformableRegistrationUserManualDetails Details - -First of all you have to open the data sets which you want to register and select them in the Data Manager. You have to select exactly 2 images for registration. The image which was selected -first will become the fixed image, the other one the moving image. The two selected images will remain for registration until exactly two images were selected in the Data Manager again. While -there aren't two images for registration a message is viewed on top of the view saying that registration needs two images. If two images are selected the message disappears and the interaction -areas for the fixed and moving data appears. On default only the fixed and moving image are shown in the render windows. If you want to have other images visible you have to set the visibility -via the Data Manager. Also if you want to perform a reinit on a specific node or a global reinit for all nodes you have to use the Data Manager. - -\imageMacro{QmitkRegistration_ImageSelectionDeformable.png,"The Image area",7.56} - -The upper area is the "Image" area, where the selected images are shown. It is used for changing the colour of the images between grey values and red/green as well as for changing the opacity of the moving image. -To do so, just use the "Moving Image Opacity:" slider. In the "Show Images Red/Green" you can switch the color from both datasets. If you check the box, the fixed dataset will be displayed in redvalues and the -moving dataset in greenvalues to improve visibility of differences in the datasets. If you uncheck the "Show Images Red/Green" checkbox, -both datasets will be displayed in greyvalues. - -\imageMacro{QmitkRegistration_RegistrationDeformable.png,"The Registration area for Demons based registration",7.56} - -In the "Registration" area you have the choice between different Demonsbased deformable registration algorithms. There are available: - -\li Demons Registration - -\li Symmetric Forces Demons Registration - -For both methods you have to define the same set of parameters. First you have to decide whether you want to perform a histogram matching. This can be done by selecting "Use Histogram Matching". -When it is selected the corresponding parameters are enabled and have to be set. These are the "Number of Histogram Levels", "Number of Match Points" and whether to use a "Threshold at Mean -Intensity". - -For the registration method itself you have to specify the "Number of Iterations" and the "Standard Deviation" within the "Demons Registration" area. - -If all this is done, you can perform the registration by clicking the "Calculate Transformation" button. Finally, you will be asked where you want the result image and the resulting deformation field -to be saved. Therefore you have to select the folder and enter a filename. - -The results will be added in the DataStorage and can be saved in the Data Manager. - -*/ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkPointBasedRegistrationUserManual.dox b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkPointBasedRegistrationUserManual.dox deleted file mode 100644 index 7994e52355..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkPointBasedRegistrationUserManual.dox +++ /dev/null @@ -1,106 +0,0 @@ -/** -\page org_mitk_views_pointbasedregistration The Point Based Registration View - -\imageMacro{QmitkRegistration_PointBasedIcon.png,"Icon of the Point Based Registration View",2.00} - -Available sections: - - \ref PointBasedRegistrationUserManualOverview - - \ref PointBasedRegistrationUserManualDetails - -\section PointBasedRegistrationUserManualOverview Overview - -This view allows you to register two datasets in a rigid and deformable manner via corresponding -PointSets. Register means to align two datasets, so that they become as similar as possible. -Therefore you have to set corresponding points in both datasets, which will be matched. The movement, which has to be -performed on the points to align them, will be performed on the moving data as well. The result is shown in the multi-widget. - -\imageMacro{QmitkRegistration_PointBasedRegistration_small.png,"MITK with the PointBasedRegistration view",16.00} - -This document will tell you how to use this view, but it is assumed that you already know how to navigate through -the slices of a dataset using the multi-widget. - -\section PointBasedRegistrationUserManualDetails Details - -First of all you have to open the data sets which you want to register and select them in the Data Manager. You have to select exactly 2 images for registration. The image which was selected -first will become the fixed image, the other one the moving image. The two selected images will remain for registration until exactly two images were selected in the Data Manager again. While -there aren't two images for registration a message is viewed on top of the view saying that registration needs two images. If two images are selected the message disappears and the interaction -areas for the fixed and moving data appears. The upper area is for interaction with the fixed data. Beneath this area is the interaction area for the moving data. On default only the fixed and -moving image with their corresponding pointsets are shown in the render windows. If you want to have other images visible you have to set the visibility via the Data Manager. Also if you want to -perform a reinit on a specific node or a global reinit for all nodes you have to use the Data Manager. - -\imageMacro{QmitkRegistration_FixedDataPointBased.png,"The Fixed Data area",7.43} - -The "Fixed Data" area contains a QmitkPointListWidget. Within this widget, all points for the fixed data are listed. The label above this list shows the number of points that are already set. -To set points you have to toggle the "Set Points" button, the leftmost under the QmitkPointListWidget. The views in the QmitkStdMultiWidget were reinitialized to the fixed data. Points can -be defined by performing a left click while holding the "Shift"-key pressed in the QmitkStdMultiWidget. You can remove the interactor which listens for left clicks while -holding the "Shift"-key pressed by detoggle the "Set Points" button. The next button, "Clear Point Set", is for deleting all specified points from this dataset. The user is prompted to confirm -the decision. With the most right button, a previously saved point set can be loaded and all of its points are shown in the QmitkPointListWidget and in the QmitkStdMultiWidget. The user is prompted -to select the file to be loaded. The file extension is ".mps". On the left of this button is the save button. With this function all points specified for this dataset and shown in the -QmitkPointListWidget are saved to harddisk. The user is prompted to select a filename. Pointsets were saved in XML fileformat but have to have a ".mps" file extension. You can select landmarks -in the render window with a left mouse button click on them. If you keep the mouse button pressed you can move the landmark to an other position by moving the mouse and then release the mouse -button. With the delete key you can remove the selected landmarks. You can also select landmarks by a double click on a landmark within the QmitkPointListWidget. Using the "Up-Arrow"-button or -the "F2" key you can easily move a landmark upwards and bring it further downwards by pressing "F3" or using the "Down-Arrow"-button. Thus the landmark number can be changed. -The QmitkStdMultiWidget changes its view to show the position of the landmark. - -\imageMacro{QmitkRegistration_MovingDataPointBased.png,"The Moving Data area",7.45} - -The "Moving Data" area contains a QmitkPointListWidget. Within this widget, all points for the moving data are listed. The label above this list shows the number of points that are already set. -To set points you have to toggle the "Set Points" button, the leftmost under the QmitkPointListWidget. The views in the QmitkStdMultiWidget were reinitialized to the moving data. With the -"Opacity:" slider you can change the opacity of the moving dataset. If the slider is leftmost the moving dataset is totally transparent, whereas if it is rightmost the moving dataset is totally -opaque. Points can be defined by performing a left click while holding the "Shift"-key pressed in the QmitkStdMultiWidget. You can remove the interactor which listens for left -mousebutton click while holding the "Shift"-key pressed by detoggle the "Set Points" button. The next button, "Clear Point Set", is for deleting all specified points from this dataset. The user -is prompted to confirm the decision. With the button on your right hand side, a previously saved point set can be loaded and all of its points are shown in the QmitkPointListWidget and in the QmitkStdMultiWidget. -The user is prompted to select the file to be loaded. The file extension is ".mps". On the left of this button is the save button. With this function all points specified for this dataset and -shown in the QmitkPointListWidget are saved to harddisk. The user is prompted to select a filename. Pointsets were saved in XML fileformat but have to have a ".mps" file extension. You can -select landmarks in the render window with a left click on them. If you keep the mouse button pressed you can move the landmark to an other position by moving the mouse and then -release the mouse button. With the delete key you can remove the selected landmarks. You can also select landmarks by a double click on a landmark within the QmitkPointListWidget. Using the "Up-Arrow"-button or -the "F2" key you can easily move a landmark upwards and bring it further downwards by pressing "F3" or using the "Down-Arrow"-button. Thus the landmark number can be changed.The QmitkStdMultiWidget changes its view to show the position of the -landmark. - -\imageMacro{QmitkRegistration_DisplayOptionsPointBased.png,"The Display Options area",7.49} - -In this area you can find the "Show Images Red/Green" checkbox. Here you can switch the color from both datasets. If you check the box, the fixed dataset will be -displayed in redvalues and the moving dataset in greenvalues to improve visibility of differences in the datasets. If you uncheck the "Show Images Red/Green" checkbox, both datasets will be -displayed in greyvalues. - -Before you perform your transformation it is useful to see both images again. Therefore detoggle the "Set Points" button for the fixed data as well as for the moving data. - -\imageMacro{QmitkRegistration_RegistrationPointBased.png,"The Registration area",7.45} - -The functions concerning the registration are displayed in the "Registration" area. It not only contains the registration method selection and the registration itself but also offers the possibility -to save, undo or redo the results. Furthermore a display is implemented, which shows you how good the landmarks correspond. -Those features will be explained in following paragraphs. - -Using the "Method"-selector, you can pick one of those transformations: Rigid, Similarity, Affine and LandmarkWarping. -Depending on which one you chose, an additional specifier, "Use ICP" can be set, which leads to the following possibilities for registration: - -\li Rigid with ICP means only translation and rotation. The order of your landmarks will not be taken into account. E. g. landmark one in the fixed data can be mapped on landmark three in the moving data. You -have to set at least one landmark in each dataset to enable the Register button which performs the transformation. - -\li Similarity with ICP means only translation, scaling and rotation. The order of your landmarks will not be taken into account. E. g. landmark one in the fixed data can be mapped on landmark three in the -moving data. You have to set at least one landmark in each dataset to enable the Register button which performs the transformation. - -\li Affine with ICP means only translation, scaling, rotation and shearing. The order of your landmarks will not be taken into account. E. g. landmark one in the fixed data can be mapped on landmark three in -the moving data. You have to set at least one landmark in each dataset to enable the Register button which performs the transformation. - -\li Rigid means only translation and rotation. The order of your landmarks will be taken into account. E. g. landmark one in the fixed data will be mapped on landmark one in the moving data. You have to set -at least one landmark and the same number of landmarks in each dataset to enable the Register button which performs the transformation. - -\li Similarity means only translation, scaling and rotation. The order of your landmarks will be taken into account. E. g. landmark one in the fixed data will be mapped on landmark one in the moving data. -You have to set at least one landmark and the same number of landmarks in each dataset to enable the Register button which performs the transformation. - -\li Affine means only translation, scaling, rotation and shearing. The order of your landmarks will be taken into account. E. g. landmark one in the fixed data will be mapped on landmark one in the moving -data. You have to set at least one landmark and the same number of landmarks in each dataset to enable the Register button which performs the transformation. - -\li LandmarkWarping means a freeform deformation of the moving image, so that afterwards the landmarks are exactly aligned. The order of your landmarks will be taken into account. -E. g. landmark one in the fixed data will be mapped on landmark one in the moving data. You have to set at least one landmark and the same number of landmarks in each dataset to enable the -Register button which performs the transformation. - -The root mean squares difference between the landmarks will be displayed as number, so that you can check how good the landmarks correspond. - -The "Undo Transformation" button becomes enabled after performing a transformation and allows you to undo it. After doing this, the "Redo Transformation" button -is enabled and lets you redo, the just undone transformation(no calculation needed) - -Saving of the transformed image can be done via the Data Manager. - -*/ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration.dox b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration.dox deleted file mode 100644 index 64aa225fa7..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration.dox +++ /dev/null @@ -1,14 +0,0 @@ -/** -\page org_mitk_gui_qt_registration The Registration Plugin - -\section RegistrationModuleOverviewPageOverview Overview - -MITK provides several views for the registration of images. - -\section RegistrationModuleOverviewPageList List of Views - - \li \subpage org_mitk_views_deformableregistration - \li \subpage org_mitk_views_pointbasedregistration - \li \subpage org_mitk_views_rigidregistration - -*/ \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_DeformableRegistration_small.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_DeformableRegistration_small.png deleted file mode 100644 index ea3e8dbb5f..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_DeformableRegistration_small.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_DisplayOptionsPointBased.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_DisplayOptionsPointBased.png deleted file mode 100644 index 07e0c65bf9..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_DisplayOptionsPointBased.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_FixedDataPointBased.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_FixedDataPointBased.png deleted file mode 100644 index 401c62184f..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_FixedDataPointBased.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ImageArea.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ImageArea.png deleted file mode 100644 index e075e83e04..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ImageArea.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ImageSelectionDeformable.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ImageSelectionDeformable.png deleted file mode 100644 index 383b42d464..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ImageSelectionDeformable.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ManualRegistrationArea.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ManualRegistrationArea.png deleted file mode 100644 index 38107899a4..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_ManualRegistrationArea.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_MovingDataPointBased.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_MovingDataPointBased.png deleted file mode 100644 index 9a7c3dd9fa..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_MovingDataPointBased.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_PointBasedIcon.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_PointBasedIcon.png deleted file mode 100644 index 77fde33ffe..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_PointBasedIcon.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_PointBasedRegistration_small.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_PointBasedRegistration_small.png deleted file mode 100644 index 4e2fe1ca54..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_PointBasedRegistration_small.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationArea.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationArea.png deleted file mode 100644 index a56b9c8451..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationArea.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationDeformable.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationDeformable.png deleted file mode 100644 index 4e73be35ff..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationDeformable.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationPointBased.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationPointBased.png deleted file mode 100644 index 685e72ded0..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RegistrationPointBased.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RigidRegistrationIcon.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RigidRegistrationIcon.png deleted file mode 100644 index d45691689d..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RigidRegistrationIcon.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RigidRegistration_small.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RigidRegistration_small.png deleted file mode 100644 index 08a933d8d1..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_RigidRegistration_small.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_Tab2.png b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_Tab2.png deleted file mode 100644 index 0a47768c66..0000000000 Binary files a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRegistration_Tab2.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRigidRegistrationUserManual.dox b/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRigidRegistrationUserManual.dox deleted file mode 100644 index 85749f9f63..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/documentation/UserManual/QmitkRigidRegistrationUserManual.dox +++ /dev/null @@ -1,214 +0,0 @@ -/** -\page org_mitk_views_rigidregistration The Rigid Registration View - -\imageMacro{QmitkRegistration_RigidRegistrationIcon.png,"Icon of the View",2.00} - -Available sections: - - \ref QmitkRigidRegistrationUserManualOverview - - \ref QmitkRigidRegistrationUserManualIssues - - \ref QmitkRigidRegistrationUserManualDetails - - \ref QmitkRigidRegistrationUserManualReferences - -\section QmitkRigidRegistrationUserManualOverview Overview - -This view allows you to register 2D as well as 3D images in a rigid manner. If the Moving Image is an image with multiple timesteps you can select one timestep for registration. -Register means to align two images, so that they become as similar as possible. Therefore you can select from different transforms, metrics and optimizers. Registration results will -directly be applied to the Moving Image. Also binary images as image masks can be used to restrict the metric evaluation only to the masked area. - -\imageMacro{QmitkRegistration_RigidRegistration_small.png,"MITK with the QmitkRigidRegistration view",16.00} - -This document will tell you how to use this view, but it is assumed that you already know how to navigate through the slices of an image using the -multi-widget. - -\section QmitkRigidRegistrationUserManualIssues Known Issues - -Depending on your system the registration can fail to allocate memory for calculating the gradient image for registration. In this case you can try to select another optimizer which is not based -on a gradient image and uncheck the checkbox for "Compute Gradient". - -\section QmitkRigidRegistrationUserManualDetails Details - -First of all you have to open the data sets which you want to register and select them in the Data Manager. You have to select exactly 2 images for registration. The image which was selected -first will become the fixed image, the other one the moving image. The two selected images will remain for registration until exactly two images were selected in the Data Manager again. - -\imageMacro{QmitkRegistration_ImageArea.png,"The Image area",7.34} - -While there aren't two images for registration a message is viewed on top of the view saying that registration needs two images. If two images are selected the message disappears and the -interaction areas for the fixed and moving data appears. If both selected images have a binary image as childnode a selection box appears which allows, when checked, to use the binary images as -image mask to restrict the registration on this certain area. If an image has more than one binary image as child, the upper one from the DataManager list is used. If the Moving Image is a -dynamic images with several timesteps a slider appears to select a specific timestep for registration. - -On default only the fixed and moving image are shown in the render windows. If you want to have other images visible you have to set the visibility -via the Data Manager. Also if you want to perform a reinit on a specific node or a global reinit for all nodes you have to use the Data Manager. - -The colour of the images can be changed between grey values and red/green and the opacity of the moving image can be changed. -With the "Moving Image Opacity:" slider you can change the opacity of the moving dataset. In the "Show Images Red/Green" you can switch the color from both datasets. If you check the box, -the fixed dataset will be displayed in red-values and the moving dataset in green-values to improve visibility of differences in the datasets. If you uncheck the "Show Images Red/Green" checkbox, -both datasets will be displayed in grey-values. - -\imageMacro{QmitkRegistration_RegistrationArea.png,"The Registration area",7.49} - -In the "Register" area you can start the registration by clicking the "Calculate Transform" button. The optimizer value for every iteration step is diplayed as LCD number next to the -"Optimizer Value:" label. Many of the registration methods can be canceled during their iteration steps by clicking the "Stop Optimization" button. During the calculation, a progress bar -indicates the progress of the registration process. The render widgets are updated for every single iteration step, so that the user has the chance to supervise how good the registration -process works with the selected methods and parameters. If the registration process does not lead to a sufficient result, it is possible to undo the transformation and restart the registration -process with some changes in parameters. The differences in transformation due to the changed parameters can be seen in every iteration step and help the user understand the parameters. -Also the optimizer value is updated for every single iteration step and shown in the GUI. The optimizer value is an indicator for the misalignment between the two images. The real time -visualization of the registration as well as the optimizer value provides the user with information to trace the improvement through the optimization process. -The "Undo Transformation" button becomes enabled when you have performed an transformation and you can undo the performed transformations. The "Redo Transformation" button becomes enabled when -you have performed an undo to redo the transformation without to recalculate it. - -\imageMacro{QmitkRegistration_ManualRegistrationArea.png,"The Manual Registration area",5.95} - -In the "Manual Registration" area, shown by checking the checkbox Manual Registration, you can manually allign the images by moving sliders for translation and scaling in x-, y- and z-axis as -well as for rotation around the x-, y- and z-Axis. Additionally you can automatically allign the image centers with the button "Automatic Allign Image Centers". - -\imageMacro{QmitkRegistration_Tab2.png,"The Advanced Mode tab",7.54} - -In the "Advanced Mode" tab you can choose a transform, a metric, an optimizer and an interpolator and you have to set the corresponding parameters to specify the registration -method you want to perform. With the topmost button you can also load testpresets. These presets contain all parametersets which were saved using the "Save as Testpreset" button. The "Save as -Preset" button makes the preset available from the "Automatic Registration" tab. This button should be used when a preset is not intended for finding good parameters anymore but can be used as -standard preset. - -To show the current transform and its parameters for the registration process, the Transform checkbox has to be checked. Currently, the following transforms are implemented -(for detailed information see [1] and [2]): - -\li Translation: Transformation by a simple translation for every dimension. - -\li Scale: Transformation by a certain scale factor for each dimension. - -\li ScaleLogarithmic: Transformation by a certain scale factor for each dimension. The parameter factors are passed as logarithms. - -\li Affine: Represents an affine transform composed of rotation, scaling, shearing and translation. - -\li FixedCenterOfRotationAffine: Represents an affine transform composed of rotation around a user provided center, scaling, shearing and translation. - -\li Rigid3D: Represents a 3D rotation followed by a 3D translation. - -\li Euler3D: Represents a rigid rotation in 3D space. That is, a rotation followed by a 3D translation. - -\li CenteredEuler3D: Represents a rigid rotation in 3D space around a user provided center. That is, a rotation followed by a 3D translation. - -\li QuaternionRigid: Represents a 3D rotation and a 3D translation. The rotation is specified as a quaternion. - -\li Versor: Represents a 3D rotation. The rotation is specified by a versor or unit quaternion. - -\li VersorRigid3D: Represents a 3D rotation and a 3D translation. The rotation is specified by a versor or unit quaternion. - -\li ScaleSkewVersor3D: Represents a 3D translation, scaling, shearing and rotation. The rotation is specified by a versor or unit quaternion. - -\li Similarity3D: Represents a 3D rotation, a 3D translation and homogeneous scaling. - -\li Rigid2D: Represents a 2D rotation followed by a 2D translation. - -\li CenteredRigid2D: Represents a 2D rotation around a user provided center followed by a 2D translation. - -\li Euler2D: Represents a 2D rotation and a 2D translation. - -\li Similarity2D: Represents a 2D rotation, homogeneous scaling and a 2D translation. - -\li CenteredSimilarity2D: Represents a 2D rotation around a user provided center, homogeneous scaling and a 2D translation. - -The desired transform can be chosen from a combo box. All parameters defining the selected transform have to be specified within the line edits and checkboxes underneath the transform combo box. -To show the current metric and its parameters for the registration process, the Metric checkbox has to be checked. Currently, the following metrics are implemented -(for detailed information see [1] and [2]): - -\li MeanSquares: Computes the mean squared pixel-wise difference in intensity between image A and B. - -\li NormalizedCorrelation: Computes pixel-wise cross correlation and normalizes it by the square root of the autocorrelation of the images. - -\li GradientDifference: Evaluates the difference in the derivatives of the moving and fixed images. - -\li KullbackLeiblerCompareHistogram[3]: Measures the relative entropy between two discrete probability distributions. - -\li CorrelationCoefficientHistogram: Computes the cross correlation coefficient between the intensities. - -\li MeanSquaresHistogram: The joint histogram of the fixed and the mapped moving image is built first. Then the mean squared pixel-wise difference in intensity between image A and B is -calculated. - -\li MutualInformationHistogram: Computes the mutual information between image A and image B. - -\li NormalizedMutualInformationHistogram: Computes the mutual information between image A and image B. - -\li MattesMutualInformation[4, 5]: The method of Mattes et al. is used to compute the mutual information between two images to be registered. - -\li MeanReciprocalSquareDifference: Computes pixel-wise differences and adds them after passing them through a bell-shaped function 1 / (1+x^2). - -\li MutualInformation[6]: Computes the mutual information between image A and image B. - -\li MatchCardinality: Computes cardinality of the set of pixels that match exactly between the moving and fixed images. - -\li KappaStatistic[7]: Computes spatial intersection of two binary images. - -The desired metric can be chosen from a combo box. All parameters defining the selected metric have to be specified within the line edits and checkboxes underneath the metric combo box. -To show the current optimizer and its parameters for the registration process, the Optimizer checkbox has to be checked. Currently, the following optimizers are implemented -(for detailed information see [1] and [2]): - -\li Exhaustive: Fully samples a grid on the parametric space. - -\li GradientDescent: A simple gradient descent optimizer. - -\li QuaternionRigidTransformGradientDescent: Variant of a gradient descent optimizer. - -\li LBFGSB[8, 9]: Limited memory Broyden Fletcher Goldfarb Shannon minimization with simple bounds. - -\li OnePlusOneEvolutionary[10]: 1+1 evolutionary strategy. - -\li Powell: Implements Powell optimization using Brent line search. - -\li FRPR: Fletch-Reeves & Polak-Ribiere optimization using dBrent line search. - -\li RegularStepGradientDescent: Variant of a gradient descent optimizer. - -\li VersorTransform: Variant of a gradient descent optimizer. - -\li Amoeba: Implementation of the Nelder-Meade downhill simplex algorithm. - -\li ConjugateGradient: Used to solve unconstrained optimization problems. - -\li LBFGS: Limited memory Broyden Fletcher Goldfarb Shannon minimization. - -\li SPSA[11]: Based on simultaneous perturbation. - -\li VersorRigid3DTransform: Variant of a gradient descent optimizer for the VersorRigid3DTransform parameter space. - -The desired optimizer can be chosen from a combo box. All parameters defining the selected optimizer have to be specified within the line edits and checkboxes underneath the optimizer combo box. -To show the current interpolator for the registration process, just check the Interpolator checkbox. Currently, the following interpolators are implemented -(for detailed information see [1] and [2]): - -\li Linear: Intensity varies linearly between grid positions. - -\li NearestNeighbor: Uses the intensity of the nearest grid position. - -You can show and hide the parameters for the selection by checking or unchecking the corresponding area. You can save the current sets of parameters with the "Save as Testpreset" or "Save as -Preset" buttons. - -\section QmitkRigidRegistrationUserManualReferences References: - -1. L. Ibanez, W. Schroeder and K. Ng, The ITK Software Guide, Kitware Inc, New York, 2005. - -2. http://www.itk.org/Doxygen/ - -3. Albert C.S. Chung, William M. Wells III, Alexander Norbash, and W. Eric L. Grimson, Multi-modal Image Registration by Minimising Kullback-Leibler Distance, In Medical Image Computing and -Computer-Assisted Intervention - MICCAI 2002, LNCS 2489, pp. 525 - 532. - -4. D. Mattes, D. R. Haynor, H. Vesselle, T. Lewellen and W. Eubank, "Nonrigid multimodality image registration", Medical Imaging 2001: Image Processing, 2001, pp. 1609-1620. - -5. D. Mattes, D. R. Haynor, H. Vesselle, T. Lewellen and W. Eubank, "PET-CT Image Registration in the Chest Using Free-form Deformations", IEEE Transactions in Medical Imaging. -Vol.22, No.1, January 2003, pp.120-128. - -6. Viola, P. and Wells III, W. (1997). "Alignment by Maximization of Mutual Information" International Journal of Computer Vision, 24(2):137-154. - -7. AP Zijdenbos, BM Dawant, RA Margolin , AC Palmer, Morphometric analysis of white matter lesions in MR images: Method and validation, IEEE Transactions on Medical Imaging, -13(4):716-724, Dec. 1994. - -8. R. H. Byrd, P. Lu and J. Nocedal. A Limited Memory Algorithm for Bound Constrained Optimization, (1995), SIAM Journal on Scientific and Statistical Computing , 16, 5, pp. 1190-1208. - -9. C. Zhu, R. H. Byrd and J. Nocedal. L-BFGS-B: Algorithm 778: L-BFGS-B, FORTRAN routines for large scale bound constrained optimization (1997), ACM Transactions on Mathematical Software, -Vol 23, Num. 4, pp. 550 - 560. - -10. Martin Styner, G. Gerig, Christian Brechbuehler, Gabor Szekely, "Parametric estimate of intensity inhomogeneities applied to MRI", IEEE TRANSACTIONS ON MEDICAL IMAGING; 19(3), pp. 153-165, - 2000. - -11. Spall, J.C. (1998), "An Overview of the Simultaneous Perturbation Method for Efficient Optimization," Johns Hopkins APL Technical Digest, vol. 19, pp. 482-492. - -*/ diff --git a/Plugins/org.mitk.gui.qt.registration/files.cmake b/Plugins/org.mitk.gui.qt.registration/files.cmake deleted file mode 100644 index 17c6d8776b..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/files.cmake +++ /dev/null @@ -1,76 +0,0 @@ -set(SRC_CPP_FILES - -) - -set(INTERNAL_CPP_FILES - mitkPluginActivator.cpp - #DeformableRegistration - QmitkDeformableRegistrationView.cpp - # PointBasedRegistration - QmitkPointBasedRegistrationView.cpp - mitkLandmarkWarping.cpp - # RigidRegistration - QmitkRigidRegistrationView.cpp - QmitkLoadPresetDialog.cpp - QmitkRigidRegistrationSelectorView.cpp - -) - -set(UI_FILES - #DeformableRegistration - src/internal/QmitkDeformableRegistrationViewControls.ui - # PointBasedRegistration - src/internal/QmitkPointBasedRegistrationViewControls.ui - # RigidRegistration - src/internal/QmitkRigidRegistrationViewControls.ui - src/internal/QmitkRigidRegistrationSelector.ui -) - -set(MOC_H_FILES - src/internal/mitkPluginActivator.h - #DeformableRegistration - src/internal/QmitkDeformableRegistrationView.h - # PointBasedRegistration - src/internal/QmitkPointBasedRegistrationView.h - # RigidRegistration - src/internal/QmitkRigidRegistrationView.h - src/internal/QmitkLoadPresetDialog.h - src/internal/QmitkRigidRegistrationSelectorView.h - -) - -set(CACHED_RESOURCE_FILES -# list of resource files which can be used by the plug-in -# system without loading the plug-ins shared library, -# for example the icon used in the menu and tabs for the -# plug-in views in the workbench - plugin.xml - #DeformableRegistration - resources/DeformableRegistration.xpm - # PointBasedRegistration - resources/PointBasedRegistration.xpm - # RigidRegistration - resources/RigidRegistration.xpm -) - -set(QRC_FILES - #DeformableRegistration - resources/QmitkDeformableRegistrationView.qrc - # PointBasedRegistration - resources/QmitkPointBasedRegistrationView.qrc - # RigidRegistration - resources/QmitkRigidRegistrationView.qrc -) - -set(CPP_FILES - -) - -foreach(file ${SRC_CPP_FILES}) - set(CPP_FILES ${CPP_FILES} src/${file}) -endforeach(file ${SRC_CPP_FILES}) - -foreach(file ${INTERNAL_CPP_FILES}) - set(CPP_FILES ${CPP_FILES} src/internal/${file}) -endforeach(file ${INTERNAL_CPP_FILES}) - diff --git a/Plugins/org.mitk.gui.qt.registration/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.registration/manifest_headers.cmake deleted file mode 100644 index f58edb1651..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/manifest_headers.cmake +++ /dev/null @@ -1,5 +0,0 @@ -set(Plugin-Name "MITK Registration") -set(Plugin-Version "1.0") -set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") -set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy) diff --git a/Plugins/org.mitk.gui.qt.registration/plugin.xml b/Plugins/org.mitk.gui.qt.registration/plugin.xml deleted file mode 100644 index 1dd055d5a7..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/plugin.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Register two images using user-defined points registration - - - - - - - - Register two images using a rigid registration - - - - - - - - - - - - - - - - - diff --git a/Plugins/org.mitk.gui.qt.registration/resources/DeformableRegistration.xpm b/Plugins/org.mitk.gui.qt.registration/resources/DeformableRegistration.xpm deleted file mode 100644 index 3e2096b010..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/resources/DeformableRegistration.xpm +++ /dev/null @@ -1,235 +0,0 @@ -/* XPM */ -static char *DeformableRegistration___[] = { -/* columns rows colors chars-per-pixel */ -"48 48 181 2", -" c #735C62", -". c #57666F", -"X c #577076", -"o c #587177", -"O c #56747A", -"+ c #5E747B", -"@ c #7E646A", -"# c #63767E", -"$ c #76757B", -"% c #994F60", -"& c #865A6D", -"* c #965061", -"= c #9A5063", -"- c #A04B60", -"; c #A75166", -": c #A75468", -"> c #A9576B", -", c #A35C6D", -"< c #AA5B6F", -"1 c #A95E70", -"2 c #83656C", -"3 c #86686F", -"4 c #856970", -"5 c #85767C", -"6 c #8C7A7F", -"7 c #97757D", -"8 c #9C757F", -"9 c #AE6375", -"0 c #B06577", -"q c #B56B7D", -"w c #4F7781", -"e c #4A7D89", -"r c #5E7C83", -"t c #647B83", -"y c #6C7E86", -"u c #647188", -"i c #747D83", -"p c #737E89", -"a c #957A81", -"s c #997A82", -"d c #3C8FA2", -"f c #3495AD", -"g c #3D9CB4", -"h c #35A1BA", -"j c #438291", -"k c #428999", -"l c #5C8691", -"z c #508C9F", -"x c #5D899D", -"c c #608087", -"v c #6E828A", -"b c #72848C", -"n c #72898F", -"m c #6F8F97", -"M c #6C8F98", -"N c #748791", -"B c #798690", -"V c #768B92", -"C c #7B8C94", -"Z c #7C8E98", -"A c #67909A", -"S c #6E9199", -"D c #73939B", -"F c #7C949B", -"G c #7E999F", -"H c #448FA1", -"J c #4D90A3", -"K c #4496AC", -"L c #469AAF", -"P c #4C9AAD", -"I c #5693A2", -"U c #5C93A4", -"Y c #5997A9", -"T c #539AAB", -"R c #5B9DAE", -"E c #449DB3", -"W c #4F9EB1", -"Q c #549FB2", -"! c #5B9FB1", -"~ c #6296A5", -"^ c #6E97A6", -"/ c #6798A6", -"( c #6D9BA6", -") c #649CAB", -"_ c #6A9DA9", -"` c #7096A2", -"' c #7A96A1", -"] c #759AA3", -"[ c #7C9CA4", -"{ c #729DA8", -"} c #41A0B7", -"| c #4EA1B6", -" . c #47A3B9", -".. c #4DA5BB", -"X. c #57A0B3", -"o. c #5CA5B6", -"O. c #5EA9BB", -"+. c #7DA1A9", -"@. c #62A4B4", -"#. c #6BA1B0", -"$. c #65ABBC", -"%. c #69ACBD", -"&. c #74ADBB", -"*. c #7CAEBB", -"=. c #3AAAC4", -"-. c #50ACC4", -";. c #56B9D1", -":. c #63B1C4", -">. c #6CB2C2", -",. c #79B2C0", -"<. c #71B9CA", -"1. c #7AB9C8", -"2. c #8D858D", -"3. c #9D858B", -"4. c #9F888D", -"5. c #838591", -"6. c #868890", -"7. c #858E98", -"8. c #948B92", -"9. c #9B8B91", -"0. c #82959D", -"q. c #8A949F", -"w. c #81989F", -"e. c #A1838A", -"r. c #A2888E", -"t. c #A58C92", -"y. c #AB8F96", -"u. c #B0999E", -"i. c #829CA2", -"p. c #8A9EA6", -"a. c #A49EA3", -"s. c #AB9EA4", -"d. c #B59EA4", -"f. c #89A0A7", -"g. c #84A4AB", -"h. c #8CA4AA", -"j. c #91A6AE", -"k. c #91A8AF", -"l. c #82A7B0", -"z. c #85A9B2", -"x. c #8DABB2", -"c. c #8AAFB8", -"v. c #93ACB3", -"b. c #83B0BC", -"n. c #8DB0B8", -"m. c #96B1B7", -"M. c #98B0B6", -"N. c #95B2B8", -"B. c #98B2B8", -"V. c #9DB8BF", -"C. c #BAA0A6", -"Z. c #BCA4AA", -"A. c #A3B6BF", -"S. c #A0B9BF", -"D. c #C2ABB0", -"F. c #CAB3B9", -"G. c #84B8C6", -"H. c #82BECC", -"J. c #94BBC4", -"K. c #9CBAC2", -"L. c #94BFCA", -"P. c #A3BDC3", -"I. c #A8BAC2", -"U. c #88C0CE", -"Y. c #93C2CE", -"T. c #9CC4CD", -"R. c #8CC3D1", -"E. c #A6C0C7", -"W. c #A3C3CA", -"Q. c #AEC7CD", -"!. c #AEC9D0", -"~. c #B4CCD2", -"^. c #A6D1DB", -"/. c #B9D3D9", -"(. c #BFD8DF", -"). c #BEE0E7", -"_. c #E0C9CF", -"`. c #C1DBE1", -"'. c #C7E0E6", -"]. c #CEE7ED", -"[. c None", -/* pixels */ -"< 9 9 9 9 9 9 9 : % % % % % * % % > 1 1 1 1 1 1 1 ; , , , , : , , ; [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"0 F.F.F.F.F.F.F.s @ 3.d.d.d.d.d.d.d.s 3.3.e.r.3.3.4., [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"0 F.F.F.F.F.F.F.s @ @ 3.d.d.d.d.d.d.d.s 3.3.4.4.4.4.4., [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"0 F.F.F.F.F.F.F.s @ e.d.d.d.d.d.d.d.s 3.r.4.4.4.4.3.9 [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"0 F.F.F.F.F.F.F.s @ s d.d.d.d.d.d.d.s 3.4.4.4.4.4.4., [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"0 F.F.F.F.F.F.F.s 2 r.d.d.d.d.d.d.d.s 3.3.4.4.4.4.3., [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"0 F.F.F.F.F.F.F.s @ 3.d.d.d.d.d.d.d.s 3.t.4.4.4.4.4.9 [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"0 F.F.F.F.F.F.F.a @ e.d.d.d.d.d.d.d.s 3.4.4.4.4.4.4., [.[.[.[.[.[.[.[.[.[.[.[.[.[.", -"< y.y.y.y.y.y.y.7 2 2 2 2 2 2 2 3 8 e.e.r.e.e.e.3.7 a a a 5.` ~ I U I T T P T P [.[.[.[.[.[.[.[.", -"9 C.C.C.C.C.C.C.s r.r.r.r.r.r.r.3.3 @ @ @ @ @ @ @ a [ @.$.&.b.v.0.F i.i.i.w.i.[ _ Y P L [.[.[.[.", -"q _._._._._._._.3.u.d.d.d.d.d.d.r.2 $ Y $.b.B.B.B.B.B.f.C i.i.f.f.G [ i.i.i.[ E [.[.[.", -"q _._._._._._._.e.u.d.d.d.d.d.d.t.2 i R %.N.N.N.B.B.B.B.B.m.6.G i.w.w.f.G i.i.i.i.L [.[.[.", -"q _._._._._._._.e.u.d.d.d.d.d.d.t.2 $ z Y N.B.B.B.B.B.B.B.M.N.B.q.S i.i.i.+.G i.i.f.[ W [.[.[.", -"q _._._._._._._.s u.d.d.d.d.d.d.t.2 v T F y f.N.B.B.B.B.B.B.B.B.B.h.S i.i.i.w.f.i.i.i.w.T [.[.[.", -"q _._._._._._._.e.u.d.d.d.d.d.d.t.~ R i.i.F b v.M.N.N.B.B.B.B.B.B.B.D D i.i.G G i.G i.i._ I [.[.", -"q _._._._._._._.e.u.d.d.d.d.d.s.R { i.i.i.i.C V B.B.M.M.B.B.B.B.B.B.h.S i.i.f.i.i.f.i.i.f.P [.[.", -"q _._._._._._._.3.u.C.C.d.d.a.X.[ i.i.i.i.i.i.b w.B.B.B.B.B.j.h.f.p.+.A S G G f.G f.G f.w.P [.[.", -"> r.e.r.e.r.e.r.8 7 7 6 8 2.X.[ i.i.i.i.i.i.i.G C h.M.h.0.F F 0.w.7.G [ D +.D M S D G G [ T [.[.", -"9 D.D.D.D.D.D.D.s 3.3.3.8.X.i.i.i.i.i.i.i.i.i.i.p.C F 0.i.i.i.i.i.i.[ G +.Q.Q.S.m.g.D S F R [.[.", -"0 F.F.F.F.F.F.F.s 3.4.4.X.[ i.i.i.i.i.i.i.i.i.p.p.F i.i.i.i.i.i.G f.w.f.] E.Q.Q.Q.Q.Q.N.+.Y I [.", -"0 F.F.F.F.F.F.F.s 3.4.! [ i.i.i.i.i.i.i.i.p.p.f.v.h.0.i.i.i.i.i.f.G i.i.[ v.Q.Q.Q.Q.!.Q.Q.V.| [.", -"0 F.F.F.F.F.F.F.s 3./ ( w.i.i.i.i.i.i.i.p.f.v.B.B.B.0.w.i.i.i.i.i.i.i.i.[ z.Q.Q.Q.Q.Q.Q.Q.Q.O.[.", -"0 F.F.F.F.F.F.F.s G H.h.0.w.w.i.i.i.i.f.h.M.N.B.B.B.h.0.i.i.i.i.i.i.i.i.w.[ Q.Q.Q.Q.Q.Q.Q.Q.$.[.", -"0 F.F.F.F.F.F.F.2.>.Q.Q.S.0.0.w.i.i.h.h.B.M.B.B.B.B.B.0.i.i.i.i.i.i.i.i.i.] V.Q.Q.Q.Q.Q.Q.Q.$.[.", -"0 F.F.F.F.F.F.F.o.Q.Q.Q.Q.Q.f.q.w.0.k.N.B.B.B.B.B.B.N.h.0.i.i.i.i.i.i.i.i.[ x.Q.Q.Q.Q.Q.Q.Q.>.[.", -"1 D.Z.Z.Z.Z.Z.p.U.Q.Q.Q.Q.Q.Q.f.B w.B.M.M.B.B.B.B.B.M.M.0.i.i.i.i.0.i.i.i.i.+.Q.Q.Q.Q.Q.Q.Q.1.[.", -"- 2 2 2 2 3 5 :.Q.Q.~.Q.Q.Q.E.w.S.V f.M.N.B.N.N.M.B.B.M.0.0.0.F w.q.z.g.[ [ _ g.m.E.Q.Q.Q.Q.U.[.", -"- ) T.Q.Q.Q.Q.Q.Q.f.~.].P.# h.B.B.M.M.B.v.p.p.i.i.v.Q.Q.Q.Q.Q.Q.Q.] m S S +.B.Q.Q.Y.) ", -"% i <.Q.Q.Q.Q.Q.Q.j.A.].].].k.# v.M.N.m.C b w.w.i.0.v.Q.Q.Q.Q.Q.Q.Q.g.F i.i.F S g.P.T.o.", -"% ) Q.Q.Q.Q.Q.Q.M.B.].].].].].p.v M.k.v t i.i.i.i.w.p.Q.Q.Q.Q.Q.Q.Q.z.m i.i.i.i.D S g.o.", -"% y H.Q.Q.Q.Q.Q.I.j.].].].].].].].V v # V i.i.i.i.i.i.p.P.Q.Q.Q.Q.Q.Q.x.D i.i.i.i.i.G m E ", -"% ! Q.Q.Q.Q.Q.Q.h.~.].].].].].].].k.. V i.i.i.i.i.i.i.0.k.Q.~.Q.Q.Q.Q.V.S i.i.i.i.i.i.i.P ", -"% r L.Q.Q.Q.Q.Q.M.A.].].].].].].].v.v h.t i.i.i.i.i.i.i.G h.Q.Q.Q.Q.Q.Q.E.D i.i.i.i.i.i.i.P ", -"% J ! #.n.Q.Q.E.j.'.].].].].].].k.v E.Q.v V i.i.i.i.G f.i.w.E.Q.Q.Q.Q.Q.Q.D i.i.i.i.i.i.i.P ", -"% * * * = & u x ) ^ I.].].].].].].A.C Q.Q.Q.S.i i.i.i.i.f.G i.C h.V.B.B.E.Q.Q.+.w.f.G [ i.i.i.P ", -"[.[.[.[.[.[.[.[.[.[.-.^.].].].].(.+.E.Q.Q.Q.Q.g.D i.i.i.w.D S D ] z.n.n.z.] +.D G w.f.G i.[ f.P ", -"[.[.[.[.[.[.[.[.[.[.[.[.;.).].].h.V.Q.Q.Q.Q.Q.E.m i.w.D D z.m.S.g.].].].].`.Q.l.D S G i.i.i.i.P ", -"[.[.[.[.[.[.[.[.[.[.[.[.[.=.R.B.g.Q.Q.Q.Q.Q.Q.Q.z.V S z.E.Q.Q.Q.+.].].].].].].J.N.x.D m G i.i.P ", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.! Q.Q.Q.Q.Q.Q.Q.Q.g.M V.Q.Q.Q.~.Q.g.`.].].].].].V.N.Q.Q.x.D G i.P ", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.@.Q.Q.Q.Q.Q.W.[ r c M.Q.Q.Q.Q.Q.g.Q.].].].].].V.m.Q.Q.Q.V.D D P ", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.$.Q.Q.Q.E.D r X + +.Q.Q.Q.Q.Q.x.K.].].].].].K.B.Q.Q.Q.Q.E.[ K ", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.$.Q.Q.[ + X X X m Q.Q.Q.Q.Q.V.x.].].].].].W.B.Q.Q.Q.Q.Q.V.h ", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.&.g.r o X X X r x.Q.~.Q.Q.Q.+.].].].].].Q.V.Q.Q.Q.Q.!...[.", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.h l X X X w j k W %.G.W.Q.J.R 1.T./.].].Q.S.Q.Q.Q.Q.,.[.[.", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.f O e d H [.[.[.[.[.E E [.[.[.[.[...:.*.P.Q.Q.Q.Q. .[.[.", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.f [.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.| T.Q.Q.O.[.[.[.", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.} %.J. .[.[.[.", -"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.} [.[.[.[." -}; diff --git a/Plugins/org.mitk.gui.qt.registration/resources/PointBasedRegistration.xpm b/Plugins/org.mitk.gui.qt.registration/resources/PointBasedRegistration.xpm deleted file mode 100644 index be074ebe7f..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/resources/PointBasedRegistration.xpm +++ /dev/null @@ -1,286 +0,0 @@ -/* XPM */ -static char *PointBasedRegistration___[] = { -/* columns rows colors chars-per-pixel */ -"48 48 232 2", -" c #763F4D", -". c #7A3E4C", -"X c #6E424E", -"o c #72414D", -"O c #6E4D55", -"+ c #7C4653", -"@ c #714953", -"# c #6E535A", -"$ c #635A5E", -"% c #6D5A5F", -"& c #585F66", -"* c #645F61", -"= c #7C5562", -"- c #715C61", -"; c #5E6465", -": c #56656A", -"> c #5D646B", -", c #576F75", -"< c #596D72", -"1 c #44717C", -"2 c #636467", -"3 c #646B72", -"4 c #686B74", -"5 c #706F72", -"6 c #647174", -"7 c #6D767C", -"8 c #72797F", -"9 c #7E7A7D", -"0 c #8F374D", -"q c #833D4E", -"w c #8B394D", -"e c #90364D", -"r c #9D314B", -"t c #90394D", -"y c #953C52", -"u c #9A3D54", -"i c #A72E4B", -"p c #AB2D4C", -"a c #BF264B", -"s c #B42A4B", -"d c #BC284D", -"f c #A0304B", -"g c #AC304E", -"h c #B52F50", -"j c #BF2D50", -"k c #A53752", -"l c #BF3457", -"z c #BF3B5D", -"x c #834050", -"c c #8B4356", -"v c #934255", -"b c #8E4F62", -"n c #855461", -"m c #895662", -"M c #8A5B67", -"N c #8C5E6C", -"B c #975162", -"V c #966370", -"C c #91767E", -"Z c #C14D6C", -"A c #C1506D", -"S c #C1627E", -"D c #3B7987", -"F c #367989", -"G c #397C8C", -"H c #2F7D90", -"J c #407383", -"K c #4C7883", -"L c #4D7F8C", -"P c #537884", -"I c #597E87", -"U c #5B7F8D", -"Y c #637A86", -"T c #6F7A8D", -"R c #7F7480", -"E c #747D84", -"W c #7A7C84", -"Q c #6E7D93", -"! c #867780", -"~ c #827D86", -"^ c #C16680", -"/ c #C2768C", -"( c #2C8095", -") c #26869D", -"_ c #2C869B", -"` c #3A8194", -"' c #34869A", -"] c #3A879B", -"[ c #3C8B9D", -"{ c #1F8EA9", -"} c #1890AD", -"| c #0E9BBD", -" . c #1595B5", -".. c #1299B8", -"X. c #218AA3", -"o. c #44808F", -"O. c #52838D", -"+. c #5E828B", -"@. c #4C8494", -"#. c #4E8F9F", -"$. c #5B8390", -"%. c #518E9D", -"&. c #5F8A9A", -"*. c #6F8085", -"=. c #61818E", -"-. c #758185", -";. c #73868C", -":. c #7C858C", -">. c #768A8F", -",. c #798A8D", -"<. c #628795", -"1. c #6A8296", -"2. c #6E8B96", -"3. c #648B99", -"4. c #6F8F9D", -"5. c #7C8693", -"6. c #778B90", -"7. c #7E8890", -"8. c #778F9A", -"9. c #7D8C99", -"0. c #67909A", -"q. c #6D929E", -"w. c #7C939B", -"e. c #7E999E", -"r. c #6C94A2", -"t. c #6E9AA9", -"y. c #7094A2", -"u. c #7A9AA5", -"i. c #7C9FAB", -"p. c #76A7B7", -"a. c #0A9EC2", -"s. c #08A2C7", -"d. c #04A6CD", -"f. c #00AAD3", -"g. c #08ADD4", -"h. c #1CB2D7", -"j. c #22B4D6", -"k. c #38BBD8", -"l. c #44BFDA", -"z. c #4DC1DB", -"x. c #5EC6DC", -"c. c #6CC9DE", -"v. c #76CCDF", -"b. c #848089", -"n. c #8B858F", -"m. c #81898F", -"M. c #8C8C8F", -"N. c #90898E", -"B. c #9D898D", -"V. c #838C94", -"C. c #8F8A94", -"Z. c #928693", -"A. c #928C93", -"S. c #859196", -"D. c #889197", -"F. c #869399", -"G. c #8B949A", -"H. c #8F999F", -"J. c #909195", -"K. c #939699", -"L. c #91999F", -"P. c #899DA0", -"I. c #829FAA", -"U. c #9D97A3", -"Y. c #939DA3", -"T. c #989EA3", -"R. c #A49AA1", -"E. c #80A0AE", -"W. c #97A1A7", -"Q. c #99A1A7", -"!. c #93A4AA", -"~. c #9CA4AA", -"^. c #9FA8AE", -"/. c #8CA9B4", -"(. c #86ABB9", -"). c #88AEBB", -"_. c #96ACB0", -"`. c #98AFB3", -"'. c #91AAB8", -"]. c #9AB0B7", -"[. c #9CB6B8", -"{. c #A0A7AE", -"}. c #ACA0A8", -"|. c #A1A9AE", -" X c #A1A7B0", -".X c #ADA7B1", -"XX c #A4ACB2", -"oX c #AFA9B3", -"OX c #B2A8B0", -"+X c #B9ADB4", -"@X c #A7B0B7", -"#X c #A9B2B7", -"$X c #A5B3BA", -"%X c #AAB3B9", -"&X c #A4BABF", -"*X c #AEB8BF", -"=X c #B6B0B8", -"-X c #B0B8BE", -";X c #C3869B", -":X c #C5899E", -">X c #C790A4", -",X c #C79DAE", -"X^ d a a t x zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzX0 z 8XjXkXkXgX9Xj a a a g @ zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzX. l 8XkXkXdX & .f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.X.w.zX", -"zXzXzXzXzXzXzXzXzXzX$ <.*XeXhXhXhXhXhXhX{.^.7.4 > > 7 7 ( f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.( zXzX", -"zXzXzXzXzXzXzXzXzXzX% 4 I.aXhXhXhXhXhXhXXXD.4 3 7 7 7 7 F f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.` zXzX", -"zXzXzXzXzXzXzXzXzXzXzXzX3.aXhXhXhXaX*XXX XV.W 7 7 E 7 7 , | f.f.f.f.f.f.f.f.f.f.f.f.f.f. .u.zXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXY 6XhXaX%X{. X5X7XY.E 7 7 7 7 7 8 1 f.f.f.f.f.f.f.f.f.f.f.f.f.d.O.zXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXt.XX{.@X7XwXwX7X^.7 7 7 7 7 7 7 `.[ f.f.f.f.f.f.f.f.f.f.f.f.` 4XzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXQ U.oXoXoXoXoXoX}.9 b.b.b.b.E _.0X8 J s.f.f.f.f.f.f.f.f.a.L ].zXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX6.!.[.;.zXzX1 ) a.f.f.f.f.a._ P zXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX6.P.!.;.zXzXzXzXzX_.0.#.%.q.`.lXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXS.S.zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX-.,.zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX6 *.zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX; 7 zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX; 6 zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX: < zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX", -"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzX" -}; diff --git a/Plugins/org.mitk.gui.qt.registration/resources/QmitkDeformableRegistrationView.qrc b/Plugins/org.mitk.gui.qt.registration/resources/QmitkDeformableRegistrationView.qrc deleted file mode 100644 index 5b24046161..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/resources/QmitkDeformableRegistrationView.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - DeformableRegistration.xpm - - diff --git a/Plugins/org.mitk.gui.qt.registration/resources/QmitkPointBasedRegistrationView.qrc b/Plugins/org.mitk.gui.qt.registration/resources/QmitkPointBasedRegistrationView.qrc deleted file mode 100644 index e45b28d80a..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/resources/QmitkPointBasedRegistrationView.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - PointBasedRegistration.xpm - - diff --git a/Plugins/org.mitk.gui.qt.registration/resources/QmitkRigidRegistrationView.qrc b/Plugins/org.mitk.gui.qt.registration/resources/QmitkRigidRegistrationView.qrc deleted file mode 100644 index d9676153d7..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/resources/QmitkRigidRegistrationView.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - RigidRegistration.xpm - - diff --git a/Plugins/org.mitk.gui.qt.registration/resources/RigidRegistration.xpm b/Plugins/org.mitk.gui.qt.registration/resources/RigidRegistration.xpm deleted file mode 100644 index 51a5f9c4bb..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/resources/RigidRegistration.xpm +++ /dev/null @@ -1,231 +0,0 @@ -/* XPM */ -static char *RigidRegistration___[] = { -/* columns rows colors chars-per-pixel */ -"48 48 177 2", -" c #6F5F67", -". c #735C62", -"X c #5B6B74", -"o c #577076", -"O c #587177", -"+ c #5C747B", -"@ c #5D797F", -"# c #796167", -"$ c #71636B", -"% c #7F656B", -"& c #696872", -"* c #63747C", -"= c #9B4E61", -"- c #8A5662", -"; c #A84D63", -": c #A55367", -"> c #AA5167", -", c #A55569", -"< c #AB5368", -"1 c #A45A6C", -"2 c #AA5A6D", -"3 c #AC5E71", -"4 c #81656C", -"5 c #8F6F77", -"6 c #906D76", -"7 c #8F7078", -"8 c #94767D", -"9 c #9B727C", -"0 c #AE6375", -"q c #B3687A", -"w c #547B85", -"e c #5E7B82", -"r c #5E7D8C", -"t c #657981", -"y c #6C7F87", -"u c #6C7F88", -"i c #7B7486", -"p c #707388", -"a c #887A83", -"s c #9E7F87", -"d c #3E8B9E", -"f c #3B92A7", -"g c #3696AD", -"h c #3F98AE", -"j c #5E8088", -"k c #548797", -"l c #558698", -"z c #598B9C", -"x c #60858E", -"c c #6E848B", -"v c #73868E", -"b c #7A828D", -"n c #6C8391", -"m c #6A8F97", -"M c #7D8792", -"N c #758C94", -"B c #7B8D95", -"V c #748F9B", -"C c #7A8E9A", -"Z c #6D919A", -"A c #7A9097", -"S c #72939B", -"D c #7C949B", -"F c #7E989E", -"G c #548FA3", -"H c #4399AE", -"J c #4C9AAD", -"K c #5293A5", -"L c #5C95A5", -"P c #5597A9", -"I c #5499AA", -"U c #5B9BAB", -"Y c #459EB3", -"T c #5A9EB0", -"R c #6597A2", -"E c #6994A5", -"W c #6D9AA5", -"Q c #659CAB", -"! c #6C9CAB", -"~ c #7296A5", -"^ c #7499A3", -"/ c #7A9CA5", -"( c #779BA9", -") c #45A0B7", -"_ c #4BA1B6", -"` c #47A2B8", -"' c #4AA3B9", -"] c #4FA8BE", -"[ c #56A1B4", -"{ c #5CA1B3", -"} c #52A6BA", -"| c #5CA6B8", -" . c #54A8BC", -".. c #5CA9BC", -"X. c #68A0AF", -"o. c #7DA1A9", -"O. c #63A1B3", -"+. c #6EA7B7", -"@. c #62A7B9", -"#. c #63ABBD", -"$. c #6BADBE", -"%. c #74A2B0", -"&. c #78A7B3", -"*. c #70AEBE", -"=. c #5AAEC2", -"-. c #67B5C8", -";. c #74B1C0", -":. c #7EB5C2", -">. c #7FBCCB", -",. c #9F888D", -"<. c #828C96", -"1. c #928A92", -"2. c #9C8990", -"3. c #82959D", -"4. c #8A959F", -"5. c #81989F", -"6. c #A2848B", -"7. c #A2888E", -"8. c #AE8E96", -"9. c #A99297", -"0. c #AD9399", -"q. c #B2999F", -"w. c #8497A0", -"e. c #8E96A1", -"r. c #829CA2", -"t. c #8A9DA5", -"y. c #8C9FA8", -"u. c #9097A2", -"i. c #9B9EA8", -"p. c #B59EA4", -"a. c #8AA0A7", -"s. c #83A4AC", -"d. c #8DA2AA", -"f. c #91A4AC", -"g. c #98A0AA", -"h. c #91A8AF", -"j. c #80A7B6", -"k. c #87A9B1", -"l. c #8CAAB2", -"z. c #94ACB3", -"x. c #9AACB4", -"c. c #87B2BD", -"v. c #95B1B7", -"b. c #98B1B7", -"n. c #94B2B9", -"m. c #98B2B8", -"M. c #9FB8BF", -"N. c #A0B5BC", -"B. c #A1B9BF", -"V. c #BCB1B8", -"C. c #CAB3B9", -"Z. c #8FBAC5", -"A. c #93BCC7", -"S. c #9EBAC1", -"D. c #A3BDC3", -"F. c #A8BEC5", -"G. c #9DC0C9", -"H. c #83C2D1", -"J. c #A7C0C6", -"K. c #A8C1C7", -"L. c #A4C3CA", -"P. c #AEC7CD", -"I. c #A5CFDB", -"U. c #B6CDD4", -"Y. c #B9D1D7", -"T. c #BAD5DB", -"R. c #BFD9DF", -"E. c #B0D8E2", -"W. c #BEDFE7", -"Q. c #C2C1C9", -"!. c #DBC4CA", -"~. c #DDC8CE", -"^. c #E0C9CF", -"/. c #C3DDE3", -"(. c #C7E0E7", -"). c #CEE7ED", -"_. c None", -/* pixels */ -"3 3 3 3 3 3 3 3 3 ; : = = = = = = = = < 3 2 2 2 2 2 2 2 ; , , , , , , , , : _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.s . . . . . . . . 4 6.p.p.p.p.p.p.p.p.8 7.,.7.,.,.,.,.,.1 _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.s # . . . . . . . 4 6.p.p.p.p.p.p.p.p.8 ,.,.,.,.,.,.,.,.1 _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.s # . . . . . . . % 6.p.p.p.p.p.p.p.p.8 ,.,.,.,.,.,.,.,.1 _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.s . . . . . . . . % s p.p.p.p.p.p.p.p.8 ,.,.,.,.,.,.,.,.1 _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.,.# . . . . . . . % 6.p.p.p.p.p.p.p.p.8 ,.,.,.,.,.,.,.D 1 _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.s # . . . . . . . % s p.p.p.p.p.p.p.q.8 ,.,.,.7.1.L U I i _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.s # . . . . . . . % ,.p.p.p.p.p.p.p.p.8 ,.,.S P U F r.r.K _._._._._._._._._._.", -"0 C.C.C.C.C.C.C.C.s . . . . . . . . % 6.p.p.p.p.p.p.p.p.a L P W o.5.5.r.r.U _._._._._._._._._._.", -"< s s s s s s s s 9 6 8 5 5 5 7 5 5 5 6 7 5 5 5 7 7 n I K ^ r.r.F a.a.F a.F H _._._._._._._._._.", -"q !.!.!.!.!.!.!.!.6.9.p.q.p.p.p.q.p.6.4 # . . $ k I &.m.A 3.r.r.a.F r.r.F r.J _._._._._._._._._.", -"q ^.^.^.^.^.^.^.^.6.9.p.p.p.p.p.p.p.7.4 . * K T v.b.b.b.h.t.r.r.r.r.r.r./ r.o.f _._._._._._._._.", -"q ^.^.^.^.^.^.^.^.6.0.p.p.p.p.p.p.p.,.k K %.m.m.m.m.b.m.b.a.F r.r.r.r.r.r.r.r.H _._._._._._._._.", -"q ^.^.^.^.^.^.^.^.6.q.p.p.p.p.p.g.O.{ S A m.m.m.m.m.m.m.b.d.w.r.r.r.r.r.r.r.r.R _._._._._._._._.", -"q ^.^.^.^.^.^.^.^.7.8.p.p.p.%.{ X.r.r.r.v z.m.m.m.b.m.m.b.b.t.5.r.r.r.5./ B Z ^ ` _._._._._._._.", -"q ^.^.^.^.^.^.^.^.7.8.i.O.O.( r.r.r.r.r.N F b.m.m.m.m.m.b.b.d.r.r.r.5.5.t.4.v.P.;._._._._._._._.", -"q ^.^.^.^.^.~.~.~.E T X.a.5.a.F r.r.r.r.5.v b.b.m.b.m.m.m.b.v.5.3.5.d.h.D.P.P.P.P._ _._._._._._.", -"q ^.^.^.^.^.Q.*.$.A.P.r.F / F a.r.r.r.r.r.N a.b.m.m.m.m.m.z.d.f.f.x.P.P.P.P.P.P.P.#._._._._._._.", -"< 8.0.0.^ [ *.P.P.P.P.a.5.a.r.r./ r.r.r.r.5.B b.m.m.b.a.3.3.5.5.5.P.P.P.P.P.P.P.P.L.' _._._._._.", -"0 q.( @.Z.P.P.P.P.P.P.J.D F r.r.r.r.r.r.r.r.w.h.z.r.w.r.5.r.r.r.5.h.P.P.P.P.P.P.P.P..._._._._._.", -"0 C.x.:.P.P.P.P.P.P.P.P.t.5.r.r.r.r.r.r.r.r.t.d.d.d.r.r.r.r.r.r.a.5.P.P.P.P.P.P.P.P.Z._._._._._.", -"0 C.C.@.P.P.P.P.P.P.P.P.m.4.r.r.r.r.r.5.a.d.d.d.r.r.r.r.r.r.r.r.5.5.m.P.P.P.P.P.P.P.P.} _._._._.", -"0 C.C.j.G.P.P.P.P.P.P.P.P.5.5.r.r.5.3.3.d.h.b.a.a.r.r.r.r.r.r.r.F 5.a.P.P.P.P.P.P.P.l.{ _._._._.", -"0 C.C.C.#.P.P.P.P.P.P.P.P.h.5.5.3.3.r.v.b.b.m.h.d.r.r.r.r.r.r.r.a.5.3.L.P.P.P.M.s.^ Z S H _._._.", -"0 C.C.C.+.L.P.P.P.P.P.P.m.t.<.3.d.m.n.m.m.m.b.m.d.r.r.r.r.r.r.r.r.r.5.d.P.h.o.Z S F r.r.I _._._.", -"0 C.C.C.C.$.P.P.P.P.f.3.t.m.h.5.m.m.m.b.m.m.m.m.d.d.r.r.r.r.r.r.r.r.r.3.3.b D 5.r.r.r.r./ Y _._.", -"0 C.C.C.C.@.P.D.h.3.d.P.).)./.<.v.m.m.m.m.b.m.m.b.d.w.r.r.r.r.r.5.4.5.3.A r.r.r.r.r.r.r.r.J _._.", -"2 0.0.0.0.e.Q t.m.R.).).).).).f./ m.m.m.m.m.m.m.b.r.t.5.r.r.5.D 3.f.P.m.M r.r.r./ r.r.r.r.^ H _.", -"= 4 4 4 4 4 T ).).).).).).).).U.3.b.m.m.m.m.m.b.b.z.v 5.D 5.d.M.P.P.P.P.5.D r.r.r.r.r.r.r.r.H _.", -"= . . . . . r I.).).).).).).).).h.d.m.m.b.m.m.m.z.N X * d.P.P.P.P.P.P.P.b.M r.r.r.r.r.r.r.r.R _.", -"= . . . . . . | ).).).).).).).).K.d.m.m.m.m.r.c + t N t P.P.P.P.P.P.P.P.P.<.F r.r.r.r.r.r.r.r.H ", -"= . . . . . . z (.).).).).).).).).f.h.z.A * * c 5.r.r.* f.P.P.P.P.P.P.P.P.e.S r.r.r.r.r.F S Z Y ", -"= . . . . . $.).).).).).).).).m.3.y * B r.r.r.r.r.N A P.P.P.P.P.P.P.P.K.Z a./ 5.S m S k.B...", -"= . . . . . . P ).).).).).(.F.x.f.3.D r.r.r.r.r.r.F a.v M.P.P.P.P.P.P.P.P.s.N S Z o.v.P.P.P...", -"= . . . . . . . & >.).).Y.N.h.h.m.P.d.N r.r.r.r.F a.o.5.S f.P.P.P.P.P.P.P.x./ _.s.M.P.P.P.P.P...", -"= . . . . . . . . T F.x.y.h.F.P.P.P.N.c r.r.r.r.o.F a.5.5.4.J.P.P.P.K.h.d.4.J.k.b.P.P.P.P.P.P...", -"= - - - - - - - - p ~ x.P.P.P.P.P.P.P.A N r.r.r.5.r.r.r.r.A d.P.m.g.4.z.U.).).P.o.P.P.P.P.P.P.#.", -"_._._._._._._._._._.[ P.P.P.P.P.P.P.P.m.N r.r.r.r.r.r.F r.F S D a.N.(.).).).).).o.B.P.P.P.P.P...", -"_._._._._._._._._._.Y G.P.P.P.P.P.P.P.P.S F r.r.r.r.r.D S Z ^ l.).).).).).).).).S.s.P.P.P.P.P...", -"_._._._._._._._._._._.#.P.P.P.P.P.P.P.P.l.Z r.r.5.S Z o.l.K.m.o.).).).).).).).).(./ P.P.P.P.P...", -"_._._._._._._._._._._.` K.P.P.P.P.P.P.P.P.Z A Z Z s.M.P.P.P.P./ P.).).).).).).).).n.h.P.P.P.L.' ", -"_._._._._._._._._._._._.;.P.P.P.P.P.P.P.l.W ^ k.K.P.P.P.P.P.P.l.l.).).).).).).).).T.^ P.Z...` _.", -"_._._._._._._._._._._._.` P.P.P.P.S.s.m j @ S P.P.P.P.P.P.P.P.P.^ T.).).).).).).).)..._ _._._._.", -"_._._._._._._._._._._._._.:.P.n.o.x e + o o j v.P.P.P.P.P.P.P.P.k.n.).).).).).E.-.] _._._._._._.", -"_._._._._._._._._._._._._.` Z j @ o o o o o + / P.P.P.P.P.P.P.P.J.^ /.).).H.=._ _._._._._._._._.", -"_._._._._._._._._._._._._.g w o o o o o o o o x M.P.P.P.P.P.P.P.P.s.c.-.] _._._._._._._._._._._.", -"_._._._._._._._._._._._._._.d o o o o o o o O e o.P.P.P.P.P.P.P.;.[ _._._._._._._._._._._._._._.", -"_._._._._._._._._._._._._._.f d d d d d d d d d h ............' _._._._._._._._._._._._._._._._." -}; diff --git a/Plugins/org.mitk.gui.qt.registration/resources/btnReinit.xpm b/Plugins/org.mitk.gui.qt.registration/resources/btnReinit.xpm deleted file mode 100644 index bc42d9dd74..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/resources/btnReinit.xpm +++ /dev/null @@ -1,16 +0,0 @@ -/* XPM */ -static const char * btnReinit_xpm[] = { -"10 9 4 1", -" c None", -". c #9A0000", -"+ c #009A00", -"@ c #000000", -" . +", -" . +", -" . +", -" . @ +", -" . @ +", -" . @@@@ +", -" . @ +", -". @ +", -". +"}; diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationView.cpp b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationView.cpp deleted file mode 100644 index 0a77c17734..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationView.cpp +++ /dev/null @@ -1,625 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkDeformableRegistrationView.h" -#include "ui_QmitkDeformableRegistrationViewControls.h" - -#include "QmitkStdMultiWidget.h" -#include "qinputdialog.h" -#include "qmessagebox.h" -#include "qcursor.h" -#include "qapplication.h" -#include "qradiobutton.h" -#include "qslider.h" - -#include - -#include "mitkNodePredicateDataType.h" -#include "mitkNodePredicateProperty.h" -#include "mitkNodePredicateAnd.h" -#include "mitkNodePredicateNot.h" -#include "mitkVectorImageMapper2D.h" -#include - -#include "itkWarpImageFilter.h" - -#include "mitkDataNodeObject.h" - -#include "berryIWorkbenchWindow.h" -#include "berryISelectionService.h" - - - -const std::string QmitkDeformableRegistrationView::VIEW_ID = "org.mitk.views.deformableregistration"; - -using namespace berry; - -struct SelListenerDeformableRegistration : ISelectionListener -{ - berryObjectMacro(SelListenerDeformableRegistration); - - SelListenerDeformableRegistration(QmitkDeformableRegistrationView* view) - { - m_View = view; - } - - void DoSelectionChanged(ISelection::ConstPointer selection) - { -// if(!m_View->IsVisible()) -// return; - // save current selection in member variable - m_View->m_CurrentSelection = selection.Cast(); - - // do something with the selected items - if(m_View->m_CurrentSelection) - { - if (m_View->m_CurrentSelection->Size() != 2) - { - if (m_View->m_FixedNode.IsNull() || m_View->m_MovingNode.IsNull()) - { - m_View->m_Controls.m_StatusLabel->show(); - m_View->m_Controls.TextLabelFixed->hide(); - m_View->m_Controls.m_SwitchImages->hide(); - m_View->m_Controls.m_FixedLabel->hide(); - m_View->m_Controls.TextLabelMoving->hide(); - m_View->m_Controls.m_MovingLabel->hide(); - m_View->m_Controls.m_OpacityLabel->setEnabled(false); - m_View->m_Controls.m_OpacitySlider->setEnabled(false); - m_View->m_Controls.label->setEnabled(false); - m_View->m_Controls.label_2->setEnabled(false); - m_View->m_Controls.m_ShowRedGreenValues->setEnabled(false); - } - } - else - { - m_View->m_Controls.m_StatusLabel->hide(); - bool foundFixedImage = false; - mitk::DataNode::Pointer fixedNode; - // iterate selection - for (IStructuredSelection::iterator i = m_View->m_CurrentSelection->Begin(); - i != m_View->m_CurrentSelection->End(); ++i) - { - // extract datatree node - if (mitk::DataNodeObject::Pointer nodeObj = i->Cast()) - { - mitk::DataNode::Pointer node = nodeObj->GetDataNode(); - // only look at interesting types - if(QString("Image").compare(node->GetData()->GetNameOfClass())==0) - { - if (dynamic_cast(node->GetData())->GetDimension() == 4) - { - m_View->m_Controls.m_StatusLabel->show(); - QMessageBox::information( NULL, "DeformableRegistration", "Only 2D or 3D images can be processed.", QMessageBox::Ok ); - return; - } - if (foundFixedImage == false) - { - fixedNode = node; - foundFixedImage = true; - } - else - { - m_View->SetImagesVisible(selection); - m_View->FixedSelected(fixedNode); - m_View->MovingSelected(node); - m_View->m_Controls.m_StatusLabel->hide(); - m_View->m_Controls.TextLabelFixed->show(); - m_View->m_Controls.m_SwitchImages->show(); - m_View->m_Controls.m_FixedLabel->show(); - m_View->m_Controls.TextLabelMoving->show(); - m_View->m_Controls.m_MovingLabel->show(); - m_View->m_Controls.m_OpacityLabel->setEnabled(true); - m_View->m_Controls.m_OpacitySlider->setEnabled(true); - m_View->m_Controls.label->setEnabled(true); - m_View->m_Controls.label_2->setEnabled(true); - m_View->m_Controls.m_ShowRedGreenValues->setEnabled(true); - } - } - else - { - m_View->m_Controls.m_StatusLabel->show(); - return; - } - } - } - } - } - else if (m_View->m_FixedNode.IsNull() || m_View->m_MovingNode.IsNull()) - { - m_View->m_Controls.m_StatusLabel->show(); - } - } - - void SelectionChanged(const IWorkbenchPart::Pointer& part, const ISelection::ConstPointer& selection) override - { - // check, if selection comes from datamanager - if (part) - { - QString partname = part->GetPartName(); - if(partname.compare("Data Manager")==0) - { - // apply selection - DoSelectionChanged(selection); - } - } - } - - QmitkDeformableRegistrationView* m_View; -}; - -QmitkDeformableRegistrationView::QmitkDeformableRegistrationView(QObject * /*parent*/, const char * /*name*/) -: QmitkFunctionality() , m_MultiWidget(NULL), m_MovingNode(NULL), m_FixedNode(NULL), m_ShowRedGreen(false), - m_Opacity(0.5), m_OriginalOpacity(1.0), m_Deactivated(false) -{ - this->GetDataStorage()->RemoveNodeEvent.AddListener(mitk::MessageDelegate1 ( this, &QmitkDeformableRegistrationView::DataNodeHasBeenRemoved )); -} - -QmitkDeformableRegistrationView::~QmitkDeformableRegistrationView() -{ - if (m_SelListener) - { - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) s->RemovePostSelectionListener(m_SelListener.data()); - } -} - -void QmitkDeformableRegistrationView::CreateQtPartControl(QWidget* parent) -{ - m_Controls.setupUi(parent); - m_Parent->setEnabled(false); - this->CreateConnections(); - m_Controls.TextLabelFixed->hide(); - m_Controls.m_SwitchImages->hide(); - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.m_MovingLabel->hide(); - m_Controls.m_OpacityLabel->setEnabled(false); - m_Controls.m_OpacitySlider->setEnabled(false); - m_Controls.label->setEnabled(false); - m_Controls.label_2->setEnabled(false); - m_Controls.m_ShowRedGreenValues->setEnabled(false); - m_Controls.m_DeformableTransform->hide(); - if (m_Controls.m_DeformableTransform->currentIndex() == 0) - { - m_Controls.m_QmitkDemonsRegistrationViewControls->show(); - m_Controls.m_QmitkBSplineRegistrationViewControls->hide(); - } - else - { - m_Controls.m_QmitkDemonsRegistrationViewControls->hide(); - m_Controls.m_QmitkBSplineRegistrationViewControls->show(); - } - this->CheckCalculateEnabled(); - - mitk::TNodePredicateDataType::Pointer isMitkImage = mitk::TNodePredicateDataType::New(); - m_Controls.comboBox->SetDataStorage(this->GetDataStorage()); - m_Controls.comboBox->SetPredicate(isMitkImage); - m_Controls.comboBox_2->SetDataStorage(this->GetDataStorage()); - m_Controls.comboBox_2->SetPredicate(isMitkImage); -} - -void QmitkDeformableRegistrationView::DataNodeHasBeenRemoved(const mitk::DataNode* node) -{ - if(node == m_FixedNode || node == m_MovingNode) - { - m_Controls.m_StatusLabel->show(); - m_Controls.TextLabelFixed->hide(); - m_Controls.m_SwitchImages->hide(); - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.m_MovingLabel->hide(); - m_Controls.m_OpacityLabel->setEnabled(false); - m_Controls.m_OpacitySlider->setEnabled(false); - m_Controls.label->setEnabled(false); - m_Controls.label_2->setEnabled(false); - m_Controls.m_ShowRedGreenValues->setEnabled(false); - m_Controls.m_DeformableTransform->hide(); - m_Controls.m_CalculateTransformation->setEnabled(false); - } - -} - -void QmitkDeformableRegistrationView::ApplyDeformationField() -{ - if ( m_Controls.comboBox->GetSelectedNode().IsNull() || m_Controls.comboBox_2->GetSelectedNode().IsNull() ) - return; - - mitk::Image* mitkDeformationField = dynamic_cast(m_Controls.comboBox->GetSelectedNode()->GetData()); - mitk::Image* mimage = dynamic_cast(m_Controls.comboBox_2->GetSelectedNode()->GetData()); - - typedef itk::Image FloatImageType; - - FloatImageType::Pointer itkMovingImage = FloatImageType::New(); - DeformationFieldType::Pointer itkDeformationField = DeformationFieldType::New(); - mitk::CastToItkImage(mimage, itkMovingImage); - mitk::CastToItkImage(mitkDeformationField, itkDeformationField); - - typedef itk::WarpImageFilter< FloatImageType, FloatImageType, DeformationFieldType > WarperType; - typedef itk::LinearInterpolateImageFunction< FloatImageType, double > InterpolatorType; - - WarperType::Pointer warper = WarperType::New(); - InterpolatorType::Pointer interpolator = InterpolatorType::New(); - - warper->SetInput( itkMovingImage ); - warper->SetInterpolator( interpolator ); - warper->SetOutputSpacing( itkDeformationField->GetSpacing() ); - warper->SetOutputOrigin( itkDeformationField->GetOrigin() ); - warper->SetOutputDirection (itkDeformationField->GetDirection() ); - warper->SetDisplacementField( itkDeformationField ); - warper->Update(); - - FloatImageType::Pointer outputImage = warper->GetOutput(); - mitk::Image::Pointer result = mitk::Image::New(); - - mitk::CastToMitkImage(outputImage, result); - - // Create new DataNode - mitk::DataNode::Pointer newNode = mitk::DataNode::New(); - newNode->SetData( result ); - newNode->SetProperty( "name", mitk::StringProperty::New("warped image") ); - - // add the new datatree node to the datatree - this->GetDefaultDataStorage()->Add(newNode); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkDeformableRegistrationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_Parent->setEnabled(true); - m_MultiWidget = &stdMultiWidget; - m_MultiWidget->SetWidgetPlanesVisibility(true); -} - -void QmitkDeformableRegistrationView::StdMultiWidgetNotAvailable() -{ - m_Parent->setEnabled(false); - m_MultiWidget = NULL; -} - -void QmitkDeformableRegistrationView::CreateConnections() -{ - connect(m_Controls.m_ShowRedGreenValues, SIGNAL(toggled(bool)), this, SLOT(ShowRedGreen(bool))); - connect(m_Controls.m_DeformableTransform, SIGNAL(currentChanged(int)), this, SLOT(TabChanged(int))); - connect(m_Controls.m_OpacitySlider, SIGNAL(sliderMoved(int)), this, SLOT(OpacityUpdate(int))); - connect(m_Controls.m_CalculateTransformation, SIGNAL(clicked()), this, SLOT(Calculate())); - connect((QObject*)(m_Controls.m_SwitchImages),SIGNAL(clicked()),this,SLOT(SwitchImages())); - connect(this,SIGNAL(calculateBSplineRegistration()),m_Controls.m_QmitkBSplineRegistrationViewControls,SLOT(CalculateTransformation())); - connect( m_Controls.m_WarpImageButton, SIGNAL(clicked()), this, SLOT(ApplyDeformationField()) ); -} - -void QmitkDeformableRegistrationView::Activated() -{ - m_Deactivated = false; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Activated(); - if (m_SelListener.isNull()) - { - m_SelListener.reset(new SelListenerDeformableRegistration(this)); - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener(/*"org.mitk.views.datamanager",*/ m_SelListener.data()); - berry::ISelection::ConstPointer sel( - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); - m_CurrentSelection = sel.Cast(); - static_cast(m_SelListener.data())->DoSelectionChanged(sel); - } - this->OpacityUpdate(m_Controls.m_OpacitySlider->value()); - this->ShowRedGreen(m_Controls.m_ShowRedGreenValues->isChecked()); -} - -void QmitkDeformableRegistrationView::Visible() -{ - /* - m_Deactivated = false; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Activated(); - if (m_SelListener.IsNull()) - { - m_SelListener = berry::ISelectionListener::Pointer(new SelListenerDeformableRegistration(this)); - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener("org.mitk.views.datamanager", m_SelListener); - berry::ISelection::ConstPointer sel( - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); - m_CurrentSelection = sel.Cast(); - m_SelListener.Cast()->DoSelectionChanged(sel); - } - this->OpacityUpdate(m_Controls.m_OpacitySlider->value()); - this->ShowRedGreen(m_Controls.m_ShowRedGreenValues->isChecked());*/ -} - -void QmitkDeformableRegistrationView::Deactivated() -{ - m_Deactivated = true; - this->SetImageColor(false); - if (m_FixedNode.IsNotNull()) - m_FixedNode->SetOpacity(1.0); - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_OriginalOpacity); - } - m_FixedNode = NULL; - m_MovingNode = NULL; - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) - s->RemovePostSelectionListener(m_SelListener.data()); - m_SelListener.reset(); -} - -void QmitkDeformableRegistrationView::Hidden() -{ - /* - m_Deactivated = true; - this->SetImageColor(false); - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_OriginalOpacity); - } - m_FixedNode = NULL; - m_MovingNode = NULL; - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) - s->RemovePostSelectionListener(m_SelListener); - m_SelListener = NULL;*/ - //mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - //QmitkFunctionality::Deactivated(); -} - -void QmitkDeformableRegistrationView::FixedSelected(mitk::DataNode::Pointer fixedImage) -{ - if (fixedImage.IsNotNull()) - { - if (m_FixedNode != fixedImage) - { - // remove changes on previous selected node - if (m_FixedNode.IsNotNull()) - { - this->SetImageColor(false); - m_FixedNode->SetOpacity(1.0); - m_FixedNode->SetVisibility(false); - m_FixedNode->SetProperty("selectedFixedImage", mitk::BoolProperty::New(false)); - } - // get selected node - m_FixedNode = fixedImage; - m_FixedNode->SetOpacity(0.5); - m_Controls.TextLabelFixed->setText(QString::fromStdString(m_FixedNode->GetName())); - m_Controls.m_FixedLabel->show(); - m_Controls.TextLabelFixed->show(); - m_Controls.m_SwitchImages->show(); - mitk::ColorProperty::Pointer colorProperty; - colorProperty = dynamic_cast(m_FixedNode->GetProperty("color")); - if ( colorProperty.IsNotNull() ) - { - m_FixedColor = colorProperty->GetColor(); - } - this->SetImageColor(m_ShowRedGreen); - m_FixedNode->SetVisibility(true); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } - } - else - { - m_FixedNode = fixedImage; - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelFixed->hide(); - m_Controls.m_SwitchImages->hide(); - } - this->CheckCalculateEnabled(); -} - -void QmitkDeformableRegistrationView::MovingSelected(mitk::DataNode::Pointer movingImage) -{ - if (movingImage.IsNotNull()) - { - if (m_MovingNode != movingImage) - { - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_OriginalOpacity); - if (m_FixedNode == m_MovingNode) - m_FixedNode->SetOpacity(0.5); - this->SetImageColor(false); - } - m_MovingNode = movingImage; - m_Controls.TextLabelMoving->setText(QString::fromStdString(m_MovingNode->GetName())); - m_Controls.m_MovingLabel->show(); - m_Controls.TextLabelMoving->show(); - mitk::ColorProperty::Pointer colorProperty; - colorProperty = dynamic_cast(m_MovingNode->GetProperty("color")); - if ( colorProperty.IsNotNull() ) - { - m_MovingColor = colorProperty->GetColor(); - } - this->SetImageColor(m_ShowRedGreen); - m_MovingNode->GetFloatProperty("opacity", m_OriginalOpacity); - this->OpacityUpdate(m_Opacity); - m_MovingNode->SetVisibility(true); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } - } - else - { - m_MovingNode = NULL; - m_Controls.m_MovingLabel->hide(); - m_Controls.TextLabelMoving->hide(); - } - this->CheckCalculateEnabled(); -} - -bool QmitkDeformableRegistrationView::CheckCalculate() -{ - if(m_MovingNode==m_FixedNode) - return false; - return true; -} - -void QmitkDeformableRegistrationView::ShowRedGreen(bool redGreen) -{ - m_ShowRedGreen = redGreen; - this->SetImageColor(m_ShowRedGreen); -} - -void QmitkDeformableRegistrationView::SetImageColor(bool redGreen) -{ - if (!redGreen && m_FixedNode.IsNotNull()) - { - m_FixedNode->SetColor(m_FixedColor); - } - if (!redGreen && m_MovingNode.IsNotNull()) - { - m_MovingNode->SetColor(m_MovingColor); - } - if (redGreen && m_FixedNode.IsNotNull()) - { - m_FixedNode->SetColor(1.0f, 0.0f, 0.0f); - } - if (redGreen && m_MovingNode.IsNotNull()) - { - m_MovingNode->SetColor(0.0f, 1.0f, 0.0f); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkDeformableRegistrationView::OpacityUpdate(float opacity) -{ - m_Opacity = opacity; - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_Opacity); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkDeformableRegistrationView::OpacityUpdate(int opacity) -{ - float fValue = ((float)opacity)/100.0f; - this->OpacityUpdate(fValue); -} - -void QmitkDeformableRegistrationView::CheckCalculateEnabled() -{ - if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull()) - { - m_Controls.m_CalculateTransformation->setEnabled(true); - } - else - { - m_Controls.m_CalculateTransformation->setEnabled(false); - } -} - -void QmitkDeformableRegistrationView::Calculate() -{ - if (m_Controls.m_DeformableTransform->tabText(m_Controls.m_DeformableTransform->currentIndex()) == "Demons") - { - m_Controls.m_QmitkDemonsRegistrationViewControls->SetFixedNode(m_FixedNode); - m_Controls.m_QmitkDemonsRegistrationViewControls->SetMovingNode(m_MovingNode); - try - { - m_Controls.m_QmitkDemonsRegistrationViewControls->CalculateTransformation(); - } - catch (itk::ExceptionObject& excpt) - { - QMessageBox::information( NULL, "Registration exception", excpt.GetDescription(), QMessageBox::Ok ); - return; - } - mitk::Image::Pointer resultImage = m_Controls.m_QmitkDemonsRegistrationViewControls->GetResultImage(); - mitk::Image::Pointer resultDeformationField = m_Controls.m_QmitkDemonsRegistrationViewControls->GetResultDeformationfield(); - if (resultImage.IsNotNull()) - { - mitk::DataNode::Pointer resultImageNode = mitk::DataNode::New(); - resultImageNode->SetData(resultImage); - mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); - mitk::LevelWindow levelWindow; - levelWindow.SetAuto( resultImage ); - levWinProp->SetLevelWindow(levelWindow); - resultImageNode->GetPropertyList()->SetProperty("levelwindow",levWinProp); - resultImageNode->SetStringProperty("name", "DeformableRegistrationResultImage"); - this->GetDataStorage()->Add(resultImageNode, m_MovingNode); - } - if (resultDeformationField.IsNotNull()) - { - mitk::DataNode::Pointer resultDeformationFieldNode = mitk::DataNode::New(); - resultDeformationFieldNode->SetData(resultDeformationField); - mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); - mitk::LevelWindow levelWindow; - levelWindow.SetAuto( resultDeformationField ); - levWinProp->SetLevelWindow(levelWindow); - resultDeformationFieldNode->GetPropertyList()->SetProperty("levelwindow",levWinProp); - resultDeformationFieldNode->SetStringProperty("name", "DeformableRegistrationResultDeformationField"); - mitk::VectorImageMapper2D::Pointer mapper = mitk::VectorImageMapper2D::New(); - resultDeformationFieldNode->SetMapper(1, mapper); - resultDeformationFieldNode->SetVisibility(false); - this->GetDataStorage()->Add(resultDeformationFieldNode, m_MovingNode); - } - } - - else if (m_Controls.m_DeformableTransform->tabText(m_Controls.m_DeformableTransform->currentIndex()) == "B-Spline") - { - m_Controls.m_QmitkBSplineRegistrationViewControls->SetFixedNode(m_FixedNode); - m_Controls.m_QmitkBSplineRegistrationViewControls->SetMovingNode(m_MovingNode); - emit calculateBSplineRegistration(); - } -} - -void QmitkDeformableRegistrationView::SetImagesVisible(berry::ISelection::ConstPointer /*selection*/) -{ - if (this->m_CurrentSelection->Size() == 0) - { - // show all images - mitk::DataStorage::SetOfObjects::ConstPointer setOfObjects = this->GetDataStorage()->GetAll(); - for (mitk::DataStorage::SetOfObjects::ConstIterator nodeIt = setOfObjects->Begin() - ; nodeIt != setOfObjects->End(); ++nodeIt) // for each node - { - if ( (nodeIt->Value().IsNotNull()) && (nodeIt->Value()->GetProperty("visible")) && dynamic_cast(nodeIt->Value()->GetData())==NULL) - { - nodeIt->Value()->SetVisibility(true); - } - } - } - else - { - // hide all images - mitk::DataStorage::SetOfObjects::ConstPointer setOfObjects = this->GetDataStorage()->GetAll(); - for (mitk::DataStorage::SetOfObjects::ConstIterator nodeIt = setOfObjects->Begin() - ; nodeIt != setOfObjects->End(); ++nodeIt) // for each node - { - if ( (nodeIt->Value().IsNotNull()) && (nodeIt->Value()->GetProperty("visible")) && dynamic_cast(nodeIt->Value()->GetData())==NULL) - { - nodeIt->Value()->SetVisibility(false); - } - } - } -} - -void QmitkDeformableRegistrationView::TabChanged(int index) -{ - if (index == 0) - { - m_Controls.m_QmitkDemonsRegistrationViewControls->show(); - m_Controls.m_QmitkBSplineRegistrationViewControls->hide(); - } - else - { - m_Controls.m_QmitkDemonsRegistrationViewControls->hide(); - m_Controls.m_QmitkBSplineRegistrationViewControls->show(); - } -} - -void QmitkDeformableRegistrationView::SwitchImages() -{ - mitk::DataNode::Pointer newMoving = m_FixedNode; - mitk::DataNode::Pointer newFixed = m_MovingNode; - this->FixedSelected(newFixed); - this->MovingSelected(newMoving); -} diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationView.h b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationView.h deleted file mode 100644 index dad0fdabca..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationView.h +++ /dev/null @@ -1,214 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - - -#ifndef QMITKDEFORMABLEREGISTRATION_H -#define QMITKDEFORMABLEREGISTRATION_H - -#include "QmitkFunctionality.h" -#include "ui_QmitkDeformableRegistrationViewControls.h" - -#include - -#include "berryISelectionListener.h" -#include "berryIStructuredSelection.h" -#include -#include "itkImageFileReader.h" - -/*! -\brief The DeformableRegistration functionality is used to perform deformable registration. - -This functionality allows you to register two 2D as well as two 3D images in a non rigid manner. -Register means to align two images, so that they become as similar as possible. -Therefore you can select from different deformable registration methods. -Registration results will directly be applied to the Moving Image. The result is shown in the multi-widget. - -For more informations see: \ref QmitkDeformableRegistrationUserManual - -\sa QmitkFunctionality -\ingroup Functionalities -\ingroup DeformableRegistration -*/ - -class REGISTRATION_EXPORT QmitkDeformableRegistrationView : public QmitkFunctionality -{ - - friend struct SelListenerDeformableRegistration; - - Q_OBJECT - - public: - - static const std::string VIEW_ID; - - typedef itk::Vector< float, 3 > VectorType; - typedef itk::Image< VectorType, 3 > DeformationFieldType; - typedef itk::ImageFileReader< DeformationFieldType > ImageReaderType; - - /*! - \brief default constructor - */ - QmitkDeformableRegistrationView(QObject *parent=0, const char *name=0); - - /*! - \brief default destructor - */ - virtual ~QmitkDeformableRegistrationView(); - - /*! - \brief method for creating the applications main widget - */ - virtual void CreateQtPartControl(QWidget *parent) override; - - /*! - \brief Sets the StdMultiWidget and connects it to the functionality. - */ - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - - /*! - \brief Removes the StdMultiWidget and disconnects it from the functionality. - */ - virtual void StdMultiWidgetNotAvailable() override; - - /*! - \brief method for creating the connections of main and control widget - */ - virtual void CreateConnections(); - - /*! - \brief Method which is called when this functionality is selected in MITK - */ - virtual void Activated() override; - - /*! - \brief Method which is called whenever the functionality is deselected in MITK - */ - virtual void Deactivated() override; - - virtual void Visible() override; - - virtual void Hidden() override; - - void DataNodeHasBeenRemoved(const mitk::DataNode* node); - - - - signals: - - /*! - \brief Signal that informs about that the fixed image should be reinitialized in the multi-widget. - */ - void reinitFixed(const mitk::Geometry3D *); - - /*! - \brief Signal that informs about that the moving image should be reinitialized in the multi-widget. - */ - void reinitMoving(const mitk::Geometry3D *); - - /*! - \brief Signal that informs about that the BSpline registration should be performed. - */ - void calculateBSplineRegistration(); - - protected slots: - - /*! - * sets the fixed Image according to TreeNodeSelector widget - */ - void FixedSelected(mitk::DataNode::Pointer fixedImage); - - /*! - * sets the moving Image according to TreeNodeSelector widget - */ - void MovingSelected(mitk::DataNode::Pointer movingImage); - - /*! - * checks if registration is possible - */ - bool CheckCalculate(); - - /*! - * stores whether the image will be shown in grayvalues or in red for fixed image and green for moving image - * @param show if true, then images will be shown in red and green - */ - void ShowRedGreen(bool show); - - /*! - * set the selected opacity for moving image - * @param opacity the selected opacity - */ - void OpacityUpdate(float opacity); - - /*! - \brief Sets the selected opacity for moving image - - @param opacity the selected opacity - */ - void OpacityUpdate(int opacity); - - /*! - * sets the images to grayvalues or fixed image to red and moving image to green - * @param redGreen if true, then images will be shown in red and green - */ - void SetImageColor(bool redGreen); - - /*! - \brief Checks whether the registration can be performed. - */ - void CheckCalculateEnabled(); - - /*! - \brief Performs the registration. - */ - void Calculate(); - - /*! - * Prints the values of the deformationfield - */ - void ApplyDeformationField(); - - void SetImagesVisible(berry::ISelection::ConstPointer selection); - - void TabChanged(int index); - - void SwitchImages(); - - protected: - - QScopedPointer m_SelListener; - berry::IStructuredSelection::ConstPointer m_CurrentSelection; - - /*! - * default main widget containing 4 windows showing 3 - * orthogonal slices of the volume and a 3d render window - */ - QmitkStdMultiWidget * m_MultiWidget; - - /*! - * control widget to make all changes for Deformable registration - */ - Ui::QmitkDeformableRegistrationViewControls m_Controls; - mitk::DataNode::Pointer m_MovingNode; - mitk::DataNode::Pointer m_FixedNode; - bool m_ShowRedGreen; - float m_Opacity; - float m_OriginalOpacity; - mitk::Color m_FixedColor; - mitk::Color m_MovingColor; - bool m_Deactivated; -}; - -#endif //QMITKDEFORMABLEREGISTRATION_H diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationViewControls.ui b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationViewControls.ui deleted file mode 100644 index b6bbe23cb8..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkDeformableRegistrationViewControls.ui +++ /dev/null @@ -1,487 +0,0 @@ - - - QmitkDeformableRegistrationViewControls - - - - 0 - 0 - 382 - 431 - - - - - 0 - 0 - - - - - 0 - 0 - - - - DeformableRegistrationViewControls - - - - - - - - - - - 255 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 118 - 116 - 108 - - - - - - - 118 - 116 - 108 - - - - - - - 118 - 116 - 108 - - - - - - - - - 8 - - - - - - - You have to select two images from Data Manager using CTRL + left click! - - - - - - - - - - - - 8 - - - - Fixed Image: - - - - - - - - 10 - - - - - - - false - - - - - - - - 8 - - - - Moving Image : - - - - - - - - 10 - - - - - - - false - - - - - - - - - Switch fixed and moving image - - - - - - - - - - - - 0 - 0 - - - - Moving Image Opacity: - - - false - - - - - - - 0% - - - - - - - - 0 - 0 - - - - 100 - - - 50 - - - Qt::Horizontal - - - - - - - 100% - - - - - - - - - - 0 - 0 - - - - Show Images Red/Green - - - - - - - - 0 - 0 - - - - QTabWidget::North - - - QTabWidget::Triangular - - - 0 - - - Qt::ElideNone - - - - Demons - - - - - B-Spline - - - - - 30 - 20 - 271 - 291 - - - - - 0 - 0 - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 10 - 0 - 242 - 10 - - - - - 0 - 0 - - - - - - - - - true - - - - 0 - 0 - - - - - 150 - 0 - - - - Register - - - - :/QmitkDeformableRegistrationView/DeformableRegistration.xpm:/QmitkDeformableRegistrationView/DeformableRegistration.xpm - - - false - - - - - - - Apply deformation field - - - - QFormLayout::AllNonFixedFieldsGrow - - - 0 - - - 0 - - - 0 - - - 3 - - - 0 - - - 0 - - - - - This deformation field is applied to the selected image. - - - - - - - This image is transformed with the selected deformation field. - - - - - - - Image: - - - - - - - Deformation field: - - - - - - - Apply deformation field. - - - Warp image - - - - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 1 - - - - - - - - - - QmitkDemonsRegistrationView - QWidget -
QmitkDemonsRegistrationView.h
- 1 -
- - QmitkBSplineRegistrationView - QWidget -
QmitkBSplineRegistrationView.h
- 1 -
- - QmitkDataStorageComboBox - QComboBox -
QmitkDataStorageComboBox.h
-
-
- - mitkDataNode.h - mitkBaseData.h - - - - - -
diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkLoadPresetDialog.cpp b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkLoadPresetDialog.cpp deleted file mode 100644 index 406eb801d0..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkLoadPresetDialog.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkLoadPresetDialog.h" - -#include -#include -#include -#include - -QmitkLoadPresetDialog::QmitkLoadPresetDialog(QWidget* parent, Qt::WindowFlags f, const char* name, std::list presets) -:QDialog(parent, f) -{ - QDialog::setMinimumSize(250, 300); - this->setObjectName(name); - - QBoxLayout * verticalLayout = new QVBoxLayout( this ); - verticalLayout->setMargin(5); - verticalLayout->setSpacing(5); - - // list of all presets - lblPrompt = new QLabel( "Which preset do you want to load?", this ); - verticalLayout->addWidget( lblPrompt ); - lstPresets = new QListWidget( this ); - verticalLayout->addWidget( lstPresets ); - - std::list::iterator iter; - for( iter = presets.begin(); iter != presets.end(); iter++ ) - { - std::string preset = *iter; - new QListWidgetItem(preset.c_str(), lstPresets); - } - - lstPresets->setCurrentItem(nullptr); // select first Item by default (might turn out to be a stupid descision) - - connect( lstPresets, SIGNAL(itemDoubleClicked (QListWidgetItem *)), this, SLOT(onPresetImmediatelySelected(QListWidgetItem *)) ); - - // buttons for closing the dialog - btnOk = new QPushButton( tr("Ok"), this); - btnOk->setObjectName("btnOk" ); - btnOk->setDefault(true); - connect( btnOk, SIGNAL(clicked()), this, SLOT(accept()) ); - - QPushButton* btnCancel = new QPushButton( tr("Cancel"), this); - btnCancel->setObjectName("btnCancel" ); - connect( btnCancel, SIGNAL(clicked()), this, SLOT(reject()) ); - - auto buttonWidget = new QWidget(this); - QBoxLayout * horizontalLayout = new QHBoxLayout( buttonWidget ); - horizontalLayout->setSpacing(5); - horizontalLayout->addStretch(); - horizontalLayout->addWidget( btnOk ); - horizontalLayout->addWidget( btnCancel ); - verticalLayout->addWidget(buttonWidget); -} - -QmitkLoadPresetDialog::~QmitkLoadPresetDialog() -{ -} - -std::string QmitkLoadPresetDialog::GetPresetName() -{ - std::string presetName = std::string(lstPresets->currentItem()->text().toLatin1()); - return presetName; -} - -void QmitkLoadPresetDialog::onPresetImmediatelySelected(QListWidgetItem * ) -{ - if ( (signed)(lstPresets->row(lstPresets->currentItem())) != (signed)(lstPresets->count()-1) ) - { - accept(); // close - } - else - { - // dont close - } -} - diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkLoadPresetDialog.h b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkLoadPresetDialog.h deleted file mode 100644 index 1dd44cf4fa..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkLoadPresetDialog.h +++ /dev/null @@ -1,66 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkLoadPresetDialog_h_Included -#define QmitkLoadPresetDialog_h_Included - -#include -#include -#include - -class QLabel; -class QLineEdit; -class QListWidget; -class QPushButton; - -#include - -/** - \brief Dialog for QmitkRigidRegistration. - - \ingroup RigidRegistration - - This dialog is used to ask a user about a preset with transform, metric, optimizer and interpolator parameters to load. -*/ -class QmitkLoadPresetDialog : public QDialog -{ - Q_OBJECT - - public: - - QmitkLoadPresetDialog(QWidget* parent, Qt::WindowFlags f, const char* name, std::list presets); - virtual ~QmitkLoadPresetDialog(); - - std::string GetPresetName(); - - signals: - - public slots: - - protected slots: - - void onPresetImmediatelySelected(QListWidgetItem * item); - - protected: - - QLabel* lblPrompt; - QListWidget* lstPresets; - - QPushButton* btnOk; -}; - -#endif - diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationView.cpp b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationView.cpp deleted file mode 100644 index 0a320dd3b2..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationView.cpp +++ /dev/null @@ -1,1310 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "QmitkPointBasedRegistrationView.h" -#include "ui_QmitkPointBasedRegistrationViewControls.h" -#include "QmitkPointListWidget.h" - -#include -#include -#include -#include "vtkPolyData.h" - -#include -#include -#include "qradiobutton.h" -#include "qapplication.h" -#include -#include -#include -#include -#include "qmessagebox.h" - -#include "mitkLandmarkWarping.h" -#include -#include "mitkOperationEvent.h" -#include "mitkUndoController.h" -#include "mitkNodePredicateDataType.h" -#include "mitkNodePredicateProperty.h" -#include "mitkNodePredicateAnd.h" -#include "mitkNodePredicateNot.h" -#include -#include - -#include - -#include - -#include "mitkDataNodeObject.h" - -#include "berryIWorkbenchWindow.h" -#include "berryISelectionService.h" - -#include - - -const std::string QmitkPointBasedRegistrationView::VIEW_ID = "org.mitk.views.pointbasedregistration"; - -using namespace berry; - -struct SelListenerPointBasedRegistration : ISelectionListener -{ - berryObjectMacro(SelListenerPointBasedRegistration); - - SelListenerPointBasedRegistration(QmitkPointBasedRegistrationView* view) - { - m_View = view; - } - - void DoSelectionChanged(ISelection::ConstPointer selection) - { - // if(!m_View->IsVisible()) - // return; - // save current selection in member variable - m_View->m_CurrentSelection = selection.Cast(); - - // do something with the selected items - if(m_View->m_CurrentSelection) - { - if (m_View->m_CurrentSelection->Size() != 2) - { - if (m_View->m_FixedNode.IsNull() || m_View->m_MovingNode.IsNull()) - { - m_View->m_Controls.m_StatusLabel->show(); - m_View->m_Controls.TextLabelFixed->hide(); - m_View->m_Controls.m_FixedLabel->hide(); - m_View->m_Controls.line2->hide(); - m_View->m_Controls.m_FixedPointListWidget->hide(); - m_View->m_Controls.TextLabelMoving->hide(); - m_View->m_Controls.m_MovingLabel->hide(); - m_View->m_Controls.line1->hide(); - m_View->m_Controls.m_MovingPointListWidget->hide(); - m_View->m_Controls.m_OpacityLabel->hide(); - m_View->m_Controls.m_OpacitySlider->hide(); - m_View->m_Controls.label->hide(); - m_View->m_Controls.label_2->hide(); - m_View->m_Controls.m_SwitchImages->hide(); - m_View->m_Controls.m_ShowRedGreenValues->setEnabled(false); - } - } - else - { - m_View->m_Controls.m_StatusLabel->hide(); - bool foundFixedNode = false; - mitk::DataNode::Pointer fixedNode; - // iterate selection - for (IStructuredSelection::iterator i = m_View->m_CurrentSelection->Begin(); - i != m_View->m_CurrentSelection->End(); ++i) - { - // extract datatree node - if (mitk::DataNodeObject::Pointer nodeObj = i->Cast()) - { - mitk::TNodePredicateDataType::Pointer isBaseData(mitk::TNodePredicateDataType::New()); - mitk::TNodePredicateDataType::Pointer isPointSet(mitk::TNodePredicateDataType::New()); - mitk::NodePredicateNot::Pointer notPointSet = mitk::NodePredicateNot::New(isPointSet); - mitk::TNodePredicateDataType::Pointer isPlaneGeometryData(mitk::TNodePredicateDataType::New()); - mitk::NodePredicateNot::Pointer notPlaneGeometryData = mitk::NodePredicateNot::New(isPlaneGeometryData); - mitk::NodePredicateAnd::Pointer notPointSetAndNotPlaneGeometryData = mitk::NodePredicateAnd::New( notPointSet, notPlaneGeometryData ); - mitk::NodePredicateAnd::Pointer predicate = mitk::NodePredicateAnd::New( isBaseData, notPointSetAndNotPlaneGeometryData ); - - - mitk::DataStorage::SetOfObjects::ConstPointer setOfObjects = m_View->GetDataStorage()->GetSubset(predicate); - - mitk::DataNode::Pointer node = nodeObj->GetDataNode(); - - // only look at interesting types - for (mitk::DataStorage::SetOfObjects::ConstIterator nodeIt = setOfObjects->Begin() - ; nodeIt != setOfObjects->End(); ++nodeIt) // for each node - { - if(nodeIt->Value().GetPointer() == node.GetPointer()) - { - // was - compare() - // use contain to allow other Image types to be selected, i.e. a diffusion image - if ( (QString( node->GetData()->GetNameOfClass() ).contains("Image") ) - || (QString( node->GetData()->GetNameOfClass() ).contains("Surface") ) ) - { - // verify that the node selected by name is really an image or derived class - mitk::BaseData* _basedata = dynamic_cast( node->GetData() ); - - // one of the data - if (_basedata != nullptr ) - { - if( _basedata->GetTimeSteps() > 3 ) - { - m_View->m_Controls.m_StatusLabel->show(); - QMessageBox::information( NULL, "PointBasedRegistration", "Only 2D or 3D objects can be processed.", QMessageBox::Ok ); - return; - } - - // for first, allow image and surfaces to be selected - mitk::Image::Pointer input_image = dynamic_cast(node->GetData()); - mitk::Surface::Pointer input_surface = dynamic_cast(node->GetData()); - - if ( ( input_image.IsNotNull() || input_surface.IsNotNull() ) && foundFixedNode == false ) - { - fixedNode = node; - foundFixedNode = true; - } - else - { - // method deleted, for more information see bug-18492 - // m_View->SetImagesVisible(selection); - m_View->FixedSelected(fixedNode); - m_View->MovingSelected(node); - m_View->m_Controls.m_StatusLabel->hide(); - m_View->m_Controls.TextLabelFixed->show(); - m_View->m_Controls.m_FixedLabel->show(); - m_View->m_Controls.line2->show(); - m_View->m_Controls.m_FixedPointListWidget->show(); - m_View->m_Controls.TextLabelMoving->show(); - m_View->m_Controls.m_MovingLabel->show(); - m_View->m_Controls.line1->show(); - m_View->m_Controls.m_MovingPointListWidget->show(); - m_View->m_Controls.m_OpacityLabel->show(); - m_View->m_Controls.m_OpacitySlider->show(); - m_View->m_Controls.label->show(); - m_View->m_Controls.label_2->show(); - m_View->m_Controls.m_SwitchImages->show(); - m_View->m_Controls.m_ShowRedGreenValues->setEnabled(true); - } - } - } - - else - { - m_View->m_Controls.m_StatusLabel->show(); - return; - } - - } - } - } - } - if (m_View->m_FixedNode.IsNull() || m_View->m_MovingNode.IsNull()) - { - m_View->m_Controls.m_StatusLabel->show(); - } - } - } - else if (m_View->m_FixedNode.IsNull() || m_View->m_MovingNode.IsNull()) - { - m_View->m_Controls.m_StatusLabel->show(); - } - } - - void SelectionChanged(const IWorkbenchPart::Pointer& part, - const ISelection::ConstPointer& selection) override - { - // check, if selection comes from datamanager - if (part) - { - QString partname = part->GetPartName(); - if(partname == "Data Manager") - { - // apply selection - DoSelectionChanged(selection); - } - } - } - - QmitkPointBasedRegistrationView* m_View; -}; - - -QmitkPointBasedRegistrationView::QmitkPointBasedRegistrationView(QObject * /*parent*/, const char * /*name*/) -: QmitkFunctionality(), m_MultiWidget(NULL), m_FixedLandmarks(NULL), m_MovingLandmarks(NULL), m_MovingNode(NULL), -m_FixedNode(NULL), m_ShowRedGreen(false), m_Opacity(0.5), m_OriginalOpacity(1.0), m_Transformation(0), m_LastTransformMatrix(nullptr), m_HideFixedImage(false), m_HideMovingImage(false), -m_OldFixedLabel(""), m_OldMovingLabel(""), m_Deactivated (false), m_CurrentFixedLandmarksObserverID(0), m_CurrentMovingLandmarksObserverID(0) -{ - m_FixedLandmarksChangedCommand = itk::SimpleMemberCommand::New(); - m_FixedLandmarksChangedCommand->SetCallbackFunction(this, &QmitkPointBasedRegistrationView::updateFixedLandmarksList); - m_MovingLandmarksChangedCommand = itk::SimpleMemberCommand::New(); - m_MovingLandmarksChangedCommand->SetCallbackFunction(this, &QmitkPointBasedRegistrationView::updateMovingLandmarksList); - - this->GetDataStorage()->RemoveNodeEvent.AddListener(mitk::MessageDelegate1 ( this, &QmitkPointBasedRegistrationView::DataNodeHasBeenRemoved )); - -} - -QmitkPointBasedRegistrationView::~QmitkPointBasedRegistrationView() -{ - if(m_SelListener) - { - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) s->RemovePostSelectionListener(m_SelListener.data()); - } - if (m_FixedPointSetNode.IsNotNull()) - { - m_Controls.m_FixedPointListWidget->DeactivateInteractor(true); - m_FixedPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldFixedLabel)); - } - if (m_MovingPointSetNode.IsNotNull()) - { - m_Controls.m_MovingPointListWidget->DeactivateInteractor(true); - m_MovingPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldMovingLabel)); - } - m_Controls.m_FixedPointListWidget->SetPointSetNode(NULL); - m_Controls.m_MovingPointListWidget->SetPointSetNode(NULL); -} - -void QmitkPointBasedRegistrationView::CreateQtPartControl(QWidget* parent) -{ - m_Controls.setupUi(parent); - m_Parent->setEnabled(false); - m_Controls.m_MeanErrorLCD->hide(); - m_Controls.m_MeanError->hide(); - m_Controls.TextLabelFixed->hide(); - m_Controls.line2->hide(); - m_Controls.m_FixedPointListWidget->hide(); - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.m_MovingLabel->hide(); - m_Controls.line1->hide(); - m_Controls.m_MovingPointListWidget->hide(); - m_Controls.m_OpacityLabel->hide(); - m_Controls.m_OpacitySlider->hide(); - m_Controls.label->hide(); - m_Controls.label_2->hide(); - m_Controls.m_SwitchImages->hide(); - m_Controls.m_ShowRedGreenValues->setEnabled(false); - - this->CreateConnections(); - - // let the point set widget know about the multi widget (cross hair updates) - m_Controls.m_FixedPointListWidget->SetMultiWidget( m_MultiWidget ); - m_Controls.m_MovingPointListWidget->SetMultiWidget( m_MultiWidget ); -} - -void QmitkPointBasedRegistrationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_Parent->setEnabled(true); - m_MultiWidget = &stdMultiWidget; - m_MultiWidget->SetWidgetPlanesVisibility(true); - m_Controls.m_FixedPointListWidget->SetMultiWidget( m_MultiWidget ); - m_Controls.m_MovingPointListWidget->SetMultiWidget( m_MultiWidget ); -} - -void QmitkPointBasedRegistrationView::StdMultiWidgetNotAvailable() -{ - m_Parent->setEnabled(false); - m_MultiWidget = NULL; - m_Controls.m_FixedPointListWidget->SetMultiWidget( NULL ); - m_Controls.m_MovingPointListWidget->SetMultiWidget( NULL ); -} - -void QmitkPointBasedRegistrationView::CreateConnections() -{ - connect( (QObject*)(m_Controls.m_FixedPointListWidget), SIGNAL(EditPointSets(bool)), (QObject*)(m_Controls.m_MovingPointListWidget), SLOT(DeactivateInteractor(bool))); - connect( (QObject*)(m_Controls.m_MovingPointListWidget), SIGNAL(EditPointSets(bool)), (QObject*)(m_Controls.m_FixedPointListWidget), SLOT(DeactivateInteractor(bool))); - connect( (QObject*)(m_Controls.m_FixedPointListWidget), SIGNAL(EditPointSets(bool)), this, SLOT(HideMovingImage(bool))); - connect( (QObject*)(m_Controls.m_MovingPointListWidget), SIGNAL(EditPointSets(bool)), this, SLOT(HideFixedImage(bool))); - connect( (QObject*)(m_Controls.m_FixedPointListWidget), SIGNAL(PointListChanged()), this, SLOT(updateFixedLandmarksList())); - connect( (QObject*)(m_Controls.m_MovingPointListWidget), SIGNAL(PointListChanged()), this, SLOT(updateMovingLandmarksList())); - connect((QObject*)(m_Controls.m_Calculate),SIGNAL(clicked()),this,SLOT(calculate())); - connect((QObject*)(m_Controls.m_SwitchImages),SIGNAL(clicked()),this,SLOT(SwitchImages())); - connect((QObject*)(m_Controls.m_UndoTransformation),SIGNAL(clicked()),this,SLOT(UndoTransformation())); - connect((QObject*)(m_Controls.m_RedoTransformation),SIGNAL(clicked()),this,SLOT(RedoTransformation())); - connect((QObject*)(m_Controls.m_ShowRedGreenValues),SIGNAL(toggled(bool)),this,SLOT(showRedGreen(bool))); - connect((QObject*)(m_Controls.m_OpacitySlider),SIGNAL(valueChanged(int)),this,SLOT(OpacityUpdate(int))); - connect((QObject*)(m_Controls.m_SelectedTransformationClass),SIGNAL(activated(int)), this,SLOT(transformationChanged(int))); - connect((QObject*)(m_Controls.m_UseICP),SIGNAL(toggled(bool)), this,SLOT(checkCalculateEnabled())); - connect((QObject*)(m_Controls.m_UseICP),SIGNAL(toggled(bool)), this,SLOT(checkLandmarkError())); - connect((QObject*)(m_Controls.m_SaveLastTransformPushButton), SIGNAL(clicked()), this, SLOT(OnExportTransformButtonPushed() ) ); -} - -void QmitkPointBasedRegistrationView::Activated() -{ - - m_Deactivated = false; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Activated(); - this->clearTransformationLists(); - if (m_SelListener.isNull()) - { - m_SelListener.reset(new SelListenerPointBasedRegistration(this)); - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener(/*"org.mitk.views.datamanager",*/ m_SelListener.data()); - berry::ISelection::ConstPointer sel( - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); - m_CurrentSelection = sel.Cast(); - static_cast(m_SelListener.data())->DoSelectionChanged(sel); - } - this->OpacityUpdate(m_Controls.m_OpacitySlider->value()); - this->showRedGreen(m_Controls.m_ShowRedGreenValues->isChecked()); - - - -} - -void QmitkPointBasedRegistrationView::Visible() -{ - -} - -void QmitkPointBasedRegistrationView::Deactivated() -{ - - m_Deactivated = true; - if (m_FixedPointSetNode.IsNotNull()) - m_FixedPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldFixedLabel)); - m_Controls.m_FixedPointListWidget->SetPointSetNode(NULL); - m_Controls.m_FixedPointListWidget->DeactivateInteractor(true); - if (m_MovingPointSetNode.IsNotNull()) - m_MovingPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldMovingLabel)); - m_Controls.m_MovingPointListWidget->SetPointSetNode(NULL); - m_Controls.m_MovingPointListWidget->DeactivateInteractor(true); - this->setImageColor(false); - if (m_FixedNode.IsNotNull()) - m_FixedNode->SetOpacity(1.0); - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_OriginalOpacity); - } - this->clearTransformationLists(); - if (m_FixedPointSetNode.IsNotNull() && m_FixedLandmarks.IsNotNull() && m_FixedLandmarks->GetSize() == 0) - { - this->GetDataStorage()->Remove(m_FixedPointSetNode); - } - if (m_MovingPointSetNode.IsNotNull() && m_MovingLandmarks.IsNotNull() && m_MovingLandmarks->GetSize() == 0) - { - this->GetDataStorage()->Remove(m_MovingPointSetNode); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - m_FixedNode = NULL; - m_MovingNode = NULL; - if(m_FixedLandmarks.IsNotNull()) - m_FixedLandmarks->RemoveObserver(m_CurrentFixedLandmarksObserverID); - m_FixedLandmarks = NULL; - if(m_MovingLandmarks.IsNotNull()) - m_MovingLandmarks->RemoveObserver(m_CurrentMovingLandmarksObserverID); - m_MovingLandmarks = NULL; - m_FixedPointSetNode = NULL; - m_MovingPointSetNode = NULL; - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelFixed->hide(); - m_Controls.line2->hide(); - m_Controls.m_FixedPointListWidget->hide(); - m_Controls.m_MovingLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.line1->hide(); - m_Controls.m_MovingPointListWidget->hide(); - m_Controls.m_OpacityLabel->hide(); - m_Controls.m_OpacitySlider->hide(); - m_Controls.label->hide(); - m_Controls.label_2->hide(); - m_Controls.m_SwitchImages->hide(); - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) s->RemovePostSelectionListener(m_SelListener.data()); - m_SelListener.reset(); - -} - -void QmitkPointBasedRegistrationView::Hidden() -{ -} - - -void QmitkPointBasedRegistrationView::DataNodeHasBeenRemoved(const mitk::DataNode* node) -{ - if(node == m_FixedNode || node == m_MovingNode) - { - m_Controls.m_StatusLabel->show(); - m_Controls.TextLabelFixed->hide(); - m_Controls.m_FixedLabel->hide(); - m_Controls.line2->hide(); - m_Controls.m_FixedPointListWidget->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.m_MovingLabel->hide(); - m_Controls.line1->hide(); - m_Controls.m_MovingPointListWidget->hide(); - m_Controls.m_OpacityLabel->hide(); - m_Controls.m_OpacitySlider->hide(); - m_Controls.label->hide(); - m_Controls.label_2->hide(); - m_Controls.m_SwitchImages->hide(); - m_Controls.m_ShowRedGreenValues->setEnabled(false); - } - -} - -void QmitkPointBasedRegistrationView::FixedSelected(mitk::DataNode::Pointer fixedImage) -{ - if(m_FixedLandmarks.IsNotNull()) - m_FixedLandmarks->RemoveObserver(m_CurrentFixedLandmarksObserverID); - if (fixedImage.IsNotNull()) - { - if (m_FixedNode != fixedImage) - { - // remove changes on previous selected node - if (m_FixedNode.IsNotNull()) - { - this->setImageColor(false); - m_FixedNode->SetOpacity(1.0); - if (m_FixedPointSetNode.IsNotNull()) - { - m_FixedPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldFixedLabel)); - } - } - - // get selected node - m_FixedNode = fixedImage; - - - // force opacity 1.0 for surfaces, otherwise the point picking/interaction does not work properly - if( QString(m_FixedNode->GetData()->GetNameOfClass() ).contains("Surface") ) - m_FixedNode->SetOpacity(1.0); - else - m_FixedNode->SetOpacity(0.5); - - m_FixedNode->SetVisibility(true); - m_Controls.m_FixedLabel->setText(QString::fromStdString(m_FixedNode->GetName())); - m_Controls.m_FixedLabel->show(); - m_Controls.m_SwitchImages->show(); - m_Controls.TextLabelFixed->show(); - m_Controls.line2->show(); - m_Controls.m_FixedPointListWidget->show(); - mitk::ColorProperty::Pointer colorProperty; - colorProperty = dynamic_cast(m_FixedNode->GetProperty("color")); - if ( colorProperty.IsNotNull() ) - { - m_FixedColor = colorProperty->GetColor(); - } - this->setImageColor(m_ShowRedGreen); - - bool hasPointSetNode = false; - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_FixedNode); - unsigned long size; - size = children->Size(); - for (unsigned long i = 0; i < size; ++i) - { - mitk::StringProperty::Pointer nameProp = dynamic_cast(children->GetElement(i)->GetProperty("name")); - if(nameProp.IsNotNull() && nameProp->GetValueAsString()=="PointBasedRegistrationNode") - { - m_FixedPointSetNode=children->GetElement(i); - m_FixedLandmarks = dynamic_cast (m_FixedPointSetNode->GetData()); - this->GetDataStorage()->Remove(m_FixedPointSetNode); - hasPointSetNode = true; - break; - } - } - if (!hasPointSetNode) - { - m_FixedLandmarks = mitk::PointSet::New(); - m_FixedPointSetNode = mitk::DataNode::New(); - m_FixedPointSetNode->SetData(m_FixedLandmarks); - m_FixedPointSetNode->SetProperty("name", mitk::StringProperty::New("PointBasedRegistrationNode")); - } - m_FixedPointSetNode->GetStringProperty("label", m_OldFixedLabel); - m_FixedPointSetNode->SetProperty("label", mitk::StringProperty::New("F ")); - m_FixedPointSetNode->SetProperty("color", mitk::ColorProperty::New(0.0f, 1.0f, 1.0f)); - m_FixedPointSetNode->SetVisibility(true); - m_Controls.m_FixedPointListWidget->SetPointSetNode(m_FixedPointSetNode); - this->GetDataStorage()->Add(m_FixedPointSetNode, m_FixedNode); - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } - if (m_FixedPointSetNode.IsNull()) - { - m_FixedLandmarks = mitk::PointSet::New(); - m_FixedPointSetNode = mitk::DataNode::New(); - m_FixedPointSetNode->SetData(m_FixedLandmarks); - m_FixedPointSetNode->SetProperty("name", mitk::StringProperty::New("PointBasedRegistrationNode")); - - m_FixedPointSetNode->GetStringProperty("label", m_OldFixedLabel); - m_FixedPointSetNode->SetProperty("label", mitk::StringProperty::New("F ")); - m_FixedPointSetNode->SetProperty("color", mitk::ColorProperty::New(0.0f, 1.0f, 1.0f)); - m_FixedPointSetNode->SetVisibility(true); - m_Controls.m_FixedPointListWidget->SetPointSetNode(m_FixedPointSetNode); - this->GetDataStorage()->Add(m_FixedPointSetNode, m_FixedNode); - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } - } - else - { - m_FixedNode = NULL; - if (m_FixedPointSetNode.IsNotNull()) - m_FixedPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldFixedLabel)); - m_FixedPointSetNode = NULL; - m_FixedLandmarks = NULL; - m_Controls.m_FixedPointListWidget->SetPointSetNode(m_FixedPointSetNode); - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelFixed->hide(); - m_Controls.line2->hide(); - m_Controls.m_FixedPointListWidget->hide(); - m_Controls.m_SwitchImages->hide(); - } - if(m_FixedLandmarks.IsNotNull()) - m_CurrentFixedLandmarksObserverID = m_FixedLandmarks->AddObserver(itk::ModifiedEvent(), m_FixedLandmarksChangedCommand); -} - -void QmitkPointBasedRegistrationView::MovingSelected(mitk::DataNode::Pointer movingImage) -{ - if(m_MovingLandmarks.IsNotNull()) - m_MovingLandmarks->RemoveObserver(m_CurrentMovingLandmarksObserverID); - if (movingImage.IsNotNull()) - { - if (m_MovingNode != movingImage) - { - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_OriginalOpacity); - if (m_FixedNode == m_MovingNode) - m_FixedNode->SetOpacity(0.5); - this->setImageColor(false); - if (m_MovingNode != m_FixedNode) - { - m_MovingPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldMovingLabel)); - } - else - { - m_OldFixedLabel = m_OldMovingLabel; - } - } - if (m_MovingPointSetNode.IsNotNull()) - m_MovingPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldMovingLabel)); - m_MovingNode = movingImage; - m_MovingNode->SetVisibility(true); - - - // force opacity 1.0 for surfaces, otherwise the point picking/interaction does not work properly - if( QString(m_MovingNode->GetData()->GetNameOfClass() ).contains("Surface") ) - m_Opacity = 1.0; - - - m_Controls.m_MovingLabel->setText(QString::fromStdString(m_MovingNode->GetName())); - m_Controls.m_MovingLabel->show(); - m_Controls.TextLabelMoving->show(); - m_Controls.line1->show(); - m_Controls.m_MovingPointListWidget->show(); - m_Controls.m_OpacityLabel->show(); - m_Controls.m_OpacitySlider->show(); - m_Controls.label->show(); - m_Controls.label_2->show(); - mitk::ColorProperty::Pointer colorProperty; - colorProperty = dynamic_cast(m_MovingNode->GetProperty("color")); - if ( colorProperty.IsNotNull() ) - { - m_MovingColor = colorProperty->GetColor(); - } - this->setImageColor(m_ShowRedGreen); - m_MovingNode->GetFloatProperty("opacity", m_OriginalOpacity); - this->OpacityUpdate(m_Opacity); - bool hasPointSetNode = false; - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_MovingNode); - unsigned long size; - size = children->Size(); - for (unsigned long i = 0; i < size; ++i) - { - mitk::StringProperty::Pointer nameProp = dynamic_cast(children->GetElement(i)->GetProperty("name")); - if(nameProp.IsNotNull() && nameProp->GetValueAsString()=="PointBasedRegistrationNode") - { - m_MovingPointSetNode=children->GetElement(i); - m_MovingLandmarks = dynamic_cast (m_MovingPointSetNode->GetData()); - this->GetDataStorage()->Remove(m_MovingPointSetNode); - hasPointSetNode = true; - break; - } - } - if (!hasPointSetNode) - { - m_MovingLandmarks = mitk::PointSet::New(); - m_MovingPointSetNode = mitk::DataNode::New(); - m_MovingPointSetNode->SetData(m_MovingLandmarks); - m_MovingPointSetNode->SetProperty("name", mitk::StringProperty::New("PointBasedRegistrationNode")); - } - this->GetDataStorage()->Add(m_MovingPointSetNode, m_MovingNode); - m_MovingPointSetNode->GetStringProperty("label", m_OldMovingLabel); - m_MovingPointSetNode->SetProperty("label", mitk::StringProperty::New("M ")); - m_MovingPointSetNode->SetProperty("color", mitk::ColorProperty::New(1.0f, 1.0f, 0.0f)); - m_MovingPointSetNode->SetVisibility(true); - m_Controls.m_MovingPointListWidget->SetPointSetNode(m_MovingPointSetNode); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - this->clearTransformationLists(); - this->OpacityUpdate(m_Opacity); - } - if (m_MovingPointSetNode.IsNull()) - { - m_MovingLandmarks = mitk::PointSet::New(); - m_MovingPointSetNode = mitk::DataNode::New(); - m_MovingPointSetNode->SetData(m_MovingLandmarks); - m_MovingPointSetNode->SetProperty("name", mitk::StringProperty::New("PointBasedRegistrationNode")); - - m_MovingPointSetNode->GetStringProperty("label", m_OldMovingLabel); - m_MovingPointSetNode->SetProperty("label", mitk::StringProperty::New("M ")); - m_MovingPointSetNode->SetProperty("color", mitk::ColorProperty::New(1.0f, 1.0f, 0.0f)); - m_MovingPointSetNode->SetVisibility(true); - m_Controls.m_MovingPointListWidget->SetPointSetNode(m_MovingPointSetNode); - this->GetDataStorage()->Add(m_MovingPointSetNode, m_MovingNode); - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - - } - - - - - } - else - { - m_MovingNode = NULL; - if (m_MovingPointSetNode.IsNotNull()) - m_MovingPointSetNode->SetProperty("label", mitk::StringProperty::New(m_OldMovingLabel)); - m_MovingPointSetNode = NULL; - m_MovingLandmarks = NULL; - m_Controls.m_MovingPointListWidget->SetPointSetNode(m_MovingPointSetNode); - m_Controls.m_MovingLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.line1->hide(); - m_Controls.m_MovingPointListWidget->hide(); - m_Controls.m_OpacityLabel->hide(); - m_Controls.m_OpacitySlider->hide(); - m_Controls.label->hide(); - m_Controls.label_2->hide(); - } - if(m_MovingLandmarks.IsNotNull()) - m_CurrentMovingLandmarksObserverID = m_MovingLandmarks->AddObserver(itk::ModifiedEvent(), m_MovingLandmarksChangedCommand); -} - -void QmitkPointBasedRegistrationView::updateMovingLandmarksList() -{ - m_MovingLandmarks = dynamic_cast(m_MovingPointSetNode->GetData()); - - this->checkLandmarkError(); - this->CheckCalculate(); -} - -void QmitkPointBasedRegistrationView::updateFixedLandmarksList() -{ - m_FixedLandmarks = dynamic_cast(m_FixedPointSetNode->GetData()); - - this->checkLandmarkError(); - this->CheckCalculate(); -} - -void QmitkPointBasedRegistrationView::HideFixedImage(bool hide) -{ - m_HideFixedImage = hide; - if(m_FixedNode.IsNotNull()) - { - m_FixedNode->SetVisibility(!hide); - } - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkPointBasedRegistrationView::HideMovingImage(bool hide) -{ - m_HideMovingImage = hide; - - if(m_MovingNode.IsNotNull()) - { - m_MovingNode->SetVisibility(!hide); - } - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -bool QmitkPointBasedRegistrationView::CheckCalculate() -{ - if(( m_MovingPointSetNode.IsNull() )|| - ( m_FixedPointSetNode.IsNull()||m_FixedLandmarks.IsNull()||m_MovingLandmarks.IsNull()) ) - return false; - - if(m_MovingNode==m_FixedNode) - return false; - - return this->checkCalculateEnabled(); -} - -void QmitkPointBasedRegistrationView::UndoTransformation() -{ - if(!m_UndoPointsGeometryList.empty()) - { - mitk::BaseGeometry::Pointer movingLandmarksGeometry = m_MovingLandmarks->GetGeometry(0)->Clone(); - m_RedoPointsGeometryList.push_back(movingLandmarksGeometry.GetPointer()); - m_MovingLandmarks->SetGeometry(m_UndoPointsGeometryList.back()); - m_UndoPointsGeometryList.pop_back(); - //\FIXME when geometry is substituted the matrix referenced by the actor created by the mapper - //is still pointing to the old one. Workaround: delete mapper - m_MovingPointSetNode->SetMapper(1, NULL); - - mitk::BaseData::Pointer movingData = m_MovingNode->GetData(); - mitk::BaseGeometry::Pointer movingGeometry = movingData->GetGeometry(0)->Clone(); - m_RedoGeometryList.push_back(movingGeometry.GetPointer()); - movingData->SetGeometry(m_UndoGeometryList.back()); - m_UndoGeometryList.pop_back(); - //\FIXME when geometry is substituted the matrix referenced by the actor created by the mapper - //is still pointing to the old one. Workaround: delete mapper - m_MovingNode->SetMapper(1, NULL); - mitk::RenderingManager::GetInstance()->RequestUpdate(m_MultiWidget->mitkWidget4->GetRenderWindow()); - - movingData->GetTimeGeometry()->Update(); - m_MovingLandmarks->GetTimeGeometry()->Update(); - m_Controls.m_RedoTransformation->setEnabled(true); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - this->checkLandmarkError(); - } - if(!m_UndoPointsGeometryList.empty()) - { - m_Controls.m_UndoTransformation->setEnabled(true); - m_Controls.m_SaveLastTransformPushButton->setEnabled(true); - } - else - { - m_Controls.m_UndoTransformation->setEnabled(false); - m_Controls.m_SaveLastTransformPushButton->setEnabled(false); - } -} - -void QmitkPointBasedRegistrationView::RedoTransformation() -{ - if(!m_RedoPointsGeometryList.empty()) - { - mitk::BaseGeometry::Pointer movingLandmarksGeometry = m_MovingLandmarks->GetGeometry(0)->Clone(); - m_UndoPointsGeometryList.push_back(movingLandmarksGeometry.GetPointer()); - m_MovingLandmarks->SetGeometry(m_RedoPointsGeometryList.back()); - m_RedoPointsGeometryList.pop_back(); - //\FIXME when geometry is substituted the matrix referenced by the actor created by the mapper - //is still pointing to the old one. Workaround: delete mapper - m_MovingPointSetNode->SetMapper(1, NULL); - - mitk::BaseData::Pointer movingData = m_MovingNode->GetData(); - mitk::BaseGeometry::Pointer movingGeometry = movingData->GetGeometry(0)->Clone(); - m_UndoGeometryList.push_back(movingGeometry.GetPointer()); - movingData->SetGeometry(m_RedoGeometryList.back()); - m_RedoGeometryList.pop_back(); - //\FIXME when geometry is substituted the matrix referenced by the actor created by the mapper - //is still pointing to the old one. Workaround: delete mapper - m_MovingNode->SetMapper(1, NULL); - mitk::RenderingManager::GetInstance()->RequestUpdate(m_MultiWidget->mitkWidget4->GetRenderWindow()); - - movingData->GetTimeGeometry()->Update(); - m_MovingLandmarks->GetTimeGeometry()->Update(); - m_Controls.m_UndoTransformation->setEnabled(true); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - this->checkLandmarkError(); - } - if(!m_RedoPointsGeometryList.empty()) - { - m_Controls.m_RedoTransformation->setEnabled(true); - } - else - { - m_Controls.m_RedoTransformation->setEnabled(false); - } -} - -void QmitkPointBasedRegistrationView::showRedGreen(bool redGreen) -{ - m_ShowRedGreen = redGreen; - this->setImageColor(m_ShowRedGreen); -} - -void QmitkPointBasedRegistrationView::setImageColor(bool redGreen) -{ - if (!redGreen && m_FixedNode.IsNotNull()) - { - m_FixedNode->SetColor(m_FixedColor); - } - if (!redGreen && m_MovingNode.IsNotNull()) - { - m_MovingNode->SetColor(m_MovingColor); - } - if (redGreen && m_FixedNode.IsNotNull()) - { - m_FixedNode->SetColor(1.0f, 0.0f, 0.0f); - } - if (redGreen && m_MovingNode.IsNotNull()) - { - m_MovingNode->SetColor(0.0f, 1.0f, 0.0f); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkPointBasedRegistrationView::OpacityUpdate(float opacity) -{ - if (opacity > 1) - { - opacity = opacity/100.0f; - } - m_Opacity = opacity; - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_Opacity); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkPointBasedRegistrationView::OpacityUpdate(int opacity) -{ - float fValue = ((float)opacity)/100.0f; - this->OpacityUpdate(fValue); -} - -void QmitkPointBasedRegistrationView::clearTransformationLists() -{ - m_Controls.m_UndoTransformation->setEnabled(false); - m_Controls.m_RedoTransformation->setEnabled(false); - m_Controls.m_SaveLastTransformPushButton->setEnabled(false); - m_Controls.m_MeanErrorLCD->hide(); - m_Controls.m_MeanError->hide(); - m_UndoGeometryList.clear(); - m_UndoPointsGeometryList.clear(); - m_RedoGeometryList.clear(); - m_RedoPointsGeometryList.clear(); -} - -void QmitkPointBasedRegistrationView::checkLandmarkError() -{ - double totalDist = 0, dist = 0, dist2 = 0; - mitk::Point3D point1, point2, point3; - double p1[3], p2[3]; - if(m_Transformation < 3) - { - if (m_Controls.m_UseICP->isChecked()) - { - if (m_MovingLandmarks.IsNotNull() && m_FixedLandmarks.IsNotNull()&& m_MovingLandmarks->GetSize() != 0 && m_FixedLandmarks->GetSize() != 0) - { - for(int pointId = 0; pointId < m_MovingLandmarks->GetSize(); ++pointId) - { - point1 = m_MovingLandmarks->GetPoint(pointId); - point2 = m_FixedLandmarks->GetPoint(0); - p1[0] = point1[0]; p1[1] = point1[1]; p1[2] = point1[2]; - p2[0] = point2[0]; p2[1] = point2[1]; p2[2] = point2[2]; - dist = vtkMath::Distance2BetweenPoints(p1, p2); - for(int pointId2 = 1; pointId2 < m_FixedLandmarks->GetSize(); ++pointId2) - { - point2 = m_FixedLandmarks->GetPoint(pointId2); - p1[0] = point1[0]; p1[1] = point1[1]; p1[2] = p1[2]; - p2[0] = point2[0]; p2[1] = point2[1]; p2[2] = p2[2]; - dist2 = vtkMath::Distance2BetweenPoints(p1, p2); - if (dist2 < dist) - { - dist = dist2; - } - } - totalDist += dist; - } - m_Controls.m_MeanErrorLCD->display(sqrt(totalDist/m_FixedLandmarks->GetSize())); - m_Controls.m_MeanErrorLCD->show(); - m_Controls.m_MeanError->show(); - } - else - { - m_Controls.m_MeanErrorLCD->hide(); - m_Controls.m_MeanError->hide(); - } - } - else - { - if (m_MovingLandmarks.IsNotNull() && m_FixedLandmarks.IsNotNull() && m_MovingLandmarks->GetSize() != 0 && m_FixedLandmarks->GetSize() != 0 && m_MovingLandmarks->GetSize() == m_FixedLandmarks->GetSize()) - { - for(int pointId = 0; pointId < m_MovingLandmarks->GetSize(); ++pointId) - { - point1 = m_MovingLandmarks->GetPoint(pointId); - point2 = m_FixedLandmarks->GetPoint(pointId); - p1[0] = point1[0]; p1[1] = point1[1]; p1[2] = point1[2]; - p2[0] = point2[0]; p2[1] = point2[1]; p2[2] = point2[2]; - totalDist += vtkMath::Distance2BetweenPoints(p1, p2); - } - m_Controls.m_MeanErrorLCD->display(sqrt(totalDist/m_FixedLandmarks->GetSize())); - m_Controls.m_MeanErrorLCD->show(); - m_Controls.m_MeanError->show(); - } - else - { - m_Controls.m_MeanErrorLCD->hide(); - m_Controls.m_MeanError->hide(); - } - } - } - else - { - if (m_MovingLandmarks.IsNotNull() && m_FixedLandmarks.IsNotNull() && m_MovingLandmarks->GetSize() != 0 && m_FixedLandmarks->GetSize() != 0 && m_MovingLandmarks->GetSize() == m_FixedLandmarks->GetSize()) - { - for(int pointId = 0; pointId < m_MovingLandmarks->GetSize(); ++pointId) - { - point1 = m_MovingLandmarks->GetPoint(pointId); - point2 = m_FixedLandmarks->GetPoint(pointId); - p1[0] = point1[0]; p1[1] = point1[1]; p1[2] = point1[2]; - p2[0] = point2[0]; p2[1] = point2[1]; p2[2] = point2[2]; - totalDist += vtkMath::Distance2BetweenPoints(p1, p2); - } - m_Controls.m_MeanErrorLCD->display(sqrt(totalDist/m_FixedLandmarks->GetSize())); - m_Controls.m_MeanErrorLCD->show(); - m_Controls.m_MeanError->show(); - } - else - { - m_Controls.m_MeanErrorLCD->hide(); - m_Controls.m_MeanError->hide(); - } - } -} - -void QmitkPointBasedRegistrationView::transformationChanged(int transform) -{ - m_Transformation = transform; - this->checkCalculateEnabled(); - this->checkLandmarkError(); -} - -// ICP with vtkLandmarkTransformation -void QmitkPointBasedRegistrationView::calculateLandmarkbasedWithICP() -{ - if(CheckCalculate()) - { - mitk::BaseGeometry::Pointer pointsGeometry = m_MovingLandmarks->GetGeometry(0); - mitk::BaseGeometry::Pointer movingLandmarksGeometry = m_MovingLandmarks->GetGeometry(0)->Clone(); - m_UndoPointsGeometryList.push_back(movingLandmarksGeometry.GetPointer()); - - mitk::BaseData::Pointer originalData = m_MovingNode->GetData(); - mitk::BaseGeometry::Pointer originalDataGeometry = originalData->GetGeometry(0)->Clone(); - m_UndoGeometryList.push_back(originalDataGeometry.GetPointer()); - - vtkIdType pointId; - vtkPoints* vPointsSource=vtkPoints::New(); - vtkCellArray* vCellsSource=vtkCellArray::New(); - for(pointId=0; pointIdGetSize();++pointId) - { - mitk::Point3D pointSource=m_MovingLandmarks->GetPoint(pointId); - vPointsSource->InsertNextPoint(pointSource[0],pointSource[1],pointSource[2]); - vCellsSource->InsertNextCell(1, &pointId); - } - - vtkPoints* vPointsTarget=vtkPoints::New(); - vtkCellArray* vCellsTarget = vtkCellArray::New(); - for(pointId=0; pointIdGetSize();++pointId) - { - mitk::Point3D pointTarget=m_FixedLandmarks->GetPoint(pointId); - vPointsTarget->InsertNextPoint(pointTarget[0],pointTarget[1],pointTarget[2]); - vCellsTarget->InsertNextCell(1, &pointId); - } - - vtkPolyData* vPointSetSource=vtkPolyData::New(); - vtkPolyData* vPointSetTarget=vtkPolyData::New(); - - vPointSetTarget->SetPoints(vPointsTarget); - vPointSetTarget->SetVerts(vCellsTarget); - vPointSetSource->SetPoints(vPointsSource); - vPointSetSource->SetVerts(vCellsSource); - - vtkIterativeClosestPointTransform * icp=vtkIterativeClosestPointTransform::New(); - icp->SetCheckMeanDistance(1); - icp->SetSource(vPointSetSource); - icp->SetTarget(vPointSetTarget); - icp->SetMaximumNumberOfIterations(50); - icp->StartByMatchingCentroidsOn(); - vtkLandmarkTransform * transform=icp->GetLandmarkTransform(); - if(m_Transformation==0) - { - transform->SetModeToRigidBody(); - } - if(m_Transformation==1) - { - transform->SetModeToSimilarity(); - } - if(m_Transformation==2) - { - transform->SetModeToAffine(); - } - - vtkMatrix4x4 * matrix=icp->GetMatrix(); - - double determinant = fabs(matrix->Determinant()); - if((determinant < mitk::eps) || (determinant > 100) || (determinant < 0.01) - || (determinant==itk::NumericTraits::infinity()) - || (determinant==itk::NumericTraits::quiet_NaN()) - || (determinant==itk::NumericTraits::signaling_NaN()) - || (determinant==-itk::NumericTraits::infinity()) - || (determinant==-itk::NumericTraits::quiet_NaN()) - || (determinant==-itk::NumericTraits::signaling_NaN()) - || (!(determinant <= 0) && !(determinant > 0))) - { - QMessageBox msgBox; - msgBox.setText("Suspicious determinant of matrix calculated by ICP.\n" - "Please select more points or other points!" ); - msgBox.exec(); - return; - } - - pointsGeometry->Compose(matrix); - m_MovingLandmarks->GetTimeGeometry()->Update(); - - mitk::BaseData::Pointer movingData = m_MovingNode->GetData(); - mitk::BaseGeometry::Pointer movingGeometry = movingData->GetGeometry(0); - movingGeometry->Compose(matrix); - movingData->GetTimeGeometry()->Update(); - m_Controls.m_UndoTransformation->setEnabled(true); - m_Controls.m_RedoTransformation->setEnabled(false); - m_Controls.m_SaveLastTransformPushButton->setEnabled(true); - m_RedoGeometryList.clear(); - m_RedoPointsGeometryList.clear(); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - this->checkLandmarkError(); - } -} - -// only vtkLandmarkTransformation -void QmitkPointBasedRegistrationView::calculateLandmarkbased() -{ - if(CheckCalculate()) - { - mitk::BaseGeometry::Pointer pointsGeometry = m_MovingLandmarks->GetGeometry(0); - mitk::BaseGeometry::Pointer movingLandmarksGeometry = m_MovingLandmarks->GetGeometry(0)->Clone(); - m_UndoPointsGeometryList.push_back(movingLandmarksGeometry.GetPointer()); - - mitk::BaseData::Pointer originalData = m_MovingNode->GetData(); - mitk::BaseGeometry::Pointer originalDataGeometry = originalData->GetGeometry(0)->Clone(); - m_UndoGeometryList.push_back(originalDataGeometry.GetPointer()); - - vtkIdType pointId; - vtkPoints* vPointsSource=vtkPoints::New(); - for(pointId = 0; pointId < m_MovingLandmarks->GetSize(); ++pointId) - { - mitk::Point3D sourcePoint = m_MovingLandmarks->GetPoint(pointId); - vPointsSource->InsertNextPoint(sourcePoint[0],sourcePoint[1],sourcePoint[2]); - } - vtkPoints* vPointsTarget=vtkPoints::New(); - for(pointId=0; pointIdGetSize();++pointId) - { - mitk::Point3D targetPoint=m_FixedLandmarks->GetPoint(pointId); - vPointsTarget->InsertNextPoint(targetPoint[0],targetPoint[1],targetPoint[2]); - } - - vtkLandmarkTransform * transform= vtkLandmarkTransform::New(); - transform->SetSourceLandmarks(vPointsSource); - transform->SetTargetLandmarks(vPointsTarget); - if(m_Transformation==0) - { - transform->SetModeToRigidBody(); - } - if(m_Transformation==1) - { - transform->SetModeToSimilarity(); - } - if(m_Transformation==2) - { - transform->SetModeToAffine(); - } - vtkMatrix4x4 * matrix=transform->GetMatrix(); - - m_LastTransformMatrix = matrix->NewInstance(); - m_LastTransformMatrix->DeepCopy( matrix ); - - - double determinant = fabs(matrix->Determinant()); - if((determinant < mitk::eps) || (determinant > 100) || (determinant < 0.01) - || (determinant==itk::NumericTraits::infinity()) - || (determinant==itk::NumericTraits::quiet_NaN()) - || (determinant==itk::NumericTraits::signaling_NaN()) - || (determinant==-itk::NumericTraits::infinity()) - || (determinant==-itk::NumericTraits::quiet_NaN()) - || (determinant==-itk::NumericTraits::signaling_NaN()) - || (!(determinant <= 0) && !(determinant > 0))) - { - QMessageBox msgBox; - msgBox.setText("Suspicious determinant of matrix calculated.\n" - "Please select more points or other points!" ); - msgBox.exec(); - return; - } - pointsGeometry->Compose(matrix); - m_MovingLandmarks->GetTimeGeometry()->Update(); - - mitk::BaseData::Pointer movingData = m_MovingNode->GetData(); - mitk::BaseGeometry::Pointer movingGeometry = movingData->GetGeometry(0); - movingGeometry->Compose(matrix); - movingData->GetTimeGeometry()->Update(); - m_Controls.m_UndoTransformation->setEnabled(true); - m_Controls.m_SaveLastTransformPushButton->setEnabled(true); - m_Controls.m_RedoTransformation->setEnabled(false); - m_RedoGeometryList.clear(); - m_RedoPointsGeometryList.clear(); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - this->checkLandmarkError(); - } -} - -void QmitkPointBasedRegistrationView::calculateLandmarkWarping() -{ - mitk::LandmarkWarping* registration = new mitk::LandmarkWarping(); - - mitk::LandmarkWarping::FixedImageType::Pointer fixedImage = mitk::LandmarkWarping::FixedImageType::New(); - mitk::Image::Pointer fimage = dynamic_cast(m_FixedNode->GetData()); - mitk::LandmarkWarping::MovingImageType::Pointer movingImage = mitk::LandmarkWarping::MovingImageType::New(); - mitk::Image::Pointer mimage = dynamic_cast(m_MovingNode->GetData()); - if (fimage.IsNotNull() && /*fimage->GetDimension() == 2 || */ fimage->GetDimension() == 3 && mimage.IsNotNull() && mimage->GetDimension() == 3) - { - mitk::CastToItkImage(fimage, fixedImage); - mitk::CastToItkImage(mimage, movingImage); - - registration->SetFixedImage(fixedImage); - registration->SetMovingImage(movingImage); - unsigned int pointId; - mitk::Point3D sourcePoint, targetPoint; - mitk::LandmarkWarping::LandmarkContainerType::Pointer fixedLandmarks = mitk::LandmarkWarping::LandmarkContainerType::New(); - mitk::LandmarkWarping::LandmarkPointType point; - for(pointId = 0; pointId < (unsigned int)m_FixedLandmarks->GetSize(); ++pointId) - { - fimage->GetGeometry(0)->WorldToItkPhysicalPoint(m_FixedLandmarks->GetPoint(pointId), point); - fixedLandmarks->InsertElement( pointId, point); - } - mitk::LandmarkWarping::LandmarkContainerType::Pointer movingLandmarks = mitk::LandmarkWarping::LandmarkContainerType::New(); - for(pointId = 0; pointId < (unsigned int)m_MovingLandmarks->GetSize(); ++pointId) - { - mitk::BaseData::Pointer fixedData = m_FixedNode->GetData(); - mitk::BaseGeometry::Pointer fixedGeometry = fixedData->GetGeometry(0); - fixedGeometry->WorldToItkPhysicalPoint(m_MovingLandmarks->GetPoint(pointId), point); - movingLandmarks->InsertElement( pointId, point); - } - registration->SetLandmarks(fixedLandmarks.GetPointer(), movingLandmarks.GetPointer()); - mitk::LandmarkWarping::MovingImageType::Pointer output = registration->Register(); - if (output.IsNotNull()) - { - mitk::Image::Pointer image = mitk::Image::New(); - mitk::CastToMitkImage(output, image); - m_MovingNode->SetData(image); - mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); - mitk::LevelWindow levelWindow; - levelWindow.SetAuto( image ); - levWinProp->SetLevelWindow(levelWindow); - m_MovingNode->GetPropertyList()->SetProperty("levelwindow",levWinProp); - movingLandmarks = registration->GetTransformedTargetLandmarks(); - mitk::PointSet::PointDataIterator it; - it = m_MovingLandmarks->GetPointSet()->GetPointData()->Begin(); - for(pointId=0; pointIdSize();++pointId, ++it) - { - int position = it->Index(); - mitk::PointSet::PointType pt = m_MovingLandmarks->GetPoint(position); - mitk::Point3D undoPoint = ( pt ); - point = movingLandmarks->GetElement(pointId); - fimage->GetGeometry(0)->ItkPhysicalPointToWorld(point, pt); - mitk::PointOperation* doOp = new mitk::PointOperation(mitk::OpMOVE, pt, position); - //undo operation - mitk::PointOperation* undoOp = new mitk::PointOperation(mitk::OpMOVE, undoPoint, position); - mitk::OperationEvent* operationEvent = new mitk::OperationEvent(m_MovingLandmarks, doOp, undoOp, "Move point"); - mitk::OperationEvent::IncCurrObjectEventId(); - mitk::UndoController::GetCurrentUndoModel()->SetOperationEvent(operationEvent); - //execute the Operation - m_MovingLandmarks->ExecuteOperation(doOp); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - this->clearTransformationLists(); - this->checkLandmarkError(); - } - } -} - -bool QmitkPointBasedRegistrationView::checkCalculateEnabled() -{ - if (m_FixedLandmarks.IsNotNull() && m_MovingLandmarks.IsNotNull()) - { - int fixedPoints = m_FixedLandmarks->GetSize(); - int movingPoints = m_MovingLandmarks->GetSize(); - if (m_Transformation == 0 || m_Transformation == 1 || m_Transformation == 2) - { - if (m_Controls.m_UseICP->isChecked()) - { - if((movingPoints > 0 && fixedPoints > 0)) - { - m_Controls.m_Calculate->setEnabled(true); - return true; - } - else - { - m_Controls.m_Calculate->setEnabled(false); - return false; - } - } - else - { - if ((movingPoints == fixedPoints) && movingPoints > 0) - { - m_Controls.m_Calculate->setEnabled(true); - return true; - } - else - { - m_Controls.m_Calculate->setEnabled(false); - return false; - } - } - } - else - { - m_Controls.m_Calculate->setEnabled(true); - return true; - } - } - else - { - return false; - } -} - -void QmitkPointBasedRegistrationView::calculate() -{ - if (m_Transformation == 0 || m_Transformation == 1 || m_Transformation == 2) - { - if (m_Controls.m_UseICP->isChecked()) - { - if (m_MovingLandmarks->GetSize() == 1 && m_FixedLandmarks->GetSize() == 1) - { - this->calculateLandmarkbased(); - } - else - { - this->calculateLandmarkbasedWithICP(); - } - } - else - { - this->calculateLandmarkbased(); - } - } - else - { - this->calculateLandmarkWarping(); - } -} - -void QmitkPointBasedRegistrationView::SwitchImages() -{ - mitk::DataNode::Pointer newMoving = m_FixedNode; - mitk::DataNode::Pointer newFixed = m_MovingNode; - this->FixedSelected(newFixed); - this->MovingSelected(newMoving); -} - -void QmitkPointBasedRegistrationView::OnExportTransformButtonPushed() -{ - // handle transform export - QString filename = QFileDialog::getSaveFileName(0, "Save transform file as plain matrix", "", ".txt"); - QFile f( filename ); - f.open( QIODevice::WriteOnly ); - - // write out text - QTextStream outstream(&f); - outstream << "# Plain text transform matrix " << "\n" << "# Saved from the PointBasedRegistration Plugin \n"; - - std::stringstream matrix_ss; - m_LastTransformMatrix->Print( matrix_ss ); - outstream << matrix_ss.str().c_str(); - - f.close(); -} - diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationView.h b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationView.h deleted file mode 100644 index 4f151eec53..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationView.h +++ /dev/null @@ -1,259 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#if !defined(QMITK_POINTBASEDREGISTRATION_H__INCLUDED) -#define QMITK_POINTBASEDREGISTRATION_H__INCLUDED - -#include "QmitkFunctionality.h" - -#include "berryISelectionListener.h" -#include "berryIStructuredSelection.h" - -//#include "mitkTestingConfig.h" // IMPORTANT: this defines or undefines BUILD_TESTING ! - -#include -#include -#include -//#include "QmitkMessageBoxHelper.h" -#include "ui_QmitkPointBasedRegistrationViewControls.h" - -#include - -/*! -\brief The PointBasedRegistration functionality is used to perform point based registration. - -This functionality allows you to register 2D as well as 3D images in a rigid and deformable manner via corresponding -PointSets. Register means to align two images, so that they become as similar as possible. -Therefore you have to set corresponding points in both images, which will be matched. The movement, which has to be -performed on the points to align them will be performed on the moving image as well. The result is shown in the multi-widget. - -For more informations see: \ref QmitkPointBasedRegistrationUserManual - -\sa QmitkFunctionality -\ingroup Functionalities -\ingroup PointBasedRegistration -*/ - -class REGISTRATION_EXPORT QmitkPointBasedRegistrationView : public QmitkFunctionality -{ - - friend struct SelListenerPointBasedRegistration; - - Q_OBJECT - -public: - - static const std::string VIEW_ID; - - /*! - \brief Default constructor - */ - QmitkPointBasedRegistrationView(QObject *parent=0, const char *name=0); - - /*! - \brief Default destructor - */ - virtual ~QmitkPointBasedRegistrationView(); - - /*! - \brief method for creating the applications main widget - */ - virtual void CreateQtPartControl(QWidget *parent) override; - - /*! - \brief Sets the StdMultiWidget and connects it to the functionality. - */ - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - - /*! - \brief Removes the StdMultiWidget and disconnects it from the functionality. - */ - virtual void StdMultiWidgetNotAvailable() override; - - /*! - \brief Method for creating the connections of main and control widget - */ - virtual void CreateConnections(); - - virtual void Activated() override; - virtual void Deactivated() override; - virtual void Visible() override; - virtual void Hidden() override; - - void DataNodeHasBeenRemoved(const mitk::DataNode* node); - - protected slots: - - /*! - \brief Sets the fixed Image according to TreeNodeSelector widget - */ - void FixedSelected(mitk::DataNode::Pointer fixedImage); - - /*! - \brief Sets the moving Image according to TreeNodeSelector widget - */ - void MovingSelected(mitk::DataNode::Pointer movingImage); - - /*! - \brief Calculates registration with vtkLandmarkTransform - */ - void calculateLandmarkbased(); - - /*! - \brief Calculates registration with itkLandmarkWarping - */ - void calculateLandmarkWarping(); - - /*! - \brief Calculates registration with ICP and vtkLandmarkTransform - */ - void calculateLandmarkbasedWithICP(); - - /*! - \brief lets the fixed image become invisible and the moving image visible - */ - void HideMovingImage(bool hide); - - /*! - \brief lets the moving image become invisible and the fixed image visible - */ - void HideFixedImage(bool hide); - - /*! - \brief Checks if registration is possible - */ - bool CheckCalculate(); - - /*! - \brief Performs an undo for the last transform. - */ - void UndoTransformation(); - - /*! - \brief Performs a redo for the last undo transform. - */ - void RedoTransformation(); - - /*! - \brief Stores whether the image will be shown in grayvalues or in red for fixed image and green for moving image - - @param show if true, then images will be shown in red and green - */ - void showRedGreen(bool show); - - /*! - \brief Sets the selected opacity for moving image - - @param opacity the selected opacity - */ - void OpacityUpdate(float opacity); - - /*! - \brief Sets the selected opacity for moving image - - @param opacity the selected opacity - */ - void OpacityUpdate(int opacity); - - /*! - \brief Updates the moving landmarks - */ - void updateMovingLandmarksList(); - - /*! - \brief Updates the fixed landmarks - */ - void updateFixedLandmarksList(); - - /*! - \brief Sets the images to gray values or fixed image to red and moving image to green - - @param redGreen if true, then images will be shown in red and green - */ - void setImageColor(bool redGreen); - - /*! - \brief Clears the undo and redo transformation lists. - */ - void clearTransformationLists(); - - /*! - \brief Calculates the landmark error for the selected transformation. - */ - void checkLandmarkError(); - - /*! - \brief Changes the transformation type and calls checkLandmarkError(). - */ - void transformationChanged(int transform); - - /*! - \brief Checks whether the registration can be performed. - */ - bool checkCalculateEnabled(); - - /*! - \brief Performs the registration. - */ - void calculate(); - - void SwitchImages(); - - void OnExportTransformButtonPushed(); - -protected: - - QScopedPointer m_SelListener; - berry::IStructuredSelection::ConstPointer m_CurrentSelection; - - /*! - * default main widget containing 4 windows showing 3 - * orthogonal slices of the volume and a 3d render window - */ - QmitkStdMultiWidget * m_MultiWidget; - - /*! - * control widget to make all changes for point based registration - */ - Ui::QmitkPointBasedRegistrationControls m_Controls; - mitk::PointSet::Pointer m_FixedLandmarks; - mitk::PointSet::Pointer m_MovingLandmarks; - mitk::DataNode::Pointer m_MovingPointSetNode; - mitk::DataNode::Pointer m_FixedPointSetNode; - mitk::DataNode::Pointer m_MovingNode; - mitk::DataNode::Pointer m_FixedNode; - std::list m_UndoGeometryList; - std::list m_UndoPointsGeometryList; - std::list m_RedoGeometryList; - std::list m_RedoPointsGeometryList; - bool m_ShowRedGreen; - float m_Opacity; - float m_OriginalOpacity; - mitk::Color m_FixedColor; - mitk::Color m_MovingColor; - int m_Transformation; - vtkMatrix4x4 * m_LastTransformMatrix; - bool m_HideFixedImage; - bool m_HideMovingImage; - std::string m_OldFixedLabel; - std::string m_OldMovingLabel; - bool m_Deactivated; - int m_CurrentFixedLandmarksObserverID; - int m_CurrentMovingLandmarksObserverID; - itk::SimpleMemberCommand::Pointer m_FixedLandmarksChangedCommand; - itk::SimpleMemberCommand::Pointer m_MovingLandmarksChangedCommand; -}; -#endif // !defined(QMITK_POINTBASEDREGISTRATION_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationViewControls.ui b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationViewControls.ui deleted file mode 100644 index 60243b102d..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkPointBasedRegistrationViewControls.ui +++ /dev/null @@ -1,711 +0,0 @@ - - - QmitkPointBasedRegistrationControls - - - - 0 - 0 - 506 - 914 - - - - - 0 - 0 - - - - - 0 - 0 - - - - PointBasedRegistration - - - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - - - 118 - 116 - 108 - - - - - - - - - - - You have to select two images from Data Manager using CTRL + left click! - - - - - - - Switch fixed and moving image - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Fixed Data - - - true - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - 50 - false - - - - Dataset: - - - false - - - - - - - - - - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - - - - - 75 - true - - - - Moving Data - - - true - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - 50 - false - - - - Dataset: - - - false - - - - - - - - - - - - - - - - - - - 50 - false - - - - Moving Image Opacity: - - - false - - - - - - - - 50 - false - - - - 0% - - - - - - - - 0 - 0 - - - - 100 - - - 50 - - - Qt::Horizontal - - - - - - - - 50 - false - - - - 100% - - - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - - - - - 75 - true - - - - Display Options - - - true - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 50 - false - - - - Show Images Red/Green - - - - - - - - - - - 75 - true - - - - Registration - - - true - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - 50 - false - - - - Method: - - - false - - - - - - - - 0 - 0 - - - - - 50 - false - - - - - Rigid - - - - - Similarity - - - - - Affine - - - - - LandmarkWarping - - - - - - - - - - - 50 - false - - - - Use ICP (order of landmarks doesn't matter) - - - - - - - false - - - - 0 - 0 - - - - - 150 - 0 - - - - - 50 - false - - - - Register - - - - :/QmitkPointBasedRegistrationView/PointBasedRegistration.xpm:/QmitkPointBasedRegistrationView/PointBasedRegistration.xpm - - - - - - - - - - 0 - 0 - - - - - 50 - false - - - - Error between Landmarks (RMS): - - - false - - - - - - - - 0 - 0 - - - - - 50 - false - - - - QFrame::NoFrame - - - QFrame::Raised - - - false - - - 9 - - - QLCDNumber::Flat - - - 0.000000000000000 - - - 0 - - - - - - - - - - - false - - - - 0 - 0 - - - - - 50 - false - - - - Undo Transformation - - - - :/org.mitk.gui.qt.ext/edit-undo.png:/org.mitk.gui.qt.ext/edit-undo.png - - - - - - - false - - - - 0 - 0 - - - - - 50 - false - - - - Redo Transformation - - - - :/org.mitk.gui.qt.ext/edit-redo.png:/org.mitk.gui.qt.ext/edit-redo.png - - - - - - - - - 10 - - - - - - 50 - false - - - - Export last registration matrix: - - - - - - - false - - - - 50 - false - - - - Save Transform - - - - - - - - - Qt::Horizontal - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - QSizePolicy::Ignored - - - - 20 - 40 - - - - - - - - - - QmitkPointListWidget - QWidget -
QmitkPointListWidget.h
-
-
- - mitkDataNode.h - mitkPointSet.h - mitkInteractionConst.h - mitkBaseData.h - - - - - -
diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelector.ui b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelector.ui deleted file mode 100644 index 0fb5fd08a2..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelector.ui +++ /dev/null @@ -1,379 +0,0 @@ - - - QmitkRigidRegistrationSelector - - - - 0 - 0 - 130 - 302 - - - - - 0 - 0 - - - - QmitkRigidRegistrationSelector - - - - 0 - - - 0 - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - - 75 - true - - - - Transform - - - true - - - true - - - false - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - false - - - - - - - true - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - 75 - true - - - - Metric - - - true - - - true - - - false - - - - - - true - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - false - - - - - - - - - - - - - - - - - - - 75 - true - - - - Optimizer - - - true - - - true - - - false - - - - 6 - - - 9 - - - - - true - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - false - - - - - - - 0 - - - - - - - - - - - - - - - 75 - true - - - - Qt::StrongFocus - - - Interpolator - - - true - - - true - - - false - - - - 6 - - - 9 - - - - - true - - - QFrame::StyledPanel - - - QFrame::Raised - - - 1 - - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - 50 - false - - - - false - - - - Linear - - - - - NearestNeighbor - - - - - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - - - - - - - - mitkDataNode.h - mitkImageRegistrationMethod.h - mitkRenderingManager.h - mitkRigidRegistrationPreset.h - - - - diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelectorView.cpp b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelectorView.cpp deleted file mode 100644 index 920786aaee..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelectorView.cpp +++ /dev/null @@ -1,773 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkImageTimeSelector.h" -#include -#include -#include -#include "mitkMatrixConvert.h" -#include -#include -#include "QmitkLoadPresetDialog.h" -#include -#include "mitkRigidRegistrationPreset.h" - -#include "mitkProgressBar.h" - -#include "QmitkRigidRegistrationSelectorView.h" - -#include "QmitkTranslationTransformView.h" -#include "QmitkScaleTransformView.h" -#include "QmitkScaleLogarithmicTransformView.h" -#include "QmitkAffineTransformView.h" -#include "QmitkFixedCenterOfRotationAffineTransformView.h" -#include "QmitkEuler3DTransformView.h" -#include "QmitkCenteredEuler3DTransformView.h" -#include "QmitkQuaternionRigidTransformView.h" -#include "QmitkVersorTransformView.h" -#include "QmitkVersorRigid3DTransformView.h" -#include "QmitkScaleSkewVersor3DTransformView.h" -#include "QmitkSimilarity3DTransformView.h" -#include "QmitkRigid2DTransformView.h" -#include "QmitkCenteredRigid2DTransformView.h" -#include "QmitkEuler2DTransformView.h" -#include "QmitkSimilarity2DTransformView.h" -#include "QmitkCenteredSimilarity2DTransformView.h" - -#include "QmitkMeanSquaresMetricView.h" -#include "QmitkNormalizedCorrelationMetricView.h" -#include "QmitkGradientDifferenceMetricView.h" -#include "QmitkKullbackLeiblerCompareHistogramMetricView.h" -#include "QmitkCorrelationCoefficientHistogramMetricView.h" -#include "QmitkMeanSquaresHistogramMetricView.h" -#include "QmitkMutualInformationHistogramMetricView.h" -#include "QmitkNormalizedMutualInformationHistogramMetricView.h" -#include "QmitkMattesMutualInformationMetricView.h" -#include "QmitkMeanReciprocalSquareDifferenceMetricView.h" -#include "QmitkMutualInformationMetricView.h" -#include "QmitkMatchCardinalityMetricView.h" -#include "QmitkKappaStatisticMetricView.h" - -#include "QmitkExhaustiveOptimizerView.h" -#include "QmitkGradientDescentOptimizerView.h" -#include "QmitkQuaternionRigidTransformGradientDescentOptimizerView.h" -#include "QmitkLBFGSBOptimizerView.h" -#include "QmitkOnePlusOneEvolutionaryOptimizerView.h" -#include "QmitkPowellOptimizerView.h" -#include "QmitkFRPROptimizerView.h" -#include "QmitkRegularStepGradientDescentOptimizerView.h" -#include "QmitkVersorTransformOptimizerView.h" -#include "QmitkAmoebaOptimizerView.h" -#include "QmitkConjugateGradientOptimizerView.h" -#include "QmitkLBFGSOptimizerView.h" -#include "QmitkSPSAOptimizerView.h" -#include "QmitkVersorRigid3DTransformOptimizerView.h" - -QmitkRigidRegistrationSelectorView::QmitkRigidRegistrationSelectorView(QWidget* parent, Qt::WindowFlags f ) : QWidget( parent, f ), -m_FixedNode(nullptr), m_FixedMaskNode(nullptr), m_MovingNode(nullptr), m_MovingMaskNode(nullptr), m_FixedDimension(0), m_MovingDimension(0), -m_StopOptimization(false), m_GeometryItkPhysicalToWorldTransform(nullptr), m_GeometryWorldToItkPhysicalTransform(nullptr), -m_MovingGeometry(nullptr), m_ImageGeometry(nullptr) -{ - m_Controls.setupUi(parent); - - this->AddTransform(new QmitkTranslationTransformView(this, f)); - this->AddTransform(new QmitkScaleTransformView(this, f)); - this->AddTransform(new QmitkScaleLogarithmicTransformView(this, f)); - this->AddTransform(new QmitkAffineTransformView(this, f)); - this->AddTransform(new QmitkFixedCenterOfRotationAffineTransformView(this, f)); - this->AddTransform(new QmitkEuler3DTransformView(this, f)); - this->AddTransform(new QmitkCenteredEuler3DTransformView(this, f)); - this->AddTransform(new QmitkQuaternionRigidTransformView(this, f)); - this->AddTransform(new QmitkVersorTransformView(this, f)); - this->AddTransform(new QmitkVersorRigid3DTransformView(this, f)); - this->AddTransform(new QmitkScaleSkewVersor3DTransformView(this, f)); - this->AddTransform(new QmitkSimilarity3DTransformView(this, f)); - this->AddTransform(new QmitkRigid2DTransformView(this, f)); - this->AddTransform(new QmitkCenteredRigid2DTransformView(this, f)); - this->AddTransform(new QmitkEuler2DTransformView(this, f)); - this->AddTransform(new QmitkSimilarity2DTransformView(this, f)); - this->AddTransform(new QmitkCenteredSimilarity2DTransformView(this, f)); - - this->AddMetric(new QmitkMeanSquaresMetricView(this, f)); - this->AddMetric(new QmitkNormalizedCorrelationMetricView(this, f)); - this->AddMetric(new QmitkGradientDifferenceMetricView(this, f)); - this->AddMetric(new QmitkKullbackLeiblerCompareHistogramMetricView(this, f)); - this->AddMetric(new QmitkCorrelationCoefficientHistogramMetricView(this, f)); - this->AddMetric(new QmitkMeanSquaresHistogramMetricView(this, f)); - this->AddMetric(new QmitkMutualInformationHistogramMetricView(this, f)); - this->AddMetric(new QmitkNormalizedMutualInformationHistogramMetricView(this, f)); - this->AddMetric(new QmitkMattesMutualInformationMetricView(this, f)); - this->AddMetric(new QmitkMeanReciprocalSquareDifferenceMetricView(this, f)); - this->AddMetric(new QmitkMutualInformationMetricView(this, f)); - this->AddMetric(new QmitkMatchCardinalityMetricView(this, f)); - this->AddMetric(new QmitkKappaStatisticMetricView(this, f)); - - this->AddOptimizer(new QmitkExhaustiveOptimizerView(this, f)); - this->AddOptimizer(new QmitkGradientDescentOptimizerView(this, f)); - this->AddOptimizer(new QmitkQuaternionRigidTransformGradientDescentOptimizerView(this, f)); - this->AddOptimizer(new QmitkLBFGSBOptimizerView(this, f)); - this->AddOptimizer(new QmitkOnePlusOneEvolutionaryOptimizerView(this, f)); - this->AddOptimizer(new QmitkPowellOptimizerView(this, f)); - this->AddOptimizer(new QmitkFRPROptimizerView(this, f)); - this->AddOptimizer(new QmitkRegularStepGradientDescentOptimizerView(this, f)); - this->AddOptimizer(new QmitkVersorTransformOptimizerView(this, f)); - this->AddOptimizer(new QmitkAmoebaOptimizerView(this, f)); - this->AddOptimizer(new QmitkConjugateGradientOptimizerView(this, f)); - this->AddOptimizer(new QmitkLBFGSOptimizerView(this, f)); - this->AddOptimizer(new QmitkSPSAOptimizerView(this, f)); - this->AddOptimizer(new QmitkVersorRigid3DTransformOptimizerView(this, f)); - - m_Observer = mitk::RigidRegistrationObserver::New(); - m_Controls.m_TransformFrame->setEnabled(true); - m_Controls.m_MetricFrame->setEnabled(true); - m_Controls.m_OptimizerFrame->setEnabled(true); - m_Controls.m_InterpolatorFrame->setEnabled(true); - - m_Controls.m_TransformFrame->hide(); - m_Controls.m_MetricFrame->hide(); - m_Controls.m_OptimizerFrame->hide(); - m_Controls.m_InterpolatorFrame->hide(); - m_Controls.m_TransformBox->setCurrentIndex(0); - m_Controls.m_MetricBox->setCurrentIndex(0); - m_Controls.m_OptimizerBox->setCurrentIndex(0); - m_Controls.m_TransformWidgetStack->setCurrentIndex(0); - m_Controls.m_MetricWidgetStack->setCurrentIndex(0); - m_Controls.m_OptimizerWidgetStack->setCurrentIndex(0); - /// and show the selected views - this->TransformSelected(m_Controls.m_TransformBox->currentIndex()); - this->MetricSelected(m_Controls.m_MetricBox->currentIndex()); - this->OptimizerSelected(m_Controls.m_OptimizerBox->currentIndex()); - - - //// create connections - connect( m_Controls.m_TransformGroup, SIGNAL(clicked(bool)), m_Controls.m_TransformFrame, SLOT(setVisible(bool))); - connect( m_Controls.m_TransformBox, SIGNAL(activated(int)), m_Controls.m_TransformWidgetStack, SLOT(setCurrentIndex(int))); - connect( m_Controls.m_TransformBox, SIGNAL(activated(int)), this, SLOT(TransformSelected(int))); - connect( m_Controls.m_MetricBox, SIGNAL(activated(int)), this, SLOT(MetricSelected(int))); - connect( m_Controls.m_OptimizerBox, SIGNAL(activated(int)), this, SLOT(OptimizerSelected(int))); - connect( m_Controls.m_MetricGroup, SIGNAL(clicked(bool)), m_Controls.m_MetricFrame, SLOT(setVisible(bool))); - connect( m_Controls.m_MetricBox, SIGNAL(activated(int)), m_Controls.m_MetricWidgetStack, SLOT(setCurrentIndex(int))); - connect( m_Controls.m_OptimizerGroup, SIGNAL(clicked(bool)), m_Controls.m_OptimizerFrame, SLOT(setVisible(bool))); - connect( m_Controls.m_OptimizerBox, SIGNAL(activated(int)), m_Controls.m_OptimizerWidgetStack, SLOT(setCurrentIndex(int))); - connect( m_Controls.m_InterpolatorGroup, SIGNAL(toggled(bool)), m_Controls.m_InterpolatorFrame, SLOT(setVisible(bool))); - - m_Preset = new mitk::RigidRegistrationPreset(); - m_Preset->LoadPreset(); - - this->DoLoadRigidRegistrationPreset("Affine3D_MattesMutualInf_LinearInterp"); -} - -QmitkRigidRegistrationSelectorView::~QmitkRigidRegistrationSelectorView() -{ -} - -/// this method starts the registration process -void QmitkRigidRegistrationSelectorView::CalculateTransformation(unsigned int timestep) -{ - if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull()) - { - emit AddNewTransformationToUndoList(); - - mitk::Image::Pointer fimage = dynamic_cast(m_FixedNode->GetData())->Clone(); - mitk::Image::Pointer mimage = dynamic_cast(m_MovingNode->GetData())->Clone(); - mitk::Image::Pointer mmimage = nullptr; - mitk::Image::Pointer fmimage = nullptr; - if (m_MovingMaskNode.IsNotNull()) - { - mmimage = dynamic_cast(m_MovingMaskNode->GetData()); - } - if (m_FixedMaskNode.IsNotNull()) - { - fmimage = dynamic_cast(m_FixedMaskNode->GetData()); - } - - mitk::ImageTimeSelector::Pointer its = mitk::ImageTimeSelector::New(); - - if(fimage->GetDimension()>3) - { - its->SetInput(fimage); - its->SetTimeNr(timestep); - its->Update(); - fimage = its->GetOutput(); - } - - if(mimage->GetDimension()>3) - { - its->SetInput(mimage); - its->SetTimeNr(timestep); - its->Update(); - mimage = its->GetOutput(); - } - - // Initial moving image geometry - m_ImageGeometry = m_MovingNode->GetData()->GetGeometry()->Clone(); - std::cout << "Moving Image Geometry (IndexToWorldTransform)" << std::endl; - std::cout << m_ImageGeometry->GetIndexToWorldTransform()->GetMatrix(); - mitk::BaseGeometry::TransformType::InputPointType center = m_ImageGeometry->GetIndexToWorldTransform()->GetCenter(); - std::cout << "center " << center[0] << " " << center[1] << " " << center[2] << std::endl; - mitk::BaseGeometry::TransformType::OutputVectorType offset = m_ImageGeometry->GetIndexToWorldTransform()->GetOffset(); - std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2] << std::endl; - std::cout << std::endl; - - // Calculate the World to ITK-Physical transform for the moving image - m_MovingGeometry = m_MovingNode->GetData()->GetGeometry(); - - // container that holds all derived moving data, that needs to be transformed with the transformation found by registration - if(m_MovingMaskNode.IsNotNull()) - { - m_ChildNodes.insert(std::pair(m_MovingMaskNode, m_MovingMaskNode->GetData()->GetGeometry()));; - m_ChildNodes2.insert(std::pair(m_MovingMaskNode, m_MovingMaskNode->GetData()->GetGeometry()->Clone())); - } - - if(m_MovingNodeChildren.IsNotNull()) - { - unsigned long size = 0; - size = m_MovingNodeChildren->Size(); - for (unsigned long i = 0; i < size; ++i) - { - m_ChildNodes.insert(std::pair(m_MovingNodeChildren->GetElement(i), m_MovingNodeChildren->GetElement(i)->GetData()->GetGeometry())); - mitk::BaseGeometry::Pointer lopointer = m_MovingNodeChildren->GetElement(i)->GetData()->GetGeometry()->Clone(); - m_ChildNodes2.insert(std::pair(m_MovingNodeChildren->GetElement(i), lopointer)); - } - } - - m_GeometryWorldToItkPhysicalTransform = mitk::BaseGeometry::TransformType::New(); - GetWorldToItkPhysicalTransform(m_MovingGeometry, m_GeometryWorldToItkPhysicalTransform.GetPointer()); - - // Calculate the ITK-Physical to World transform for the fixed image - m_GeometryItkPhysicalToWorldTransform = mitk::BaseGeometry::TransformType::New(); - mitk::BaseGeometry::TransformType::Pointer fixedWorld2Phys = mitk::BaseGeometry::TransformType::New(); - GetWorldToItkPhysicalTransform(m_FixedNode->GetData()->GetGeometry(), fixedWorld2Phys.GetPointer()); - fixedWorld2Phys->GetInverse(m_GeometryItkPhysicalToWorldTransform); - - // init callback - itk::ReceptorMemberCommand::Pointer command = itk::ReceptorMemberCommand::New(); - command->SetCallbackFunction(this, &QmitkRigidRegistrationSelectorView::SetOptimizerValue); - int observer = m_Observer->AddObserver( itk::AnyEvent(), command ); - - std::vector presets; - // init registration method - mitk::ImageRegistrationMethod::Pointer registration = mitk::ImageRegistrationMethod::New(); - - registration->SetNumberOfLevels(3); - - registration->SetObserver(m_Observer); - registration->SetInterpolator(m_Controls.m_InterpolatorBox->currentIndex()); - registration->SetReferenceImage(fimage); - registration->SetInput(mimage); - if (mmimage.IsNotNull()) - { - registration->SetMovingMask(mmimage); - } - if (fmimage.IsNotNull()) - { - registration->SetFixedMask(fmimage); - } - - QmitkRigidRegistrationTransformsGUIBase* current_transform = dynamic_cast(m_Controls.m_TransformWidgetStack->currentWidget()); - QmitkRigidRegistrationMetricsGUIBase* current_metric = dynamic_cast(m_Controls.m_MetricWidgetStack->currentWidget()); - - current_transform->SetFixedImage( dynamic_cast( m_FixedNode->GetData()) ); - current_transform->SetMovingImage( dynamic_cast( m_MovingNode->GetData()) ); - registration->SetOptimizerScales( current_transform->GetScales() ); - registration->SetTransform( current_transform->GetTransform() ); - - current_metric->SetMovingImage( dynamic_cast( m_MovingNode->GetData()) ); - registration->SetMetric( current_metric->GetMetric() ); - - registration->SetOptimizer( dynamic_cast(m_Controls.m_OptimizerWidgetStack->currentWidget())->GetOptimizer() ); - - double time(0.0); - double tstart(0.0); - tstart = clock(); - - try - { - registration->Update(); - } - catch (itk::ExceptionObject e) - { - MITK_INFO("Qmitk.RigidRegistration.Selector") << "Caught exception: "<Progress(20); - } - - time += clock() - tstart; - time = time / CLOCKS_PER_SEC; - - //printOut of the Time - MITK_INFO << "Registration Time: " << time; - - m_Observer->RemoveObserver(observer); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } -} - -void QmitkRigidRegistrationSelectorView::SetFixedNode( mitk::DataNode * fixedNode ) -{ - m_FixedNode = fixedNode; - m_Controls.m_TransformBox->setCurrentIndex(m_Controls.m_TransformBox->currentIndex()); -} - -void QmitkRigidRegistrationSelectorView::SetFixedDimension( int dimension ) -{ - m_FixedDimension = dimension; -} - -void QmitkRigidRegistrationSelectorView::SetMovingNode( mitk::DataNode * movingNode ) -{ - m_MovingNode = movingNode; - this->TransformSelected(m_Controls.m_TransformBox->currentIndex()); -} - -void QmitkRigidRegistrationSelectorView::SetMovingDimension(int dimension ) -{ - m_MovingDimension = dimension; -} - -// this is a callback function that retrieves the current transformation -// parameters after every step of progress in the optimizer. -// depending on the choosen transformation, we construct a vtktransform -// that will be applied to the geometry of the moving image. -// the values are delivered by mitkRigidRgistrationObserver.cpp -void QmitkRigidRegistrationSelectorView::SetOptimizerValue( const itk::EventObject & ) -{ - if (m_StopOptimization) - { - m_Observer->SetStopOptimization(true); - m_StopOptimization = false; - } - - // retreive optimizer value for the current transformation - double value = m_Observer->GetCurrentOptimizerValue(); - - // retreive current parameterset of the transformation - itk::Array transformParams = m_Observer->GetCurrentTranslation(); - - // init an empty affine transformation that will be filled with - // the corresponding transformation parameters in the following - vtkMatrix4x4* vtkmatrix = vtkMatrix4x4::New(); - vtkmatrix->Identity(); - - // init a transform that will be initialized with the vtkmatrix later - vtkTransform* vtktransform = vtkTransform::New(); - - if (m_MovingNode.IsNotNull()) - { - vtktransform = dynamic_cast(m_Controls.m_TransformWidgetStack->currentWidget())->Transform(vtkmatrix, vtktransform, transformParams); - - // the retrieved transform goes from fixed to moving space. - // invert the transform in order to go from moving to fixed space. - vtkMatrix4x4* vtkmatrix_inv = vtkMatrix4x4::New(); - vtktransform->GetInverse(vtkmatrix_inv); - - // now adapt the moving geometry accordingly - m_MovingGeometry->GetIndexToWorldTransform()->SetIdentity(); - - // the next view lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial) - - // set moving image geometry to registration result - m_MovingGeometry->SetIndexToWorldTransformByVtkMatrix(vtkmatrix_inv); - - /*std::cout << std::endl; - std::cout << m_MovingGeometry->GetIndexToWorldTransform()->GetMatrix(); - mitk::Geometry3D::TransformType::OutputVectorType offset = m_MovingGeometry->GetIndexToWorldTransform()->GetOffset(); - std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2] << std::endl;*/ - - -#if !defined(ITK_IMAGE_BEHAVES_AS_ORIENTED_IMAGE) - // the next few lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial) - // go to itk physical space before applying the registration result - m_MovingGeometry->Compose(m_GeometryWorldToItkPhysicalTransform, 1); - - // right in the beginning, transform by initial moving image geometry - m_MovingGeometry->Compose(m_ImageGeometry->GetIndexToWorldTransform(), 1); - - // in the end, go back to world space - m_MovingGeometry->Compose(m_GeometryItkPhysicalToWorldTransform, 0); - -#else - m_MovingGeometry->Compose(m_ImageGeometry->GetIndexToWorldTransform(), 1); -#endif - - /*std::cout << std::endl << m_MovingGeometry->GetIndexToWorldTransform()->GetMatrix(); - offset = m_MovingGeometry->GetIndexToWorldTransform()->GetOffset(); - std::cout << "offset " << offset[0] << " " << offset[1] << " " << offset[2] << std::endl << std::endl;*/ - - // now adapt all children geometries accordingly if children exist - std::map::iterator iter; - std::map::iterator iter2; - mitk::DataNode::Pointer childNode; - for( iter = m_ChildNodes.begin(); iter != m_ChildNodes.end(); iter++ ) - { - childNode = (*iter).first; - if (childNode.IsNotNull()) - { - mitk::BaseGeometry* childGeometry; - mitk::BaseGeometry::Pointer childImageGeometry; - // Calculate the World to ITK-Physical transform for the moving mask - childGeometry = (*iter).second; - iter2 = m_ChildNodes2.find(childNode); - childImageGeometry = (*iter2).second; - - childGeometry->GetIndexToWorldTransform()->SetIdentity(); - - // the next view lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial) - - // set moving mask geometry to registration result - childGeometry->SetIndexToWorldTransformByVtkMatrix(vtkmatrix_inv); - -#if !defined(ITK_IMAGE_BEHAVES_AS_ORIENTED_IMAGE) - // the next few lines: Phi(Phys2World)*Phi(Result)*Phi(World2Phy)*Phi(Initial) - // go to itk physical space before applying the registration result - childGeometry->Compose(m_GeometryWorldToItkPhysicalTransform, 1); - - // right in the beginning, transform by initial moving image geometry - childGeometry->Compose(childImageGeometry->GetIndexToWorldTransform(), 1); - - // in the end, go back to world space - childGeometry->Compose(m_GeometryItkPhysicalToWorldTransform, 0); - -#else - childGeometry->Compose(childImageGeometry->GetIndexToWorldTransform(), 1); -#endif - } - } - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } - emit OptimizerChanged(value); -} - -/// this method is called whenever the combobox with the selectable transforms changes -/// responsible for showing the selected transform parameters -void QmitkRigidRegistrationSelectorView::TransformSelected( int transform ) -{ - if (m_FixedNode.IsNotNull()) - { - dynamic_cast(m_Controls.m_TransformWidgetStack->widget(transform))->SetFixedImage(dynamic_cast(m_FixedNode->GetData())); - } - if (m_MovingNode.IsNotNull()) - { - dynamic_cast(m_Controls.m_TransformWidgetStack->widget(transform))->SetMovingImage(dynamic_cast(m_MovingNode->GetData())); - } - int numberOfTransformParameters = dynamic_cast(m_Controls.m_TransformWidgetStack->widget(transform))->GetNumberOfTransformParameters(); - dynamic_cast(m_Controls.m_OptimizerWidgetStack->currentWidget())->SetNumberOfTransformParameters(numberOfTransformParameters); - - //set fixed height - m_Controls.m_TransformWidgetStack->setFixedHeight( dynamic_cast(m_Controls.m_TransformWidgetStack->widget(transform))->minimumSizeHint().height() ); - this->OptimizerSelected(m_Controls.m_OptimizerWidgetStack->currentIndex()); -} - -/// this method is called whenever the combobox with the selectable metrics changes -/// responsible for showing the selected metric parameters -void QmitkRigidRegistrationSelectorView::MetricSelected( int metric ) -{ - if (m_FixedNode.IsNotNull()) - { - dynamic_cast(m_Controls.m_MetricWidgetStack->widget(metric))->SetMovingImage(dynamic_cast(m_MovingNode->GetData())); - } - - //set fixed height - m_Controls.m_MetricWidgetStack->setFixedHeight( dynamic_cast(m_Controls.m_MetricWidgetStack->widget(metric))->minimumSizeHint().height() ); -} - -/// this method is called whenever the combobox with the selectable optimizers changes -/// responsible for showing the selected optimizer parameters -void QmitkRigidRegistrationSelectorView::OptimizerSelected( int optimizer ) -{ - int numberOfTransformParameters = dynamic_cast(m_Controls.m_TransformWidgetStack->currentWidget())->GetNumberOfTransformParameters(); - dynamic_cast(m_Controls.m_OptimizerWidgetStack->widget(optimizer))->SetNumberOfTransformParameters(numberOfTransformParameters); - - //set fixed height - m_Controls.m_OptimizerWidgetStack->setFixedHeight( dynamic_cast(m_Controls.m_OptimizerWidgetStack->widget(optimizer))->minimumSizeHint().height() ); -} - -void QmitkRigidRegistrationSelectorView::LoadRigidRegistrationParameter() -{ - this->DoLoadRigidRegistrationParameter(); -} - -void QmitkRigidRegistrationSelectorView::DoLoadRigidRegistrationParameter() -{ - std::map > existingPresets; - existingPresets = m_Preset->getTransformValuesPresets(); - - std::map >::iterator iter; - std::list presets; - for( iter = existingPresets.begin(); iter != existingPresets.end(); iter++ ) - { - presets.push_back( (*iter).first ); - } - if (presets.empty()) - { - QMessageBox::warning( nullptr, "RigidRegistrationParameters.xml", "RigidRegistrationParameters.xml is empty/does not exist. There are no presets to select."); - return; - } - presets.sort(); - // ask about the name to load a preset - QmitkLoadPresetDialog dialog( this, nullptr, "Load Preset", presets ); // needs a QWidget as parent - int dialogReturnValue = dialog.exec(); - if ( dialogReturnValue == QDialog::Rejected ) return; // user clicked cancel or pressed Esc or something similar - - this->DoLoadRigidRegistrationPreset(dialog.GetPresetName()); -} - -void QmitkRigidRegistrationSelectorView::LoadRigidRegistrationPresetParameter(QString preset_name) -{ - this->DoLoadRigidRegistrationPreset(preset_name.toStdString() ); -} - -void QmitkRigidRegistrationSelectorView::DoLoadRigidRegistrationPreset(std::string presetName) -{ - itk::Array transformValues; - transformValues = m_Preset->getTransformValues(presetName); - - if( transformValues.size() == 0 ) - { - MITK_ERROR("RigidRegistration.Selector.View") << "Failed to load preset : " << presetName; - return; - } - - m_Controls.m_TransformGroup->setChecked(true); - m_Controls.m_TransformFrame->setVisible(true); - m_Controls.m_TransformBox->setCurrentIndex((int)transformValues[0]); - m_Controls.m_TransformWidgetStack->setCurrentIndex((int)transformValues[0]); - this->TransformSelected((int)transformValues[0]); - itk::Array transformValuesForGUI; - transformValuesForGUI.SetSize(transformValues.Size()); - transformValuesForGUI.fill(0); - for (unsigned int i = 1; i < transformValues.Size(); i++) - { - transformValuesForGUI[i-1] = transformValues[i]; - } - dynamic_cast(m_Controls.m_TransformWidgetStack->currentWidget())->SetTransformParameters(transformValuesForGUI); - - itk::Array metricValues; - metricValues = m_Preset->getMetricValues(presetName); - - m_Controls.m_MetricGroup->setChecked(true); - m_Controls.m_MetricFrame->setVisible(true); - m_Controls.m_MetricBox->setCurrentIndex((int)metricValues[0]); - m_Controls.m_MetricWidgetStack->setCurrentIndex((int)metricValues[0]); - this->MetricSelected((int)metricValues[0]); - itk::Array metricValuesForGUI; - metricValuesForGUI.SetSize(metricValues.Size()); - metricValuesForGUI.fill(0); - for (unsigned int i = 1; i < metricValues.Size(); i++) - { - metricValuesForGUI[i-1] = metricValues[i]; - } - dynamic_cast(m_Controls.m_MetricWidgetStack->currentWidget())->SetMetricParameters(metricValuesForGUI); - - itk::Array optimizerValues; - optimizerValues = m_Preset->getOptimizerValues(presetName); - - m_Controls.m_OptimizerGroup->setChecked(true); - m_Controls.m_OptimizerFrame->setVisible(true); - m_Controls.m_OptimizerBox->setCurrentIndex((int)optimizerValues[0]); - m_Controls.m_OptimizerWidgetStack->setCurrentIndex((int)optimizerValues[0]); - this->OptimizerSelected((int)optimizerValues[0]); - itk::Array optimizerValuesForGUI; - optimizerValuesForGUI.SetSize(optimizerValues.Size()); - optimizerValuesForGUI.fill(0); - for (unsigned int i = 1; i < optimizerValues.Size(); i++) - { - optimizerValuesForGUI[i-1] = optimizerValues[i]; - } - dynamic_cast(m_Controls.m_OptimizerWidgetStack->currentWidget())->SetOptimizerParameters(optimizerValuesForGUI); - - itk::Array interpolatorValues; - interpolatorValues = m_Preset->getInterpolatorValues(presetName); - - m_Controls.m_InterpolatorGroup->setChecked(true); - m_Controls.m_InterpolatorFrame->setVisible(true); - m_Controls.m_InterpolatorBox->setCurrentIndex((int)interpolatorValues[0]); -} - -void QmitkRigidRegistrationSelectorView::SaveRigidRegistrationParameter() -{ - this->DoSaveRigidRegistrationParameter(); -} - - -void QmitkRigidRegistrationSelectorView::DoSaveRigidRegistrationParameter() -{ - bool ok; - QString text = QInputDialog::getText(this, - "Save Parameter Preset", "Enter name for preset:", QLineEdit::Normal, - QString::null, &ok ); - if ( ok ) - { - std::map > existingPresets; - existingPresets = m_Preset->getTransformValuesPresets(); - - auto iter = existingPresets.find(std::string((const char*)text.toLatin1())); - if (iter != existingPresets.end()) - { - QMessageBox::critical( this, "Preset definition", - "Presetname already exists."); - return; - } - if (text.isEmpty()) - { - QMessageBox::critical( this, "Preset definition", - "Presetname has to be set.\n" - "You have to enter a Presetname." ); - return; - } - itk::Array transformValues; - transformValues.SetSize(25); - transformValues.fill(0); - transformValues[0] = m_Controls.m_TransformBox->currentIndex(); - - itk::Array transformValuesFromGUI = dynamic_cast(m_Controls.m_TransformWidgetStack->currentWidget())->GetTransformParameters(); - for (unsigned int i = 0; i < transformValuesFromGUI.Size(); i++) - { - transformValues[i+1] = transformValuesFromGUI[i]; - } - - std::map > transformMap; - transformMap = m_Preset->getTransformValuesPresets(); - - transformMap[std::string((const char*)text.toLatin1())] = transformValues; - - itk::Array metricValues; - metricValues.SetSize(25); - metricValues.fill(0); - metricValues[0] = m_Controls.m_MetricBox->currentIndex(); - itk::Array metricValuesFromGUI = dynamic_cast(m_Controls.m_MetricWidgetStack->currentWidget())->GetMetricParameters(); - for (unsigned int i = 0; i < metricValuesFromGUI.Size(); i++) - { - metricValues[i+1] = metricValuesFromGUI[i]; - } - - std::map > metricMap; - metricMap = m_Preset->getMetricValuesPresets(); - - metricMap[std::string((const char*)text.toLatin1())] = metricValues; - - itk::Array optimizerValues; - optimizerValues.SetSize(25); - optimizerValues.fill(0); - optimizerValues[0] = m_Controls.m_OptimizerBox->currentIndex(); - itk::Array optimizerValuesFromGUI = dynamic_cast(m_Controls.m_OptimizerWidgetStack->currentWidget())->GetOptimizerParameters(); - for (unsigned int i = 0; i < optimizerValuesFromGUI.Size(); i++) - { - optimizerValues[i+1] = optimizerValuesFromGUI[i]; - } - - std::map > optimizerMap; - optimizerMap = m_Preset->getOptimizerValuesPresets(); - - optimizerMap[std::string((const char*)text.toLatin1())] = optimizerValues; - - itk::Array interpolatorValues; - interpolatorValues.SetSize(25); - interpolatorValues.fill(0); - interpolatorValues[0] = m_Controls.m_InterpolatorBox->currentIndex(); - - std::map > interpolatorMap; - interpolatorMap = m_Preset->getInterpolatorValuesPresets(); - - interpolatorMap[std::string((const char*)text.toLatin1())] = interpolatorValues; - - m_Preset->newPresets(transformMap, metricMap, optimizerMap, interpolatorMap); - - } - else - { - // user pressed Cancel - } -} - -void QmitkRigidRegistrationSelectorView::StopOptimization(bool stopOptimization) -{ - m_StopOptimization = stopOptimization; -} - -int QmitkRigidRegistrationSelectorView::GetSelectedTransform() -{ - return m_Controls.m_TransformBox->currentIndex(); -} - -void QmitkRigidRegistrationSelectorView::SetFixedMaskNode( mitk::DataNode * fixedMaskNode ) -{ - m_FixedMaskNode = fixedMaskNode; - this->TransformSelected(m_Controls.m_TransformBox->currentIndex()); -} - -void QmitkRigidRegistrationSelectorView::SetMovingMaskNode( mitk::DataNode * movingMaskNode ) -{ - m_MovingMaskNode = movingMaskNode; - this->TransformSelected(m_Controls.m_TransformBox->currentIndex()); -} - -void QmitkRigidRegistrationSelectorView::SetMovingNodeChildren(mitk::DataStorage::SetOfObjects::ConstPointer children) -{ - m_MovingNodeChildren = children; -} - -void QmitkRigidRegistrationSelectorView::AddTransform(QmitkRigidRegistrationTransformsGUIBase* transform) -{ - m_Controls.m_TransformBox->addItem(transform->GetName()); - int i = 0; - if (!dynamic_cast(m_Controls.m_TransformWidgetStack->widget(i))) - { - m_Controls.m_TransformWidgetStack->addWidget(transform); - m_Controls.m_TransformWidgetStack->removeWidget(m_Controls.m_TransformWidgetStack->widget(i)); - transform->SetupUI(m_Controls.m_TransformWidgetStack->widget(i)); - } - else - { - i = m_Controls.m_TransformWidgetStack->addWidget(transform); - transform->SetupUI(m_Controls.m_TransformWidgetStack->widget(i)); - } -} - -void QmitkRigidRegistrationSelectorView::AddMetric(QmitkRigidRegistrationMetricsGUIBase* metric) -{ - m_Controls.m_MetricBox->addItem(metric->GetName()); - int i = 0; - if (!dynamic_cast(m_Controls.m_MetricWidgetStack->widget(i))) - { - m_Controls.m_MetricWidgetStack->addWidget(metric); - m_Controls.m_MetricWidgetStack->removeWidget(m_Controls.m_MetricWidgetStack->widget(i)); - metric->SetupUI(m_Controls.m_MetricWidgetStack->widget(i)); - } - else - { - i = m_Controls.m_MetricWidgetStack->addWidget(metric); - metric->SetupUI(m_Controls.m_MetricWidgetStack->widget(i)); - } -} - -void QmitkRigidRegistrationSelectorView::AddOptimizer(QmitkRigidRegistrationOptimizerGUIBase* optimizer) -{ - m_Controls.m_OptimizerBox->addItem(optimizer->GetName()); - int i = 0; - if (!dynamic_cast(m_Controls.m_OptimizerWidgetStack->widget(i))) - { - m_Controls.m_OptimizerWidgetStack->addWidget(optimizer); - m_Controls.m_OptimizerWidgetStack->removeWidget(m_Controls.m_OptimizerWidgetStack->widget(i)); - optimizer->SetupUI(m_Controls.m_OptimizerWidgetStack->widget(i)); - } - else - { - i = m_Controls.m_OptimizerWidgetStack->addWidget(optimizer); - optimizer->SetupUI(m_Controls.m_OptimizerWidgetStack->widget(i)); - } -} diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelectorView.h b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelectorView.h deleted file mode 100644 index 13406db5e7..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationSelectorView.h +++ /dev/null @@ -1,111 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QmitkRigidRegistrationSelectorViewWidgetHIncluded -#define QmitkRigidRegistrationSelectorViewWidgetHIncluded - -#include "mitkDataNode.h" -#include "mitkDataStorage.h" -#include "ui_QmitkRigidRegistrationSelector.h" -#include "qobject.h" -#include -#include "QmitkRigidRegistrationTransformsGUIBase.h" -#include "QmitkRigidRegistrationMetricsGUIBase.h" -#include "QmitkRigidRegistrationOptimizerGUIBase.h" - - -/*! -* \brief Widget for rigid registration -* -* Displays options for rigid registration. -*/ -class REGISTRATION_EXPORT QmitkRigidRegistrationSelectorView : public QWidget -{ - Q_OBJECT - -public: - - QmitkRigidRegistrationSelectorView( QWidget* parent = nullptr, Qt::WindowFlags f = nullptr ); - ~QmitkRigidRegistrationSelectorView(); - - signals: - void TransformChanged(); - void OptimizerChanged(double value); - void AddNewTransformationToUndoList(); - - public slots: - void SetFixedNode( mitk::DataNode * fixedNode ); - void SetFixedMaskNode(mitk::DataNode * fixedMaskNode ); - void SetFixedDimension( int dimension ); - void SetMovingNode( mitk::DataNode * movingNode ); - void SetMovingNodeChildren(mitk::DataStorage::SetOfObjects::ConstPointer children); - void SetMovingMaskNode(mitk::DataNode * movingMaskNode ); - void SetMovingDimension(int dimension ); - int GetSelectedTransform(); - void CalculateTransformation(unsigned int timestep = 0); - void StopOptimization(bool stopOptimization); - - protected slots: - // this is a callback function that retrieves the current transformation - // parameters after every step of progress in the optimizer. - // depending on the choosen transformation, we construct a vtktransform - // that will be applied to the geometry of the moving image. - // the values are delivered by mitkRigidRgistrationObserver.cpp - void SetOptimizerValue( const itk::EventObject & ); - /// this method is called whenever the combobox with the selectable transforms changes - /// responsible for showing the selected transformparameters - void TransformSelected( int transform ); - /// this method is called whenever the combobox with the selectable metrics changes - /// responsible for showing the selected metricparameters - void MetricSelected( int metric ); - /// this method is called whenever the combobox with the selectable optimizer changes - /// responsible for showing the selected optimizerparameters - void OptimizerSelected( int optimizer ); - - void LoadRigidRegistrationParameter(); - void SaveRigidRegistrationParameter(); - //void LoadRigidRegistrationTestParameter(); - //void SaveRigidRegistrationTestParameter(); - void DoLoadRigidRegistrationParameter(); - void DoLoadRigidRegistrationPreset(std::string presetName); - void DoSaveRigidRegistrationParameter(); - void AddTransform(QmitkRigidRegistrationTransformsGUIBase* transform); - void AddMetric(QmitkRigidRegistrationMetricsGUIBase* metric); - void AddOptimizer(QmitkRigidRegistrationOptimizerGUIBase* optimizer); - - void LoadRigidRegistrationPresetParameter(QString preset_name); -protected: - - Ui::QmitkRigidRegistrationSelector m_Controls; - mitk::DataNode::Pointer m_FixedNode; - mitk::DataNode::Pointer m_FixedMaskNode; - mitk::DataNode::Pointer m_MovingNode; - mitk::DataNode::Pointer m_MovingMaskNode; - int m_FixedDimension; - int m_MovingDimension; - bool m_StopOptimization; - mitk::RigidRegistrationPreset* m_Preset; - mitk::BaseGeometry::TransformType::Pointer m_GeometryItkPhysicalToWorldTransform; - mitk::BaseGeometry::TransformType::Pointer m_GeometryWorldToItkPhysicalTransform; - mitk::BaseGeometry* m_MovingGeometry; - mitk::BaseGeometry::Pointer m_ImageGeometry; - mitk::RigidRegistrationObserver::Pointer m_Observer; - mitk::DataStorage::SetOfObjects::ConstPointer m_MovingNodeChildren; - std::map m_ChildNodes; - std::map m_ChildNodes2; -}; - -#endif diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationView.cpp b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationView.cpp deleted file mode 100644 index 6426100368..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationView.cpp +++ /dev/null @@ -1,1555 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -// Qmitk includes -#include "QmitkRigidRegistrationView.h" -#include "QmitkStdMultiWidget.h" - -// MITK includes -#include "mitkDataNodeObject.h" -#include -#include "mitkManualSegmentationToSurfaceFilter.h" -#include -#include -#include "mitkNodePredicateDataType.h" -#include "mitkNodePredicateAnd.h" -#include "mitkNodePredicateProperty.h" - -// QT includes -#include "qinputdialog.h" -#include "qmessagebox.h" -#include "qcursor.h" -#include "qapplication.h" -#include "qradiobutton.h" -#include "qslider.h" -#include "qtooltip.h" - -// VTK includes -#include - -// ITK includes -#include - -// BlueBerry includes -#include "berryIWorkbenchWindow.h" -#include "berryISelectionService.h" - -const std::string QmitkRigidRegistrationView::VIEW_ID = "org.mitk.views.rigidregistration"; - -using namespace berry; - -struct SelListenerRigidRegistration : ISelectionListener -{ - berryObjectMacro(SelListenerRigidRegistration); - - SelListenerRigidRegistration(QmitkRigidRegistrationView* view) - { - m_View = view; - } - - void DoSelectionChanged(ISelection::ConstPointer selection) - { - // save current selection in member variable - m_View->m_CurrentSelection = selection.Cast(); - - // do something with the selected items - if(m_View->m_CurrentSelection) - { - if (m_View->m_CurrentSelection->Size() != 2) - { - if (m_View->m_FixedNode.IsNull() || m_View->m_MovingNode.IsNull()) - { - m_View->m_Controls.m_StatusLabel->show(); - m_View->m_Controls.TextLabelFixed->hide(); - m_View->m_Controls.m_FixedLabel->hide(); - m_View->m_Controls.TextLabelMoving->hide(); - m_View->m_Controls.m_MovingLabel->hide(); - m_View->m_Controls.m_UseMaskingCB->hide(); - m_View->m_Controls.m_OpacityLabel->setEnabled(false); - m_View->m_Controls.m_OpacitySlider->setEnabled(false); - m_View->m_Controls.label->setEnabled(false); - m_View->m_Controls.label_2->setEnabled(false); - m_View->m_Controls.m_ShowRedGreenValues->setEnabled(false); - m_View->m_Controls.m_SwitchImages->hide(); - } - } - else - { - m_View->m_Controls.m_StatusLabel->hide(); - bool foundFixedImage = false; - mitk::DataNode::Pointer fixedNode; - // iterate selection - for (IStructuredSelection::iterator i = m_View->m_CurrentSelection->Begin(); - i != m_View->m_CurrentSelection->End(); ++i) - { - // extract datatree node - if (mitk::DataNodeObject::Pointer nodeObj = i->Cast()) - { - mitk::DataNode::Pointer node = nodeObj->GetDataNode(); - // only look at interesting types - if(QString("Image").compare(node->GetData()->GetNameOfClass())==0) - { - if (dynamic_cast(node->GetData())->GetDimension() == 4) - { - m_View->m_Controls.m_StatusLabel->show(); - QMessageBox::information( NULL, "RigidRegistration", "Only 2D or 3D images can be processed.", QMessageBox::Ok ); - return; - } - if (foundFixedImage == false) - { - fixedNode = node; - foundFixedImage = true; - } - else - { - // m_View->SetImagesVisible(selection); - m_View->FixedSelected(fixedNode); - m_View->MovingSelected(node); - m_View->m_Controls.m_StatusLabel->hide(); - m_View->m_Controls.TextLabelFixed->show(); - m_View->m_Controls.m_FixedLabel->show(); - m_View->m_Controls.TextLabelMoving->show(); - m_View->m_Controls.m_MovingLabel->show(); - m_View->m_Controls.m_UseMaskingCB->show(); - m_View->m_Controls.m_OpacityLabel->setEnabled(true); - m_View->m_Controls.m_OpacitySlider->setEnabled(true); - m_View->m_Controls.label->setEnabled(true); - m_View->m_Controls.label_2->setEnabled(true); - m_View->m_Controls.m_ShowRedGreenValues->setEnabled(true); - } - } - else - { - m_View->m_Controls.m_StatusLabel->show(); - return; - } - } - } - } - } - else if (m_View->m_FixedNode.IsNull() || m_View->m_MovingNode.IsNull()) - { - m_View->m_Controls.m_StatusLabel->show(); - } - } - - void SelectionChanged(const IWorkbenchPart::Pointer& part, - const ISelection::ConstPointer& selection) override - { - // check, if selection comes from datamanager - if (part) - { - QString partname = part->GetPartName(); - if(partname == "Data Manager") - { - // apply selection - DoSelectionChanged(selection); - } - } - } - - QmitkRigidRegistrationView* m_View; -}; - -QmitkRigidRegistrationView::QmitkRigidRegistrationView(QObject * /*parent*/, const char * /*name*/) -: QmitkFunctionality(), - m_MultiWidget(NULL), - m_MovingNode(NULL), - m_MovingMaskNode(NULL), - m_FixedNode(NULL), - m_FixedMaskNode(NULL), - m_ShowRedGreen(false), - m_Opacity(0.5), - m_OriginalOpacity(1.0), - m_Deactivated(false), - m_FixedDimension(0), - m_MovingDimension(0), - m_PresetSelected(false), - m_PresetNotLoaded(false) -{ - m_TranslateSliderPos[0] = 0; - m_TranslateSliderPos[1] = 0; - m_TranslateSliderPos[2] = 0; - - m_RotateSliderPos[0] = 0; - m_RotateSliderPos[1] = 0; - m_RotateSliderPos[2] = 0; - - m_ScaleSliderPos[0] = 0; - m_ScaleSliderPos[1] = 0; - m_ScaleSliderPos[2] = 0; - - translationParams = new int[3]; - rotationParams = new int[3]; - scalingParams = new int[3]; - - m_PresetSelected = false; - - m_TimeStepperAdapter = NULL; - - this->GetDataStorage()->RemoveNodeEvent.AddListener(mitk::MessageDelegate1 ( this, &QmitkRigidRegistrationView::DataNodeHasBeenRemoved )); -} - -QmitkRigidRegistrationView::~QmitkRigidRegistrationView() -{ - if(m_SelListener) - { - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) s->RemovePostSelectionListener(m_SelListener.data()); - } - - this->GetDataStorage()->RemoveNodeEvent.RemoveListener(mitk::MessageDelegate1 ( this, &QmitkRigidRegistrationView::DataNodeHasBeenRemoved )); -} - -void QmitkRigidRegistrationView::CreateQtPartControl(QWidget* parent) -{ - m_Controls.setupUi(parent); - m_Controls.m_ManualFrame->hide(); - m_Controls.timeSlider->hide(); - m_Controls.TextLabelFixed->hide(); - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.m_MovingLabel->hide(); - m_Controls.m_UseMaskingCB->hide(); - m_Controls.m_OpacityLabel->setEnabled(false); - m_Controls.m_OpacitySlider->setEnabled(false); - m_Controls.label->setEnabled(false); - m_Controls.label_2->setEnabled(false); - m_Controls.m_ShowRedGreenValues->setEnabled(false); - m_Controls.m_SwitchImages->hide(); - if (m_Controls.m_RigidTransform->currentIndex() == 1) - { - m_Controls.frame->show(); - } - else - { - m_Controls.frame->hide(); - } - m_Controls.m_ManualFrame->setEnabled(false); - m_Parent->setEnabled(false); - - this->m_Controls.m_RigidTransform->removeTab(1); - - mitk::NodePredicateAnd::Pointer andPred = // we want binary images in the selectors - mitk::NodePredicateAnd::New(mitk::NodePredicateDataType::New("Image"), - mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true))); - - m_Controls.m_FixedImageCB->SetPredicate(andPred); - m_Controls.m_FixedImageCB->SetDataStorage(this->GetDataStorage()); - m_Controls.m_FixedImageCB->hide(); - m_Controls.m_FixedMaskLB->hide(); - - m_Controls.m_MovingImageCB->SetPredicate(andPred); - m_Controls.m_MovingImageCB->SetDataStorage(this->GetDataStorage()); - m_Controls.m_MovingImageCB->hide(); - m_Controls.m_MovingMaskLB->hide(); - - this->CreateConnections(); - this->CheckCalculateEnabled(); - - mitk::RigidRegistrationPreset* preset = new mitk::RigidRegistrationPreset(); - preset->LoadPreset(); - - this->FillPresetComboBox( preset->getAvailablePresets() ); - this->m_Controls.m_LoadRigidRegistrationParameter->setEnabled(false); -} - -void QmitkRigidRegistrationView::FillPresetComboBox( const std::list< std::string>& presets) -{ - this->m_Controls.m_RigidRegistrationPresetBox->addItem( QString("== select a registration configuration ==") ); - for( const std::string &preset : presets ) - { - this->m_Controls.m_RigidRegistrationPresetBox->addItem( QString(preset.c_str()) ); - } -} - -void QmitkRigidRegistrationView::PresetSelectionChanged() -{ - // first item is blank == no preset selected - bool validPresetSelected = (this->m_Controls.m_RigidRegistrationPresetBox->currentIndex() > 0); - - if (validPresetSelected) - { - this->m_Controls.m_LoadRigidRegistrationParameter->setEnabled(true); - - // selection chaged, disable unter the preset is loaded - this->m_PresetNotLoaded = true; - this->m_Controls.m_CalculateTransformation->setEnabled(false); - } - else - { - // reset preset view - this->m_Controls.m_LoadRigidRegistrationParameter->setEnabled(false); - // THE QT5 solution : this->m_Controls.m_RigidRegistrationPresetBox->currentIndexChanged(0); - this->m_Controls.m_RigidRegistrationPresetBox->setCurrentIndex(0); - this->m_PresetNotLoaded = true; - - // disable calculate button - this->m_Controls.m_CalculateTransformation->setEnabled(false); - - } - -} - -void QmitkRigidRegistrationView::LoadSelectedPreset() -{ - this->m_Controls.m_LoadRigidRegistrationParameter->setEnabled(false); - - QString current_item = this->m_Controls.m_RigidRegistrationPresetBox->currentText(); - emit PresetSelected(current_item); - - // first item is blank == no preset selected - m_PresetSelected = ( this->m_Controls.m_RigidRegistrationPresetBox->currentIndex() > 0 ); - m_PresetNotLoaded = false; - - this->CheckCalculateEnabled(); -} - -void QmitkRigidRegistrationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_Parent->setEnabled(true); - m_MultiWidget = &stdMultiWidget; - m_MultiWidget->SetWidgetPlanesVisibility(true); -} - -void QmitkRigidRegistrationView::StdMultiWidgetNotAvailable() -{ - m_Parent->setEnabled(false); - m_MultiWidget = NULL; -} - -void QmitkRigidRegistrationView::CreateConnections() -{ - connect( m_Controls.m_ManualRegistrationCheckbox, SIGNAL(toggled(bool)), this, SLOT(ShowManualRegistrationFrame(bool))); - connect((QObject*)(m_Controls.m_SwitchImages),SIGNAL(clicked()),this,SLOT(SwitchImages())); - connect(m_Controls.m_ShowRedGreenValues, SIGNAL(toggled(bool)), this, SLOT(ShowRedGreen(bool))); - connect(m_Controls.m_ShowContour, SIGNAL(toggled(bool)), this, SLOT(EnableContour(bool))); - //connect(m_Controls.m_UseFixedImageMask, SIGNAL(toggled(bool)), this, SLOT(UseFixedMaskImageChecked(bool))); - //connect(m_Controls.m_UseMovingImageMask, SIGNAL(toggled(bool)), this, SLOT(UseMovingMaskImageChecked(bool))); - connect(m_Controls.m_RigidTransform, SIGNAL(currentChanged(int)), this, SLOT(TabChanged(int))); - connect(m_Controls.m_OpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(OpacityUpdate(int))); - connect(m_Controls.m_ContourSlider, SIGNAL(sliderReleased()), this, SLOT(ShowContour())); - - connect(m_Controls.m_CalculateTransformation, SIGNAL(clicked()), this, SLOT(Calculate())); - connect(m_Controls.m_UndoTransformation,SIGNAL(clicked()),this,SLOT(UndoTransformation())); - connect(m_Controls.m_RedoTransformation,SIGNAL(clicked()),this,SLOT(RedoTransformation())); - connect(m_Controls.m_AutomaticTranslation,SIGNAL(clicked()),this,SLOT(AlignCenters())); - connect(m_Controls.m_StopOptimization,SIGNAL(clicked()), this , SLOT(StopOptimizationClicked())); - connect(m_Controls.m_XTransSlider, SIGNAL(valueChanged(int)), this, SLOT(xTrans_valueChanged(int))); - connect(m_Controls.m_YTransSlider, SIGNAL(valueChanged(int)), this, SLOT(yTrans_valueChanged(int))); - connect(m_Controls.m_ZTransSlider, SIGNAL(valueChanged(int)), this, SLOT(zTrans_valueChanged(int))); - connect(m_Controls.m_XRotSlider, SIGNAL(valueChanged(int)), this, SLOT(xRot_valueChanged(int))); - connect(m_Controls.m_YRotSlider, SIGNAL(valueChanged(int)), this, SLOT(yRot_valueChanged(int))); - connect(m_Controls.m_ZRotSlider, SIGNAL(valueChanged(int)), this, SLOT(zRot_valueChanged(int))); - connect(m_Controls.m_XScaleSlider, SIGNAL(valueChanged(int)), this, SLOT(xScale_valueChanged(int))); - connect(m_Controls.m_YScaleSlider, SIGNAL(valueChanged(int)), this, SLOT(yScale_valueChanged(int))); - connect(m_Controls.m_ZScaleSlider, SIGNAL(valueChanged(int)), this, SLOT(zScale_valueChanged(int))); - - /*connect(m_Controls.m_LoadRigidRegistrationParameter, SIGNAL(clicked()), m_Controls.qmitkRigidRegistrationSelector1, SLOT(LoadRigidRegistrationParameter())); - connect(m_Controls.m_SaveRigidRegistrationParameter, SIGNAL(clicked()), m_Controls.qmitkRigidRegistrationSelector1, SLOT(SaveRigidRegistrationParameter())); - connect(m_Controls.m_LoadRigidRegistrationTestParameter, SIGNAL(clicked()), m_Controls.qmitkRigidRegistrationSelector1, SLOT(LoadRigidRegistrationTestParameter())); - connect(m_Controls.m_SaveRigidRegistrationTestParameter, SIGNAL(clicked()), m_Controls.qmitkRigidRegistrationSelector1, SLOT(SaveRigidRegistrationTestParameter()));*/ - connect(this, SIGNAL(PresetSelected(QString)), m_Controls.qmitkRigidRegistrationSelector1, SLOT(LoadRigidRegistrationPresetParameter(QString) ) ); - connect(m_Controls.m_LoadRigidRegistrationParameter, SIGNAL(clicked()), this, SLOT(LoadSelectedPreset()) ); - connect(m_Controls.m_RigidRegistrationPresetBox, SIGNAL(activated(int)), this, SLOT(PresetSelectionChanged()) ); - - - connect(m_Controls.qmitkRigidRegistrationSelector1,SIGNAL(OptimizerChanged(double)),this,SLOT(SetOptimizerValue( double ))); - connect(m_Controls.qmitkRigidRegistrationSelector1,SIGNAL(TransformChanged()),this,SLOT(CheckCalculateEnabled())); - connect(m_Controls.qmitkRigidRegistrationSelector1,SIGNAL(AddNewTransformationToUndoList()),this,SLOT(AddNewTransformationToUndoList())); - connect(m_Controls.m_UseMaskingCB, SIGNAL(stateChanged(int)),this,SLOT(OnUseMaskingChanged(int))); - connect(m_Controls.m_FixedImageCB, SIGNAL(OnSelectionChanged(const mitk::DataNode*)),this,SLOT(OnFixedMaskImageChanged(const mitk::DataNode*))); - connect(m_Controls.m_MovingImageCB, SIGNAL(OnSelectionChanged(const mitk::DataNode*)),this,SLOT(OnMovingMaskImageChanged(const mitk::DataNode*))); -} - -void QmitkRigidRegistrationView::Activated() -{ - m_Deactivated = false; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Activated(); - if (m_SelListener.isNull()) - { - m_SelListener.reset(new SelListenerRigidRegistration(this)); - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener(/*"org.mitk.views.datamanager",*/ m_SelListener.data()); - berry::ISelection::ConstPointer sel( - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); - m_CurrentSelection = sel.Cast(); - static_cast(m_SelListener.data())->DoSelectionChanged(sel); - } - this->OpacityUpdate(m_Controls.m_OpacitySlider->value()); - this->ShowRedGreen(m_Controls.m_ShowRedGreenValues->isChecked()); - this->ClearTransformationLists(); - this->CheckCalculateEnabled(); - /* - m_Deactivated = false; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Activated(); - if (m_SelListener.IsNull()) - { - m_SelListener = berry::ISelectionListener::Pointer(new SelListenerRigidRegistration(this)); - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener(/ *"org.mitk.views.datamanager",* / m_SelListener); - berry::ISelection::ConstPointer sel( - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); - m_CurrentSelection = sel.Cast(); - m_SelListener.Cast()->DoSelectionChanged(sel); - } - this->OpacityUpdate(m_Controls.m_OpacitySlider->value()); - this->ShowRedGreen(m_Controls.m_ShowRedGreenValues->isChecked()); - this->ClearTransformationLists(); - this->CheckCalculateEnabled();*/ -} - -void QmitkRigidRegistrationView::Visible() -{ - /* - m_Deactivated = false; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Activated(); - if (m_SelListener.IsNull()) - { - m_SelListener = berry::ISelectionListener::Pointer(new SelListenerRigidRegistration(this)); - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->AddPostSelectionListener("org.mitk.views.datamanager", m_SelListener); - berry::ISelection::ConstPointer sel( - this->GetSite()->GetWorkbenchWindow()->GetSelectionService()->GetSelection("org.mitk.views.datamanager")); - m_CurrentSelection = sel.Cast(); - m_SelListener.Cast()->DoSelectionChanged(sel); - } - this->OpacityUpdate(m_Controls.m_OpacitySlider->value()); - this->ShowRedGreen(m_Controls.m_ShowRedGreenValues->isChecked()); - this->ClearTransformationLists(); - this->CheckCalculateEnabled();*/ -} - -void QmitkRigidRegistrationView::Deactivated() -{ - m_Deactivated = true; - this->SetImageColor(false); - if (m_FixedNode.IsNotNull()) - m_FixedNode->SetOpacity(1.0); - m_FixedNode = NULL; - m_MovingNode = NULL; - this->ClearTransformationLists(); - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) s->RemovePostSelectionListener(m_SelListener.data()); - m_SelListener.reset(); - /* - m_Deactivated = true; - this->SetImageColor(false); - m_FixedNode = NULL; - m_MovingNode = NULL; - this->ClearTransformationLists(); - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) - s->RemovePostSelectionListener(m_SelListener); - m_SelListener = NULL; - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - QmitkFunctionality::Deactivated();*/ -} - -void QmitkRigidRegistrationView::Hidden() -{ - /*m_Deactivated = true; - this->SetImageColor(false); - m_FixedNode = NULL; - m_MovingNode = NULL; - this->ClearTransformationLists(); - berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService(); - if(s) - s->RemovePostSelectionListener(m_SelListener); - m_SelListener = NULL; - //mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - //QmitkFunctionality::Deactivated();*/ -} - -void QmitkRigidRegistrationView::DataNodeHasBeenRemoved(const mitk::DataNode* node) -{ - if(node == m_FixedNode || node == m_MovingNode) - { - m_Controls.m_StatusLabel->show(); - m_Controls.TextLabelFixed->hide(); - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.m_MovingLabel->hide(); - m_Controls.m_OpacityLabel->setEnabled(false); - m_Controls.m_OpacitySlider->setEnabled(false); - m_Controls.label->setEnabled(false); - m_Controls.label_2->setEnabled(false); - m_Controls.m_ShowRedGreenValues->setEnabled(false); - m_Controls.m_SwitchImages->hide(); - } - - else if(node == m_ContourHelperNode) - { - // can this cause a memory leak? - m_ContourHelperNode = NULL; - } -} - -void QmitkRigidRegistrationView::FixedSelected(mitk::DataNode::Pointer fixedImage) -{ - if (m_FixedNode.IsNotNull()) - { - this->SetImageColor(false); - m_FixedNode->SetOpacity(1.0); - } - m_FixedNode = fixedImage; - if (m_FixedNode.IsNotNull()) - { - m_FixedNode->SetOpacity(0.5); - m_FixedNode->SetVisibility(true); - m_Controls.TextLabelFixed->setText(QString::fromStdString(m_FixedNode->GetName())); - m_Controls.m_FixedLabel->show(); - m_Controls.TextLabelFixed->show(); - m_Controls.m_SwitchImages->show(); - mitk::ColorProperty::Pointer colorProperty; - colorProperty = dynamic_cast(m_FixedNode->GetProperty("color")); - if ( colorProperty.IsNotNull() ) - { - m_FixedColor = colorProperty->GetColor(); - } - this->SetImageColor(m_ShowRedGreen); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - if (dynamic_cast(m_FixedNode->GetData())) - { - m_FixedDimension = dynamic_cast(m_FixedNode->GetData())->GetDimension(); - m_Controls.qmitkRigidRegistrationSelector1->SetFixedDimension(m_FixedDimension); - m_Controls.qmitkRigidRegistrationSelector1->SetFixedNode(m_FixedNode); - } - - // what's about masking? - m_Controls.m_UseMaskingCB->show(); - - // Modify slider range - mitk::Image::Pointer image = dynamic_cast(m_FixedNode->GetData()); - int min = (int)image->GetStatistics()->GetScalarValueMin(); - int max = (int)image->GetStatistics()->GetScalarValueMax(); - m_Controls.m_ContourSlider->setRange(min, max); - - // Set slider to a default value - int avg = (min+max) / 2; - m_Controls.m_ContourSlider->setSliderPosition(avg); - m_Controls.m_ThresholdLabel->setText(QString::number(avg)); - } - else - { - m_Controls.m_FixedLabel->hide(); - m_Controls.TextLabelFixed->hide(); - m_Controls.m_SwitchImages->hide(); - } - this->CheckCalculateEnabled(); - if(this->GetActiveStdMultiWidget()) - { - m_TimeStepperAdapter = new QmitkStepperAdapter((QObject*) m_Controls.timeSlider, m_MultiWidget->GetTimeNavigationController()->GetTime(), "sliceNavigatorTimeFromRigidRegistration"); - connect( m_TimeStepperAdapter, SIGNAL( Refetch() ), this, SLOT( UpdateTimestep() ) ); - } -} - -void QmitkRigidRegistrationView::MovingSelected(mitk::DataNode::Pointer movingImage) -{ - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_OriginalOpacity); - if (m_FixedNode == m_MovingNode) - m_FixedNode->SetOpacity(0.5); - this->SetImageColor(false); - } - - // selection did not change - do onot reset - if( m_MovingNode.IsNotNull() && m_MovingNode == movingImage) - { - - } - else - { - - m_MovingNode = movingImage; - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetVisibility(true); - m_Controls.TextLabelMoving->setText(QString::fromStdString(m_MovingNode->GetName())); - m_Controls.m_MovingLabel->show(); - m_Controls.TextLabelMoving->show(); - mitk::ColorProperty::Pointer colorProperty; - colorProperty = dynamic_cast(m_MovingNode->GetProperty("color")); - if ( colorProperty.IsNotNull() ) - { - m_MovingColor = colorProperty->GetColor(); - } - this->SetImageColor(m_ShowRedGreen); - m_MovingNode->GetFloatProperty("opacity", m_OriginalOpacity); - this->OpacityUpdate(m_Opacity); - - // what's about masking? - m_Controls.m_UseMaskingCB->show(); - } - else - { - m_Controls.m_MovingLabel->hide(); - m_Controls.TextLabelMoving->hide(); - m_Controls.m_UseMaskingCB->hide(); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - this->MovingImageChanged(); - this->CheckCalculateEnabled(); - } -} - -bool QmitkRigidRegistrationView::CheckCalculate() -{ - if(m_MovingNode==m_FixedNode || !this->m_PresetNotLoaded ) - return false; - - return true; -} - -void QmitkRigidRegistrationView::AddNewTransformationToUndoList() -{ - mitk::BaseData::Pointer movingData = m_MovingNode->GetData(); - m_UndoGeometryList.push_back(static_cast(movingData->GetGeometry()->Clone().GetPointer())); - - GeometryMapType childGeometries = GeometryMapType(); - if(m_MovingMaskNode.IsNotNull()) - { - childGeometries.insert(std::pair(m_MovingMaskNode, - static_cast(m_MovingMaskNode->GetData()->GetGeometry()->Clone().GetPointer()))); - } - - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_MovingNode); - if(children.IsNotNull() && children->Size() != 0) - { - unsigned long size; - size = children->Size(); - for (unsigned long i = 0; i < size; ++i) - { - childGeometries.insert(std::pair(children->GetElement(i), - static_cast(children->GetElement(i)->GetData()->GetGeometry()->Clone().GetPointer()))); - } - } - m_UndoChildGeometryList.push_back(childGeometries); - m_RedoGeometryList.clear(); - m_RedoChildGeometryList.clear(); - this->SetUndoEnabled(true); - this->SetRedoEnabled(false); -} - -void QmitkRigidRegistrationView::UndoTransformation() -{ - if(!m_UndoGeometryList.empty()) - { - mitk::BaseData::Pointer movingData = m_MovingNode->GetData(); - m_RedoGeometryList.push_back(static_cast(movingData->GetGeometry(0)->Clone().GetPointer())); - - unsigned long size = 0; - GeometryMapType childGeometries = GeometryMapType(); - if(m_MovingMaskNode.IsNotNull()) - { - ++size; - } - - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_MovingNode); - size += children->Size(); - - for (unsigned long i = 0; i < size; ++i) - { - if(i==0) - { - childGeometries.insert(std::pair(m_MovingMaskNode, - static_cast(m_MovingMaskNode->GetData()->GetGeometry()->Clone().GetPointer()))); - } - else - { - childGeometries.insert(std::pair(children->GetElement(i), - static_cast(children->GetElement(i)->GetData()->GetGeometry()->Clone().GetPointer()))); - } - } - - m_RedoChildGeometryList.push_back(childGeometries); - - movingData->SetGeometry(m_UndoGeometryList.back()); - m_UndoGeometryList.pop_back(); - GeometryMapType oldChildGeometries; - oldChildGeometries = m_UndoChildGeometryList.back(); - m_UndoChildGeometryList.pop_back(); - - GeometryMapType::iterator iter; - for (unsigned long j = 0; j < size; ++j) - { - if(j == 0) // we have put the geometry for the moving mask at position one - { - iter = oldChildGeometries.find(m_MovingMaskNode); - mitk::Geometry3D* geo = static_cast((*iter).second); - m_MovingMaskNode->GetData()->SetGeometry(geo); - m_MovingMaskNode->GetData()->GetTimeGeometry()->Update(); - } - else - { - iter = oldChildGeometries.find(children->GetElement(j)); - children->GetElement(j)->GetData()->SetGeometry((*iter).second); - } - } - - //\FIXME when geometry is substituted the matrix referenced by the actor created by the mapper - //is still pointing to the old one. Workaround: delete mapper - - //m_MovingNode->SetMapper(1, NULL); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - - this->SetRedoEnabled(true); - } - if(!m_UndoGeometryList.empty()) - { - this->SetUndoEnabled(true); - } - else - { - this->SetUndoEnabled(false); - } - this->CheckCalculateEnabled(); -} - -void QmitkRigidRegistrationView::RedoTransformation() -{ - if(!m_RedoGeometryList.empty()) - { - mitk::BaseData::Pointer movingData = m_MovingNode->GetData(); - m_UndoGeometryList.push_back(static_cast(movingData->GetGeometry(0)->Clone().GetPointer())); - - unsigned long size = 0; - GeometryMapType childGeometries = GeometryMapType(); - if(m_MovingMaskNode.IsNotNull()) - { - ++size; - } - - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_MovingNode); - size += children->Size(); - - for (unsigned long i = 0; i < size; ++i) - { - if(i == 0) - { - childGeometries.insert(std::pair(m_MovingMaskNode, - static_cast(m_MovingMaskNode->GetData()->GetGeometry()->Clone().GetPointer()))); - } - else - { - childGeometries.insert(std::pair(children->GetElement(i), - static_cast(children->GetElement(i)->GetData()->GetGeometry()->Clone().GetPointer()))); - } - } - - m_UndoChildGeometryList.push_back(childGeometries); - - movingData->SetGeometry(m_RedoGeometryList.back()); - m_RedoGeometryList.pop_back(); - - GeometryMapType oldChildGeometries; - oldChildGeometries = m_RedoChildGeometryList.back(); - m_RedoChildGeometryList.pop_back(); - GeometryMapType::iterator iter; - for (unsigned long j = 0; j < size; ++j) - { - if(j == 0) - { - iter = oldChildGeometries.find(m_MovingMaskNode); - m_MovingMaskNode->GetData()->SetGeometry((*iter).second); - } - else - { - iter = oldChildGeometries.find(children->GetElement(j)); - children->GetElement(j)->GetData()->SetGeometry((*iter).second); - } - } - - movingData->GetTimeGeometry()->Update(); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - - this->SetUndoEnabled(true); - } - if(!m_RedoGeometryList.empty()) - { - this->SetRedoEnabled(true); - } - else - { - this->SetRedoEnabled(false); - } -} - -void QmitkRigidRegistrationView::ShowRedGreen(bool redGreen) -{ - m_ShowRedGreen = redGreen; - this->SetImageColor(m_ShowRedGreen); -} - -void QmitkRigidRegistrationView::EnableContour(bool show) -{ - if(show) - ShowContour(); - - // Can happen when the m_ContourHelperNode was deleted before and now the show contour checkbox is turned off - if(m_ContourHelperNode.IsNull()) - return; - - m_Controls.m_ContourSlider->setEnabled(show); - m_ContourHelperNode->SetProperty("visible", mitk::BoolProperty::New(show)); - - mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); -} - -void QmitkRigidRegistrationView::ShowContour() -{ - int threshold = m_Controls.m_ContourSlider->value(); - - bool show = m_Controls.m_ShowContour->isChecked(); - - if(m_FixedNode.IsNull() || !show) - return; - - - // Update the label next to the slider - m_Controls.m_ThresholdLabel->setText(QString::number(threshold)); - - mitk::Image::Pointer image = dynamic_cast(m_FixedNode->GetData()); - - typedef itk::Image FloatImageType; - typedef itk::Image ShortImageType; - - // Create a binary image using the given treshold - typedef itk::BinaryThresholdImageFilter ThresholdFilterType; - - FloatImageType::Pointer floatImage = FloatImageType::New(); - mitk::CastToItkImage(image, floatImage); - - - ThresholdFilterType::Pointer thresholdFilter = ThresholdFilterType::New(); - thresholdFilter->SetInput(floatImage); - thresholdFilter->SetLowerThreshold(threshold); - thresholdFilter->SetUpperThreshold((int)image->GetStatistics()->GetScalarValueMax()); - thresholdFilter->SetInsideValue(1); - thresholdFilter->SetOutsideValue(0); - thresholdFilter->Update(); - - ShortImageType::Pointer binaryImage = thresholdFilter->GetOutput(); - mitk::Image::Pointer mitkBinaryImage = mitk::Image::New(); - mitk::CastToMitkImage(binaryImage, mitkBinaryImage); - - - - - // Create a contour from the binary image - mitk::ManualSegmentationToSurfaceFilter::Pointer surfaceFilter = mitk::ManualSegmentationToSurfaceFilter::New(); - surfaceFilter->SetInput( mitkBinaryImage ); - surfaceFilter->SetThreshold( 1 ); //expects binary image with zeros and ones - surfaceFilter->SetUseGaussianImageSmooth(false); // apply gaussian to thresholded image ? - surfaceFilter->SetMedianFilter3D(false); // apply median to segmentation before marching cubes ? - surfaceFilter->SetDecimate( mitk::ImageToSurfaceFilter::NoDecimation ); - - surfaceFilter->UpdateLargestPossibleRegion(); - - // calculate normals for nicer display - mitk::Surface::Pointer surface = surfaceFilter->GetOutput(); - - - if(m_ContourHelperNode.IsNull()) - { - m_ContourHelperNode = mitk::DataNode::New(); - m_ContourHelperNode->SetData(surface); - m_ContourHelperNode->SetProperty("opacity", mitk::FloatProperty::New(1.0) ); - m_ContourHelperNode->SetProperty("line width", mitk::IntProperty::New(2) ); - m_ContourHelperNode->SetProperty("scalar visibility", mitk::BoolProperty::New(false) ); - m_ContourHelperNode->SetProperty( "name", mitk::StringProperty::New("surface") ); - m_ContourHelperNode->SetProperty("color", mitk::ColorProperty::New(1.0, 0.0, 0.0)); - m_ContourHelperNode->SetBoolProperty("helper object", true); - this->GetDataStorage()->Add(m_ContourHelperNode); - } - else - { - m_ContourHelperNode->SetData(surface); - } - - - mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); -} - - -void QmitkRigidRegistrationView::SetImageColor(bool redGreen) -{ - if (!redGreen && m_FixedNode.IsNotNull()) - { - m_FixedNode->SetColor(m_FixedColor); - } - if (!redGreen && m_MovingNode.IsNotNull()) - { - m_MovingNode->SetColor(m_MovingColor); - } - if (redGreen && m_FixedNode.IsNotNull()) - { - m_FixedNode->SetColor(1.0f, 0.0f, 0.0f); - } - if (redGreen && m_MovingNode.IsNotNull()) - { - m_MovingNode->SetColor(0.0f, 1.0f, 0.0f); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkRigidRegistrationView::OpacityUpdate(float opacity) -{ - m_Opacity = opacity; - if (m_MovingNode.IsNotNull()) - { - m_MovingNode->SetOpacity(m_Opacity); - } - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkRigidRegistrationView::OpacityUpdate(int opacity) -{ - float fValue = ((float)opacity)/100.0f; - this->OpacityUpdate(fValue); -} - -void QmitkRigidRegistrationView::ClearTransformationLists() -{ - this->SetUndoEnabled(false); - this->SetRedoEnabled(false); - m_UndoGeometryList.clear(); - m_UndoChildGeometryList.clear(); - m_RedoGeometryList.clear(); - m_RedoChildGeometryList.clear(); -} - -void QmitkRigidRegistrationView::Translate(int* translateVector) -{ - if (m_MovingNode.IsNotNull()) - { - mitk::Vector3D translateVec; - mitk::ScalarType sliderSensitivity = 0.1; - - translateVec[0] = sliderSensitivity * (translateVector[0] - m_TranslateSliderPos[0]); - translateVec[1] = sliderSensitivity * (translateVector[1] - m_TranslateSliderPos[1]); - translateVec[2] = sliderSensitivity * (translateVector[2] - m_TranslateSliderPos[2]); - - m_TranslateSliderPos[0] = translateVector[0]; - m_TranslateSliderPos[1] = translateVector[1]; - m_TranslateSliderPos[2] = translateVector[2]; - - vtkMatrix4x4* translationMatrix = vtkMatrix4x4::New(); - translationMatrix->Identity(); - - double (*transMatrix)[4] = translationMatrix->Element; - - transMatrix[0][3] = -translateVec[0]; - transMatrix[1][3] = -translateVec[1]; - transMatrix[2][3] = -translateVec[2]; - - translationMatrix->Invert(); - - m_MovingNode->GetData()->GetGeometry()->Compose( translationMatrix ); - m_MovingNode->GetData()->Modified(); - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_MovingNode); - unsigned long size; - size = children->Size(); - mitk::DataNode::Pointer childNode; - for (unsigned long i = 0; i < size; ++i) - { - childNode = children->GetElement(i); - childNode->GetData()->GetGeometry()->Compose( translationMatrix ); - childNode->GetData()->Modified(); - } - m_RedoGeometryList.clear(); - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } -} - -void QmitkRigidRegistrationView::Rotate(int* rotateVector) -{ - if (m_MovingNode.IsNotNull()) - { - mitk::Vector3D rotateVec; - - rotateVec[0] = rotateVector[0] - m_RotateSliderPos[0]; - rotateVec[1] = rotateVector[1] - m_RotateSliderPos[1]; - rotateVec[2] = rotateVector[2] - m_RotateSliderPos[2]; - - m_RotateSliderPos[0] = rotateVector[0]; - m_RotateSliderPos[1] = rotateVector[1]; - m_RotateSliderPos[2] = rotateVector[2]; - - vtkMatrix4x4* rotationMatrix = vtkMatrix4x4::New(); - vtkMatrix4x4* translationMatrix = vtkMatrix4x4::New(); - rotationMatrix->Identity(); - translationMatrix->Identity(); - - double (*rotMatrix)[4] = rotationMatrix->Element; - double (*transMatrix)[4] = translationMatrix->Element; - - mitk::Point3D centerBB = m_MovingNode->GetData()->GetGeometry()->GetCenter(); - - transMatrix[0][3] = centerBB[0]; - transMatrix[1][3] = centerBB[1]; - transMatrix[2][3] = centerBB[2]; - - translationMatrix->Invert(); - - m_MovingNode->GetData()->GetGeometry()->Compose( translationMatrix ); - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_MovingNode); - unsigned long size; - size = children->Size(); - mitk::DataNode::Pointer childNode; - for (unsigned long i = 0; i < size; ++i) - { - childNode = children->GetElement(i); - childNode->GetData()->GetGeometry()->Compose( translationMatrix ); - childNode->GetData()->Modified(); - } - - double radianX = rotateVec[0] * vnl_math::pi / 180; - double radianY = rotateVec[1] * vnl_math::pi / 180; - double radianZ = rotateVec[2] * vnl_math::pi / 180; - - if ( rotateVec[0] != 0 ) - { - rotMatrix[1][1] = cos( radianX ); - rotMatrix[1][2] = -sin( radianX ); - rotMatrix[2][1] = sin( radianX ); - rotMatrix[2][2] = cos( radianX ); - } - else if ( rotateVec[1] != 0 ) - { - rotMatrix[0][0] = cos( radianY ); - rotMatrix[0][2] = sin( radianY ); - rotMatrix[2][0] = -sin( radianY ); - rotMatrix[2][2] = cos( radianY ); - } - else if ( rotateVec[2] != 0 ) - { - rotMatrix[0][0] = cos( radianZ ); - rotMatrix[0][1] = -sin( radianZ ); - rotMatrix[1][0] = sin( radianZ ); - rotMatrix[1][1] = cos( radianZ ); - } - - m_MovingNode->GetData()->GetGeometry()->Compose( rotationMatrix ); - for (unsigned long i = 0; i < size; ++i) - { - childNode = children->GetElement(i); - childNode->GetData()->GetGeometry()->Compose( rotationMatrix ); - childNode->GetData()->Modified(); - } - - translationMatrix->Invert(); - - m_MovingNode->GetData()->GetGeometry()->Compose( translationMatrix ); - for (unsigned long i = 0; i < size; ++i) - { - childNode = children->GetElement(i); - childNode->GetData()->GetGeometry()->Compose( translationMatrix ); - childNode->GetData()->Modified(); - } - m_MovingNode->GetData()->Modified(); - m_RedoGeometryList.clear(); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } -} - -void QmitkRigidRegistrationView::Scale(int* scaleVector) -{ - if (m_MovingNode.IsNotNull()) - { - mitk::Vector3D scaleVec; - - scaleVec[0] = scaleVector[0] - m_ScaleSliderPos[0]; - scaleVec[1] = scaleVector[1] - m_ScaleSliderPos[1]; - scaleVec[2] = scaleVector[2] - m_ScaleSliderPos[2]; - - m_ScaleSliderPos[0] = scaleVector[0]; - m_ScaleSliderPos[1] = scaleVector[1]; - m_ScaleSliderPos[2] = scaleVector[2]; - - vtkMatrix4x4* scalingMatrix = vtkMatrix4x4::New(); - scalingMatrix->Identity(); - - double (*scaleMatrix)[4] = scalingMatrix->Element; - - if (scaleVec[0] >= 0) - { - for(int i = 0; i= 0) - { - for(int i = 0; i= 0) - { - for(int i = 0; iInvert(); - - m_MovingNode->GetData()->GetGeometry()->Compose( scalingMatrix ); - m_MovingNode->GetData()->Modified(); - mitk::DataStorage::SetOfObjects::ConstPointer children = this->GetDataStorage()->GetDerivations(m_MovingNode); - unsigned long size; - size = children->Size(); - mitk::DataNode::Pointer childNode; - for (unsigned long i = 0; i < size; ++i) - { - childNode = children->GetElement(i); - childNode->GetData()->GetGeometry()->Compose( scalingMatrix ); - childNode->GetData()->Modified(); - } - m_RedoGeometryList.clear(); - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); - } -} - -void QmitkRigidRegistrationView::AlignCenters() -{ - if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull()) - { - mitk::Point3D fixedPoint = m_FixedNode->GetData()->GetGeometry()->GetCenter(); - mitk::Point3D movingPoint = m_MovingNode->GetData()->GetGeometry()->GetCenter(); - mitk::Vector3D translateVec; - translateVec = fixedPoint - movingPoint; - translateVec *= 10; // account for slider sensitivity - m_Controls.m_XTransSlider->setValue((int)m_Controls.m_XTransSlider->value() + (int)translateVec[0]); - m_Controls.m_YTransSlider->setValue((int)m_Controls.m_YTransSlider->value() + (int)translateVec[1]); - m_Controls.m_ZTransSlider->setValue((int)m_Controls.m_ZTransSlider->value() + (int)translateVec[2]); - } -} - -void QmitkRigidRegistrationView::SetUndoEnabled( bool enable ) -{ - m_Controls.m_UndoTransformation->setEnabled(enable); -} - -void QmitkRigidRegistrationView::SetRedoEnabled( bool enable ) -{ - m_Controls.m_RedoTransformation->setEnabled(enable); -} - -void QmitkRigidRegistrationView::CheckCalculateEnabled() -{ - if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull() ) - { - m_Controls.m_ManualFrame->setEnabled(true); - - if( m_PresetSelected && !m_PresetNotLoaded ) - { - m_Controls.m_CalculateTransformation->setEnabled(true); - if ( (m_FixedDimension != m_MovingDimension && std::max(m_FixedDimension, m_MovingDimension) != 4) || m_FixedDimension < 2 /*|| m_FixedDimension > 3*/) - { - m_Controls.m_CalculateTransformation->setEnabled(false); - } - else if (m_Controls.qmitkRigidRegistrationSelector1->GetSelectedTransform() < 5 && (m_FixedDimension < 2) /*|| m_FixedDimension > 3)*/) - { - m_Controls.m_CalculateTransformation->setEnabled(false); - } - else if ((m_Controls.qmitkRigidRegistrationSelector1->GetSelectedTransform() > 4 && m_Controls.qmitkRigidRegistrationSelector1->GetSelectedTransform() < 13) && !(m_FixedDimension > 2)) - { - m_Controls.m_CalculateTransformation->setEnabled(false); - } - else if (m_Controls.qmitkRigidRegistrationSelector1->GetSelectedTransform() > 12 && m_FixedDimension != 2) - { - m_Controls.m_CalculateTransformation->setEnabled(false); - } - } - } - else - { - m_Controls.m_CalculateTransformation->setEnabled(false); - m_Controls.m_ManualFrame->setEnabled(false); - } -} - -void QmitkRigidRegistrationView::xTrans_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - translationParams[0]=v; - translationParams[1]=m_Controls.m_YTransSlider->value(); - translationParams[2]=m_Controls.m_ZTransSlider->value(); - Translate(translationParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::yTrans_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - translationParams[0]=m_Controls.m_XTransSlider->value(); - translationParams[1]=v; - translationParams[2]=m_Controls.m_ZTransSlider->value(); - Translate(translationParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::zTrans_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - translationParams[0]=m_Controls.m_XTransSlider->value(); - translationParams[1]=m_Controls.m_YTransSlider->value(); - translationParams[2]=v; - Translate(translationParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::xRot_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - rotationParams[0]=v; - rotationParams[1]=m_Controls.m_YRotSlider->value(); - rotationParams[2]=m_Controls.m_ZRotSlider->value(); - Rotate(rotationParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::yRot_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - rotationParams[0]=m_Controls.m_XRotSlider->value(); - rotationParams[1]=v; - rotationParams[2]=m_Controls.m_ZRotSlider->value(); - Rotate(rotationParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::zRot_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - rotationParams[0]=m_Controls.m_XRotSlider->value(); - rotationParams[1]=m_Controls.m_YRotSlider->value(); - rotationParams[2]=v; - Rotate(rotationParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::xScale_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - scalingParams[0]=v; - scalingParams[1]=m_Controls.m_YScaleSlider->value(); - scalingParams[2]=m_Controls.m_ZScaleSlider->value(); - Scale(scalingParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::yScale_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - scalingParams[0]=m_Controls.m_XScaleSlider->value(); - scalingParams[1]=v; - scalingParams[2]=m_Controls.m_ZScaleSlider->value(); - Scale(scalingParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::zScale_valueChanged( int v ) -{ - if (m_MovingNode.IsNotNull()) - { - scalingParams[0]=m_Controls.m_XScaleSlider->value(); - scalingParams[1]=m_Controls.m_YScaleSlider->value(); - scalingParams[2]=v; - Scale(scalingParams); - } - else - { - MovingImageChanged(); - } -} - -void QmitkRigidRegistrationView::MovingImageChanged() -{ - if (dynamic_cast(m_MovingNode->GetData())) - { - m_Controls.m_XTransSlider->setValue(0); - m_Controls.m_YTransSlider->setValue(0); - m_Controls.m_ZTransSlider->setValue(0); - translationParams[0]=0; - translationParams[1]=0; - translationParams[2]=0; - m_Controls.m_XRotSlider->setValue(0); - m_Controls.m_YRotSlider->setValue(0); - m_Controls.m_ZRotSlider->setValue(0); - rotationParams[0]=0; - rotationParams[1]=0; - rotationParams[2]=0; - m_Controls.m_XScaleSlider->setValue(0); - m_Controls.m_YScaleSlider->setValue(0); - m_Controls.m_ZScaleSlider->setValue(0); - scalingParams[0]=0; - scalingParams[1]=0; - scalingParams[2]=0; - m_MovingDimension = dynamic_cast(m_MovingNode->GetData())->GetDimension(); - m_Controls.qmitkRigidRegistrationSelector1->SetMovingDimension(m_MovingDimension); - m_Controls.qmitkRigidRegistrationSelector1->SetMovingNode(m_MovingNode); - this->CheckCalculateEnabled(); - } -} - -void QmitkRigidRegistrationView::Calculate() -{ - m_Controls.qmitkRigidRegistrationSelector1->SetFixedNode(m_FixedNode); - m_Controls.qmitkRigidRegistrationSelector1->SetMovingNode(m_MovingNode); - - if (m_FixedMaskNode.IsNotNull() && m_Controls.m_UseMaskingCB->isChecked()) - { - m_Controls.qmitkRigidRegistrationSelector1->SetFixedMaskNode(m_FixedMaskNode); - } - else - { - m_Controls.qmitkRigidRegistrationSelector1->SetFixedMaskNode(NULL); - } - if (m_MovingMaskNode.IsNotNull() && m_Controls.m_UseMaskingCB->isChecked()) - { - m_Controls.qmitkRigidRegistrationSelector1->SetMovingMaskNode(m_MovingMaskNode); - } - else - { - m_Controls.qmitkRigidRegistrationSelector1->SetMovingMaskNode(NULL); - } - - if(m_Controls.m_cbAlignImageCenters->isChecked() ) - { - this->AlignCenters(); - } - - m_Controls.frame_2->setEnabled(false); - m_Controls.frame_3->setEnabled(false); - m_Controls.m_CalculateTransformation->setEnabled(false); - m_Controls.m_StopOptimization->setEnabled(true); - m_Controls.qmitkRigidRegistrationSelector1->CalculateTransformation(((QmitkSliderNavigatorWidget*)m_Controls.timeSlider)->GetPos()); - m_Controls.m_StopOptimization->setEnabled(false); - m_Controls.frame_2->setEnabled(true); - m_Controls.frame_3->setEnabled(true); - m_Controls.m_CalculateTransformation->setEnabled(true); - m_Controls.qmitkRigidRegistrationSelector1->StopOptimization(false); -} - -void QmitkRigidRegistrationView::SetOptimizerValue( double value ) -{ - m_Controls.m_OptimizerValueLCD->display(value); -} - -void QmitkRigidRegistrationView::StopOptimizationClicked() -{ - m_Controls.qmitkRigidRegistrationSelector1->StopOptimization(true); -} - -void QmitkRigidRegistrationView::UpdateTimestep() -{ - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); -} - -void QmitkRigidRegistrationView::ShowManualRegistrationFrame(bool show) -{ - if (show) - { - m_Controls.m_ManualFrame->show(); - } - else - { - m_Controls.m_ManualFrame->hide(); - } -} - -void QmitkRigidRegistrationView::SetImagesVisible(berry::ISelection::ConstPointer /*selection*/) -{ - if (this->m_CurrentSelection->Size() == 0) - { - // show all images - mitk::DataStorage::SetOfObjects::ConstPointer setOfObjects = this->GetDataStorage()->GetAll(); - for (mitk::DataStorage::SetOfObjects::ConstIterator nodeIt = setOfObjects->Begin() - ; nodeIt != setOfObjects->End(); ++nodeIt) // for each node - { - if ( (nodeIt->Value().IsNotNull()) && (nodeIt->Value()->GetProperty("visible")) && dynamic_cast(nodeIt->Value()->GetData())==NULL) - { - nodeIt->Value()->SetVisibility(true); - } - } - } - else - { - // hide all images - mitk::DataStorage::SetOfObjects::ConstPointer setOfObjects = this->GetDataStorage()->GetAll(); - for (mitk::DataStorage::SetOfObjects::ConstIterator nodeIt = setOfObjects->Begin() - ; nodeIt != setOfObjects->End(); ++nodeIt) // for each node - { - if ( (nodeIt->Value().IsNotNull()) && (nodeIt->Value()->GetProperty("visible")) && dynamic_cast(nodeIt->Value()->GetData())==NULL) - { - nodeIt->Value()->SetVisibility(false); - } - } - } -} - -void QmitkRigidRegistrationView::TabChanged(int index) -{ - if (index == 0) - { - m_Controls.frame->hide(); - } - else - { - m_Controls.frame->show(); - } -} - -void QmitkRigidRegistrationView::SwitchImages() -{ - mitk::DataNode::Pointer newMoving = m_FixedNode; - mitk::DataNode::Pointer newFixed = m_MovingNode; - this->FixedSelected(newFixed); - this->MovingSelected(newMoving); - - if(m_ContourHelperNode.IsNotNull()) - { - // Update the contour - ShowContour(); - } - - if(m_Controls.m_UseMaskingCB->isChecked()) - { - mitk::DataNode::Pointer tempMovingMask = NULL; - mitk::DataNode::Pointer tempFixedMask = NULL; - - if(m_FixedMaskNode.IsNotNull()) // it is initialized - { - tempFixedMask = m_Controls.m_FixedImageCB->GetSelectedNode(); - } - - if(m_MovingMaskNode.IsNotNull()) // it is initialized - { - tempMovingMask = m_Controls.m_MovingImageCB->GetSelectedNode(); - } - m_Controls.m_FixedImageCB->SetSelectedNode(tempMovingMask); - m_Controls.m_MovingImageCB->SetSelectedNode(tempFixedMask); - } -} - -void QmitkRigidRegistrationView::OnUseMaskingChanged( int state ) -{ - if(state == Qt::Checked) - { - m_Controls.m_FixedImageCB->show(); - m_Controls.m_MovingImageCB->show(); - m_Controls.m_MovingMaskLB->show(); - m_Controls.m_FixedMaskLB->show(); - } - else - { - m_Controls.m_FixedImageCB->hide(); - m_Controls.m_MovingImageCB->hide(); - m_Controls.m_MovingMaskLB->hide(); - m_Controls.m_FixedMaskLB->hide(); - - m_FixedMaskNode = NULL; - m_MovingMaskNode = NULL; - } -} - -void QmitkRigidRegistrationView::OnFixedMaskImageChanged( const mitk::DataNode* node ) -{ - if(m_Controls.m_UseMaskingCB->isChecked()) - m_FixedMaskNode = const_cast(node); - else - m_FixedMaskNode = NULL; -} - -void QmitkRigidRegistrationView::OnMovingMaskImageChanged( const mitk::DataNode* node ) -{ - if(m_Controls.m_UseMaskingCB->isChecked()) - m_MovingMaskNode = const_cast(node); - else - m_MovingMaskNode = NULL; -} diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationView.h b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationView.h deleted file mode 100644 index e22e8ded2f..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationView.h +++ /dev/null @@ -1,336 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef QMITKRIGIDREGISTRATION_H -#define QMITKRIGIDREGISTRATION_H - -#include "QmitkFunctionality.h" -#include "ui_QmitkRigidRegistrationViewControls.h" - -#include "berryISelectionListener.h" -#include "berryIStructuredSelection.h" - -#include - -// Time Slider related -#include - -/*! -\brief This functionality allows you to register 2D as well as 3D images in a rigid manner. - -Register means to align two images, so that they become as similar as possible. -Therefore you can select from different transforms, metrics and optimizers. -Registration results will directly be applied to the Moving Image. - -\sa QmitkFunctionality -\ingroup Functionalities -\ingroup RigidRegistration - -\author Daniel Stein -*/ - -class REGISTRATION_EXPORT QmitkRigidRegistrationView : public QmitkFunctionality -{ - - friend struct SelListenerRigidRegistration; - - Q_OBJECT - - public: - - static const std::string VIEW_ID; - - /*! - \brief default constructor - */ - QmitkRigidRegistrationView(QObject *parent=0, const char *name=0); - - /*! - \brief default destructor - */ - virtual ~QmitkRigidRegistrationView(); - - /*! - \brief method for creating the applications main widget - */ - virtual void CreateQtPartControl(QWidget *parent) override; - - /*! - \brief Sets the StdMultiWidget and connects it to the functionality. - */ - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - - /*! - \brief Removes the StdMultiWidget and disconnects it from the functionality. - */ - virtual void StdMultiWidgetNotAvailable() override; - - /*! - \brief method for creating the connections of main and control widget - */ - virtual void CreateConnections(); - - /*! - \brief Method which is called when this functionality is selected in MITK - */ - virtual void Activated() override; - - /*! - \brief Method which is called whenever the functionality is deselected in MITK - */ - virtual void Deactivated() override; - - virtual void Visible() override; - virtual void Hidden() override; - - void DataNodeHasBeenRemoved(const mitk::DataNode* node); - - signals: - void PresetSelected( QString preset_name ); - - protected slots: - - /*! - * sets the fixed Image according to TreeNodeSelector widget - */ - void FixedSelected(mitk::DataNode::Pointer fixedImage); - - /*! - * sets the moving Image according to TreeNodeSelector widget - */ - void MovingSelected(mitk::DataNode::Pointer movingImage); - - /*! - * checks if registration is possible - */ - bool CheckCalculate(); - - /** - \brief Load the preset set within the combo box - */ - void LoadSelectedPreset(); - - /*! - * \brief Undo the last registration. - */ - void UndoTransformation(); - - /*! - * \brief Redo the last registration - */ - void RedoTransformation(); - - /*! - * \brief Adds a new Transformation to the undo list and enables the undo button. - */ - void AddNewTransformationToUndoList(); - - /*! - * \brief Translates the moving image in x, y and z direction given by translateVector - * - * @param translateVector Contains the translation in x, y and z direction. - */ - void Translate(int* translateVector); - - /*! - * \brief Rotates the moving image in x, y and z direction given by rotateVector - * - * @param rotateVector Contains the rotation around x, y and z axis. - */ - void Rotate(int* rotateVector); - - /*! - * \brief Scales the moving image in x, y and z direction given by scaleVector - * - * @param scaleVector Contains the scaling around x, y and z axis. - */ - void Scale(int* scaleVector); - - /*! - * \brief Automatically aligns the image centers. - */ - void AlignCenters(); - - /*! - * \brief Stores whether the image will be shown in gray values or in red for fixed image and green for moving image - * @param show if true, then images will be shown in red and green - */ - void ShowRedGreen(bool show); - - /*! - * \brief Draws the contour of the fixed image according to a threshold - * @param show if true, then images will be shown in red and green - */ - void ShowContour(); - - /*! - * \brief Stores whether the contour of the fixed image will be shhown - * @param show if true, the contour of the fixed image is shown - */ - void EnableContour(bool show); - - /*! - * \brief Changes the visibility of the manual registration methods accordingly to the checkbox "Manual Registration" in GUI - * @param show if true, then manual registration methods will be shown - */ - void ShowManualRegistrationFrame(bool show); - - /*! - * \brief Sets the selected opacity for moving image - * @param opacity the selected opacity - */ - void OpacityUpdate(float opacity); - - /*! - \brief Sets the selected opacity for moving image - - @param opacity the selected opacity - */ - void OpacityUpdate(int opacity); - - /*! - * \brief Sets the images to grayvalues or fixed image to red and moving image to green - * @param redGreen if true, then images will be shown in red and green - */ - void SetImageColor(bool redGreen); - - /*! - * \brief Clears the undo and redo lists and sets the undo and redo buttons to disabled. - */ - void ClearTransformationLists(); - - void SetUndoEnabled( bool enable ); - - void SetRedoEnabled( bool enable ); - - void CheckCalculateEnabled(); - - void xTrans_valueChanged( int v ); - - void yTrans_valueChanged( int v ); - - void zTrans_valueChanged( int v ); - - void xRot_valueChanged( int v ); - - void yRot_valueChanged( int v ); - - void zRot_valueChanged( int v ); - - void xScale_valueChanged( int v ); - - void yScale_valueChanged( int v ); - - void zScale_valueChanged( int v ); - - void MovingImageChanged(); - - /*! - * \brief Starts the registration process. - */ - void Calculate(); - - void SetOptimizerValue( double value ); - - void StopOptimizationClicked(); - - void UpdateTimestep(); - - void SetImagesVisible(berry::ISelection::ConstPointer /*selection*/); - - //void CheckForMaskImages(); - - //void UseFixedMaskImageChecked(bool checked); - - //void UseMovingMaskImageChecked(bool checked); - - void TabChanged(int index); - - void SwitchImages(); - - /*! - * indicates if the masking option shall be used. - */ - void OnUseMaskingChanged(int state); - - /*! - * method called if the fixed mask image selector changed. - */ - void OnFixedMaskImageChanged(const mitk::DataNode* node); - /*! - * method called if the moving mask image selector changed. - */ - void OnMovingMaskImageChanged(const mitk::DataNode* node); - - void PresetSelectionChanged(); -protected: - - void FillPresetComboBox(const std::list &preset); - - QScopedPointer m_SelListener; - berry::IStructuredSelection::ConstPointer m_CurrentSelection; - - /*! - * default main widget containing 4 windows showing 3 - * orthogonal slices of the volume and a 3d render window - */ - QmitkStdMultiWidget * m_MultiWidget; - - /*! - * control widget to make all changes for Deformable registration - */ - Ui::QmitkRigidRegistrationViewControls m_Controls; - mitk::DataNode::Pointer m_MovingNode; - mitk::DataNode::Pointer m_MovingMaskNode; - mitk::DataNode::Pointer m_FixedNode; - mitk::DataNode::Pointer m_FixedMaskNode; - - - - // A node to store the contour of the fixed image in - mitk::DataNode::Pointer m_ContourHelperNode; - - typedef std::map GeometryMapType; - typedef std::list< GeometryMapType > GeometryMapListType; - typedef std::list GeometryListType; - - GeometryListType m_UndoGeometryList; - GeometryMapListType m_UndoChildGeometryList; - GeometryListType m_RedoGeometryList; - GeometryMapListType m_RedoChildGeometryList; - bool m_ShowRedGreen; - float m_Opacity; - float m_OriginalOpacity; - bool m_Deactivated; - int m_FixedDimension; - int m_MovingDimension; - int * translationParams; - int * rotationParams; - int * scalingParams; - mitk::Color m_FixedColor; - mitk::Color m_MovingColor; - int m_TranslateSliderPos[3]; - int m_RotateSliderPos[3]; - int m_ScaleSliderPos[3]; - - bool m_PresetSelected; - - bool m_PresetNotLoaded; - - QmitkStepperAdapter* m_TimeStepperAdapter; -}; - -#endif //QMITKRigidREGISTRATION_H diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationViewControls.ui b/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationViewControls.ui deleted file mode 100644 index cca6a9851d..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/QmitkRigidRegistrationViewControls.ui +++ /dev/null @@ -1,1134 +0,0 @@ - - - QmitkRigidRegistrationViewControls - - - - 0 - 0 - 496 - 973 - - - - - 0 - 0 - - - - RigidRegistrationControls - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QTabWidget::South - - - QTabWidget::Triangular - - - 0 - - - Qt::ElideNone - - - - Automatic Registration - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - - Moving Image Mask: - - - - - - - - - - - - - - Load Preset - - - - - - - - - - - Show contour - - - - - - - false - - - Qt::Horizontal - - - - - - - 0 - - - - - - - - - Align Image Centers - - - - - - - - - - - 10 - - - - - - - false - - - - - - - - - 0% - - - - - - - Moving Image Opacity: - - - false - - - - - - - - 0 - 0 - - - - 100 - - - 50 - - - Qt::Horizontal - - - - - - - 100% - - - - - - - - - - 0 - 0 - - - - Show Images Red/Green - - - - - - - - - - - - 255 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 255 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 118 - 116 - 108 - - - - - - - 118 - 116 - 108 - - - - - - - 118 - 116 - 108 - - - - - - - - - 8 - - - - - - - You have to select two images from Data Manager using CTRL + left click! - - - - - - - Initialization Step: - - - - - - - - - Fixed Image Mask: - - - - - - - - - - - - - 8 - - - - Moving Image: - - - - - - - Use Image Masking - - - - - - - Registration method: - - - - - - - - - - Switch fixed and moving image - - - - - - - - 10 - - - - - - - false - - - - - - - - 8 - - - - Fixed Image: - - - - - - - Qt::Horizontal - - - - - - - - - - - - false - - - Stop - - - - - - - false - - - - 0 - 0 - - - - - 0 - 0 - - - - Register - - - - :/QmitkRigidRegistrationView/RigidRegistration.xpm:/QmitkRigidRegistrationView/RigidRegistration.xpm - - - false - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - - Optimizer Value: - - - false - - - - - - - QFrame::Raised - - - 10 - - - QLCDNumber::Flat - - - - - - - - - - - false - - - - 0 - 0 - - - - Undo Transformation - - - - :/org.mitk.gui.qt.ext/edit-undo.png:/org.mitk.gui.qt.ext/edit-undo.png - - - - - - - false - - - - 0 - 0 - - - - Redo Transformation - - - - :/org.mitk.gui.qt.ext/edit-redo.png:/org.mitk.gui.qt.ext/edit-redo.png - - - - - - - - - Manual Registration - - - - - - - true - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 50 - false - - - - Align Image Centers - - - - - - - - 75 - true - - - - Interactive Translations - - - true - - - false - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - x-Direction (Frontal): - - - false - - - - - - - - 50 - false - - - - y-Direction (Sagittal): - - - false - - - - - - - - 50 - false - - - - z-Direction (Axial): - - - false - - - - - - - - - - - ArrowCursor - - - - - - -10000 - - - 10000 - - - Qt::Horizontal - - - - - - - -10000 - - - 10000 - - - Qt::Horizontal - - - - - - - -10000 - - - 10000 - - - Qt::Horizontal - - - - - - - - - - - - - - - 75 - true - - - - Interactive Rotations - - - true - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - x-Axis (Frontal): - - - false - - - - - - - - 50 - false - - - - y-Axis (Sagittal): - - - false - - - - - - - - 50 - false - - - - z-Axis (Axial): - - - false - - - - - - - - - - - ArrowCursor - - - - - - -20 - - - 20 - - - Qt::Horizontal - - - - - - - -20 - - - 20 - - - Qt::Horizontal - - - - - - - -20 - - - 20 - - - Qt::Horizontal - - - - - - - - - - - - - - - 75 - true - - - - Interactive Scaling - - - true - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - 50 - false - - - - x-Direction (Frontal): - - - false - - - - - - - - 50 - false - - - - y-Direction (Sagittal): - - - false - - - - - - - - 50 - false - - - - z-Direction (Axial): - - - false - - - - - - - - - - - ArrowCursor - - - - - - -180 - - - 180 - - - 1 - - - 1 - - - Qt::Horizontal - - - false - - - QSlider::NoTicks - - - - - - - -180 - - - 180 - - - 1 - - - Qt::Horizontal - - - - - - - -180 - - - 180 - - - 1 - - - Qt::Horizontal - - - - - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - Advanced Mode - - - - - - Load Testpresets - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 10 - 10 - 505 - 712 - - - - - 0 - 0 - - - - - - - - - Save as Testpreset - - - - - - - Save as Preset - - - - - - - - - - - - - QmitkRigidRegistrationSelectorView - QWidget -
src/internal/QmitkRigidRegistrationSelectorView.h
- 1 -
- - QmitkSliderNavigatorWidget - QWidget -
QmitkSliderNavigatorWidget.h
- 1 -
- - QmitkDataStorageComboBox - QComboBox -
QmitkDataStorageComboBox.h
-
-
- - mitkDataNode.h - mitkBaseData.h - - - - - -
diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkLandmarkWarping.cpp b/Plugins/org.mitk.gui.qt.registration/src/internal/mitkLandmarkWarping.cpp deleted file mode 100644 index da2f8ed897..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkLandmarkWarping.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkLandmarkWarping.h" - -mitk::LandmarkWarping::LandmarkWarping() -{ - m_Deformer = DeformationSourceType::New(); - m_LandmarkDeformer = DeformationSourceType::New(); -} - -mitk::LandmarkWarping::~LandmarkWarping() -{ -} - -void mitk::LandmarkWarping::SetFixedImage(FixedImageType::Pointer fixedImage) -{ - m_FixedImage = fixedImage; - m_Deformer->SetOutputSpacing( m_FixedImage->GetSpacing() ); - m_Deformer->SetOutputOrigin( m_FixedImage->GetOrigin() ); - m_Deformer->SetOutputRegion( m_FixedImage->GetLargestPossibleRegion() ); -} - -void mitk::LandmarkWarping::SetMovingImage(MovingImageType::Pointer movingImage) -{ - m_MovingImage = movingImage; - m_LandmarkDeformer->SetOutputSpacing( m_MovingImage->GetSpacing() ); - m_LandmarkDeformer->SetOutputOrigin( m_MovingImage->GetOrigin() ); - m_LandmarkDeformer->SetOutputRegion( m_MovingImage->GetLargestPossibleRegion() ); -} - -void mitk::LandmarkWarping::SetLandmarks(LandmarkContainerType::Pointer source, LandmarkContainerType::Pointer target) -{ - m_SourceLandmarks = source; - m_TargetLandmarks = target; - m_Deformer->SetSourceLandmarks( source ); - m_Deformer->SetTargetLandmarks( target ); - m_LandmarkDeformer->SetSourceLandmarks( target ); - m_LandmarkDeformer->SetTargetLandmarks( source ); -} - -mitk::LandmarkWarping::MovingImageType::Pointer mitk::LandmarkWarping::Register() -{ - try - { - m_Observer = Observer::New(); - unsigned long obs = m_Deformer->AddObserver(itk::ProgressEvent(), m_Observer); - mitk::ProgressBar::GetInstance()->AddStepsToDo(120); - m_Deformer->UpdateLargestPossibleRegion(); - m_Deformer->RemoveObserver(obs); - } - catch( itk::ExceptionObject & excp ) - { - std::cerr << "Exception thrown " << std::endl; - std::cerr << excp << std::endl; - return nullptr; - } - - try - { - unsigned long obs2 = m_LandmarkDeformer->AddObserver(itk::ProgressEvent(), m_Observer); - m_LandmarkDeformer->UpdateLargestPossibleRegion(); - m_LandmarkDeformer->RemoveObserver(obs2); - } - catch( itk::ExceptionObject & excp ) - { - std::cerr << "Exception thrown " << std::endl; - std::cerr << excp << std::endl; - return nullptr; - } - - m_DeformationField = m_Deformer->GetOutput(); - m_InverseDeformationField = m_LandmarkDeformer->GetOutput(); - - m_Warper = FilterType::New(); - - typedef itk::LinearInterpolateImageFunction< - MovingImageType, double > InterpolatorType; - - InterpolatorType::Pointer interpolator = InterpolatorType::New(); - - m_Warper->SetInterpolator( interpolator ); - - - m_Warper->SetOutputSpacing( m_DeformationField->GetSpacing() ); - m_Warper->SetOutputOrigin( m_DeformationField->GetOrigin() ); - - m_Warper->SetDisplacementField( m_DeformationField ); - - m_Warper->SetInput( m_MovingImage ); - - unsigned long obs3 = m_Warper->AddObserver(itk::ProgressEvent(), m_Observer); - m_Warper->UpdateLargestPossibleRegion(); - m_Warper->RemoveObserver(obs3); - - return m_Warper->GetOutput(); -} - -mitk::LandmarkWarping::LandmarkContainerType::Pointer mitk::LandmarkWarping::GetTransformedTargetLandmarks() -{ - LandmarkContainerType::Pointer landmarks = LandmarkContainerType::New(); - LandmarkWarping::LandmarkPointType transformedTargetPoint; - - for(unsigned int pointId=0; pointIdSize();++pointId) - { - LandmarkWarping::LandmarkPointType targetPoint=m_TargetLandmarks->GetElement(pointId); - transformedTargetPoint = m_LandmarkDeformer->GetKernelTransform()->TransformPoint(targetPoint); - landmarks->InsertElement(pointId, transformedTargetPoint ); - } - return landmarks; -} diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkLandmarkWarping.h b/Plugins/org.mitk.gui.qt.registration/src/internal/mitkLandmarkWarping.h deleted file mode 100644 index 7eb75f47f0..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkLandmarkWarping.h +++ /dev/null @@ -1,115 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#ifndef MITKLANDMARKWARPING_H -#define MITKLANDMARKWARPING_H - -#include "itkLandmarkDisplacementFieldSource.h" -#include "itkWarpImageFilter.h" -#include "itkCommand.h" -#include "mitkProgressBar.h" - -namespace mitk -{ - class LandmarkWarping - { - - public: - LandmarkWarping(); - ~LandmarkWarping(); - - static const unsigned int Dimension = 3; - typedef float VectorComponentType; - - typedef itk::Vector< VectorComponentType, Dimension > VectorType; - - typedef itk::Image< VectorType, Dimension > DeformationFieldType; - - - typedef unsigned char PixelType; - typedef itk::Image< PixelType, Dimension > FixedImageType; - typedef itk::Image< PixelType, Dimension > MovingImageType; - typedef itk::LandmarkDisplacementFieldSource< DeformationFieldType > DeformationSourceType; - typedef DeformationSourceType::LandmarkContainerPointer LandmarkContainerPointer; - typedef DeformationSourceType::LandmarkContainer LandmarkContainerType; - typedef DeformationSourceType::LandmarkPointType LandmarkPointType; - typedef itk::WarpImageFilter< MovingImageType, MovingImageType, DeformationFieldType > FilterType; - - FixedImageType::Pointer m_FixedImage; - MovingImageType::Pointer m_MovingImage; - DeformationSourceType::Pointer m_Deformer; - DeformationSourceType::Pointer m_LandmarkDeformer; - LandmarkWarping::LandmarkContainerType::Pointer m_TargetLandmarks; - LandmarkWarping::LandmarkContainerType::Pointer m_SourceLandmarks; - FilterType::Pointer m_Warper; - DeformationFieldType::ConstPointer m_DeformationField; - DeformationFieldType::ConstPointer m_InverseDeformationField; - - - void SetFixedImage(FixedImageType::Pointer fi); - void SetMovingImage(MovingImageType::Pointer mi); - void SetLandmarks(LandmarkContainerType::Pointer source, LandmarkContainerType::Pointer target); - MovingImageType::Pointer Register(); - LandmarkContainerType::Pointer GetTransformedTargetLandmarks(); - - protected: - - // observerclass to react on changes on pointsetnodes - class Observer : public itk::Command - { - public: - typedef Observer Self; - typedef itk::Command Superclass; - typedef itk::SmartPointer Pointer; - - itkFactorylessNewMacro(Self) - itkCloneMacro(Self) - - protected: - Observer() - { - m_Counter = 0; - }; - unsigned int m_Counter; - - public: - - void Execute(itk::Object *object, const itk::EventObject & event) override - { - Execute( (const itk::Object*) object, event ); - } - - void Execute(const itk::Object * object, const itk::EventObject & /*event*/) override - { - const itk::ProcessObject * internalFilter = dynamic_cast( object ); - if (!(internalFilter->GetProgress() == 0 || internalFilter->GetProgress() == 1)) - { - ++m_Counter; - mitk::ProgressBar::GetInstance()->Progress(); - } - if (internalFilter->GetProgress() == 1 && m_Counter > 20 && m_Counter < 120) - { - mitk::ProgressBar::GetInstance()->Progress(120 - m_Counter); - m_Counter = 120; - } - } - }; - - Observer::Pointer m_Observer; - }; -} - -#endif // MITKLANDMARKWARPING_H diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkPluginActivator.cpp b/Plugins/org.mitk.gui.qt.registration/src/internal/mitkPluginActivator.cpp deleted file mode 100644 index 954313b04d..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkPluginActivator.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ - -#include "mitkPluginActivator.h" - -#include "src/internal/QmitkDeformableRegistrationView.h" -#include "src/internal/QmitkPointBasedRegistrationView.h" -#include "src/internal/QmitkRigidRegistrationView.h" - -namespace mitk { - -void PluginActivator::start(ctkPluginContext* context) -{ - BERRY_REGISTER_EXTENSION_CLASS(QmitkDeformableRegistrationView, context) - BERRY_REGISTER_EXTENSION_CLASS(QmitkPointBasedRegistrationView, context) - BERRY_REGISTER_EXTENSION_CLASS(QmitkRigidRegistrationView, context) - //Q_UNUSED(context) -} - -void PluginActivator::stop(ctkPluginContext* context) -{ - Q_UNUSED(context) -} - -} diff --git a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkPluginActivator.h b/Plugins/org.mitk.gui.qt.registration/src/internal/mitkPluginActivator.h deleted file mode 100644 index dcb576ba63..0000000000 --- a/Plugins/org.mitk.gui.qt.registration/src/internal/mitkPluginActivator.h +++ /dev/null @@ -1,39 +0,0 @@ -/*=================================================================== - -The Medical Imaging Interaction Toolkit (MITK) - -Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. -All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. - -See LICENSE.txt or http://www.mitk.org for details. - -===================================================================*/ -#ifndef MITKPLUGINACTIVATOR_H -#define MITKPLUGINACTIVATOR_H - -#include - -namespace mitk { - -class PluginActivator : - public QObject, public ctkPluginActivator -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "org_mitk_gui_qt_registration") - Q_INTERFACES(ctkPluginActivator) - -public: - - void start(ctkPluginContext* context) override; - void stop(ctkPluginContext* context) override; - -}; // PluginActivator - -} - -#endif // MITKPLUGINACTIVATOR_H diff --git a/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_Technical.dox b/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_Technical.dox index 0881222a0e..83a22733cd 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_Technical.dox +++ b/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_Technical.dox @@ -1,101 +1,101 @@ /** \page QmitkSegmentationTechnicalPage Technical design of QmitkSegmentation \li \ref QmitkSegmentationTechnicalPage2 \li \ref QmitkSegmentationTechnicalPage3 \li \ref QmitkSegmentationTechnicalPage4 \section QmitkSegmentationTechnicalPage2 Introduction QmitkSegmentation was designed for the liver resection planning project "ReLiver". The goal was a stable, well-documented, extensible, and testable re-implementation of a functionality called "ERIS", which was used for manual segmentation in 2D slices of 3D or 3D+t images. Re-implementation was chosen because it seemed to be easier to write documentation and tests for newly developed code. In addition, the old code had some design weaknesses (e.g. a monolithic class), which would be hard to maintain in the future. By now Segmentation is a well tested and easily extensible vehicle for all kinds of interactive segmentation applications. A separate page describes how you can extend Segmentation with new tools in a shared object (DLL): \ref toolextensions. \section QmitkSegmentationTechnicalPage3 Overview of tasks We identified the following major tasks:
  1. Management of images: what is the original patient image, what images are the active segmentations?
  2. Management of drawing tools: there is a set of drawing tools, one at a time is active, that is, someone has to decide which tool will receive mouse (and other) events.
  3. Drawing tools: each tool can modify a segmentation in reaction to user interaction. To do so, the tools have to know about the relevant images.
  4. Slice manipulation: drawing tools need to have means to extract a single slice from an image volume and to write a single slice back into an image volume.
  5. Interpolation of unsegmented slices: some class has to keep track of all the segmentations in a volume and generate suggestions for missing slices. This should be possible in all three orthogonal slice direction.
  6. Undo: Slice manipulations should be undoable, no matter whether a tool or the interpolation mechanism changed something.
  7. GUI: Integration of everything.
\section QmitkSegmentationTechnicalPage4 Classes involved The above blocks correspond to a number of classes. Here is an overview of all related classes with their responsibilities and relations: \imageMacro{QmitkSegmentation_InteractiveSegmentationClasses.png,"",16.00}
  1. Management of images: mitk::ToolManager has a set of reference data (original images) and a second set of working data (segmentations). mitk::Tool objects know a ToolManager and can ask the manager for the currently relevant images. There are two GUI elements that enable the user to modify the set of reference and working images (QmitkToolReferenceDataSelectionBox and QmitkToolWorkingDataSelectionBox). GUI and non-GUI classes are coupled by itk::Events (non-GUI to GUI) and direct method calls (GUI to non-GUI).
  2. Management of drawing tools: As a second task, ToolManager manages all available tools and makes sure that one at a time is able to receive MITK events. The GUI for selecting tools is implemented in QmitkToolSelectionBox.
  3. Drawing tools: Drawing tools all inherit from mitk::Tool, which is a mitk::StateMachine. There is a number of derivations from Tool, each offering some helper methods for specific sub-classes, like manipulation of 2D slices. Tools are instantiated through the itk::ObjectFactory, which means that there is also one factory for each tool (e.g. mitk::AddContourToolFactory). For the GUI representation, each tool has an identification, consisting of a name and an icon (XPM). The actual drawing methods are mainly implemented in mitk::SegTool2D (helper methods) and its sub-classes for region growing, freehand drawing, etc.
  4. Slice manipulation: There are two filters for manipulation of slices inside a 3D image volume. mitk::ExtractImageFilter retrieves a single 2D slice from a 3D volume. mitk::OverwriteSliceImageFilter replaces a slice inside a 3D volume with a second slice which is a parameter to the filter. These classes are used extensively by most of the tools to fulfill their task. mitk::OverwriteSliceImageFilter cooperates with the interpolation classes to inform them of single slice modifications.
  5. Interpolation of unsegmented slices: There are two classes involved in interpolation: mitk::SegmentationInterpolationController knows a mitk::Image (the segmentation) and scans its contents for slices with non-zero pixels. It keeps track of changes in the image and is always able to tell, which neighbors of a slice (in the three orthogonal slice directions) contain segmentations. The class also performs this interpolation for single slices on demand. Again, we have a second class responsible for the GUI: QmitkSlicesInterpolator enables/disables interpolation and offers to accept interpolations for one or all slices.
  6. Undo: Undo functionality is implemented in mitk::OverwriteSliceImageFilter, since this is the central place where all image modifications are made. The filter stores a binary difference image to the undo stack as a mitk::ApplyDiffImageOperation. When the user requests undo, this ApplyDiffImageOperation will be executed by a singleton class DiffImageApplier. The operation itself observes the image, which it refers to, for itk::DeleteEvent, so no undo operation will be executed on/for images that have already been destroyed. -
  7. GUI: The top-level GUI is the functionality +
  8. GUI: The top-level GUI is the view QmitkSegmentation, which is very thin in comparison to ERIS. There are separate widgets for image and tool selection, for interpolation. Additionaly, there are some methods to create, delete, crop, load and save segmentations.
**/ diff --git a/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_ToolExtensionsGeneralOverview.dox b/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_ToolExtensionsGeneralOverview.dox index 75fe65f746..47b868ad49 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_ToolExtensionsGeneralOverview.dox +++ b/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_ToolExtensionsGeneralOverview.dox @@ -1,182 +1,182 @@ /** \page toolextensions How to extend the Segmentation view with external tools \warning This documentation is outdated (see bug 19726).
  • \ref ToolExtensionsGeneralOverview2
  • \ref ToolExtensionsGeneralOverview3
    • \ref ToolExtensionsGeneralOverview31
    • \ref ToolExtensionsGeneralOverview32
    • \ref ToolExtensionsGeneralOverview33
  • \ref ToolExtensionsGeneralOverview4
  • \ref ToolExtensionsGeneralOverview5
  • \ref ToolExtensionsGeneralOverview6
\section ToolExtensionsGeneralOverview2 Introduction The application for manual segmentation in MITK (Segmentation view) comes with a tool class framework that is extensible with new tools (description at \ref QmitkSegmentationTechnicalPage). The usual way to create new tools (since it is mostly used inside DKFZ) is to just add new files to the MITK source code tree. However, this requires to be familiar with the MITK build system and turnaround time during development might be long (recompiling parts of MITK again and again). For external users who just want to use MITK as a library and application, there is a way to create new segmentation tools in an MITK external project, which will compile the new tools into a shared object (DLL). Such shared objects can be loaded via the ITK object factory and its autoload feature on application startup. This document describes how to build such external extensions. Example files can be found in the MITK source code in the directory ${MITK_SOURCE_DIR}/QApplications/ToolExtensionsExample/. \section ToolExtensionsGeneralOverview3 What might be part of an extension The extension concept assumes that you want to create one or several new interactive segmentation tools for Segmentation or another MITK -functionality that uses the tools infrastructure. In the result you +view that uses the tools infrastructure. In the result you will create a shared object (DLL), which contains several tools and their GUI counterparts, plus optional code that your extension requires. The following sections shortly describe each of these parts. \subsection ToolExtensionsGeneralOverview31 Tool classes A tool is basically any subclass of mitk::Tool. Tools are created at runtime through the ITK object factory (so they inherit from itk::Object). Tools should handle the interaction part of a segmentation method, i.e. create seed points, draw contours, etc., in order to parameterize segmentation algorithms. Simple algorithms can even be part of a tool. A tools is identified by icon (XPM format), name (short string) and optionally a group name (e.g. the group name for Segmentation is "default"). There is a naming convention: you should put a tool called \c mitk::ExternalTool into files called \c mitkExternalTool.h and \c mitkExternalTool.cpp. This is \e required if you use the convenience macros described below, because there need to be ITK factories, which names are directly derived from the file names of the tools. For the example of mitk::ExternalTool there would be a factory called \c mitk::ExternalToolFactory in a file named \c mitkExternalToolFactory.cpp. \subsection ToolExtensionsGeneralOverview32 GUI classes for tools Tools are non-graphical classes that only implement interactions in renderwindows. However, some tools will need a means to allow the user to set some parameters -- a graphical user interface, GUI. In the Qt3 case, tool GUIs inherit from QmitkToolGUI, which is a mixture of QWidget and itk::Object. Tool GUIs are also created through the ITK object factory. Tools inform their GUIs about state changes by messages. Tool GUIs communicate with their associated tools via direct method calls (they know their tools). See mitk::BinaryThresholdTool for examples. Again a naming convention: if the convenience macros for tool extension shared objects are used, you have to put a tool GUI called \c QmitkExternalToolGUI into a files named \c QmitkExternalToolGUI.cpp and \c QmitkExternalToolGUI.h. The convenience macro will create a factory called \c QmitkExternalToolGUIFactory into a file named \c QmitkExternalToolGUIFactory.cpp. \subsection ToolExtensionsGeneralOverview33 Additional files If you are writing tools MITK externally, these tools might depend on additional files, e.g. segmentation algorithms. These can also be compiled into a tool extension shared object. \section ToolExtensionsGeneralOverview4 Writing a CMake file for a tool extension Summing up the last section, an example tool extension could comprise the following files: \verbatim mitkExternalTool.h \ mitkExternalTool.png >--- implementing mitk::ExternalTool (header, icon, implementation) mitkExternalTool.cpp / QmitkExternalToolGUI.h ,-- implementing a GUI for mitk::ExternalTool QmitkExternalToolGUI.cpp / externalalgorithm.h \ externalalgorithm.cpp \ externalalgorithmsolver.h >-- a couple of files (not related to MITK tools) externalalgorithmsolver.cpp / \endverbatim This should all be compiled into one shared object. Just like ITK, VTK and MITK we will use CMake for this purpose (I assume you either know or are willing to learn about www.cmake.org) A CMake file for the above example would look like this: \code project( ExternalTool ) find_package(ITK) find_package(MITK) find_package(Qt3) add_definitions(${QT_DEFINITIONS}) set( TOOL_QT3GUI_FILES QmitkExternalToolGUI.cpp ) set( TOOL_FILES mitkExternalTool.cpp ) set( TOOL_ADDITIONAL_CPPS externalalgorithm.cpp externalalgorithmsolver.cpp ) set( TOOL_ADDITIONAL_MOC_H ) MITK_GENERATE_TOOLS_LIBRARY(mitkExternalTools) \endcode Basically, you only have to change the definitions of \c TOOL_FILES and, optionally, \c TOOL_QT3GUI_FILES, \c TOOL_ADDITIONAL_CPPS and \c TOOL_ADDITIONAL_MOC_H. For all .cpp files in \c TOOL_FILES and \c TOOL_QT3GUI_FILES there will be factories created assuming the naming conventions described in the sections above. Files listed in \c TOOL_ADDITIONAL_CPPS will just be compiled. Files listed in \c TOOL_ADDITIONAL_MOC_H will be run through Qts meta object compiler \c moc -- this is neccessary for all objects that have the Q_OBJECT macro in their declaration. \c moc will create new files that will also be compiled into the library. \section ToolExtensionsGeneralOverview5 Compiling the extension For compiling a tool extension, you will need a compiled version of MITK. We will assume MITK was compiled into /home/user/mitk/debug. You need to build MITK with BUILD_SHARED_CORE turned on! You build the tool extension just like any other CMake based project: \li know where your source code is (e.g. /home/user/mitk/tool-extension-src) \li change into the directory, where you want to compile the shared object (e.g. /home/user/mitk/tool-extension-debug) \li invoke cmake: ccmake /home/user/mitk/tool-extension-src \li configure (press c or the "configure" button) \li set the ITK_DIR variable to the directory, where you compiled ITK \li set the MITK_DIR variable to the directory, where you compiled MITK: /home/user/mitk/debug \li configure (press "c" or the "configure" button) \li generate (press "g" or the "generate" button) This should do it and leave you with a or project file or Makefile that you can compile (using make or VisualStudio). \section ToolExtensionsGeneralOverview6 Configuring ITK autoload If the compile succeeds, you will get a library mitkExternalTools.dll or libmitkExternalTools.so. This library exports a symbol \c itkLoad which is expected by the ITK object factory. On application startup the ITK object factory will search a list of directories from the environment variable \c ITK_AUTOLOAD_PATH. Set this environment variable to your binary directory (/home/user/mitk/tool-extension-debug). The ITK object factory will load all shared objects that it finds in the specified directories and will test if they contain a symbol (function pointer) \c itkLoad, which is expected to return a pointer to a itk::ObjectFactoryBase instance. If such a symbol is found, the returned factory will be registered with the ITK object factory. If you successfully followed all the steps above, MITK will find your mitk::ExternalTool on application startup, when the ITK object factory is asked to create all known instances of mitk::Tool. Furthermore, if your mitk::ExternalTool claims to be part of the "default" group, there will be a new icon in Segmentation, which activates your tool. Have fun! (And Windows users: welcome to the world of DLLs) **/ diff --git a/Plugins/org.mitk.gui.qt.segmentation/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.segmentation/manifest_headers.cmake index 6d9c997827..f7cd162d1a 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.segmentation/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Segmentation") set(Plugin-Version "1.0.0") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy org.mitk.gui.qt.datamanager) +set(Require-Plugin org.mitk.gui.qt.common org.mitk.gui.qt.datamanager) diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.cpp index 8d8c6aead3..a02a27ed04 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.cpp @@ -1,198 +1,198 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkAutocropAction.h" #include "mitkAutoCropImageFilter.h" #include "mitkImageCast.h" #include "mitkImageWriteAccessor.h" #include "mitkRenderingManager.h" #include "mitkProgressBar.h" #include //needed for qApp #include QmitkAutocropAction::QmitkAutocropAction() { } QmitkAutocropAction::~QmitkAutocropAction() { } void QmitkAutocropAction::Run( const QList &selectedNodes ) { foreach ( mitk::DataNode::Pointer node, selectedNodes ) { if (node) { mitk::Image::Pointer image = dynamic_cast( node->GetData() ); if (image.IsNull()) return; mitk::ProgressBar::GetInstance()->AddStepsToDo(10); mitk::ProgressBar::GetInstance()->Progress(2); qApp->processEvents(); mitk::AutoCropImageFilter::Pointer cropFilter = mitk::AutoCropImageFilter::New(); cropFilter->SetInput( image ); cropFilter->SetBackgroundValue( 0 ); try { cropFilter->Update(); image = cropFilter->GetOutput(); if (image.IsNotNull()) { if (image->GetDimension() == 4) { MITK_INFO << "4D AUTOCROP DOES NOT WORK AT THE MOMENT"; throw "4D AUTOCROP DOES NOT WORK AT THE MOMENT"; unsigned int timesteps = image->GetDimension(3); for (unsigned int i = 0; i < timesteps; i++) { mitk::ImageTimeSelector::Pointer imageTimeSelector = mitk::ImageTimeSelector::New(); imageTimeSelector->SetInput(image); imageTimeSelector->SetTimeNr(i); imageTimeSelector->UpdateLargestPossibleRegion(); // We split a long nested code line into separate calls for debugging: mitk::ImageSource::OutputImageType *_3dSlice = imageTimeSelector->GetOutput(); mitk::Image::Pointer _cropped3dSlice = this->IncreaseCroppedImageSize(_3dSlice); // +++ BUG +++ BUG +++ BUG +++ BUG +++ BUG +++ BUG +++ BUG +++ mitk::ImageWriteAccessor imAccess(_cropped3dSlice); void *_data = imAccess.GetData(); // // We write some stripes into the image if ((i & 1) == 0) { int depth = _cropped3dSlice->GetDimension(2); int height = _cropped3dSlice->GetDimension(1); int width = _cropped3dSlice->GetDimension(0); for (int z = 0; z < depth; ++z) for (int y = 0; y < height; ++y) for (int x = 0; x < width; ++x) reinterpret_cast(_data)[(width * height * z) + (width * y) + x] = x & 1; // } image->SetVolume(_data, i); } node->SetData( image ); // bug fix 3145 } else { node->SetData( this->IncreaseCroppedImageSize(image) ); // bug fix 3145 } // Reinit node mitk::RenderingManager::GetInstance()->InitializeViews( node->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } catch(...) { MITK_ERROR << "Cropping image failed..."; } mitk::ProgressBar::GetInstance()->Progress(8); } else { MITK_INFO << " a NULL node selected"; } } } mitk::Image::Pointer QmitkAutocropAction::IncreaseCroppedImageSize( mitk::Image::Pointer image ) { typedef itk::Image< short, 3 > ImageType; typedef itk::Image< unsigned char, 3 > PADOutputImageType; ImageType::Pointer itkTransformImage = ImageType::New(); mitk::CastToItkImage( image, itkTransformImage ); typedef itk::ConstantPadImageFilter< ImageType, PADOutputImageType > PadFilterType; PadFilterType::Pointer padFilter = PadFilterType::New(); unsigned long upperPad[3]; unsigned long lowerPad[3]; int borderLiner = 3; mitk::Point3D mitkOriginPoint; double origin[3]; origin[0]=0; origin[1]=0; origin[2]=0; itkTransformImage->SetOrigin(origin); lowerPad[0]=borderLiner; lowerPad[1]=borderLiner; lowerPad[2]=borderLiner; upperPad[0]=borderLiner; upperPad[1]=borderLiner; upperPad[2]=borderLiner; padFilter->SetInput(itkTransformImage); padFilter->SetConstant(0); padFilter->SetPadUpperBound(upperPad); padFilter->SetPadLowerBound(lowerPad); padFilter->UpdateLargestPossibleRegion(); mitk::Image::Pointer paddedImage = mitk::Image::New(); paddedImage->InitializeByItk(padFilter->GetOutput()); mitk::CastToMitkImage(padFilter->GetOutput(), paddedImage); //calculate translation according to padding to get the new origin mitk::Point3D paddedOrigin = image->GetGeometry()->GetOrigin(); mitk::Vector3D spacing = image->GetGeometry()->GetSpacing(); paddedOrigin[0] -= (borderLiner)*spacing[0]; paddedOrigin[1] -= (borderLiner)*spacing[1]; paddedOrigin[2] -= (borderLiner)*spacing[2]; paddedImage->GetGeometry()->SetOrigin( paddedOrigin ); return paddedImage; } void QmitkAutocropAction::SetSmoothed(bool /*smoothed*/) { //not needed } void QmitkAutocropAction::SetDecimated(bool /*decimated*/) { //not needed } void QmitkAutocropAction::SetDataStorage(mitk::DataStorage* /*dataStorage*/) { //not needed } -void QmitkAutocropAction::SetFunctionality(berry::QtViewPart* /*functionality*/) +void QmitkAutocropAction::SetFunctionality(berry::QtViewPart* /*view*/) { //not needed } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.h index ab2cf06897..7077a51602 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkAutocropAction.h @@ -1,56 +1,54 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITK_AUTOCROPACTION_H #define QMITK_AUTOCROPACTION_H #include "mitkIContextMenuAction.h" #include "org_mitk_gui_qt_segmentation_Export.h" #include "vector" #include "mitkDataNode.h" #include "mitkImage.h" -class QmitkStdMultiWidget; - class MITK_QT_SEGMENTATION QmitkAutocropAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkAutocropAction(); virtual ~QmitkAutocropAction(); //interface methods void Run( const QList& selectedNodes ) override; void SetDataStorage(mitk::DataStorage* dataStorage) override; void SetSmoothed(bool smoothed) override; void SetDecimated(bool decimated) override; - void SetFunctionality(berry::QtViewPart* functionality) override; + void SetFunctionality(berry::QtViewPart* view) override; protected: mitk::Image::Pointer IncreaseCroppedImageSize( mitk::Image::Pointer image ); private: typedef QList NodeList; }; #endif // QMITK_AUTOCROPACTION_H diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.cpp index 3b651a16f6..1e3b1a4f83 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.cpp @@ -1,140 +1,139 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkCreatePolygonModelAction.h" // MITK #include #include #include #include -#include #include #include // Blueberry #include #include #include #include using namespace berry; using namespace mitk; using namespace std; QmitkCreatePolygonModelAction::QmitkCreatePolygonModelAction() { } QmitkCreatePolygonModelAction::~QmitkCreatePolygonModelAction() { } void QmitkCreatePolygonModelAction::Run(const QList &selectedNodes) { DataNode::Pointer selectedNode = selectedNodes[0]; Image::Pointer image = dynamic_cast(selectedNode->GetData()); if (image.IsNull()) { return; } try { // Get preference properties for smoothing and decimation IPreferencesService* prefService = Platform::GetPreferencesService(); IPreferences::Pointer segPref = prefService->GetSystemPreferences()->Node("/org.mitk.views.segmentation"); bool smoothingHint = segPref->GetBool("smoothing hint", true); ScalarType smoothing = segPref->GetDouble("smoothing value", 1.0); ScalarType decimation = segPref->GetDouble("decimation rate", 0.5); if (smoothingHint) { smoothing = 0.0; Vector3D spacing = image->GetGeometry()->GetSpacing(); for (Vector3D::Iterator iter = spacing.Begin(); iter != spacing.End(); ++iter) smoothing = max(smoothing, *iter); } ShowSegmentationAsSurface::Pointer surfaceFilter = ShowSegmentationAsSurface::New(); // Activate callback functions itk::SimpleMemberCommand::Pointer successCommand = itk::SimpleMemberCommand::New(); successCommand->SetCallbackFunction(this, &QmitkCreatePolygonModelAction::OnSurfaceCalculationDone); surfaceFilter->AddObserver(ResultAvailable(), successCommand); itk::SimpleMemberCommand::Pointer errorCommand = itk::SimpleMemberCommand::New(); errorCommand->SetCallbackFunction(this, &QmitkCreatePolygonModelAction::OnSurfaceCalculationDone); surfaceFilter->AddObserver(ProcessingError(), errorCommand); // set filter parameter surfaceFilter->SetDataStorage(*m_DataStorage); surfaceFilter->SetPointerParameter("Input", image); surfaceFilter->SetPointerParameter("Group node", selectedNode); surfaceFilter->SetParameter("Show result", true); surfaceFilter->SetParameter("Sync visibility", false); surfaceFilter->SetParameter("Median kernel size", 3u); surfaceFilter->SetParameter("Decimate mesh", m_IsDecimated); surfaceFilter->SetParameter("Decimation rate", (float) decimation); if (m_IsSmoothed) { surfaceFilter->SetParameter("Apply median", true); surfaceFilter->SetParameter("Smooth", true); surfaceFilter->SetParameter("Gaussian SD", sqrtf(smoothing)); // use sqrt to account for setting of variance in preferences StatusBar::GetInstance()->DisplayText("Smoothed surface creation started in background..."); } else { surfaceFilter->SetParameter("Apply median", false); surfaceFilter->SetParameter("Smooth", false); StatusBar::GetInstance()->DisplayText("Surface creation started in background..."); } surfaceFilter->StartAlgorithm(); } catch(...) { MITK_ERROR << "Surface creation failed!"; } } void QmitkCreatePolygonModelAction::OnSurfaceCalculationDone() { StatusBar::GetInstance()->Clear(); } void QmitkCreatePolygonModelAction::SetDataStorage(DataStorage *dataStorage) { m_DataStorage = dataStorage; } void QmitkCreatePolygonModelAction::SetSmoothed(bool smoothed) { m_IsSmoothed = smoothed; } void QmitkCreatePolygonModelAction::SetDecimated(bool decimated) { m_IsDecimated = decimated; } void QmitkCreatePolygonModelAction::SetFunctionality(QtViewPart *) { } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.h index d0276e9260..0711757314 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkCreatePolygonModelAction.h @@ -1,57 +1,55 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKCREATEPOLYGONMODELACTION_H #define QMITKCREATEPOLYGONMODELACTION_H #include // Parent classes #include #include // Data members #include -class QmitkStdMultiWidget; - class MITK_QT_SEGMENTATION QmitkCreatePolygonModelAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkCreatePolygonModelAction(); ~QmitkCreatePolygonModelAction(); // IContextMenuAction void Run(const QList &selectedNodes) override; void SetDataStorage(mitk::DataStorage *dataStorage) override; void SetSmoothed(bool smoothed) override; void SetDecimated(bool decimated) override; - void SetFunctionality(berry::QtViewPart *functionality) override; + void SetFunctionality(berry::QtViewPart* view) override; void OnSurfaceCalculationDone(); private: QmitkCreatePolygonModelAction(const QmitkCreatePolygonModelAction &); QmitkCreatePolygonModelAction & operator=(const QmitkCreatePolygonModelAction &); mitk::DataStorage::Pointer m_DataStorage; bool m_IsSmoothed; bool m_IsDecimated; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.cpp index 312901db9c..33a5bb7540 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.cpp @@ -1,636 +1,621 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkDeformableClippingPlaneView.h" #include "mitkClippingPlaneInteractor3D.h" #include "mitkHeightFieldSurfaceClipImageFilter.h" +#include #include "mitkImageToSurfaceFilter.h" #include "mitkInteractionConst.h" #include "mitkLabeledImageLookupTable.h" #include "mitkLabeledImageVolumeCalculator.h" #include "mitkLevelWindowProperty.h" #include "mitkLookupTableProperty.h" #include "mitkNodePredicateProperty.h" #include "mitkNodePredicateDataType.h" #include "mitkRenderingModeProperty.h" #include "mitkRotationOperation.h" #include "mitkSurfaceDeformationDataInteractor3D.h" #include "mitkSurfaceVtkMapper3D.h" #include "mitkVtkRepresentationProperty.h" #include "usModuleRegistry.h" #include "vtkFloatArray.h" #include "vtkPointData.h" #include "vtkProperty.h" #include const std::string QmitkDeformableClippingPlaneView::VIEW_ID = "org.mitk.views.deformableclippingplane"; QmitkDeformableClippingPlaneView::QmitkDeformableClippingPlaneView() - : QmitkFunctionality() - , m_MultiWidget(NULL) - , m_ReferenceNode(NULL) - , m_WorkingNode(NULL) + : QmitkAbstractView() + , m_ReferenceNode(nullptr) + , m_WorkingNode(nullptr) { } QmitkDeformableClippingPlaneView::~QmitkDeformableClippingPlaneView() { + if (m_WorkingNode.IsNotNull()) + m_WorkingNode->SetDataInteractor(nullptr); } void QmitkDeformableClippingPlaneView::CreateQtPartControl(QWidget *parent) { - // create GUI widgets m_Controls.setupUi(parent); - this->CreateConnections(); -} - -void QmitkDeformableClippingPlaneView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} -void QmitkDeformableClippingPlaneView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = NULL; -} - -void QmitkDeformableClippingPlaneView::CreateConnections() -{ - mitk::NodePredicateProperty::Pointer clipPredicate = mitk::NodePredicateProperty::New("clippingPlane",mitk::BoolProperty::New(true)); - //set only clipping planes in the list of the selector - m_Controls.clippingPlaneSelector->SetDataStorage(this->GetDefaultDataStorage()); - m_Controls.clippingPlaneSelector->SetPredicate(clipPredicate); + auto isClippingPlane = mitk::NodePredicateProperty::New("clippingPlane", mitk::BoolProperty::New(true)); + m_Controls.clippingPlaneSelector->SetDataStorage(this->GetDataStorage()); + m_Controls.clippingPlaneSelector->SetPredicate(isClippingPlane); - //No working data set, yet m_Controls.volumeGroupBox->setEnabled(false); m_Controls.interactionSelectionBox->setEnabled(false); m_Controls.noSelectedImageLabel->show(); m_Controls.planesWarningLabel->hide(); - connect (m_Controls.translationPushButton, SIGNAL(toggled(bool)), this, SLOT(OnTranslationMode(bool))); - connect (m_Controls.rotationPushButton, SIGNAL(toggled(bool)), this, SLOT(OnRotationMode(bool))); - connect (m_Controls.deformationPushButton, SIGNAL(toggled(bool)), this, SLOT(OnDeformationMode(bool))); - connect (m_Controls.createNewPlanePushButton, SIGNAL(clicked()), this, SLOT(OnCreateNewClippingPlane())); - connect (m_Controls.updateVolumePushButton, SIGNAL(clicked()), this, SLOT(OnCalculateClippingVolume())); - connect (m_Controls.clippingPlaneSelector, SIGNAL(OnSelectionChanged(const mitk::DataNode*)), - this, SLOT(OnComboBoxSelectionChanged(const mitk::DataNode*))); + this->CreateConnections(); } -void QmitkDeformableClippingPlaneView::Activated() +void QmitkDeformableClippingPlaneView::SetFocus() { - QmitkFunctionality::Activated(); - //If a tube graph already exist in the data storage, set the working node correctly - m_WorkingNode = m_Controls.clippingPlaneSelector->GetSelectedNode(); - this->UpdateView(); + m_Controls.createNewPlanePushButton->setFocus(); } -void QmitkDeformableClippingPlaneView::Deactivated() +void QmitkDeformableClippingPlaneView::CreateConnections() { - if(m_WorkingNode.IsNotNull()) - { - if(m_WorkingNode->GetDataInteractor().IsNotNull()) - m_WorkingNode->SetDataInteractor(NULL); - } - QmitkFunctionality::Deactivated(); + connect(m_Controls.translationPushButton, SIGNAL(toggled(bool)), this, SLOT(OnTranslationMode(bool))); + connect(m_Controls.rotationPushButton, SIGNAL(toggled(bool)), this, SLOT(OnRotationMode(bool))); + connect(m_Controls.deformationPushButton, SIGNAL(toggled(bool)), this, SLOT(OnDeformationMode(bool))); + connect(m_Controls.createNewPlanePushButton, SIGNAL(clicked()), this, SLOT(OnCreateNewClippingPlane())); + connect(m_Controls.updateVolumePushButton, SIGNAL(clicked()), this, SLOT(OnCalculateClippingVolume())); + connect(m_Controls.clippingPlaneSelector, SIGNAL(OnSelectionChanged(const mitk::DataNode*)), + this, SLOT(OnComboBoxSelectionChanged(const mitk::DataNode*))); } -void QmitkDeformableClippingPlaneView::OnComboBoxSelectionChanged( const mitk::DataNode* node ) +void QmitkDeformableClippingPlaneView::OnComboBoxSelectionChanged(const mitk::DataNode* node) { this->DeactivateInteractionButtons(); - mitk::DataNode* selectedNode = const_cast(node); - if( selectedNode != NULL ) + + auto selectedNode = const_cast(node); + + if(selectedNode != nullptr) { if(m_WorkingNode.IsNotNull()) selectedNode->SetDataInteractor(m_WorkingNode->GetDataInteractor()); m_WorkingNode = selectedNode; } + this->UpdateView(); } void QmitkDeformableClippingPlaneView::OnSelectionChanged(mitk::DataNode* node) { - std::vector nodes; + berry::IWorkbenchPart::Pointer nullPart; + QList nodes; nodes.push_back(node); - this->OnSelectionChanged(nodes); + + this->OnSelectionChanged(nullPart, nodes); } -void QmitkDeformableClippingPlaneView::OnSelectionChanged(std::vector nodes) +void QmitkDeformableClippingPlaneView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { - bool isClippingPlane(false); - for(unsigned int i = 0; i < nodes.size(); ++i) + bool isClippingPlane = false; + + for (auto node : nodes) { - if(nodes.at(i)->GetBoolProperty("clippingPlane", isClippingPlane)) - m_Controls.clippingPlaneSelector->setCurrentIndex( m_Controls.clippingPlaneSelector->Find(nodes.at(i)) ); + node->GetBoolProperty("clippingPlane", isClippingPlane); + if (isClippingPlane) + { + m_Controls.clippingPlaneSelector->setCurrentIndex(m_Controls.clippingPlaneSelector->Find(node)); + } else { - if(dynamic_cast (nodes.at(i)->GetData())&& nodes.at(i)) + if(node.IsNotNull() && dynamic_cast(node->GetData()) != nullptr) { - if(m_ReferenceNode.IsNotNull() && nodes.at(i)->GetData() == m_ReferenceNode->GetData()) + if(m_ReferenceNode.IsNotNull() && node->GetData() == m_ReferenceNode->GetData()) return; - m_ReferenceNode =nodes.at(i); + m_ReferenceNode = node; } } } + this->UpdateView(); } -void::QmitkDeformableClippingPlaneView::NodeChanged(const mitk::DataNode* /*node*/) +void::QmitkDeformableClippingPlaneView::NodeChanged(const mitk::DataNode*) { this->UpdateView(); } void QmitkDeformableClippingPlaneView::NodeRemoved(const mitk::DataNode* node) { bool isClippingPlane(false); + node->GetBoolProperty("clippingPlane", isClippingPlane); - if (node->GetBoolProperty("clippingPlane", isClippingPlane)) + if (isClippingPlane) { - if(this->GetAllClippingPlanes()->Size()<=1) + if (this->GetAllClippingPlanes()->Size() <= 1) { - m_WorkingNode = NULL; + m_WorkingNode = nullptr; this->UpdateView(); } else { - if (GetAllClippingPlanes()->front()!= node) - this->OnSelectionChanged(GetAllClippingPlanes()->front()); - else - this->OnSelectionChanged(GetAllClippingPlanes()->ElementAt(1)); + this->OnSelectionChanged(this->GetAllClippingPlanes()->front() == node + ? this->GetAllClippingPlanes()->ElementAt(1) + : this->GetAllClippingPlanes()->front()); } } else { if(m_ReferenceNode.IsNotNull()) { if(node->GetData() == m_ReferenceNode->GetData()) { - m_ReferenceNode = NULL; + m_ReferenceNode = nullptr; m_Controls.volumeList->clear(); } + this->UpdateView(); } } } void QmitkDeformableClippingPlaneView::UpdateView() { if (m_ReferenceNode.IsNotNull()) { m_Controls.noSelectedImageLabel->hide(); m_Controls.selectedImageLabel->setText(QString::fromUtf8(m_ReferenceNode->GetName().c_str())); if (m_WorkingNode.IsNotNull()) { - bool isSegmentation(false); + bool isSegmentation = false; m_ReferenceNode->GetBoolProperty("binary", isSegmentation); m_Controls.interactionSelectionBox->setEnabled(true); m_Controls.volumeGroupBox->setEnabled(isSegmentation); //clear list --> than search for all shown clipping plans (max 7 planes) m_Controls.selectedVolumePlanesLabel->setText(""); m_Controls.planesWarningLabel->hide(); int volumePlanes=0; mitk::DataStorage::SetOfObjects::ConstPointer allClippingPlanes = this->GetAllClippingPlanes(); for (mitk::DataStorage::SetOfObjects::ConstIterator itPlanes = allClippingPlanes->Begin(); itPlanes != allClippingPlanes->End(); itPlanes++) { - bool isVisible(false); - itPlanes.Value()->GetBoolProperty("visible",isVisible); + bool isVisible = false; + itPlanes.Value()->GetBoolProperty("visible", isVisible); if (isVisible) { - if (volumePlanes<7) + if (volumePlanes < 7) { - volumePlanes ++; + ++volumePlanes; m_Controls.selectedVolumePlanesLabel->setText(m_Controls.selectedVolumePlanesLabel->text().append(QString::fromStdString(itPlanes.Value()->GetName()+"\n"))); } else { m_Controls.planesWarningLabel->show(); return; } } } } else { m_Controls.volumeGroupBox->setEnabled(false); m_Controls.interactionSelectionBox->setEnabled(false); m_Controls.selectedVolumePlanesLabel->setText(""); m_Controls.volumeList->clear(); } } - else { m_Controls.volumeGroupBox->setEnabled(false); m_Controls.noSelectedImageLabel->show(); m_Controls.selectedImageLabel->setText(""); m_Controls.selectedVolumePlanesLabel->setText(""); m_Controls.planesWarningLabel->hide(); - if(m_WorkingNode.IsNull()) + + if (m_WorkingNode.IsNull()) + { m_Controls.interactionSelectionBox->setEnabled(false); + } else + { m_Controls.interactionSelectionBox->setEnabled(true); + } } } void QmitkDeformableClippingPlaneView::OnCreateNewClippingPlane() { - this->DeactivateInteractionButtons(); - //the new clipping plane - mitk::Surface::Pointer plane = mitk::Surface::New(); - mitk::Image::Pointer referenceImage = mitk::Image::New(); - vtkSmartPointer planeSource = vtkSmartPointer::New(); - - // default initialization of the clipping plane - planeSource->SetOrigin( -32.0, -32.0, 0.0 ); - planeSource->SetPoint1( 32.0, -32.0, 0.0 ); - planeSource->SetPoint2( -32.0, 32.0, 0.0 ); - planeSource->SetResolution( 128, 128 ); + this->DeactivateInteractionButtons(); + + auto plane = mitk::Surface::New(); + auto referenceImage = mitk::Image::New(); + auto planeSource = vtkSmartPointer::New(); + + planeSource->SetOrigin(-32.0, -32.0, 0.0); + planeSource->SetPoint1( 32.0, -32.0, 0.0); + planeSource->SetPoint2(-32.0, 32.0, 0.0); + planeSource->SetResolution(128, 128); planeSource->Update(); plane->SetVtkPolyData(planeSource->GetOutput()); - double imageDiagonal = 200; if (m_ReferenceNode.IsNotNull()) { - referenceImage = dynamic_cast (m_ReferenceNode->GetData()); + referenceImage = dynamic_cast(m_ReferenceNode->GetData()); if (referenceImage.IsNotNull()) { // check if user wants a surface model if(m_Controls.surfaceModelCheckBox->isChecked()) { //Check if there is a surface node from the image. If not, create one bool createSurfaceFromImage(true); mitk::NodePredicateDataType::Pointer isDwi = mitk::NodePredicateDataType::New("DiffusionImage"); mitk::NodePredicateDataType::Pointer isSurface = mitk::NodePredicateDataType::New("Surface"); mitk::DataStorage::SetOfObjects::ConstPointer childNodes = GetDataStorage()->GetDerivations(m_ReferenceNode,isSurface, true); for (mitk::DataStorage::SetOfObjects::ConstIterator itChildNodes = childNodes->Begin(); itChildNodes != childNodes->End(); itChildNodes++) { if (itChildNodes.Value().IsNotNull() && itChildNodes->Value()->GetName().compare(m_ReferenceNode->GetName()) == 0) { createSurfaceFromImage = false; itChildNodes.Value()->SetVisibility(true); } } if(createSurfaceFromImage) { //Lsg 2: Surface for the 3D-perspective mitk::ImageToSurfaceFilter::Pointer surfaceFilter = mitk::ImageToSurfaceFilter::New(); surfaceFilter->SetInput(referenceImage); surfaceFilter->SetThreshold(1); surfaceFilter->SetSmooth(true); //Downsampling surfaceFilter->SetDecimate(mitk::ImageToSurfaceFilter::DecimatePro); mitk::DataNode::Pointer surfaceNode = mitk::DataNode::New(); surfaceNode->SetData(surfaceFilter->GetOutput()); surfaceNode->SetProperty("color", m_ReferenceNode->GetProperty("color")); surfaceNode->SetOpacity(0.5); surfaceNode->SetName(m_ReferenceNode->GetName()); GetDataStorage()->Add(surfaceNode, m_ReferenceNode); } } //If an image is selected trim the plane to this. imageDiagonal = referenceImage->GetGeometry()->GetDiagonalLength(); plane->SetOrigin( referenceImage->GetGeometry()->GetCenter()); // Rotate plane mitk::Vector3D rotationAxis; mitk::FillVector3D(rotationAxis, 0.0, 1.0, 0.0); mitk::RotationOperation op(mitk::OpROTATE, referenceImage->GetGeometry()->GetCenter(), rotationAxis, 90.0); plane->GetGeometry()->ExecuteOperation(&op); } } //set some properties for the clipping plane // plane->SetExtent(imageDiagonal * 0.9, imageDiagonal * 0.9); // plane->SetResolution(64, 64); // eequivalent to the extent and resolution function of the clipping plane const double x = imageDiagonal * 0.9; planeSource->SetOrigin( -x / 2.0, -x / 2.0, 0.0 ); planeSource->SetPoint1( x / 2.0, -x / 2.0, 0.0 ); planeSource->SetPoint2( -x / 2.0, x / 2.0, 0.0 ); planeSource->SetResolution( 64, 64 ); planeSource->Update(); plane->SetVtkPolyData(planeSource->GetOutput()); // Set scalars (for colorization of plane) vtkFloatArray *scalars = vtkFloatArray::New(); scalars->SetName("Distance"); scalars->SetNumberOfComponents(1); for ( unsigned int i = 0; i < plane->GetVtkPolyData(0)->GetNumberOfPoints(); ++i) { scalars->InsertNextValue(-1.0); } plane->GetVtkPolyData(0)->GetPointData()->SetScalars(scalars); plane->GetVtkPolyData(0)->GetPointData()->Update(); mitk::DataNode::Pointer planeNode = mitk::DataNode::New(); planeNode->SetData(plane); std::stringstream planeName; planeName << "ClippingPlane "; planeName << this->GetAllClippingPlanes()->Size() + 1; planeNode->SetName(planeName.str()); planeNode->AddProperty("clippingPlane",mitk::BoolProperty::New(true)); // Make plane pickable planeNode->SetBoolProperty("pickable", true); mitk::SurfaceVtkMapper3D::SetDefaultProperties(planeNode); // Don't include plane in bounding box! planeNode->SetProperty("includeInBoundingBox", mitk::BoolProperty::New(false)); // Set lookup table for plane surface visualization vtkSmartPointer lookupTable = vtkSmartPointer::New(); lookupTable->SetHueRange(0.6, 0.0); lookupTable->SetSaturationRange(1.0, 1.0); lookupTable->SetValueRange(1.0, 1.0); lookupTable->SetTableRange(-1.0, 1.0); lookupTable->Build(); mitk::LookupTable::Pointer lut = mitk::LookupTable::New(); lut->SetVtkLookupTable(lookupTable); mitk::LookupTableProperty::Pointer prop = mitk::LookupTableProperty::New(lut); planeNode->SetProperty("LookupTable", prop); planeNode->SetBoolProperty("scalar visibility", true); planeNode->SetBoolProperty("color mode", true); planeNode->SetFloatProperty("ScalarsRangeMinimum", -1.0); planeNode->SetFloatProperty("ScalarsRangeMaximum", 1.0); // Configure material so that only scalar colors are shown planeNode->SetColor(0.0f,0.0f,0.0f); planeNode->SetOpacity(1.0f); planeNode->SetFloatProperty("material.wireframeLineWidth",2.0f); //Set view of plane to wireframe planeNode->SetProperty("material.representation", mitk::VtkRepresentationProperty::New(VTK_WIREFRAME)); //Set the plane as working data for the tools and selected it this->OnSelectionChanged (planeNode); //Add the plane to data storage this->GetDataStorage()->Add(planeNode); //Change the index of the selector to the new generated node m_Controls.clippingPlaneSelector->setCurrentIndex( m_Controls.clippingPlaneSelector->Find(planeNode) ); m_Controls.interactionSelectionBox->setEnabled(true); - // set crosshair invisible - mitk::DataNode* dataNode; - - dataNode = this->m_MultiWidget->GetWidgetPlane1(); - if(dataNode) dataNode->SetVisibility(false); - dataNode = this->m_MultiWidget->GetWidgetPlane2(); - if(dataNode) dataNode->SetVisibility(false); - dataNode = this->m_MultiWidget->GetWidgetPlane3(); - if(dataNode) dataNode->SetVisibility(false); + if (auto renderWindowPart = dynamic_cast(this->GetRenderWindowPart())) + { + renderWindowPart->EnableSlicingPlanes(false); + } mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkDeformableClippingPlaneView::OnCalculateClippingVolume() { bool isSegmentation(false); m_ReferenceNode->GetBoolProperty("binary", isSegmentation); if(m_ReferenceNode.IsNull() || !isSegmentation) { MITK_ERROR << "No segmentation selected! Can't calculate volume"; return; } std::vector clippingPlanes; mitk::DataStorage::SetOfObjects::ConstPointer allClippingPlanes = this->GetAllClippingPlanes(); for (mitk::DataStorage::SetOfObjects::ConstIterator itPlanes = allClippingPlanes->Begin(); itPlanes != allClippingPlanes->End(); itPlanes++) { bool isVisible(false); itPlanes.Value()->GetBoolProperty("visible",isVisible); mitk::Surface* plane = dynamic_cast(itPlanes.Value()->GetData()); if (isVisible && plane) clippingPlanes.push_back(plane); } if (clippingPlanes.empty()) { MITK_ERROR << "No clipping plane selected! Can't calculate volume"; return; } // deactivate Tools this->DeactivateInteractionButtons(); //Clear the list of volumes, before calculating the new values m_Controls.volumeList->clear(); m_ReferenceNode->SetBoolProperty("visible", false); //set some properties for clipping the image-->Output: labled Image mitk::HeightFieldSurfaceClipImageFilter::Pointer surfaceClipFilter = mitk::HeightFieldSurfaceClipImageFilter::New(); surfaceClipFilter->SetInput(dynamic_cast (m_ReferenceNode->GetData())); surfaceClipFilter->SetClippingModeToMultiPlaneValue(); surfaceClipFilter->SetClippingSurfaces(clippingPlanes); surfaceClipFilter->Update(); //delete the old clipped image node mitk::DataStorage::SetOfObjects::ConstPointer oldClippedNode = this->GetDataStorage()->GetSubset(mitk::NodePredicateProperty::New("name", mitk::StringProperty::New("Clipped Image"))); if (oldClippedNode.IsNotNull()) this->GetDataStorage()->Remove(oldClippedNode); //add the new clipped image node mitk::DataNode::Pointer clippedNode = mitk::DataNode::New(); mitk::Image::Pointer clippedImage = surfaceClipFilter->GetOutput(); clippedImage->DisconnectPipeline(); clippedNode->SetData(clippedImage); //clippedNode->SetProperty("helper object", mitk::BoolProperty::New(true)); clippedNode->SetName("Clipped Image"); clippedNode->SetColor(1.0,1.0,1.0); // color property will not be used, labeled image lookuptable will be used instead clippedNode->SetProperty ("use color", mitk::BoolProperty::New(false)); clippedNode->SetOpacity(0.4); this->GetDataStorage()->Add(clippedNode); mitk::LabeledImageVolumeCalculator::Pointer volumeCalculator = mitk::LabeledImageVolumeCalculator::New(); volumeCalculator->SetImage(clippedImage); volumeCalculator->Calculate(); std::vector volumes = volumeCalculator->GetVolumes(); mitk::LabeledImageLookupTable::Pointer lut = mitk::LabeledImageLookupTable::New(); int lablesWithVolume=0; for(unsigned int i = 1; i < volumes.size(); ++i) { if(volumes.at(i)!=0) { lablesWithVolume++; mitk::Color color (GetLabelColor(lablesWithVolume)); lut->SetColorForLabel(i,color.GetRed(), color.GetGreen(), color.GetBlue(), 1.0); QColor qcolor; qcolor.setRgbF(color.GetRed(), color.GetGreen(), color.GetBlue(), 0.7); //output volume as string "x.xx ml" std::stringstream stream; stream<< std::fixed << std::setprecision(2)<setText(QString::fromStdString(stream.str())); item->setBackgroundColor(qcolor); m_Controls.volumeList->addItem(item); } } //set the rendering mode to use the lookup table and level window clippedNode->SetProperty("Image Rendering.Mode", mitk::RenderingModeProperty::New(mitk::RenderingModeProperty::LOOKUPTABLE_LEVELWINDOW_COLOR)); mitk::LookupTableProperty::Pointer lutProp = mitk::LookupTableProperty::New(lut.GetPointer()); clippedNode->SetProperty("LookupTable", lutProp); // it is absolutely important, to use the LevelWindow settings provided by // the LUT generator, otherwise, it is not guaranteed, that colors show // up correctly. clippedNode->SetProperty("levelwindow", mitk::LevelWindowProperty::New(lut->GetLevelWindow())); } mitk::DataStorage::SetOfObjects::ConstPointer QmitkDeformableClippingPlaneView::GetAllClippingPlanes() { mitk::NodePredicateProperty::Pointer clipPredicate= mitk::NodePredicateProperty::New("clippingPlane",mitk::BoolProperty::New(true)); mitk::DataStorage::SetOfObjects::ConstPointer allPlanes = GetDataStorage()->GetSubset(clipPredicate); return allPlanes; } mitk::Color QmitkDeformableClippingPlaneView::GetLabelColor(int label) { float red, green, blue; switch ( label % 6 ) { case 0: {red = 1.0; green = 0.0; blue = 0.0; break;} case 1: {red = 0.0; green = 1.0; blue = 0.0; break;} case 2: {red = 0.0; green = 0.0; blue = 1.0;break;} case 3: {red = 1.0; green = 1.0; blue = 0.0;break;} case 4: {red = 1.0; green = 0.0; blue = 1.0;break;} case 5: {red = 0.0; green = 1.0; blue = 1.0;break;} default: {red = 0.0; green = 0.0; blue = 0.0;} } float tmp[3] = { red, green, blue }; double factor; int outerCycleNr = label / 6; int cycleSize = pow(2.0,(int)(log((double)(outerCycleNr))/log( 2.0 ))); if (cycleSize==0) cycleSize = 1; int insideCycleCounter = outerCycleNr % cycleSize; if ( outerCycleNr == 0) factor = 255; else factor = ( 256 / ( 2 * cycleSize ) ) + ( insideCycleCounter * ( 256 / cycleSize ) ); tmp[0]= tmp[0]/256*factor; tmp[1]= tmp[1]/256*factor; tmp[2]= tmp[2]/256*factor; return mitk::Color(tmp); } void QmitkDeformableClippingPlaneView::OnTranslationMode(bool check) { if(check) { //uncheck all other buttons m_Controls.rotationPushButton->setChecked(false); m_Controls.deformationPushButton->setChecked(false); mitk::ClippingPlaneInteractor3D::Pointer affineDataInteractor = mitk::ClippingPlaneInteractor3D::New(); affineDataInteractor->LoadStateMachine("ClippingPlaneInteraction3D.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); affineDataInteractor->SetEventConfig("ClippingPlaneTranslationConfig.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); affineDataInteractor->SetDataNode(m_WorkingNode); } else - m_WorkingNode->SetDataInteractor(NULL); + m_WorkingNode->SetDataInteractor(nullptr); } void QmitkDeformableClippingPlaneView::OnRotationMode(bool check) { if(check) { //uncheck all other buttons m_Controls.translationPushButton->setChecked(false); m_Controls.deformationPushButton->setChecked(false); mitk::ClippingPlaneInteractor3D::Pointer affineDataInteractor = mitk::ClippingPlaneInteractor3D::New(); affineDataInteractor->LoadStateMachine("ClippingPlaneInteraction3D.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); affineDataInteractor->SetEventConfig("ClippingPlaneRotationConfig.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); affineDataInteractor->SetDataNode(m_WorkingNode); } else - m_WorkingNode->SetDataInteractor(NULL); + m_WorkingNode->SetDataInteractor(nullptr); } void QmitkDeformableClippingPlaneView::OnDeformationMode(bool check) { if(check) { //uncheck all other buttons m_Controls.translationPushButton->setChecked(false); m_Controls.rotationPushButton->setChecked(false); mitk::SurfaceDeformationDataInteractor3D::Pointer surfaceDataInteractor = mitk::SurfaceDeformationDataInteractor3D::New(); surfaceDataInteractor->LoadStateMachine("ClippingPlaneInteraction3D.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); surfaceDataInteractor->SetEventConfig("ClippingPlaneDeformationConfig.xml", us::ModuleRegistry::GetModule("MitkDataTypesExt")); surfaceDataInteractor->SetDataNode(m_WorkingNode); } else - m_WorkingNode->SetDataInteractor(NULL); + m_WorkingNode->SetDataInteractor(nullptr); } void QmitkDeformableClippingPlaneView::DeactivateInteractionButtons() { m_Controls.translationPushButton->setChecked(false); m_Controls.rotationPushButton->setChecked(false); m_Controls.deformationPushButton->setChecked(false); } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.h index 4ca1432d85..b8c2d9d1a4 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkDeformableClippingPlaneView.h @@ -1,99 +1,85 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKDEFORMABLECLIPPINGPLANEVIEW_H_INCLUDED #define _QMITKDEFORMABLECLIPPINGPLANEVIEW_H_INCLUDED -#include "ui_QmitkDeformableClippingPlaneViewControls.h" -#include "mitkImage.h" -#include +#include +#include +#include typedef itk::RGBPixel< float > Color; /*! * \ingroup org_mitk_gui_qt_deformableSurface * * \brief QmitkDeformableClippingPlaneView * * Document your class here. -* -* \sa QmitkFunctionality */ -class QmitkDeformableClippingPlaneView : public QmitkFunctionality +class QmitkDeformableClippingPlaneView : public QmitkAbstractView { - - // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkDeformableClippingPlaneView(); virtual ~QmitkDeformableClippingPlaneView(); virtual void CreateQtPartControl(QWidget *parent) override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); - /// \brief Called when the functionality is activated - virtual void Activated() override; - - /// \brief Called when the functionality is deactivated - virtual void Deactivated() override; - - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: - /// \brief Called when the user clicks the GUI button/makes a selection void OnComboBoxSelectionChanged(const mitk::DataNode* node); void OnCreateNewClippingPlane(); void OnCalculateClippingVolume(); void OnTranslationMode(bool check); void OnRotationMode(bool check); void OnDeformationMode(bool check); protected: - /*! - \brief Invoked when the DataManager selection changed - */ virtual void OnSelectionChanged(mitk::DataNode* node); - virtual void OnSelectionChanged(std::vector nodes) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; virtual void NodeRemoved(const mitk::DataNode* node) override; virtual void NodeChanged(const mitk::DataNode* node) override; void UpdateView(); - QmitkStdMultiWidget* m_MultiWidget; Ui::QmitkDeformableClippingPlaneViewControls m_Controls; private: mitk::DataStorage::SetOfObjects::ConstPointer GetAllClippingPlanes(); mitk::Color GetLabelColor(int label); void DeactivateInteractionButtons(); mitk::DataNode::Pointer m_ReferenceNode; mitk::DataNode::Pointer m_WorkingNode; }; -#endif // _QMITKDEFORMABLECLIPPINGPLANEVIEW_H_INCLUDED - +#endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.cpp index 3842d283c4..2f7f181c5c 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.cpp @@ -1,197 +1,197 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkOtsuAction.h" // MITK #include #include #include #include #include #include #include #include #include // ITK #include // Qt #include #include #include #include #include #include using namespace berry; using namespace mitk; using namespace std; QmitkOtsuAction::QmitkOtsuAction() : m_OtsuSegmentationDialog(NULL) { } QmitkOtsuAction::~QmitkOtsuAction() { } void QmitkOtsuAction::Run(const QList &selectedNodes) { this->m_DataNode = selectedNodes[0]; //this->m_selectedNodes = selectedNodes; m_OtsuSegmentationDialog = new QDialog(QApplication::activeWindow(),Qt::WindowTitleHint | Qt::WindowSystemMenuHint); QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); QHBoxLayout* spinBoxLayout = new QHBoxLayout; QHBoxLayout* buttonLayout = new QHBoxLayout; m_OtsuSpinBox = new QSpinBox; m_OtsuSpinBox->setRange(2, 32); m_OtsuSpinBox->setValue(2); m_OtsuPushButton = new QPushButton("OK"); QPushButton* CancelButton = new QPushButton("Cancel"); connect(m_OtsuPushButton, SIGNAL(clicked()), this, SLOT(OtsuSegmentationDone())); connect(CancelButton, SIGNAL(clicked()), m_OtsuSegmentationDialog, SLOT(reject())); QLabel* numberOfThresholdsLabel = new QLabel("Select number of Regions of Interest:"); numberOfThresholdsLabel->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); layout->addWidget(numberOfThresholdsLabel); layout->addLayout(spinBoxLayout); spinBoxLayout->addSpacing(50); spinBoxLayout->addWidget(m_OtsuSpinBox); spinBoxLayout->addSpacing(50); layout->addLayout(buttonLayout); buttonLayout->addWidget(m_OtsuPushButton); buttonLayout->addWidget(CancelButton); m_OtsuSegmentationDialog->setLayout(layout); m_OtsuSegmentationDialog->setFixedSize(300, 80); m_OtsuSegmentationDialog->open(); } void QmitkOtsuAction::OtsuSegmentationDone() { this->PerformOtsuSegmentation(); m_OtsuSegmentationDialog->deleteLater(); m_OtsuSegmentationDialog = NULL; RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkOtsuAction::SetDataStorage(DataStorage *dataStorage) { m_DataStorage = dataStorage; } -void QmitkOtsuAction::SetFunctionality(QtViewPart* /*functionality*/) +void QmitkOtsuAction::SetFunctionality(QtViewPart* /*view*/) { } void QmitkOtsuAction::PerformOtsuSegmentation() { this->m_OtsuSegmentationDialog->setCursor(Qt::WaitCursor); int numberOfThresholds = this->m_OtsuSpinBox->value() - 1; int proceed; QMessageBox* messageBox = new QMessageBox(QMessageBox::Question, NULL, "The otsu segmentation computation may take several minutes depending on the number of Regions you selected. Proceed anyway?", QMessageBox::Ok | QMessageBox::Cancel); if (numberOfThresholds >= 5) { proceed = messageBox->exec(); if (proceed != QMessageBox::Ok) return; } mitk::Image::Pointer mitkImage = 0; mitkImage = dynamic_cast( this->m_DataNode->GetData() ); try { // get selected mitk image const unsigned short dim = 3; typedef short InputPixelType; typedef unsigned char OutputPixelType; typedef itk::Image< InputPixelType, dim > InputImageType; typedef itk::Image< OutputPixelType, dim > OutputImageType; typedef itk::OtsuMultipleThresholdsImageFilter< InputImageType, OutputImageType > FilterType; FilterType::Pointer filter = FilterType::New(); filter->SetNumberOfThresholds(numberOfThresholds); InputImageType::Pointer itkImage; mitk::CastToItkImage(mitkImage, itkImage); filter->SetInput( itkImage ); filter->Update(); mitk::DataNode::Pointer resultNode = mitk::DataNode::New(); std::string nameOfResultImage = this->m_DataNode->GetName(); nameOfResultImage.append("Otsu"); resultNode->SetProperty("name", mitk::StringProperty::New(nameOfResultImage) ); resultNode->SetProperty("binary", mitk::BoolProperty::New(false) ); mitk::RenderingModeProperty::Pointer renderingMode = mitk::RenderingModeProperty::New(); renderingMode->SetValue( mitk::RenderingModeProperty::LOOKUPTABLE_LEVELWINDOW_COLOR ); resultNode->SetProperty("Image Rendering.Mode", renderingMode); mitk::LookupTable::Pointer lut = mitk::LookupTable::New(); mitk::LookupTableProperty::Pointer prop = mitk::LookupTableProperty::New(lut); vtkLookupTable *lookupTable = vtkLookupTable::New(); lookupTable->SetHueRange(1.0, 0.0); lookupTable->SetSaturationRange(1.0, 1.0); lookupTable->SetValueRange(1.0, 1.0); lookupTable->SetTableRange(-1.0, 1.0); lookupTable->Build(); lut->SetVtkLookupTable(lookupTable); prop->SetLookupTable(lut); resultNode->SetProperty("LookupTable",prop); mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New(); mitk::LevelWindow levelwindow; levelwindow.SetRangeMinMax(0, numberOfThresholds+1); levWinProp->SetLevelWindow( levelwindow ); resultNode->SetProperty( "levelwindow", levWinProp ); resultNode->SetData( mitk::GrabItkImageMemory( filter->GetOutput() ) ); this->m_DataStorage->Add(resultNode, this->m_DataNode); this->m_OtsuSegmentationDialog->setCursor(Qt::ArrowCursor); } catch( std::exception& err ) { MITK_ERROR(this->GetClassName()) << err.what(); } } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.h index e09d58259c..125d74d3a4 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkOtsuAction.h @@ -1,71 +1,70 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKOTSUACTION_H #define QMITKOTSUACTION_H #include // Parent classes #include #include // Data members #include #include #include // Mitk classes #include class QDialog; -class QmitkStdMultiWidget; /** \deprecatedSince{2013_09} The interaction for the Otsu image filter was revised and moved to the segmentation plugin view. */ class DEPRECATED() MITK_QT_SEGMENTATION QmitkOtsuAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkOtsuAction(); ~QmitkOtsuAction(); // IContextMenuAction void Run(const QList &selectedNodes); void SetDataStorage(mitk::DataStorage *dataStorage); - void SetFunctionality(berry::QtViewPart *functionality); + void SetFunctionality(berry::QtViewPart* view); void SetSmoothed(bool smoothed){} void SetDecimated(bool decimated){} private slots: void OtsuSegmentationDone(); private: QmitkOtsuAction(const QmitkOtsuAction &); QmitkOtsuAction & operator=(const QmitkOtsuAction &); void PerformOtsuSegmentation(); mitk::DataStorage::Pointer m_DataStorage; QDialog *m_OtsuSegmentationDialog; QSpinBox* m_OtsuSpinBox; QPushButton* m_OtsuPushButton; mitk::DataNode::Pointer m_DataNode; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.cpp index f9b18c6cb4..9ed8c246c8 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.cpp @@ -1,1295 +1,1313 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include "mitkProperties.h" #include "mitkSegTool2D.h" #include "mitkStatusBar.h" -#include "QmitkStdMultiWidget.h" #include "QmitkNewSegmentationDialog.h" #include #include #include #include "QmitkSegmentationView.h" #include #include "mitkVtkResliceInterpolationProperty.h" #include "mitkApplicationCursor.h" #include "mitkSegmentationObjectFactory.h" #include "mitkPluginActivator.h" #include "mitkCameraController.h" #include "mitkLabelSetImage.h" +#include + #include "usModuleResource.h" #include "usModuleResourceStream.h" //micro service to get the ToolManager instance #include "mitkToolManagerProvider.h" const std::string QmitkSegmentationView::VIEW_ID = "org.mitk.views.segmentation"; // public methods QmitkSegmentationView::QmitkSegmentationView() :m_MouseCursorSet(false) ,m_Parent(NULL) ,m_Controls(NULL) - ,m_MultiWidget(NULL) ,m_DataSelectionChanged(false) + ,m_Activated(false) { mitk::NodePredicateDataType::Pointer isDwi = mitk::NodePredicateDataType::New("DiffusionImage"); mitk::NodePredicateDataType::Pointer isDti = mitk::NodePredicateDataType::New("TensorImage"); mitk::NodePredicateDataType::Pointer isQbi = mitk::NodePredicateDataType::New("QBallImage"); mitk::NodePredicateOr::Pointer isDiffusionImage = mitk::NodePredicateOr::New(isDwi, isDti); isDiffusionImage = mitk::NodePredicateOr::New(isDiffusionImage, isQbi); m_IsOfTypeImagePredicate = mitk::NodePredicateOr::New(isDiffusionImage, mitk::TNodePredicateDataType::New()); m_IsBinaryPredicate = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true)); m_IsNotBinaryPredicate = mitk::NodePredicateNot::New( m_IsBinaryPredicate ); m_IsNotABinaryImagePredicate = mitk::NodePredicateAnd::New( m_IsOfTypeImagePredicate, m_IsNotBinaryPredicate ); m_IsABinaryImagePredicate = mitk::NodePredicateAnd::New( m_IsOfTypeImagePredicate, m_IsBinaryPredicate); m_IsASegmentationImagePredicate = mitk::NodePredicateOr::New(m_IsABinaryImagePredicate, mitk::TNodePredicateDataType::New()); m_IsAPatientImagePredicate = mitk::NodePredicateAnd::New(m_IsNotABinaryImagePredicate, mitk::NodePredicateNot::New(mitk::TNodePredicateDataType::New())); } QmitkSegmentationView::~QmitkSegmentationView() { delete m_Controls; } void QmitkSegmentationView::NewNodesGenerated() { MITK_WARN<<"Use of deprecated function: NewNodesGenerated!! This function is empty and will be removed in the next time!"; } void QmitkSegmentationView::NewNodeObjectsGenerated(mitk::ToolManager::DataVectorType* nodes) { if (!nodes) return; mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); if (!toolManager) return; for (mitk::ToolManager::DataVectorType::iterator iter = nodes->begin(); iter != nodes->end(); ++iter) { this->FireNodeSelected( *iter ); // only last iteration meaningful, multiple generated objects are not taken into account here } } void QmitkSegmentationView::Visible() { if (m_DataSelectionChanged) { - this->OnSelectionChanged(this->GetDataManagerSelection()); + berry::IWorkbenchPart::Pointer nullPart; + this->OnSelectionChanged(nullPart, this->GetDataManagerSelection()); } } +void QmitkSegmentationView::Hidden() +{ +} + void QmitkSegmentationView::Activated() { + m_Activated = true; + // should be moved to ::BecomesVisible() or similar if( m_Controls ) { m_Controls->m_ManualToolSelectionBox2D->setEnabled( true ); m_Controls->m_ManualToolSelectionBox3D->setEnabled( true ); // m_Controls->m_OrganToolSelectionBox->setEnabled( true ); // m_Controls->m_LesionToolSelectionBox->setEnabled( true ); // m_Controls->m_SlicesInterpolator->Enable3DInterpolation( m_Controls->widgetStack->currentWidget() == m_Controls->pageManual ); - mitk::DataStorage::SetOfObjects::ConstPointer segmentations = this->GetDefaultDataStorage()->GetSubset( m_IsABinaryImagePredicate ); + mitk::DataStorage::SetOfObjects::ConstPointer segmentations = this->GetDataStorage()->GetSubset( m_IsABinaryImagePredicate ); - mitk::DataStorage::SetOfObjects::ConstPointer image = this->GetDefaultDataStorage()->GetSubset(m_IsAPatientImagePredicate); + mitk::DataStorage::SetOfObjects::ConstPointer image = this->GetDataStorage()->GetSubset(m_IsAPatientImagePredicate); if (!image->empty()) { OnSelectionChanged(*image->begin()); } for ( mitk::DataStorage::SetOfObjects::const_iterator iter = segmentations->begin(); iter != segmentations->end(); ++iter) { mitk::DataNode* node = *iter; itk::SimpleMemberCommand::Pointer command = itk::SimpleMemberCommand::New(); command->SetCallbackFunction(this, &QmitkSegmentationView::OnWorkingNodeVisibilityChanged); m_WorkingDataObserverTags.insert( std::pair( node, node->GetProperty("visible")->AddObserver( itk::ModifiedEvent(), command ) ) ); itk::SimpleMemberCommand::Pointer command2 = itk::SimpleMemberCommand::New(); command2->SetCallbackFunction(this, &QmitkSegmentationView::OnBinaryPropertyChanged); m_BinaryPropertyObserverTags.insert( std::pair( node, node->GetProperty("binary")->AddObserver( itk::ModifiedEvent(), command2 ) ) ); } } itk::SimpleMemberCommand::Pointer command3 = itk::SimpleMemberCommand::New(); command3->SetCallbackFunction( this, &QmitkSegmentationView::RenderingManagerReinitialized ); m_RenderingManagerObserverTag = mitk::RenderingManager::GetInstance()->AddObserver( mitk::RenderingManagerViewsInitializedEvent(), command3 ); this->SetToolManagerSelection(m_Controls->patImageSelector->GetSelectedNode(), m_Controls->segImageSelector->GetSelectedNode()); } void QmitkSegmentationView::Deactivated() { if( m_Controls ) { this->SetToolSelectionBoxesEnabled( false ); //deactivate all tools mitk::ToolManagerProvider::GetInstance()->GetToolManager()->ActivateTool(-1); //Removing all observers for ( NodeTagMapType::iterator dataIter = m_WorkingDataObserverTags.begin(); dataIter != m_WorkingDataObserverTags.end(); ++dataIter ) { (*dataIter).first->GetProperty("visible")->RemoveObserver( (*dataIter).second ); } m_WorkingDataObserverTags.clear(); for ( NodeTagMapType::iterator dataIter = m_BinaryPropertyObserverTags.begin(); dataIter != m_BinaryPropertyObserverTags.end(); ++dataIter ) { (*dataIter).first->GetProperty("binary")->RemoveObserver( (*dataIter).second ); } m_BinaryPropertyObserverTags.clear(); mitk::RenderingManager::GetInstance()->RemoveObserver(m_RenderingManagerObserverTag); ctkPluginContext* context = mitk::PluginActivator::getContext(); ctkServiceReference ppmRef = context->getServiceReference(); mitk::PlanePositionManagerService* service = context->getService(ppmRef); service->RemoveAllPlanePositions(); context->ungetService(ppmRef); this->SetToolManagerSelection(0,0); } -} -void QmitkSegmentationView::StdMultiWidgetAvailable( QmitkStdMultiWidget& stdMultiWidget ) -{ - SetMultiWidget(&stdMultiWidget); -} - -void QmitkSegmentationView::StdMultiWidgetNotAvailable() -{ - SetMultiWidget(NULL); + m_Activated = false; } -void QmitkSegmentationView::StdMultiWidgetClosed( QmitkStdMultiWidget& /*stdMultiWidget*/ ) +bool QmitkSegmentationView::IsActivated() const { - SetMultiWidget(NULL); + return m_Activated; } -void QmitkSegmentationView::SetMultiWidget(QmitkStdMultiWidget* multiWidget) +void QmitkSegmentationView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { - // save the current multiwidget as the working widget - m_MultiWidget = multiWidget; - if (m_Parent) { - m_Parent->setEnabled(m_MultiWidget); + m_Parent->setEnabled(true); } - // tell the interpolation about toolmanager and multiwidget (and data storage) - if (m_Controls && m_MultiWidget) + // tell the interpolation about toolmanager and render window part (and data storage) + if (m_Controls) { mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); - m_Controls->m_SlicesInterpolator->SetDataStorage( this->GetDefaultDataStorage()); + m_Controls->m_SlicesInterpolator->SetDataStorage( this->GetDataStorage()); QList controllers; - controllers.push_back(m_MultiWidget->GetRenderWindow1()->GetSliceNavigationController()); - controllers.push_back(m_MultiWidget->GetRenderWindow2()->GetSliceNavigationController()); - controllers.push_back(m_MultiWidget->GetRenderWindow3()->GetSliceNavigationController()); + controllers.push_back(renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); + controllers.push_back(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); + controllers.push_back(renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); m_Controls->m_SlicesInterpolator->Initialize( toolManager, controllers ); } } +void QmitkSegmentationView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* /*renderWindowPart*/) +{ + if (m_Parent) + { + m_Parent->setEnabled(false); + } +} + void QmitkSegmentationView::OnPreferencesChanged(const berry::IBerryPreferences* prefs) { if (m_Controls != NULL) { bool slimView = prefs->GetBool("slim view", false); m_Controls->m_ManualToolSelectionBox2D->SetShowNames(!slimView); m_Controls->m_ManualToolSelectionBox3D->SetShowNames(!slimView); } m_AutoSelectionEnabled = prefs->GetBool("auto selection", false); this->ForceDisplayPreferencesUponAllImages(); } void QmitkSegmentationView::CreateNewSegmentation() { mitk::DataNode::Pointer node = mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetReferenceData(0); if (node.IsNotNull()) { mitk::Image::Pointer image = dynamic_cast( node->GetData() ); if (image.IsNotNull()) { if (image->GetDimension()>1) { // ask about the name and organ type of the new segmentation QmitkNewSegmentationDialog* dialog = new QmitkNewSegmentationDialog( m_Parent ); // needs a QWidget as parent, "this" is not QWidget QString storedList = this->GetPreferences()->Get("Organ-Color-List",""); QStringList organColors; if (storedList.isEmpty()) { organColors = mitk::OrganNamesHandling::GetDefaultOrganColorString(); } else { /* a couple of examples of how organ names are stored: a simple item is built up like 'name#AABBCC' where #AABBCC is the hexadecimal notation of a color as known from HTML items are stored separated by ';' this makes it necessary to escape occurrences of ';' in name. otherwise the string "hugo;ypsilon#AABBCC;eugen#AABBCC" could not be parsed as two organs but we would get "hugo" and "ypsilon#AABBCC" and "eugen#AABBCC" so the organ name "hugo;ypsilon" is stored as "hugo\;ypsilon" and must be unescaped after loading the following lines could be one split with Perl's negative lookbehind */ // recover string list from BlueBerry view's preferences QString storedString = this->GetPreferences()->Get("Organ-Color-List",""); MITK_DEBUG << "storedString: " << storedString.toStdString(); // match a string consisting of any number of repetitions of either "anything but ;" or "\;". This matches everything until the next unescaped ';' QRegExp onePart("(?:[^;]|\\\\;)*"); MITK_DEBUG << "matching " << onePart.pattern().toStdString(); int count = 0; int pos = 0; while( (pos = onePart.indexIn( storedString, pos )) != -1 ) { ++count; int length = onePart.matchedLength(); if (length == 0) break; QString matchedString = storedString.mid(pos, length); MITK_DEBUG << " Captured length " << length << ": " << matchedString.toStdString(); pos += length + 1; // skip separating ';' // unescape possible occurrences of '\;' in the string matchedString.replace("\\;", ";"); // add matched string part to output list organColors << matchedString; } MITK_DEBUG << "Captured " << count << " organ name/colors"; } dialog->SetSuggestionList( organColors ); int dialogReturnValue = dialog->exec(); if ( dialogReturnValue == QDialog::Rejected ) return; // user clicked cancel or pressed Esc or something similar // ask the user about an organ type and name, add this information to the image's (!) propertylist // create a new image of the same dimensions and smallest possible pixel type mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); mitk::Tool* firstTool = toolManager->GetToolById(0); if (firstTool) { try { std::string newNodeName = dialog->GetSegmentationName().toStdString(); if(newNodeName.empty()) newNodeName = "no_name"; mitk::DataNode::Pointer emptySegmentation = firstTool->CreateEmptySegmentationNode( image, newNodeName, dialog->GetColor() ); // initialize showVolume to false to prevent recalculating the volume while working on the segmentation emptySegmentation->SetProperty( "showVolume", mitk::BoolProperty::New( false ) ); if (!emptySegmentation) return; // could be aborted by user mitk::OrganNamesHandling::UpdateOrganList(organColors, dialog->GetSegmentationName(), dialog->GetColor()); /* escape ';' here (replace by '\;'), see longer comment above */ QString stringForStorage = organColors.replaceInStrings(";","\\;").join(";"); MITK_DEBUG << "Will store: " << stringForStorage; this->GetPreferences()->Put("Organ-Color-List", stringForStorage); this->GetPreferences()->Flush(); if(mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetWorkingData(0)) { mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetWorkingData(0)->SetSelected(false); } emptySegmentation->SetSelected(true); - this->GetDefaultDataStorage()->Add( emptySegmentation, node ); // add as a child, because the segmentation "derives" from the original + this->GetDataStorage()->Add( emptySegmentation, node ); // add as a child, because the segmentation "derives" from the original this->ApplyDisplayOptions( emptySegmentation ); this->FireNodeSelected( emptySegmentation ); this->OnSelectionChanged( emptySegmentation ); m_Controls->segImageSelector->SetSelectedNode(emptySegmentation); mitk::RenderingManager::GetInstance()->InitializeViews(emptySegmentation->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); } catch (std::bad_alloc) { QMessageBox::warning(NULL,tr("Create new segmentation"),tr("Could not allocate memory for new segmentation")); } } } else { QMessageBox::information(NULL,tr("Segmentation"),tr("Segmentation is currently not supported for 2D images")); } } } else { MITK_ERROR << "'Create new segmentation' button should never be clickable unless a patient image is selected..."; } } void QmitkSegmentationView::OnWorkingNodeVisibilityChanged() { mitk::DataNode* selectedNode = m_Controls->segImageSelector->GetSelectedNode(); if ( !selectedNode ) { this->SetToolSelectionBoxesEnabled(false); return; } - bool selectedNodeIsVisible = selectedNode->IsVisible(mitk::BaseRenderer::GetInstance( - mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget1"))); + mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); + bool selectedNodeIsVisible = renderWindowPart + && selectedNode->IsVisible(renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer()); if (!selectedNodeIsVisible) { this->SetToolSelectionBoxesEnabled(false); this->UpdateWarningLabel(tr("The selected segmentation is currently not visible!")); } else { this->SetToolSelectionBoxesEnabled(true); this->UpdateWarningLabel(""); } } void QmitkSegmentationView::OnBinaryPropertyChanged() { mitk::DataStorage::SetOfObjects::ConstPointer patImages = m_Controls->patImageSelector->GetNodes(); bool isBinary(false); for (mitk::DataStorage::SetOfObjects::ConstIterator it = patImages->Begin(); it != patImages->End(); ++it) { const mitk::DataNode* node = it->Value(); node->GetBoolProperty("binary", isBinary); mitk::LabelSetImage::Pointer labelSetImage = dynamic_cast(node->GetData()); isBinary = isBinary || labelSetImage.IsNotNull(); if(isBinary) { m_Controls->patImageSelector->RemoveNode(node); m_Controls->segImageSelector->AddNode(node); this->SetToolManagerSelection(NULL,NULL); return; } } mitk::DataStorage::SetOfObjects::ConstPointer segImages = m_Controls->segImageSelector->GetNodes(); isBinary = true; for (mitk::DataStorage::SetOfObjects::ConstIterator it = segImages->Begin(); it != segImages->End(); ++it) { const mitk::DataNode* node = it->Value(); node->GetBoolProperty("binary", isBinary); mitk::LabelSetImage::Pointer labelSetImage = dynamic_cast(node->GetData()); isBinary = isBinary || labelSetImage.IsNotNull(); if(!isBinary) { m_Controls->segImageSelector->RemoveNode(node); m_Controls->patImageSelector->AddNode(node); if (mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetWorkingData(0) == node) mitk::ToolManagerProvider::GetInstance()->GetToolManager()->SetWorkingData(NULL); return; } } } void QmitkSegmentationView::NodeAdded(const mitk::DataNode *node) { bool isBinary (false); bool isHelperObject (false); bool isImage (false); node->GetBoolProperty("binary", isBinary); mitk::LabelSetImage::Pointer labelSetImage = dynamic_cast(node->GetData()); isBinary = isBinary || labelSetImage.IsNotNull(); node->GetBoolProperty("helper object", isHelperObject); if( dynamic_cast(node->GetData()) ) { isImage = true; } if (m_AutoSelectionEnabled) { if (!isBinary && isImage) { FireNodeSelected(const_cast(node)); } } if (isImage && !isHelperObject) { itk::SimpleMemberCommand::Pointer command = itk::SimpleMemberCommand::New(); command->SetCallbackFunction(this, &QmitkSegmentationView::OnWorkingNodeVisibilityChanged); m_WorkingDataObserverTags.insert( std::pair( const_cast(node), node->GetProperty("visible")->AddObserver( itk::ModifiedEvent(), command ) ) ); itk::SimpleMemberCommand::Pointer command2 = itk::SimpleMemberCommand::New(); command2->SetCallbackFunction(this, &QmitkSegmentationView::OnBinaryPropertyChanged); m_BinaryPropertyObserverTags.insert( std::pair( const_cast(node), node->GetProperty("binary")->AddObserver( itk::ModifiedEvent(), command2 ) ) ); this->ApplyDisplayOptions( const_cast(node) ); m_Controls->segImageSelector->setCurrentIndex( m_Controls->segImageSelector->Find(node) ); } } void QmitkSegmentationView::NodeRemoved(const mitk::DataNode* node) { bool isSeg(false); bool isHelperObject(false); node->GetBoolProperty("helper object", isHelperObject); node->GetBoolProperty("binary", isSeg); mitk::LabelSetImage::Pointer labelSetImage = dynamic_cast(node->GetData()); isSeg = isSeg || labelSetImage.IsNotNull(); mitk::Image* image = dynamic_cast(node->GetData()); if(isSeg && !isHelperObject && image) { //First of all remove all possible contour markers of the segmentation mitk::DataStorage::SetOfObjects::ConstPointer allContourMarkers = this->GetDataStorage()->GetDerivations(node, mitk::NodePredicateProperty::New("isContourMarker" , mitk::BoolProperty::New(true))); ctkPluginContext* context = mitk::PluginActivator::getContext(); ctkServiceReference ppmRef = context->getServiceReference(); mitk::PlanePositionManagerService* service = context->getService(ppmRef); for (mitk::DataStorage::SetOfObjects::ConstIterator it = allContourMarkers->Begin(); it != allContourMarkers->End(); ++it) { std::string nodeName = node->GetName(); unsigned int t = nodeName.find_last_of(" "); unsigned int id = atof(nodeName.substr(t+1).c_str())-1; service->RemovePlanePosition(id); this->GetDataStorage()->Remove(it->Value()); } context->ungetService(ppmRef); service = NULL; if ((mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetWorkingData(0) == node) && m_Controls->patImageSelector->GetSelectedNode().IsNotNull()) { this->SetToolManagerSelection(mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetReferenceData(0), NULL); this->UpdateWarningLabel(tr("Select or create a segmentation")); } mitk::SurfaceInterpolationController::GetInstance()->RemoveInterpolationSession(image); } mitk::DataNode* tempNode = const_cast(node); //Since the binary property could be changed during runtime by the user if (image && !isHelperObject) { node->GetProperty("visible")->RemoveObserver( m_WorkingDataObserverTags[tempNode] ); m_WorkingDataObserverTags.erase(tempNode); node->GetProperty("binary")->RemoveObserver( m_BinaryPropertyObserverTags[tempNode] ); m_BinaryPropertyObserverTags.erase(tempNode); } if((mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetReferenceData(0) == node)) { //as we don't know which node was actually removed e.g. our reference node, disable 'New Segmentation' button. //consider the case that there is no more image in the datastorage this->SetToolManagerSelection(NULL, NULL); this->SetToolSelectionBoxesEnabled( false ); } } //void QmitkSegmentationView::CreateSegmentationFromSurface() //{ // mitk::DataNode::Pointer surfaceNode = // m_Controls->MaskSurfaces->GetSelectedNode(); // mitk::Surface::Pointer surface(0); // if(surfaceNode.IsNotNull()) // surface = dynamic_cast ( surfaceNode->GetData() ); // if(surface.IsNull()) // { // this->HandleException( "No surface selected.", m_Parent, true); // return; // } // mitk::DataNode::Pointer imageNode // = mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetReferenceData(0); // mitk::Image::Pointer image(0); // if (imageNode.IsNotNull()) // image = dynamic_cast( imageNode->GetData() ); // if(image.IsNull()) // { // this->HandleException( "No image selected.", m_Parent, true); // return; // } // mitk::SurfaceToImageFilter::Pointer s2iFilter // = mitk::SurfaceToImageFilter::New(); // s2iFilter->MakeOutputBinaryOn(); // s2iFilter->SetInput(surface); // s2iFilter->SetImage(image); // s2iFilter->Update(); // mitk::DataNode::Pointer resultNode = mitk::DataNode::New(); // std::string nameOfResultImage = imageNode->GetName(); // nameOfResultImage.append(surfaceNode->GetName()); // resultNode->SetProperty("name", mitk::StringProperty::New(nameOfResultImage) ); // resultNode->SetProperty("binary", mitk::BoolProperty::New(true) ); // resultNode->SetData( s2iFilter->GetOutput() ); // this->GetDataStorage()->Add(resultNode, imageNode); //} //void QmitkSegmentationView::ToolboxStackPageChanged(int id) //{ // // interpolation only with manual tools visible // m_Controls->m_SlicesInterpolator->EnableInterpolation( id == 0 ); // if( id == 0 ) // { // mitk::DataNode::Pointer workingData = mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetWorkingData(0); // if( workingData.IsNotNull() ) // { // m_Controls->segImageSelector->setCurrentIndex( m_Controls->segImageSelector->Find(workingData) ); // } // } // // this is just a workaround, should be removed when all tools support 3D+t // if (id==2) // lesions // { // mitk::DataNode::Pointer node = mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetReferenceData(0); // if (node.IsNotNull()) // { // mitk::Image::Pointer image = dynamic_cast( node->GetData() ); // if (image.IsNotNull()) // { // if (image->GetDimension()>3) // { // m_Controls->widgetStack->setCurrentIndex(0); // QMessageBox::information(NULL,"Segmentation","Lesion segmentation is currently not supported for 4D images"); // } // } // } // } //} // protected void QmitkSegmentationView::OnPatientComboBoxSelectionChanged( const mitk::DataNode* node ) { //mitk::DataNode* selectedNode = const_cast(node); if( node != NULL ) { this->UpdateWarningLabel(""); mitk::DataNode* segNode = m_Controls->segImageSelector->GetSelectedNode(); if (segNode) { - mitk::DataStorage::SetOfObjects::ConstPointer possibleParents = this->GetDefaultDataStorage()->GetSources(segNode, m_IsAPatientImagePredicate); + mitk::DataStorage::SetOfObjects::ConstPointer possibleParents = this->GetDataStorage()->GetSources(segNode, m_IsAPatientImagePredicate); bool isSourceNode(false); for (mitk::DataStorage::SetOfObjects::ConstIterator it = possibleParents->Begin(); it != possibleParents->End(); it++) { if (it.Value() == node) isSourceNode = true; } if ( !isSourceNode && (!this->CheckForSameGeometry(segNode, node) || possibleParents->Size() > 0 )) { this->SetToolManagerSelection(node, NULL); this->SetToolSelectionBoxesEnabled( false ); this->UpdateWarningLabel(tr("The selected patient image does not match with the selected segmentation!")); } else if ((!isSourceNode && this->CheckForSameGeometry(segNode, node)) || isSourceNode ) { this->SetToolManagerSelection(node, segNode); //Doing this we can assure that the segmenation is always visible if the segmentation and the patient image are //loaded separately int layer(10); node->GetIntProperty("layer", layer); layer++; segNode->SetProperty("layer", mitk::IntProperty::New(layer)); //this->UpdateWarningLabel(""); RenderingManagerReinitialized(); } } else { this->SetToolManagerSelection(node, NULL); this->SetToolSelectionBoxesEnabled( false ); this->UpdateWarningLabel(tr("Select or create a segmentation")); } } else { this->UpdateWarningLabel(tr("Please load an image!")); this->SetToolSelectionBoxesEnabled( false ); } } void QmitkSegmentationView::OnSegmentationComboBoxSelectionChanged(const mitk::DataNode *node) { if (node == NULL) { this->UpdateWarningLabel(tr("Select or create a segmentation")); this->SetToolSelectionBoxesEnabled( false ); return; } mitk::DataNode* refNode = m_Controls->patImageSelector->GetSelectedNode(); RenderingManagerReinitialized(); if ( m_Controls->lblSegmentationWarnings->isVisible()) // "RenderingManagerReinitialized()" caused a warning. we do not need to go any further return; if (m_AutoSelectionEnabled) { this->OnSelectionChanged(const_cast(node)); } else { - mitk::DataStorage::SetOfObjects::ConstPointer possibleParents = this->GetDefaultDataStorage()->GetSources(node, m_IsAPatientImagePredicate); + mitk::DataStorage::SetOfObjects::ConstPointer possibleParents = this->GetDataStorage()->GetSources(node, m_IsAPatientImagePredicate); if ( possibleParents->Size() == 1 ) { mitk::DataNode* parentNode = possibleParents->ElementAt(0); if (parentNode != refNode) { this->UpdateWarningLabel(tr("The selected segmentation does not match with the selected patient image!")); this->SetToolSelectionBoxesEnabled( false ); this->SetToolManagerSelection(NULL, node); } else { this->UpdateWarningLabel(""); this->SetToolManagerSelection(refNode, node); } } else if (refNode && this->CheckForSameGeometry(node, refNode)) { this->UpdateWarningLabel(""); this->SetToolManagerSelection(refNode, node); } else if (!refNode || !this->CheckForSameGeometry(node, refNode)) { this->UpdateWarningLabel(tr("Please select or load the according patient image!")); } } - if (!node->IsVisible(mitk::BaseRenderer::GetInstance( mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget1")))) + + mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); + if (!renderWindowPart || !node->IsVisible(renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer())) { this->UpdateWarningLabel(tr("The selected segmentation is currently not visible!")); this->SetToolSelectionBoxesEnabled( false ); } } void QmitkSegmentationView::OnShowMarkerNodes (bool state) { mitk::SegTool2D::Pointer manualSegmentationTool; unsigned int numberOfExistingTools = mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetTools().size(); for(unsigned int i = 0; i < numberOfExistingTools; i++) { manualSegmentationTool = dynamic_cast(mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetToolById(i)); if (manualSegmentationTool) { if(state == true) { manualSegmentationTool->SetShowMarkerNodes( true ); } else { manualSegmentationTool->SetShowMarkerNodes( false ); } } } } void QmitkSegmentationView::OnSelectionChanged(mitk::DataNode* node) { - std::vector nodes; - nodes.push_back( node ); - this->OnSelectionChanged( nodes ); + berry::IWorkbenchPart::Pointer nullPart; + QList nodes; + nodes.push_back(node); + this->OnSelectionChanged(nullPart, nodes); } -void QmitkSegmentationView::OnSelectionChanged(std::vector nodes) +void QmitkSegmentationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { if (nodes.size() != 0) { std::string markerName = "Position"; unsigned int numberOfNodes = nodes.size(); std::string nodeName = nodes.at( 0 )->GetName(); if ( ( numberOfNodes == 1 ) && ( nodeName.find( markerName ) == 0) ) { this->OnContourMarkerSelected( nodes.at( 0 ) ); return; } } if (m_AutoSelectionEnabled && this->IsActivated()) { if (nodes.size() == 0 && m_Controls->patImageSelector->GetSelectedNode().IsNull()) { SetToolManagerSelection(NULL,NULL); } else if (nodes.size() == 1) { mitk::DataNode::Pointer selectedNode = nodes.at(0); if(selectedNode.IsNull()) { return; } mitk::Image::Pointer selectedImage = dynamic_cast(selectedNode->GetData()); if (selectedImage.IsNull()) { SetToolManagerSelection(NULL,NULL); return; } else { bool isASegmentation(false); selectedNode->GetBoolProperty("binary", isASegmentation); mitk::LabelSetImage::Pointer labelSetImage = dynamic_cast(selectedNode->GetData()); isASegmentation = isASegmentation || labelSetImage.IsNotNull(); if (isASegmentation) { //If a segmentation is selected find a possible reference image: mitk::DataStorage::SetOfObjects::ConstPointer sources = this->GetDataStorage()->GetSources(selectedNode, m_IsAPatientImagePredicate); mitk::DataNode::Pointer refNode; if (sources->Size() != 0) { refNode = sources->ElementAt(0); refNode->SetVisibility(true); selectedNode->SetVisibility(true); SetToolManagerSelection(refNode,selectedNode); mitk::DataStorage::SetOfObjects::ConstPointer otherSegmentations = this->GetDataStorage()->GetSubset(m_IsASegmentationImagePredicate); for(mitk::DataStorage::SetOfObjects::const_iterator iter = otherSegmentations->begin(); iter != otherSegmentations->end(); ++iter) { mitk::DataNode* node = *iter; if (dynamic_cast(node->GetData()) != selectedImage.GetPointer()) node->SetVisibility(false); } mitk::DataStorage::SetOfObjects::ConstPointer otherPatientImages = this->GetDataStorage()->GetSubset(m_IsAPatientImagePredicate); for(mitk::DataStorage::SetOfObjects::const_iterator iter = otherPatientImages->begin(); iter != otherPatientImages->end(); ++iter) { mitk::DataNode* node = *iter; if (dynamic_cast(node->GetData()) != dynamic_cast(refNode->GetData())) node->SetVisibility(false); } } else { mitk::DataStorage::SetOfObjects::ConstPointer possiblePatientImages = this->GetDataStorage()->GetSubset(m_IsAPatientImagePredicate); for (mitk::DataStorage::SetOfObjects::ConstIterator it = possiblePatientImages->Begin(); it != possiblePatientImages->End(); it++) { refNode = it->Value(); if (this->CheckForSameGeometry(selectedNode, it->Value())) { refNode->SetVisibility(true); selectedNode->SetVisibility(true); mitk::DataStorage::SetOfObjects::ConstPointer otherSegmentations = this->GetDataStorage()->GetSubset(m_IsASegmentationImagePredicate); for(mitk::DataStorage::SetOfObjects::const_iterator iter = otherSegmentations->begin(); iter != otherSegmentations->end(); ++iter) { mitk::DataNode* node = *iter; if (dynamic_cast(node->GetData()) != selectedImage.GetPointer()) node->SetVisibility(false); } mitk::DataStorage::SetOfObjects::ConstPointer otherPatientImages = this->GetDataStorage()->GetSubset(m_IsAPatientImagePredicate); for(mitk::DataStorage::SetOfObjects::const_iterator iter = otherPatientImages->begin(); iter != otherPatientImages->end(); ++iter) { mitk::DataNode* node = *iter; if (dynamic_cast(node->GetData()) != dynamic_cast(refNode->GetData())) node->SetVisibility(false); } this->SetToolManagerSelection(refNode, selectedNode); //Doing this we can assure that the segmenation is always visible if the segmentation and the patient image are at the //same level in the datamanager int layer(10); refNode->GetIntProperty("layer", layer); layer++; selectedNode->SetProperty("layer", mitk::IntProperty::New(layer)); return; } } this->SetToolManagerSelection(NULL, selectedNode); } mitk::RenderingManager::GetInstance()->InitializeViews(selectedNode->GetData()->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true ); } else { if (mitk::ToolManagerProvider::GetInstance()->GetToolManager()->GetReferenceData(0) != selectedNode) { SetToolManagerSelection(selectedNode, NULL); //May be a bug in the selection services. A node which is deselected will be passed as selected node to the OnSelectionChanged function - if (!selectedNode->IsVisible(mitk::BaseRenderer::GetInstance( mitk::BaseRenderer::GetRenderWindowByName("stdmulti.widget1")))) + mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); + if (renderWindowPart && !selectedNode->IsVisible(renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer())) selectedNode->SetVisibility(true); this->UpdateWarningLabel(tr("The selected patient image does not\nmatchwith the selected segmentation!")); this->SetToolSelectionBoxesEnabled( false ); } } } } if ( m_Controls->lblSegmentationWarnings->isVisible()) // "RenderingManagerReinitialized()" caused a warning. we do not need to go any further return; RenderingManagerReinitialized(); } } void QmitkSegmentationView::OnContourMarkerSelected(const mitk::DataNode *node) { QmitkRenderWindow* selectedRenderWindow = 0; - QmitkRenderWindow* RenderWindow1 = - this->GetActiveStdMultiWidget()->GetRenderWindow1(); - QmitkRenderWindow* RenderWindow2 = - this->GetActiveStdMultiWidget()->GetRenderWindow2(); - QmitkRenderWindow* RenderWindow3 = - this->GetActiveStdMultiWidget()->GetRenderWindow3(); - QmitkRenderWindow* RenderWindow4 = - this->GetActiveStdMultiWidget()->GetRenderWindow4(); + QmitkRenderWindow* axialRenderWindow = + this->GetRenderWindowPart(OPEN)->GetQmitkRenderWindow("axial"); + QmitkRenderWindow* sagittalRenderWindow = + this->GetRenderWindowPart(OPEN)->GetQmitkRenderWindow("sagittal"); + QmitkRenderWindow* coronalRenderWindow = + this->GetRenderWindowPart(OPEN)->GetQmitkRenderWindow("coronal"); + QmitkRenderWindow* _3DRenderWindow = + this->GetRenderWindowPart(OPEN)->GetQmitkRenderWindow("3d"); bool PlanarFigureInitializedWindow = false; // find initialized renderwindow if (node->GetBoolProperty("PlanarFigureInitializedWindow", - PlanarFigureInitializedWindow, RenderWindow1->GetRenderer())) + PlanarFigureInitializedWindow, axialRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow1; + selectedRenderWindow = axialRenderWindow; } if (!selectedRenderWindow && node->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, - RenderWindow2->GetRenderer())) + sagittalRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow2; + selectedRenderWindow = sagittalRenderWindow; } if (!selectedRenderWindow && node->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, - RenderWindow3->GetRenderer())) + coronalRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow3; + selectedRenderWindow = coronalRenderWindow; } if (!selectedRenderWindow && node->GetBoolProperty( "PlanarFigureInitializedWindow", PlanarFigureInitializedWindow, - RenderWindow4->GetRenderer())) + _3DRenderWindow->GetRenderer())) { - selectedRenderWindow = RenderWindow4; + selectedRenderWindow = _3DRenderWindow; } // make node visible if (selectedRenderWindow) { std::string nodeName = node->GetName(); unsigned int t = nodeName.find_last_of(" "); unsigned int id = atof(nodeName.substr(t+1).c_str())-1; { ctkPluginContext* context = mitk::PluginActivator::getContext(); ctkServiceReference ppmRef = context->getServiceReference(); mitk::PlanePositionManagerService* service = context->getService(ppmRef); selectedRenderWindow->GetSliceNavigationController()->ExecuteOperation(service->GetPlanePosition(id)); context->ungetService(ppmRef); } selectedRenderWindow->GetRenderer()->GetCameraController()->Fit(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } void QmitkSegmentationView::OnTabWidgetChanged(int id) { //always disable tools on tab changed mitk::ToolManagerProvider::GetInstance()->GetToolManager()->ActivateTool(-1); //2D Tab ID = 0 //3D Tab ID = 1 if (id == 0) { //Hide 3D selection box, show 2D selection box m_Controls->m_ManualToolSelectionBox3D->hide(); m_Controls->m_ManualToolSelectionBox2D->show(); //Deactivate possible active tool //TODO Remove possible visible interpolations -> Maybe changes in SlicesInterpolator } else { //Hide 3D selection box, show 2D selection box m_Controls->m_ManualToolSelectionBox2D->hide(); m_Controls->m_ManualToolSelectionBox3D->show(); //Deactivate possible active tool } } void QmitkSegmentationView::SetToolManagerSelection(const mitk::DataNode* referenceData, const mitk::DataNode* workingData) { // called as a result of new BlueBerry selections // tells the ToolManager for manual segmentation about new selections // updates GUI information about what the user should select mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); toolManager->SetReferenceData(const_cast(referenceData)); toolManager->SetWorkingData( const_cast(workingData)); // check original image m_Controls->btnNewSegmentation->setEnabled(referenceData != NULL); if (referenceData) { this->UpdateWarningLabel(""); disconnect( m_Controls->patImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), this, SLOT( OnPatientComboBoxSelectionChanged( const mitk::DataNode* ) ) ); m_Controls->patImageSelector->setCurrentIndex( m_Controls->patImageSelector->Find(referenceData) ); connect( m_Controls->patImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), this, SLOT( OnPatientComboBoxSelectionChanged( const mitk::DataNode* ) ) ); } // check segmentation if (referenceData) { if (workingData) { this->FireNodeSelected(const_cast(workingData)); // if( m_Controls->widgetStack->currentIndex() == 0 ) // { disconnect( m_Controls->segImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), this, SLOT( OnSegmentationComboBoxSelectionChanged( const mitk::DataNode* ) ) ); m_Controls->segImageSelector->setCurrentIndex(m_Controls->segImageSelector->Find(workingData)); connect( m_Controls->segImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), this, SLOT( OnSegmentationComboBoxSelectionChanged(const mitk::DataNode*)) ); // } } } } void QmitkSegmentationView::ForceDisplayPreferencesUponAllImages() { if (!m_Parent) { return; } // check all images and segmentations in DataStorage: // (items in brackets are implicitly done by previous steps) // 1. // if a reference image is selected, // show the reference image // and hide all other images (orignal and segmentation), // (and hide all segmentations of the other original images) // and show all the reference's segmentations // if no reference image is selected, do do nothing // // 2. // if a segmentation is selected, // show it // (and hide all all its siblings (childs of the same parent, incl, NULL parent)) // if no segmentation is selected, do nothing if (!m_Controls) { return; // might happen on initialization (preferences loaded) } mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); mitk::DataNode::Pointer referenceData = toolManager->GetReferenceData(0); mitk::DataNode::Pointer workingData = toolManager->GetWorkingData(0); // 1. if (referenceData.IsNotNull()) { // iterate all images - mitk::DataStorage::SetOfObjects::ConstPointer allImages = this->GetDefaultDataStorage()->GetSubset(m_IsASegmentationImagePredicate); + mitk::DataStorage::SetOfObjects::ConstPointer allImages = this->GetDataStorage()->GetSubset(m_IsASegmentationImagePredicate); for ( mitk::DataStorage::SetOfObjects::const_iterator iter = allImages->begin(); iter != allImages->end(); ++iter) { mitk::DataNode* node = *iter; // apply display preferences ApplyDisplayOptions(node); // set visibility node->SetVisibility(node == referenceData); } } // 2. if (workingData.IsNotNull()) workingData->SetVisibility(true); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkSegmentationView::ApplyDisplayOptions(mitk::DataNode* node) { if (!node) { return; } mitk::BoolProperty::Pointer drawOutline = mitk::BoolProperty::New(GetPreferences()->GetBool("draw outline", true)); mitk::BoolProperty::Pointer volumeRendering = mitk::BoolProperty::New(GetPreferences()->GetBool("volume rendering", false)); mitk::LabelSetImage* labelSetImage = dynamic_cast(node->GetData()); if (nullptr != labelSetImage) { // node is actually a multi label segmentation, // but its outline property can be set in the 'single label' segmentation preference page as well node->SetProperty("labelset.contour.active", drawOutline); node->SetProperty("opacity", mitk::FloatProperty::New(drawOutline->GetValue() ? 1.0f : 0.3f)); node->SetProperty("volumerendering", volumeRendering); // force render window update to show outline node->GetData()->Modified(); } else { // node is a 'single label' segmentation bool isBinary = false; node->GetBoolProperty("binary", isBinary); if (isBinary) { node->SetProperty("outline binary", drawOutline); node->SetProperty("outline width", mitk::FloatProperty::New(2.0)); node->SetProperty("opacity", mitk::FloatProperty::New(drawOutline->GetValue() ? 1.0f : 0.3f)); node->SetProperty("volumerendering", volumeRendering); // force render window update to show outline node->GetData()->Modified(); } } } void QmitkSegmentationView::RenderingManagerReinitialized() { - if ( ! m_MultiWidget ) { return; } + if (!this->GetRenderWindowPart()) + { + return; + } /* * Here we check whether the geometry of the selected segmentation image if aligned with the worldgeometry * At the moment it is not supported to use a geometry different from the selected image for reslicing. * For further information see Bug 16063 */ mitk::DataNode* workingNode = m_Controls->segImageSelector->GetSelectedNode(); - const mitk::BaseGeometry* worldGeo = m_MultiWidget->GetRenderWindow4()->GetSliceNavigationController()->GetCurrentGeometry3D(); + const mitk::BaseGeometry* worldGeo = this->GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetSliceNavigationController()->GetCurrentGeometry3D(); if (workingNode && worldGeo) { const mitk::BaseGeometry* workingNodeGeo = workingNode->GetData()->GetGeometry(); - const mitk::BaseGeometry* worldGeo = m_MultiWidget->GetRenderWindow4()->GetSliceNavigationController()->GetCurrentGeometry3D(); + const mitk::BaseGeometry* worldGeo = this->GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetSliceNavigationController()->GetCurrentGeometry3D(); if (mitk::Equal(*workingNodeGeo->GetBoundingBox(), *worldGeo->GetBoundingBox(), mitk::eps, true)) { this->SetToolManagerSelection(m_Controls->patImageSelector->GetSelectedNode(), workingNode); this->SetToolSelectionBoxesEnabled(true); this->UpdateWarningLabel(""); } else { this->SetToolManagerSelection(m_Controls->patImageSelector->GetSelectedNode(), NULL); this->SetToolSelectionBoxesEnabled(false); this->UpdateWarningLabel(tr("Please perform a reinit on the segmentation image!")); } } } bool QmitkSegmentationView::CheckForSameGeometry(const mitk::DataNode *node1, const mitk::DataNode *node2) const { bool isSameGeometry(true); mitk::Image* image1 = dynamic_cast(node1->GetData()); mitk::Image* image2 = dynamic_cast(node2->GetData()); if (image1 && image2) { mitk::BaseGeometry* geo1 = image1->GetGeometry(); mitk::BaseGeometry* geo2 = image2->GetGeometry(); isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetOrigin(), geo2->GetOrigin()); isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(0), geo2->GetExtent(0)); isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(1), geo2->GetExtent(1)); isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetExtent(2), geo2->GetExtent(2)); isSameGeometry = isSameGeometry && mitk::Equal(geo1->GetSpacing(), geo2->GetSpacing()); isSameGeometry = isSameGeometry && mitk::MatrixEqualElementWise(geo1->GetIndexToWorldTransform()->GetMatrix(), geo2->GetIndexToWorldTransform()->GetMatrix()); return isSameGeometry; } else { return false; } } void QmitkSegmentationView::UpdateWarningLabel(QString text) { if (text.size() == 0) m_Controls->lblSegmentationWarnings->hide(); else m_Controls->lblSegmentationWarnings->show(); m_Controls->lblSegmentationWarnings->setText(text); } void QmitkSegmentationView::CreateQtPartControl(QWidget* parent) { // setup the basic GUI of this view m_Parent = parent; m_Controls = new Ui::QmitkSegmentationControls; m_Controls->setupUi(parent); - m_Controls->patImageSelector->SetDataStorage(this->GetDefaultDataStorage()); + m_Controls->patImageSelector->SetDataStorage(this->GetDataStorage()); m_Controls->patImageSelector->SetPredicate(mitk::NodePredicateAnd::New(m_IsAPatientImagePredicate, mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))).GetPointer()); this->UpdateWarningLabel(tr("Please load an image")); if( m_Controls->patImageSelector->GetSelectedNode().IsNotNull() ) this->UpdateWarningLabel(tr("Select or create a new segmentation")); - m_Controls->segImageSelector->SetDataStorage(this->GetDefaultDataStorage()); + m_Controls->segImageSelector->SetDataStorage(this->GetDataStorage()); m_Controls->segImageSelector->SetPredicate(mitk::NodePredicateAnd::New(m_IsASegmentationImagePredicate, mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))).GetPointer()); if( m_Controls->segImageSelector->GetSelectedNode().IsNotNull() ) this->UpdateWarningLabel(""); mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); assert ( toolManager ); - toolManager->SetDataStorage( *(this->GetDefaultDataStorage()) ); + toolManager->SetDataStorage( *(this->GetDataStorage()) ); toolManager->InitializeTools(); // all part of open source MITK m_Controls->m_ManualToolSelectionBox2D->SetGenerateAccelerators(true); m_Controls->m_ManualToolSelectionBox2D->SetToolGUIArea( m_Controls->m_ManualToolGUIContainer2D ); m_Controls->m_ManualToolSelectionBox2D->SetDisplayedToolGroups(tr("Add Subtract Correction Paint Wipe 'Region Growing' Fill Erase 'Live Wire' '2D Fast Marching'").toStdString()); m_Controls->m_ManualToolSelectionBox2D->SetLayoutColumns(3); m_Controls->m_ManualToolSelectionBox2D->SetEnabledMode( QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible ); connect( m_Controls->m_ManualToolSelectionBox2D, SIGNAL(ToolSelected(int)), this, SLOT(OnManualTool2DSelected(int)) ); //setup 3D Tools m_Controls->m_ManualToolSelectionBox3D->SetGenerateAccelerators(true); m_Controls->m_ManualToolSelectionBox3D->SetToolGUIArea( m_Controls->m_ManualToolGUIContainer3D ); //specify tools to be added to 3D Tool area m_Controls->m_ManualToolSelectionBox3D->SetDisplayedToolGroups(tr("Threshold 'UL Threshold' Otsu 'Fast Marching 3D' 'Region Growing 3D' Watershed Picking").toStdString()); m_Controls->m_ManualToolSelectionBox3D->SetLayoutColumns(3); m_Controls->m_ManualToolSelectionBox3D->SetEnabledMode( QmitkToolSelectionBox::EnabledWithReferenceAndWorkingDataVisible ); //Hide 3D selection box, show 2D selection box m_Controls->m_ManualToolSelectionBox3D->hide(); m_Controls->m_ManualToolSelectionBox2D->show(); toolManager->NewNodesGenerated += mitk::MessageDelegate( this, &QmitkSegmentationView::NewNodesGenerated ); // update the list of segmentations toolManager->NewNodeObjectsGenerated += mitk::MessageDelegate1( this, &QmitkSegmentationView::NewNodeObjectsGenerated ); // update the list of segmentations // create signal/slot connections connect( m_Controls->patImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), this, SLOT( OnPatientComboBoxSelectionChanged( const mitk::DataNode* ) ) ); connect( m_Controls->segImageSelector, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), this, SLOT( OnSegmentationComboBoxSelectionChanged( const mitk::DataNode* ) ) ); connect( m_Controls->btnNewSegmentation, SIGNAL(clicked()), this, SLOT(CreateNewSegmentation()) ); // connect( m_Controls->CreateSegmentationFromSurface, SIGNAL(clicked()), this, SLOT(CreateSegmentationFromSurface()) ); // connect( m_Controls->widgetStack, SIGNAL(currentChanged(int)), this, SLOT(ToolboxStackPageChanged(int)) ); connect( m_Controls->tabWidgetSegmentationTools, SIGNAL(currentChanged(int)), this, SLOT(OnTabWidgetChanged(int))); // connect(m_Controls->MaskSurfaces, SIGNAL( OnSelectionChanged( const mitk::DataNode* ) ), // this, SLOT( OnSurfaceSelectionChanged( ) ) ); connect(m_Controls->m_SlicesInterpolator, SIGNAL(SignalShowMarkerNodes(bool)), this, SLOT(OnShowMarkerNodes(bool))); - // m_Controls->MaskSurfaces->SetDataStorage(this->GetDefaultDataStorage()); + // m_Controls->MaskSurfaces->SetDataStorage(this->GetDataStorage()); // m_Controls->MaskSurfaces->SetPredicate(mitk::NodePredicateDataType::New("Surface")); } +void QmitkSegmentationView::SetFocus() +{ + m_Controls->btnNewSegmentation->setFocus(); +} + void QmitkSegmentationView::OnManualTool2DSelected(int id) { if (id >= 0) { std::string text = "Active Tool: \""; mitk::ToolManager* toolManager = mitk::ToolManagerProvider::GetInstance()->GetToolManager(); text += toolManager->GetToolById(id)->GetName(); text += "\""; mitk::StatusBar::GetInstance()->DisplayText(text.c_str()); us::ModuleResource resource = toolManager->GetToolById(id)->GetCursorIconResource(); this->SetMouseCursor(resource, 0, 0); } else { this->ResetMouseCursor(); mitk::StatusBar::GetInstance()->DisplayText(""); } } void QmitkSegmentationView::ResetMouseCursor() { if ( m_MouseCursorSet ) { mitk::ApplicationCursor::GetInstance()->PopCursor(); m_MouseCursorSet = false; } } void QmitkSegmentationView::SetMouseCursor( const us::ModuleResource& resource, int hotspotX, int hotspotY ) { if (!resource) return; // Remove previously set mouse cursor if ( m_MouseCursorSet ) { mitk::ApplicationCursor::GetInstance()->PopCursor(); } us::ModuleResourceStream cursor(resource, std::ios::binary); mitk::ApplicationCursor::GetInstance()->PushCursor( cursor, hotspotX, hotspotY ); m_MouseCursorSet = true; } void QmitkSegmentationView::SetToolSelectionBoxesEnabled(bool status) { if (status) { m_Controls->m_ManualToolSelectionBox2D->RecreateButtons(); m_Controls->m_ManualToolSelectionBox3D->RecreateButtons(); } m_Controls->m_ManualToolSelectionBox2D->setEnabled(status); m_Controls->m_ManualToolSelectionBox3D->setEnabled(status); m_Controls->m_SlicesInterpolator->setEnabled(status); } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.h index fbc87b517e..8be9da5b55 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkSegmentationView.h @@ -1,176 +1,180 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkSegmentationView_h #define QmitkSegmentationView_h -#include "QmitkFunctionality.h" +#include +#include +#include #include #include "ui_QmitkSegmentationControls.h" class QmitkRenderWindow; /** * \ingroup ToolManagerEtAl * \ingroup org_mitk_gui_qt_segmentation_internal * \warning Implementation of this class is split up into two .cpp files to make things more compact. Check both this file and QmitkSegmentationOrganNamesHandling.cpp */ -class QmitkSegmentationView : public QmitkFunctionality +class QmitkSegmentationView : public QmitkAbstractView, public mitk::ILifecycleAwarePart, public mitk::IRenderWindowPartListener { Q_OBJECT public: QmitkSegmentationView(); virtual ~QmitkSegmentationView(); typedef std::map NodeTagMapType; /*! \brief Invoked when the DataManager selection changed */ virtual void OnSelectionChanged(mitk::DataNode* node); - virtual void OnSelectionChanged(std::vector nodes) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; // reaction to new segmentations being created by segmentation tools void NewNodesGenerated(); void NewNodeObjectsGenerated(mitk::ToolManager::DataVectorType*); - // QmitkFunctionality's activate/deactivate virtual void Activated() override; virtual void Deactivated() override; + bool IsActivated() const; virtual void Visible() override; + virtual void Hidden() override; - // QmitkFunctionality's changes regarding THE QmitkStdMultiWidget - virtual void StdMultiWidgetAvailable(QmitkStdMultiWidget& stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; - virtual void StdMultiWidgetClosed(QmitkStdMultiWidget& stdMultiWidget) override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; + + virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; + + virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; // BlueBerry's notification about preference changes (e.g. from a dialog) virtual void OnPreferencesChanged(const berry::IBerryPreferences* prefs) override; // observer to mitk::RenderingManager's RenderingManagerViewsInitializedEvent event void RenderingManagerReinitialized(); // observer to mitk::SliceController's SliceRotation event void SliceRotation(const itk::EventObject&); static const std::string VIEW_ID; protected slots: void OnPatientComboBoxSelectionChanged(const mitk::DataNode* node); void OnSegmentationComboBoxSelectionChanged(const mitk::DataNode* node); // reaction to the button "New segmentation" void CreateNewSegmentation(); void OnManualTool2DSelected(int id); void OnWorkingNodeVisibilityChanged(); // called if a node's binary property has changed void OnBinaryPropertyChanged(); void OnShowMarkerNodes(bool); void OnTabWidgetChanged(int); protected: // a type for handling lists of DataNodes typedef std::vector NodeList; - // set available multiwidget - void SetMultiWidget(QmitkStdMultiWidget* multiWidget); - // actively query the current selection of data manager //void PullCurrentDataManagerSelection(); // reactions to selection events from data manager (and potential other senders) //void BlueBerrySelectionChanged(berry::IWorkbenchPart::Pointer sourcepart, berry::ISelection::ConstPointer selection); mitk::DataNode::Pointer FindFirstRegularImage( std::vector nodes ); mitk::DataNode::Pointer FindFirstSegmentation( std::vector nodes ); // propagate BlueBerry selection to ToolManager for manual segmentation void SetToolManagerSelection(const mitk::DataNode* referenceData, const mitk::DataNode* workingData); // checks if given render window aligns with the slices of given image bool IsRenderWindowAligned(QmitkRenderWindow* renderWindow, mitk::Image* image); // make sure all images/segmentations look as selected by the users in this view's preferences void ForceDisplayPreferencesUponAllImages(); // decorates a DataNode according to the user preference settings void ApplyDisplayOptions(mitk::DataNode* node); // GUI setup void CreateQtPartControl(QWidget* parent) override; void ResetMouseCursor( ); void SetMouseCursor(const us::ModuleResource&, int hotspotX, int hotspotY ); void SetToolSelectionBoxesEnabled(bool); bool m_MouseCursorSet; // If a contourmarker is selected, the plane in the related widget will be reoriented according to the marker`s geometry void OnContourMarkerSelected (const mitk::DataNode* node); void NodeRemoved(const mitk::DataNode* node) override; void NodeAdded(const mitk::DataNode *node) override; bool CheckForSameGeometry(const mitk::DataNode*, const mitk::DataNode*) const; void UpdateWarningLabel(QString text/*, bool overwriteExistingText = true*/); // the Qt parent of our GUI (NOT of this object) QWidget* m_Parent; // our GUI Ui::QmitkSegmentationControls * m_Controls; - // THE currently existing QmitkStdMultiWidget - QmitkStdMultiWidget * m_MultiWidget; - unsigned long m_VisibilityChangedObserverTag; bool m_DataSelectionChanged; NodeTagMapType m_WorkingDataObserverTags; NodeTagMapType m_BinaryPropertyObserverTags; unsigned int m_RenderingManagerObserverTag; bool m_AutoSelectionEnabled; mitk::NodePredicateOr::Pointer m_IsOfTypeImagePredicate; mitk::NodePredicateProperty::Pointer m_IsBinaryPredicate; mitk::NodePredicateNot::Pointer m_IsNotBinaryPredicate; mitk::NodePredicateAnd::Pointer m_IsNotABinaryImagePredicate; mitk::NodePredicateAnd::Pointer m_IsABinaryImagePredicate; mitk::NodePredicateOr::Pointer m_IsASegmentationImagePredicate; mitk::NodePredicateAnd::Pointer m_IsAPatientImagePredicate; + + bool m_Activated; + }; #endif /*QMITKsegmentationVIEW_H_*/ diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.cpp index 7b0547a5e1..7233b9a5eb 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.cpp @@ -1,117 +1,117 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkThresholdAction.h" // MITK #include #include #include // Qt #include #include #include #include using namespace berry; using namespace mitk; using namespace std; QmitkThresholdAction::QmitkThresholdAction() { } QmitkThresholdAction::~QmitkThresholdAction() { } void QmitkThresholdAction::Run(const QList &selectedNodes) { m_ThresholdingToolManager = ToolManager::New(m_DataStorage); m_ThresholdingToolManager->RegisterClient(); Tool *binaryThresholdTool = m_ThresholdingToolManager->GetToolById(m_ThresholdingToolManager->GetToolIdByToolType()); if (binaryThresholdTool != NULL) { QmitkBinaryThresholdToolGUI *gui = dynamic_cast(binaryThresholdTool->GetGUI("Qmitk", "GUI").GetPointer()); if (gui != NULL) { QDialog thresholdingDialog(QApplication::activeWindow(), Qt::Window | Qt::WindowStaysOnTopHint); thresholdingDialog.setWindowFlags(thresholdingDialog.windowFlags() & ~Qt::WindowMinimizeButtonHint); QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(rejected()), &thresholdingDialog, SLOT(reject())); connect(gui, SIGNAL(thresholdAccepted()), &thresholdingDialog, SLOT(reject())); QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(3, 3, 3, 3); gui->SetTool(binaryThresholdTool); gui->setParent(&thresholdingDialog); layout->addWidget(gui); layout->addWidget(buttonBox); thresholdingDialog.setLayout(layout); thresholdingDialog.setMinimumWidth(350); m_SelectedNode = selectedNodes[0]; m_ThresholdingToolManager->SetReferenceData(selectedNodes[0]); m_ThresholdingToolManager->ActivateTool(m_ThresholdingToolManager->GetToolIdByToolType()); m_ThresholdingToolManager->ActiveToolChanged += mitk::MessageDelegate(this, &QmitkThresholdAction::OnThresholdingToolManagerToolModified); thresholdingDialog.exec(); m_ThresholdingToolManager->ActiveToolChanged -= mitk::MessageDelegate(this, &QmitkThresholdAction::OnThresholdingToolManagerToolModified); m_ThresholdingToolManager->SetReferenceData(NULL); m_ThresholdingToolManager->ActivateTool(-1); m_SelectedNode = 0; } } m_ThresholdingToolManager->UnregisterClient(); } void QmitkThresholdAction::OnThresholdingToolManagerToolModified() { if (m_ThresholdingToolManager.IsNotNull()) { if (m_ThresholdingToolManager->GetActiveToolID() < 0) { m_ThresholdingToolManager->SetReferenceData(m_SelectedNode); m_ThresholdingToolManager->ActivateTool(m_ThresholdingToolManager->GetToolIdByToolType()); } } } void QmitkThresholdAction::SetDataStorage(DataStorage *dataStorage) { m_DataStorage = dataStorage; } void QmitkThresholdAction::SetSmoothed(bool) { } void QmitkThresholdAction::SetDecimated(bool) { } -void QmitkThresholdAction::SetFunctionality(QtViewPart* /*functionality*/) +void QmitkThresholdAction::SetFunctionality(QtViewPart* /*view*/) { } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.h b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.h index 139ba20fa9..30ee4f4c04 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.h +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/QmitkThresholdAction.h @@ -1,57 +1,57 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKTHRESHOLDACTION_H #define QMITKTHRESHOLDACTION_H #include // Parent classes #include #include // Data members #include #include class MITK_QT_SEGMENTATION QmitkThresholdAction : public QObject, public mitk::IContextMenuAction { Q_OBJECT Q_INTERFACES(mitk::IContextMenuAction) public: QmitkThresholdAction(); ~QmitkThresholdAction(); // IContextMenuAction void Run(const QList &selectedNodes) override; void SetDataStorage(mitk::DataStorage *dataStorage) override; void SetSmoothed(bool smoothed) override; void SetDecimated(bool decimated) override; - void SetFunctionality(berry::QtViewPart *functionality) override; + void SetFunctionality(berry::QtViewPart* view) override; void OnThresholdingToolManagerToolModified(); private: QmitkThresholdAction(const QmitkThresholdAction &); QmitkThresholdAction & operator=(const QmitkThresholdAction &); mitk::DataNode::Pointer m_SelectedNode; mitk::DataStorage::Pointer m_DataStorage; mitk::ToolManager::Pointer m_ThresholdingToolManager; }; #endif diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp index 6f9634a0f2..68da1f47d0 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ContourModelToImage/QmitkContourModelToImageWidget.cpp @@ -1,230 +1,230 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkContourModelToImageWidget.h" #include "mitkImage.h" #include "../../Common/QmitkDataSelectionWidget.h" #include #include #include #include #include #include #include static const char* const HelpText = "Select a image and a contour(set)"; class QmitkContourModelToImageWidgetPrivate { public: QmitkContourModelToImageWidgetPrivate(); ~QmitkContourModelToImageWidgetPrivate(); /** @brief Check if selections is valid. */ void SelectionControl( unsigned int index, const mitk::DataNode* selection); /** @brief Enable buttons if data selction is valid. */ void EnableButtons(bool enable = true); /** @brief Does the actual contour filling */ mitk::Image::Pointer FillContourModelSetIntoImage(mitk::Image *image, mitk::ContourModelSet *contourSet, unsigned int timeStep); Ui::QmitkContourModelToImageWidgetControls m_Controls; QFutureWatcher m_Watcher; }; QmitkContourModelToImageWidgetPrivate::QmitkContourModelToImageWidgetPrivate() { } QmitkContourModelToImageWidgetPrivate::~QmitkContourModelToImageWidgetPrivate() { } void QmitkContourModelToImageWidgetPrivate::EnableButtons(bool enable) { m_Controls.btnProcess->setEnabled(enable); } void QmitkContourModelToImageWidgetPrivate::SelectionControl(unsigned int index, const mitk::DataNode* /*selection*/) { QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(index); dataSelectionWidget->SetHelpText(""); this->EnableButtons(); } mitk::Image::Pointer QmitkContourModelToImageWidgetPrivate::FillContourModelSetIntoImage(mitk::Image* image, mitk::ContourModelSet* contourSet, unsigned int timeStep) { // Use mitk::ContourModelSetToImageFilter to fill the ContourModelSet into the image mitk::ContourModelSetToImageFilter::Pointer contourFiller = mitk::ContourModelSetToImageFilter::New(); contourFiller->SetTimeStep(timeStep); contourFiller->SetImage(image); contourFiller->SetInput(contourSet); contourFiller->MakeOutputBinaryOn(); contourFiller->Update(); mitk::Image::Pointer result = contourFiller->GetOutput(); if (result.IsNull()) { MITK_ERROR<<"Could not write the selected contours into the image!"; } result->DisconnectPipeline(); return result; } void QmitkContourModelToImageWidget::OnSelectionChanged(unsigned int index, const mitk::DataNode* selection) { Q_D(QmitkContourModelToImageWidget); QmitkDataSelectionWidget* dataSelectionWidget = d->m_Controls.dataSelectionWidget; mitk::DataNode::Pointer node0 = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer node1 = dataSelectionWidget->GetSelection(1); if (node0.IsNull() || node1.IsNull() ) { d->EnableButtons(false); dataSelectionWidget->SetHelpText(HelpText); } else { d->SelectionControl(index, selection); } } void QmitkContourModelToImageWidget::OnProcessingFinished() { // Called when processing finished // Adding the result to the data storage Q_D(QmitkContourModelToImageWidget); // Adding the result to the data storage mitk::Image::Pointer result = d->m_Watcher.result(); if (result.IsNotNull()) { QmitkDataSelectionWidget* dataSelectionWidget = d->m_Controls.dataSelectionWidget; mitk::DataNode::Pointer imageNode = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer contourNode = dataSelectionWidget->GetSelection(1); mitk::DataNode::Pointer filled = mitk::DataNode::New(); std::stringstream stream; stream << imageNode->GetName(); stream << "_"; stream << contourNode->GetName(); filled->SetName(stream.str()); filled->SetData(result); dataSelectionWidget->GetDataStorage()->Add(filled, imageNode); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } else { MITK_ERROR<<"Error filling contours into an image!"; } d->EnableButtons(); } void QmitkContourModelToImageWidget::OnProcessPressed() { Q_D(QmitkContourModelToImageWidget); QmitkDataSelectionWidget* dataSelectionWidget = d->m_Controls.dataSelectionWidget; mitk::DataNode::Pointer imageNode = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer contourNode = dataSelectionWidget->GetSelection(1); // Check if data nodes are valid if(imageNode.IsNull() || contourNode.IsNull() ) { MITK_ERROR << "Selection does not contain valid data"; QMessageBox::information( this, "Contour To Image", "Selection does not contain valid data, please select a binary image and a contour(set)", QMessageBox::Ok ); d->m_Controls.btnProcess->setEnabled(false); return; } mitk::Image::Pointer image = static_cast(imageNode->GetData()); // Check if the image is valid if (image.IsNull()) { MITK_ERROR<<"Error writing contours into image! Invalid image data selected!"; return; } unsigned int timeStep = this->GetTimeNavigationController()->GetTime()->GetPos(); // Check if the selected contours are valid mitk::ContourModelSet::Pointer contourSet; mitk::ContourModel::Pointer contour = dynamic_cast(contourNode->GetData()); if (contour.IsNotNull()) { contourSet = mitk::ContourModelSet::New(); contourSet->AddContourModel(contour); } else { contourSet = static_cast(contourNode->GetData()); if (contourSet.IsNull()) { MITK_ERROR<<"Error writing contours into binary image! Invalid contour data selected!"; return; } } //Disable Buttons during calculation and initialize Progressbar d->EnableButtons(false); // Start the computation in a background thread QFuture< mitk::Image::Pointer > future = QtConcurrent::run(d, &QmitkContourModelToImageWidgetPrivate::FillContourModelSetIntoImage, image, contourSet, timeStep); d->m_Watcher.setFuture(future); } QmitkContourModelToImageWidget::QmitkContourModelToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent), d_ptr(new QmitkContourModelToImageWidgetPrivate()) { Q_D(QmitkContourModelToImageWidget); // Set up UI d->m_Controls.setupUi(this); d->m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::ImageAndSegmentationPredicate); d->m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::ContourModelPredicate); d->m_Controls.dataSelectionWidget->SetHelpText(HelpText); d->EnableButtons(false); // Create connections connect (d->m_Controls.btnProcess, SIGNAL(pressed()), this, SLOT(OnProcessPressed())); connect(d->m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); connect(&d->m_Watcher, SIGNAL(finished()), this, SLOT(OnProcessingFinished())); if( d->m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull() && d->m_Controls.dataSelectionWidget->GetSelection(1).IsNotNull() ) { - OnSelectionChanged( 0, d->m_Controls.dataSelectionWidget->GetSelection(0)); + OnSelectionChanged(0, d->m_Controls.dataSelectionWidget->GetSelection(0)); } } QmitkContourModelToImageWidget::~QmitkContourModelToImageWidget() { } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp index f2ca4eb75d..d707feba0b 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/ImageMasking/QmitkImageMaskingWidget.cpp @@ -1,302 +1,302 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkImageMaskingWidget.h" #include "mitkImage.h" #include "../../Common/QmitkDataSelectionWidget.h" #include #include #include #include #include #include #include #include static const char* const HelpText = "Select a regular image and a binary image"; QmitkImageMaskingWidget::QmitkImageMaskingWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent) { m_Controls.setupUi(this); m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::ImagePredicate); m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::SegmentationPredicate); m_Controls.dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); connect (m_Controls.rbMaskImage, SIGNAL(toggled(bool)), this, SLOT(OnImageMaskingToggled(bool))); connect (m_Controls.rbMaskSurface, SIGNAL(toggled(bool)), this, SLOT(OnSurfaceMaskingToggled(bool))); connect (m_Controls.btnMaskImage, SIGNAL(clicked()), this, SLOT(OnMaskImagePressed())); connect(m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); if( m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull() && m_Controls.dataSelectionWidget->GetSelection(1).IsNotNull() ) { - this->OnSelectionChanged( 0, m_Controls.dataSelectionWidget->GetSelection(0)); + this->OnSelectionChanged(0, m_Controls.dataSelectionWidget->GetSelection(0)); } } QmitkImageMaskingWidget::~QmitkImageMaskingWidget() { } void QmitkImageMaskingWidget::OnSelectionChanged(unsigned int index, const mitk::DataNode* selection) { QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; mitk::DataNode::Pointer node0 = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer node1 = dataSelectionWidget->GetSelection(1); if (node0.IsNull() || node1.IsNull() ) { if( m_Controls.rbMaskImage->isChecked() ) { dataSelectionWidget->SetHelpText(HelpText); } else { dataSelectionWidget->SetHelpText("Select a regular image and a surface"); } this->EnableButtons(false); } else { this->SelectionControl(index, selection); } } void QmitkImageMaskingWidget::SelectionControl(unsigned int index, const mitk::DataNode* selection) { QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; mitk::DataNode::Pointer node = dataSelectionWidget->GetSelection(index); //if Image-Masking is enabled, check if image-dimension of reference and binary image is identical if( m_Controls.rbMaskImage->isChecked() ) { if( dataSelectionWidget->GetSelection(0) == dataSelectionWidget->GetSelection(1) ) { dataSelectionWidget->SetHelpText("Select two different images above"); this->EnableButtons(false); return; } else if( node.IsNotNull() && selection ) { mitk::Image::Pointer referenceImage = dynamic_cast ( dataSelectionWidget->GetSelection(0)->GetData() ); mitk::Image::Pointer maskImage = dynamic_cast ( dataSelectionWidget->GetSelection(1)->GetData() ); if( maskImage.IsNull() || referenceImage->GetLargestPossibleRegion().GetSize() != maskImage->GetLargestPossibleRegion().GetSize() ) { dataSelectionWidget->SetHelpText("Different image sizes cannot be masked"); this->EnableButtons(false); return; } } else { dataSelectionWidget->SetHelpText(HelpText); return; } } dataSelectionWidget->SetHelpText(""); this->EnableButtons(); } void QmitkImageMaskingWidget::EnableButtons(bool enable) { m_Controls.btnMaskImage->setEnabled(enable); } void QmitkImageMaskingWidget::OnImageMaskingToggled(bool status) { if (status) { m_Controls.dataSelectionWidget->SetHelpText("Select a regular image and a binary image"); m_Controls.dataSelectionWidget->SetPredicate(1, QmitkDataSelectionWidget::SegmentationPredicate); } } void QmitkImageMaskingWidget::OnSurfaceMaskingToggled(bool status) { if (status) { m_Controls.dataSelectionWidget->SetHelpText("Select a regular image and a surface"); m_Controls.dataSelectionWidget->SetPredicate(1, QmitkDataSelectionWidget::SurfacePredicate); } } void QmitkImageMaskingWidget::OnMaskImagePressed() { //Disable Buttons during calculation and initialize Progressbar this->EnableButtons(false); mitk::ProgressBar::GetInstance()->AddStepsToDo(4); mitk::ProgressBar::GetInstance()->Progress(); QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; //create result image, get mask node and reference image mitk::Image::Pointer resultImage(nullptr); mitk::DataNode::Pointer maskingNode = dataSelectionWidget->GetSelection(1); mitk::Image::Pointer referenceImage = static_cast(dataSelectionWidget->GetSelection(0)->GetData()); if(referenceImage.IsNull() || maskingNode.IsNull() ) { MITK_ERROR << "Selection does not contain an image"; QMessageBox::information( this, "Image and Surface Masking", "Selection does not contain an image", QMessageBox::Ok ); m_Controls.btnMaskImage->setEnabled(true); return; } //Do Image-Masking if (m_Controls.rbMaskImage->isChecked()) { mitk::ProgressBar::GetInstance()->Progress(); mitk::Image::Pointer maskImage = dynamic_cast ( maskingNode->GetData() ); if(maskImage.IsNull() ) { MITK_ERROR << "Selection does not contain a binary image"; QMessageBox::information( this, "Image and Surface Masking", "Selection does not contain a binary image", QMessageBox::Ok ); this->EnableButtons(); return; } if( referenceImage->GetLargestPossibleRegion().GetSize() == maskImage->GetLargestPossibleRegion().GetSize() ) { resultImage = this->MaskImage( referenceImage, maskImage ); } } //Do Surface-Masking else { mitk::ProgressBar::GetInstance()->Progress(); //1. convert surface to image mitk::Surface::Pointer surface = dynamic_cast ( maskingNode->GetData() ); //TODO Get 3D Surface of current time step if(surface.IsNull()) { MITK_ERROR << "Selection does not contain a surface"; QMessageBox::information( this, "Image and Surface Masking", "Selection does not contain a surface", QMessageBox::Ok ); this->EnableButtons(); return; } mitk::Image::Pointer maskImage = this->ConvertSurfaceToImage( referenceImage, surface ); //2. mask reference image with mask image if(maskImage.IsNotNull() && referenceImage->GetLargestPossibleRegion().GetSize() == maskImage->GetLargestPossibleRegion().GetSize() ) { resultImage = this->MaskImage( referenceImage, maskImage ); } } mitk::ProgressBar::GetInstance()->Progress(); if( resultImage.IsNull() ) { MITK_ERROR << "Masking failed"; QMessageBox::information( this, "Image and Surface Masking", "Masking failed. For more information please see logging window.", QMessageBox::Ok ); this->EnableButtons(); mitk::ProgressBar::GetInstance()->Progress(4); return; } //Add result to data storage this->AddToDataStorage( dataSelectionWidget->GetDataStorage(), resultImage, dataSelectionWidget->GetSelection(0)->GetName() + "_" + dataSelectionWidget->GetSelection(1)->GetName(), dataSelectionWidget->GetSelection(0)); this->EnableButtons(); mitk::ProgressBar::GetInstance()->Progress(); } mitk::Image::Pointer QmitkImageMaskingWidget::MaskImage(mitk::Image::Pointer referenceImage, mitk::Image::Pointer maskImage ) { mitk::Image::Pointer resultImage(nullptr); mitk::MaskImageFilter::Pointer maskFilter = mitk::MaskImageFilter::New(); maskFilter->SetInput( referenceImage ); maskFilter->SetMask( maskImage ); maskFilter->OverrideOutsideValueOn(); maskFilter->SetOutsideValue( referenceImage->GetStatistics()->GetScalarValueMin() ); try { maskFilter->Update(); } catch(itk::ExceptionObject& excpt) { MITK_ERROR << excpt.GetDescription(); return nullptr; } resultImage = maskFilter->GetOutput(); return resultImage; } mitk::Image::Pointer QmitkImageMaskingWidget::ConvertSurfaceToImage( mitk::Image::Pointer image, mitk::Surface::Pointer surface ) { mitk::ProgressBar::GetInstance()->AddStepsToDo(2); mitk::ProgressBar::GetInstance()->Progress(); mitk::SurfaceToImageFilter::Pointer surfaceToImageFilter = mitk::SurfaceToImageFilter::New(); surfaceToImageFilter->MakeOutputBinaryOn(); surfaceToImageFilter->SetInput(surface); surfaceToImageFilter->SetImage(image); try { surfaceToImageFilter->Update(); } catch(itk::ExceptionObject& excpt) { MITK_ERROR << excpt.GetDescription(); return nullptr; } mitk::ProgressBar::GetInstance()->Progress(); mitk::Image::Pointer resultImage = mitk::Image::New(); resultImage = surfaceToImageFilter->GetOutput(); return resultImage; } void QmitkImageMaskingWidget::AddToDataStorage(mitk::DataStorage::Pointer dataStorage, mitk::Image::Pointer segmentation, const std::string& name, mitk::DataNode::Pointer parent ) { mitk::DataNode::Pointer dataNode = mitk::DataNode::New(); dataNode->SetName(name); dataNode->SetData(segmentation); dataStorage->Add(dataNode, parent); } diff --git a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp index 91aa429b58..693c70910d 100644 --- a/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation/src/internal/SegmentationUtilities/SurfaceToImage/QmitkSurfaceToImageWidget.cpp @@ -1,161 +1,161 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkSurfaceToImageWidget.h" #include #include #include #include #include #include #include #include #include static const char* const HelpText = "Select an image and a surface above"; QmitkSurfaceToImageWidget::QmitkSurfaceToImageWidget(mitk::SliceNavigationController* timeNavigationController, QWidget* parent) : QmitkSegmentationUtilityWidget(timeNavigationController, parent) { m_Controls.setupUi(this); m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::ImageAndSegmentationPredicate); m_Controls.dataSelectionWidget->AddDataStorageComboBox(QmitkDataSelectionWidget::SurfacePredicate); m_Controls.dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); connect (m_Controls.btnSurface2Image, SIGNAL(pressed()), this, SLOT(OnSurface2ImagePressed())); connect(m_Controls.dataSelectionWidget, SIGNAL(SelectionChanged(unsigned int, const mitk::DataNode*)), this, SLOT(OnSelectionChanged(unsigned int, const mitk::DataNode*))); if( m_Controls.dataSelectionWidget->GetSelection(0).IsNotNull() && m_Controls.dataSelectionWidget->GetSelection(1).IsNotNull() ) { - this->OnSelectionChanged( 0, m_Controls.dataSelectionWidget->GetSelection(0)); + this->OnSelectionChanged(0, m_Controls.dataSelectionWidget->GetSelection(0)); } } QmitkSurfaceToImageWidget::~QmitkSurfaceToImageWidget() { } void QmitkSurfaceToImageWidget::EnableButtons(bool enable) { m_Controls.btnSurface2Image->setEnabled(enable); } void QmitkSurfaceToImageWidget::OnSelectionChanged(unsigned int, const mitk::DataNode*) { QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; mitk::DataNode::Pointer imageNode = dataSelectionWidget->GetSelection(0); mitk::DataNode::Pointer surfaceNode = dataSelectionWidget->GetSelection(1); if (imageNode.IsNull() || surfaceNode.IsNull() ) { dataSelectionWidget->SetHelpText(HelpText); this->EnableButtons(false); } else { mitk::Image::Pointer image = dynamic_cast( dataSelectionWidget->GetSelection(0)->GetData() ); mitk::Surface::Pointer surface = dynamic_cast( dataSelectionWidget->GetSelection(1)->GetData() ); if( image->GetTimeSteps() != surface->GetTimeSteps() ) { dataSelectionWidget->SetHelpText("Image and surface are of different size"); this->EnableButtons(false); } else { dataSelectionWidget->SetHelpText(""); this->EnableButtons(); } } } void QmitkSurfaceToImageWidget::OnSurface2ImagePressed() { this->EnableButtons(false); QmitkDataSelectionWidget* dataSelectionWidget = m_Controls.dataSelectionWidget; mitk::Image::Pointer image = dynamic_cast( dataSelectionWidget->GetSelection(0)->GetData() ); mitk::Surface::Pointer surface = dynamic_cast( dataSelectionWidget->GetSelection(1)->GetData() ); if( image.IsNull() || surface.IsNull()) { MITK_ERROR << "Selection does not contain an image and/or a surface"; QMessageBox::information( this, "Surface To Image", "Selection does not contain an image and/or a surface", QMessageBox::Ok ); this->EnableButtons(); return; } mitk::Image::Pointer resultImage(nullptr); resultImage = this->ConvertSurfaceToImage( image, surface ); if( resultImage.IsNull() ) { MITK_ERROR << "Convert Surface to binary image failed"; QMessageBox::information( this, "Surface To Image", "Convert Surface to binary image failed", QMessageBox::Ok ); this->EnableButtons(); return; } //create name for result node std::string nameOfResultImage = dataSelectionWidget->GetSelection(0)->GetName(); nameOfResultImage.append("_"); nameOfResultImage.append(dataSelectionWidget->GetSelection(1)->GetName()); //create data node and add to data storage mitk::DataNode::Pointer resultNode = mitk::DataNode::New(); resultNode->SetData( resultImage ); resultNode->SetProperty("name", mitk::StringProperty::New(nameOfResultImage) ); // resultNode->SetProperty("binary", mitk::BoolProperty::New(true) ); dataSelectionWidget->GetDataStorage()->Add(resultNode, dataSelectionWidget->GetSelection(0)); this->EnableButtons(); } mitk::LabelSetImage::Pointer QmitkSurfaceToImageWidget::ConvertSurfaceToImage( mitk::Image::Pointer image, mitk::Surface::Pointer surface ) { mitk::ProgressBar::GetInstance()->AddStepsToDo(2); mitk::ProgressBar::GetInstance()->Progress(); mitk::SurfaceToImageFilter::Pointer surfaceToImageFilter = mitk::SurfaceToImageFilter::New(); surfaceToImageFilter->MakeOutputBinaryOn(); surfaceToImageFilter->SetInput(surface); surfaceToImageFilter->SetImage(image); try { surfaceToImageFilter->Update(); } catch(itk::ExceptionObject& excpt) { MITK_ERROR << excpt.GetDescription(); return nullptr; } mitk::ProgressBar::GetInstance()->Progress(); mitk::Image::Pointer resultImage = surfaceToImageFilter->GetOutput(); mitk::LabelSetImage::Pointer multilabelImage = mitk::LabelSetImage::New(); multilabelImage->InitializeByLabeledImage(resultImage); return multilabelImage; } diff --git a/Plugins/org.mitk.gui.qt.toftutorial/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.toftutorial/manifest_headers.cmake index 08ce034999..bbad6b940d 100644 --- a/Plugins/org.mitk.gui.qt.toftutorial/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.toftutorial/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK-ToF Tutorial") set(Plugin-Version "0.1") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "www.mitk.org/wiki/MITK-ToF") -set(Require-Plugin org.mitk.gui.qt.common.legacy) \ No newline at end of file +set(Require-Plugin org.mitk.gui.qt.common) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.cpp b/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.cpp index 367f5220f3..e8de66f7fd 100644 --- a/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.cpp +++ b/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.cpp @@ -1,195 +1,187 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkToFTutorialView.h" -#include "QmitkStdMultiWidget.h" // Qt #include // mitk includes #include // class holding the intrinsic parameters of the according camera #include // MITK-ToF related includes #include #include // configuration file holding e.g. plugin paths or path to test file directory #include // filter from module ToFProcessing that calculates a surface from the given range image #include // allows access to images provided by the ToF camera const std::string QmitkToFTutorialView::VIEW_ID = "org.mitk.views.toftutorial"; QmitkToFTutorialView::QmitkToFTutorialView() -: QmitkFunctionality() +: QmitkAbstractView() , m_Controls( 0 ) -, m_MultiWidget( NULL ) { } QmitkToFTutorialView::~QmitkToFTutorialView() { } void QmitkToFTutorialView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkToFTutorialViewControls; m_Controls->setupUi( parent ); connect( m_Controls->step1Button, SIGNAL(clicked()), this, SLOT(OnStep1()) ); connect( m_Controls->step2Button, SIGNAL(clicked()), this, SLOT(OnStep2()) ); } } - -void QmitkToFTutorialView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - -void QmitkToFTutorialView::StdMultiWidgetNotAvailable() +void QmitkToFTutorialView::SetFocus() { - m_MultiWidget = NULL; + m_Controls->step1Button->setFocus(); } void QmitkToFTutorialView::OnStep1() { // clean up data storage RemoveAllNodesFromDataStorage(); // Create an instance of ToFImageGrabber that holds a ToFCameraMITKPlayerDevice for playing ToF data mitk::ToFImageGrabber::Pointer tofImageGrabber = mitk::ToFImageGrabber::New(); tofImageGrabber->SetCameraDevice(mitk::ToFCameraMITKPlayerDevice::New()); // set paths to test data std::string distanceFileName = MITK_TOF_DATA_DIR; distanceFileName.append("/PMDCamCube2_MF0_IT0_20Images_DistanceImage.pic"); std::string amplitudeFileName = MITK_TOF_DATA_DIR; amplitudeFileName.append("/PMDCamCube2_MF0_IT0_20Images_AmplitudeImage.pic"); std::string intensityFileName = MITK_TOF_DATA_DIR; intensityFileName.append("/PMDCamCube2_MF0_IT0_20Images_IntensityImage.pic"); // set file name property in image grabber. This will be propagated to the corresponding device and controller class tofImageGrabber->SetProperty("DistanceImageFileName",mitk::StringProperty::New(distanceFileName)); tofImageGrabber->SetProperty("AmplitudeImageFileName",mitk::StringProperty::New(amplitudeFileName)); tofImageGrabber->SetProperty("IntensityImageFileName",mitk::StringProperty::New(intensityFileName)); // connect to device if (tofImageGrabber->ConnectCamera()) { //// start camera (internally starts thread that continuously grabs images from the camera) tofImageGrabber->StartCamera(); // update image grabber which itself represents the source of a MITK filter pipeline tofImageGrabber->Update(); // grab distance image mitk::Image::Pointer distanceImage = tofImageGrabber->GetOutput(); // grab amplitude image mitk::Image::Pointer amplitudeImage = tofImageGrabber->GetOutput(1); // grab intensity image mitk::Image::Pointer intensityImage = tofImageGrabber->GetOutput(2); //add distance image to data storage mitk::DataNode::Pointer distanceNode = mitk::DataNode::New(); distanceNode->SetName("Distance Image"); distanceNode->SetData(distanceImage); - this->GetDefaultDataStorage()->Add(distanceNode); + this->GetDataStorage()->Add(distanceNode); //add amplitude image to data storage mitk::DataNode::Pointer amplitudeNode = mitk::DataNode::New(); amplitudeNode->SetName("Amplitude Image"); amplitudeNode->SetData(amplitudeImage); - this->GetDefaultDataStorage()->Add(amplitudeNode); + this->GetDataStorage()->Add(amplitudeNode); //add intensity image to data storage mitk::DataNode::Pointer intensityNode = mitk::DataNode::New(); intensityNode->SetName("Intensity Image"); intensityNode->SetData(intensityImage); - this->GetDefaultDataStorage()->Add(intensityNode); + this->GetDataStorage()->Add(intensityNode); // stop camera (terminate internally used thread) tofImageGrabber->StopCamera(); //// disconnect from camera tofImageGrabber->DisconnectCamera(); // adjust views to new data in DataStorage mitk::RenderingManager::GetInstance()->InitializeViews(distanceImage->GetGeometry()); } else { MITK_ERROR<<"Connection to ToF camera could not be established"; } } void QmitkToFTutorialView::OnStep2() { // Check if distance image is available - mitk::DataNode::Pointer distanceNode = this->GetDefaultDataStorage()->GetNamedNode("Distance Image"); + mitk::DataNode::Pointer distanceNode = this->GetDataStorage()->GetNamedNode("Distance Image"); if (distanceNode.IsNotNull()) { // get distance image from node and check if node contains image mitk::Image::Pointer distanceImage = dynamic_cast(distanceNode->GetData()); if (distanceImage.IsNotNull()) { // create object of CameraIntrinsics that holds intrinsic parameters of the ToF camera mitk::CameraIntrinsics::Pointer cameraIntrinsics = mitk::CameraIntrinsics::New(); // set focal length in pixel cameraIntrinsics->SetFocalLength(295.8,296.1); // set principal point in pixel cameraIntrinsics->SetPrincipalPoint(113.2,97.1); // set up filter for surface calculation mitk::ToFDistanceImageToSurfaceFilter::Pointer surfaceFilter = mitk::ToFDistanceImageToSurfaceFilter::New(); // apply intrinsic parameters to filter surfaceFilter->SetCameraIntrinsics(cameraIntrinsics); // set distance between pixels on chip in mm (in this example squared pixel) mitk::ToFProcessingCommon::ToFPoint2D interPixelDistance; interPixelDistance[0] = 0.045; interPixelDistance[1] = 0.045; surfaceFilter->SetInterPixelDistance(interPixelDistance); // set distance image as input surfaceFilter->SetInput(distanceImage); // update the filter surfaceFilter->Update(); // get surface from filter mitk::Surface::Pointer surface = surfaceFilter->GetOutput(); // add surface to data storage mitk::DataNode::Pointer surfaceNode = mitk::DataNode::New(); surfaceNode->SetName("ToF surface"); surfaceNode->SetData(surface); - this->GetDefaultDataStorage()->Add(surfaceNode); + this->GetDataStorage()->Add(surfaceNode); // adjust views to new data in DataStorage mitk::RenderingManager::GetInstance()->InitializeViews(surface->GetGeometry()); mitk::RenderingManager::GetInstance()->InitializeViews(surface->GetGeometry()); } else { QMessageBox::warning(NULL,"ToF Tutorial","Node 'Distance Image' contains no image"); } } else { QMessageBox::warning(NULL,"ToF Tutorial","Perform Step 1 first to acquire a distance image"); } } void QmitkToFTutorialView::RemoveAllNodesFromDataStorage() { - mitk::DataStorage::SetOfObjects::ConstPointer allNodes = this->GetDefaultDataStorage()->GetAll(); - this->GetDefaultDataStorage()->Remove(allNodes); + mitk::DataStorage::SetOfObjects::ConstPointer allNodes = this->GetDataStorage()->GetAll(); + this->GetDataStorage()->Remove(allNodes); } diff --git a/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.h b/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.h index dc1cb3a999..6c0dec1a27 100644 --- a/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.h +++ b/Plugins/org.mitk.gui.qt.toftutorial/src/internal/QmitkToFTutorialView.h @@ -1,74 +1,71 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkToFTutorialView_h #define QmitkToFTutorialView_h #include -#include +#include #include "ui_QmitkToFTutorialViewControls.h" /*! \brief QmitkToFTutorialView is a tutorial showing the basic implementation techniques of MITK-ToF Step 1 shows how to acquire images from a tof camera Step 2 shows how to apply a processing filter to generate a surface from a range image - - \sa QmitkFunctionality - \ingroup Functionalities */ -class QmitkToFTutorialView : public QmitkFunctionality +class QmitkToFTutorialView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkToFTutorialView(); virtual ~QmitkToFTutorialView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: /// \brief Called when the user clicks the Step 1 button void OnStep1(); /// \brief Called when the user clicks the Step 2 button void OnStep2(); protected: void RemoveAllNodesFromDataStorage(); Ui::QmitkToFTutorialViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - }; #endif // _QMITKTOFTUTORIALVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFDeviceGeneration.h b/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFDeviceGeneration.h index ff5d80bbf6..72a0320b3b 100644 --- a/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFDeviceGeneration.h +++ b/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFDeviceGeneration.h @@ -1,68 +1,65 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkToFDeviceGeneration_h #define QmitkToFDeviceGeneration_h #include #include #include #include /*! \brief QmitkToFDeviceGeneration - - \sa QmitkFunctionality - \ingroup Functionalities */ class QmitkToFDeviceGeneration : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkToFDeviceGeneration(); ~QmitkToFDeviceGeneration(); void SetFocus() override; virtual void CreateQtPartControl(QWidget *parent) override; protected slots: /*! \brief Slot called when the "Create Device" button of the ConnectionWidget is pressed */ void OnToFCameraConnected(); protected: Ui::QmitkToFDeviceGenerationControls m_Controls; private: }; #endif // _QmitkToFDeviceGeneration_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.cpp b/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.cpp index c384eca2f2..cdc4325848 100644 --- a/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.cpp +++ b/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.cpp @@ -1,526 +1,525 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include #include // Qmitk #include "QmitkToFUtilView.h" -#include // Qt #include #include #include #include #include // MITK #include #include #include #include #include #include #include #include #include #include // VTK #include #include #include // ITK #include #include const std::string QmitkToFUtilView::VIEW_ID = "org.mitk.views.tofutil"; //Constructor QmitkToFUtilView::QmitkToFUtilView() : QmitkAbstractView() - , m_Controls(NULL), m_MultiWidget( NULL ) + , m_Controls(NULL), , m_MitkDistanceImage(NULL), m_MitkAmplitudeImage(NULL), m_MitkIntensityImage(NULL), m_Surface(NULL) , m_DistanceImageNode(NULL), m_AmplitudeImageNode(NULL), m_IntensityImageNode(NULL), m_RGBImageNode(NULL), m_SurfaceNode(NULL) , m_ToFImageRecorder(NULL), m_ToFImageGrabber(NULL), m_ToFDistanceImageToSurfaceFilter(NULL), m_ToFCompositeFilter(NULL) , m_2DDisplayCount(0) , m_RealTimeClock(NULL) , m_StepsForFramerate(100) , m_2DTimeBefore(0.0) , m_2DTimeAfter(0.0) , m_CameraIntrinsics(NULL) { this->m_Frametimer = new QTimer(this); this->m_ToFDistanceImageToSurfaceFilter = mitk::ToFDistanceImageToSurfaceFilter::New(); this->m_ToFCompositeFilter = mitk::ToFCompositeFilter::New(); this->m_ToFImageRecorder = mitk::ToFImageRecorder::New(); } //Destructor, specifically calling OnToFCameraStopped() and OnToFCammeraDiconnected() QmitkToFUtilView::~QmitkToFUtilView() { OnToFCameraStopped(); OnToFCameraDisconnected(); } //Createing the PartControl Signal-Slot principal void QmitkToFUtilView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkToFUtilViewControls; m_Controls->setupUi( parent ); //Looking for Input and Defining reaction connect(m_Frametimer, SIGNAL(timeout()), this, SLOT(OnUpdateCamera())); connect( (QObject*)(m_Controls->m_ToFConnectionWidget), SIGNAL(KinectAcquisitionModeChanged()), this, SLOT(OnKinectAcquisitionModeChanged()) ); // Todo in Widget2 connect( (QObject*)(m_Controls->m_ToFConnectionWidget), SIGNAL(ToFCameraConnected()), this, SLOT(OnToFCameraConnected()) ); connect( (QObject*)(m_Controls->m_ToFConnectionWidget), SIGNAL(ToFCameraDisconnected()), this, SLOT(OnToFCameraDisconnected()) ); connect( (QObject*)(m_Controls->m_ToFRecorderWidget), SIGNAL(ToFCameraStarted()), this, SLOT(OnToFCameraStarted()) ); connect( (QObject*)(m_Controls->m_ToFRecorderWidget), SIGNAL(ToFCameraStopped()), this, SLOT(OnToFCameraStopped()) ); connect( (QObject*)(m_Controls->m_ToFRecorderWidget), SIGNAL(RecordingStarted()), this, SLOT(OnToFCameraStopped()) ); connect( (QObject*)(m_Controls->m_ToFRecorderWidget), SIGNAL(RecordingStopped()), this, SLOT(OnToFCameraStarted()) ); } } //SetFocus-Method -> actually seting Focus to the Recorder void QmitkToFUtilView::SetFocus() { m_Controls->m_ToFRecorderWidget->setFocus(); } //Activated-Method->Generating RenderWindow void QmitkToFUtilView::Activated() { //get the current RenderWindowPart or open a new one if there is none - if(this->GetRenderWindowPart(OPEN)) + if (this->GetRenderWindowPart(OPEN)) { mitk::ILinkedRenderWindowPart* linkedRenderWindowPart = dynamic_cast(this->GetRenderWindowPart()); - if(linkedRenderWindowPart == 0) + if (linkedRenderWindowPart == 0) { - MITK_ERROR << "No linked StdMultiWidget avaiable!!!"; + MITK_ERROR << "No linked render window part avaiable!!!"; } else { linkedRenderWindowPart->EnableSlicingPlanes(false); } GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Axial); GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetSliceNavigationController()->SliceLockedOn(); GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Axial); GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()->SliceLockedOn(); GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Axial); GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()->SliceLockedOn(); mitk::RenderingManager::GetInstance()->InitializeViews(); this->UseToFVisibilitySettings(true); if (this->m_ToFCompositeFilter) { m_Controls->m_ToFCompositeFilterWidget->SetToFCompositeFilter(this->m_ToFCompositeFilter); } if (this->GetDataStorage()) { m_Controls->m_ToFCompositeFilterWidget->SetDataStorage(this->GetDataStorage()); } if (this->m_ToFImageGrabber.IsNull()) { m_Controls->m_ToFRecorderWidget->setEnabled(false); m_Controls->m_ToFVisualisationSettingsWidget->setEnabled(false); m_Controls->m_ToFCompositeFilterWidget->setEnabled(false); m_Controls->m_ToFMeasurementWidget->setEnabled(false); m_Controls->m_ToFSurfaceGenerationWidget->setEnabled(false); } } } //ZomnnieView-Method -> Resetting GUI to default. Why not just QmitkToFUtilView()?! void QmitkToFUtilView::ActivatedZombieView(berry::IWorkbenchPartReference::Pointer /*zombieView*/) { ResetGUIToDefault(); } void QmitkToFUtilView::Deactivated() { } void QmitkToFUtilView::Visible() { } //Reset of the ToFUtilView void QmitkToFUtilView::Hidden() { ResetGUIToDefault(); } void QmitkToFUtilView::OnToFCameraConnected() { MITK_DEBUG <<"OnToFCameraConnected"; this->m_2DDisplayCount = 0; this->m_ToFImageGrabber = m_Controls->m_ToFConnectionWidget->GetToFImageGrabber(); // initialize surface generation this->m_ToFDistanceImageToSurfaceFilter = mitk::ToFDistanceImageToSurfaceFilter::New(); // initialize ToFImageRecorder and ToFRecorderWidget this->m_ToFImageRecorder = mitk::ToFImageRecorder::New(); this->m_ToFImageRecorder->SetCameraDevice(this->m_ToFImageGrabber->GetCameraDevice()); m_Controls->m_ToFRecorderWidget->SetParameter(this->m_ToFImageGrabber, this->m_ToFImageRecorder); m_Controls->m_ToFRecorderWidget->setEnabled(true); m_Controls->m_ToFRecorderWidget->ResetGUIToInitial(); m_Controls->m_ToFVisualisationSettingsWidget->setEnabled(false); // initialize ToFCompositeFilterWidget this->m_ToFCompositeFilter = mitk::ToFCompositeFilter::New(); if (this->m_ToFCompositeFilter) { m_Controls->m_ToFCompositeFilterWidget->SetToFCompositeFilter(this->m_ToFCompositeFilter); } if (this->GetDataStorage()) { m_Controls->m_ToFCompositeFilterWidget->SetDataStorage(this->GetDataStorage()); } if ( this->GetRenderWindowPart() ) // initialize measurement widget m_Controls->m_ToFMeasurementWidget->InitializeWidget(this->GetRenderWindowPart()->GetQmitkRenderWindows(),this->GetDataStorage(), this->m_ToFDistanceImageToSurfaceFilter->GetCameraIntrinsics()); else - MITK_WARN << "No StdMultiWidget available!!! MeasurementWidget will not work."; + MITK_WARN << "No render window part available!!! MeasurementWidget will not work."; this->m_RealTimeClock = mitk::RealTimeClock::New(); this->m_2DTimeBefore = this->m_RealTimeClock->GetCurrentStamp(); this->RequestRenderWindowUpdate(); } void QmitkToFUtilView::ResetGUIToDefault() { if(this->GetRenderWindowPart()) { mitk::ILinkedRenderWindowPart* linkedRenderWindowPart = dynamic_cast(this->GetRenderWindowPart()); if(linkedRenderWindowPart == 0) { - MITK_ERROR << "No linked StdMultiWidget avaiable!!!"; + MITK_ERROR << "No linked render window part avaiable!!!"; } else { linkedRenderWindowPart->EnableSlicingPlanes(true); } GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Axial); GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetSliceNavigationController()->SliceLockedOff(); GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Sagittal); GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()->SliceLockedOff(); GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()->SetDefaultViewDirection(mitk::SliceNavigationController::Frontal); GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()->SliceLockedOff(); this->UseToFVisibilitySettings(false); //global reinit mitk::RenderingManager::GetInstance()->InitializeViews(); this->RequestRenderWindowUpdate(); } } void QmitkToFUtilView::OnToFCameraDisconnected() { this->GetDataStorage()->Remove(m_DistanceImageNode); if(m_RGBImageNode) this->GetDataStorage()->Remove(m_RGBImageNode); if(m_AmplitudeImageNode) this->GetDataStorage()->Remove(m_AmplitudeImageNode); if(m_IntensityImageNode) this->GetDataStorage()->Remove(m_IntensityImageNode); if(m_SurfaceNode) this->GetDataStorage()->Remove(m_SurfaceNode); m_Controls->m_ToFRecorderWidget->OnStop(); m_Controls->m_ToFRecorderWidget->setEnabled(false); m_Controls->m_ToFVisualisationSettingsWidget->setEnabled(false); m_Controls->m_ToFMeasurementWidget->setEnabled(false); m_Controls->m_ToFSurfaceGenerationWidget->setEnabled(false); //clean up measurement widget m_Controls->m_ToFMeasurementWidget->CleanUpWidget(); } void QmitkToFUtilView::OnKinectAcquisitionModeChanged() { if (m_ToFCompositeFilter.IsNotNull()&&m_ToFImageGrabber.IsNotNull()) { if (m_SelectedCamera.contains("Kinect")) { if (m_ToFImageGrabber->GetBoolProperty("RGB")) { this->m_RGBImageNode = ReplaceNodeData("RGB image",this->m_ToFImageGrabber->GetOutput(3)); this->m_ToFDistanceImageToSurfaceFilter->SetInput(3,this->m_ToFImageGrabber->GetOutput(3)); } else if (m_ToFImageGrabber->GetBoolProperty("IR")) { this->m_MitkAmplitudeImage = m_ToFCompositeFilter->GetOutput(1); this->m_AmplitudeImageNode = ReplaceNodeData("Amplitude image",m_MitkAmplitudeImage); } } this->UseToFVisibilitySettings(true); } } void QmitkToFUtilView::OnToFCameraStarted() { if (m_ToFImageGrabber.IsNotNull()) { // initialize camera intrinsics if (this->m_ToFImageGrabber->GetProperty("CameraIntrinsics")) { m_CameraIntrinsics = dynamic_cast(this->m_ToFImageGrabber->GetProperty("CameraIntrinsics"))->GetValue(); MITK_INFO << m_CameraIntrinsics->ToString(); } else { m_CameraIntrinsics = NULL; MITK_ERROR << "No camera intrinsics were found!"; } // set camera intrinsics if ( m_CameraIntrinsics.IsNotNull() ) { this->m_ToFDistanceImageToSurfaceFilter->SetCameraIntrinsics(m_CameraIntrinsics); } // initial update of image grabber this->m_ToFImageGrabber->Update(); bool hasRGBImage = false; m_ToFImageGrabber->GetCameraDevice()->GetBoolProperty("HasRGBImage",hasRGBImage); bool hasIntensityImage = false; m_ToFImageGrabber->GetCameraDevice()->GetBoolProperty("HasIntensityImage",hasIntensityImage); bool hasAmplitudeImage = false; m_ToFImageGrabber->GetCameraDevice()->GetBoolProperty("HasAmplitudeImage",hasAmplitudeImage); this->m_ToFCompositeFilter->SetInput(0,this->m_ToFImageGrabber->GetOutput(0)); if(hasAmplitudeImage) this->m_ToFCompositeFilter->SetInput(1,this->m_ToFImageGrabber->GetOutput(1)); if(hasIntensityImage) this->m_ToFCompositeFilter->SetInput(2,this->m_ToFImageGrabber->GetOutput(2)); // initial update of composite filter this->m_ToFCompositeFilter->Update(); this->m_MitkDistanceImage = m_ToFCompositeFilter->GetOutput(); this->m_DistanceImageNode = ReplaceNodeData("Distance image",m_MitkDistanceImage); std::string rgbFileName; m_ToFImageGrabber->GetCameraDevice()->GetStringProperty("RGBImageFileName",rgbFileName); if(hasRGBImage || (rgbFileName!="")) { if(m_ToFImageGrabber->GetBoolProperty("IR")) { this->m_MitkAmplitudeImage = m_ToFCompositeFilter->GetOutput(1); } else { this->m_RGBImageNode = ReplaceNodeData("RGB image",this->m_ToFImageGrabber->GetOutput(3)); } } else { this->m_RGBImageNode = NULL; } if(hasAmplitudeImage) { this->m_MitkAmplitudeImage = m_ToFCompositeFilter->GetOutput(1); this->m_AmplitudeImageNode = ReplaceNodeData("Amplitude image",m_MitkAmplitudeImage); } if(hasIntensityImage) { this->m_MitkIntensityImage = m_ToFCompositeFilter->GetOutput(2); this->m_IntensityImageNode = ReplaceNodeData("Intensity image",m_MitkIntensityImage); } this->m_ToFDistanceImageToSurfaceFilter->SetInput(0,m_MitkDistanceImage); this->m_ToFDistanceImageToSurfaceFilter->SetInput(1,m_MitkAmplitudeImage); this->m_ToFDistanceImageToSurfaceFilter->SetInput(2,m_MitkIntensityImage); this->UseToFVisibilitySettings(true); this->m_SurfaceNode = ReplaceNodeData("Surface", NULL); m_Controls->m_ToFCompositeFilterWidget->UpdateFilterParameter(); // initialize visualization widget m_Controls->m_ToFVisualisationSettingsWidget->Initialize(this->m_DistanceImageNode, this->m_AmplitudeImageNode, this->m_IntensityImageNode, this->m_SurfaceNode); m_Controls->m_ToFSurfaceGenerationWidget->Initialize(m_ToFDistanceImageToSurfaceFilter, m_ToFImageGrabber, m_CameraIntrinsics, m_SurfaceNode, GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderer()->GetVtkRenderer()->GetActiveCamera()); // set distance image to measurement widget m_Controls->m_ToFMeasurementWidget->SetDistanceImage(m_MitkDistanceImage); this->m_Frametimer->start(0); m_Controls->m_ToFVisualisationSettingsWidget->setEnabled(true); m_Controls->m_ToFCompositeFilterWidget->setEnabled(true); m_Controls->m_ToFMeasurementWidget->setEnabled(true); m_Controls->m_ToFSurfaceGenerationWidget->setEnabled(true); } } void QmitkToFUtilView::OnToFCameraStopped() { m_Controls->m_ToFVisualisationSettingsWidget->setEnabled(false); m_Controls->m_ToFCompositeFilterWidget->setEnabled(false); this->m_Frametimer->stop(); } void QmitkToFUtilView::OnUpdateCamera() { if(!m_Controls->m_ToFSurfaceGenerationWidget->UpdateSurface()) { // update pipeline this->m_MitkDistanceImage->Update(); } this->RequestRenderWindowUpdate(); this->m_2DDisplayCount++; if ((this->m_2DDisplayCount % this->m_StepsForFramerate) == 0) { this->m_2DTimeAfter = this->m_RealTimeClock->GetCurrentStamp() - this->m_2DTimeBefore; MITK_INFO << " 2D-Display-framerate (fps): " << this->m_StepsForFramerate / (this->m_2DTimeAfter/1000); this->m_2DTimeBefore = this->m_RealTimeClock->GetCurrentStamp(); } } void QmitkToFUtilView::OnChangeCoronalWindowOutput(int index) { this->OnToFCameraStopped(); if(index == 0) { if(this->m_IntensityImageNode.IsNotNull()) this->m_IntensityImageNode->SetVisibility(false); if(this->m_RGBImageNode.IsNotNull()) this->m_RGBImageNode->SetVisibility(true); } else if(index == 1) { if(this->m_IntensityImageNode.IsNotNull()) this->m_IntensityImageNode->SetVisibility(true); if(this->m_RGBImageNode.IsNotNull()) this->m_RGBImageNode->SetVisibility(false); } this->RequestRenderWindowUpdate(); this->OnToFCameraStarted(); } mitk::DataNode::Pointer QmitkToFUtilView::ReplaceNodeData( std::string nodeName, mitk::BaseData* data ) { mitk::DataNode::Pointer node = this->GetDataStorage()->GetNamedNode(nodeName); if (node.IsNull()) { node = mitk::DataNode::New(); node->SetName(nodeName); node->SetBoolProperty("binary",false); node->SetData(data); this->GetDataStorage()->Add(node); } else { node->SetData(data); } return node; } void QmitkToFUtilView::UseToFVisibilitySettings(bool useToF) { //We need this property for every node. mitk::RenderingModeProperty::Pointer renderingModePropertyForTransferFunction = mitk::RenderingModeProperty::New(mitk::RenderingModeProperty::COLORTRANSFERFUNCTION_COLOR); // set node properties if (m_DistanceImageNode.IsNotNull()) { this->m_DistanceImageNode->SetProperty( "visible" , mitk::BoolProperty::New( true )); this->m_DistanceImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetRenderWindow() ) ); this->m_DistanceImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetRenderWindow() ) ); this->m_DistanceImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderWindow() ) ); this->m_DistanceImageNode->SetProperty("Image Rendering.Mode", renderingModePropertyForTransferFunction); } if (m_AmplitudeImageNode.IsNotNull()) { this->m_AmplitudeImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetRenderWindow() ) ); this->m_AmplitudeImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetRenderWindow() ) ); this->m_AmplitudeImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderWindow() ) ); this->m_AmplitudeImageNode->SetProperty("Image Rendering.Mode", renderingModePropertyForTransferFunction); } if (m_IntensityImageNode.IsNotNull()) { this->m_IntensityImageNode->SetProperty( "visible" , mitk::BoolProperty::New( true )); this->m_IntensityImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetRenderWindow() ) ); this->m_IntensityImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetRenderWindow() ) ); this->m_IntensityImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderWindow() ) ); this->m_IntensityImageNode->SetProperty("Image Rendering.Mode", renderingModePropertyForTransferFunction); } if ((m_RGBImageNode.IsNotNull())) { this->m_RGBImageNode->SetProperty( "visible" , mitk::BoolProperty::New( true )); this->m_RGBImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetRenderWindow() ) ); this->m_RGBImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetRenderWindow() ) ); this->m_RGBImageNode->SetVisibility( !useToF, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderWindow() ) ); } // initialize images if (m_MitkDistanceImage.IsNotNull()) { mitk::RenderingManager::GetInstance()->InitializeViews( this->m_MitkDistanceImage->GetTimeGeometry(), mitk::RenderingManager::REQUEST_UPDATE_2DWINDOWS, true); } if(this->m_SurfaceNode.IsNotNull()) { QHash renderWindowHashMap = this->GetRenderWindowPart()->GetQmitkRenderWindows(); QHashIterator i(renderWindowHashMap); while (i.hasNext()){ i.next(); this->m_SurfaceNode->SetVisibility( false, mitk::BaseRenderer::GetInstance(i.value()->GetRenderWindow()) ); } this->m_SurfaceNode->SetVisibility( true, mitk::BaseRenderer::GetInstance(GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderWindow() ) ); } //disable/enable gradient background this->GetRenderWindowPart()->EnableDecorations(!useToF, QStringList(QString("background"))); if((this->m_RGBImageNode.IsNotNull())) { bool RGBImageHasDifferentResolution = false; m_ToFImageGrabber->GetCameraDevice()->GetBoolProperty("RGBImageHasDifferentResolution",RGBImageHasDifferentResolution); if(RGBImageHasDifferentResolution) { //update the display geometry by using the RBG image node. Only for renderwindow coronal mitk::RenderingManager::GetInstance()->InitializeView( GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetRenderWindow(), this->m_RGBImageNode->GetData()->GetGeometry() ); } } } diff --git a/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.h b/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.h index a129021934..914b629772 100644 --- a/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.h +++ b/Plugins/org.mitk.gui.qt.tofutil/src/internal/QmitkToFUtilView.h @@ -1,172 +1,167 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkToFUtilView_h #define QmitkToFUtilView_h #include #include #include #include class QTimer; #include #include #include #include #include #include #include #include /*! \brief QmitkToFUtilView Application that allows simple playing, recording, visualization, processing and measurement of Time-of-Flight (ToF) data. Currently the following features are implemented:
  • Connecting and showing ToF data from various cameras (PMD CamCube 2/3, PMD CamBoard, PMD O3, MESA SwissRanger)
  • Recording and playing of ToF data
  • Color coded visualization of ToF images
  • Preprocessing of the distance data: Threshold, median, average and bilateral filtering; surface generation
  • Simple measurement and PointSet definition
- - \sa QmitkFunctionality - \ingroup Functionalities */ class QmitkToFUtilView : public QmitkAbstractView, public mitk::IZombieViewPart { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkToFUtilView(); ~QmitkToFUtilView(); virtual void CreateQtPartControl(QWidget *parent) override; - /// \brief Called when the functionality is activated. + /// \brief Called when the view gets activated. virtual void Activated() override; - /// \brief Called when the functionality is deactivated. In this case the zombie view of this functionality becomes active! + /// \brief Called when the view gets deactivated. In this case the zombie view of this view becomes active! virtual void ActivatedZombieView(berry::IWorkbenchPartReference::Pointer zombieView) override; virtual void Deactivated() override; virtual void Visible() override; virtual void Hidden() override; void SetFocus() override; protected slots: /*! \brief Slot triggered from the timer to update the images and visualization */ void OnUpdateCamera(); /*! \brief Slot called when the "Connect" button of the ConnectionWidget is pressed */ void OnToFCameraConnected(); /*! \brief Slot called when the "Disconnect" button of the ConnectionWidget is pressed */ void OnToFCameraDisconnected(); /*! \brief Slot called when the "Start" button of the RecorderWidget is pressed */ void OnToFCameraStarted(); /*! \brief Slot called when the "Stop" button of the RecorderWidget is pressed */ void OnToFCameraStopped(); /*! \brief Slot invoked when user alters the coronal window input from RGB to Intensity or vice versa. */ void OnChangeCoronalWindowOutput(int index); /*! \brief Slot invoked when acquisition mode of Kinect is changed */ void OnKinectAcquisitionModeChanged(); protected: /*! \brief initialize the visibility settings of ToF data (images + surface) \param useToF true: distance image: widget1, amplitude image: widget 2, intensity image: widget 3; false: standard */ void UseToFVisibilitySettings(bool useToF); Ui::QmitkToFUtilViewControls* m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - QTimer* m_Frametimer; ///< Timer used to continuously update the images QString m_SelectedCamera; ///< String holding the selected camera mitk::Image::Pointer m_MitkDistanceImage; ///< member holding a pointer to the distance image of the selected camera mitk::Image::Pointer m_MitkAmplitudeImage; ///< member holding a pointer to the amplitude image of the selected camera mitk::Image::Pointer m_MitkIntensityImage; ///< member holding a pointer to the intensity image of the selected camera mitk::Surface::Pointer m_Surface; ///< member holding a pointer to the surface generated from the distance image of the selected camera mitk::DataNode::Pointer m_DistanceImageNode; ///< DataNode holding the distance image of the selected camera mitk::DataNode::Pointer m_AmplitudeImageNode; ///< DataNode holding the amplitude image of the selected camera mitk::DataNode::Pointer m_IntensityImageNode; ///< DataNode holding the intensity image of the selected camera mitk::DataNode::Pointer m_RGBImageNode; ///< DataNode holding the rgb image of the selected camera mitk::DataNode::Pointer m_SurfaceNode; ///< DataNode holding the surface generated from the distanc image of the selected camera // ToF processing and recording filter mitk::ToFImageRecorder::Pointer m_ToFImageRecorder; ///< ToF image recorder used for lossless recording of ToF image data mitk::ToFImageGrabber::Pointer m_ToFImageGrabber; ///< Source of a ToF image processing pipeline. Provides pointers to distance, amplitude and intensity image mitk::ToFDistanceImageToSurfaceFilter::Pointer m_ToFDistanceImageToSurfaceFilter; ///< Filter for calculating a surface representation from a given distance image mitk::ToFCompositeFilter::Pointer m_ToFCompositeFilter; ///< Filter combining several processing steps (thresholding, Median filtering, Bilateral filtering) int m_2DDisplayCount; ///< member used to determine whether frame rate output should be shown // members for calculating the frame rate mitk::RealTimeClock::Pointer m_RealTimeClock; ///< real time clock used to calculate the display framerate int m_StepsForFramerate; ///< number of steps used for calculating the display framerate double m_2DTimeBefore; ///< holds the time stamp at the beginning of the display framerate measurement double m_2DTimeAfter; ///< holds the time stamp at the end of the display framerate measurement mitk::CameraIntrinsics::Pointer m_CameraIntrinsics; ///< member holding the intrinsic parameters of the camera private: /*! \brief helper method to replace data of the specified node. If node does not exist it will be created \param nodeName Name of the node \param data Data object to be replaced \return returns the node */ mitk::DataNode::Pointer ReplaceNodeData(std::string nodeName, mitk::BaseData* data); void ProcessVideoTransform(); /*! \brief Reset all GUI related things to default. E.g. show sagittal and coronal slices in the renderwindows. */ void ResetGUIToDefault(); }; #endif // _QMITKTOFUTILVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.tubegraph/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.tubegraph/manifest_headers.cmake index 1c3bb7a787..011dcc7882 100644 --- a/Plugins/org.mitk.gui.qt.tubegraph/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.tubegraph/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK Tube Graph") set(Plugin-Version "1.0.0") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy) +set(Require-Plugin org.mitk.gui.qt.common) diff --git a/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.cpp b/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.cpp index 02f0e3fee1..b178b195e6 100644 --- a/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.cpp +++ b/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.cpp @@ -1,625 +1,624 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkTubeGraphView.h" #include "mitkDataStorage.h" #include "mitkRenderingManager.h" #include "mitkNodePredicateDataType.h" #include "usModuleRegistry.h" #include "QmitkTubeGraphLabelGroupWidget.h" #include "QmitkTubeGraphDeleteLabelGroupDialog.h" #include "QmitkTubeGraphNewLabelGroupDialog.h" #include "QmitkTubeGraphNewAnnotationDialog.h" const std::string QmitkTubeGraphView::VIEW_ID = "org.mitk.views.tubegraph"; QmitkTubeGraphView::QmitkTubeGraphView() :QmitkAbstractView(), m_ActiveTubeGraph(), m_ActiveProperty(), m_ActivationMode(mitk::TubeGraphDataInteractor::None) { } QmitkTubeGraphView::~QmitkTubeGraphView() { - delete m_Parent; //m_ActivationMode.mitk::TubeGraphDataInteractor::ActivationMode::~ActivationMode(); //remove observer //if (m_ActiveInteractor.IsNotNull()) //m_ActiveInteractor->RemoveObserver(m_InformationChangedObserverTag); } void QmitkTubeGraphView::SetFocus() { m_Controls.activeNodeGroupBox->setFocus(); } void QmitkTubeGraphView::CreateQtPartControl(QWidget *parent) { // create GUI widgets m_Parent = parent; m_Controls.setupUi(parent); this->CreateConnections(); } void QmitkTubeGraphView::NodeRemoved(const mitk::DataNode* /*node*/) { } void QmitkTubeGraphView::CreateConnections() { mitk::NodePredicateDataType::Pointer tubeGraphPred = mitk::NodePredicateDataType::New("TubeGraph"); m_Controls.activeGraphComboBox->SetDataStorage(this->GetDataStorage()); m_Controls.activeGraphComboBox->SetPredicate(tubeGraphPred); //activation mode connect( m_Controls.activeGraphComboBox, SIGNAL(currentIndexChanged (int)), this, SLOT(OnActiveGraphChanged(int)) ); connect( m_Controls.noneModeRadioButton, SIGNAL(clicked()), this, SLOT(OnActivationModeChanged())); connect( m_Controls.singleModeRadioButton, SIGNAL(clicked()), this, SLOT(OnActivationModeChanged())); connect( m_Controls.multipleModeRadioButton, SIGNAL(clicked()), this, SLOT(OnActivationModeChanged())); connect( m_Controls.peripheryModeRadioButton, SIGNAL(clicked()), this, SLOT(OnActivationModeChanged())); connect( m_Controls.rootModeRadioButton, SIGNAL(clicked()), this, SLOT(OnActivationModeChanged())); connect( m_Controls.pointModeRadioButton, SIGNAL(clicked()), this, SLOT(OnActivationModeChanged())); connect( m_Controls.setRootButton, SIGNAL(toggled(bool)), this, SLOT(OnSetRootToggled(bool))); //deselect tubes connect( m_Controls.deselectAllButton, SIGNAL(clicked()), this, SLOT(OnDeselectAllTubes())); // tab switch connect( m_Controls.tubeGraphTabWidget, SIGNAL(currentChanged(int)), this, SLOT(OnTabSwitched(int))); //attributation tab connect( m_Controls.addLabelGroupButton, SIGNAL(clicked()), this, SLOT(OnAddingLabelGroup())); connect( m_Controls.removeLabelGroupButton, SIGNAL(clicked()), this, SLOT(OnRemoveLabelGroup())); //annotation tab connect( m_Controls.addAnnotationButton, SIGNAL(clicked()), this, SLOT(OnAddingAnnotation())); connect( m_Controls.deleteAnnotationButton, SIGNAL(clicked()), this, SLOT(OnRemoveAnnotation())); //edit tab connect( m_Controls.editSelectionNewButton, SIGNAL(clicked()), this, SLOT(OnAddTubeBetweenSelection())); connect( m_Controls.editSelectionSeperateButton, SIGNAL(clicked()), this, SLOT(OnSeperateSelection())); connect( m_Controls.editSelectionDeleteButton, SIGNAL(clicked()), this, SLOT(OnDeleteSelection())); this->SetTabsEnable(false); } -void QmitkTubeGraphView::OnSelectionChanged( berry::IWorkbenchPart::Pointer /*source*/,const QList& nodes ) +void QmitkTubeGraphView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*source*/, const QList& nodes) { - foreach( mitk::DataNode::Pointer node, nodes ) + for (mitk::DataNode::Pointer node: nodes) { if( node.IsNotNull() && dynamic_cast< mitk::TubeGraph* >(node->GetData()) ) { m_Controls.activeGraphComboBox->SetSelectedNode(node); m_ActiveTubeGraph = dynamic_cast< mitk::TubeGraph* >(node->GetData()); m_ActiveProperty = dynamic_cast(m_ActiveTubeGraph->GetProperty( "Tube Graph.Visualization Information" ).GetPointer()); this->UpdateActiveTubeGraphInInteractors(); this->UpdateLabelGroups(); this->UpdateAnnotation(); } } } void QmitkTubeGraphView::OnActiveGraphChanged(int) { mitk::DataNode::Pointer selectedNode = m_Controls.activeGraphComboBox->GetSelectedNode(); if(selectedNode.IsNotNull()) { m_ActiveTubeGraph = dynamic_cast ( selectedNode->GetData() ); m_ActiveProperty = dynamic_cast(m_ActiveTubeGraph->GetProperty("Tube Graph.Visualization Information" ).GetPointer()); this->SetTabsEnable(true); this->UpdateGraphInformation(); } else { m_ActiveTubeGraph = NULL; m_ActiveProperty = NULL; this->SetTabsEnable(false); } this->UpdateActiveTubeGraphInInteractors(); this->UpdateLabelGroups(); this->UpdateAnnotation(); } void QmitkTubeGraphView::UpdateActiveTubeGraphInInteractors() { // // traverse all tube graphs and check, and add an interactor if needed... // mitk::NodePredicateDataType::Pointer tubeGraphPred = mitk::NodePredicateDataType::New("TubeGraph"); mitk::DataStorage::SetOfObjects::ConstPointer tubeGraphs = this->GetDataStorage()->GetSubset(tubeGraphPred); for(mitk::DataStorage::SetOfObjects::ConstIterator it = tubeGraphs->Begin(); it != tubeGraphs->End(); ++it) { mitk::DataNode::Pointer node = it.Value().GetPointer(); if ( node->GetDataInteractor().IsNull() ) { mitk::TubeGraphDataInteractor::Pointer tubeGraphInteractor = mitk::TubeGraphDataInteractor::New(); tubeGraphInteractor->LoadStateMachine("TubeGraphInteraction.xml", us::ModuleRegistry::GetModule("MitkTubeGraph")); tubeGraphInteractor->SetEventConfig("TubeGraphConfig.xml", us::ModuleRegistry::GetModule("MitkTubeGraph")); tubeGraphInteractor->SetActivationMode(m_ActivationMode); tubeGraphInteractor->SetDataNode(node); } } if (m_ActiveTubeGraph.IsNotNull()) { //remove old observer // if (m_ActiveInteractor.IsNotNull()) // m_ActiveInteractor->RemoveObserver(m_InformationChangedObserverTag); mitk::DataNode::Pointer node = m_Controls.activeGraphComboBox->GetSelectedNode(); //set active interactor to interactor from selected node m_ActiveInteractor = dynamic_cast(node->GetDataInteractor().GetPointer()); m_ActiveInteractor->SetActivationMode(m_ActivationMode); //add observer to activeInteractor typedef itk::SimpleMemberCommand< QmitkTubeGraphView > SimpleCommandType; SimpleCommandType::Pointer changeInformationCommand = SimpleCommandType::New(); changeInformationCommand->SetCallbackFunction(this, &QmitkTubeGraphView::SelectionInformationChanged); //m_InformationChangedObserverTag = m_ActiveInteractor->AddObserver(mitk::SelectionChangedTubeGraphEvent(), changeInformationCommand); ////Add selected node to all tube graph interactors as current node //mitk::TubeGraphDataInteractor::SetCurrentSelectedDataNode( node ); if (m_ActiveProperty.IsNull()) { mitk::TubeGraphProperty::Pointer newProperty = mitk::TubeGraphProperty::New(); m_ActiveTubeGraph->SetProperty("Tube Graph.Visualization Information",newProperty); m_ActiveProperty = newProperty; } } } void QmitkTubeGraphView::UpdateLabelGroups() { for(int i = m_Controls.toolBox->count()- 1; i >= 0 ; i--) m_Controls.toolBox->removeItem(i); if (m_ActiveProperty.IsNotNull()) { if(m_ActiveProperty->GetNumberOfLabelGroups()!= 0) { std::vector labelGroups = m_ActiveProperty->GetLabelGroups(); for (unsigned int k = 0; k < labelGroups.size(); k++) this->CreateLabelGroupWidget(labelGroups.at(k)); } } } void QmitkTubeGraphView::OnActivationModeChanged() { if (m_Controls.noneModeRadioButton->isChecked()) m_ActivationMode = mitk::TubeGraphDataInteractor::None; else if (m_Controls.singleModeRadioButton->isChecked()) m_ActivationMode = mitk::TubeGraphDataInteractor::Single; else if (m_Controls.multipleModeRadioButton->isChecked()) m_ActivationMode = mitk::TubeGraphDataInteractor::Multiple; else if (m_Controls.rootModeRadioButton->isChecked()) m_ActivationMode = mitk::TubeGraphDataInteractor::ToRoot; else if (m_Controls.peripheryModeRadioButton->isChecked()) m_ActivationMode = mitk::TubeGraphDataInteractor::ToPeriphery; else if (m_Controls.pointModeRadioButton->isChecked()) m_ActivationMode = mitk::TubeGraphDataInteractor::Points; else //normally not possible, but.... set to single mode m_ActivationMode = mitk::TubeGraphDataInteractor::Single; mitk::DataNode::Pointer node = m_Controls.activeGraphComboBox->GetSelectedNode(); if(node.IsNotNull() && m_ActiveProperty.IsNotNull()) { dynamic_cast< mitk::TubeGraphDataInteractor*>(node->GetDataInteractor().GetPointer())->SetActivationMode(m_ActivationMode); //m_ActiveTubeGraph->Modified(); // render new selection mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } } mitk::TubeGraphDataInteractor::ActivationMode QmitkTubeGraphView::GetActivationMode () { return m_ActivationMode; } void QmitkTubeGraphView::OnSetRootToggled(bool enable) { this->SetTabsEnable(!enable); if (m_ActiveTubeGraph.IsNotNull()) { mitk::DataNode::Pointer node = m_Controls.activeGraphComboBox->GetSelectedNode(); if(node.IsNotNull()) { if (enable) dynamic_cast(node->GetDataInteractor().GetPointer())->SetActionMode(mitk::TubeGraphDataInteractor::RootMode); else dynamic_cast(node->GetDataInteractor().GetPointer())->SetActionMode(mitk::TubeGraphDataInteractor::AttributationMode); } } } void QmitkTubeGraphView::OnDeselectAllTubes() { mitk::DataNode::Pointer node = m_Controls.activeGraphComboBox->GetSelectedNode(); if(node.IsNotNull()) dynamic_cast(node->GetDataInteractor().GetPointer())->ResetPickedTubes(); if (m_ActiveProperty.IsNull()) { MITK_ERROR << "Oho!No Property..mhhhh"; return; } m_ActiveProperty->DeactivateAllTubes(); m_ActiveTubeGraph->Modified(); // render new selection mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkTubeGraphView::OnTabSwitched(int tabIndex) { mitk::DataNode::Pointer node = m_Controls.activeGraphComboBox->GetSelectedNode(); if(node.IsNotNull()) { if (dynamic_cast(node->GetDataInteractor().GetPointer()) == 0) { this->UpdateActiveTubeGraphInInteractors(); /* if (dynamic_cast(node->GetDataInteractor().GetPointer()).IsNull());*/ return; } switch(tabIndex) { case 0: dynamic_cast(node->GetDataInteractor().GetPointer())->SetActionMode(mitk::TubeGraphDataInteractor::AttributationMode); m_Controls.noneModeRadioButton->setEnabled(true); m_Controls.singleModeRadioButton->setEnabled(true); m_Controls.multipleModeRadioButton->setEnabled(true); m_Controls.peripheryModeRadioButton->setEnabled(true); m_Controls.rootModeRadioButton->setEnabled(true); m_Controls.pointModeRadioButton->setEnabled(true); break; case 1: dynamic_cast(node->GetDataInteractor().GetPointer())->SetActionMode(mitk::TubeGraphDataInteractor::AnnotationMode); m_ActiveProperty->DeactivateAllTubes(); m_Controls.noneModeRadioButton->setEnabled(true); m_Controls.singleModeRadioButton->setEnabled(true); m_Controls.multipleModeRadioButton->setEnabled(false); m_Controls.peripheryModeRadioButton->setEnabled(false); m_Controls.rootModeRadioButton->setEnabled(false); m_Controls.pointModeRadioButton->setEnabled(false); break; case 2: dynamic_cast(node->GetDataInteractor().GetPointer())->SetActionMode(mitk::TubeGraphDataInteractor::EditMode); m_Controls.noneModeRadioButton->setEnabled(true); m_Controls.singleModeRadioButton->setEnabled(true); m_Controls.multipleModeRadioButton->setEnabled(true); m_Controls.peripheryModeRadioButton->setEnabled(true); m_Controls.rootModeRadioButton->setEnabled(true); m_Controls.pointModeRadioButton->setEnabled(true); break; case 3: dynamic_cast(node->GetDataInteractor().GetPointer())->SetActionMode(mitk::TubeGraphDataInteractor::InformationMode); m_Controls.noneModeRadioButton->setEnabled(false); m_Controls.singleModeRadioButton->setEnabled(false); m_Controls.multipleModeRadioButton->setEnabled(false); m_Controls.peripheryModeRadioButton->setEnabled(false); m_Controls.rootModeRadioButton->setEnabled(false); m_Controls.pointModeRadioButton->setEnabled(false); this->UpdateGraphInformation(); break; default: break; } } } void QmitkTubeGraphView::OnAddingLabelGroup() { QmitkTubeGraphNewLabelGroupDialog* dialog = new QmitkTubeGraphNewLabelGroupDialog( m_Parent ); int dialogReturnValue = dialog->exec(); LabelGroupType* newLabelGroup = dialog->GetLabelGroup(); delete dialog; if ( dialogReturnValue != QDialog::Rejected ) // user doesn't clicked cancel or pressed Esc or something similar { m_ActiveProperty->AddLabelGroup(newLabelGroup, m_ActiveProperty->GetNumberOfLabelGroups()); this->UpdateLabelGroups(); } } void QmitkTubeGraphView::CreateLabelGroupWidget(LabelGroupType* labelGroup) { QmitkTubeGraphLabelGroupWidget* labelGroupWidget = new QmitkTubeGraphLabelGroupWidget(m_Controls.toolBox, (labelGroup->labelGroupName).c_str()); for (std::vector::iterator it = labelGroup->labels.begin(); it != labelGroup->labels.end(); it++) { labelGroupWidget->AddLabel(QString::fromStdString((*it)->labelName), (*it)->labelColor); } m_Controls.toolBox->addItem(labelGroupWidget, QString::fromStdString(labelGroup->labelGroupName)); connect(labelGroupWidget, SIGNAL(SignalLabelVisibilityInGroupToggled(bool, QString, QString)), this, SLOT(OnLabelVisibilityChanged(bool, QString, QString))); connect(labelGroupWidget, SIGNAL(SignalLabelButtonInGroupClicked(QString, QString)), this, SLOT(OnLabelChanged(QString, QString))); connect(labelGroupWidget, SIGNAL(SignalLabelColorInGroupChanged(mitk::Color, QString, QString)), this, SLOT(OnLabelColorChanged(mitk::Color, QString, QString))); } void QmitkTubeGraphView::OnRemoveLabelGroup() { QStringList allLabelGroups; std::vector labelGroups = m_ActiveProperty->GetLabelGroups(); for (unsigned int i = 0; i < labelGroups.size(); i++) allLabelGroups.push_back(QString::fromStdString(labelGroups.at(i)->labelGroupName)); QmitkTubeGraphDeleteLabelGroupDialog* dialog = new QmitkTubeGraphDeleteLabelGroupDialog( m_Parent ); dialog->SetLabelGroups(allLabelGroups); int dialogReturnValue = dialog->exec(); QList toDeleteItemsList = dialog->GetSelectedLabelGroups(); delete dialog; if ( dialogReturnValue != QDialog::Rejected ) // user clicked cancel or pressed Esc or something similar { for (QList::iterator it = toDeleteItemsList.begin(); it != toDeleteItemsList.end(); it++ ) { std::string labelGroupName = (*it).toStdString(); LabelGroupType* labelGroup = m_ActiveProperty->GetLabelGroupByName(labelGroupName); m_ActiveProperty->RemoveLabelGroup(labelGroup); } this->UpdateLabelGroups(); } } void QmitkTubeGraphView::OnAddingAnnotation() { std::vector activeTubes = m_ActiveProperty->GetActiveTubes(); if (activeTubes.size()!= 0) { QmitkTubeGraphNewAnnotationDialog* dialog = new QmitkTubeGraphNewAnnotationDialog( m_Parent ); int dialogReturnValue = dialog->exec(); QString newAnnotationName = dialog->GetAnnotationName(); QString newDescription = dialog->GetAnnotationDescription(); QString tubeString = QString("[%1,%2]").arg(activeTubes.begin()->first).arg(activeTubes.begin()->second); delete dialog; if ( dialogReturnValue != QDialog::Rejected ) // user doesn't clicked cancel or pressed Esc or something similar { mitk::TubeGraphProperty::Annotation* annotation = new mitk::TubeGraphProperty::Annotation(); annotation->name = newAnnotationName.toStdString(); annotation->description = newDescription.toStdString(); annotation->tube = (*activeTubes.begin()); m_ActiveProperty->AddAnnotation(annotation); this->UpdateAnnotation(); } } else { MITK_INFO<< "No Tube select for annotation"; } } void QmitkTubeGraphView::UpdateAnnotation() { m_Controls.annotationsTableWidget->clear(); m_Controls.annotationsTableWidget->setRowCount(0); if (m_ActiveProperty.IsNotNull()) { std::vector annotations = m_ActiveProperty->GetAnnotations(); if (annotations.size() != 0) { for (unsigned int k = 0; k < annotations.size(); k++) { m_Controls.annotationsTableWidget->setRowCount(k+1); // add one row QTableWidgetItem* annotationNameItem = new QTableWidgetItem(QString::fromStdString(annotations[k]->name)); QTableWidgetItem* annotationDescriptionItem = new QTableWidgetItem(QString::fromStdString(annotations[k]->description)); QString tubeString = QString("[%1,%2]").arg(annotations[k]->tube.first).arg(annotations[k]->tube.second); QTableWidgetItem* annotationTubeItem = new QTableWidgetItem(tubeString); m_Controls.annotationsTableWidget->setItem(k, 0, annotationNameItem); m_Controls.annotationsTableWidget->setItem(k, 1, annotationDescriptionItem); m_Controls.annotationsTableWidget->setItem(k, 2, annotationTubeItem); } } } } void QmitkTubeGraphView::OnRemoveAnnotation() { //m_Controls.annotationsTableWidget->removeRow(m_Controls.annotationsTableWidget->currentRow()); int row = m_Controls.annotationsTableWidget->currentRow(); if (row >= 0) { std::string name = m_Controls.annotationsTableWidget->item(row, 0)->text().toStdString(); mitk::TubeGraphProperty::Annotation* annotation = m_ActiveProperty->GetAnnotationByName(name); m_ActiveProperty->RemoveAnnotation(annotation); this->UpdateAnnotation(); } } void QmitkTubeGraphView::OnAddTubeBetweenSelection() { } void QmitkTubeGraphView::OnSeperateSelection() { std::vector activeTubes = m_ActiveProperty->GetActiveTubes(); if (activeTubes.size()!= 0) { mitk::TubeGraph::Pointer subGraph = m_ActiveTubeGraph->CreateSubGraph(activeTubes); mitk::DataNode::Pointer originGraphNode = m_Controls.activeGraphComboBox->GetSelectedNode(); mitk::DataNode::Pointer newGraphNode = mitk::DataNode::New(); newGraphNode->SetData(subGraph); newGraphNode->SetName(originGraphNode->GetName() + "-SubGraph"); mitk::TubeGraphDataInteractor::Pointer tubeGraphInteractor = mitk::TubeGraphDataInteractor::New(); tubeGraphInteractor->LoadStateMachine("TubeGraphInteraction.xml", us::ModuleRegistry::GetModule("TubeGraph")); tubeGraphInteractor->SetEventConfig("TubeGraphConfig.xml", us::ModuleRegistry::GetModule("TubeGraph")); tubeGraphInteractor->SetDataNode(newGraphNode); mitk::TubeGraphProperty::Pointer newProperty = mitk::TubeGraphProperty::New(); subGraph->SetProperty("Tube Graph.Visualization Information",newProperty); this->GetDataStorage()->Add(newGraphNode, originGraphNode); } } void QmitkTubeGraphView::OnDeleteSelection() { //TODO Action for Interactor + undo/redo std::vector activeTubes = m_ActiveProperty->GetActiveTubes(); m_ActiveTubeGraph->RemoveSubGraph(m_ActiveProperty->GetActiveTubes()); } void QmitkTubeGraphView::OnLabelVisibilityChanged(bool isVisible, QString labelName, QString labelGroupName) { if (m_ActiveProperty.IsNull()) { MITK_ERROR << "Oho!No Property..mhhhh"; return; } LabelGroupType* labelGroup = m_ActiveProperty->GetLabelGroupByName(labelGroupName.toStdString()); LabelType* label = m_ActiveProperty->GetLabelByName(labelGroup, labelName.toStdString()); if(labelGroup == 0 || label == 0 ) { MITK_ERROR << "This label group or label doesn't exist!"; return; } m_ActiveProperty->SetLabelVisibility(label, isVisible); m_ActiveTubeGraph->Modified(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkTubeGraphView::OnLabelChanged(QString labelName, QString labelGroupName) { if (m_ActiveProperty.IsNull()) { MITK_ERROR << "Oho!No Property..mhhhh"; return; } LabelGroupType* labelGroup = m_ActiveProperty->GetLabelGroupByName(labelGroupName.toStdString()); LabelType* label = m_ActiveProperty->GetLabelByName(labelGroup, labelName.toStdString()); if(labelGroup == 0 || label == 0 ) { MITK_ERROR << "This label group or label doesn't exist!"; return; } m_ActiveProperty->SetLabelForActivatedTubes(labelGroup, label); m_ActiveTubeGraph->Modified(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkTubeGraphView::OnLabelColorChanged (mitk::Color color, QString labelName, QString labelGroupName) { if (m_ActiveProperty.IsNull()) { MITK_ERROR << "Oho!No Property..mhhhh"; return; } LabelGroupType* labelGroup = m_ActiveProperty->GetLabelGroupByName(labelGroupName.toStdString()); LabelType* label = m_ActiveProperty->GetLabelByName(labelGroup, labelName.toStdString()); if(labelGroup == 0 || label == 0 ) { MITK_ERROR << "This label group or label doesn't exist!"; return; } m_ActiveProperty->SetLabelColor(label, color); m_ActiveTubeGraph->Modified(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkTubeGraphView::SetTabsEnable(bool enable) { m_Controls.tubeGraphTabWidget->setTabEnabled(0, enable); //attributationTab m_Controls.tubeGraphTabWidget->setTabEnabled(1, enable);//annotationTab m_Controls.tubeGraphTabWidget->setTabEnabled(2, enable);//editTab m_Controls.tubeGraphTabWidget->setTabEnabled(3, enable);//informationTab } void QmitkTubeGraphView::UpdateGraphInformation() { mitk::TubeGraph::TubeDescriptorType root = m_ActiveTubeGraph->GetRootTube(); mitk::BaseGeometry::Pointer geometry = m_ActiveTubeGraph->GetGeometry(); mitk::Point3D origin = geometry->GetOrigin(); mitk::Vector3D spacing = geometry->GetSpacing(); QString information; information.append(QString("Number of Vertices: %1\n").arg(m_ActiveTubeGraph->GetNumberOfVertices())); information.append(QString("Number of Edges: %1\n").arg(m_ActiveTubeGraph->GetNumberOfEdges())); information.append(QString("Root Id: [%1,%2]\n\n").arg(root.first).arg(root.second)); information.append(QString("Origin: [%1,%2,%3]\n").arg(origin[0]).arg(origin[1]).arg(origin[2])); information.append(QString("Spacing: [%1,%2,%3]").arg(spacing[0]).arg(spacing[1]).arg(spacing[2])); m_Controls.informationLabel->setText(information); } void QmitkTubeGraphView::SelectionInformationChanged() { std::vector activeTubes = m_ActiveProperty->GetActiveTubes(); if(activeTubes.size()==0) m_Controls.shortInformationLabel->setText(""); else { mitk::TubeGraph::TubeDescriptorType root = m_ActiveTubeGraph->GetRootTube(); /*double averageDiameter; for (int i = 0; i < activeTubes.size(); i++) { mitk::TubeGraph::EdgeDescriptorType edgeDescriptor = m_ActiveTubeGraph->GetEdgeDescriptorByVerices(activeTubes.at(i).first, activeTubes.at(i).second); mitk::TubeGraphEdge edge = m_ActiveTubeGraph->GetEdge(edgeDescriptor); averageDiameter += edge.GetEdgeAverageDiameter(m_ActiveTubeGraph->GetVertex(activeTubes.at(i).first), m_ActiveTubeGraph->GetVertex(activeTubes.at(i).second)); } averageDiameter = averageDiameter/activeTubes.size();*/ QString information; information.append(QString("Number of Selected Tubes: %1\n").arg(activeTubes.size())); //information.append(QString("Average diameter\n").arg(averageDiameter)); information.append(QString("Root Id: [%1,%2]").arg(root.first).arg(root.second)); m_Controls.shortInformationLabel->setText(information); } } diff --git a/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.h b/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.h index 20bdf6c722..ab1c190062 100644 --- a/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.h +++ b/Plugins/org.mitk.gui.qt.tubegraph/src/internal/QmitkTubeGraphView.h @@ -1,127 +1,127 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKTUBEGRAPHVIEW_H_INCLUDED #define _QMITKTUBEGRAPHVIEW_H_INCLUDED #include "ui_QmitkTubeGraphViewControls.h" #include #include "mitkColorProperty.h" #include "mitkTubeGraph.h" #include "mitkTubeGraphProperty.h" #include "mitkTubeGraphDataInteractor.h" #include #include /*! * * \brief QmitkTubeGraphConverterView * */ class QmitkTubeGraphView: public QmitkAbstractView { // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT typedef mitk::TubeGraphProperty::LabelGroup LabelGroupType; typedef LabelGroupType::Label LabelType; public: static const std::string VIEW_ID; /** * @brief Constructor. **/ QmitkTubeGraphView(); /** * @brief Destructor. */ virtual ~QmitkTubeGraphView(); virtual void CreateQtPartControl(QWidget *parent) override; /** \brief Method to create the connections for the component. This Method is obligatory even if no connections is needed*/ virtual void CreateConnections(); protected slots: //active tube graph void OnActiveGraphChanged(int); //activation mode void OnActivationModeChanged(); void OnDeselectAllTubes(); void OnSetRootToggled(bool); void OnTabSwitched(int); //attributation tab void OnAddingLabelGroup(); void OnRemoveLabelGroup(); //annotation tab void OnAddingAnnotation(); void OnRemoveAnnotation(); //edit tab void OnAddTubeBetweenSelection(); void OnSeperateSelection(); void OnDeleteSelection(); //label group void OnLabelVisibilityChanged(bool, QString labelName, QString labelGroupName); void OnLabelChanged(QString labelName, QString labelGroupName); void OnLabelColorChanged(mitk::Color color, QString labelName, QString labelGroupName); protected: mitk::TubeGraphDataInteractor::ActivationMode GetActivationMode(); virtual void SetFocus() override; virtual void NodeRemoved(const mitk::DataNode*) override; /// \brief called by QmitkAbstractView when DataManager's selection has changed - virtual void OnSelectionChanged( berry::IWorkbenchPart::Pointer source,const QList& nodes ) override; + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer source,const QList& nodes) override; Ui::QmitkTubeGraphViewControls m_Controls; // the Qt parent of our GUI (NOT of this object) QWidget* m_Parent; private: void UpdateActiveTubeGraphInInteractors(); void CreateLabelGroupWidget(LabelGroupType* labelGroup); void InitializeLabelGroups(); void SetTabsEnable(bool enable); void UpdateLabelGroups(); void UpdateAnnotation(); void SelectionInformationChanged(); void UpdateGraphInformation(); mitk::TubeGraph::Pointer m_ActiveTubeGraph; mitk::TubeGraphProperty::Pointer m_ActiveProperty; mitk::TubeGraphDataInteractor::Pointer m_ActiveInteractor; mitk::TubeGraphDataInteractor::ActivationMode m_ActivationMode; /* std::vector m_LabelGroupName; std::vector m_LabelName;*/ unsigned int m_InformationChangedObserverTag; }; #endif//QMITK_TubeGraphView_H diff --git a/Plugins/org.mitk.gui.qt.ugvisualization/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.ugvisualization/manifest_headers.cmake index 0f09b22c2d..ddff09b506 100644 --- a/Plugins/org.mitk.gui.qt.ugvisualization/manifest_headers.cmake +++ b/Plugins/org.mitk.gui.qt.ugvisualization/manifest_headers.cmake @@ -1,5 +1,5 @@ set(Plugin-Name "MITK UG Visualization") set(Plugin-Version "0.1") set(Plugin-Vendor "DKFZ, Medical and Biological Informatics") set(Plugin-ContactAddress "http://www.mitk.org") -set(Require-Plugin org.mitk.gui.qt.common.legacy) +set(Require-Plugin org.mitk.gui.qt.common) diff --git a/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.cpp b/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.cpp index a866eeadf6..3df5eb295b 100644 --- a/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.cpp +++ b/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.cpp @@ -1,295 +1,287 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "QmitkUGVisualizationView.h" -#include "QmitkStdMultiWidget.h" #include #include #include #include #include #include #include #include class UGVisVolumeObserver : public mitk::PropertyView { public: UGVisVolumeObserver(mitk::BoolProperty* property, QmitkUGVisualizationView* view) : PropertyView(property), m_View(view), m_BoolProperty(property) { } protected: virtual void PropertyChanged() override { m_View->m_VolumeMode = m_BoolProperty->GetValue(); m_View->UpdateEnablement(); } virtual void PropertyRemoved() override { m_View->m_VolumeMode = false; m_Property = 0; m_BoolProperty = 0; } QmitkUGVisualizationView* m_View; mitk::BoolProperty* m_BoolProperty; }; const std::string QmitkUGVisualizationView::VIEW_ID = "org.mitk.views.ugvisualization"; QmitkUGVisualizationView::QmitkUGVisualizationView() -: QmitkFunctionality(), m_MultiWidget(0), m_Outline2DAction(0), m_Outline2DWidget(0), +: QmitkAbstractView(), m_Outline2DAction(0), m_Outline2DWidget(0), m_LODAction(0), m_ScalarVisibilityAction(0), m_ScalarVisibilityWidget(0), m_FirstVolumeRepId(-1), m_ShowTFGeneratorWidget(true), m_ShowScalarOpacityWidget(false), m_ShowColorWidget(true), m_ShowGradientOpacityWidget(false), m_ShowTFGeneratorAction(0), m_ShowScalarOpacityAction(0), m_ShowColorAction(0), m_ShowGradientOpacityAction(0), m_VolumeModeObserver(0) { } QmitkUGVisualizationView::~QmitkUGVisualizationView() { delete m_VolumeModeObserver; } void QmitkUGVisualizationView::CreateQtPartControl( QWidget *parent ) { m_Controls.setupUi( parent ); m_Outline2DWidget = new QmitkBoolPropertyWidget("Outline 2D polygons", parent); m_Outline2DAction = new QWidgetAction(this); m_Outline2DAction->setDefaultWidget(m_Outline2DWidget); m_LODAction = new QAction("Enable LOD (Level Of Detail)", this); m_LODAction->setCheckable(true); m_ScalarVisibilityWidget = new QmitkBoolPropertyWidget("Visualize scalars", parent); m_ScalarVisibilityAction = new QWidgetAction(this); m_ScalarVisibilityAction->setDefaultWidget(m_ScalarVisibilityWidget); m_ShowColorAction = new QAction("Show color transfer function", this); m_ShowColorAction->setCheckable(true); m_ShowColorAction->setChecked(m_ShowColorWidget); m_ShowGradientOpacityAction = new QAction("Show gradient opacity function", this); m_ShowGradientOpacityAction->setCheckable(true); m_ShowGradientOpacityAction->setChecked(m_ShowGradientOpacityWidget); m_ShowScalarOpacityAction = new QAction("Show scalar opacity function", this); m_ShowScalarOpacityAction->setCheckable(true); m_ShowScalarOpacityAction->setChecked(m_ShowScalarOpacityWidget); m_ShowTFGeneratorAction = new QAction("Show transfer function generator", this); m_ShowTFGeneratorAction->setCheckable(true); m_ShowTFGeneratorAction->setChecked(m_ShowTFGeneratorWidget); QMenu* menu = new QMenu(parent); menu->addAction(m_ScalarVisibilityAction); menu->addAction(m_Outline2DAction); //menu->addAction(m_LODAction); menu->addSeparator(); menu->addAction(m_ShowTFGeneratorAction); menu->addAction(m_ShowScalarOpacityAction); menu->addAction(m_ShowColorAction); menu->addAction(m_ShowGradientOpacityAction); m_Controls.m_OptionsButton->setMenu(menu); m_Controls.m_TransferFunctionWidget->SetScalarLabel("Scalar value"); // const mitk::EnumerationProperty::EnumStringsContainerType& scalarStrings = scalarProp->GetEnumStrings(); // for (mitk::EnumerationProperty::EnumStringsContainerType::const_iterator it = scalarStrings.begin(); // it != scalarStrings.end(); ++it) // { // MITK_INFO << "ADding: " << it->first; // m_Controls.m_ScalarModeComboBox->addItem(QString::fromStdString(it->first), it->second); // } this->UpdateGUI(); CreateConnections(); } void QmitkUGVisualizationView::CreateConnections() { connect(m_Controls.m_ScalarModeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateRenderWindow())); connect(m_Controls.m_RepresentationComboBox, SIGNAL(activated(int)), this, SLOT(UpdateRenderWindow())); connect(m_Outline2DWidget, SIGNAL(toggled(bool)), this, SLOT(UpdateRenderWindow())); connect(m_ScalarVisibilityWidget, SIGNAL(toggled(bool)), this, SLOT(UpdateRenderWindow())); connect(m_Controls.m_TransferFunctionGeneratorWidget, SIGNAL(SignalUpdateCanvas()), m_Controls.m_TransferFunctionWidget, SLOT(OnUpdateCanvas())); connect(m_ShowColorAction, SIGNAL(triggered(bool)), this, SLOT(ShowColorWidget(bool))); connect(m_ShowGradientOpacityAction, SIGNAL(triggered(bool)), this, SLOT(ShowGradientOpacityWidget(bool))); connect(m_ShowScalarOpacityAction, SIGNAL(triggered(bool)), this, SLOT(ShowScalarOpacityWidget(bool))); connect(m_ShowTFGeneratorAction, SIGNAL(triggered(bool)), this, SLOT(ShowTFGeneratorWidget(bool))); } +void ::SetFocus() +{ + m_Controls.m_OptionsButton->setFocus(); +} + void QmitkUGVisualizationView::UpdateRenderWindow() { mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkUGVisualizationView::ShowTFGeneratorWidget(bool show) { m_ShowTFGeneratorWidget = show; UpdateEnablement(); } void QmitkUGVisualizationView::ShowScalarOpacityWidget(bool show) { m_ShowScalarOpacityWidget = show; UpdateEnablement(); } void QmitkUGVisualizationView::ShowColorWidget(bool show) { m_ShowColorWidget = show; UpdateEnablement(); } void QmitkUGVisualizationView::ShowGradientOpacityWidget(bool show) { m_ShowGradientOpacityWidget = show; UpdateEnablement(); } void QmitkUGVisualizationView::UpdateEnablement() { m_Controls.m_TransferFunctionGeneratorWidget->setVisible(m_ShowTFGeneratorWidget); m_Controls.m_TransferFunctionWidget->ShowScalarOpacityFunction(m_ShowScalarOpacityWidget); m_Controls.m_TransferFunctionWidget->ShowColorFunction(m_ShowColorWidget); m_Controls.m_TransferFunctionWidget->ShowGradientOpacityFunction(m_ShowGradientOpacityWidget); m_Controls.m_TransferFunctionGeneratorWidget->SetThresholdTabEnabled(m_ScalarVisibilityWidget->isChecked()); m_Controls.m_TransferFunctionGeneratorWidget->SetBellTabEnabled(m_ScalarVisibilityWidget->isChecked()); m_Controls.m_TransferFunctionWidget->SetScalarOpacityFunctionEnabled(m_ScalarVisibilityWidget->isChecked()); m_Controls.m_TransferFunctionWidget->SetGradientOpacityFunctionEnabled(m_VolumeMode); } void QmitkUGVisualizationView::UpdateGUI() { bool enable = false; mitk::DataNode* node = 0; std::vector nodes = this->GetDataManagerSelection(); if (!nodes.empty()) { node = nodes.front(); if (node) { // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item mitk::BaseData* data = node->GetData(); if (data) { // test if this data item is an unstructured grid enable = dynamic_cast( data ); } } } m_Controls.m_SelectedLabel->setVisible(enable); m_Controls.m_ErrorLabel->setVisible(!enable); m_Controls.m_ContainerWidget->setEnabled(enable); m_Controls.m_OptionsButton->setEnabled(enable); if (enable) { m_VolumeMode = false; node->GetBoolProperty("volumerendering", m_VolumeMode); m_Controls.m_SelectedLabel->setText(QString("Selected UG: ") + node->GetName().c_str()); m_Controls.m_TransferFunctionGeneratorWidget->SetDataNode(node); m_Controls.m_TransferFunctionWidget->SetDataNode(node); mitk::BoolProperty* outlineProp = 0; node->GetProperty(outlineProp, "outline polygons"); m_Outline2DWidget->SetProperty(outlineProp); mitk::BoolProperty* scalarVisProp = 0; node->GetProperty(scalarVisProp, "scalar visibility"); m_ScalarVisibilityWidget->SetProperty(scalarVisProp); mitk::VtkScalarModeProperty* scalarProp = 0; if (node->GetProperty(scalarProp, "scalar mode")) { m_Controls.m_ScalarModeComboBox->SetProperty(scalarProp); } mitk::GridRepresentationProperty* gridRepProp = 0; mitk::GridVolumeMapperProperty* gridVolumeProp = 0; mitk::BoolProperty* volumeProp = 0; node->GetProperty(gridRepProp, "grid representation"); node->GetProperty(gridVolumeProp, "volumerendering.mapper"); node->GetProperty(volumeProp, "volumerendering"); m_Controls.m_RepresentationComboBox->SetProperty(gridRepProp, gridVolumeProp, volumeProp); if (m_VolumeModeObserver) { delete m_VolumeModeObserver; m_VolumeModeObserver = 0; } if (volumeProp) { m_VolumeModeObserver = new UGVisVolumeObserver(volumeProp, this); } } UpdateEnablement(); } -void QmitkUGVisualizationView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) -{ - m_MultiWidget = &stdMultiWidget; -} - - -void QmitkUGVisualizationView::StdMultiWidgetNotAvailable() -{ - m_MultiWidget = 0; -} - - -void QmitkUGVisualizationView::OnSelectionChanged( std::vector nodes ) +void QmitkUGVisualizationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& /*nodes*/) { UpdateGUI(); } diff --git a/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.h b/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.h index 11b2fa221c..49c10b54a3 100644 --- a/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.h +++ b/Plugins/org.mitk.gui.qt.ugvisualization/src/internal/QmitkUGVisualizationView.h @@ -1,116 +1,113 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkUGVisualizationView_h #define QmitkUGVisualizationView_h #include -#include +#include #include "ui_QmitkUGVisualizationViewControls.h" class QWidgetAction; class QmitkBoolPropertyWidget; namespace mitk { class PropertyObserver; } /*! \brief QmitkUGVisualizationView \warning This application module is not yet documented. Use "svn blame/praise/annotate" and ask the author to provide basic documentation. - - \sa QmitkFunctionality - \ingroup Functionalities */ -class QmitkUGVisualizationView : public QmitkFunctionality +class QmitkUGVisualizationView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkUGVisualizationView(); virtual ~QmitkUGVisualizationView(); virtual void CreateQtPartControl(QWidget *parent) override; - virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; - virtual void StdMultiWidgetNotAvailable() override; + /// + /// Sets the focus to an internal widget. + /// + virtual void SetFocus() override; protected slots: void UpdateRenderWindow(); void ShowTFGeneratorWidget(bool show); void ShowScalarOpacityWidget(bool show); void ShowColorWidget(bool show); void ShowGradientOpacityWidget(bool show); protected: - /// \brief called by QmitkFunctionality when DataManager's selection has changed - virtual void OnSelectionChanged( std::vector nodes ) override; + /// \brief called by QmitkAbstractView when DataManager's selection has changed + virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; void CreateConnections(); private: friend class UGVisVolumeObserver; void UpdateGUI(); void UpdateEnablement(); Ui::QmitkUGVisualizationViewControls m_Controls; - QmitkStdMultiWidget* m_MultiWidget; - QWidgetAction* m_Outline2DAction; QmitkBoolPropertyWidget* m_Outline2DWidget; QAction* m_LODAction; QWidgetAction* m_ScalarVisibilityAction; QmitkBoolPropertyWidget* m_ScalarVisibilityWidget; int m_FirstVolumeRepId; QHash m_MapRepComboToEnumId; bool m_VolumeMode; bool m_ShowTFGeneratorWidget; bool m_ShowScalarOpacityWidget; bool m_ShowColorWidget; bool m_ShowGradientOpacityWidget; QAction* m_ShowTFGeneratorAction; QAction* m_ShowScalarOpacityAction; QAction* m_ShowColorAction; QAction* m_ShowGradientOpacityAction; mitk::PropertyObserver* m_VolumeModeObserver; }; #endif // _QMITKUGVISUALIZATIONVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.h b/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.h index 7275eb4796..9e712a3f0c 100644 --- a/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.h +++ b/Plugins/org.mitk.gui.qt.ultrasound/src/internal/UltrasoundSupport.h @@ -1,150 +1,149 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef UltrasoundSupport_h #define UltrasoundSupport_h #include #include #include "ui_UltrasoundSupportControls.h" #include "QmitkUSAbstractCustomWidget.h" #include "QmitkUSControlsBModeWidget.h" #include "QmitkUSControlsDopplerWidget.h" #include "QmitkUSControlsProbesWidget.h" #include #include /*! \brief UltrasoundSupport This plugin provides functionality to manage Ultrasound devices, create video devices and to view device images. -\sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class UltrasoundSupport : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: virtual void SetFocus() override; static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent) override; UltrasoundSupport(); virtual ~UltrasoundSupport(); public slots: /* * \brief This is called when the newDeviceWidget is closed */ void OnNewDeviceWidgetDone(); protected slots: void OnClickedAddNewDevice(); void OnChangedFramerateLimit(); void OnClickedEditDevice(); /* *\brief Called, when the selection in the list of the active devices changes. */ void OnChangedActiveDevice(); void OnClickedFreezeButton(); void OnDeciveServiceEvent(const ctkServiceEvent event); /* * \brief This is the main imaging loop that updates the image and is called regularily during the imaging process */ void UpdateImage(); void RenderImage2d(); void RenderImage3d(); void StartTimers(); void StopTimers(); protected: void CreateControlWidgets(); void RemoveControlWidgets(); /** The device that is currently used to aquire images */ mitk::USDevice::Pointer m_Device; void SetTimerIntervals(int intervalPipeline, int interval2D, int interval3D); /** This timer triggers periodic updates to the pipeline */ QTimer* m_UpdateTimer; QTimer* m_RenderingTimer2d; QTimer* m_RenderingTimer3d; /** These clocks are used to compute the framerate in the methods DisplayImage(),RenderImage2d() and RenderImage3d(). */ QTime m_Clock; QTime m_Clock2d; QTime m_Clock3d; /** A counter to comute the framerate. */ int m_FrameCounterPipeline; int m_FrameCounter2d; int m_FrameCounter3d; int m_FPSPipeline, m_FPS2d, m_FPS3d; /** Stores the properties of some QWidgets (and the tool storage file name) to QSettings.*/ void StoreUISettings(); /** Loads the properties of some QWidgets (and the tool storage file name) from QSettings.*/ void LoadUISettings(); /** The node that we feed images into.*/ mitk::DataNode::Pointer m_Node; /** The image that is hold by the node above.*/ mitk::Image::Pointer m_Image; /** The old geometry of m_Image. It is needed to check if the geometry changed (e.g. because * the zoom factor was modified) and the image needs to be reinitialized. */ mitk::SlicedGeometry3D::Pointer m_OldGeometry; Ui::UltrasoundSupportControls m_Controls; QmitkUSAbstractCustomWidget* m_ControlCustomWidget; QmitkUSControlsBModeWidget* m_ControlBModeWidget; QmitkUSControlsDopplerWidget* m_ControlDopplerWidget; QmitkUSControlsProbesWidget* m_ControlProbesWidget; QList m_CustomWidgetServiceReference; bool m_ImageAlreadySetToNode; unsigned int m_CurrentImageWidth; unsigned int m_CurrentImageHeight; double m_CurrentDynamicRange; }; #endif // UltrasoundSupport_h diff --git a/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationView.cpp b/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationView.cpp index b2e4641fb1..96e62cb4ee 100755 --- a/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationView.cpp +++ b/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationView.cpp @@ -1,350 +1,350 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkVolumeVisualizationView.h" #include #include #include #include #include //#include #include #include #include #include #include #include #include "mitkHistogramGenerator.h" #include "QmitkPiecewiseFunctionCanvas.h" #include "QmitkColorTransferFunctionCanvas.h" #include "mitkBaseRenderer.h" #include "mitkVtkVolumeRenderingProperty.h" #include #include const std::string QmitkVolumeVisualizationView::VIEW_ID = "org.mitk.views.volumevisualization"; enum RenderMode { RM_CPU_COMPOSITE_RAYCAST = 0, RM_CPU_MIP_RAYCAST = 1, RM_GPU_COMPOSITE_SLICING = 2, RM_GPU_COMPOSITE_RAYCAST = 3, RM_GPU_MIP_RAYCAST = 4 }; QmitkVolumeVisualizationView::QmitkVolumeVisualizationView() : QmitkAbstractView(), m_Controls(NULL) { } QmitkVolumeVisualizationView::~QmitkVolumeVisualizationView() { } void QmitkVolumeVisualizationView::CreateQtPartControl(QWidget* parent) { if (!m_Controls) { m_Controls = new Ui::QmitkVolumeVisualizationViewControls; m_Controls->setupUi(parent); // Fill the tf presets in the generator widget std::vector names; mitk::TransferFunctionInitializer::GetPresetNames(names); for (std::vector::const_iterator it = names.begin(); it != names.end(); ++it) { m_Controls->m_TransferFunctionGeneratorWidget->AddPreset(QString::fromStdString(*it)); } m_Controls->m_RenderMode->addItem("CPU raycast"); m_Controls->m_RenderMode->addItem("CPU MIP raycast"); m_Controls->m_RenderMode->addItem("GPU slicing"); // Only with VTK 5.6 or above #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) m_Controls->m_RenderMode->addItem("GPU raycast"); m_Controls->m_RenderMode->addItem("GPU MIP raycast"); #endif connect( m_Controls->m_EnableRenderingCB, SIGNAL( toggled(bool) ),this, SLOT( OnEnableRendering(bool) )); connect( m_Controls->m_EnableLOD, SIGNAL( toggled(bool) ),this, SLOT( OnEnableLOD(bool) )); connect( m_Controls->m_RenderMode, SIGNAL( activated(int) ),this, SLOT( OnRenderMode(int) )); connect( m_Controls->m_TransferFunctionGeneratorWidget, SIGNAL( SignalUpdateCanvas( ) ), m_Controls->m_TransferFunctionWidget, SLOT( OnUpdateCanvas( ) ) ); connect( m_Controls->m_TransferFunctionGeneratorWidget, SIGNAL(SignalTransferFunctionModeChanged(int)), SLOT(OnMitkInternalPreset(int))); m_Controls->m_EnableRenderingCB->setEnabled(false); m_Controls->m_EnableLOD->setEnabled(false); m_Controls->m_RenderMode->setEnabled(false); m_Controls->m_TransferFunctionWidget->setEnabled(false); m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(false); m_Controls->m_SelectedImageLabel->hide(); m_Controls->m_ErrorImageLabel->hide(); } } void QmitkVolumeVisualizationView::OnMitkInternalPreset( int mode ) { if (m_SelectedNode.IsNull()) return; mitk::DataNode::Pointer node(m_SelectedNode.GetPointer()); mitk::TransferFunctionProperty::Pointer transferFuncProp; if (node->GetProperty(transferFuncProp, "TransferFunction")) { //first item is only information if( --mode == -1 ) return; // -- Creat new TransferFunction mitk::TransferFunctionInitializer::Pointer tfInit = mitk::TransferFunctionInitializer::New(transferFuncProp->GetValue()); tfInit->SetTransferFunctionMode(mode); RequestRenderWindowUpdate(); m_Controls->m_TransferFunctionWidget->OnUpdateCanvas(); } } void QmitkVolumeVisualizationView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { bool weHadAnImageButItsNotThreeDeeOrFourDee = false; mitk::DataNode::Pointer node; - foreach (mitk::DataNode::Pointer currentNode, nodes) + for (mitk::DataNode::Pointer currentNode: nodes) { if( currentNode.IsNotNull() && dynamic_cast(currentNode->GetData()) ) { if( dynamic_cast(currentNode->GetData())->GetDimension()>=3 ) { if (node.IsNull()) { node = currentNode; } } else { weHadAnImageButItsNotThreeDeeOrFourDee = true; } } } if( node.IsNotNull() ) { m_Controls->m_NoSelectedImageLabel->hide(); m_Controls->m_ErrorImageLabel->hide(); m_Controls->m_SelectedImageLabel->show(); std::string infoText; if (node->GetName().empty()) infoText = std::string("Selected Image: [currently selected image has no name]"); else infoText = std::string("Selected Image: ") + node->GetName(); m_Controls->m_SelectedImageLabel->setText( QString( infoText.c_str() ) ); m_SelectedNode = node; } else { if(weHadAnImageButItsNotThreeDeeOrFourDee) { m_Controls->m_NoSelectedImageLabel->hide(); m_Controls->m_ErrorImageLabel->show(); std::string infoText; infoText = std::string("only 3D or 4D images are supported"); m_Controls->m_ErrorImageLabel->setText( QString( infoText.c_str() ) ); } else { m_Controls->m_SelectedImageLabel->hide(); m_Controls->m_ErrorImageLabel->hide(); m_Controls->m_NoSelectedImageLabel->show(); } m_SelectedNode = 0; } UpdateInterface(); } void QmitkVolumeVisualizationView::UpdateInterface() { if(m_SelectedNode.IsNull()) { // turnoff all m_Controls->m_EnableRenderingCB->setChecked(false); m_Controls->m_EnableRenderingCB->setEnabled(false); m_Controls->m_EnableLOD->setChecked(false); m_Controls->m_EnableLOD->setEnabled(false); m_Controls->m_RenderMode->setCurrentIndex(0); m_Controls->m_RenderMode->setEnabled(false); m_Controls->m_TransferFunctionWidget->SetDataNode(0); m_Controls->m_TransferFunctionWidget->setEnabled(false); m_Controls->m_TransferFunctionGeneratorWidget->SetDataNode(0); m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(false); return; } bool enabled = false; m_SelectedNode->GetBoolProperty("volumerendering",enabled); m_Controls->m_EnableRenderingCB->setEnabled(true); m_Controls->m_EnableRenderingCB->setChecked(enabled); if(!enabled) { // turnoff all except volumerendering checkbox m_Controls->m_EnableLOD->setChecked(false); m_Controls->m_EnableLOD->setEnabled(false); m_Controls->m_RenderMode->setCurrentIndex(0); m_Controls->m_RenderMode->setEnabled(false); m_Controls->m_TransferFunctionWidget->SetDataNode(0); m_Controls->m_TransferFunctionWidget->setEnabled(false); m_Controls->m_TransferFunctionGeneratorWidget->SetDataNode(0); m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(false); return; } // otherwise we can activate em all enabled = false; m_SelectedNode->GetBoolProperty("volumerendering.uselod",enabled); m_Controls->m_EnableLOD->setEnabled(true); m_Controls->m_EnableLOD->setChecked(enabled); m_Controls->m_RenderMode->setEnabled(true); // Determine Combo Box mode { bool usegpu=false; bool useray=false; bool usemip=false; m_SelectedNode->GetBoolProperty("volumerendering.usegpu",usegpu); // Only with VTK 5.6 or above #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) m_SelectedNode->GetBoolProperty("volumerendering.useray",useray); #endif m_SelectedNode->GetBoolProperty("volumerendering.usemip",usemip); int mode = 0; if(useray) { if(usemip) mode=RM_GPU_MIP_RAYCAST; else mode=RM_GPU_COMPOSITE_RAYCAST; } else if(usegpu) mode=RM_GPU_COMPOSITE_SLICING; else { if(usemip) mode=RM_CPU_MIP_RAYCAST; else mode=RM_CPU_COMPOSITE_RAYCAST; } m_Controls->m_RenderMode->setCurrentIndex(mode); } m_Controls->m_TransferFunctionWidget->SetDataNode(m_SelectedNode); m_Controls->m_TransferFunctionWidget->setEnabled(true); m_Controls->m_TransferFunctionGeneratorWidget->SetDataNode(m_SelectedNode); m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(true); } void QmitkVolumeVisualizationView::OnEnableRendering(bool state) { if(m_SelectedNode.IsNull()) return; m_SelectedNode->SetProperty("volumerendering",mitk::BoolProperty::New(state)); UpdateInterface(); RequestRenderWindowUpdate(); } void QmitkVolumeVisualizationView::OnEnableLOD(bool state) { if(m_SelectedNode.IsNull()) return; m_SelectedNode->SetProperty("volumerendering.uselod",mitk::BoolProperty::New(state)); RequestRenderWindowUpdate(); } void QmitkVolumeVisualizationView::OnRenderMode(int mode) { if(m_SelectedNode.IsNull()) return; bool usegpu=mode==RM_GPU_COMPOSITE_SLICING; // Only with VTK 5.6 or above #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) bool useray=(mode==RM_GPU_COMPOSITE_RAYCAST)||(mode==RM_GPU_MIP_RAYCAST); #endif bool usemip=(mode==RM_GPU_MIP_RAYCAST)||(mode==RM_CPU_MIP_RAYCAST); m_SelectedNode->SetProperty("volumerendering.usegpu",mitk::BoolProperty::New(usegpu)); // Only with VTK 5.6 or above #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) )) m_SelectedNode->SetProperty("volumerendering.useray",mitk::BoolProperty::New(useray)); #endif m_SelectedNode->SetProperty("volumerendering.usemip",mitk::BoolProperty::New(usemip)); RequestRenderWindowUpdate(); } void QmitkVolumeVisualizationView::SetFocus() { } void QmitkVolumeVisualizationView::NodeRemoved(const mitk::DataNode* node) { if(m_SelectedNode == node) { m_SelectedNode=0; m_Controls->m_SelectedImageLabel->hide(); m_Controls->m_ErrorImageLabel->hide(); m_Controls->m_NoSelectedImageLabel->show(); UpdateInterface(); } } diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.h index 5a6f111790..d2c95e0c23 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.h +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatEditor.h @@ -1,127 +1,126 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKXNATEDITOR_h #define QMITKXNATEDITOR_h #include #include #include #include #include #include "ui_QmitkXnatEditorControls.h" #include "ctkXnatListModel.h" #include "ctkXnatSession.h" #include #include "mitkXnatSessionTracker.h" /*! \brief QmitkXnatEditor \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. -\sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkXnatEditor : public berry::QtEditorPart, public berry::IReusableEditor { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: berryObjectMacro(QmitkXnatEditor) QmitkXnatEditor(); ~QmitkXnatEditor(); static const QString EDITOR_ID; void CreateQtPartControl(QWidget *parent) override; void DoSave(/*IProgressMonitor monitor*/) override; void DoSaveAs() override; void Init(berry::IEditorSite::Pointer site, berry::IEditorInput::Pointer input) override; bool IsDirty() const override; bool IsSaveAsAllowed() const override; void SetInput(berry::IEditorInput::Pointer input) override; /** \brief Here the root object will be set and the view reset. Additionally the breadcrumbs will set visible. */ void UpdateList(); protected slots: /** \brief Any XNAT resource (file or folder) will be downloaded to the chosen download path. */ void DownloadResource(); /** \brief Every time you activate a node in the list, the root item will be updated to a child of the previous parent.\ In exception of the node is a file. The file will be downloaded and loaded to the DataManager. */ void OnObjectActivated(const QModelIndex& index); // Breadcrumb button slots void OnDataModelButtonClicked(); void OnProjectButtonClicked(); void OnSubjectButtonClicked(); void OnExperimentButtonClicked(); void OnKindOfDataButtonClicked(); void OnSessionButtonClicked(); void OnResourceButtonClicked(); /// \brief Updates the ctkXnatSession and the user interface void UpdateSession(ctkXnatSession* session); void CleanListModel(ctkXnatSession* session); void itemSelected(const QModelIndex &index); protected: virtual void SetFocus() override; Ui::QmitkXnatEditorControls m_Controls; private: int m_ParentCount; QString m_DownloadPath; ctkServiceTracker m_DataStorageServiceTracker; void InternalFileDownload(const QModelIndex& index); int ParentChecker(ctkXnatObject* child); void ToHigherLevel(); ctkXnatListModel* m_ListModel; ctkXnatSession* m_Session; mitk::XnatSessionTracker* m_Tracker; QScopedPointer m_SelectionListener; void SelectionChanged(const berry::IWorkbenchPart::Pointer& sourcepart, const berry::ISelection::ConstPointer& selection); }; #endif // QMITKXNATEDITOR_h diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.h index ae73e28a44..e80a23068a 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.h +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatSimpleSearchView.h @@ -1,85 +1,84 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKXNATSIMPLESEARCHVIEW_H #define QMITKXNATSIMPLESEARCHVIEW_H #include #include #include "QmitkXnatTreeBrowserView.h" #include "ui_QmitkXnatSimpleSearchViewControls.h" // ctkXnatCore #include "ctkXnatSession.h" // ctkXnatWidget #include "ctkXnatTreeModel.h" /*! \brief QmitkXnatSimpleSearchView \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. -\sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkXnatSimpleSearchView : public QmitkXnatTreeBrowserView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: enum MatchingObject { EMPTY, PROJECT, SUBJECT, EXPERIMENT }; QmitkXnatSimpleSearchView(); ~QmitkXnatSimpleSearchView(); static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent); berry::QtSelectionProvider::Pointer m_SelectionProvider; protected slots: /// \brief Called when the user clicks the GUI button void StartSearch(); protected: virtual void SetFocus(); Ui::QmitkXnatSimpleSearchViewControls m_Controls; private: void SetSelectionProvider(); ctkXnatSession* m_Session; ctkXnatTreeModel* m_TreeModel; }; #endif // QMITKXNATSIMPLESEARCHVIEW_H diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h index f991eb5b26..0f1286a589 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h @@ -1,149 +1,148 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QMITKXNATTREEBROWSERVIEW_H #define QMITKXNATTREEBROWSERVIEW_H #include #include "ui_QmitkXnatTreeBrowserViewControls.h" #include "QmitkHttpStatusCodeHandler.h" // ctkXnatCore #include "ctkXnatSession.h" // ctkXnatWidget #include "QmitkXnatTreeModel.h" // MitkXNAT Module #include "mitkXnatSessionTracker.h" #include #include #include class QMenu; /*! \brief QmitkXnatTreeBrowserView \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. -\sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkXnatTreeBrowserView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: QmitkXnatTreeBrowserView(); ~QmitkXnatTreeBrowserView(); static const QString VIEW_ID; virtual void CreateQtPartControl(QWidget *parent) override; enum SearchMethod { ProjectLevel = 0, SubjectLevel = 1 }; protected slots: /// \brief Opens or reuses the xnat editor with the activated node as root item. void OnActivatedNode(const QModelIndex& index); /// \brief Updates the ctkXnatSession and the user interface void UpdateSession(ctkXnatSession* session); /// \brief Cleans the tree model void CleanTreeModel(ctkXnatSession* session); /// \brief Searches the tree model void search(const QString &toSearch); void OnContextMenuRequested(const QPoint & pos); void OnContextMenuDownloadAndOpenFile(); void OnContextMenuDownloadFile(); void OnContextMenuCreateResourceFolder(); void OnContextMenuUploadFile(); void OnContextMenuCreateNewSubject(); void OnContextMenuCreateNewExperiment(); void OnContextMenuCopyXNATUrlToClipboard(); void OnContextMenuRefreshItem(); void OnUploadResource(const QList& , ctkXnatObject *, const QModelIndex &parentIndex); void OnProgress(QUuid, double); void itemSelected(const QModelIndex& index); void OnUploadFromDataStorage(); void sessionTimedOutMsg(); void sessionTimesOutSoonMsg(); void ToggleConnection(); protected: virtual void SetFocus() override; Ui::QmitkXnatTreeBrowserViewControls m_Controls; private slots: void OnXnatNodeSelected(const QModelIndex &index); void OnDownloadSelectedXnatFile(); void OnCreateResourceFolder(); private: void OnPreferencesChanged(const berry::IBerryPreferences*) override; void InternalFileDownload(const QModelIndex& index, bool loadData); void InternalDICOMDownload(ctkXnatObject* obj, QDir &DICOMDirPath); void InternalFileUpload(ctkXnatFile *file); ctkXnatResource* InternalAddResourceFolder(ctkXnatObject* parent); void InternalOpenFiles(const QFileInfoList&, mitk::StringProperty::Pointer xnatURL); void SetStatusInformation(const QString&); void FilePathNotAvailableWarning(QString file); void CleanUp(); ctkServiceTracker m_DataStorageServiceTracker; QmitkXnatTreeModel* m_TreeModel; mitk::XnatSessionTracker* m_Tracker; QString m_DownloadPath; QMenu* m_ContextMenu; bool m_SilentMode; QModelIndexList m_hiddenItems; bool m_AlreadyInSearch = false; }; #endif // QMITKXNATTREEBROWSERVIEW_H