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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%0AS@KRi06xjL_n}3N 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%0D@Qs{we?s!<{_xlnvirSP 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 b6%%ecYERa$MSg>6UB|1M>?Xz0RKxi{lT&YE literal 183304 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

2|@4i`EPqOME3V}(y88l$(uL{>Pon? z+h31l^UHK{e}{rU6Baj z?&Xn0FOv#+eEu%MqML$6A1g$OG){ND9xi%UP4vKuP+yN|^HnP%+Wb~&-Jk%oMyi9q zhk_KE&95V!RGU9drICH*!U%#-7W5vUKW)WX+59Bdh-C9rY26^vPratO`5Q=~iT*HY zrHbA}rIAH1ULJ1qm4e>m^H;thY#w@FV$kdIjs@QT>>qS9f7BLR?I`?3zg_e-ba8v= zW0cpEwpy%EiKj@&MQ=dqBQWp?2KeKKjNiIggKHJ-$-y75ViV%` z5aiDXqU4cJ&peK&XI!raot{A)D!%PisbARX8Ty$>o2Rtvt{hKs*Cv~{$FCP#A;)|1 zQOrE0UHv&8ch}||&plmRY@XY?Hll%YE;~5H^H;X#ciV@5nX)}!`+r!*n62g~_xb7H z;_u()cuwVbejn~RK7_U3W2@e1unjokJZ!7It*gaWTiP`>r?$9j$DG>IuGXAdch_z? zwfA&Q!{12Um~vqiz8Lgt@XuF@`x^X*E+<`V1zU9sbDy_<;rru3{7&T&3v0C1ny{eq zXYq@a{I@av40`~7r5Aq_p8xv$upy%_9c#TlH*2&tCwu6aA!BaNu)?(t_qb6xVIOEg zc{qK}^+SeR^KKqB^!gm@rBSFetiU;BmAReMbIVK0+>z^tQeA2Vh=;;L{>2{p)J)G} z{NN0Ja6KY^5?H}L8j~IDLonIFJ{*%B?87kGf%vGkq30y%iR^|B9XrxKJZo6akTF^I z?9sXTW3An+VC`-N>tzGuc`>28K^N$5?a~FY_H;~ku=mDf2mDk|M#hlJX&D*%Z}oJu z2AA+J^>nj#fgaEW8?atsg&zD@xr10p!otF99d7!l26VGtX1xromvxT^dsbG~=+UD| zyYBIND88i3ZM7FTCl*<+hJo?mau;W0@UO2~OG^r^S6jP4mx1wsUpcp4PLxw`wcc*M z+IqJYtTR!wKA7y#!)5JFKl2^@VWr^?*JO8jMX#)B6%JNnuY{IZUMwtY>5de*i|vpEjKTTDHs$olOHDHv!xU0L8B| zwo3uH={3gi;|3#_GuABzpy%t1<;DQqv4Sx?-uKrE#+JnZ%wNgat{8x~-e$}a3sC+p zWBp?Ru366*{z7%i`;0Zj0<`xr)*K6vv4ydY7JxmCj7_rujN8Q+ew<+8F2<}W0I%<2 zY^4dnw~Mhx6TqHbj5V784((zr)eO+Qi?LiYK=-|jO)~?G*~{2MGeGfP#_)K=)V+-D zG6T%r%UFvU;HkZgbyNVB?`5pN0#Lt~v2hB(Hmt7z?8W*DKr_}?0F2)=wlEf80louh z0Z87@*kTL7o%gaL{eiKxIDpz87#kM{kamEvsyKi<4luSj z4&a3Yj5Wjo>^Z<#Qyf71gN)%v9i|;*tXn+5o`a0##smC*kg8^$=rg z;{g^QVr*ADz`8?>wZsDq{*f_j0zl4>jAbSOO#P9u@d*I4e`KsG0pN`v8C#qHu>VKK z8WI4`@iW$x0Fdct3_rHv_A_Qp1X$>2EHe>cm7lTki2&yW7^_MINDDBwI1!*Yz*s{f zz=HwCni2t)1Q>%PfL#H`tVsZW1sKar0_bv>vGGX&_}d>wnl?*Wc2xE(r0cIRwtRWfT z=_8CaB?GKI!dPYsK+aLd@R!G%jxshs1;F_eV{20YVvaG^lmhV7F~%&Z0BOe=OG^dV ze4MdysQ}}e8LLVKINHqEvQ&V3e`c&P6`<`ejJ2c!Ed7NsYa4)_zc7~B24McLjNvbs zUw4AB`E3BqzcIG94M4+hj5W0ZxaW7qENub$|G`*VTYwXPFgC6&!15Nxs@eifI?33w zwg7m3xUnt3o>Ppqv<3M66k{FR0W3JpSY|tbou?Ta-wptON4lyV0RF!9GVw7D`RxqD zj4@!CmTKsn7;Bkt0Qx2c{#f~MUouADvlx<`I&6+HDJDNL7Ju9o%kamnkAKM+@sQ=$ zYvuUh;=q@T(f37Ud6rgw4*-1DN;xLOjNBZOEY{R8JQGY(KKvnb{J-!^#s(??=CLa> z)iw&MO{NYCHH2~=0D$G+Fh<{(ka84ga+nPOtG;23zB?kzM``6<4FF48DIabCSkOv& zu>oLiE9J8d05e)CUt$0#ZKZsZ0pLI1Fh<{Hk@9D2@*gk&vcT=^=xGR|MPXj>brHuUm0Oo(K z)cUo&+GJe8X{rB>06Uj5HpmEI?yI94Rc(IAWV+m#7;C{FoX;@=9A3uQW5{o^j_x|7 zGu|AZ7;70KK6Zoj_ZR_2y&~wV&Prw6}-qiF%`c;N7`a}~zuT_jS8UW0(t2BC&-xRN}f$|SB0erq%(C4*IPyJ#7DEykS z$I(8|>FCE+o9+_QAYYunuU*5K5)WWrtE0Q2I_4q8Yo2E^{T(Cdk?$rG!1*6Ab_vSe z<1J0@qH2@z04GGgM@;~o8W?-Q0$?7lqvQQ}qvVMR>CZO26Yc#$$R+~(* zdTVgM%P|AowuP~KVgbxMbo9oXt4*d0V$q{eUbh)w!Z(Z+p&gFDt?|vRHo1jf7*F~t z0MCEJ7=2Gh`n!YsC6

0ABlsG5S7@EHBdhc8?k0E!hr>+z!fPRsfEF!x*j!%_;9_ z@^HVUNQ`vd6@V*tGqwcjE)1iq!f7Nc+~V;(GQtAx{!W&F9u-tw~^;3Y;SlB zz`frxhR@y2xjH`gRGV(n^`|)&V9U4B<7d}cfVaP8jJ_)*?NY4SWq2$=Lo0G@ivd{o zEo0Rv$89<}jH6URuzwzk1vqC|Hpnog%AF=@C>|qT1PUUac_%F8rw z-)O&W7J%#aaKBOO8~;NL$p0+>^IEB&7zZ%7HT~lNp4r0~eZNZTKVFkB2iM}Q@Glkh zquKYNIDnO{@W;37*0fT-Ee>Ga9>(Z9T~fZ=HTjOl0le3We2MV@Z|{k|Uh9r~g;x0I z#B=?l=~sFN{tumj|8l{fzDFhXb87l+iwAhOmHs;#5Aazl`Xwd+tZl_U-4g&-?O}|* zk0#r{O=~|V0bq42^-B`~a|%+1%0uuyXb7D{|?&zuO*BIyoAr|X^wFyVW~9zlMmL+FY%eq$2>8ow9v zrLNWHQ?#E>k9!gU1~mzO7l+X4_$^5Uz+af6byG$NosQqOM1Z#Y1l{$K=_vju0o=Qf zG5TJd?0;LesW36tLj9ivFmE4Yc-Pomtm9*^HtFp)CC0bEz!~G_+h^mrvU8vG4i~H{W?1ZU?<*F(a(FfYLoFXKK3yopXDh4qw$`K zo=z7(wxs}+`J=~=qbUHB{ET_9{tXW)b7JhtnIo!WA2!Z2dCkT#$rhmd0qs)(8vTsv zziWz#F~cUq#mW&gT&3KvK(_Lv0=FtF6_}#<6u3{>tH2`$*W=(fld>TWYRt;l zaZqPgj>f@DW@T19tT8JK;^8A)Pp^nqNRf7Z6o9ycs*``c@rO1*oLz^DTbQq*e0-G`&<_TUA zk$)KmDBs4xElPbH+>J6nW>B7qgSQL{v%tp&)N8*%`OX3@24$NCW*hN(z7g@y7?I{J zBhoh*vFQxj*puZfVC#&&3O32q&yps#_+_$JhSp!96W2r>*Z#|uQwyjPV;2| zixg!+0=%Or_b0%&igGL-PAJOmc&LuS>qlb{|9lM6yccsB!0cG%bOJmZtNfS%AI2&> z5@2_%@<9Rw=(>gQ4_J`q1xqJ@<~Rl5E425z1O?!^L~g6n0m@ruxJ8*`hP#ymCN#hX z6Fg^7c9`HbgYugRHX4){&1i<_6{t2UvlTS|uVz$zzZpI?DxaBQ4_*5Se}ZTpGIe@h zf!EOtTd`Z-R(N~1o=U9=u2;S@!W3n_5o!#|lSXvZSB>zjLD^3o%N48)%48UTp(=W0VDL z;8cuqe;ZgBs~k&(w_}yvsjxj(*_;Z^vC67cm}5~Er9zzrua{U5zuJN{8!Slwg$3(2 zS&+|h3-bKig8aR4*w!;~DCcW&%BePRFmA-wcJOh$@@ZT6Azpd6Ej*B*ywnyJCn%4! zg%xyNpMdyJ6OhKA(0OY+cp*`Fr5&tKRO;Hn_le4^cF>Zj{L~g6NW$v{Nr-l=K|c-;~^st19I#6REH#PWdPWj>P?| zDHWcNSN5d9%J^>EQsLKlWo;@vk)SM0g_Q})>{Mt>P?}TVd%8YGcuykIEKF3krNYaJ zN>eJlov55hg^v=k#V-=m0iJEc?NroBdBF&mEAJQ~1BcXg%0469qWo@zJ8<;PP!^lu zL4&f!1Wy^1k4^BZLHXVU>kP^X6GlCc8Fm|#MP@i`P*$7altI~Ih6jzxcV<|CJ@Jc( zvribODVyVAu|a7}hI)hYLp*#+*S{H*7ZPB$@uE}lu)?U!OTaMkUNZb?Z2x33JY`a9 zl3}$;`8f%8n3PWw;HXJ?Hvvx5^@HXMeolgoW~C(o_L!9e32=n2PZ55#qP&<0+Z5&D zM2wLyCc7R*FK1+l(G0M6`*hJSmVi5mOta36DUW!!?Cc;~Ey)hQ?zr~_6JZVv$ zPl8nz#hU~l(siQ+@!wmJ=8-t%yCiruPT86S@6z>_IFxx$9Lj$rPI)pJJn^X4!g#d6 z%khH%{K>ov64RAzxLN`DPZapy3P3+)5ajamB)o0Zf9O3hU&NhIf>4H*Ol2HQ;gu~n zC?#+&zixAh0&sPwsZgMRHu*(FUZ4OB>Qo8i6#%cCCXsS*r@Np~7Xu?BFI51p=`;Ek;>Q`w zJ1YPKIzMB8Ta{V^+@U;Ufawb0dO)i`u=64V+^%>HP^v64z}+~xoozX)H>mS-2KbLM z&j3@D=L~R<0`QKkf2Q(_&`CN!ZGc;p2Mti7JZ%7cq`6ww?}CPIMZW(x_5W}Bzv=&` z|9>a^lsBesZhjtQ!V^4~Nfa{)%Y?tigef%73Bf1h7s7RPT|(etA#h#@Jc@3%Y3&`BIU;E%MDG-zoA#BL7|FF+)ZBBELlBSBiXu$Zr(+1d&e_ z`5cii5cyJ(zb*33BHt+q75N;IFA(`sk-shS z%_83^@&`BIU;E%MDG-zoA#BL7|F zFR834FRz;Z;E3RsT#sUdKcfbmodruU|EiRttT0PGhqomK&W6CrTS3{Ef0 zJBGlQhrokE;L!r6((T^_UjTnGY?+93)l8ULMEETY{cVkGoc{b;dccw9Q6R?zbsDNdEEDb4d5U_0jgn;R( zDFAe;;ru1Pz5=_0n<}XJXIiI$?uqe<@jm|q3<+@w=dfpEnrDMPQa4? z3<1+qM*w&;r2e6h`pp8C^29&D+oPw3=-&dC<)H~rxENun2Sj|a3Hm3Wu}6UGBUG)>nWyWIo*CDsq-o zxJ$~*atoX;hchE1?EE?}ptHPD$}%$UjZy+xcgm)63!DX09BynvP^%c2d{$JCM54OZ z;U1QoJ9c`713rvWKDuCv1CB;1%qcIMIHI&*BAn}tAnCOZHx&*IFTB=SURjZW6sjIB zn4;3@EK5Yg3fzu~<<9BwY*do5CGJuOY>8T~V+p@Tr5aXV=6048R=UfbaDhweq^lb& zGpXT%Y!|>phdZnrVZRH&G0jm_>2|;ZH-M{PDxM2>K(ia5w7j60fIBKVK(7l7Eiax9 z^Yj>-qoCN~gjJOQl@-MWZpYB_X*!AEl)iwv>&B@h53h(#5cUO*#RgPd%3V@NwI4*+ zgt{4_q2FCPA?Pgu7qGjiwb7MR3LVbtCk$~;tfW)=@a8m0oa-zva=2Wh9PUZw#jtI< zY*eR)>exCQ{4yP2Nc;VPNo0QcF^7P#S!)+r^!y=NpVa6`v?|2G!fDEUP0BdMu$vXuKo zv-TV54G()^fy)uiJHtFIsu!alOO7Q|DoQgl?$v{E^Z&VK)rL?LxbOd5L-tYji4M1Y zY=vDNansdPL*qQCkJ3{x{)pnu?N7ch62SDO!#BKhR$An0ZFFpoWrYfrC~EDiv&y6{YTX^rOl;lM+yFy z4~AKiR+Tf|?Z;HUQsxkzmk)-aHKBTi(C{HU7#7q3 z*zFU`D)EiljEpkJU0U3aSZ8oXhE5ikBid2bj#f!$nCs@W(qjv&&uZ%=zwd#N4vr#uhzOSt zh7JE+P3bUQ=bpX7d;$p5`ntIxvPbW9xG#)0M5Dp*)|p7S7;vj6NOHTqta6IOSyCi! zG1yDW+>VJ3=b+N^vWeD`GBh&wTMJGQ*wEGxMtl{?*Pi)hqE|6R?3X>|W+I^Ds>yG6Ev z0N?b1NN>$U=f08gw@1M*ih^&7g74BVGXLTz_@z1h4hU7s-g%!FL>nbYKx&QzR>o;zX9%+4^MOnf6pJ2@jxa(N*%szZn7vB zmjf8vT>+4?V>Dr6GbR9-UG8GALVW^&lG-O7FzY)E0AjW$0(44`ed}fb1D<=g*vD4D zm-w_^X*1#BRLmx>rEGFR8-z-$D4Vi~va&Ulm2ac$&KAnt9oi!0)E<;gzmBpQ6Dhmf zL)pyND7*JF%BuEIHmjMk``fm|>eYQHn?07YIi-|6Fpsj2_mN1SrX?a}<4DTBc#X<- zY@zJSi`rw^SKkw~6CW=sZN46kS=(VhoP(M7VagspM%nzBa}oJSSIQn8LD^$Pls#TW zS>3agEm%+46W>s_@Mp@NWRyL1X-DMp^k~YSxs$SI7g4roJ!Ok`Q1-&_l)c#gJgl%J zowB7jQ})W;lr4XOvNtwSwsIe3tNx~JwY3x0dutG7YsOLbwwtnd=2NzIIc4w8?u?Y{ zo}q00`;@)6m$LU6W%c;^ai#4CHp)JnOxeb{lx=#IvX8b=w)q%kzLbAqg)Ns-wl$lw zk0(?1iI=i%D=7PP3uT|}qwI6T1z4}K3uRvnrEGiA1pskv;|(6l6AVi!Pc&?~03iN{ zfdB@j-Bm}e07|?5*+;zH&K`+qY$-0S;dP(DwaY0OSPiUcDZ`(C)6j z00!gEO90wmgRc;_-<$woHdgF60d(j#4ZzUB83SPKF!3$`bB84(04yES`T?YNcxe)V zwL`Z&fT}7p#J+G1fFauqaL%~y$g_j-+z0XjjOQD32LX6cHk0ApKRW{$|7G0o2DmVl zP#q0OZ|rC^q?rLya|YnCoD{=Nh&<0|;E4Z+vhM(oqsY2F)uWMmWJ#W}EL$3D6f9dB z%aY}QEz3CLoO8fQ4#ILa&c>0PgWw0u64pxw18bteB$HY40t+lGX?F>`EICKN@7${D z?vcFzdr#k|>8`rx-nw-khyh>xAe4hE!5YZevJz1H(o78@dnj8?8waTAVW8laB#`fp9U2C*+YHm@kKcGa z;EwCAgYkD70C&6&xpD5bbSLOgw1XnQJ4v}=Ao{0a%z%lTrnn4O$HiWxs7*D1JMzI{ z-1MXNB>|;0+2&lTFe)gIklG+)8I8Iw9MIk;=8hl2=X?HQKxM2O&mv`kFAU*QqYJA6 z)j!?OW|wpzd)|bUY;My*lT976+0-FFo1ZgFZCR@PZ04rhxLACmmrZwKFq^`Xl1(Zo zIiWVl_$(7pv(rsBQ;E4NS1_BC2lI7mH}1_@K)Bu1!*ZF?VKzf^d&yro zo`U>bdt+){pGTBs$3dZ$Yt4ia#_A#E~}rH%bIWGa(ug` zWM9`;F6-;%vT=)CHeDc>%~#1~%RO@0@r+z{zAu+uzslvrSRz~BE#i~n1j)*H#yUKvbpvZ-B zQ}YctB2XSEE9lr4#{e-NOoSrUIRZqMMCx6`yY>Hr_mOlU@{2pZ8d80zyZ=9VGw*g- z#jxs8U;bZssjeuFBAxE*?p>=4Z*}I84AU&X%ruJC8H<2cO&g{Gs-A4u&H?uI3Dk2j zhV;+PyM$$PKeEg`7El*i7M2UCH(6)I7}7t_@NmFl)xMZ4?OEAAX<1logoQ6qj3NCq z`$SbQ*b@#%otXz5;FQLGx$NT-uib+M&;8H3YmFpz)p328vd zeT6{IfV&C-0+lKqQwijZ<{>Q#9S??pg5f-cE1X@yM-zc z@eXBb$+As|?Z5qafI`&@OVadkn;&(H%P}pkkhHj3-RuJD5^l<-T5L}s_m`fm7F*Lk ztuPQ!_gFeVJZN-!}fI7~yv789ow)s5v=1rDm zsS;V$`2>WN8!H4tPR1!|KqxI^&~fZoW%TAnrRNGQym~XxIW5eyCPQwxWDU?UtsM~W z`)oE)9uLK283{ZaPAe2+A&5QCCtR$OD}e0z zY)7iU`v_@lOIb;%$GQR8iyrC?d_hfq^AbX_>OBF-ZtUL;Q2ekM`NAz)bX5&)*v4PQ zk9dFzBwZG}q&uQDP{rG7iKv!{r2Ce{EGCh+Nq4oqt=!0EmRU2u3qF@@g4m0Y2b48i z9?*TWfUJ2mmvbj?=ToH)s{48%t3f?UeJO;^I*D7V-u2>QztD)?RALK|wMuEAZKfn$ ze#xp`Ckj;YHk1}Vdl#k#19Z+;KAaPi@80LK90 zwN*gj5=J{^=((<86$%@4C=ETLg)4sRrYjl^TuC7waFq_Z1aAJd8;}{Z61T9n@_<`) z$c6LXd?3+95_l~GNSrGoP8bFx&f{$_KIEfgz)>t$A@rWI6e#@A85yI=#>ap@WahYq zlucbgYt{Xofx>i$G_{pP{vhe@iUED=)VbqPa)GQV{yZz525uNaquLOL6QrC8LdlluUL53m#{ z4i_~C)T#x8fWqhXBj-qxHQxz+fx_k52pn3{6%7w~ux8>*UAWj7!9(y>M6G(2)-MRj z$CV#y`L61ZYn?hc11P*ozRCQ0>m=(`0ZZS@63wr9b6xAywHtuK*Dq#~;dj0zAcN+( zbwFD{@y7=sl$PcsXpr|h0fqbP3E@u=5>2aQ|MHD#Kv9o%ZGo&;rvYyiw^oDN0Xg*< zY&pyGa>|esT>%v5nIRN6XVx^JxSa_`b7l_*irbrDe$JUAf#Q4brO^(*)+^_~Ht~9|7IajR$imOy!jJ#WN-aHN{ z?ygSH20~@KRn9G&f#M$O3JIU2axM!2#XZ%{4Wyr}a#lxx;y&u2gwIepS5w>|#bZoE zWf!QN$7TV=qZHqbP}v@p^J@)IJlcf!s+?y?A7jEds+>PFJl2HwtDH9&9;f)0hRW_$ zIVaP^6GZz^*&&s~-95#V)FDa#aRuk~c|g$+KG%YsgMj=JaNH-pXaGaUr(lYU;$7%|Aux9rNL=60VrL5c{{#BuP*^g7bq&JI09=cys0aJ z(vKX8FJe4@kaSr{Yt?b2riEB#DUQ_Ys)@;IT&=pJ2T=O0=I0=;yt0;9)e|UfrC(|e z?dmsPQm9qS9iViyt}8g;EAdvX(`tayNt(!EU`=F&F%Y$CB&l09m7~L{)M-@uW33Vg zjdg-YtLQAC^fMh_t7dcrN;k<9SEc#(-IcEegGjoxf314?IG}We#&NW{S?#RBwd%2f zK)G8@3j4D)v2`l zBF#FLL@6&)i8F|#J4P%vg1A3w90%B&<7(AK)N_qSaO}OAo?2Y3Iy?#}yf#-76nk&ItI5p-%m46;S%1&^S$yLOX>Szd&Si?jS|x+g*UtANjBpClmsF zwd&$hzUKP-`HIKrJ=hrIkaYhV=V{?_V9JE1=`)wu%^jG|=%39ZHK| zG#%)8rVhFBb+dquXX#K@eCKGO)1kt6 zLj>q}z7Cbd|Go_9cp=*qPFXU3R4LH$B9?HctUGGeLxn(Tp?(USH?j78co|T7x!8&G zD88K}&!|(w(}B`!n26#Gi*GCoNVWn>FA@oyducAAR$VXxD7``_U0!GlfZPS&Mn3R5 z)t%CQm1o1b8$UVJs$sc6=^<&uss@k9J0x8yP^-og@|3h96lZ%hzd&l$4J5W#qAKTr z0;(FsZA84RbgMUo-By?PbO1_USJE=$%#ojfM%1ZWXz52J2b@z1B*HkVty7$KWjT_GH(!Fy zS?ei4>7S$lDFZ|rVV?bK5uo&aCGA+w)A>aE>|1r`=T1pOmNRP25j9Z`nW@hnF9DpL z1%UdT9Xcn@S*0)d3Kgr~90&L=!YROHF%Tm*_DqQkZZ#Ya_0z8jGtfJdWKt}7Z8(W<{z!ZCj!qXarO-ptg`E_AF9YajdqJy03>Z*=3eb zGY?h`YmS3Ts&{J*^AMH6@xUte#3B=;k*Ic=aJBnV2~fq`q}(P=^hb>BuY@`n5$HN6c*(e<fwJA}I8~8!IkkSw$%L>IfTX*nBjDWL8|YNR_ps)qEE#Cxw7EAXYzCTU zH`q}lGte};z>ClWO_!868))iTZxKkky+bT1KXo+YUNv1qfZO)y%lrJVb09J(7g^WT z8W{GM%|N8J>JkRXrPT19lYvOCqG+cKA?M+~K;(E1tH}snWWyD91TV7j2Hrj~6Nqf# zkhin;cp!4Z6}&yb*liqGa~|aF_B|mWa|*{sGjE*2o`?G9NFdTqIXM9B98%Ae0nxow z1BMz`qo-Tyr=)W3LoYtS2(@$s5GhhabAa3XPykP;^#r_>1R|Z(#chENWu$fqQkT{P zk)*2aXQ?B7>PYqJKp;}3-X2K4g``Nr7@^b!u-Qa*TSWzzTfx2w;p*(M>>PtopE*u37IZipngdFEVL}$Jq7^y-mHCxqKN$5-u z!ZIK~7P3PPm`o|Rco3Ei`LU1_RY?XRFM1G`1^Ka%Qx#`#L+UFJA~}*wk5E_70wQOs z7gp`risP-3 zE7aTVfdf*~^3_Y_K;#CccKNu`5}A3sQkQv=dW}p6O}RuC z;)^MEz0YZgyPU{Tz*!_-5ac|u7>JzVjO}eWZw+z^vB`OQzTtc($oUjs!v~#iYjnM! zJ_-`qw2D0Dd|G3OJaE-id_^)t6nWbDV?RSI^@(HE8^eLjUCtK{poWp4YgF$!8%X3I zPPfTiladNSk(##>ht_gX$JAIk1&P%hfzT0Fm+!Nc!9`5yW)WXc5_6y}S~kAEeZ0MH<^heL3Dp zJIcp;6@!6A4u-lF7`0}k!mOZt<@7XycKC>3!3j?RA|HpoS^%iaeTd{OAr0`%uV&{P z84vgXlQp)`Bkj}nR~kJ&PDP|-jo3^_J=@<%YhC4;A(%B0*(>d$4Mt>-R2Ygh;+V9h z!wrI~1ds4ejHm`8E7CsUn#0{bM80^w35qoCvb4AJjJO+otiViGMcg0LP90!iZyW)Z zl3y}pE>++4Gx<%cPE|9QX%YTL+9x(kU5|jZs(zjp>1TA9*$mbqTL`~gZK}?lK2}U% zif`6DAd(+GZmkh{oevXf{6Ue1CBwH>8EH@XFiJCs%+pkt)&}ueD#F6L=I~n(9y!sZ z$Kj6P!wZ^Runpn3&F-ZChD}kGT$xv@=QkL;pLis$pz$S{3&Lwg8kKJSZwx5X*c-y@ zY$NZ8B(MIDybmMPtR#?mqf@-VavVAmhyM^p zs26g9$jf0s05bQqooP|oJzAoQWMCxoW#`d6^Qo@u;eGbR z)SkW=tF9^qGSi(wTtYOHINdJbw+=<>RyMNlPjAx`ptfp*CkaLBBlhE-NPl#MAvOhx z1K7QJF8#S0U@E`Ow*`qD1#1}2K%QYU`@)IMWH`u8rT;;ET~|Qtw3Z##@bZ|*1p#ftwLC4O(<)+fgR(+ zS|}(YmuEatXt2wVfJKpp?Z~*&KD#C#7F6)nbwK3ojLU7x_xiA)1qsU>82YQV%0GQr z3k5~w4H+|RLuPx8A^h@?k**3Cmm_ zS~Azb%DH<&w{cr2C?ZST+8zcw{s>qUX_31^{YwpOgAWTT_ydPJ2D^9XnkBfG`!K(T z(Syd3Dej#WX3+RSAI5wbMCL`ID>fR$zkGxzCN3V4R{02Du3(4AFnH!GAva;Lfi8sxdxi(9Sbrql>-zvzT;!Z|_3!m% z9KzGTk6B{15cO}(-ZCIRa$c)iAbv6XedkjY$9a!sSL^~Ea^rVr0Ffr{fN{#AsG-RG z$i>g~1+ri5BMhqhAr_Ke*Dtf9ecjtn0W$l}o&|8_pHkg#AI~1hIaL5Tl^Ut z3jB>R33We5f9}1x-gMS>*8ST`5qlap8U;7P}2Q5P)#p)+^O+Wlc4?wL>m4mTr5$pX2R4=aY zJ*OEpq55%2{5Ln7Pr2e=S(E1>Y9d<(Yn+esjgFe2^<(ltFJ5SIvp}!fWeG^SANK{S zcw2L|9#|e(X9kwZU9wkg!9))AodJF@bCo24|3JF8Hq zVx+yrfZ`4+{ZiGb+bHf9@~gjk(KTE#tvdAS)z9RW^^eKx&_!P1)vGnRw8oTXo!1Wh zd~>Q!nbn$uM|pXz;ks+pq0hNiGM8E#$zLx681GrJDB(qD$)~Ail7E`#Nv@)#3GFzc z6zb6SXpZ$U5K5>!`frL(Qm4}GMj|O6$j|MPN z9bO59I&yui>~zz0j_dN9LuQ1{K(C{_=fb^sZmxP9Mv37bF6HbPP zf3*ZiuQcKAq2U)&epeIj8yfz@3Lw48ga?O)S5E-at4(-RX!x8qKzcV5o)jAX;&33n z#)M~uhI8M2dUq494-KD0d=C?D3=Myr_?{-bHZ;6$I*{H=aXGtFwk0%tFZ179eLY*R zJPQpU+Yw0bqrP4uOUELi4vO|lFIKDj1JNIs=w~N!CF*o9E++m|i)AP@z2i`B0lKyY zF}8)q-gP{n9`T8MrbwuhX_+q5)&Y!ATx=H2Y|s^DbO^1$a}Cu`Ef`1h5%qfBF^ug7 z1Q<)If%LvNEC*CC#*6+o#XFhz0TYKA#)(13(S<r;UAORpabsGnOfF5^3J zQ@hoMvHhSx9)HRM()T~h{Ub*)KBWM>MUx*mW`tp!6l8pU8IbBK=O$bPTe-@4NZVSdo_#XeO))s)D zgN$oe1L>c2Jb1V)KLW30`N7<>X!$(zQA0n{Z=97sF2qb;pYw5?zU1u+E?dQC4q%9GPhFpGW6 zR8=+(NXu2p%^s+`fJ{P2x@QjsGDq{dR&ocI%07x44!y0_Eq5((ti|kFVvo(+we%L# z{f;l6jT@%E@#12?aOH}(Yboa#3-($Nde_pPR>1AtAXY;}2KTSVIJ@BOTH2lj9w1;Y?wR*@Dhbdp*W6KG?cPH5cw4ZA zpVq9!+_vu&RsdOxWzT)my*rJ-zYtgw25NYEK)ySo2Tw-eF(WB^^y39b0qz;(ampY| zHr!(=D51*N1Ma*>`T=BB)x&{kE$=LC;m=zD9uA;JlQzK6IBw@Q&Y;amgb(>ka> zHUe&=+UmAY^)`w+Sv})Xy|NqQT9&h;BLE(Bpg5bM z71u?oSan_jxaU7GfG^kxkLVY=u)B|9!|p!vhTVNX43i5@5O()5w`>-NSzg|h?PB}{ zR`Isloxoe>ypl&WDE04{|@WES_;6qFXGfHr$8#&g&=q2%m5VbxZ}| zzNj)r0#RzIFj~jGu2iWP89SHWZ4BifN)7iZ@;vs812o1+{8G*LA=i*OUkznaeU;kk zQM|{+$^Y^zE}aJ4Mjd|VA!2utcdSgbxtmpgcJm+fsb1n{_TIf&U7Zfx&SLnc2eZUG z)wmGw0Eyp|_^{+x&)&NasJRmjXWLPpF%0nu_3c!{*@HyQsb}xq7u34`z{?an!RIu@ z*VX6Cfu~4Z5#;3Tz5AYW))>w+f}BG9mwLOW;k+)$$*Fxe&-uq{;BAV1G)QDk>BgNm zwix2OK2gu!yIq{mcn*a#+U8Lkk!8=!&$|PhZwDIwV!~{0InnNpa3QcbD@Nt10zBGqTLV zyB9j|%rhyx-7EzSxYmiRHwpaKOhS>GTm`s)bVhA9B07w*CbGl>&aE2^dtVZ*VKS!x z?!(T4?uK)EkW+|HIZss>&UHaf&VINrJNHZjPGz>w4{{3eHRs>+0WM8fxA>f6WxCw` zz*)GSyT3gyc@x=y>8;%rt;4sQ^jSOdq+|hdyFeeTffwLcjZ5_~9N5WwYn{ zM~{k;>i(X9o1OM$BTK|99wngRH1%9Jp!~5X>k0YpNRW|gAWgDCg}G@>6^~0bh@ab$ zYR^cZyh44nh`?i-0j04qLWOxo&bqXJDg6RDY6WppP_!%={hh8l6+Ix zOOo!?5&Vc;G!CfxSZ=T4?Fn*w6K^#@{~ojvNx7|-=*r)8%aN^D`QWpS*|O!xX0T~F z66v)Z^Tq?wA=2_Sal=$MFD^EcM)6vXqdbCFo$Hq4zo!77u!>zq#1x8)$ylJ>@BVfe z_>O?He8AC^ZCj321C50JUK-knDJ{p3)&S~dA0fk66yxo8zh^q|9uxY^OUP?Ep3Gxz zq7!U}HMeMCTaG)pLR_0eAB=&d+kFC1MWa?rXQNsolJ2wP7&D$k-X`5y_O_BPNmbU& zPl8V*o1j2b(t93RbNM_>Q<63_O-btIH6`z-(v%n2^!}Z;y|~y# zJgveIR;!$*ScQX5ExLzXsr8QmT)K&}GavB@06dQK; zkvHt_J7%I>Xo9f2kGVy)OXDWp&J+22-Xx%kx7F@tyk*WSc??#*yYJ;0M>2di(SfF< zyzlIvxcA5rSh^{Bnk`iBy-l`Ix%XYcTiul8@gJrs$x}aM9k%-*kF_#Q$pyUSxfv-< zNj_n(DLG{_5T%yErsPU5GWN!dl&0hbK1H6#KV|?L<25C3@*$s**>6fd?oqtQrJItu zgMlBZ!v`KBc9^_gQ?k!|K)F+_u72XSwRp3-ZXNIoi(zLEW{G#I0SkZ(E^-`7VkXbS zv#rGkRAGO^xxnZ2nv&y-4d-^B(`!n0nFS;$_A;N-Yf8Sm5okl=JwZ;>luWBPoUa5q zO;hsu)`s(oAg5_czC8^{Qf&5AFDrT>s2g`4>R^bKKGADRrg0rYZSa40wszely5vnv$zF0&kJ{z0c`2B@eO& z%bV_HmT#iplpM#6OWi!G*OVN)+!Xa`9xcXd#Il>FdJVCAFmya;g@5v>epB*Aj@qcA8J-P%4Q*3$ z8IO5YLyiRTnvykJh*|Dq#2~&bzbV%ey*z$PBQ)PXJGvVv~;FZ$aQuVKEAI)^)}S!YcRGKR(j z;l5w<2(`67qiN;#uLQ#VSIh(WZBpm>j0sH}oZMu-V>f!tC{$ay1xjfp{3adG-l}$a ztVI=XlkQ*aZ9+}X1}er+$_ChURy=!BABe-5cfIAZPJNgOR9qr+@jR7MPXS+z-XGD(zO&oQXiiTpiEDEA`qyVX9L<*8&xn$@Wd2Xz9~*iV3w#0TqAUsqET6 zFI6gmBDHr4P?1!>pJD(!2{WKpLLD3dRD5%vT|CGmGBw=@czP~Sag2Iut`WdF+JJyb zzZ(D~(~^Z(91FzX%mR`{JVB1@V}3dsNS5-L7pE*O{w+ftb;ynLlaMSUlT(%zf1L+K zb>c3*P}v1;ypo3?bvEaYxbaTCfn)^_*$I{Hb&FMPIgso!tqY)b91BEcb_88jk0C&^ z#}1Yt9T)TW1?mHrh@8n<F~u63gr7b@vEfTTA!zJ~#$=g;P9}iKwBt7!~sRd2Pl5?+~!g2bc*m zeXiM`a*PD-OwkJI8ZM=u_ZWA{9`q5+mB74yUe!k6X(sfVmyp-bdx)nf{LqYBw6OiW z`CP+fQm1UbP5PbUi>(ji>-5-2eUgz$h7Z+R0GX=fQ-5WkZzP5&H zI(J`rRIdc<&fO^s0iJ=Ya_3vcb-}WoyJO-!0@Ek@MKA2`qu8*!kGx@bUx^OU1Yvg{ zbBk)1#!b2oo5C(zLRGx2b~o{sIj`jDz4`9GKXQbX6ErM9p5e2J4s`D1CD)xhIk{JN z?iTau>Uo0IwotkEZRM@*-0_e`)4Ai>jHYwP(|Aqi?o{5k=-lxMd!4(Q1wfQq20M47 zy~x?;=dN2P z!#UgM^g4G=58x+?-Q;t6ox8USfX_+1D9C9#cRx=uocn{ErgL{go#A{w$Z0xvV@3mE zn&aO=qM0Z7GR+V(7JB*gI(O?i+)+t_JaBD9mOa07Cub*9_(-4M>)icVW;%CEe4_2# zZRWJ#iK(*v&fS!rz+*JUHAhBlbw2I{ygl90G)u>xqEk(5pj$s!V(WSpR_UT^&Y$5xf^$!;oK4AG@ZLa6Ab6? zf}EyvclvtZR%ZJ^kkfSTt|H?xO8X zQSaf=Vys3iyXo9*;E9d1n?d|{&dw9G>T9H(kP5Ycrjy4Qz}{4Vr0I9=#&dA{As_N7 zUu>^)H;+x}*FCD=xyv8K67jP~3210LcZa0V6fLoa2td5f-B)xNpho%_F^HdAuXA^9 zR{~cw14@&_>)d_F6Ui44cM)-ZInzyOZ=T=`9t5t;i>MnXNtX){tKIvT09DZiynT|l zS4-@ld8+~X_wP0$DYw-UojY6~L%}tj)h=g1s(71pqxQDi?Z8_uWlXx|ayuL75$)3c zcO!sl4M6<4ETBuiKE@C6+3SHW1w3KSDRVLF7oOsGSHaaqKz{MT3yH7o4HVzcTQ;+o zatP>wJrZ)`&u0O}huC=MGW4W7r-AA6OugW}96!o~|73MDX;egFd0xE4=EAvh1W>f5 zYXd(jQf>7Lsm~jL7=Ms-dBl93+TI5!`nU9Yc&@xA)~c=PKv8dfP#q7NxAAYb1&V5Q zJWrn2@pY^3_*mK+zYD;<^4>fqeBC6&|e=5Bb;G=GHf!owyMw8n2JQ z;?e&;Q9mGB9Ya;9FHm%dmR5D@)=5Co3lyN}AHa%QPmDQ}?n1`omU3~UH9;Wb7>29y-a40*Z}PMJDFyiEr)qm9duq?9^ms1@E-nN6;Snn zBWz`GdQ)K4;|?3ky(y;Z3FmR%v!z+}q;p>*t#r;Rpz3Ky^BG{a+r!62EfVtupMbmfPG|cAgth^}XW` zH+okSA$rHY)H&mR{HmXwlSY{YCi*fA;%!#Bhn;l;O)AH?kn!*WpehuaQea*{-|rc5xDlwK zp9H6GEH5mUsrW*T;$6m1kX71D& z)~~He;0|AgL6{;|HpQg!Y6}^rh}~LbWPH~`hACoGD~*i&RjGP-MeKtv0Bx>}b&+&w znQC_+D+NB}q&u3oI#&N4%ZNoQfEv0zQC-iv#1<791(70ljbDph>y3?cy-u1+v)NZ= z5xaPeDPlylC}P4EC}JB{`9dybK@t(gq3h&k;6+FTjyBI(jH)$SkG09Aa*N%t1s>RA2zAS0ew1=P@sj%qcp z-&#%~)Gq{D)t7LD^lO$K>!3xi^5jxa6suL<)<# z9s}YXFo#DN4%jf5_n2v}{9C#fn7d%XdY)v+lM0=tM$Bn)eb5R6=3&x*SPRTsuwWsa z-SqL}G_9PsV8J3U)QI_4^#h!H)&dLC2LrrOsNzOZrTLCL5 zr2FyIWEKSVfT8}~T;EeblaFe|9In;3)Nc%Gume1BJg|r+;EkeDtGHff4p;13T>1$* z?Y$20pBDHzT)1x``3A~u0`1o|7d?mT_bsH-KO+Y zH*Z0%DIURm5+gWsJ7Jlz66hkXtUS#6;2r2${JgmUYVh3q!a z!C|0iy)lEQ#T@Q#v5*T5bZ;0K-2%E;z0?`VDD1vm?@#?^xPBBLjnG%51Fx?K=B-?| z2pNT(FidN@cUSrnWdQG)Ys0otKt@8&M{kfTy|fKjtnMM()OR9!hmV!|(-#5T>Q?*_PfQsZD3tS&wDi zDf`0;AY&S%LQRLZ1rVX8{o5KEX!V)&PNq{{t_t}m7a!YRr)*O^cdSl%H&a%F`HYu# zS*tOYRx(awzR6$?b~XYTt8Uz)F_t!LipDg$z)#G<^&<)6dlYKAaYy63V;R&L+Pfni zi`ADafsBn!GqfDbe|Vaf^EVfmvB}EWsO7w|Q=5IGmh;li^kuBY8(uF3GB$~InkG@l z&jtV)+g_ZjWm}mq&d{kAnW6$K*os&kJhrRjNi}F zvL25BpLw!Q^knf%pkLrwd4 zHEgc}GS1S$y}KITqG8Y0!3%aR#@Ulq?XsDSFWSqxQY8JI+{PL_^ zj*RmO3N_ukYuSFHo?Z=PT)>4&p{Dn=>v1eryE_3H*M3u~KZrI5&n(tCDd9$_EjB0D z>YVJ^zKox(hP??O<2qInPSf0FQAewGy;g0~GJdqQYBy-rF4(o?XJet2Mn2WNQ8SEM z5;l>e%vEcAv(|X;c4=H-v1*qGWZXXDC~bSI>B^N_8;xKw`}+UL24uXbgYWHVkQ(wO z9XzyS89%^$PIp;jyyO`}X0k#}hqf={rtgF1H4Y=P}A=94cru!@rE(a#+6GN z)+6I>Zm1769opC+RnvzYbqzIrv9Vzi-=>ea=|0r->Bfdh9f6GhXx_aW8>Hg;R0l8E z2=wAt?XeTgkf($B+;!vp{RCqg-lUj@JACSizsi_I?bNybTNaSL4Osa63EDJs=p)in zyBZYNk1W~tza9^~n#a9I21N*Sni^N1-KZkB5t<0%LHjhj`^#3Az zNviAyPxgGS6LsF*W-`y4l+1GpUp>0VT1Z- z4lroP|6PsDyByQH5H&LIcC=Pnjm-NU*=@ESOL`c=`^~j?)?6U-UZM9cs{%6bb9hS3 znk$C^nFk#v?ljF3Z8Pt8G9<|1xZEAU98N(VGLn8W*I})JH9Jg$k~g|p%gK&8oPV>p zp1ZZBuWb$7)*L@~!GhIruXSX$q^TZrxRTX!tTdcyQQ)tZlQ*UTJrkJ2b)FV?t-&ve z0{J_QW>R3BCX>>I4wuAAO7tjdIouPqj*mxy-|zgtKZeNbsiol!6EvmaO|LW@G%EdQ zuDUcBI_*23Gv&@hJ5BNCO-k|RByBxavMR1Hs&|f%zZF@Hn9r@5&NM5DHz|_1TeO}WR>BWP5`D7mqNG8) zv{rLs!{JfWPts;y*#@BVRO#)BaQ619Whd+$dTX`78pH5h8z60WpttYscWrz>m#$Q0 zyKYls<0BbLlxxn<@z`{Hc z*ogVuZ{TdOl6aFMiCZA*$zdftZzP?Q3;dpv78up$aDUIX3@I#j=wEMgxfHm7bLkZuIFHP=IJfoUh& zCv~EI^|%VCS{5YDq03u~9$>gi@_;+7Ivh;#R=*f^80V{_L-lLPBI?lP?HsPW8E6Eq zGuPdDz~ScV%v-QvE!^{E(M(hQJgHI6mo2fZ^tqJ4vR`M!yq5>mon&%lt1ev??eeQ4 zE>pPPaJ*!$gWCb?kIcE%=j7US%Mm(7KccvI$)W@z|T(dL@NT|}1JXi$3#fX{3uZ9QO$ zyKDeznMwMFw(RFxHRHh0QvCwlToY<#y=r0)#evsPHP4hc-ZRaf&!wnNQ~g>l1eH313tZ=O?WFVb zsmA=gNijbcP}cwLRCpPBY0F<8wEd20PQ(Ae1hBN#$BZ)UDl6c@oJvpp|AB?2k z9e}lz)crK`AbB2!rN&P)#jFEx`)MX;BHWhN?D;%~gE`|N7*b=sz_sdzae}!HE(E?g ztwlMlPbsG+RFC=G*6HM)ZgRt$l-zI=Xg$SQ@v}@adkcYqrvnRrv$^3OO-nt&ppXD| zoo;d?!u{NEYbbNWjhT`g4$@o3+l_$w1n}tTEed3PN`W+?dd%SvzGeNuh&Yr0!e~uQA7(~ieutuY#4~^t6%(bKl7;^@&u=N?tN+agbTe_uYp01zl z?jm5<8RiSe#&_dk`gWgX9t`Htd%6X8HB9dn0e4v@c7zR+$v@`MrMd+VH%xlCk`u7$C<#O52a`|0Z z2H7tkBbO^y$>qx5$>pj8a@qT$T(15~F4sg|GF)3Nm+Pm?SxCYL9Flgm@ZS)@J96Qjc6Kh2iQGu!0y?3HqP?qRt+ z|At&%_);z}#HYFi;GxsjXHXp?=)obNI#-M?1 zfi_oj*LANDkW0@2%FT1yo<1FL3!O>*fyZ)r`lD+5O9#MBIDg*&{D-TDLMl%@4Y>J^ ziid#K7gTa4Fh|Yg#@qr&>4?^^@c1z1JafVyxYHIsBu3n2vdvA$geLtO~w};jAQI%QpM@P;+>c5tqozLyg?b8Q+d+ zKqkFKF~?~03r|!X#5k*c=5M_KS{!X!({b8dOJp{DVgv&@MQ^3Cl0f7_9%_Dyjnk>J zPEvbp+;dE|AeY*S7OZaQ1jvmQ0wE`Z%%QZ5LC3Kc%IM9DO3xKqcr_0KOA9Ysy@54U z$r_-28l6G+{U#0QkW#%N7>>;&6$!c+ zj!mbroiZfoVmLN`iR}4LLm4f^|4vfJGOO`IXwSp3<+H*-XEK(%&-0eR3h_i7TcB7h z6|2>#JjV+0L>&9bk$5K^i1G*J?oVmtq9@{5TBwqHZ}=0HAF^6p_jDRQeD*NH>6SS5 ztro^=I!dZWR)|~TSgR13)$xp%ACuhXbf7cQ72=^dHrf#!Yj=TIb?KovHc1m%=W8M* zB~c+BiepI%Lig0T>dMJ*atRejV>8E3<^iUkj z4M{2CXEDkL%I7F&vSl{^8)l!+~zbkLK5^-+~#!Z!+M5( zirbu_Lum>6DQfz=%={N`8rgRpr7J47qT*U%908CDQhai({`VemWGJj?EF3;lcs4+_Xd20K(ra;Sq|N}_rY&XDYjJFxMzGo15<#!U zu}K=i7Oh6eD{Azk*W%br{f4u#D=P24*W#FXEvB}LZDOrA#iClg z7RR*LVgazVtN{$7O1u`w#A~t8*^EvRK(ECy?X_3{Y+wfjREyW*nD$yM05;Zq2{vc+ zS{(b6x`!+7_@fcJI7QPcxl>%67suXLZ?gEaz3yXd5uo$p*vIN2BG`&@3_!%(>cmv6R$@Eeh4*wkB6QFD8rnz|w?S zt5Ge^i*vQ};vb1>#Uyx_k`A30=W6H0g6eTZRPSy;u6AB5sF@y$%0;ttq!iJ4ajte= z%os(dtLbG7qgVeTo;i*vQ} zVu{g6^m3VSFZZL?Kxf{Dl(U8|Y$T@KP{UE6Gug`BXcRcA_fI@?Fzcwbu|UT_wy|dQ zVg6)yL{?vZDrKi^RvjzxKC<6EYp9wN1zK~Pz&hrSS zb5$jK;IqbkQo&78JfMz2uX;IpRf8)PJW=cN&4H5kq0 zNyjxRxdO+A)`4CvY^OVmAlU=Y zZN+V8%k$v=fwuE#9ohKac0M)eBb(gYHmFai9)<9EaN~R1rHaQ4>9}ZV8vuP(VhhlA zmC}*6qg(E>v)#+BXajWSZJ~I%&Z}jIKS3|odHtjqlp#Sc*Lg?lkei^F>%1X46iv{} zb>2uF%1_YCb>1i)DoN1Gb>3(lN+#&#I&X{)bx+XCb>3JV>YJdK>%4I~G&n&o*LmZ0 zXjFn;uJa~HwN*ALK`+;N6Ln~Ef?lrkChO3Y1if76P1T{P33|ECo32CC65NiGH&chE zC+OumZ@v!ANYKl5-U1z(nV^^JyhS=RD?u;Uc}sL?c7k56^N!P@V-xgpo!6*Ca}xA& zowr7Z<|gRnI&ZBG%|oSlxz5|cJSmQ)=&l!EF4T#a>%84}a0H{=<+zLU-h7~47inD4 zzjgZ(-gaYmUgh^mwhi>)`}Ld&MOm%X- z*Gm`!f=;d*MC#KXpRUoQhzv}1a{Xm9j8uIB91wJJtpygevsTbJsQ?EAom}(bhg5$b zXVOe@a=oCPZ99{yr3_4Ua(&VfAt_F-uk#?HGhYu3Om%YovEyb=I=Q~Y17c9n$@Ok$U{JkEYzDzVr#dRLIAd&aw** zsJ8i@UL^R+S>8uf|NjO_N#l97z{h!yJ_Yis+R+RmgSOFN0$@83C-|u0} z2dY}muP{!oGm>=B;z4v?4MID)7Q|s6Ay3mFw3BN=loohqk+N4EbaKrXR}J(KmZ+Uv zKSbgj5_OF-BlITq+_^Z&Yin zc5*G)^*+|C7z`|;om`7r7pKCkAnoK@1U=v*f(0k&^O_s)egSJGmCSA373O(D;&! zc5*Gr{O7+h7~#grwO|t^o*jJk<<8hwgli|)!Z6xr@Y-G}`PELY1$)Aguq`y#POgRF z`v1mYHP=qA1^fDuuq`y#POgQ)E%mbMYwoxFwBe1DYhkE65`(DEAIqSfTnoeUBQbbs zSqAOoS{N=r5`*7f9UxAw3$&AKmW7ad-sd>d^BN#dt_!r2Yt3=^NF4q{7!Y)Ft$RJ? z9c^QfWk9#Wju9u<1$*e^TBF7t0aYynXa(BIwS20#bhMvUZE87EW1;)wsCB*6P zCoO~Opp$EAtM2q9p;}I8GET0A_)?GngY{Kt_8N#hj}86v;ytqT43k-FtIaDgX*A@Yk}SE!-9#@$#sEtaxJj; zeVCVMib(C`TCi@XmU%WQ7icHf0;}<1K?MU&t_3#3hXoZRtUx=t7T8HXtc8LBC)a|# z=?GX<2c29C>?I!-R50M=T43M%u%Lp36=)~d0xRp>(kj-10Vmgj9diUM`vSg`Yk?i_ z!-5J1oLmcRj}HqfNLYb(axJjOeOL<%2Ao_A_LC!EQLRO4C)WaNQ|{$Cs9?a!wZQ6p zSWrR23bd1Jfi?KB777NOTnqM`BVbXjMQSJ40=v_P1r-c9x#lVq^`;N=YZyJbV4Pgb z$BPvw3BP$+U;}ENEV@;TnpkBAK~jD z*q$<7QlOn&3s!fsn&Bh}bfyK%-47~&&a_gwtA9Ue%OO1d>m&`amk{-Dw|Co$lj|`_ zAfcUHQxu1JwUcWdaueFgHJ4TKbg^y}nIE~hRV9#>o74l<{pjSnK%89b(Y}6ka$O)! zuDN1GseW{FT_8@b$*I(^fRpPEjHwDZxt7k_!%3iZsVvf}3OKnI+FL%YCg|k)YsPcT zj>Go>C)cgI1mXiuu9IH8HfL49$u+-#YM2K=Rlv!$(3X2N`F!ecXtg-GF3?V{MUxA< z*e|U-Xc-cz2|BsHHB}CVij(UCIo@%{1^aK)WorNRYys8sZH z9e+nwuy7fkrg6<4D#g=v{4E9)*XHRrt5Q5&$8RCON_f%TxOPqD_u1Ul$tyiw zn-Z*t)9LBjMCiQI({)N->FL_!wHp_)sr){FwvxH%%}A!FYsPz4q^D~Wp(WGPb&6zq zy0%uNq;6bHr}F!B=YB)3WinO_B=?f zL+g=M!0;g(w?LuyU`p%|%dg=a9ku}-au=QeJi=M5)m1>0%N#7J?R#4d=}eNiV8W8} zez2r#N#eY>CAIIn&2T+T5}$=7q?~t8foj&&o7-;bnXPGD}tXJDHyz$^M?3IOt615#aNd#P;VQfr$qkVJm}E%=5Yu zk2}>hKrtt~5>GhC@SewOC7yKp)&O~O9$?~WM;)jET2rvXC>_Z|0$=uGqtkfsSG61x zn0VdUdIE4(4WK?JVuA2g%OQb@x15K!1DBAP)jdGu@mh&@oga4q%ZcwoqE4||6F+ob z*a6TgYOF`p53pK}*GhciT)oS%H+l$5{L0z9%dns25iL89*Ghcv9J9mdeG3tycXX}J z8OJjdKRc~$0x$S741&jNB@R2sTP43}A%n+jB|@PKw;Ltf^ssrfGI+dJA|v$j2}aYS zhzRJ>Qw|ACv#-A{Rn%=B(UuXO;FkErxofLof7V0zMeK~NhW%5IXxU8>i)=G`x9(;2j=rFCW{Ozy z1d~7yBE%vVVT#!EyG$xmTgWg)>~WjNjV)xDBKCjEd-E{4itA9kx_dOb(n#WpVHKNL zjD-ZF>6y`rBqXFp8b-@_dH`8KE=19@gxG%e?>nc?sj9xqEI|JFeXqXx=AJ%Pb!tC#>eQ*K zcm5&K_-_Fks*6n=69VcyLA47)P#U_}r6>@6eo%;)NQC_VH9&knEyQpZX5^)OjOW{Q zoad(1LYy@u#MM=iSPGLy>iBPujeKvh5c_MMClWnyBq4SD_CFM280PJS{TRipy?G(0nBGe z;Q>YALW2T`6p1w)^D{)@Jr@X3APQ?>+CvJDDhihv6hQJw^gT>5ulZw{2Y8L=eMF%T zW=EtTmT*O`HzsNQ$%41CQ+o&uPAIVD1aQ3*!mR3Ja(7NgSbeD zwHswUY=yZN8}lYb;c|llh&zd$9CP^_B?bQ?A<9HyCrCV)hr1PpT?Pe^iV|0?pqTHX zFI+zVS480|5R5Pn4=W0L4GJJUCH8a7jc<~9xZx#2{G2H42l)vp{9I8uU{C-VD>23~ zU7`Rttevw-*25Tx2&ve^1 zOo(9+&Js6p%x@8e_gpN*pAv-|Kt4+yf9lxCsG@MAK>=jA#01BD%iS^$XS`I19}tBJ z9z(Y)0(pY~NP3B>dnw`}xWr8eao0wSb!_ATMd5V@1(0bIcRfcjKloOehdprAjVRnD z$I#QqMjllZ-e^z&(Km4q$2@wUr10^zLi~~_+#|=(Q^!WcGOo$D7!*K4PTXInn6IVp zrR#(^Z>y|_`{f9j>K4NwGbi50fi9-Qpm(hk;*DE{IItZqg?XC{zOVbhU&0MZ^mAwT zf%mGPcp>4zcTieq5}89c9D}#1(Twr_nEsny6R`*{j#2B2Tg_B*0L?R0(>XxMLrE|37kN479*=wHdm1kwIomnfy z&TDtC6XKQQP|VwJzwNrWuYKc(+arSZ{PJ>L!6oojQ z6M5av6~nz(EF0(n;%As?LAK6RxkOs4C{~Zm+F2@ik1YJz5;3$4h@GQ-F%cQ$T!ocM zOYC_H3t=U0^$^uBWf5qe&$!`U_<6yWglsa%>xD=ITgpi9BH1)Tyo6fR65`^msu5p$ zlIZCXVhwzt7B9IN^iIjd-d?OJB)l$=IUz2+80-Ern_~6p5Rk3)y&duUxz>z=qq?NL4`n!&8LD1s={MM z0e&l@pmtQy%licPELok~PNz&kgzcPbNO8v*LWnDR6Ddnq%TA1r6sf+2*rgKIxGPmM z)M~p=O+W&B0$mVlF2gt;3|9pRLO+Gbdpq!q-KUb0$;)0ntitweTb9S@S0l>II}jaF z0U^3fXurbA=HsLesHC{J32{)3Fs#8tfv8ZxQ5;Z#2if0q4mIJJMqVrP z{j$nWmXQ5~7*{?Ji?ex+!a{giAJ^)Zl^o|f>}89DILs_ih?lD|fc)u*ro(l3eP3d4 z@5;o}L0b&$S#o;;G5m85*0_u{{L+DaZ;+k$DZVoi43@^k{$T@_T zxi1f?kqVJ3I*nl?XH`mqDx*gEqn~wP-4Oeh9w7_R=u4zl3@y`n^!kKG2;l<(;M0<| zHiyJsB+vo?n0p(6#X?LY&@IFa0zE?9iU8?A4tN|9q3xUZA53aUt{m zi|S5SRpc zdZT$~D_1l14`|-Y1APW?+Ze}_&~`;wW|o=jjt)FyuTbgg&_e7~VbvrgCrh(lpz^O& z0U^4q*WC&y^Ug`_QAtTWmLA-HfV#|fN27zuNu0^0ni0cr5*$V+U z#oq_J+<2pWBJrCQ%V9AAcY(m|7wel|V|}TbFExcR_te+_Po>)IstGMeM zrIy>MdF%VUaw+dN)@SiEblF6yN^oY{%{Tp0t$LtVaLelt)C$eAyT|qNjZz)Zqq&CX zHUi`hy8e}JuIi08YB#%i-=k=|bLFy#%#u6pM|wzPxiqnUdh3xt7leP#xD781DXlD9M%bSLuga>l+`Q5k|bZ_m3mDw zaU!`wBobXou_Vb)nWSz{B;Ju+3h0zrlH`X*QfDXbNG2J}FNdVgVQiOJlH{jAQWqv3 z5y`GZxAl-nb|tOVBH5L~|6TZh5&rMS|BLazh5wh}|E2i92mdd_|I6|J3jBW({ua=}POgxla#aMo&B(*7V=c{F%Kwy51Bz0G!1J5syr0(m)^D`rr zBC#aNZ;GU@NW7ZJcZ(%Sem^9&Mui46KNFJLmbi07W(LswBuMH@q9ZuJ|B-sG6VH!* zq<*C{xflvX&v~TIN_^Qm(M+!Ieb>vak>kzey51A*2Tts7S=%N028B*r7o3>3?tb#g z0+HBqXL(6{>dqi^W$@s-z$<3!cnY^TTz4dC@TOR37UepWV_pKkNW}f(d zYWWi>&-$fx!n)GhY;FB|YPof{b;>_WLKmIEhqSX>-&9l&Ks3$vRj}1+)5$N`oruvfhEU z0VS2?!blH6_3!(XwJv#AqBogcX&trB57#;{0;=^;dY_cReQR6y$3JDAle{Z&%I{t* zD#;5^(V0oeq9reb-j(c5W}vmWM?m4syut6q-Jkq&ap z9k;fpmL%VhNF>*+Os-o6|3_CQ*Q`uUC)Xsbtts0oCU59Xm6JCle*gQ_Sys_n-~4j2 zzxM&mWk0sf@DDKOhr6w>e}bUo#jCcbrXNWywTj7$dz-Rk$gR6iKqGx6Ie3cIo4lyk zLf+Axyig8IsQLtU=F~&oC#)lLhBy^Tb9C9~p$1b=bf2(#Q}wGkZ)Rnmk-Rv;2_q9w z^^HS^>l=QU^(~TJ7A9fwsFS@5QccPBe?l_JZp0<6NBAdoDf-FT1&YLmx~w~_C%TjS zRzCiC%6%er-b1OJb#-c~b$9ZD(~}pRmTDwllCZX<&ajHfdT;WIUTf0Yp1fhDb-8tU z%C)wo&bNxz9Y1`h^^B|!;@Ce-UPTqO21ieF9ej}4b#h@SSP0rTJNwvX_ZpF z$tx1cb-ny|YI03)a$9ez37z|LYt!SYwzbXLlp3(^e&V078j4*jx>KLI?e4C{sm~^? zU-n&Xfdm0lJioM)I)elyoTuPl>X+8xY)I)JP@=QMk|aM8lKNOO@#W+ty~)cU6HCOBBtHz2 z`t-?(XQdPbXnxZp^*Er_ zl(24m<}a;hte0DP>qZ#@DDz7bse8K;uTBndg8ZOF>fMVH&syuP^->6e82n;HAO=4S zkviTH0}912KcxOCm`9+;k1ceT4Se|Ngw$6=;vp$h1DfAKNZpZ0d^x$9DiwVAWrWmY zBJt{EHx#BvEJ^YU2dTRg3F`{8Ed2ODAO(I&K&CKkq`UZqCI5j4e2afL z0$;OmJHwLeKi`;*ezpQKXx07NPu469W>Qi;UMvaXP}stakLN+_wc zKS>c%MuB=Mq!8*7N+Hy(wLFVOjB01G5Tx3H=LS1;dR?MJ8`fp0ejpa9k}MI>0xgM9 zLoEuF5p+UbhPG&NNXGT@EIrs#-4x-2ZFvEgVMr45s1S=zJg)j8iPGQGGptZn4vr@Anb_~{Z`ZZ%k{|%am8Z2 z|I^m_kFd;`>`uM!m3Ma~Qr{9RGZsMEj=FZ?9630W_0t2+wW#66zA&8LAXUsti=533 zXZxK@CcVWu;7q!{GhWxK+e}N8^R;SALTc^w=Dn`3@_;F*|a07HQ#Y-Md3JA(30v-zYRmLh9SH5($$_{*t*qJdT#>{ z!W+XH(K`sQ6x$NJddKP=!ml`KQlH`7R7d{;EJs4@6S!RWl^g7PTld`x-&83 zc=cS~#Vkg({g!<>Z_M?Z4cHHodl}UDBUx{AK3C7>Oa6@P4p9W4?+jN9?z9Y&^)@zK zuXL-MspQ3Nfj%Of1Kgc4Lq?If$~HAz&uz5aOa*eB^)_HHdk)C!tthR4S%9pgeu!r_T5G`=a*XUe%LoD)v7}EdtnZZJ#I1AEc-;`h>`#3 zlzBK0x>X#8M-E1{z~*dt^o<#1ji(JgKyU}$7N~3-kUIpHbak^TJN0U~!+zF*ozJBE z3oZ>SH#3^YhA^_Dnkqfy9B>-B>ZB|CxNI^bWPHYf$8E0UrXB1l$ZE3QP_$ zBiTXVP#bal>b^C5wsTo%oB=uJ(;Ht-CjAu(}Padfs#6qTQ4)3&pKIZ zl3*ha6-&_4Bl*f0)?u-noAf$+j4Iy->>U|%4vXTpSx*k5l1Dq3T=h*DDNZ@(`J&-Y zI$o~j$}%`ktypw$7)3F}^uWHHr+6teD(2AaD^dA~VO~b-7+k+Jja(mkd)1Ba?Gs}o zp$;!Rzv0&k0;gW5UW3`M0aJ6wwkuDH+e%e`2UKtb;~GcSM`9Y?yprRuPWyzRUbQl`}6B$e#I$y10@IWiN&c=Y%* zdO)R;DarA(vB6W|M6Fhag$#PUxM{V3E)*H0f(;EEhES#hP8~W_9_m9%Kf!4zB&P+Y zDG=C@#YtA@)upT))!zp8Mo!i=`A5V^Z`temdusV+#jW}{v0pQ`pMo3p6A*2)p24f3 zWru5?bExiCE46|PT{lP(tHq!f)zL!yI=Wd4Zl;AIM`&1KW2>$Z(^Y8sFyys!^~@Md zBzs+dcg}YwYmFIzcjb>(YwfaIm~^2|kTXS9TpC145{8I{IrW++97h`A?3$=GBnMo; zqGk|QG)iEnX&=@^Bw{NY+U!%F(+lX^g9cpY0Wcr+BZdosv&Ey5luDGrUx5ez; zByN={N4aENPzsa)js6`NFVTr)HY*vjGCI-{&hR0p-6;7kuu05wOVm1+t@E6)xqcy= z3(nLg>Q=Zql?^M!SlPJH12dIMB`;dAPC%O+um`GDCS?7JoXw&*dG{_yw0%t zk~Vh(19dsR_mv6-x4O%h?d^hO6Xq17>9mZN^+C3qpL{%!^QCxaR8bUPT9DXL8O8~4 zv{9P`NfwL(Cvy3tS2e47xoSF+^=pl+pC0VsnIO$&9k){VXPkx$lI+2(SKkk%6%DtV ztGFSOyUQiF>hH<Hr!kR*YL$gF7FgdlVJAQIr)v}8k4RM zY=n9=BxJO8V2tLCo}Z7Isd2$L*K{pcm8*A%wQXX?C=5XA#v)_(df!lN)T%zs!&wiP za;Bh|si3B$IO+PHl(q`;Q^aJ9Qoi6Gjq@!EbVucfWt@#thRswe&>Xe8TZKNXv|GR^ zoB`oD#Zm)A&m(in_u-~jyre^}E0JVxHfB^YW2!ikC@F~?r!mD-5-1o;EI3BX_vxX| z$wxG=}l7w@>^`~ku{k7bN=PF(KHl={s zx;3OCBeh{bki?$JYQ$(+bU{5FRf#ke61S;T)M{ldcx63iA;20u<#`!Q<2*u9gDRz_ z4qgz`fHaLTVWWN{y8-hi$(kDOM5$T`ir8|@3RuCyVnx8n^?-RCiC)0Mx=smy0X^_6 zjhxSHaGXkRI-}}gJ0_ufNMs2XGy@HR?1Onq55nSWPqR{)xw2N6X+f1=>oz>8y$dRu z1AS%oZZa1SR9ypA?Z(WOX^CBhf?E4yz0ao#V!A@~SSH4q^)}`_Q0mEH8P}FWuwKzN z|CyGkH+^Z(ZEi&bD`-I@1rjG+)@J8`lP}k*C{Tkkt0MBvM#HV8vO9(ZzBtM|uKp zQ@&QI=NhgQ?*fa;Sq8PI+wg$nxjyWrP5M(#u3Eqjk((&HpsAIzjV@wri>W=OYO^vy zO9rWmAAps1OcHWA71ds`+o$1OhynMO%-Bet_78MkH3x{;*FfbW3do&9F|y&qrH*WK zTFSwyypn4im9_99_9>JEEtg?+ ziA$5Lm);x}-!qjwZMh)Bl3gI(&l>=B*!A>W+$LNIvsb$(pfZ!{b!7q~51R#N+qF9& zY@<|blzd#sNtIE@8W$=uyj3zslVu%JMqvR}M~JOFb7dCQ(>I00o6J}YSCv(!2R%&a z9VP_9N+2oKuQ<2Xs;oUvZ$!2OyD$!z5!8yLO3yA_AqOlk?EqUVg1L|YCFz11RxRnF z922!^2UQo6KW;$v21=#_{gbYL5LwHi;;zOdYM;H)C{_=VBkCEnlKX3uwanN^n(Qp# zr*I}}g&9$qXlTAH^*prPd2uW#LgMd>LsqV*JUCP6961<0KgrEiQp_z_<9aaL?+lNQ zNCn{rN6C-dpXbifybTK1t7DuEw_TDf$KX}bWo3qC^ql!e(iR1%Nt3$ftdoaxhOSuK z&U>%{7u64OgG`w@fGTS)1$>BGNPYYeZ6%f$ru@NeXWWCtEwsoLX#CD1W|-}4X0O*R z^`5^|~t?RNrLmFLCbtlnw1kHxxyLNiOkrtfnMX$i8yVR48gRz4x#97C zCj*s$Yij^_!@|oI<(7cQD`(uXk;~Kg40Y^rg6irvUSXChbzJ&%5)=pgsRE=cb%wE~ zd;vWR&gru&TNb2gSd9%dFht3OHc8X{dhBG#P*U=Y;0D4#**667$UX$B6Q#>BO}}KX zfd0?B)ka0XP+cu+xXi?1-?daLRe>SRt!a*7i@F1wW(1^e-aVCTjAKo8sFlL~D5`kj zK_8hGYOcWGi)?2?JI65@XEi}+`&hCg-b9?$dPH^{ov*o)f}W0>L%1Vo@XN>w=v2ZY z3sE%?t{f^4?a-kK9I2_CJX#&y(yZ~C8TDykKq`$#apOeX2Ay0cvEEi<)&DE zdfF*f>rLO2JFZGcH_&hDEZJOz)<6r{ghhsg+C9vT)`rhjUnrqf@~9;*`LKGI7I4U5 zSjz)HiluUy8UnfId`b>*|gOQGa=sBqVc#R494%nx}R@kdTthK=p+c zv;nX6L1h8d7cPk~W$Z;A^rRIOFf`arSx9}deQ%U_3_H8=q78Nc#eDTz!~qFJE=-)D z=0tZtwtorj!GX@3WkGW#G3&$~V#+{8ZNSYXcrC0asGT)sJQGoO>3&eoNDEUb2+B4^ zeo-iSH-j+@YP%fJ;pa+KTIRsX2({sUK*`zR?d*+b}rL33r7P^`K z;x^0b9U*O}JmnLZP36*Hhscz3b@XIT1Bv?<34Zd-)2!VG zl{0(zv3{V#hGw+>C2$7U1ytuJ2rkyrZmf%x*S|nLmAkV;(6#aLEANiR-VQw z7BFZO#eBKuxl+?2H?zXK5j+hwnN& z-yDL^JP$6ART>qSG=j}49Q%;sMrDGf5yxv37oC%- z*T4)le{{Zz0OtGAb~zy?AK(>=-|I#Xw-YU^7Fc_9`e)wS+D;b4=Pu{uL9qB@lO8ZH zMTAmtSI~S27Ta*$A2lc#4VTE4H12eUJlut6H1-zmRIu(goH ztT^W^`}Rg*S!N556lK36*Drd#s@H6=edkx43R*7Ar}aCJ56+?}+5!?#z>YODdR1$* zm60}{=?#;v50*t>G6ibc$obYhZZ1U=k@a(vVBLl$vchZRs)Y!f7wiFwg~j$}8r7g{ z!Xsb@v;Jnjq;d$<0O_=ol}E*zRX-pfs+KYY50e4TGEY^4^OWqtyo(D~x5YY~gCaY! zc@zcLFwa}5Qkn1?aDK?cMe`(FtXZl~ib<6TuoexED;{cU?2&eqMn*`1i0fLZlAx^- zLt&sRG`t@3Dj=}zb8`i^!96DaR8_fFo$NT1iF!?AY6`6PL;WLYUGG<%nL-X%m8Q({ zLS{I5*r_t%q24j1Ws*Gtm=v5ehuKgc#D6tMP`(!wqG~vy7zFUbgdfb7x zI~3gFYR75ioN~$Y9X~hO`Ac2+3b~H2{(P{yN#yU8V_;NBy}LRhg#*Q(DtUsh+`w+d z8(5)cLo&~cLl$<~cpKWQ?P5ESu1buXt>9-kH&M%8R-g2Xhl%1}}dwT3wk<$Qv$DOr2;J z_4bOAGGIXsOifw{RVF+sy38(91QgDb6J#nA)#h-pl{z8LymYK8Dk$uxqcKqn`a;8( z%fh`*v0n3lYiFHORovELnuS-V@ZBk((516XaEu=&QYuJ5KRN^&RCOjR#C{?>HF3e{ zDd~A^4I3&Hd5FltL%aI$q1**BclSgEFUFT;;+c8&UbC5(zq0bBy)SHo0FmgZc%qh9 zT8eSRFN&n0q$!llBCY4m<28;`@M_Lfu3C_42i>V($iP!ah$^{hC?%*4VzwSDLfY^H zuaSpc8!jr>aSfpsy>n%Z&w26!a{fznx>N)fjO>HBAfRDFe(2Y%{$ts+)ui}Ev#mieZx%iHUoApYgqxsHLJJE$A zrYdKAeBDB-CPE@7?WKh9FAiB0LrtSMsHmu#-ZbXs^rb3))MoRA6cx$Id7B zAd2#HRDQ~+Wmc#61S&)dwI&?ppc}wM1&@Z(!cxy0Qd!zrP}La>yV#IsUa?o$G#PO8 zSK$}4_R8AyFxu_tI+A)NQI{|F0Kb`IR*&f{svDboCL~k) zm3lQ-5tSJ_k}FTutKE}z>jM38?vbEUi^&aX>{+FbbEN8&^5=q2Jh1sUEKB628})J% zPLac1pWK&nS?B}vsmE|3RiVr(WTU-^yYz%ILzbH|U@o0?e78|4Rde!?*^Ahgq_qoP zyoZuBTv)_sfN`G~E=a6TG>+n}BDnXE^GkWX%a1qa;4v#SLule94^BTwRDp>xSe1b} zIaG_r9F6P4tOH7IIAsswx?E5VAHu~IUv^?tQh<8a3rbw_#u9n(sL}+!3zvFek5bJy zd!JMm06N)O0(X zR65hFr}k@2%UA5UWEG=s(E%x_lLdx*M8__c-XQ_GYO2=cJ+^=b7dHpypdBh`XHsU> z&fdlF-WkKdan1!1Z}>)CLo$0(>cFFOBt0liNv^C-$8Kt6J-qD;nUn7SFJ$$I;y}@J zUECg^WAo}V4f7lx@AX9&2(P3tPQpq#al&(R4Y~N%9a44N`7UeZJ%Dg-2s7pc_01jc zv7x-UP&pfRh~&|GkoK#1U_?s$9o;6>!+0olY~!(&80`P?Y?8q>FYN1B+((%K SdQKZEi!BtIKEa~<7aoOQMKiQURZ32>I%264wWczqca z!h@S!JNa&GC935DhUdHNBp>QrLC}(*gPq5cjl2vsy+I8&DbYplA!j`p8oXMMQLKQG zj6A3d+_2;PNH|XsM@K^HxEE)Q$MP>J@Ln9E|Ap&OvIoNh%Q9 zelZ8vTi8;Fj#$u3j@p(+&7F!>vHo~2u1mZM5AMir9C1!oO|3>@0`p|3=X98rtNXh_ zPLy^j=}n7sA;}~G_YA5rPfZvz75-9qAgZTtE2}_fdcQg zjG2NgWY9i*SYQJM4my*r9gN1H9gIxf&?A1dB z^jL!fa#>}lz*L83q45?EuZxs-E5Icl^3DcOisFR_ycrCq*^KKU43e?+pu|SJkE~J` z?L6*rKv&bvGyCimtV;)P|I-rp_V{yyYj=o3*_)|2h83q_7B989YNW@OLe;IQhM8r> zQ8N1t8Hxo4*X%`>-4qTAoBKTGT`OSL!FR3b5~!xt;wu>ip=ph%*Sr$kq)w+{jhj8U z6?0|Jox{)t&Ly(V`>53UMaVJgn7BI489nikb~j|gHha|sH{v=vk}Chahmw>lW$nZ$ zKsR3p7h|ej3Z((XPORDYEd4>=y;Z7aaB&{GC_OM?2R?0g-ZE z-A7(%M%^ds`W?_VryW?=o0h^*@lhfxSYqHd;{5Mal=qi$4pd)^Wr?O`f?9hT3KJ39 zYC~;wqgl=CD*#yK8s0)lr;WW!I6n^qUH9J3PO7HLSQ}0+_9`e86LfhMDN|A-wV)JQ z;My$62n(08jw4DiVBQRl5WmnglKC(6dya zWia-OqG$AoJ8e6bXt9%{mN|_jE7(5ZGeY=eIqcZTK0W6;7_NlpO55^1SCb(HC z&BM|g)OE&kvma%I=n4SNEFUzJoEh4M)kr*}EhwEafvW z_}V6z^u|5pu>sAyFqN^0uC_p-BrsJ-bu@_`FN%e z?FbB4zHy2D$#ebI0(Kk?`S*ajAp&mn;+ICTi$%Vt8nJiL(Mr*=6n~9;pivKn_&U-G z1RZ)FX`wzRFt?g-`{8(nKEzLa7K`Pk)Sras9at@cX)I4IY?>d@GqcV_sY)+hf+Qi0 zY0cfI4gove)N_01*%E-MvxfnHunyyZ@be8*Z zA-%f_88`DAr%Y=_3Bb#fk;eS}tMWZw*}uc!6MSsO2n4d0GAYgjDg5L}EnxT`t6 z*{@~see?{D=LkGbR}uJ|=bJx1gJCKRq6kV`h&f6OatdDj4hu%u-G$W<-9Df)3EC34 z8gN&m(a6nYZ~)JTFztDBl|TXKiiRz~$Gakng+i0cnyzouzeeD3V5H)5^fXZ)CvsT8?)epp(yba=L(L=kyZr z?3`l)o;WYWrP;|v12H>UX}}ZbuQ;-u%r+3Slj82`X7~(+3)5%6GmS6|pRI8=!^j48vm@XES`g!nJIM zZ&0`}efGQ22*dDA8fPL^x3awgkiX$aW=!RRJfMS@a+m0rq6z_GQu!? zr^eX~A6K}R&G0=67pDJgMvj+X(HHnX!_R4)&F~Me(&LNaA1PdzKKngogkkt!HO^-E zTYEKqhQFR;qMdO+l z!`%wkwiy1s!iDRW{lqm)t8Foy(m0#p)34=lEt}yp6s~PC{8fbur^$YgsxWPf;eXUP zo8cc_r_*HkDTQlW48QZR4i~Ij<|%J6cnib#X`IdQ_Z6;XGyDUEYg-Io{EGNAIX@4m ze6=lx->q>r!yj@qErvg=aBYj>_e|(;!E&lPQctGLW7Q^MT4i_vZ*ZWIV{kJWK*J_;2@ZMvZ7Q_1# zu5B^=_CM6&f@yMoDk@)Xi{ZM)*$n^4)3g|VO5wu1^&OPMKsS$?Z^%`e0Jf?6ho8hd& zh3Suz-!(=Uh7W6;&G6e4u4Oa)c7e_G*MHp8D$xG?>P$?vm97>2)~aW=#Msc8yvhT&xzXEQvia4nnRmnmG^V)&@Sg~vph z{3F zslv1^hJUMZHp7eV(Cx%N#9U~0G-_tmo;jUNfHfMN|!iDK~liy+^48uz`&Stn*;aWDsrzl*Q zKKq?&gkks$jk6ivrf@Br;q3|+roV&yt}wzde5JfRUsbr4&G4fN7pBjCe{Y0g_-h(xEBH>`e;7_F zT$p|r`7JWSFl=d@&G1VVu4Oa4M&ZKr+3yk~48xadoXzkqg=^UiU#W0m`s}yc2*dDI z8fP>79))Y!48K?5!t~!qet%|!Vfg(TXEXd6g=^UiKdf+J`t0{vBMie|&^VjnXB4hw zGyJT=h3T{3uZ%DZKc{gv!)Lrk_aBDORJbtxRpfV;5r*M&HO^*uP~loO!$S%erq6yG zj4%vu);OEtNrh|K3{NRsm_GZJj4%wBHO^-EE`@8^48Kv~!t~kiO-2}ok87OG@Lwxj z%VzjP3Kyo&ejhf%F#J)Cvl;$Jg=^Uie@)@S^x5z0Mi_>_p>a0D|E6#)o8g}-T$n!l z{mcl%@GmvaX81o8u4Oa)oWh0av)_LjVHp0c#@P&?`C8ro8D6DuVfyTMmJx>Gb2ZLp z_<+K-Y=#diT$n!l9Wuf&Jf?9r!`CTX%Vzkn!iDLx-^-0K4Bwz}Hp4Rt*RmPDRpG+) z+3yub7=~}tIGf=QDqPEE_^%Z%OrQNeWQ1Y(Z#2$k_z8t;*$h9aaAEpCB)=aSVHp02 z#@P)2OyOEK!#`KJFn#v>g%O6~XEn}dc**N@|73Wn!iDLxUyl)n;T0NZGrU&eS~kP$ z6fR7k{Vp}aFuY#lY=-wJT+3!Sqi|vRtl#>vq32@wX^pcPeyQ3sZrKd4QMfRD_PfLg z!|fRODIFIr_S(Fg=aW=#KNm+O(C&OulYg-H-RJd@O>~~0oXOxt4khZ<)y{PL78C&Nb+u5B^gR=9AQ)8sd!!n7@hk7=CE@Xr*k zWi$M9g=tSm|4iXpHp34pT-##!iwYM` z^GoFSzf_pE#qd`&&SrR9w=O5c+ZC>DF?>Yf!fCSK^(su;V)zd<&Sv;gg=^Ui|GmPs zErx%paN#uB?`JAZ+hX{a8fP-0O zi{Wo5T)0f^_e~Y1Z87|q#@P(#X%>Pp#&AL5+7`q2C|o#A_Iry8)3zACPvdNc&t78G zBf;k=T-#!JMB&0|?kB$kDoopAcvRzThQFb3Et}zQDqP!Qc=1x5HwkHHk>3&(rfo62 zOyg{Z?^U>#&G1_lu5B^=d4&s?^9$tnMHQxPG5m~|4DZx9o8d1iT+3$oOA6Pv7=Bja z!fCSKuT+?}#qe_)XES{Ja$Qb_U!`zui{TF_TsX}SlHXseFl~$Bk7%6D@Rk)iO@_BB zT-#!JO5wt3vR_GsXmZHwVG8fP=S zUEx|b!#fl%%v;&-3L^}|S8ANi@OKohWi$LQ3Kyo&e&031F#H3Jvl%{zY5@2s!{;ho zm_GZRXM|z+0*$j79#FWJ&G4YYh3WruN(d?Lz3&Y|q=hgZM%yiffK%;`FTTB8bl%V) zypx1}XjQDUMeG%+V(Ciovq}CE|F(G+B4b;GzSaFk`J<7m!rcqs+%ikN!L74+ z-m_KE(~#yVIC<;-@hgK(ck&*y>Hd0;po1T9CGkzR7j^14tZZCD&*&CLfzbfFB5|Mw*(Ar7}onP7vi#xp?!rO+Q04sidddS zivTo-*8W9mXnkyvIkXZhI)~OuJJ>?^uQXfe(vx}UeY_VEVQ%ofB{&d24@mP7^S{GT z(T|>p9j62aV(%JrAYM(sM0zb&R^-bm;=Z-UK>Snrg9hR`>t>19p3U>0X7k*8sSvxG z)8dTv;dVW=9+M38l~<(0AwQIk3JI=@Y-e9Z-?!5D1N05LCkeloY+|SA`(yeBU5@NK z|2-@9g-gh0Q`u(*+)A>|TtfDeXVI5!D}(O)-uh=-)!&-#gFn_mchOf4@cM=WpoyP0|?$9iIbWT`qt5{1$)tEEb=; z;`34b6QPyVufCV$!1lI<$l){(z#o5)|bGklor`q=i5zig|=U$(8| zFWbWLmu=Vh%Qk0hU&eM|{AC+0{<2LKf7w2YZK2p^iN9=X#CAn&|HEIlndKgwU;&*U%fKk}FN3;D}?f4tAf`*Hl` z{WJdZeiwgv?<(j{Cq$9HGxX(so1ps(Lj0P(%W40D_gsQ*6ZyZ9z7Nos_e6s3@5%ps z+AkQQFYjjrolE|IL*GZ}%X<+)_iOUMnsoj*(wFxbg6?ke{~mpxp)c%4=mPX3>z@7L(d z`s$z?AieGb^!-cvvMxC2o+kezq??_jFY9rG?j7XcOZw8)^kw~Q(A`A-U#0J3^kv;@ z(49?s%s-~@{q$wMXwZF={P&SA@*4WG-ZJRkO8#A>(_2Yj);R{3b)ASq~U=pCkW%(y48yFYD=o?iJ+!uk?M6zN~)>xjt{E;^!trA6%w|-zkPl zRo`vYMPIe%yM4Q^9KOuYP13K)YO`;mSt=JUD-{I(n#y@oqOUMh^=2ya>o=rN%WZh2 zTD9Yc(-3_Px156r1l7yF=qpuAzUcGaXL}H6RI;Yk9`jn-lP!pQ24E zy>NGy5NHlS98+vgN)dH4A#UCfcY86sC;)Ke9;?RumQ+%J| zU!+1x7mUA02=VW~|9y?qzn|jYPl#_&1mci_IE``#g%B`$IevYyEPtI?*dx6%C~!z9 zJI6nRC|oOqfZ2lMZ$69a4=Pp&aYLX2gZ1|ZLWtiR`M-CQjDPPY8UKA0f%DJl@b{;om*u5om*u5hvf(J4>UOc>~4kSzmb2jRmK-vWr%$gkkjY*T>d))@%K^ueH8yD znpz+}aJgXoH&MM(F!A6{nf`;64Niw$u>Ic~+iJa+#*kpAKOWx|Kao`pE6a-2T92Pi(b=M=@CqWEh_6k*5p$L_&E{JZ~$ zO#klxAw%37h#ySf-l z?+$c$j>qo2nD{^Wk__>I(>SDb!T9TA;{VBaWcZ(cVfOf!$Haf#yJSk=BhivwF#X|} z_>+GnLw=Xne&mAjuc7$C`oHQ+GUOGn;+WELeE!}Plm2V=%8vg(FO81R?r2Q>GzkFz znnBDRH`*Urd)0XQ+9@bSZJBnh#8u5~~!SH(d%>6JeJMtsmkO;yc-$`++elty2mGW<{Nnfgn;k3z5)thS z^IIaKeK#XM+`b@|CdG1bQy|^zG5jiV`xoW>&3xi!!oQyI%zvhd&Z7Z3arp;1AM*bI z$v5ndBYveACAp6sh>wYg{DW!{^1qtoTy~$0skg6C{_hTy3*J(@`4tO@D zKa~=Y^YlsLc9M^|9$@~8YA;Ur-k5YR{%gb$|s`art(;=C0eckf61 znPLseQS3g3_*29O1NHv}Z0KHbX8`~882nR6C(Ivykr3i!v0Pmd^(-ZvObT&b7KH+&Qg*o^~3C~+5od2K2&_B=({Wk1wh{1!Zoco69?n3-> z@xiys`aD6Ne;yP5QxyKrx5)4xr|{p33I8A6vL1M=?-B~XYO%!g7B83g^2LzPu-vi> z@ypfKX1wJyj`*;v5q;kBV*2;Sg#QGE=PgRscl?y_yj9A4W3?so&s$pDz8fteRvK~z ztn0uXu%hc9%*LU=@m4vkgTcL$=<^mZuOB}WL+2kUJa4I=LUjHuCVc;r=={tqk>%p8 z#g`DB_Yt1AxVbMqN_gHX#Wb$pOyPrk<|7oIuX@}@{qu7% z>HgCSA?ye_ha-~c+$WP8$8J*9882mWV3C{ZyG2!os!M}^>unEkoss6u4csAW&`Jwyd z=zLyzvMd*y9`QK33BxZJE8f^SzNRTWn-;Mg_-+dSaDX44pzv(E!S(zk;e+z?;$Fz- za&bGYFJRvT-06r9yKD^pu3lL#Hksml{u$A)zh0K>9wPY}3eP5A-2cBDL;v3?Je!1Z z`14PZ>9T1K_rt;|vRu~^zk>B7xMPIp>rt8S9Vh&YSz5Z00&wKBd>9V}{UJ4(S+n*#nn-+0@yYw{RSHJjue_(yL z`LyVMIDVSUC!0)hKlu~FvuP8{8=sA#^H>bN@AT+&Uw67pmrcL8y}nBLpxlx=Bbv@N zG5A}~ko4Kq?mg6W55|Q5DTQa#vOx;J=1fV4O}4mxu0B(?SDEAl#!n$W?Cu~sY??*e zui~?WXA?HwkA52QLiF#E{ehjeD!Lx_Abzo#yr9Ckg+q z0AKprD%s!eCp`wcZ?2N{7L+r88Ix}JSu#AE2J*Prah9y-(c_)t;(Ek~U6tqr*Dr65 z3IDf5e_ufUd7SW%1o!|b+CX2yCW_oot~guflTE@Gk-&X3g%9$>*HHM?w7zCJ?Oha} zO&)oD@sAij?0#}~^mzY8O!%I2Wd4Km$i{PIzj`>(->#$ZY@*Bj_85f^x_?0YaIAPf693>|7^m`>x+GaXH!zz!-QuOYQ{ftp6qXI(teEW zNq&s@@IJ-Qh)z&$Ie)dxe{h}>`CPf|Ojc@DddV~2@IAj-EcWGv{xH^Wi0~Ub^LT`ef*iW)s%&Q58Q*o~{tVQA!K*n_xoV;8a$|7CK>3^;JT>OH z@VJ$Upa)v_y!_y<1H-$8b7Ye{?dF@loApYgqxfRZJRZ-JFOGuE8WTJMkHmMrTC1L^ z+cUtA55|Si_)?`_-jk;A-o{+L?p6!%!e(XX&b|AGuiSn3urt^<1dlJpCm0~d$=AwW zrVu6r=yDkC?M`P}A$0Tui||gjDkD4+2ED8(-`X3_XZ>^<-fp7ToQCrmc(1eOxe@d+ zH>FUrx=m((KT=m+eLvJ%kWhNVr0ZWPJ6ZC4x3RmN^E_9+g9vR8_NftrA?`ISc<`!F9-XDL1UeZ$yk$O_8p!F9tiPF` znjap8cg66@<+L-F%?*$DJNWEwY>$(JjyigJP`yA7CVz{M*qkL-Ug23 zOtY}V_y@v`_eY~U3O|BNZ%lVo6x7n_ICS%@Ka_VHjZo>Z_j^I~Ec0pBcW;UBi4$WZ z=7=2~$qvFyh`a^|yaV$;CFczE4fJim%+(sug`MG==NziL)k>}4;^@r!Wp6lwI~zT| z#!P(N$z(S;Q^B%84W_rq(E(xA^MLWC7>w-f9X&9*EzD=YBc4}I55WubwW{AJO*H*l zLrzEw;VnEb5728r%QgYVWJ|bl;UNDL3sb!rDuQL z%xKob2k@}3xxtKO;UR6upK8?FPOa%XwW73gkC+=ZyU|k(u&9OilF+nkj$> z%PnN1jby!zWw$!%PtD2|W8Om?$$CTZ1TeN#h}DI-39zqVwH=J?U}@-JIp3YEHD*ZM z$%V_qb4z-QoJHvZg#)fXRVzfw8}yLl!Yewe6+=BIw!&xOi*Yj#y#2U9k%G8XWcR{H zC^5r(U;$FY+Y*NNPxNOpTO7G4sm%<>u><4>Lnvmb{OYa?Pez(dB~%T}yrUvd;hhtn zUno_brsv9hdXYV4-lC}#!;$$PY*r@R#-ZY_#$*%Dx_FV@0_3N7_675!B)J)8To7op zp78ue*$qws&KxV1Xm-ova+YoqHA*(`b^Y;@U#6j)rWfhqiVv2~qoSoDUgsqwo*ZMU zZ399LJQ%v!%e7ot^sFZeWw+6&@ieR^z=K&>4Mei-SeZsL?<10{hIvSQvqaY=H`P2k zd)AX38>aRnJ$iGfPes>PdeG!a#EwFB z7aF15USUbC-|2j-SoZ-~p`|ydrPDq)S8yA+cv2+|us>Wq&a+wK)GY)3YN2o3xfD4W z$@PAy@X-~=H9)Op_RP_6b@e+W*_*4)xMDMVQ%aYKoafHc1}dDXS&L@~(d7v;i8QpM zGvRqk&k|lUm`aeKFdv-?*IHzrXRkwZX_WPbV7`wWPdtccRn867>TVS{aA?&S95*Pj zM(FpXb}3>RsTC)%l8x1zL?}1ssIt(ah=y8xONaWQnl9!!sODWw&`I(~o&3~Mri*7ZQR>5Qd-o-{(icz~6rGZj&%O^bZ4ns<#xkxG+z$#4T+w;--P zB?@J4hUI9LPJAu%JU`E|7%9j`R0phIH9jz-f)HhDDq;$r8-}t+4~z5$HK7hy>&=*j z9nYma^t5zCJ3lJtfgIvGbly5k?B=|NVeJ#|AGvtr0{Fr}jI6(Tj3k+1XL5Slsk;rY zR?U@5{*2S=-??-5;lsPG9Cp%ugIKMh!HC+F{k7_(A)GB#mAE^dnRAYctxQl5EL5Ng zOwA;WMt2l$%vm@kHup8vcBxu$#$2yiff;u9ZfCHspPD9AZDIDRnT+gLp(uO$N%r+} z+301kW=xUmw|VzCt-|ZzAZj}SS1GgYwM1*UW7Kh=?={3$S;&Zv)(>jC(b4glI_M-o WMJ~*Bjgk;&mn6Bd7bwhO8~=ZJW*1ff diff --git a/ModuleCall/main.cpp b/ModuleCall/main.cpp index 9f7d71a..afb7544 100644 --- a/ModuleCall/main.cpp +++ b/ModuleCall/main.cpp @@ -6,261 +6,291 @@ */ #include + #include -#include #include #include +#include +#include +#include +#include +#include #include #include #include #include -#include #include #include "CreationTool.h" + /// STD LD_OPEN CALLS /// -char* getModuleDescription ( std::string lib ) { - void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); +char* getModuleDescription ( const std::string lib ) { + + void* handle = dlopen( lib.c_str( ) , RTLD_NOW | RTLD_LOCAL ) ; if ( ! handle ) { - std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; - return NULL; + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n' ; + return NULL ; } - typedef char* ( *method_t )( void ); + typedef char* ( *method_t )( void ) ; // RESET ERRORS - dlerror( ); - method_t myMethod = ( method_t ) dlsym( handle, "GetXMLModuleDescription" ); - const char *dlsym_error = dlerror( ); + dlerror( ) ; + method_t myMethod = ( method_t ) dlsym( handle , "GetXMLModuleDescription" ) ; + const char *dlsym_error = dlerror( ) ; if ( dlsym_error ) { - std::cerr << "CAN'T LOAD SYMBOL 'GetXMLModuleDescription: " << dlsym_error << '\n'; - dlclose( handle ); - return NULL; + std::cerr << "CAN'T LOAD SYMBOL 'GetXMLModuleDescription: " << dlsym_error << '\n' ; + dlclose( handle ) ; + return NULL ; } // CALLING METHOD - char* descrption = myMethod( ); + char* descrption = myMethod( ) ; // CLOSING LIB - dlclose( handle ); - return descrption; + + //dlclose( handle ) ; + + return descrption ; } -void execute ( std::string lib, int _argc, char * _argv[] ) { - void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); +void execute ( const std::string lib , int _argc , char * _argv[] ) { + void* handle = dlopen( lib.c_str( ) , RTLD_NOW | RTLD_LOCAL ) ; if ( ! handle ) { - std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; - return; + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n' ; + return ; } - typedef int (*method_t )( int argc, char * argv[] ); + typedef int (*method_t )( int argc , char * argv[] ) ; // RESET ERRORS - dlerror( ); - method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); - const char *dlsym_error = dlerror( ); + dlerror( ) ; + method_t myMethod = ( method_t ) dlsym( handle , "ModuleEntryPoint" ) ; + const char *dlsym_error = dlerror( ) ; if ( dlsym_error ) { - std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint' " << dlsym_error << '\n'; - dlclose( handle ); - return; + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint' " << dlsym_error << '\n' ; + dlclose( handle ) ; + return ; } // CALLING METHOD - myMethod( _argc, _argv ); + myMethod( _argc , _argv ) ; // CLOSING LIB - dlclose( handle ); + dlclose( handle ) ; } /// FILE RELATED /// -void saveFile ( std::string content, std::string file_name ) { - std::ofstream myfile; - myfile.open( file_name.c_str( ) ); - myfile << content; - myfile.close( ); +void saveFile ( const std::string content , const std::string file_name ) { + std::ofstream myfile ; + myfile.open( file_name.c_str( ) ) ; + myfile << content ; + myfile.close( ) ; } -std::string loadFile ( std::string filename ) { - std::string line = std::string( "" ); - std::string content = std::string( "" ); +std::string loadFile ( const std::string filename ) { + std::string line = std::string( "" ) ; + std::string content = std::string( "" ) ; - std::ifstream infile; - infile.open( filename.c_str( ) ); + std::ifstream infile ; + infile.open( filename.c_str( ) ) ; while ( ! infile.eof( ) ) { - getline( infile, line ); - content += line + "\n"; - line.clear( ); + getline( infile , line ) ; + content += line + "\n" ; + line.clear( ) ; } - infile.close( ); - return content; + infile.close( ) ; + return content ; } std::string loadDummyBody ( ) { - return loadFile( "bbSlicerDummy.dummy_cxx" ); + return loadFile( "bbSlicerDummy.dummy_cxx" ) ; } std::string loadDummyHeader ( ) { - return loadFile( "bbSlicerDummy.dummy_h" ); + return loadFile( "bbSlicerDummy.dummy_h" ) ; } /// BBTK BOX CREATION /// -std::string updateBoxDescription ( const ModuleDescription* module, std::string _header ) { - _header = Mthd::Aux::replace_str( _header, "_NNNNN_", Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ) ); - _header = Mthd::Aux::replace_str( _header, "_AAAAA_", module->GetContributor( ) ); - _header = Mthd::Aux::replace_str( _header, "_DDDDD_", module->GetDescription( ) ); - _header = Mthd::Aux::replace_str( _header, "_CCCCC_", module->GetCategory( ) ); - return _header; +std::string updateBoxDescription ( const ModuleDescription* module , std::string _header ) { + _header = Mthd::Aux::replace_str( _header , "_NNNNN_" , Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ) ; + _header = Mthd::Aux::replace_str( _header , "_AAAAA_" , module->GetContributor( ) ) ; + _header = Mthd::Aux::replace_str( _header , "_DDDDD_" , module->GetDescription( ) ) ; + _header = Mthd::Aux::replace_str( _header , "_CCCCC_" , module->GetCategory( ) ) ; + return _header ; } -std::string updateBoxName ( const ModuleDescription* module, std::string content ) { - std::string _new_box_name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); - content = Mthd::Aux::replace_str( content, "Dummy", _new_box_name ); - return content; +std::string updateBoxName ( const ModuleDescription* module , std::string content ) { + std::string _new_box_name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; + content = Mthd::Aux::replace_str( content , "Dummy" , _new_box_name ) ; + return content ; } std::string getHeaderFileName ( const ModuleDescription* module ) { - std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); - - return "bbSlicer" + name + ".h"; + std::string name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; + return "bbSlicer" + name + ".h" ; } std::string getBodyFileName ( const ModuleDescription* module ) { - std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); + std::string name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; - return "bbSlicer" + name + ".cxx"; + return "bbSlicer" + name + ".cxx" ; } -std::string updateBoxInputs ( const ModuleDescription* module, std::string content ) { +std::string updateBoxInputs ( const ModuleDescription* module , std::string content ) { - std::string _cxx_inputs = std::string( "\n" ); - std::string _cxx_inputs_end = std::string( "\n" ); - std::string _box_name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); + std::string _cxx_inputs = std::string( "\n" ) ; + std::string _cxx_inputs_end = std::string( "\n" ) ; + std::string _box_name = Mthd::Aux::replace_str( module->GetTitle( ) , " " , "" ) ; - for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { - ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); - for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { - ModuleParameter mPara = pGroup.GetParameters( ).at( j ); + for ( unsigned long int i = 0 ; i < module->GetParameterGroups( ).size( ) ; i ++ ) { + ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ) ; + for ( unsigned long int j = 0 ; j < pGroup.GetParameters( ).size( ) ; j ++ ) { + ModuleParameter mPara = pGroup.GetParameters( ).at( j ) ; _cxx_inputs += "BBTK_DECLARE_INPUT ( " + mPara.GetName( ) + " , " + - mPara.GetCPPType( ) + " );\n"; + mPara.GetCPPType( ) + " );\n" ; _cxx_inputs_end += "BBTK_INPUT(" + _box_name + " , " + mPara.GetName( ) + " , " + "\"" + mPara.GetName( ) + "\"" + " , " + - mPara.GetCPPType( ) + ", \"\");\n"; + mPara.GetCPPType( ) + ", \"\");\n" ; } } - content = Mthd::Aux::replace_str( content, "_11111_", _cxx_inputs ); - content = Mthd::Aux::replace_str( content, "_22222_", _cxx_inputs_end ); + content = Mthd::Aux::replace_str( content , "_11111_" , _cxx_inputs ) ; + content = Mthd::Aux::replace_str( content , "_22222_" , _cxx_inputs_end ) ; - return content; + return content ; } const int getNumberOfArguments ( const ModuleDescription* module ) { - int number = 0; - for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { - ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); - for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { + int number = 0 ; + for ( unsigned long int i = 0 ; i < module->GetParameterGroups( ).size( ) ; i ++ ) { + ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ) ; + for ( unsigned long int j = 0 ; j < pGroup.GetParameters( ).size( ) ; j ++ ) { - ModuleParameter mPara = pGroup.GetParameters( ).at( j ); - number ++; + ModuleParameter mPara = pGroup.GetParameters( ).at( j ) ; + number ++ ; } } - return number; + return number ; } -std::string updateProcessMethod ( const ModuleDescription* module, std::string content, std::string lib ) { - int number = 0; - std::string arg_list = std::string( "" ); - for ( unsigned long int i = 0; i < module->GetParameterGroups( ).size( ); i ++ ) { - ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ); - for ( unsigned long int j = 0; j < pGroup.GetParameters( ).size( ); j ++ ) { +std::string updateProcessMethod ( const ModuleDescription* module , std::string content , std::string lib ) { + int number = 0 ; + std::string arg_list = std::string( "" ) ; + for ( unsigned long int i = 0 ; i < module->GetParameterGroups( ).size( ) ; i ++ ) { + ModuleParameterGroup pGroup = module->GetParameterGroups( ).at( i ) ; + for ( unsigned long int j = 0 ; j < pGroup.GetParameters( ).size( ) ; j ++ ) { - ModuleParameter mPara = pGroup.GetParameters( ).at( j ); + ModuleParameter mPara = pGroup.GetParameters( ).at( j ) ; - arg_list += "Mthd::Aux::toCharArrray( "; + arg_list += "Mthd::Aux::toCharArrray( " ; if ( mPara.GetFlag( ) != "" ) { - arg_list += "Mthd::Aux::toString( \""; - arg_list += "-" + mPara.GetFlag( ) + "\" "; - arg_list += " ) + "; + arg_list += "Mthd::Aux::toString( \"" ; + arg_list += "-" + mPara.GetFlag( ) + "\" " ; + arg_list += " ) + " ; } else if ( mPara.GetLongFlag( ) != "" ) { - arg_list += "Mthd::Aux::toString( \""; - arg_list += "--" + mPara.GetLongFlag( ) + "\" "; - arg_list += " ) + "; + arg_list += "Mthd::Aux::toString( \"" ; + arg_list += "--" + mPara.GetLongFlag( ) + "\" " ; + arg_list += " ) + " ; } - arg_list += "Mthd::Aux::toString( bbGetInput" + mPara.GetName( ) + "( ) )"; - arg_list += " ),\n"; - number ++; + arg_list += "Mthd::Aux::toString( bbGetInput" + mPara.GetName( ) + "( ) )" ; + arg_list += " ),\n" ; + number ++ ; } } - arg_list += "_EEENNNDDD_"; - arg_list = Mthd::Aux::replace_str( arg_list, ",\n_EEENNNDDD_", "" ); - std::string _argc = "\nint _argc =" + Mthd::Aux::toString( number ) + ";\n"; - std::string _slib = "std::string lib = \"" + lib + "\";\n"; - std::string _argv = "char * _argv[ ] = { " + arg_list + " };\n"; - return Mthd::Aux::replace_str( content, "_33333_", _argc + _slib + _argv ); + arg_list += "_EEENNNDDD_" ; + arg_list = Mthd::Aux::replace_str( arg_list , ",\n_EEENNNDDD_" , "" ) ; + std::string _argc = "\nint _argc =" + Mthd::Aux::toString( number ) + ";\n" ; + std::string _slib = "std::string lib = \"" + lib + "\";\n" ; + std::string _argv = "char * _argv[ ] = { " + arg_list + " };\n" ; + return Mthd::Aux::replace_str( content , "_33333_" , _argc + _slib + _argv ) ; } -int main ( int argc, char* argv[] ) { +std::vector < std::string > getFilesByExtention ( std::string dir , std::string ext ) { + std::vector < std::string > files ; + files.clear( ) ; + DIR *dp ; + struct dirent *dirp ; + if ( ( dp = opendir( dir.c_str( ) ) ) == NULL ) { + std::cout << "ERROR OPENING " << dir << std::endl ; + return files ; + } + + while ( ( dirp = readdir( dp ) ) != NULL ) { + std::string file = std::string( dirp->d_name ) ; + if ( Mthd::Aux::str_ends_with( file , ext ) ) { + files.push_back( file ) ; + } + } + closedir( dp ) ; + return files ; +} - int _argc = 3; - char * _argv[] = { "-s 20", "/home/riveros/Desktop/Experiments/RA1.mhd", "/home/riveros/Desktop/Experiments/RA1-OUT-MAIN.mhd" }; - std::string gblib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libGaussianBlurImageFilterLib.so"; +int main ( int argc , char* argv[] ) { - execute( gblib, _argc, _argv ); + // int _argc = 3 ; + // char * _argv[] = { "-s 20" , "/home/riveros/Desktop/Experiments/RA1.mhd" , "/home/riveros/Desktop/Experiments/RA1-OUT-MAIN.mhd" } ; + // execute( gblib , _argc , _argv ) ; - /// MODULE INFORMATION /// - const std::string des = getModuleDescription( gblib ); + const std::string dummy_body_str = loadDummyBody( ) ; + const std::string dummy_header_str = loadDummyHeader( ) ; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // - // std::cout << des << std::endl << std::endl; + const std::string directory = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/" ; + const std::vector < std::string > files = getFilesByExtention( directory , ".so" ) ; - ModuleDescription module; - ModuleDescriptionParser parser; + for ( unsigned int i = 0 ; i < files.size( ) ; i ++ ) { - parser.Parse( des, module ); + std::string gblib = directory + files.at( i ) ; + std::cout << "/// " << files.at( i ) << " ///" << std::endl ; - /// LOADING DUMMY FILES /// - std::string _body = loadDummyBody( ); - std::string _header = loadDummyHeader( ); + /// MODULE INFORMATION /// + std::string des = getModuleDescription( gblib ) ; + std::cout << " getModuleDescription( gblib )...OK" << std::endl ; - /// SETTING HEADER FILE /// - _header = updateBoxName( &module, _header ); - _header = updateBoxDescription( &module, _header ); - _header = updateBoxInputs( &module, _header ); - saveFile( _header, getHeaderFileName( &module ) ); + ModuleDescription module ; + ModuleDescriptionParser parser ; - /// SETTING BODY FILE /// - _body = updateBoxName( &module, _body ); - _body = updateProcessMethod( &module, _body, gblib ); - saveFile( _body, getBodyFileName( &module ) ); + parser.Parse( des , module ) ; + std::cout << " parser.Parse( des , module )...OK" << std::endl ; + /// LOADING DUMMY FILES /// + std::string _body = std::string( dummy_body_str ) ; + std::cout << " loadDummyBody( )...OK" << std::endl ; + std::string _header = std::string( dummy_header_str ) ; + std::cout << " loadDummyHeader( )...OK" << std::endl ; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // - // std::cout << _header << std::endl; - // - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // std::cout << "====================================" << std::endl << std::endl; - // - // std::cout << _body << std::endl; + /// SETTING HEADER FILE /// + _header = updateBoxName( &module , _header ) ; + std::cout << " updateBoxName( &module , _header )...OK" << std::endl ; + _header = updateBoxDescription( &module , _header ) ; + std::cout << " updateBoxDescription( &module , _header )...OK" << std::endl ; + _header = updateBoxInputs( &module , _header ) ; + std::cout << " updateBoxInputs( &module , _header )...OK" << std::endl ; + saveFile( _header , getHeaderFileName( &module ) ) ; - return EXIT_SUCCESS; + /// SETTING BODY FILE /// + _body = updateBoxName( &module , _body ) ; + std::cout << " updateBoxName( &module , _body )...OK" << std::endl ; + _body = updateProcessMethod( &module , _body , gblib ) ; + std::cout << " updateProcessMethod( &module , _body , gblib )...OK" << std::endl ; + saveFile( _body , getBodyFileName( &module ) ) ; + + std::cout << "/// EO " << files.at( i ) << " ///" << std::endl << std::endl ; + + gblib.clear( ) ; + des.clear( ) ; + //while ( getchar( ) != '\n' ) ; + + } + return EXIT_SUCCESS ; } diff --git a/bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx new file mode 100644 index 0000000..d66e444 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerAddImages.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerAddImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, AddImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( AddImages, bbtk::AtomicBlackBox ); + + void AddImages::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libAddLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--order" ) + Mthd::Aux::toString( bbGetInputorder( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void AddImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void AddImages::bbUserSetDefaultValues ( ) { + } + + void AddImages::bbUserInitializeProcessing ( ) { + } + + void AddImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerAddImages.h b/bbtk_Slicer_PKG/src/bbSlicerAddImages.h new file mode 100644 index 0000000..6cd6801 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerAddImages.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerAddImages_h_INCLUDED__ +#define __bbSlicerAddImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT AddImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( AddImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( inputVolume2 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( order , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( AddImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "AddImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Adds two images. Although all image types are supported on input, only signed types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(AddImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(AddImages , inputVolume2 , "inputVolume2" , std::string, ""); +BBTK_INPUT(AddImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(AddImages , order , "order" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( AddImages ) ; +} + +#endif // __bbSlicerAddImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.cxx b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.cxx new file mode 100644 index 0000000..2633329 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerBSplinetodeformationfield.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, BSplinetodeformationfield ) + BBTK_BLACK_BOX_IMPLEMENTATION ( BSplinetodeformationfield, bbtk::AtomicBlackBox ); + + void BSplinetodeformationfield::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libBSplineToDeformationFieldLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--tfm" ) + Mthd::Aux::toString( bbGetInputinputTransformName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--refImage" ) + Mthd::Aux::toString( bbGetInputreferenceImageName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--defImage" ) + Mthd::Aux::toString( bbGetInputdeformationFieldName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void BSplinetodeformationfield::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void BSplinetodeformationfield::bbUserSetDefaultValues ( ) { + } + + void BSplinetodeformationfield::bbUserInitializeProcessing ( ) { + } + + void BSplinetodeformationfield::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.h b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.h new file mode 100644 index 0000000..4815d58 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerBSplinetodeformationfield.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerBSplinetodeformationfield_h_INCLUDED__ +#define __bbSlicerBSplinetodeformationfield_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT BSplinetodeformationfield + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( BSplinetodeformationfield , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputTransformName , std::string ); +BBTK_DECLARE_INPUT ( referenceImageName , std::string ); +BBTK_DECLARE_INPUT ( deformationFieldName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( BSplinetodeformationfield , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "BSplinetodeformationfield" ) ; + BBTK_AUTHOR ( "Andrey Fedorov, BWH" ) ; + BBTK_DESCRIPTION ( "Create a dense deformation field from a bspline+bulk transform." ) ; + BBTK_CATEGORY ( "Legacy.Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(BSplinetodeformationfield , inputTransformName , "inputTransformName" , std::string, ""); +BBTK_INPUT(BSplinetodeformationfield , referenceImageName , "referenceImageName" , std::string, ""); +BBTK_INPUT(BSplinetodeformationfield , deformationFieldName , "deformationFieldName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( BSplinetodeformationfield ) ; +} + +#endif // __bbSlicerBSplinetodeformationfield_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.cxx b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.cxx new file mode 100644 index 0000000..ba3a358 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerCommandLineModuleTest.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, CommandLineModuleTest ) + BBTK_BLACK_BOX_IMPLEMENTATION ( CommandLineModuleTest, bbtk::AtomicBlackBox ); + + void CommandLineModuleTest::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libCLIModule4TestLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputvalue1" ) + Mthd::Aux::toString( bbGetInputInputValue1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputvalue2" ) + Mthd::Aux::toString( bbGetInputInputValue2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--operationtype" ) + Mthd::Aux::toString( bbGetInputOperationType( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputFile( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void CommandLineModuleTest::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void CommandLineModuleTest::bbUserSetDefaultValues ( ) { + } + + void CommandLineModuleTest::bbUserInitializeProcessing ( ) { + } + + void CommandLineModuleTest::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.h b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.h new file mode 100644 index 0000000..d8c2809 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCommandLineModuleTest.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerCommandLineModuleTest_h_INCLUDED__ +#define __bbSlicerCommandLineModuleTest_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT CommandLineModuleTest + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( CommandLineModuleTest , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputValue1 , int ); +BBTK_DECLARE_INPUT ( InputValue2 , int ); +BBTK_DECLARE_INPUT ( OperationType , std::string ); +BBTK_DECLARE_INPUT ( OutputFile , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( CommandLineModuleTest , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "CommandLineModuleTest" ) ; + BBTK_AUTHOR ( "Jean-Christophe Fillion-Robin" ) ; + BBTK_DESCRIPTION ( "Command line module used to test the automatic UI generator." ) ; + BBTK_CATEGORY ( "Testing" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(CommandLineModuleTest , InputValue1 , "InputValue1" , int, ""); +BBTK_INPUT(CommandLineModuleTest , InputValue2 , "InputValue2" , int, ""); +BBTK_INPUT(CommandLineModuleTest , OperationType , "OperationType" , std::string, ""); +BBTK_INPUT(CommandLineModuleTest , OutputFile , "OutputFile" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( CommandLineModuleTest ) ; +} + +#endif // __bbSlicerCommandLineModuleTest_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.cxx b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.cxx new file mode 100644 index 0000000..1fe0e73 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.cxx @@ -0,0 +1,74 @@ +#include "bbSlicerCreateaDICOMSeries.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, CreateaDICOMSeries ) + BBTK_BLACK_BOX_IMPLEMENTATION ( CreateaDICOMSeries, bbtk::AtomicBlackBox ); + + void CreateaDICOMSeries::Process ( ) { + + // GENERATED + +int _argc =20; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libImageReadDicomWriteLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--patientName" ) + Mthd::Aux::toString( bbGetInputpatientName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--patientID" ) + Mthd::Aux::toString( bbGetInputpatientID( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--patientComments" ) + Mthd::Aux::toString( bbGetInputpatientComments( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyID" ) + Mthd::Aux::toString( bbGetInputstudyID( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyDate" ) + Mthd::Aux::toString( bbGetInputstudyDate( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyComments" ) + Mthd::Aux::toString( bbGetInputstudyComments( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--studyDescription" ) + Mthd::Aux::toString( bbGetInputstudyDescription( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--modality" ) + Mthd::Aux::toString( bbGetInputmodality( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--manufacturer" ) + Mthd::Aux::toString( bbGetInputmanufacturer( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--model" ) + Mthd::Aux::toString( bbGetInputmodel( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--seriesNumber" ) + Mthd::Aux::toString( bbGetInputseriesNumber( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--seriesDescription" ) + Mthd::Aux::toString( bbGetInputseriesDescription( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--rescaleIntercept" ) + Mthd::Aux::toString( bbGetInputrescaleIntercept( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--rescaleSlope" ) + Mthd::Aux::toString( bbGetInputrescaleSlope( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dicomDirectory" ) + Mthd::Aux::toString( bbGetInputdicomDirectory( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dicomPrefix" ) + Mthd::Aux::toString( bbGetInputdicomPrefix( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dicomNumberFormat" ) + Mthd::Aux::toString( bbGetInputdicomNumberFormat( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--reverseImages" ) + Mthd::Aux::toString( bbGetInputreverseImages( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--useCompression" ) + Mthd::Aux::toString( bbGetInputuseCompression( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void CreateaDICOMSeries::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void CreateaDICOMSeries::bbUserSetDefaultValues ( ) { + } + + void CreateaDICOMSeries::bbUserInitializeProcessing ( ) { + } + + void CreateaDICOMSeries::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.h b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.h new file mode 100644 index 0000000..a7f3d19 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerCreateaDICOMSeries.h @@ -0,0 +1,96 @@ +#ifndef __bbSlicerCreateaDICOMSeries_h_INCLUDED__ +#define __bbSlicerCreateaDICOMSeries_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT CreateaDICOMSeries + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( CreateaDICOMSeries , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( patientName , std::string ); +BBTK_DECLARE_INPUT ( patientID , std::string ); +BBTK_DECLARE_INPUT ( patientComments , std::string ); +BBTK_DECLARE_INPUT ( studyID , std::string ); +BBTK_DECLARE_INPUT ( studyDate , std::string ); +BBTK_DECLARE_INPUT ( studyComments , std::string ); +BBTK_DECLARE_INPUT ( studyDescription , std::string ); +BBTK_DECLARE_INPUT ( modality , std::string ); +BBTK_DECLARE_INPUT ( manufacturer , std::string ); +BBTK_DECLARE_INPUT ( model , std::string ); +BBTK_DECLARE_INPUT ( seriesNumber , std::string ); +BBTK_DECLARE_INPUT ( seriesDescription , std::string ); +BBTK_DECLARE_INPUT ( rescaleIntercept , double ); +BBTK_DECLARE_INPUT ( rescaleSlope , double ); +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( dicomDirectory , std::string ); +BBTK_DECLARE_INPUT ( dicomPrefix , std::string ); +BBTK_DECLARE_INPUT ( dicomNumberFormat , std::string ); +BBTK_DECLARE_INPUT ( reverseImages , bool ); +BBTK_DECLARE_INPUT ( useCompression , bool ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( CreateaDICOMSeries , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "CreateaDICOMSeries" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Create a DICOM Series from a Slicer volume. User can specify values for selected DICOM tags in the UI. Given the number of tags DICOM series have, it is impossible to expose all tags in UI. So only important tags can be set by the user." ) ; + BBTK_CATEGORY ( "Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(CreateaDICOMSeries , patientName , "patientName" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , patientID , "patientID" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , patientComments , "patientComments" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyID , "studyID" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyDate , "studyDate" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyComments , "studyComments" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , studyDescription , "studyDescription" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , modality , "modality" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , manufacturer , "manufacturer" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , model , "model" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , seriesNumber , "seriesNumber" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , seriesDescription , "seriesDescription" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , rescaleIntercept , "rescaleIntercept" , double, ""); +BBTK_INPUT(CreateaDICOMSeries , rescaleSlope , "rescaleSlope" , double, ""); +BBTK_INPUT(CreateaDICOMSeries , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , dicomDirectory , "dicomDirectory" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , dicomPrefix , "dicomPrefix" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , dicomNumberFormat , "dicomNumberFormat" , std::string, ""); +BBTK_INPUT(CreateaDICOMSeries , reverseImages , "reverseImages" , bool, ""); +BBTK_INPUT(CreateaDICOMSeries , useCompression , "useCompression" , bool, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( CreateaDICOMSeries ) ; +} + +#endif // __bbSlicerCreateaDICOMSeries_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.cxx b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.cxx new file mode 100644 index 0000000..87e2029 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.cxx @@ -0,0 +1,61 @@ +#include "bbSlicerDicomtoNrrdConverter.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, DicomtoNrrdConverter ) + BBTK_BLACK_BOX_IMPLEMENTATION ( DicomtoNrrdConverter, bbtk::AtomicBlackBox ); + + void DicomtoNrrdConverter::Process ( ) { + + // GENERATED + +int _argc =7; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libDicomToNrrdConverterLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputDicomDirectory" ) + Mthd::Aux::toString( bbGetInputinputDicomDirectory( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputDirectory" ) + Mthd::Aux::toString( bbGetInputoutputDirectory( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputVolume" ) + Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--smallGradientThreshold" ) + Mthd::Aux::toString( bbGetInputsmallGradientThreshold( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--writeProtocolGradientsFile" ) + Mthd::Aux::toString( bbGetInputwriteProtocolGradientsFile( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--useIdentityMeaseurementFrame" ) + Mthd::Aux::toString( bbGetInputuseIdentityMeaseurementFrame( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--useBMatrixGradientDirections" ) + Mthd::Aux::toString( bbGetInputuseBMatrixGradientDirections( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void DicomtoNrrdConverter::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void DicomtoNrrdConverter::bbUserSetDefaultValues ( ) { + } + + void DicomtoNrrdConverter::bbUserInitializeProcessing ( ) { + } + + void DicomtoNrrdConverter::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.h b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.h new file mode 100644 index 0000000..808c738 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerDicomtoNrrdConverter.h @@ -0,0 +1,70 @@ +#ifndef __bbSlicerDicomtoNrrdConverter_h_INCLUDED__ +#define __bbSlicerDicomtoNrrdConverter_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT DicomtoNrrdConverter + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( DicomtoNrrdConverter , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputDicomDirectory , std::string ); +BBTK_DECLARE_INPUT ( outputDirectory , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( smallGradientThreshold , double ); +BBTK_DECLARE_INPUT ( writeProtocolGradientsFile , bool ); +BBTK_DECLARE_INPUT ( useIdentityMeaseurementFrame , bool ); +BBTK_DECLARE_INPUT ( useBMatrixGradientDirections , bool ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( DicomtoNrrdConverter , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "DicomtoNrrdConverter" ) ; + BBTK_AUTHOR ( "Xiaodong Tao" ) ; + BBTK_DESCRIPTION ( "Converts diffusion weighted MR images in dicom series into Nrrd format for analysis in Slicer. This program has been tested on only a limited subset of DTI dicom formats available from Siemens, GE, and Phillips scanners. Work in progress to support dicom multi-frame data. The program parses dicom header to extract necessary information about measurement frame, diffusion weighting directions, b-values, etc, and write out a nrrd image. For non-diffusion weighted dicom images, it loads in an entire dicom series and writes out a single dicom volume in a .nhdr/.raw pair." ) ; + BBTK_CATEGORY ( "Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(DicomtoNrrdConverter , inputDicomDirectory , "inputDicomDirectory" , std::string, ""); +BBTK_INPUT(DicomtoNrrdConverter , outputDirectory , "outputDirectory" , std::string, ""); +BBTK_INPUT(DicomtoNrrdConverter , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(DicomtoNrrdConverter , smallGradientThreshold , "smallGradientThreshold" , double, ""); +BBTK_INPUT(DicomtoNrrdConverter , writeProtocolGradientsFile , "writeProtocolGradientsFile" , bool, ""); +BBTK_INPUT(DicomtoNrrdConverter , useIdentityMeaseurementFrame , "useIdentityMeaseurementFrame" , bool, ""); +BBTK_INPUT(DicomtoNrrdConverter , useBMatrixGradientDirections , "useBMatrixGradientDirections" , bool, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( DicomtoNrrdConverter ) ; +} + +#endif // __bbSlicerDicomtoNrrdConverter_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.cxx b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.cxx new file mode 100644 index 0000000..5afd4d6 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.cxx @@ -0,0 +1,60 @@ +#include "bbSlicerExtractSkeleton.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, ExtractSkeleton ) + BBTK_BLACK_BOX_IMPLEMENTATION ( ExtractSkeleton, bbtk::AtomicBlackBox ); + + void ExtractSkeleton::Process ( ) { + + // GENERATED + +int _argc =6; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libExtractSkeletonLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--type" ) + Mthd::Aux::toString( bbGetInputSkeletonType( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--dontPrune" ) + Mthd::Aux::toString( bbGetInputDontPruneBranches( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numPoints" ) + Mthd::Aux::toString( bbGetInputNumberOfPoints( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--pointsFile" ) + Mthd::Aux::toString( bbGetInputOutputPointsFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void ExtractSkeleton::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void ExtractSkeleton::bbUserSetDefaultValues ( ) { + } + + void ExtractSkeleton::bbUserInitializeProcessing ( ) { + } + + void ExtractSkeleton::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h new file mode 100644 index 0000000..3b47fb2 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerExtractSkeleton.h @@ -0,0 +1,68 @@ +#ifndef __bbSlicerExtractSkeleton_h_INCLUDED__ +#define __bbSlicerExtractSkeleton_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT ExtractSkeleton + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( ExtractSkeleton , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputImageFileName , std::string ); +BBTK_DECLARE_INPUT ( OutputImageFileName , std::string ); +BBTK_DECLARE_INPUT ( SkeletonType , std::string ); +BBTK_DECLARE_INPUT ( DontPruneBranches , bool ); +BBTK_DECLARE_INPUT ( NumberOfPoints , int ); +BBTK_DECLARE_INPUT ( OutputPointsFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( ExtractSkeleton , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "ExtractSkeleton" ) ; + BBTK_AUTHOR ( "Pierre Seroul, Martin Styner, Guido Gerig, and Stephen Aylward" ) ; + BBTK_DESCRIPTION ( "Extract the skeleton of a binary object. The skeleton can be limited to being a 1D curve or allowed to be a full 2D manifold. The branches of the skeleton can be pruned so that only the maximal center skeleton is returned." ) ; + BBTK_CATEGORY ( "Filtering" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(ExtractSkeleton , InputImageFileName , "InputImageFileName" , std::string, ""); +BBTK_INPUT(ExtractSkeleton , OutputImageFileName , "OutputImageFileName" , std::string, ""); +BBTK_INPUT(ExtractSkeleton , SkeletonType , "SkeletonType" , std::string, ""); +BBTK_INPUT(ExtractSkeleton , DontPruneBranches , "DontPruneBranches" , bool, ""); +BBTK_INPUT(ExtractSkeleton , NumberOfPoints , "NumberOfPoints" , int, ""); +BBTK_INPUT(ExtractSkeleton , OutputPointsFileName , "OutputPointsFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( ExtractSkeleton ) ; +} + +#endif // __bbSlicerExtractSkeleton_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.cxx b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.cxx new file mode 100644 index 0000000..a4f41cb --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.cxx @@ -0,0 +1,67 @@ +#include "bbSlicerFastNonrigidBSplineregistration.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, FastNonrigidBSplineregistration ) + BBTK_BLACK_BOX_IMPLEMENTATION ( FastNonrigidBSplineregistration, bbtk::AtomicBlackBox ); + + void FastNonrigidBSplineregistration::Process ( ) { + + // GENERATED + +int _argc =13; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libBSplineDeformableRegistrationLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-i" ) + Mthd::Aux::toString( bbGetInputIterations( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-g" ) + Mthd::Aux::toString( bbGetInputgridSize( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-b" ) + Mthd::Aux::toString( bbGetInputHistogramBins( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-s" ) + Mthd::Aux::toString( bbGetInputSpatialSamples( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--constrain" ) + Mthd::Aux::toString( bbGetInputConstrainDeformation( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-m" ) + Mthd::Aux::toString( bbGetInputMaximumDeformation( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-d" ) + Mthd::Aux::toString( bbGetInputDefaultPixelValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--initialtransform" ) + Mthd::Aux::toString( bbGetInputInitialTransform( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputFixedImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputMovingImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputtransform" ) + Mthd::Aux::toString( bbGetInputOutputTransform( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputwarp" ) + Mthd::Aux::toString( bbGetInputOutputWarp( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--resampledmovingfilename" ) + Mthd::Aux::toString( bbGetInputResampledImageFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void FastNonrigidBSplineregistration::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void FastNonrigidBSplineregistration::bbUserSetDefaultValues ( ) { + } + + void FastNonrigidBSplineregistration::bbUserInitializeProcessing ( ) { + } + + void FastNonrigidBSplineregistration::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.h b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.h new file mode 100644 index 0000000..dbb3cf3 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerFastNonrigidBSplineregistration.h @@ -0,0 +1,82 @@ +#ifndef __bbSlicerFastNonrigidBSplineregistration_h_INCLUDED__ +#define __bbSlicerFastNonrigidBSplineregistration_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT FastNonrigidBSplineregistration + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( FastNonrigidBSplineregistration , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( Iterations , int ); +BBTK_DECLARE_INPUT ( gridSize , int ); +BBTK_DECLARE_INPUT ( HistogramBins , int ); +BBTK_DECLARE_INPUT ( SpatialSamples , int ); +BBTK_DECLARE_INPUT ( ConstrainDeformation , bool ); +BBTK_DECLARE_INPUT ( MaximumDeformation , float ); +BBTK_DECLARE_INPUT ( DefaultPixelValue , int ); +BBTK_DECLARE_INPUT ( InitialTransform , std::string ); +BBTK_DECLARE_INPUT ( FixedImageFileName , std::string ); +BBTK_DECLARE_INPUT ( MovingImageFileName , std::string ); +BBTK_DECLARE_INPUT ( OutputTransform , std::string ); +BBTK_DECLARE_INPUT ( OutputWarp , std::string ); +BBTK_DECLARE_INPUT ( ResampledImageFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( FastNonrigidBSplineregistration , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "FastNonrigidBSplineregistration" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Registers two images together using BSpline transform and mutual information." ) ; + BBTK_CATEGORY ( "Legacy.Registration" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(FastNonrigidBSplineregistration , Iterations , "Iterations" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , gridSize , "gridSize" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , HistogramBins , "HistogramBins" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , SpatialSamples , "SpatialSamples" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , ConstrainDeformation , "ConstrainDeformation" , bool, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , MaximumDeformation , "MaximumDeformation" , float, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , DefaultPixelValue , "DefaultPixelValue" , int, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , InitialTransform , "InitialTransform" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , FixedImageFileName , "FixedImageFileName" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , MovingImageFileName , "MovingImageFileName" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , OutputTransform , "OutputTransform" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , OutputWarp , "OutputWarp" , std::string, ""); +BBTK_INPUT(FastNonrigidBSplineregistration , ResampledImageFileName , "ResampledImageFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( FastNonrigidBSplineregistration ) ; +} + +#endif // __bbSlicerFastNonrigidBSplineregistration_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.cxx b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.cxx new file mode 100644 index 0000000..cf71b1e --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerImageLabelCombine.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, ImageLabelCombine ) + BBTK_BLACK_BOX_IMPLEMENTATION ( ImageLabelCombine, bbtk::AtomicBlackBox ); + + void ImageLabelCombine::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libImageLabelCombineLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputLabelMap_A( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputLabelMap_B( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputLabelMap( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-f" ) + Mthd::Aux::toString( bbGetInputFirstOverwrites( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void ImageLabelCombine::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void ImageLabelCombine::bbUserSetDefaultValues ( ) { + } + + void ImageLabelCombine::bbUserInitializeProcessing ( ) { + } + + void ImageLabelCombine::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.h b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.h new file mode 100644 index 0000000..6404950 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerImageLabelCombine.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerImageLabelCombine_h_INCLUDED__ +#define __bbSlicerImageLabelCombine_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT ImageLabelCombine + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( ImageLabelCombine , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputLabelMap_A , std::string ); +BBTK_DECLARE_INPUT ( InputLabelMap_B , std::string ); +BBTK_DECLARE_INPUT ( OutputLabelMap , std::string ); +BBTK_DECLARE_INPUT ( FirstOverwrites , bool ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( ImageLabelCombine , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "ImageLabelCombine" ) ; + BBTK_AUTHOR ( "Alex Yarmarkovich" ) ; + BBTK_DESCRIPTION ( "Combine two label maps into one" ) ; + BBTK_CATEGORY ( "Filtering" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(ImageLabelCombine , InputLabelMap_A , "InputLabelMap_A" , std::string, ""); +BBTK_INPUT(ImageLabelCombine , InputLabelMap_B , "InputLabelMap_B" , std::string, ""); +BBTK_INPUT(ImageLabelCombine , OutputLabelMap , "OutputLabelMap" , std::string, ""); +BBTK_INPUT(ImageLabelCombine , FirstOverwrites , "FirstOverwrites" , bool, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( ImageLabelCombine ) ; +} + +#endif // __bbSlicerImageLabelCombine_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.cxx b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.cxx new file mode 100644 index 0000000..8d6febc --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.cxx @@ -0,0 +1,60 @@ +#include "bbSlicerLabelMapSmoothing.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, LabelMapSmoothing ) + BBTK_BLACK_BOX_IMPLEMENTATION ( LabelMapSmoothing, bbtk::AtomicBlackBox ); + + void LabelMapSmoothing::Process ( ) { + + // GENERATED + +int _argc =6; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libLabelMapSmoothingLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--labelToSmooth" ) + Mthd::Aux::toString( bbGetInputlabelToSmooth( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numberOfIterations" ) + Mthd::Aux::toString( bbGetInputnumberOfIterations( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--maxRMSError" ) + Mthd::Aux::toString( bbGetInputmaxRMSError( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--gaussianSigma" ) + Mthd::Aux::toString( bbGetInputgaussianSigma( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void LabelMapSmoothing::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void LabelMapSmoothing::bbUserSetDefaultValues ( ) { + } + + void LabelMapSmoothing::bbUserInitializeProcessing ( ) { + } + + void LabelMapSmoothing::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.h b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.h new file mode 100644 index 0000000..38f5675 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerLabelMapSmoothing.h @@ -0,0 +1,68 @@ +#ifndef __bbSlicerLabelMapSmoothing_h_INCLUDED__ +#define __bbSlicerLabelMapSmoothing_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT LabelMapSmoothing + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( LabelMapSmoothing , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( labelToSmooth , int ); +BBTK_DECLARE_INPUT ( numberOfIterations , int ); +BBTK_DECLARE_INPUT ( maxRMSError , float ); +BBTK_DECLARE_INPUT ( gaussianSigma , float ); +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( LabelMapSmoothing , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "LabelMapSmoothing" ) ; + BBTK_AUTHOR ( "Dirk Padfield, Josh Cates, Ross Whitaker" ) ; + BBTK_DESCRIPTION ( "This filter smoothes a binary label map. With a label map as input, this filter runs an anti-alising algorithm followed by a Gaussian smoothing algorithm. The output is a smoothed label map." ) ; + BBTK_CATEGORY ( "Surface Models" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(LabelMapSmoothing , labelToSmooth , "labelToSmooth" , int, ""); +BBTK_INPUT(LabelMapSmoothing , numberOfIterations , "numberOfIterations" , int, ""); +BBTK_INPUT(LabelMapSmoothing , maxRMSError , "maxRMSError" , float, ""); +BBTK_INPUT(LabelMapSmoothing , gaussianSigma , "gaussianSigma" , float, ""); +BBTK_INPUT(LabelMapSmoothing , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(LabelMapSmoothing , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( LabelMapSmoothing ) ; +} + +#endif // __bbSlicerLabelMapSmoothing_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.cxx b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.cxx new file mode 100644 index 0000000..946408f --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.cxx @@ -0,0 +1,64 @@ +#include "bbSlicerMRIBiasFieldCorrection.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MRIBiasFieldCorrection ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MRIBiasFieldCorrection, bbtk::AtomicBlackBox ); + + void MRIBiasFieldCorrection::Process ( ) { + + // GENERATED + +int _argc =10; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMRIBiasFieldCorrectionLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputImage" ) + Mthd::Aux::toString( bbGetInputInputImage( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--inputMask" ) + Mthd::Aux::toString( bbGetInputInputMask( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputImage" ) + Mthd::Aux::toString( bbGetInputOutputImage( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--algorithmType" ) + Mthd::Aux::toString( bbGetInputAlgorithmType( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--shrinkFactor" ) + Mthd::Aux::toString( bbGetInputShrinkFactor( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--maximumNumberOfIterations" ) + Mthd::Aux::toString( bbGetInputMaximumNumberOfIterations( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numberOfFittingLevels" ) + Mthd::Aux::toString( bbGetInputNumberOfFittingLevels( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--wienerFilterNoise" ) + Mthd::Aux::toString( bbGetInputWienerFilterNoise( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--fullWidthAtHalfMaximum" ) + Mthd::Aux::toString( bbGetInputFullWidthAtHalfMaximum( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--convergenceThreshold" ) + Mthd::Aux::toString( bbGetInputConvergenceThreshold( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MRIBiasFieldCorrection::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MRIBiasFieldCorrection::bbUserSetDefaultValues ( ) { + } + + void MRIBiasFieldCorrection::bbUserInitializeProcessing ( ) { + } + + void MRIBiasFieldCorrection::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.h b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.h new file mode 100644 index 0000000..7b491ff --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMRIBiasFieldCorrection.h @@ -0,0 +1,76 @@ +#ifndef __bbSlicerMRIBiasFieldCorrection_h_INCLUDED__ +#define __bbSlicerMRIBiasFieldCorrection_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MRIBiasFieldCorrection + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MRIBiasFieldCorrection , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputImage , std::string ); +BBTK_DECLARE_INPUT ( InputMask , std::string ); +BBTK_DECLARE_INPUT ( OutputImage , std::string ); +BBTK_DECLARE_INPUT ( AlgorithmType , std::string ); +BBTK_DECLARE_INPUT ( ShrinkFactor , int ); +BBTK_DECLARE_INPUT ( MaximumNumberOfIterations , int ); +BBTK_DECLARE_INPUT ( NumberOfFittingLevels , int ); +BBTK_DECLARE_INPUT ( WienerFilterNoise , double ); +BBTK_DECLARE_INPUT ( FullWidthAtHalfMaximum , double ); +BBTK_DECLARE_INPUT ( ConvergenceThreshold , double ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MRIBiasFieldCorrection , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MRIBiasFieldCorrection" ) ; + BBTK_AUTHOR ( "Sylvain Jaume (MIT)" ) ; + BBTK_DESCRIPTION ( "Corrects 3D MRI images corrupted by MRI gain field effect. This module removes the slow-varying intensity variation from a 3D image. The output image has a higher contrast locally and the visualization and reading of the image are improved. This is an important pre-processinbg step for image operations requiring intensity perfect images, such as the Expectation Maximization segmentation (see EMSegment module). The N3 and N4 methods are described in N4ITK: Nick's N3 ITK Implementation For MRI Bias Field Correction, Tustison N., Gee J., Insight Journal, 2009. http://hdl.handle.net/10380/3053 The Slicer code was contributed by Sylvain Jaume (MIT) for NA-MIC (http://na-mic.org)." ) ; + BBTK_CATEGORY ( "Legacy.Filtering" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MRIBiasFieldCorrection , InputImage , "InputImage" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , InputMask , "InputMask" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , OutputImage , "OutputImage" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , AlgorithmType , "AlgorithmType" , std::string, ""); +BBTK_INPUT(MRIBiasFieldCorrection , ShrinkFactor , "ShrinkFactor" , int, ""); +BBTK_INPUT(MRIBiasFieldCorrection , MaximumNumberOfIterations , "MaximumNumberOfIterations" , int, ""); +BBTK_INPUT(MRIBiasFieldCorrection , NumberOfFittingLevels , "NumberOfFittingLevels" , int, ""); +BBTK_INPUT(MRIBiasFieldCorrection , WienerFilterNoise , "WienerFilterNoise" , double, ""); +BBTK_INPUT(MRIBiasFieldCorrection , FullWidthAtHalfMaximum , "FullWidthAtHalfMaximum" , double, ""); +BBTK_INPUT(MRIBiasFieldCorrection , ConvergenceThreshold , "ConvergenceThreshold" , double, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MRIBiasFieldCorrection ) ; +} + +#endif // __bbSlicerMRIBiasFieldCorrection_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx new file mode 100644 index 0000000..e657ec1 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.cxx @@ -0,0 +1,59 @@ +#include "bbSlicerMaskImage.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MaskImage ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MaskImage, bbtk::AtomicBlackBox ); + + void MaskImage::Process ( ) { + + // GENERATED + +int _argc =5; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMaskLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputMaskVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-l" ) + Mthd::Aux::toString( bbGetInputLabel( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-r" ) + Mthd::Aux::toString( bbGetInputReplace( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MaskImage::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MaskImage::bbUserSetDefaultValues ( ) { + } + + void MaskImage::bbUserInitializeProcessing ( ) { + } + + void MaskImage::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMaskImage.h b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.h new file mode 100644 index 0000000..1dbe285 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMaskImage.h @@ -0,0 +1,66 @@ +#ifndef __bbSlicerMaskImage_h_INCLUDED__ +#define __bbSlicerMaskImage_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MaskImage + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MaskImage , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputVolume , std::string ); +BBTK_DECLARE_INPUT ( MaskVolume , std::string ); +BBTK_DECLARE_INPUT ( OutputVolume , std::string ); +BBTK_DECLARE_INPUT ( Label , int ); +BBTK_DECLARE_INPUT ( Replace , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MaskImage , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MaskImage" ) ; + BBTK_AUTHOR ( "Nicole Aucoin, BWH (Ron Kikinis, BWH)" ) ; + BBTK_DESCRIPTION ( "Masks two images. The output image is set to 0 everywhere except where the chosen label from the mask volume is present, at which point it will retain it's original values. Although all image types are supported on input, only signed types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MaskImage , InputVolume , "InputVolume" , std::string, ""); +BBTK_INPUT(MaskImage , MaskVolume , "MaskVolume" , std::string, ""); +BBTK_INPUT(MaskImage , OutputVolume , "OutputVolume" , std::string, ""); +BBTK_INPUT(MaskImage , Label , "Label" , int, ""); +BBTK_INPUT(MaskImage , Replace , "Replace" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MaskImage ) ; +} + +#endif // __bbSlicerMaskImage_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx new file mode 100644 index 0000000..fec4de3 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerMergeModels.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MergeModels ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MergeModels, bbtk::AtomicBlackBox ); + + void MergeModels::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMergeModelsLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputModel1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputModel2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputModelOutput( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MergeModels::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MergeModels::bbUserSetDefaultValues ( ) { + } + + void MergeModels::bbUserInitializeProcessing ( ) { + } + + void MergeModels::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMergeModels.h b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.h new file mode 100644 index 0000000..2ff5f2d --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMergeModels.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerMergeModels_h_INCLUDED__ +#define __bbSlicerMergeModels_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MergeModels + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MergeModels , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( Model1 , std::string ); +BBTK_DECLARE_INPUT ( Model2 , std::string ); +BBTK_DECLARE_INPUT ( ModelOutput , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MergeModels , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MergeModels" ) ; + BBTK_AUTHOR ( "Nicole Aucoin BWH (Ron Kikinis, BWH), Daniel Haehn" ) ; + BBTK_DESCRIPTION ( "Merge the polydata from two input models and output a new model with the added polydata. Uses the vtkAppendPolyData filter. Works on .vtp and .vtk surface files." ) ; + BBTK_CATEGORY ( "Surface Models" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MergeModels , Model1 , "Model1" , std::string, ""); +BBTK_INPUT(MergeModels , Model2 , "Model2" , std::string, ""); +BBTK_INPUT(MergeModels , ModelOutput , "ModelOutput" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MergeModels ) ; +} + +#endif // __bbSlicerMergeModels_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.cxx new file mode 100644 index 0000000..d7afe4c --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerMultiplyImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, MultiplyImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( MultiplyImages, bbtk::AtomicBlackBox ); + + void MultiplyImages::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libMultiplyLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--order" ) + Mthd::Aux::toString( bbGetInputorder( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void MultiplyImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void MultiplyImages::bbUserSetDefaultValues ( ) { + } + + void MultiplyImages::bbUserInitializeProcessing ( ) { + } + + void MultiplyImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h new file mode 100644 index 0000000..4b41b7e --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerMultiplyImages.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerMultiplyImages_h_INCLUDED__ +#define __bbSlicerMultiplyImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT MultiplyImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( MultiplyImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( inputVolume2 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( order , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( MultiplyImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "MultiplyImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Multiplies two images. Although all image types are supported on input, only signed types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(MultiplyImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(MultiplyImages , inputVolume2 , "inputVolume2" , std::string, ""); +BBTK_INPUT(MultiplyImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(MultiplyImages , order , "order" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( MultiplyImages ) ; +} + +#endif // __bbSlicerMultiplyImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx new file mode 100644 index 0000000..ad000d5 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerOrientImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, OrientImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( OrientImages, bbtk::AtomicBlackBox ); + + void OrientImages::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libOrientImageLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-o" ) + Mthd::Aux::toString( bbGetInputorientation( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void OrientImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void OrientImages::bbUserSetDefaultValues ( ) { + } + + void OrientImages::bbUserInitializeProcessing ( ) { + } + + void OrientImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOrientImages.h b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.h new file mode 100644 index 0000000..aa56ba3 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOrientImages.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerOrientImages_h_INCLUDED__ +#define __bbSlicerOrientImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT OrientImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( OrientImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( orientation , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( OrientImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "OrientImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Orients an output volume. Rearranges the slices in a volume according to the selected orientation. The slices are not interpolated. They are just reordered and/or permuted. The resulting volume will cover the original volume. NOTE: since Slicer takes into account the orientation of a volume, the re-oriented volume will not show any difference from the original volume, To see the difference, save the volume and display it with a system that either ignores the orientation of the image (e.g. Paraview) or displays individual images." ) ; + BBTK_CATEGORY ( "Converters" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(OrientImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(OrientImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(OrientImages , orientation , "orientation" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( OrientImages ) ; +} + +#endif // __bbSlicerOrientImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.cxx b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.cxx new file mode 100644 index 0000000..7b0ad99 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.cxx @@ -0,0 +1,60 @@ +#include "bbSlicerOtsuThresholdSegmentation.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, OtsuThresholdSegmentation ) + BBTK_BLACK_BOX_IMPLEMENTATION ( OtsuThresholdSegmentation, bbtk::AtomicBlackBox ); + + void OtsuThresholdSegmentation::Process ( ) { + + // GENERATED + +int _argc =6; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libOtsuThresholdSegmentationLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--brightObjects" ) + Mthd::Aux::toString( bbGetInputbrightObjects( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--numberOfBins" ) + Mthd::Aux::toString( bbGetInputnumberOfBins( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--faceConnected" ) + Mthd::Aux::toString( bbGetInputfaceConnected( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--minimumObjectSize" ) + Mthd::Aux::toString( bbGetInputminimumObjectSize( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void OtsuThresholdSegmentation::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void OtsuThresholdSegmentation::bbUserSetDefaultValues ( ) { + } + + void OtsuThresholdSegmentation::bbUserInitializeProcessing ( ) { + } + + void OtsuThresholdSegmentation::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.h b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.h new file mode 100644 index 0000000..f05b8f9 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerOtsuThresholdSegmentation.h @@ -0,0 +1,68 @@ +#ifndef __bbSlicerOtsuThresholdSegmentation_h_INCLUDED__ +#define __bbSlicerOtsuThresholdSegmentation_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT OtsuThresholdSegmentation + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( OtsuThresholdSegmentation , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( brightObjects , bool ); +BBTK_DECLARE_INPUT ( numberOfBins , int ); +BBTK_DECLARE_INPUT ( faceConnected , bool ); +BBTK_DECLARE_INPUT ( minimumObjectSize , int ); +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( OtsuThresholdSegmentation , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "OtsuThresholdSegmentation" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "This filter creates a labeled image from a grayscale image. First, it calculates an optimal threshold that separates the image into foreground and background. This threshold separates those two classes so that their intra-class variance is minimal (see http://en.wikipedia.org/wiki/Otsu%27s_method). Then the filter runs a connected component algorithm to generate unique labels for each connected region of the foreground. Finally, the resulting image is relabeled to provide consecutive numbering." ) ; + BBTK_CATEGORY ( "Legacy.Segmentation" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(OtsuThresholdSegmentation , brightObjects , "brightObjects" , bool, ""); +BBTK_INPUT(OtsuThresholdSegmentation , numberOfBins , "numberOfBins" , int, ""); +BBTK_INPUT(OtsuThresholdSegmentation , faceConnected , "faceConnected" , bool, ""); +BBTK_INPUT(OtsuThresholdSegmentation , minimumObjectSize , "minimumObjectSize" , int, ""); +BBTK_INPUT(OtsuThresholdSegmentation , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(OtsuThresholdSegmentation , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( OtsuThresholdSegmentation ) ; +} + +#endif // __bbSlicerOtsuThresholdSegmentation_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.cxx b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.cxx new file mode 100644 index 0000000..c5d57d7 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerPolyDataToLabelMap.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, PolyDataToLabelMap ) + BBTK_BLACK_BOX_IMPLEMENTATION ( PolyDataToLabelMap, bbtk::AtomicBlackBox ); + + void PolyDataToLabelMap::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libPolyDataToLabelmapLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--distance" ) + Mthd::Aux::toString( bbGetInputsampleDistance( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputsurface( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void PolyDataToLabelMap::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void PolyDataToLabelMap::bbUserSetDefaultValues ( ) { + } + + void PolyDataToLabelMap::bbUserInitializeProcessing ( ) { + } + + void PolyDataToLabelMap::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.h b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.h new file mode 100644 index 0000000..b35d201 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerPolyDataToLabelMap.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerPolyDataToLabelMap_h_INCLUDED__ +#define __bbSlicerPolyDataToLabelMap_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT PolyDataToLabelMap + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( PolyDataToLabelMap , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( sampleDistance , float ); +BBTK_DECLARE_INPUT ( InputVolume , std::string ); +BBTK_DECLARE_INPUT ( surface , std::string ); +BBTK_DECLARE_INPUT ( OutputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( PolyDataToLabelMap , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "PolyDataToLabelMap" ) ; + BBTK_AUTHOR ( "Nicole Aucoin BWH, Xiaodong Tao, GE" ) ; + BBTK_DESCRIPTION ( "Intersects an input model with an reference volume and produces an output label map." ) ; + BBTK_CATEGORY ( "Surface Models" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(PolyDataToLabelMap , sampleDistance , "sampleDistance" , float, ""); +BBTK_INPUT(PolyDataToLabelMap , InputVolume , "InputVolume" , std::string, ""); +BBTK_INPUT(PolyDataToLabelMap , surface , "surface" , std::string, ""); +BBTK_INPUT(PolyDataToLabelMap , OutputVolume , "OutputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( PolyDataToLabelMap ) ; +} + +#endif // __bbSlicerPolyDataToLabelMap_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.cxx b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.cxx new file mode 100644 index 0000000..9c4da33 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.cxx @@ -0,0 +1,62 @@ +#include "bbSlicerRobustStatisticsSegmentation.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, RobustStatisticsSegmentation ) + BBTK_BLACK_BOX_IMPLEMENTATION ( RobustStatisticsSegmentation, bbtk::AtomicBlackBox ); + + void RobustStatisticsSegmentation::Process ( ) { + + // GENERATED + +int _argc =8; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libRobustStatSegmenterLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-v" ) + Mthd::Aux::toString( bbGetInputexpectedVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--intensityHomogeneity" ) + Mthd::Aux::toString( bbGetInputintensityHomogeneity( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-c" ) + Mthd::Aux::toString( bbGetInputcurvatureWeight( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--labelValue" ) + Mthd::Aux::toString( bbGetInputlabelValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--maxRunningTime" ) + Mthd::Aux::toString( bbGetInputmaxRunningTime( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoriginalImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputlabelImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputsegmentedImageFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void RobustStatisticsSegmentation::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void RobustStatisticsSegmentation::bbUserSetDefaultValues ( ) { + } + + void RobustStatisticsSegmentation::bbUserInitializeProcessing ( ) { + } + + void RobustStatisticsSegmentation::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.h b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.h new file mode 100644 index 0000000..404a527 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerRobustStatisticsSegmentation.h @@ -0,0 +1,72 @@ +#ifndef __bbSlicerRobustStatisticsSegmentation_h_INCLUDED__ +#define __bbSlicerRobustStatisticsSegmentation_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT RobustStatisticsSegmentation + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( RobustStatisticsSegmentation , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( expectedVolume , double ); +BBTK_DECLARE_INPUT ( intensityHomogeneity , double ); +BBTK_DECLARE_INPUT ( curvatureWeight , double ); +BBTK_DECLARE_INPUT ( labelValue , int ); +BBTK_DECLARE_INPUT ( maxRunningTime , double ); +BBTK_DECLARE_INPUT ( originalImageFileName , std::string ); +BBTK_DECLARE_INPUT ( labelImageFileName , std::string ); +BBTK_DECLARE_INPUT ( segmentedImageFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( RobustStatisticsSegmentation , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "RobustStatisticsSegmentation" ) ; + BBTK_AUTHOR ( "Yi Gao, Allen Tannenbaum, Ron Kikinis" ) ; + BBTK_DESCRIPTION ( "Active contour segmentation using robust statistic." ) ; + BBTK_CATEGORY ( "Segmentation.Specialized" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(RobustStatisticsSegmentation , expectedVolume , "expectedVolume" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , intensityHomogeneity , "intensityHomogeneity" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , curvatureWeight , "curvatureWeight" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , labelValue , "labelValue" , int, ""); +BBTK_INPUT(RobustStatisticsSegmentation , maxRunningTime , "maxRunningTime" , double, ""); +BBTK_INPUT(RobustStatisticsSegmentation , originalImageFileName , "originalImageFileName" , std::string, ""); +BBTK_INPUT(RobustStatisticsSegmentation , labelImageFileName , "labelImageFileName" , std::string, ""); +BBTK_INPUT(RobustStatisticsSegmentation , segmentedImageFileName , "segmentedImageFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( RobustStatisticsSegmentation ) ; +} + +#endif // __bbSlicerRobustStatisticsSegmentation_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx new file mode 100644 index 0000000..11b5ec4 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.cxx @@ -0,0 +1,56 @@ +#include "bbSlicerSimpleIOTest.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, SimpleIOTest ) + BBTK_BLACK_BOX_IMPLEMENTATION ( SimpleIOTest, bbtk::AtomicBlackBox ); + + void SimpleIOTest::Process ( ) { + + // GENERATED + +int _argc =2; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libDiffusionTensorTestLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void SimpleIOTest::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void SimpleIOTest::bbUserSetDefaultValues ( ) { + } + + void SimpleIOTest::bbUserInitializeProcessing ( ) { + } + + void SimpleIOTest::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h new file mode 100644 index 0000000..d0d353a --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSimpleIOTest.h @@ -0,0 +1,60 @@ +#ifndef __bbSlicerSimpleIOTest_h_INCLUDED__ +#define __bbSlicerSimpleIOTest_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT SimpleIOTest + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( SimpleIOTest , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( SimpleIOTest , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "SimpleIOTest" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Simple test of tensor IO" ) ; + BBTK_CATEGORY ( "Legacy.Work in Progress.Diffusion Tensor.Test" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(SimpleIOTest , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(SimpleIOTest , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( SimpleIOTest ) ; +} + +#endif // __bbSlicerSimpleIOTest_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.cxx b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.cxx new file mode 100644 index 0000000..61efd45 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerSubtractImages.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, SubtractImages ) + BBTK_BLACK_BOX_IMPLEMENTATION ( SubtractImages, bbtk::AtomicBlackBox ); + + void SubtractImages::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libSubtractLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume1( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume2( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--order" ) + Mthd::Aux::toString( bbGetInputorder( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void SubtractImages::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void SubtractImages::bbUserSetDefaultValues ( ) { + } + + void SubtractImages::bbUserInitializeProcessing ( ) { + } + + void SubtractImages::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h new file mode 100644 index 0000000..2a53b19 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerSubtractImages.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerSubtractImages_h_INCLUDED__ +#define __bbSlicerSubtractImages_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT SubtractImages + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( SubtractImages , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( inputVolume1 , std::string ); +BBTK_DECLARE_INPUT ( inputVolume2 , std::string ); +BBTK_DECLARE_INPUT ( outputVolume , std::string ); +BBTK_DECLARE_INPUT ( order , int ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( SubtractImages , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "SubtractImages" ) ; + BBTK_AUTHOR ( "Bill Lorensen" ) ; + BBTK_DESCRIPTION ( "Subtracts two images. Although all image types are supported on input, only sugned types are produced. The two images do not have to have the same dimensions." ) ; + BBTK_CATEGORY ( "Filtering.Arithmetic" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(SubtractImages , inputVolume1 , "inputVolume1" , std::string, ""); +BBTK_INPUT(SubtractImages , inputVolume2 , "inputVolume2" , std::string, ""); +BBTK_INPUT(SubtractImages , outputVolume , "outputVolume" , std::string, ""); +BBTK_INPUT(SubtractImages , order , "order" , int, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( SubtractImages ) ; +} + +#endif // __bbSlicerSubtractImages_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.cxx b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.cxx new file mode 100644 index 0000000..b9a81fe --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.cxx @@ -0,0 +1,58 @@ +#include "bbSlicerTestGridTransformregistration.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, TestGridTransformregistration ) + BBTK_BLACK_BOX_IMPLEMENTATION ( TestGridTransformregistration, bbtk::AtomicBlackBox ); + + void TestGridTransformregistration::Process ( ) { + + // GENERATED + +int _argc =4; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libTestGridTransformRegistrationLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-g" ) + Mthd::Aux::toString( bbGetInputgridSize( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--outputtransform" ) + Mthd::Aux::toString( bbGetInputOutputTransform( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputFixedImageFileName( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputMovingImageFileName( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void TestGridTransformregistration::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void TestGridTransformregistration::bbUserSetDefaultValues ( ) { + } + + void TestGridTransformregistration::bbUserInitializeProcessing ( ) { + } + + void TestGridTransformregistration::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.h b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.h new file mode 100644 index 0000000..e7e7d54 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerTestGridTransformregistration.h @@ -0,0 +1,64 @@ +#ifndef __bbSlicerTestGridTransformregistration_h_INCLUDED__ +#define __bbSlicerTestGridTransformregistration_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT TestGridTransformregistration + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( TestGridTransformregistration , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( gridSize , int ); +BBTK_DECLARE_INPUT ( OutputTransform , std::string ); +BBTK_DECLARE_INPUT ( FixedImageFileName , std::string ); +BBTK_DECLARE_INPUT ( MovingImageFileName , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( TestGridTransformregistration , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "TestGridTransformregistration" ) ; + BBTK_AUTHOR ( "Yinglin Lee" ) ; + BBTK_DESCRIPTION ( "Generates a GridTransform to test the communication facilities" ) ; + BBTK_CATEGORY ( "Legacy.Registration" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(TestGridTransformregistration , gridSize , "gridSize" , int, ""); +BBTK_INPUT(TestGridTransformregistration , OutputTransform , "OutputTransform" , std::string, ""); +BBTK_INPUT(TestGridTransformregistration , FixedImageFileName , "FixedImageFileName" , std::string, ""); +BBTK_INPUT(TestGridTransformregistration , MovingImageFileName , "MovingImageFileName" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( TestGridTransformregistration ) ; +} + +#endif // __bbSlicerTestGridTransformregistration_h_INCLUDED__ + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.cxx b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.cxx new file mode 100644 index 0000000..611ce07 --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.cxx @@ -0,0 +1,61 @@ +#include "bbSlicerThresholdImage.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, ThresholdImage ) + BBTK_BLACK_BOX_IMPLEMENTATION ( ThresholdImage, bbtk::AtomicBlackBox ); + + void ThresholdImage::Process ( ) { + + // GENERATED + +int _argc =7; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libThresholdLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputInputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputOutputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-t" ) + Mthd::Aux::toString( bbGetInputThresholdValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-l" ) + Mthd::Aux::toString( bbGetInputLower( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-u" ) + Mthd::Aux::toString( bbGetInputUpper( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-v" ) + Mthd::Aux::toString( bbGetInputOutsideValue( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( "--thresholdtype" ) + Mthd::Aux::toString( bbGetInputThresholdType( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void ThresholdImage::execute ( std::string lib, int _argc, char * _argv[] ) { + void* handle = dlopen( lib.c_str( ), RTLD_NOW | RTLD_GLOBAL ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return; + } + typedef int (*method_t )( int argc, char * argv[] ); + // RESET ERROR + dlerror( ); + // PROTOTYPE + method_t myMethod = ( method_t ) dlsym( handle, "ModuleEntryPoint" ); + const char *dlsym_error = dlerror( ); + if ( dlsym_error ) { + std::cerr << "CAN'T LOAD SYMBOL 'ModuleEntryPoint':" << dlsym_error << '\n'; + dlclose( handle ); + return; + } + // METHOD CALL + myMethod( _argc, _argv ); + // CLOSING LIB + dlclose( handle ); + } + + void ThresholdImage::bbUserSetDefaultValues ( ) { + } + + void ThresholdImage::bbUserInitializeProcessing ( ) { + } + + void ThresholdImage::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h new file mode 100644 index 0000000..622007f --- /dev/null +++ b/bbtk_Slicer_PKG/src/bbSlicerThresholdImage.h @@ -0,0 +1,70 @@ +#ifndef __bbSlicerThresholdImage_h_INCLUDED__ +#define __bbSlicerThresholdImage_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "CreationTool.h" + +namespace bbSlicer { + + class bbSlicer_EXPORT ThresholdImage + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( ThresholdImage , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( InputVolume , std::string ); +BBTK_DECLARE_INPUT ( OutputVolume , std::string ); +BBTK_DECLARE_INPUT ( ThresholdValue , int ); +BBTK_DECLARE_INPUT ( Lower , int ); +BBTK_DECLARE_INPUT ( Upper , int ); +BBTK_DECLARE_INPUT ( OutsideValue , int ); +BBTK_DECLARE_INPUT ( ThresholdType , std::string ); + + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( ThresholdImage , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "ThresholdImage" ) ; + BBTK_AUTHOR ( "Nicole Aucoin, BWH (Ron Kikinis, BWH)" ) ; + BBTK_DESCRIPTION ( "

Threshold an image.

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

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

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

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

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

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