From cd590ce5fff20d69c7060340235a35e9c2a9ef86 Mon Sep 17 00:00:00 2001 From: riveros Date: Wed, 18 Apr 2012 11:31:00 +0200 Subject: [PATCH] The following boxxes compilated with no errors --- ModuleCall/CMakeCache.txt | 300 ++++++++++++++++ ModuleCall/CreationTool.cxx | 160 ++++----- ModuleCall/CreationTool.h | 3 +- ModuleCall/Makefile | 3 - ModuleCall/interoperating_Baby | Bin 183304 -> 220128 bytes ModuleCall/main.cpp | 322 ++++++++++-------- bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx | 58 ++++ bbtk_Slicer_PKG/src/bbSlicerAddImages.h | 64 ++++ .../src/bbSlicerBSplinetodeformationfield.cxx | 57 ++++ .../src/bbSlicerBSplinetodeformationfield.h | 62 ++++ .../src/bbSlicerCommandLineModuleTest.cxx | 58 ++++ .../src/bbSlicerCommandLineModuleTest.h | 64 ++++ .../src/bbSlicerCreateaDICOMSeries.cxx | 74 ++++ .../src/bbSlicerCreateaDICOMSeries.h | 96 ++++++ .../src/bbSlicerDicomtoNrrdConverter.cxx | 61 ++++ .../src/bbSlicerDicomtoNrrdConverter.h | 70 ++++ .../src/bbSlicerExtractSkeleton.cxx | 60 ++++ bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h | 68 ++++ ...bSlicerFastNonrigidBSplineregistration.cxx | 67 ++++ .../bbSlicerFastNonrigidBSplineregistration.h | 82 +++++ .../src/bbSlicerImageLabelCombine.cxx | 58 ++++ .../src/bbSlicerImageLabelCombine.h | 64 ++++ .../src/bbSlicerLabelMapSmoothing.cxx | 60 ++++ .../src/bbSlicerLabelMapSmoothing.h | 68 ++++ .../src/bbSlicerMRIBiasFieldCorrection.cxx | 64 ++++ .../src/bbSlicerMRIBiasFieldCorrection.h | 76 +++++ bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx | 59 ++++ bbtk_Slicer_PKG/src/bbSlicerMaskImage.h | 66 ++++ bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx | 57 ++++ bbtk_Slicer_PKG/src/bbSlicerMergeModels.h | 62 ++++ .../src/bbSlicerMultiplyImages.cxx | 58 ++++ bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h | 64 ++++ bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx | 57 ++++ bbtk_Slicer_PKG/src/bbSlicerOrientImages.h | 62 ++++ .../src/bbSlicerOtsuThresholdSegmentation.cxx | 60 ++++ .../src/bbSlicerOtsuThresholdSegmentation.h | 68 ++++ .../src/bbSlicerPolyDataToLabelMap.cxx | 58 ++++ .../src/bbSlicerPolyDataToLabelMap.h | 64 ++++ .../bbSlicerRobustStatisticsSegmentation.cxx | 62 ++++ .../bbSlicerRobustStatisticsSegmentation.h | 72 ++++ bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx | 56 +++ bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h | 60 ++++ .../src/bbSlicerSubtractImages.cxx | 58 ++++ bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h | 64 ++++ .../bbSlicerTestGridTransformregistration.cxx | 58 ++++ .../bbSlicerTestGridTransformregistration.h | 64 ++++ .../src/bbSlicerThresholdImage.cxx | 61 ++++ bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h | 70 ++++ 48 files changed, 3253 insertions(+), 226 deletions(-) create mode 100644 ModuleCall/CMakeCache.txt create mode 100644 bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerAddImages.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMaskImage.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMergeModels.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerOrientImages.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerSubtractImages.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.h create mode 100644 bbtk_Slicer_PKG/src/bbSlicerThresholdImage.cxx create mode 100644 bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h diff --git a/ModuleCall/CMakeCache.txt b/ModuleCall/CMakeCache.txt new file mode 100644 index 0000000..38ec050 --- /dev/null +++ b/ModuleCall/CMakeCache.txt @@ -0,0 +1,300 @@ +# This is the CMakeCache file. +# For build in directory: /home/riveros/NetBeansProjects/ModuleCall +# It was generated by CMake: /usr/local/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING=Debug + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler. +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g + +//C compiler. +CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Inter + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If true, cmake will use relative paths in makefiles and projects. +CMAKE_USE_RELATIVE_PATHS:BOOL=OFF + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=OFF + +//The directory containing a CMake configuration file for GenerateCLP. +GenerateCLP_DIR:PATH=/home/riveros/.slicer/Slicer4-bin/SlicerExecutionModel-build/GenerateCLP + +//Value Computed by CMake +Inter_BINARY_DIR:STATIC=/home/riveros/NetBeansProjects/ModuleCall + +//Value Computed by CMake +Inter_SOURCE_DIR:STATIC=/home/riveros/NetBeansProjects/ModuleCall + +//The directory containing a CMake configuration file for ModuleDescriptionParser. +ModuleDescriptionParser_DIR:PATH=/home/riveros/.slicer/Slicer4-bin/SlicerExecutionModel-build/ModuleDescriptionParser + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_BUILD_TOOL +CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 +//What is the target build tool cmake is generating for. +CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make +//MODIFIED property for variable: CMAKE_BUILD_TYPE +CMAKE_BUILD_TYPE-MODIFIED:INTERNAL=ON +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/riveros/NetBeansProjects/ModuleCall +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=7 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/local/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +CMAKE_CXX_COMPILER_WORKS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +CMAKE_C_COMPILER_WORKS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Result of TRY_COMPILE +CMAKE_DETERMINE_CXX_ABI_COMPILED:INTERNAL=TRUE +//Result of TRY_COMPILE +CMAKE_DETERMINE_C_ABI_COMPILED:INTERNAL=TRUE +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/local/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Start directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/riveros/NetBeansProjects/ModuleCall +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/local/share/cmake-2.8 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS +CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//MODIFIED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-MODIFIED:INTERNAL=ON +//MODIFIED property for variable: GenerateCLP_DIR +GenerateCLP_DIR-MODIFIED:INTERNAL=ON +//MODIFIED property for variable: ModuleDescriptionParser_DIR +ModuleDescriptionParser_DIR-MODIFIED:INTERNAL=ON + diff --git a/ModuleCall/CreationTool.cxx b/ModuleCall/CreationTool.cxx index 8203b4d..b3c7095 100644 --- a/ModuleCall/CreationTool.cxx +++ b/ModuleCall/CreationTool.cxx @@ -8,157 +8,165 @@ #include "CreationTool.h" std::string Mthd::Aux::toString ( float n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( double n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( long double n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( char n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( unsigned char n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( short n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( unsigned short n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( int n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( long int n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( unsigned int n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( unsigned long n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( unsigned long long n ) { - std::ostringstream oss; - oss << n; - return oss.str( ); + std::ostringstream oss ; + oss << n ; + return oss.str( ) ; } std::string Mthd::Aux::toString ( std::string n ) { - return n; + return n ; } char* Mthd::Aux::toCharArrray ( float n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( double n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( long double n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( char n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( unsigned char n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( short n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( unsigned short n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( int n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( long int n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( unsigned int n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( long unsigned int n ) { - std::ostringstream oss; - oss << n; - return const_cast < char* > ( oss.str( ).data( ) ); + std::ostringstream oss ; + oss << n ; + return const_cast < char* > ( oss.str( ).data( ) ) ; } char* Mthd::Aux::toCharArrray ( std::string n ) { - return const_cast < char* > ( n.data( ) ); + return const_cast < char* > ( n.data( ) ) ; } -std::string Mthd::Aux::replace_str ( std::string input, std::string old_str, std::string new_str ) { - size_t found = input.find( old_str ); +std::string Mthd::Aux::replace_str ( std::string input , std::string old_str , std::string new_str ) { + size_t found = input.find( old_str ) ; while ( found != std::string::npos ) { - input.replace( found, old_str.length( ), new_str ); - found = input.find( old_str ); + input.replace( found , old_str.length( ) , new_str ) ; + found = input.find( old_str ) ; } - return input; + return input ; +} + +bool Mthd::Aux::str_ends_with ( std::string total_str , std::string sub_str ) { + size_t found = total_str.find( sub_str ) ; + if ( found != std::string::npos ) { + return true ; + } + return false ; } diff --git a/ModuleCall/CreationTool.h b/ModuleCall/CreationTool.h index 1859178..27dcb82 100644 --- a/ModuleCall/CreationTool.h +++ b/ModuleCall/CreationTool.h @@ -51,7 +51,8 @@ namespace Mthd { static char* toCharArrray ( std::string n ) ; - static std::string replace_str ( std::string input , std::string old_str , std::string new_str ) ; + static bool str_ends_with ( std::string total_str , std::string sub_str ) ; + static std::string replace_str ( std::string input , std::string old_str , std::string new_str ) ; } ; diff --git a/ModuleCall/Makefile b/ModuleCall/Makefile index c4a8046..7c1a80f 100644 --- a/ModuleCall/Makefile +++ b/ModuleCall/Makefile @@ -16,9 +16,6 @@ SUFFIXES = .SUFFIXES: .hpux_make_needs_suffix_list -# Produce verbose output by default. -VERBOSE = 1 - # Suppress display of executed commands. $(VERBOSE).SILENT: diff --git a/ModuleCall/interoperating_Baby b/ModuleCall/interoperating_Baby index 72882e86731fb5acfd82e01787413dcccef7bc0d..232b6113a3d152501608a6682828cbd269870691 100755 GIT binary patch literal 220128 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ℑ3RDVP5qO{%Lm{fE&rMluecV{ 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⪙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 OE=h7@FHo4nHvYeOW*1ff diff --git a/ModuleCall/main.cpp b/ModuleCall/main.cpp index 9f7d71a..afb7544 100644 --- a/ModuleCall/main.cpp +++ b/ModuleCall/main.cpp @@ -6,261 +6,291 @@ */ #include + #include -#include #include #include +#include +#include +#include +#include +#include #include #include #include #include -#include #include #include "CreationTool.h" + /// STD LD_OPEN CALLS /// -char* getModuleDescription ( std::string lib ) { - void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); +char* getModuleDescription ( const std::string lib ) { + + void* handle = dlopen( lib.c_str( ) , RTLD_NOW | RTLD_LOCAL ) ; if ( ! handle ) { - std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; - return NULL; + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n' ; + return NULL ; } - typedef char* ( *method_t )( void ); + typedef char* ( *method_t )( void ) ; // RESET ERRORS - dlerror( ); - method_t myMethod = ( method_t ) dlsym( handle, "GetXMLModuleDescription" ); - const char *dlsym_error = dlerror( ); + dlerror( ) ; + method_t myMethod = ( method_t ) dlsym( handle , "GetXMLModuleDescription" ) ; + const char *dlsym_error = dlerror( ) ; if ( dlsym_error ) { - std::cerr << "CAN'T LOAD SYMBOL 'GetXMLModuleDescription: " << dlsym_error << '\n'; - dlclose( handle ); - return NULL; + std::cerr << "CAN'T LOAD SYMBOL 'GetXMLModuleDescription: " << dlsym_error << '\n' ; + dlclose( handle ) ; + return NULL ; } // CALLING METHOD - char* descrption = myMethod( ); + char* descrption = myMethod( ) ; // CLOSING LIB - dlclose( handle ); - return descrption; + + //dlclose( handle ) ; + + return descrption ; } -void execute ( std::string lib, int _argc, char * _argv[] ) { - void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); +void execute ( const std::string lib , int _argc , char * _argv[] ) { + void* handle = dlopen( lib.c_str( ) , RTLD_NOW | RTLD_LOCAL ) ; if ( ! handle ) { - std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; - return; + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n' ; + return ; } - typedef int (*method_t )( int argc, char * argv[] ); + typedef int (*method_t )( int argc , char * argv[] ) ; // RESET ERRORS - dlerror( ); - method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); - const char *dlsym_error = dlerror( ); + dlerror( ) ; + method_t myMethod = ( method_t ) dlsym( handle , "ModuleEntryPoint" ) ; + const char *dlsym_error = dlerror( ) ; if ( dlsym_error ) { - std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint' " << dlsym_error << '\n'; - dlclose( handle ); - return; + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint' " << dlsym_error << '\n' ; + dlclose( handle ) ; + return ; } // CALLING METHOD - myMethod( _argc, _argv ); + myMethod( _argc , _argv ) ; // CLOSING LIB - dlclose( handle ); + dlclose( handle ) ; } /// FILE RELATED /// -void saveFile ( std::string content, std::string file_name ) { - std::ofstream myfile; - myfile.open( file_name.c_str( ) ); - myfile << content; - myfile.close( ); +void saveFile ( const std::string content , const std::string file_name ) { + std::ofstream myfile ; + myfile.open( file_name.c_str( ) ) ; + myfile << content ; + myfile.close( ) ; } -std::string loadFile ( std::string filename ) { - std::string line = std::string( "" ); - std::string content = std::string( "" ); +std::string loadFile ( const std::string filename ) { + std::string line = std::string( "" ) ; + std::string content = std::string( "" ) ; - std::ifstream infile; - infile.open( filename.c_str( ) ); + std::ifstream infile ; + infile.open( filename.c_str( ) ) ; while ( ! infile.eof( ) ) { - getline( infile, line ); - content += line + "\n"; - line.clear( ); + getline( infile , line ) ; + content += line + "\n" ; + line.clear( ) ; } - infile.close( ); - return content; + infile.close( ) ; + return content ; } std::string loadDummyBody ( ) { - return loadFile( "bbSlicerDummy.dummy_cxx" ); + return loadFile( "bbSlicerDummy.dummy_cxx" ) ; } std::string loadDummyHeader ( ) { - return loadFile( "bbSlicerDummy.dummy_h" ); + return loadFile( "bbSlicerDummy.dummy_h" ) ; } /// BBTK BOX CREATION /// -std::string updateBoxDescription ( const ModuleDescription* module, std::string _header ) { - _header = Mthd::Aux::replace_str( _header, "_NNNNN_", Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ) ); - _header = Mthd::Aux::replace_str( _header, "_AAAAA_", module->GetContributor( ) ); - _header = Mthd::Aux::replace_str( _header, "_DDDDD_", module->GetDescription( ) ); - _header = Mthd::Aux::replace_str( _header, "_CCCCC_", module->GetCategory( ) ); - return _header; +std::string updateBoxDescription ( const ModuleDescription* module , std::string _header ) { + _header = Mthd::Aux::replace_str( _header , "_NNNNN_" , Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ) ; + _header = Mthd::Aux::replace_str( _header , "_AAAAA_" , module->GetContributor( ) ) ; + _header = Mthd::Aux::replace_str( _header , "_DDDDD_" , module->GetDescription( ) ) ; + _header = Mthd::Aux::replace_str( _header , "_CCCCC_" , module->GetCategory( ) ) ; + return _header ; } -std::string updateBoxName ( const ModuleDescription* module, std::string content ) { - std::string _new_box_name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); - content = Mthd::Aux::replace_str( content, "Dummy", _new_box_name ); - return content; +std::string updateBoxName ( const ModuleDescription* module , std::string content ) { + std::string _new_box_name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; + content = Mthd::Aux::replace_str( content , "Dummy" , _new_box_name ) ; + return content ; } std::string getHeaderFileName ( const ModuleDescription* module ) { - std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); - - return "bbSlicer" + name + ".h"; + std::string name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; + return "bbSlicer" + name + ".h" ; } std::string getBodyFileName ( const ModuleDescription* module ) { - std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); + std::string name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; - return "bbSlicer" + name + ".cxx"; + return "bbSlicer" + name + ".cxx" ; } -std::string updateBoxInputs ( const ModuleDescription* module, std::string content ) { +std::string updateBoxInputs ( const ModuleDescription* module , std::string content ) { - std::string _cxx_inputs = std::string( "\n" ); - std::string _cxx_inputs_end = std::string( "\n" ); - std::string _box_name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); + std::string _cxx_inputs = std::string( "\n" ) ; + std::string _cxx_inputs_end = std::string( "\n" ) ; + std::string _box_name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; - for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { - ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); - for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { - ModuleParameter mPara = pGroup.GetParameters( ).at( j ); + for ( unsigned long int i = 0 ; i < module->GetParameterGroups( ).size( ) ; i ++ ) { + ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ) ; + for ( unsigned long int j = 0 ; j < pGroup.GetParameters( ).size( ) ; j ++ ) { + ModuleParameter mPara = pGroup.GetParameters( ).at( j ) ; _cxx_inputs += "BBTK_DECLARE_INPUT ( " + mPara.GetName( ) + " , " + - mPara.GetCPPType( ) + " );\n"; + mPara.GetCPPType( ) + " );\n" ; _cxx_inputs_end += "BBTK_INPUT(" + _box_name + " , " + mPara.GetName( ) + " , " + "\"" + mPara.GetName( ) + "\"" + " , " + - mPara.GetCPPType( ) + ", \"\");\n"; + mPara.GetCPPType( ) + ", \"\");\n" ; } } - content = Mthd::Aux::replace_str( content, "_11111_", _cxx_inputs ); - content = Mthd::Aux::replace_str( content, "_22222_", _cxx_inputs_end ); + content = Mthd::Aux::replace_str( content , "_11111_" , _cxx_inputs ) ; + content = Mthd::Aux::replace_str( content , "_22222_" , _cxx_inputs_end ) ; - return content; + return content ; } const int getNumberOfArguments ( const ModuleDescription* module ) { - int number = 0; - for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { - ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); - for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { + int number = 0 ; + for ( unsigned long int i = 0 ; i < module->GetParameterGroups( ).size( ) ; i ++ ) { + ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ) ; + for ( unsigned long int j = 0 ; j < pGroup.GetParameters( ).size( ) ; j ++ ) { - ModuleParameter mPara = pGroup.GetParameters( ).at( j ); - number ++; + ModuleParameter mPara = pGroup.GetParameters( ).at( j ) ; + number ++ ; } } - return number; + return number ; } -std::string updateProcessMethod ( const ModuleDescription* module, std::string content, std::string lib ) { - int number = 0; - std::string arg_list = std::string( "" ); - for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { - ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); - for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { +std::string updateProcessMethod ( const ModuleDescription* module , std::string content , std::string lib ) { + int number = 0 ; + std::string arg_list = std::string( "" ) ; + for ( unsigned long int i = 0 ; i < module->GetParameterGroups( ).size( ) ; i ++ ) { + ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ) ; + for ( unsigned long int j = 0 ; j < pGroup.GetParameters( ).size( ) ; j ++ ) { - ModuleParameter mPara = pGroup.GetParameters( ).at( j ); + ModuleParameter mPara = pGroup.GetParameters( ).at( j ) ; - arg_list += "Mthd::Aux::toCharArrray( "; + arg_list += "Mthd::Aux::toCharArrray( " ; if ( mPara.GetFlag( ) != "" ) { - arg_list += "Mthd::Aux::toString( \""; - arg_list += "-" + mPara.GetFlag( ) + "\" "; - arg_list += " ) + "; + arg_list += "Mthd::Aux::toString( \"" ; + arg_list += "-" + mPara.GetFlag( ) + "\" " ; + arg_list += " ) + " ; } else if ( mPara.GetLongFlag( ) != "" ) { - arg_list += "Mthd::Aux::toString( \""; - arg_list += "--" + mPara.GetLongFlag( ) + "\" "; - arg_list += " ) + "; + arg_list += "Mthd::Aux::toString( \"" ; + arg_list += "--" + mPara.GetLongFlag( ) + "\" " ; + arg_list += " ) + " ; } - arg_list += "Mthd::Aux::toString( bbGetInput" + mPara.GetName( ) + "( ) )"; - arg_list += " ),\n"; - number ++; + arg_list += "Mthd::Aux::toString( bbGetInput" + mPara.GetName( ) + "( ) )" ; + arg_list += " ),\n" ; + number ++ ; } } - arg_list += "_EEENNNDDD_"; - arg_list = Mthd::Aux::replace_str( arg_list, ",\n_EEENNNDDD_", "" ); - std::string _argc = "\nint _argc =" + Mthd::Aux::toString( number ) + ";\n"; - std::string _slib = "std::string lib = \"" + lib + "\";\n"; - std::string _argv = "char * _argv[ ] = { " + arg_list + " };\n"; - return Mthd::Aux::replace_str( content, "_33333_", _argc + _slib + _argv ); + arg_list += "_EEENNNDDD_" ; + arg_list = Mthd::Aux::replace_str( arg_list , ",\n_EEENNNDDD_" , "" ) ; + std::string _argc = "\nint _argc =" + Mthd::Aux::toString( number ) + ";\n" ; + std::string _slib = "std::string lib = \"" + lib + "\";\n" ; + std::string _argv = "char * _argv[ ] = { " + arg_list + " };\n" ; + return Mthd::Aux::replace_str( content , "_33333_" , _argc + _slib + _argv ) ; } -int main ( int argc, char* argv[] ) { +std::vector < std::string > getFilesByExtention ( std::string dir , std::string ext ) { + std::vector < std::string > files ; + files.clear( ) ; + DIR *dp ; + struct dirent *dirp ; + if ( ( dp = opendir( dir.c_str( ) ) ) == NULL ) { + std::cout << "ERROR OPENING " << dir << std::endl ; + return files ; + } + + while ( ( dirp = readdir( dp ) ) != NULL ) { + std::string file = std::string( dirp->d_name ) ; + if ( Mthd::Aux::str_ends_with( file , ext ) ) { + files.push_back( file ) ; + } + } + closedir( dp ) ; + return files ; +} - int _argc = 3; - char * _argv[] = { "-s 20", "/home/riveros/Desktop/Experiments/RA1.mhd", "/home/riveros/Desktop/Experiments/RA1-OUT-MAIN.mhd" }; - std::string gblib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libGaussianBlurImageFilterLib.so"; +int main ( int argc , char* argv[] ) { - execute( gblib, _argc, _argv ); + // int _argc = 3 ; + // char * _argv[] = { "-s 20" , "/home/riveros/Desktop/Experiments/RA1.mhd" , "/home/riveros/Desktop/Experiments/RA1-OUT-MAIN.mhd" } ; + // execute( gblib , _argc , _argv ) ; - /// MODULE INFORMATION /// - const std::string des = getModuleDescription( gblib ); + const std::string dummy_body_str = loadDummyBody( ) ; + const std::string dummy_header_str = loadDummyHeader( ) ; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // - // std::cout << des << std::endl << std::endl; + const std::string directory = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/" ; + const std::vector < std::string > files = getFilesByExtention( directory , ".so" ) ; - ModuleDescription module; - ModuleDescriptionParser parser; + for ( unsigned int i = 0 ; i < files.size( ) ; i ++ ) { - parser.Parse( des, module ); + std::string gblib = directory + files.at( i ) ; + std::cout << "/// " << files.at( i ) << " ///" << std::endl ; - /// LOADING DUMMY FILES /// - std::string _body = loadDummyBody( ); - std::string _header = loadDummyHeader( ); + /// MODULE INFORMATION /// + std::string des = getModuleDescription( gblib ) ; + std::cout << " getModuleDescription( gblib )...OK" << std::endl ; - /// SETTING HEADER FILE /// - _header = updateBoxName( &module, _header ); - _header = updateBoxDescription( &module, _header ); - _header = updateBoxInputs( &module, _header ); - saveFile( _header, getHeaderFileName( &module ) ); + ModuleDescription module ; + ModuleDescriptionParser parser ; - /// SETTING BODY FILE /// - _body = updateBoxName( &module, _body ); - _body = updateProcessMethod( &module, _body, gblib ); - saveFile( _body, getBodyFileName( &module ) ); + parser.Parse( des , module ) ; + std::cout << " parser.Parse( des , module )...OK" << std::endl ; + /// LOADING DUMMY FILES /// + std::string _body = std::string( dummy_body_str ) ; + std::cout << " loadDummyBody( )...OK" << std::endl ; + std::string _header = std::string( dummy_header_str ) ; + std::cout << " loadDummyHeader( )...OK" << std::endl ; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // - // std::cout << _header << std::endl; - // - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // - // std::cout << _body << std::endl; + /// SETTING HEADER FILE /// + _header = updateBoxName( &module , _header ) ; + std::cout << " updateBoxName( &module , _header )...OK" << std::endl ; + _header = updateBoxDescription( &module , _header ) ; + std::cout << " updateBoxDescription( &module , _header )...OK" << std::endl ; + _header = updateBoxInputs( &module , _header ) ; + std::cout << " updateBoxInputs( &module , _header )...OK" << std::endl ; + saveFile( _header , getHeaderFileName( &module ) ) ; - return EXIT_SUCCESS; + /// SETTING BODY FILE /// + _body = updateBoxName( &module , _body ) ; + std::cout << " updateBoxName( &module , _body )...OK" << std::endl ; + _body = updateProcessMethod( &module , _body , gblib ) ; + std::cout << " updateProcessMethod( &module , _body , gblib )...OK" << std::endl ; + saveFile( _body , getBodyFileName( &module ) ) ; + + std::cout << "/// EO " << files.at( i ) << " ///" << std::endl << std::endl ; + + gblib.clear( ) ; + des.clear( ) ; + //while ( getchar( ) != '\n' ) ; + + } + return EXIT_SUCCESS ; } diff --git a/bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx new file mode 100644 index 0000000..d66e444 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerAddImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, AddImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( AddImages, bbtk::AtomicBlackBox ); + + void AddImages::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libAddLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--order" ) + Mthd::Aux::toString( bbGetInputorder( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void AddImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void AddImages::bbUserSetDefaultValues ( ) { + } + + void AddImages::bbUserInitializeProcessing ( ) { + } + + void AddImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerAddImages.h b/bbtk_Slicer_PKG/src/bbSlicerAddImages.h new file mode 100644 index 0000000..6cd6801 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerAddImages.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerAddImages_h_INCLUDED__ +#define __bbSlicerAddImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT AddImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( AddImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( inputVolume2 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( order , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( AddImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "AddImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Adds two images. Although all image types are supported on input, only signed types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(AddImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(AddImages , inputVolume2 , "inputVolume2" , std::string, ""); +BBTK_INPUT(AddImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(AddImages , order , "order" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( AddImages ) ; +} + +#endif // __bbSlicerAddImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.cxx b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.cxx new file mode 100644 index 0000000..2633329 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerBSplinetodeformationfield.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, BSplinetodeformationfield ) + BBTK_BLACK_BOX_IMPLEMENTATION ( BSplinetodeformationfield, bbtk::AtomicBlackBox ); + + void BSplinetodeformationfield::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libBSplineToDeformationFieldLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--tfm" ) + Mthd::Aux::toString( bbGetInputinputTransformName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--refImage" ) + Mthd::Aux::toString( bbGetInputreferenceImageName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--defImage" ) + Mthd::Aux::toString( bbGetInputdeformationFieldName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void BSplinetodeformationfield::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void BSplinetodeformationfield::bbUserSetDefaultValues ( ) { + } + + void BSplinetodeformationfield::bbUserInitializeProcessing ( ) { + } + + void BSplinetodeformationfield::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.h b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.h new file mode 100644 index 0000000..4815d58 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerBSplinetodeformationfield_h_INCLUDED__ +#define __bbSlicerBSplinetodeformationfield_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT BSplinetodeformationfield + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( BSplinetodeformationfield , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputTransformName , std::string ); +BBTK_DECLARE_INPUT ( referenceImageName , std::string ); +BBTK_DECLARE_INPUT ( deformationFieldName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( BSplinetodeformationfield , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "BSplinetodeformationfield" ) ; + BBTK_AUTHOR ( "Andrey Fedorov, BWH" ) ; + BBTK_DESCRIPTION ( "Create a dense deformation field from a bspline+bulk transform." ) ; + BBTK_CATEGORY ( "Legacy.Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(BSplinetodeformationfield , inputTransformName , "inputTransformName" , std::string, ""); +BBTK_INPUT(BSplinetodeformationfield , referenceImageName , "referenceImageName" , std::string, ""); +BBTK_INPUT(BSplinetodeformationfield , deformationFieldName , "deformationFieldName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( BSplinetodeformationfield ) ; +} + +#endif // __bbSlicerBSplinetodeformationfield_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.cxx b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.cxx new file mode 100644 index 0000000..ba3a358 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerCommandLineModuleTest.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, CommandLineModuleTest ) + BBTK_BLACK_BOX_IMPLEMENTATION ( CommandLineModuleTest, bbtk::AtomicBlackBox ); + + void CommandLineModuleTest::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libCLIModule4TestLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputvalue1" ) + Mthd::Aux::toString( bbGetInputInputValue1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputvalue2" ) + Mthd::Aux::toString( bbGetInputInputValue2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--operationtype" ) + Mthd::Aux::toString( bbGetInputOperationType( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputFile( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void CommandLineModuleTest::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void CommandLineModuleTest::bbUserSetDefaultValues ( ) { + } + + void CommandLineModuleTest::bbUserInitializeProcessing ( ) { + } + + void CommandLineModuleTest::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.h b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.h new file mode 100644 index 0000000..d8c2809 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerCommandLineModuleTest_h_INCLUDED__ +#define __bbSlicerCommandLineModuleTest_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT CommandLineModuleTest + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( CommandLineModuleTest , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputValue1 , int ); +BBTK_DECLARE_INPUT ( InputValue2 , int ); +BBTK_DECLARE_INPUT ( OperationType , std::string ); +BBTK_DECLARE_INPUT ( OutputFile , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( CommandLineModuleTest , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "CommandLineModuleTest" ) ; + BBTK_AUTHOR ( "Jean-Christophe Fillion-Robin" ) ; + BBTK_DESCRIPTION ( "Command line module used to test the automatic UI generator." ) ; + BBTK_CATEGORY ( "Testing" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(CommandLineModuleTest , InputValue1 , "InputValue1" , int, ""); +BBTK_INPUT(CommandLineModuleTest , InputValue2 , "InputValue2" , int, ""); +BBTK_INPUT(CommandLineModuleTest , OperationType , "OperationType" , std::string, ""); +BBTK_INPUT(CommandLineModuleTest , OutputFile , "OutputFile" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( CommandLineModuleTest ) ; +} + +#endif // __bbSlicerCommandLineModuleTest_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.cxx b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.cxx new file mode 100644 index 0000000..1fe0e73 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.cxx @@ -0,0 +1,74 @@ +#include "bbSlicerCreateaDICOMSeries.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, CreateaDICOMSeries ) + BBTK_BLACK_BOX_IMPLEMENTATION ( CreateaDICOMSeries, bbtk::AtomicBlackBox ); + + void CreateaDICOMSeries::Process ( ) { + + // GENERATED + +int _argc =20; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libImageReadDicomWriteLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--patientName" ) + Mthd::Aux::toString( bbGetInputpatientName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--patientID" ) + Mthd::Aux::toString( bbGetInputpatientID( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--patientComments" ) + Mthd::Aux::toString( bbGetInputpatientComments( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyID" ) + Mthd::Aux::toString( bbGetInputstudyID( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyDate" ) + Mthd::Aux::toString( bbGetInputstudyDate( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyComments" ) + Mthd::Aux::toString( bbGetInputstudyComments( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyDescription" ) + Mthd::Aux::toString( bbGetInputstudyDescription( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--modality" ) + Mthd::Aux::toString( bbGetInputmodality( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--manufacturer" ) + Mthd::Aux::toString( bbGetInputmanufacturer( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--model" ) + Mthd::Aux::toString( bbGetInputmodel( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--seriesNumber" ) + Mthd::Aux::toString( bbGetInputseriesNumber( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--seriesDescription" ) + Mthd::Aux::toString( bbGetInputseriesDescription( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--rescaleIntercept" ) + Mthd::Aux::toString( bbGetInputrescaleIntercept( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--rescaleSlope" ) + Mthd::Aux::toString( bbGetInputrescaleSlope( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dicomDirectory" ) + Mthd::Aux::toString( bbGetInputdicomDirectory( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dicomPrefix" ) + Mthd::Aux::toString( bbGetInputdicomPrefix( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dicomNumberFormat" ) + Mthd::Aux::toString( bbGetInputdicomNumberFormat( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--reverseImages" ) + Mthd::Aux::toString( bbGetInputreverseImages( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--useCompression" ) + Mthd::Aux::toString( bbGetInputuseCompression( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void CreateaDICOMSeries::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void CreateaDICOMSeries::bbUserSetDefaultValues ( ) { + } + + void CreateaDICOMSeries::bbUserInitializeProcessing ( ) { + } + + void CreateaDICOMSeries::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.h b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.h new file mode 100644 index 0000000..a7f3d19 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.h @@ -0,0 +1,96 @@ +#ifndef __bbSlicerCreateaDICOMSeries_h_INCLUDED__ +#define __bbSlicerCreateaDICOMSeries_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT CreateaDICOMSeries + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( CreateaDICOMSeries , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( patientName , std::string ); +BBTK_DECLARE_INPUT ( patientID , std::string ); +BBTK_DECLARE_INPUT ( patientComments , std::string ); +BBTK_DECLARE_INPUT ( studyID , std::string ); +BBTK_DECLARE_INPUT ( studyDate , std::string ); +BBTK_DECLARE_INPUT ( studyComments , std::string ); +BBTK_DECLARE_INPUT ( studyDescription , std::string ); +BBTK_DECLARE_INPUT ( modality , std::string ); +BBTK_DECLARE_INPUT ( manufacturer , std::string ); +BBTK_DECLARE_INPUT ( model , std::string ); +BBTK_DECLARE_INPUT ( seriesNumber , std::string ); +BBTK_DECLARE_INPUT ( seriesDescription , std::string ); +BBTK_DECLARE_INPUT ( rescaleIntercept , double ); +BBTK_DECLARE_INPUT ( rescaleSlope , double ); +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( dicomDirectory , std::string ); +BBTK_DECLARE_INPUT ( dicomPrefix , std::string ); +BBTK_DECLARE_INPUT ( dicomNumberFormat , std::string ); +BBTK_DECLARE_INPUT ( reverseImages , bool ); +BBTK_DECLARE_INPUT ( useCompression , bool ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( CreateaDICOMSeries , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "CreateaDICOMSeries" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Create a DICOM Series from a Slicer volume. User can specify values for selected DICOM tags in the UI. Given the number of tags DICOM series have, it is impossible to expose all tags in UI. So only important tags can be set by the user." ) ; + BBTK_CATEGORY ( "Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(CreateaDICOMSeries , patientName , "patientName" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , patientID , "patientID" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , patientComments , "patientComments" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyID , "studyID" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyDate , "studyDate" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyComments , "studyComments" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyDescription , "studyDescription" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , modality , "modality" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , manufacturer , "manufacturer" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , model , "model" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , seriesNumber , "seriesNumber" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , seriesDescription , "seriesDescription" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , rescaleIntercept , "rescaleIntercept" , double, ""); +BBTK_INPUT(CreateaDICOMSeries , rescaleSlope , "rescaleSlope" , double, ""); +BBTK_INPUT(CreateaDICOMSeries , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , dicomDirectory , "dicomDirectory" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , dicomPrefix , "dicomPrefix" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , dicomNumberFormat , "dicomNumberFormat" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , reverseImages , "reverseImages" , bool, ""); +BBTK_INPUT(CreateaDICOMSeries , useCompression , "useCompression" , bool, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( CreateaDICOMSeries ) ; +} + +#endif // __bbSlicerCreateaDICOMSeries_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.cxx b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.cxx new file mode 100644 index 0000000..87e2029 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.cxx @@ -0,0 +1,61 @@ +#include "bbSlicerDicomtoNrrdConverter.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, DicomtoNrrdConverter ) + BBTK_BLACK_BOX_IMPLEMENTATION ( DicomtoNrrdConverter, bbtk::AtomicBlackBox ); + + void DicomtoNrrdConverter::Process ( ) { + + // GENERATED + +int _argc =7; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libDicomToNrrdConverterLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputDicomDirectory" ) + Mthd::Aux::toString( bbGetInputinputDicomDirectory( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputDirectory" ) + Mthd::Aux::toString( bbGetInputoutputDirectory( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputVolume" ) + Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--smallGradientThreshold" ) + Mthd::Aux::toString( bbGetInputsmallGradientThreshold( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--writeProtocolGradientsFile" ) + Mthd::Aux::toString( bbGetInputwriteProtocolGradientsFile( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--useIdentityMeaseurementFrame" ) + Mthd::Aux::toString( bbGetInputuseIdentityMeaseurementFrame( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--useBMatrixGradientDirections" ) + Mthd::Aux::toString( bbGetInputuseBMatrixGradientDirections( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void DicomtoNrrdConverter::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void DicomtoNrrdConverter::bbUserSetDefaultValues ( ) { + } + + void DicomtoNrrdConverter::bbUserInitializeProcessing ( ) { + } + + void DicomtoNrrdConverter::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.h b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.h new file mode 100644 index 0000000..808c738 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.h @@ -0,0 +1,70 @@ +#ifndef __bbSlicerDicomtoNrrdConverter_h_INCLUDED__ +#define __bbSlicerDicomtoNrrdConverter_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT DicomtoNrrdConverter + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( DicomtoNrrdConverter , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputDicomDirectory , std::string ); +BBTK_DECLARE_INPUT ( outputDirectory , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( smallGradientThreshold , double ); +BBTK_DECLARE_INPUT ( writeProtocolGradientsFile , bool ); +BBTK_DECLARE_INPUT ( useIdentityMeaseurementFrame , bool ); +BBTK_DECLARE_INPUT ( useBMatrixGradientDirections , bool ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( DicomtoNrrdConverter , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "DicomtoNrrdConverter" ) ; + BBTK_AUTHOR ( "Xiaodong Tao" ) ; + BBTK_DESCRIPTION ( "Converts diffusion weighted MR images in dicom series into Nrrd format for analysis in Slicer. This program has been tested on only a limited subset of DTI dicom formats available from Siemens, GE, and Phillips scanners. Work in progress to support dicom multi-frame data. The program parses dicom header to extract necessary information about measurement frame, diffusion weighting directions, b-values, etc, and write out a nrrd image. For non-diffusion weighted dicom images, it loads in an entire dicom series and writes out a single dicom volume in a .nhdr/.raw pair." ) ; + BBTK_CATEGORY ( "Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(DicomtoNrrdConverter , inputDicomDirectory , "inputDicomDirectory" , std::string, ""); +BBTK_INPUT(DicomtoNrrdConverter , outputDirectory , "outputDirectory" , std::string, ""); +BBTK_INPUT(DicomtoNrrdConverter , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(DicomtoNrrdConverter , smallGradientThreshold , "smallGradientThreshold" , double, ""); +BBTK_INPUT(DicomtoNrrdConverter , writeProtocolGradientsFile , "writeProtocolGradientsFile" , bool, ""); +BBTK_INPUT(DicomtoNrrdConverter , useIdentityMeaseurementFrame , "useIdentityMeaseurementFrame" , bool, ""); +BBTK_INPUT(DicomtoNrrdConverter , useBMatrixGradientDirections , "useBMatrixGradientDirections" , bool, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( DicomtoNrrdConverter ) ; +} + +#endif // __bbSlicerDicomtoNrrdConverter_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.cxx b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.cxx new file mode 100644 index 0000000..5afd4d6 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.cxx @@ -0,0 +1,60 @@ +#include "bbSlicerExtractSkeleton.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, ExtractSkeleton ) + BBTK_BLACK_BOX_IMPLEMENTATION ( ExtractSkeleton, bbtk::AtomicBlackBox ); + + void ExtractSkeleton::Process ( ) { + + // GENERATED + +int _argc =6; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libExtractSkeletonLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--type" ) + Mthd::Aux::toString( bbGetInputSkeletonType( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dontPrune" ) + Mthd::Aux::toString( bbGetInputDontPruneBranches( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numPoints" ) + Mthd::Aux::toString( bbGetInputNumberOfPoints( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--pointsFile" ) + Mthd::Aux::toString( bbGetInputOutputPointsFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void ExtractSkeleton::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void ExtractSkeleton::bbUserSetDefaultValues ( ) { + } + + void ExtractSkeleton::bbUserInitializeProcessing ( ) { + } + + void ExtractSkeleton::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h new file mode 100644 index 0000000..3b47fb2 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h @@ -0,0 +1,68 @@ +#ifndef __bbSlicerExtractSkeleton_h_INCLUDED__ +#define __bbSlicerExtractSkeleton_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT ExtractSkeleton + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( ExtractSkeleton , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputImageFileName , std::string ); +BBTK_DECLARE_INPUT ( OutputImageFileName , std::string ); +BBTK_DECLARE_INPUT ( SkeletonType , std::string ); +BBTK_DECLARE_INPUT ( DontPruneBranches , bool ); +BBTK_DECLARE_INPUT ( NumberOfPoints , int ); +BBTK_DECLARE_INPUT ( OutputPointsFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( ExtractSkeleton , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "ExtractSkeleton" ) ; + BBTK_AUTHOR ( "Pierre Seroul, Martin Styner, Guido Gerig, and Stephen Aylward" ) ; + BBTK_DESCRIPTION ( "Extract the skeleton of a binary object. The skeleton can be limited to being a 1D curve or allowed to be a full 2D manifold. The branches of the skeleton can be pruned so that only the maximal center skeleton is returned." ) ; + BBTK_CATEGORY ( "Filtering" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(ExtractSkeleton , InputImageFileName , "InputImageFileName" , std::string, ""); +BBTK_INPUT(ExtractSkeleton , OutputImageFileName , "OutputImageFileName" , std::string, ""); +BBTK_INPUT(ExtractSkeleton , SkeletonType , "SkeletonType" , std::string, ""); +BBTK_INPUT(ExtractSkeleton , DontPruneBranches , "DontPruneBranches" , bool, ""); +BBTK_INPUT(ExtractSkeleton , NumberOfPoints , "NumberOfPoints" , int, ""); +BBTK_INPUT(ExtractSkeleton , OutputPointsFileName , "OutputPointsFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( ExtractSkeleton ) ; +} + +#endif // __bbSlicerExtractSkeleton_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.cxx b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.cxx new file mode 100644 index 0000000..a4f41cb --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.cxx @@ -0,0 +1,67 @@ +#include "bbSlicerFastNonrigidBSplineregistration.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, FastNonrigidBSplineregistration ) + BBTK_BLACK_BOX_IMPLEMENTATION ( FastNonrigidBSplineregistration, bbtk::AtomicBlackBox ); + + void FastNonrigidBSplineregistration::Process ( ) { + + // GENERATED + +int _argc =13; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libBSplineDeformableRegistrationLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-i" ) + Mthd::Aux::toString( bbGetInputIterations( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-g" ) + Mthd::Aux::toString( bbGetInputgridSize( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-b" ) + Mthd::Aux::toString( bbGetInputHistogramBins( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-s" ) + Mthd::Aux::toString( bbGetInputSpatialSamples( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--constrain" ) + Mthd::Aux::toString( bbGetInputConstrainDeformation( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-m" ) + Mthd::Aux::toString( bbGetInputMaximumDeformation( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-d" ) + Mthd::Aux::toString( bbGetInputDefaultPixelValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--initialtransform" ) + Mthd::Aux::toString( bbGetInputInitialTransform( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputFixedImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputMovingImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputtransform" ) + Mthd::Aux::toString( bbGetInputOutputTransform( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputwarp" ) + Mthd::Aux::toString( bbGetInputOutputWarp( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--resampledmovingfilename" ) + Mthd::Aux::toString( bbGetInputResampledImageFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void FastNonrigidBSplineregistration::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void FastNonrigidBSplineregistration::bbUserSetDefaultValues ( ) { + } + + void FastNonrigidBSplineregistration::bbUserInitializeProcessing ( ) { + } + + void FastNonrigidBSplineregistration::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.h b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.h new file mode 100644 index 0000000..dbb3cf3 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.h @@ -0,0 +1,82 @@ +#ifndef __bbSlicerFastNonrigidBSplineregistration_h_INCLUDED__ +#define __bbSlicerFastNonrigidBSplineregistration_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT FastNonrigidBSplineregistration + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( FastNonrigidBSplineregistration , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( Iterations , int ); +BBTK_DECLARE_INPUT ( gridSize , int ); +BBTK_DECLARE_INPUT ( HistogramBins , int ); +BBTK_DECLARE_INPUT ( SpatialSamples , int ); +BBTK_DECLARE_INPUT ( ConstrainDeformation , bool ); +BBTK_DECLARE_INPUT ( MaximumDeformation , float ); +BBTK_DECLARE_INPUT ( DefaultPixelValue , int ); +BBTK_DECLARE_INPUT ( InitialTransform , std::string ); +BBTK_DECLARE_INPUT ( FixedImageFileName , std::string ); +BBTK_DECLARE_INPUT ( MovingImageFileName , std::string ); +BBTK_DECLARE_INPUT ( OutputTransform , std::string ); +BBTK_DECLARE_INPUT ( OutputWarp , std::string ); +BBTK_DECLARE_INPUT ( ResampledImageFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( FastNonrigidBSplineregistration , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "FastNonrigidBSplineregistration" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Registers two images together using BSpline transform and mutual information." ) ; + BBTK_CATEGORY ( "Legacy.Registration" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(FastNonrigidBSplineregistration , Iterations , "Iterations" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , gridSize , "gridSize" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , HistogramBins , "HistogramBins" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , SpatialSamples , "SpatialSamples" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , ConstrainDeformation , "ConstrainDeformation" , bool, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , MaximumDeformation , "MaximumDeformation" , float, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , DefaultPixelValue , "DefaultPixelValue" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , InitialTransform , "InitialTransform" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , FixedImageFileName , "FixedImageFileName" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , MovingImageFileName , "MovingImageFileName" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , OutputTransform , "OutputTransform" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , OutputWarp , "OutputWarp" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , ResampledImageFileName , "ResampledImageFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( FastNonrigidBSplineregistration ) ; +} + +#endif // __bbSlicerFastNonrigidBSplineregistration_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.cxx b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.cxx new file mode 100644 index 0000000..cf71b1e --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerImageLabelCombine.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, ImageLabelCombine ) + BBTK_BLACK_BOX_IMPLEMENTATION ( ImageLabelCombine, bbtk::AtomicBlackBox ); + + void ImageLabelCombine::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libImageLabelCombineLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputLabelMap_A( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputLabelMap_B( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputLabelMap( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-f" ) + Mthd::Aux::toString( bbGetInputFirstOverwrites( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void ImageLabelCombine::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void ImageLabelCombine::bbUserSetDefaultValues ( ) { + } + + void ImageLabelCombine::bbUserInitializeProcessing ( ) { + } + + void ImageLabelCombine::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.h b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.h new file mode 100644 index 0000000..6404950 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerImageLabelCombine_h_INCLUDED__ +#define __bbSlicerImageLabelCombine_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT ImageLabelCombine + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( ImageLabelCombine , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputLabelMap_A , std::string ); +BBTK_DECLARE_INPUT ( InputLabelMap_B , std::string ); +BBTK_DECLARE_INPUT ( OutputLabelMap , std::string ); +BBTK_DECLARE_INPUT ( FirstOverwrites , bool ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( ImageLabelCombine , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "ImageLabelCombine" ) ; + BBTK_AUTHOR ( "Alex Yarmarkovich" ) ; + BBTK_DESCRIPTION ( "Combine two label maps into one" ) ; + BBTK_CATEGORY ( "Filtering" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(ImageLabelCombine , InputLabelMap_A , "InputLabelMap_A" , std::string, ""); +BBTK_INPUT(ImageLabelCombine , InputLabelMap_B , "InputLabelMap_B" , std::string, ""); +BBTK_INPUT(ImageLabelCombine , OutputLabelMap , "OutputLabelMap" , std::string, ""); +BBTK_INPUT(ImageLabelCombine , FirstOverwrites , "FirstOverwrites" , bool, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( ImageLabelCombine ) ; +} + +#endif // __bbSlicerImageLabelCombine_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.cxx b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.cxx new file mode 100644 index 0000000..8d6febc --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.cxx @@ -0,0 +1,60 @@ +#include "bbSlicerLabelMapSmoothing.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, LabelMapSmoothing ) + BBTK_BLACK_BOX_IMPLEMENTATION ( LabelMapSmoothing, bbtk::AtomicBlackBox ); + + void LabelMapSmoothing::Process ( ) { + + // GENERATED + +int _argc =6; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libLabelMapSmoothingLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--labelToSmooth" ) + Mthd::Aux::toString( bbGetInputlabelToSmooth( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numberOfIterations" ) + Mthd::Aux::toString( bbGetInputnumberOfIterations( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--maxRMSError" ) + Mthd::Aux::toString( bbGetInputmaxRMSError( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--gaussianSigma" ) + Mthd::Aux::toString( bbGetInputgaussianSigma( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void LabelMapSmoothing::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void LabelMapSmoothing::bbUserSetDefaultValues ( ) { + } + + void LabelMapSmoothing::bbUserInitializeProcessing ( ) { + } + + void LabelMapSmoothing::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.h b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.h new file mode 100644 index 0000000..38f5675 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.h @@ -0,0 +1,68 @@ +#ifndef __bbSlicerLabelMapSmoothing_h_INCLUDED__ +#define __bbSlicerLabelMapSmoothing_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT LabelMapSmoothing + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( LabelMapSmoothing , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( labelToSmooth , int ); +BBTK_DECLARE_INPUT ( numberOfIterations , int ); +BBTK_DECLARE_INPUT ( maxRMSError , float ); +BBTK_DECLARE_INPUT ( gaussianSigma , float ); +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( LabelMapSmoothing , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "LabelMapSmoothing" ) ; + BBTK_AUTHOR ( "Dirk Padfield, Josh Cates, Ross Whitaker" ) ; + BBTK_DESCRIPTION ( "This filter smoothes a binary label map. With a label map as input, this filter runs an anti-alising algorithm followed by a Gaussian smoothing algorithm. The output is a smoothed label map." ) ; + BBTK_CATEGORY ( "Surface Models" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(LabelMapSmoothing , labelToSmooth , "labelToSmooth" , int, ""); +BBTK_INPUT(LabelMapSmoothing , numberOfIterations , "numberOfIterations" , int, ""); +BBTK_INPUT(LabelMapSmoothing , maxRMSError , "maxRMSError" , float, ""); +BBTK_INPUT(LabelMapSmoothing , gaussianSigma , "gaussianSigma" , float, ""); +BBTK_INPUT(LabelMapSmoothing , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(LabelMapSmoothing , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( LabelMapSmoothing ) ; +} + +#endif // __bbSlicerLabelMapSmoothing_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.cxx b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.cxx new file mode 100644 index 0000000..946408f --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.cxx @@ -0,0 +1,64 @@ +#include "bbSlicerMRIBiasFieldCorrection.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MRIBiasFieldCorrection ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MRIBiasFieldCorrection, bbtk::AtomicBlackBox ); + + void MRIBiasFieldCorrection::Process ( ) { + + // GENERATED + +int _argc =10; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMRIBiasFieldCorrectionLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputImage" ) + Mthd::Aux::toString( bbGetInputInputImage( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputMask" ) + Mthd::Aux::toString( bbGetInputInputMask( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputImage" ) + Mthd::Aux::toString( bbGetInputOutputImage( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--algorithmType" ) + Mthd::Aux::toString( bbGetInputAlgorithmType( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--shrinkFactor" ) + Mthd::Aux::toString( bbGetInputShrinkFactor( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--maximumNumberOfIterations" ) + Mthd::Aux::toString( bbGetInputMaximumNumberOfIterations( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numberOfFittingLevels" ) + Mthd::Aux::toString( bbGetInputNumberOfFittingLevels( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--wienerFilterNoise" ) + Mthd::Aux::toString( bbGetInputWienerFilterNoise( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--fullWidthAtHalfMaximum" ) + Mthd::Aux::toString( bbGetInputFullWidthAtHalfMaximum( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--convergenceThreshold" ) + Mthd::Aux::toString( bbGetInputConvergenceThreshold( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MRIBiasFieldCorrection::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MRIBiasFieldCorrection::bbUserSetDefaultValues ( ) { + } + + void MRIBiasFieldCorrection::bbUserInitializeProcessing ( ) { + } + + void MRIBiasFieldCorrection::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.h b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.h new file mode 100644 index 0000000..7b491ff --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.h @@ -0,0 +1,76 @@ +#ifndef __bbSlicerMRIBiasFieldCorrection_h_INCLUDED__ +#define __bbSlicerMRIBiasFieldCorrection_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MRIBiasFieldCorrection + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MRIBiasFieldCorrection , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputImage , std::string ); +BBTK_DECLARE_INPUT ( InputMask , std::string ); +BBTK_DECLARE_INPUT ( OutputImage , std::string ); +BBTK_DECLARE_INPUT ( AlgorithmType , std::string ); +BBTK_DECLARE_INPUT ( ShrinkFactor , int ); +BBTK_DECLARE_INPUT ( MaximumNumberOfIterations , int ); +BBTK_DECLARE_INPUT ( NumberOfFittingLevels , int ); +BBTK_DECLARE_INPUT ( WienerFilterNoise , double ); +BBTK_DECLARE_INPUT ( FullWidthAtHalfMaximum , double ); +BBTK_DECLARE_INPUT ( ConvergenceThreshold , double ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MRIBiasFieldCorrection , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MRIBiasFieldCorrection" ) ; + BBTK_AUTHOR ( "Sylvain Jaume (MIT)" ) ; + BBTK_DESCRIPTION ( "Corrects 3D MRI images corrupted by MRI gain field effect. This module removes the slow-varying intensity variation from a 3D image. The output image has a higher contrast locally and the visualization and reading of the image are improved. This is an important pre-processinbg step for image operations requiring intensity perfect images, such as the Expectation Maximization segmentation (see EMSegment module). The N3 and N4 methods are described in N4ITK: Nick's N3 ITK Implementation For MRI Bias Field Correction, Tustison N., Gee J., Insight Journal, 2009. http://hdl.handle.net/10380/3053 The Slicer code was contributed by Sylvain Jaume (MIT) for NA-MIC (http://na-mic.org)." ) ; + BBTK_CATEGORY ( "Legacy.Filtering" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MRIBiasFieldCorrection , InputImage , "InputImage" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , InputMask , "InputMask" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , OutputImage , "OutputImage" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , AlgorithmType , "AlgorithmType" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , ShrinkFactor , "ShrinkFactor" , int, ""); +BBTK_INPUT(MRIBiasFieldCorrection , MaximumNumberOfIterations , "MaximumNumberOfIterations" , int, ""); +BBTK_INPUT(MRIBiasFieldCorrection , NumberOfFittingLevels , "NumberOfFittingLevels" , int, ""); +BBTK_INPUT(MRIBiasFieldCorrection , WienerFilterNoise , "WienerFilterNoise" , double, ""); +BBTK_INPUT(MRIBiasFieldCorrection , FullWidthAtHalfMaximum , "FullWidthAtHalfMaximum" , double, ""); +BBTK_INPUT(MRIBiasFieldCorrection , ConvergenceThreshold , "ConvergenceThreshold" , double, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MRIBiasFieldCorrection ) ; +} + +#endif // __bbSlicerMRIBiasFieldCorrection_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx new file mode 100644 index 0000000..e657ec1 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx @@ -0,0 +1,59 @@ +#include "bbSlicerMaskImage.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MaskImage ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MaskImage, bbtk::AtomicBlackBox ); + + void MaskImage::Process ( ) { + + // GENERATED + +int _argc =5; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMaskLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputMaskVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-l" ) + Mthd::Aux::toString( bbGetInputLabel( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-r" ) + Mthd::Aux::toString( bbGetInputReplace( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MaskImage::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MaskImage::bbUserSetDefaultValues ( ) { + } + + void MaskImage::bbUserInitializeProcessing ( ) { + } + + void MaskImage::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMaskImage.h b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.h new file mode 100644 index 0000000..1dbe285 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.h @@ -0,0 +1,66 @@ +#ifndef __bbSlicerMaskImage_h_INCLUDED__ +#define __bbSlicerMaskImage_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MaskImage + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MaskImage , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputVolume , std::string ); +BBTK_DECLARE_INPUT ( MaskVolume , std::string ); +BBTK_DECLARE_INPUT ( OutputVolume , std::string ); +BBTK_DECLARE_INPUT ( Label , int ); +BBTK_DECLARE_INPUT ( Replace , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MaskImage , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MaskImage" ) ; + BBTK_AUTHOR ( "Nicole Aucoin, BWH (Ron Kikinis, BWH)" ) ; + BBTK_DESCRIPTION ( "Masks two images. The output image is set to 0 everywhere except where the chosen label from the mask volume is present, at which point it will retain it's original values. Although all image types are supported on input, only signed types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MaskImage , InputVolume , "InputVolume" , std::string, ""); +BBTK_INPUT(MaskImage , MaskVolume , "MaskVolume" , std::string, ""); +BBTK_INPUT(MaskImage , OutputVolume , "OutputVolume" , std::string, ""); +BBTK_INPUT(MaskImage , Label , "Label" , int, ""); +BBTK_INPUT(MaskImage , Replace , "Replace" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MaskImage ) ; +} + +#endif // __bbSlicerMaskImage_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx new file mode 100644 index 0000000..fec4de3 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerMergeModels.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MergeModels ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MergeModels, bbtk::AtomicBlackBox ); + + void MergeModels::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMergeModelsLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputModel1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputModel2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputModelOutput( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MergeModels::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MergeModels::bbUserSetDefaultValues ( ) { + } + + void MergeModels::bbUserInitializeProcessing ( ) { + } + + void MergeModels::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMergeModels.h b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.h new file mode 100644 index 0000000..2ff5f2d --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerMergeModels_h_INCLUDED__ +#define __bbSlicerMergeModels_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MergeModels + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MergeModels , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( Model1 , std::string ); +BBTK_DECLARE_INPUT ( Model2 , std::string ); +BBTK_DECLARE_INPUT ( ModelOutput , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MergeModels , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MergeModels" ) ; + BBTK_AUTHOR ( "Nicole Aucoin BWH (Ron Kikinis, BWH), Daniel Haehn" ) ; + BBTK_DESCRIPTION ( "Merge the polydata from two input models and output a new model with the added polydata. Uses the vtkAppendPolyData filter. Works on .vtp and .vtk surface files." ) ; + BBTK_CATEGORY ( "Surface Models" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MergeModels , Model1 , "Model1" , std::string, ""); +BBTK_INPUT(MergeModels , Model2 , "Model2" , std::string, ""); +BBTK_INPUT(MergeModels , ModelOutput , "ModelOutput" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MergeModels ) ; +} + +#endif // __bbSlicerMergeModels_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.cxx new file mode 100644 index 0000000..d7afe4c --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerMultiplyImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MultiplyImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MultiplyImages, bbtk::AtomicBlackBox ); + + void MultiplyImages::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMultiplyLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--order" ) + Mthd::Aux::toString( bbGetInputorder( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MultiplyImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MultiplyImages::bbUserSetDefaultValues ( ) { + } + + void MultiplyImages::bbUserInitializeProcessing ( ) { + } + + void MultiplyImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h new file mode 100644 index 0000000..4b41b7e --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerMultiplyImages_h_INCLUDED__ +#define __bbSlicerMultiplyImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MultiplyImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MultiplyImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( inputVolume2 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( order , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MultiplyImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MultiplyImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Multiplies two images. Although all image types are supported on input, only signed types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MultiplyImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(MultiplyImages , inputVolume2 , "inputVolume2" , std::string, ""); +BBTK_INPUT(MultiplyImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(MultiplyImages , order , "order" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MultiplyImages ) ; +} + +#endif // __bbSlicerMultiplyImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx new file mode 100644 index 0000000..ad000d5 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerOrientImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, OrientImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( OrientImages, bbtk::AtomicBlackBox ); + + void OrientImages::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libOrientImageLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-o" ) + Mthd::Aux::toString( bbGetInputorientation( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void OrientImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void OrientImages::bbUserSetDefaultValues ( ) { + } + + void OrientImages::bbUserInitializeProcessing ( ) { + } + + void OrientImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOrientImages.h b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.h new file mode 100644 index 0000000..aa56ba3 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerOrientImages_h_INCLUDED__ +#define __bbSlicerOrientImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT OrientImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( OrientImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( orientation , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( OrientImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "OrientImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Orients an output volume. Rearranges the slices in a volume according to the selected orientation. The slices are not interpolated. They are just reordered and/or permuted. The resulting volume will cover the original volume. NOTE: since Slicer takes into account the orientation of a volume, the re-oriented volume will not show any difference from the original volume, To see the difference, save the volume and display it with a system that either ignores the orientation of the image (e.g. Paraview) or displays individual images." ) ; + BBTK_CATEGORY ( "Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(OrientImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(OrientImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(OrientImages , orientation , "orientation" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( OrientImages ) ; +} + +#endif // __bbSlicerOrientImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.cxx b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.cxx new file mode 100644 index 0000000..7b0ad99 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.cxx @@ -0,0 +1,60 @@ +#include "bbSlicerOtsuThresholdSegmentation.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, OtsuThresholdSegmentation ) + BBTK_BLACK_BOX_IMPLEMENTATION ( OtsuThresholdSegmentation, bbtk::AtomicBlackBox ); + + void OtsuThresholdSegmentation::Process ( ) { + + // GENERATED + +int _argc =6; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libOtsuThresholdSegmentationLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--brightObjects" ) + Mthd::Aux::toString( bbGetInputbrightObjects( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numberOfBins" ) + Mthd::Aux::toString( bbGetInputnumberOfBins( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--faceConnected" ) + Mthd::Aux::toString( bbGetInputfaceConnected( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--minimumObjectSize" ) + Mthd::Aux::toString( bbGetInputminimumObjectSize( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void OtsuThresholdSegmentation::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void OtsuThresholdSegmentation::bbUserSetDefaultValues ( ) { + } + + void OtsuThresholdSegmentation::bbUserInitializeProcessing ( ) { + } + + void OtsuThresholdSegmentation::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.h b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.h new file mode 100644 index 0000000..f05b8f9 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.h @@ -0,0 +1,68 @@ +#ifndef __bbSlicerOtsuThresholdSegmentation_h_INCLUDED__ +#define __bbSlicerOtsuThresholdSegmentation_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT OtsuThresholdSegmentation + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( OtsuThresholdSegmentation , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( brightObjects , bool ); +BBTK_DECLARE_INPUT ( numberOfBins , int ); +BBTK_DECLARE_INPUT ( faceConnected , bool ); +BBTK_DECLARE_INPUT ( minimumObjectSize , int ); +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( OtsuThresholdSegmentation , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "OtsuThresholdSegmentation" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "This filter creates a labeled image from a grayscale image. First, it calculates an optimal threshold that separates the image into foreground and background. This threshold separates those two classes so that their intra-class variance is minimal (see http://en.wikipedia.org/wiki/Otsu%27s_method). Then the filter runs a connected component algorithm to generate unique labels for each connected region of the foreground. Finally, the resulting image is relabeled to provide consecutive numbering." ) ; + BBTK_CATEGORY ( "Legacy.Segmentation" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(OtsuThresholdSegmentation , brightObjects , "brightObjects" , bool, ""); +BBTK_INPUT(OtsuThresholdSegmentation , numberOfBins , "numberOfBins" , int, ""); +BBTK_INPUT(OtsuThresholdSegmentation , faceConnected , "faceConnected" , bool, ""); +BBTK_INPUT(OtsuThresholdSegmentation , minimumObjectSize , "minimumObjectSize" , int, ""); +BBTK_INPUT(OtsuThresholdSegmentation , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(OtsuThresholdSegmentation , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( OtsuThresholdSegmentation ) ; +} + +#endif // __bbSlicerOtsuThresholdSegmentation_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.cxx b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.cxx new file mode 100644 index 0000000..c5d57d7 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerPolyDataToLabelMap.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, PolyDataToLabelMap ) + BBTK_BLACK_BOX_IMPLEMENTATION ( PolyDataToLabelMap, bbtk::AtomicBlackBox ); + + void PolyDataToLabelMap::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libPolyDataToLabelmapLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--distance" ) + Mthd::Aux::toString( bbGetInputsampleDistance( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputsurface( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void PolyDataToLabelMap::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void PolyDataToLabelMap::bbUserSetDefaultValues ( ) { + } + + void PolyDataToLabelMap::bbUserInitializeProcessing ( ) { + } + + void PolyDataToLabelMap::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.h b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.h new file mode 100644 index 0000000..b35d201 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerPolyDataToLabelMap_h_INCLUDED__ +#define __bbSlicerPolyDataToLabelMap_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT PolyDataToLabelMap + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( PolyDataToLabelMap , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( sampleDistance , float ); +BBTK_DECLARE_INPUT ( InputVolume , std::string ); +BBTK_DECLARE_INPUT ( surface , std::string ); +BBTK_DECLARE_INPUT ( OutputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( PolyDataToLabelMap , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "PolyDataToLabelMap" ) ; + BBTK_AUTHOR ( "Nicole Aucoin BWH, Xiaodong Tao, GE" ) ; + BBTK_DESCRIPTION ( "Intersects an input model with an reference volume and produces an output label map." ) ; + BBTK_CATEGORY ( "Surface Models" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(PolyDataToLabelMap , sampleDistance , "sampleDistance" , float, ""); +BBTK_INPUT(PolyDataToLabelMap , InputVolume , "InputVolume" , std::string, ""); +BBTK_INPUT(PolyDataToLabelMap , surface , "surface" , std::string, ""); +BBTK_INPUT(PolyDataToLabelMap , OutputVolume , "OutputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( PolyDataToLabelMap ) ; +} + +#endif // __bbSlicerPolyDataToLabelMap_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.cxx b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.cxx new file mode 100644 index 0000000..9c4da33 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.cxx @@ -0,0 +1,62 @@ +#include "bbSlicerRobustStatisticsSegmentation.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, RobustStatisticsSegmentation ) + BBTK_BLACK_BOX_IMPLEMENTATION ( RobustStatisticsSegmentation, bbtk::AtomicBlackBox ); + + void RobustStatisticsSegmentation::Process ( ) { + + // GENERATED + +int _argc =8; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libRobustStatSegmenterLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-v" ) + Mthd::Aux::toString( bbGetInputexpectedVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--intensityHomogeneity" ) + Mthd::Aux::toString( bbGetInputintensityHomogeneity( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-c" ) + Mthd::Aux::toString( bbGetInputcurvatureWeight( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--labelValue" ) + Mthd::Aux::toString( bbGetInputlabelValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--maxRunningTime" ) + Mthd::Aux::toString( bbGetInputmaxRunningTime( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoriginalImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputlabelImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputsegmentedImageFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void RobustStatisticsSegmentation::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void RobustStatisticsSegmentation::bbUserSetDefaultValues ( ) { + } + + void RobustStatisticsSegmentation::bbUserInitializeProcessing ( ) { + } + + void RobustStatisticsSegmentation::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.h b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.h new file mode 100644 index 0000000..404a527 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.h @@ -0,0 +1,72 @@ +#ifndef __bbSlicerRobustStatisticsSegmentation_h_INCLUDED__ +#define __bbSlicerRobustStatisticsSegmentation_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT RobustStatisticsSegmentation + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( RobustStatisticsSegmentation , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( expectedVolume , double ); +BBTK_DECLARE_INPUT ( intensityHomogeneity , double ); +BBTK_DECLARE_INPUT ( curvatureWeight , double ); +BBTK_DECLARE_INPUT ( labelValue , int ); +BBTK_DECLARE_INPUT ( maxRunningTime , double ); +BBTK_DECLARE_INPUT ( originalImageFileName , std::string ); +BBTK_DECLARE_INPUT ( labelImageFileName , std::string ); +BBTK_DECLARE_INPUT ( segmentedImageFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( RobustStatisticsSegmentation , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "RobustStatisticsSegmentation" ) ; + BBTK_AUTHOR ( "Yi Gao, Allen Tannenbaum, Ron Kikinis" ) ; + BBTK_DESCRIPTION ( "Active contour segmentation using robust statistic." ) ; + BBTK_CATEGORY ( "Segmentation.Specialized" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(RobustStatisticsSegmentation , expectedVolume , "expectedVolume" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , intensityHomogeneity , "intensityHomogeneity" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , curvatureWeight , "curvatureWeight" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , labelValue , "labelValue" , int, ""); +BBTK_INPUT(RobustStatisticsSegmentation , maxRunningTime , "maxRunningTime" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , originalImageFileName , "originalImageFileName" , std::string, ""); +BBTK_INPUT(RobustStatisticsSegmentation , labelImageFileName , "labelImageFileName" , std::string, ""); +BBTK_INPUT(RobustStatisticsSegmentation , segmentedImageFileName , "segmentedImageFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( RobustStatisticsSegmentation ) ; +} + +#endif // __bbSlicerRobustStatisticsSegmentation_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx new file mode 100644 index 0000000..11b5ec4 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx @@ -0,0 +1,56 @@ +#include "bbSlicerSimpleIOTest.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, SimpleIOTest ) + BBTK_BLACK_BOX_IMPLEMENTATION ( SimpleIOTest, bbtk::AtomicBlackBox ); + + void SimpleIOTest::Process ( ) { + + // GENERATED + +int _argc =2; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libDiffusionTensorTestLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void SimpleIOTest::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void SimpleIOTest::bbUserSetDefaultValues ( ) { + } + + void SimpleIOTest::bbUserInitializeProcessing ( ) { + } + + void SimpleIOTest::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h new file mode 100644 index 0000000..d0d353a --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h @@ -0,0 +1,60 @@ +#ifndef __bbSlicerSimpleIOTest_h_INCLUDED__ +#define __bbSlicerSimpleIOTest_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT SimpleIOTest + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( SimpleIOTest , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( SimpleIOTest , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "SimpleIOTest" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Simple test of tensor IO" ) ; + BBTK_CATEGORY ( "Legacy.Work in Progress.Diffusion Tensor.Test" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(SimpleIOTest , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(SimpleIOTest , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( SimpleIOTest ) ; +} + +#endif // __bbSlicerSimpleIOTest_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.cxx new file mode 100644 index 0000000..61efd45 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerSubtractImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, SubtractImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( SubtractImages, bbtk::AtomicBlackBox ); + + void SubtractImages::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libSubtractLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--order" ) + Mthd::Aux::toString( bbGetInputorder( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void SubtractImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void SubtractImages::bbUserSetDefaultValues ( ) { + } + + void SubtractImages::bbUserInitializeProcessing ( ) { + } + + void SubtractImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h new file mode 100644 index 0000000..2a53b19 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerSubtractImages_h_INCLUDED__ +#define __bbSlicerSubtractImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT SubtractImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( SubtractImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( inputVolume2 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( order , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( SubtractImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "SubtractImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Subtracts two images. Although all image types are supported on input, only sugned types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(SubtractImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(SubtractImages , inputVolume2 , "inputVolume2" , std::string, ""); +BBTK_INPUT(SubtractImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(SubtractImages , order , "order" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( SubtractImages ) ; +} + +#endif // __bbSlicerSubtractImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.cxx b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.cxx new file mode 100644 index 0000000..b9a81fe --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerTestGridTransformregistration.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, TestGridTransformregistration ) + BBTK_BLACK_BOX_IMPLEMENTATION ( TestGridTransformregistration, bbtk::AtomicBlackBox ); + + void TestGridTransformregistration::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libTestGridTransformRegistrationLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-g" ) + Mthd::Aux::toString( bbGetInputgridSize( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputtransform" ) + Mthd::Aux::toString( bbGetInputOutputTransform( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputFixedImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputMovingImageFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void TestGridTransformregistration::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void TestGridTransformregistration::bbUserSetDefaultValues ( ) { + } + + void TestGridTransformregistration::bbUserInitializeProcessing ( ) { + } + + void TestGridTransformregistration::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.h b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.h new file mode 100644 index 0000000..e7e7d54 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerTestGridTransformregistration_h_INCLUDED__ +#define __bbSlicerTestGridTransformregistration_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT TestGridTransformregistration + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( TestGridTransformregistration , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( gridSize , int ); +BBTK_DECLARE_INPUT ( OutputTransform , std::string ); +BBTK_DECLARE_INPUT ( FixedImageFileName , std::string ); +BBTK_DECLARE_INPUT ( MovingImageFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( TestGridTransformregistration , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "TestGridTransformregistration" ) ; + BBTK_AUTHOR ( "Yinglin Lee" ) ; + BBTK_DESCRIPTION ( "Generates a GridTransform to test the communication facilities" ) ; + BBTK_CATEGORY ( "Legacy.Registration" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(TestGridTransformregistration , gridSize , "gridSize" , int, ""); +BBTK_INPUT(TestGridTransformregistration , OutputTransform , "OutputTransform" , std::string, ""); +BBTK_INPUT(TestGridTransformregistration , FixedImageFileName , "FixedImageFileName" , std::string, ""); +BBTK_INPUT(TestGridTransformregistration , MovingImageFileName , "MovingImageFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( TestGridTransformregistration ) ; +} + +#endif // __bbSlicerTestGridTransformregistration_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.cxx b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.cxx new file mode 100644 index 0000000..611ce07 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.cxx @@ -0,0 +1,61 @@ +#include "bbSlicerThresholdImage.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, ThresholdImage ) + BBTK_BLACK_BOX_IMPLEMENTATION ( ThresholdImage, bbtk::AtomicBlackBox ); + + void ThresholdImage::Process ( ) { + + // GENERATED + +int _argc =7; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libThresholdLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-t" ) + Mthd::Aux::toString( bbGetInputThresholdValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-l" ) + Mthd::Aux::toString( bbGetInputLower( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-u" ) + Mthd::Aux::toString( bbGetInputUpper( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-v" ) + Mthd::Aux::toString( bbGetInputOutsideValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--thresholdtype" ) + Mthd::Aux::toString( bbGetInputThresholdType( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void ThresholdImage::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void ThresholdImage::bbUserSetDefaultValues ( ) { + } + + void ThresholdImage::bbUserInitializeProcessing ( ) { + } + + void ThresholdImage::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h new file mode 100644 index 0000000..622007f --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h @@ -0,0 +1,70 @@ +#ifndef __bbSlicerThresholdImage_h_INCLUDED__ +#define __bbSlicerThresholdImage_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT ThresholdImage + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( ThresholdImage , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputVolume , std::string ); +BBTK_DECLARE_INPUT ( OutputVolume , std::string ); +BBTK_DECLARE_INPUT ( ThresholdValue , int ); +BBTK_DECLARE_INPUT ( Lower , int ); +BBTK_DECLARE_INPUT ( Upper , int ); +BBTK_DECLARE_INPUT ( OutsideValue , int ); +BBTK_DECLARE_INPUT ( ThresholdType , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( ThresholdImage , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "ThresholdImage" ) ; + BBTK_AUTHOR ( "Nicole Aucoin, BWH (Ron Kikinis, BWH)" ) ; + BBTK_DESCRIPTION ( "

Threshold an image.

Set image values to a user-specified outside value if they are below, above, or between simple threshold values.

ThresholdAbove: The values greater than or equal to the threshold value are set to OutsideValue.

ThresholdBelow: The values less than or equal to the threshold value are set to OutsideValue.

ThresholdOutside: The values outside the range Lower-Upper are set to OutsideValue.

Although all image types are supported on input, only signed types are produced.

" ) ; + BBTK_CATEGORY ( "Filtering" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(ThresholdImage , InputVolume , "InputVolume" , std::string, ""); +BBTK_INPUT(ThresholdImage , OutputVolume , "OutputVolume" , std::string, ""); +BBTK_INPUT(ThresholdImage , ThresholdValue , "ThresholdValue" , int, ""); +BBTK_INPUT(ThresholdImage , Lower , "Lower" , int, ""); +BBTK_INPUT(ThresholdImage , Upper , "Upper" , int, ""); +BBTK_INPUT(ThresholdImage , OutsideValue , "OutsideValue" , int, ""); +BBTK_INPUT(ThresholdImage , ThresholdType , "ThresholdType" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( ThresholdImage ) ; +} + +#endif // __bbSlicerThresholdImage_h_INCLUDED__ + + -- 2.50.0