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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 E|C3X1VgLXD literal 183304 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 X4{A>b4NoFjCSct&y>abp)TRF~cxD$? 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.45.0