From 462cbc78485df39d3141c2d1e6137c4b78ab5db2 Mon Sep 17 00:00:00 2001 From: riveros Date: Fri, 30 Mar 2012 15:36:45 +0200 Subject: [PATCH] Simple DL-Open example Used to test dl execution aka sandbox! --- ModuleCall/.dep.inc | 5 + ModuleCall/CMakeLists.txt | 32 ++++ ModuleCall/CreationTool.cxx | 164 +++++++++++++++++ ModuleCall/CreationTool.h | 63 +++++++ ModuleCall/Makefile | 193 ++++++++++++++++++++ ModuleCall/bbSlicerDummy.dummy_cxx | 50 ++++++ ModuleCall/bbSlicerDummy.dummy_h | 53 ++++++ ModuleCall/bbSlicerDummyBackUp.h | 34 ++++ ModuleCall/bbSlicerGaussianBlur.cxx | 57 ++++++ ModuleCall/bbSlicerGaussianBlur.h | 62 +++++++ ModuleCall/cmake_install.cmake | 44 +++++ ModuleCall/interoperating_Baby | Bin 0 -> 183304 bytes ModuleCall/main.cpp | 266 ++++++++++++++++++++++++++++ 13 files changed, 1023 insertions(+) create mode 100644 ModuleCall/.dep.inc create mode 100644 ModuleCall/CMakeLists.txt create mode 100644 ModuleCall/CreationTool.cxx create mode 100644 ModuleCall/CreationTool.h create mode 100644 ModuleCall/Makefile create mode 100644 ModuleCall/bbSlicerDummy.dummy_cxx create mode 100644 ModuleCall/bbSlicerDummy.dummy_h create mode 100644 ModuleCall/bbSlicerDummyBackUp.h create mode 100644 ModuleCall/bbSlicerGaussianBlur.cxx create mode 100644 ModuleCall/bbSlicerGaussianBlur.h create mode 100644 ModuleCall/cmake_install.cmake create mode 100755 ModuleCall/interoperating_Baby create mode 100644 ModuleCall/main.cpp diff --git a/ModuleCall/.dep.inc b/ModuleCall/.dep.inc new file mode 100644 index 0000000..4560e55 --- /dev/null +++ b/ModuleCall/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/ModuleCall/CMakeLists.txt b/ModuleCall/CMakeLists.txt new file mode 100644 index 0000000..474b985 --- /dev/null +++ b/ModuleCall/CMakeLists.txt @@ -0,0 +1,32 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +project (Inter) +set (Inter_VERSION_MAJOR 1) +set (Inter_VERSION_MINOR 0) + +SET(CMAKE_CXX_FLAGS "-ldl -w") + +FIND_PACKAGE (GenerateCLP REQUIRED) +if (GenerateCLP_FOUND) + INCLUDE(${GenerateCLP_USE_FILE}) +endif (GenerateCLP_FOUND) + +FIND_PACKAGE (ModuleDescriptionParser REQUIRED) +if (ModuleDescriptionParser_FOUND) + INCLUDE(${ModuleDescriptionParser_USE_FILE}) +endif (ModuleDescriptionParser_FOUND) + +SET(INCLUDE_DIRS + ${GenerateCLP_BINARY_DIR} + ${GenerateCLP_SOURCE_DIR} + ${ModuleDescriptionParser_BINARY_DIR} + ${ModuleDescriptionParser_SOURCE_DIR} + ) + +SET(LINK_DIRECTORIES + ${GenerateCLP_LINK_DIRECTORY} + ${ModuleDescriptionParser_LINK_DIRECTORY} + ) + +ADD_EXECUTABLE (interoperating_Baby main.cpp CreationTool.cxx) +TARGET_LINK_LIBRARIES (interoperating_Baby ${ModuleDescriptionParser_LIBRARY} ModuleDescriptionParser ) + diff --git a/ModuleCall/CreationTool.cxx b/ModuleCall/CreationTool.cxx new file mode 100644 index 0000000..8203b4d --- /dev/null +++ b/ModuleCall/CreationTool.cxx @@ -0,0 +1,164 @@ +/* + * File: CreationTool.cxx + * Author: riveros + * + * Created on 23 mars 2012, 10:12 + */ + +#include "CreationTool.h" + +std::string Mthd::Aux::toString ( float n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( double n ) { + 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::string Mthd::Aux::toString ( char n ) { + 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::string Mthd::Aux::toString ( short n ) { + 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::string Mthd::Aux::toString ( int n ) { + 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::string Mthd::Aux::toString ( unsigned int n ) { + 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::string Mthd::Aux::toString ( unsigned long long n ) { + std::ostringstream oss; + oss << n; + return oss.str( ); +} + +std::string Mthd::Aux::toString ( std::string n ) { + return n; +} + +char* Mthd::Aux::toCharArrray ( float n ) { + 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( ) ); +} + +char* Mthd::Aux::toCharArrray ( long double n ) { + 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( ) ); +} + +char* Mthd::Aux::toCharArrray ( unsigned char n ) { + 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( ) ); +} + +char* Mthd::Aux::toCharArrray ( unsigned short n ) { + 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( ) ); +} + +char* Mthd::Aux::toCharArrray ( long int n ) { + 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( ) ); +} + +char* Mthd::Aux::toCharArrray ( long unsigned int n ) { + 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( ) ); +} + +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 ); + } + return input; +} + diff --git a/ModuleCall/CreationTool.h b/ModuleCall/CreationTool.h new file mode 100644 index 0000000..1859178 --- /dev/null +++ b/ModuleCall/CreationTool.h @@ -0,0 +1,63 @@ +/* + * File: CreationTool.h + * Author: riveros + * + * Created on 23 mars 2012, 10:12 + */ + +#ifndef CREATIONTOOL_H +#define CREATIONTOOL_H + +#include +#include +#include + +namespace Mthd { + + class Aux { + public: + static std::string toString ( float n ) ; + static std::string toString ( double n ) ; + static std::string toString ( long double n ) ; + + static std::string toString ( char n ) ; + static std::string toString ( unsigned char n ) ; + + static std::string toString ( short n ) ; + static std::string toString ( unsigned short n ) ; + + static std::string toString ( int n ) ; + static std::string toString ( long int n ) ; + static std::string toString ( unsigned int n ) ; + static std::string toString ( unsigned long n ) ; + static std::string toString ( unsigned long long n ) ; + + static std::string toString ( std::string n ) ; + + static char* toCharArrray ( float n ) ; + static char* toCharArrray ( double n ) ; + static char* toCharArrray ( long double n ) ; + + static char* toCharArrray ( char n ) ; + static char* toCharArrray ( unsigned char n ) ; + + static char* toCharArrray ( short n ) ; + static char* toCharArrray ( unsigned short n ) ; + + static char* toCharArrray ( int n ) ; + static char* toCharArrray ( long int n ) ; + static char* toCharArrray ( unsigned int n ) ; + static char* toCharArrray ( long unsigned int n ) ; + + static char* toCharArrray ( std::string n ) ; + + static std::string replace_str ( std::string input , std::string old_str , std::string new_str ) ; + + } ; + +} ; + + + +#endif /* CREATIONTOOL_H */ + diff --git a/ModuleCall/Makefile b/ModuleCall/Makefile new file mode 100644 index 0000000..c4a8046 --- /dev/null +++ b/ModuleCall/Makefile @@ -0,0 +1,193 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Produce verbose output by default. +VERBOSE = 1 + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/bin/cmake + +# The command to remove a file. +RM = /usr/local/bin/cmake -E remove -f + +# The program to use to edit the cache. +CMAKE_EDIT_COMMAND = /usr/local/bin/ccmake + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/riveros/NetBeansProjects/ModuleCall + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/riveros/NetBeansProjects/ModuleCall + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/riveros/NetBeansProjects/ModuleCall/CMakeFiles /home/riveros/NetBeansProjects/ModuleCall/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/riveros/NetBeansProjects/ModuleCall/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named interoperating_Baby + +# Build rule for target. +interoperating_Baby: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 interoperating_Baby +.PHONY : interoperating_Baby + +# fast build rule for target. +interoperating_Baby/fast: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/build +.PHONY : interoperating_Baby/fast + +CreationTool.o: CreationTool.cxx.o +.PHONY : CreationTool.o + +# target to build an object file +CreationTool.cxx.o: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/CreationTool.cxx.o +.PHONY : CreationTool.cxx.o + +CreationTool.i: CreationTool.cxx.i +.PHONY : CreationTool.i + +# target to preprocess a source file +CreationTool.cxx.i: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/CreationTool.cxx.i +.PHONY : CreationTool.cxx.i + +CreationTool.s: CreationTool.cxx.s +.PHONY : CreationTool.s + +# target to generate assembly for a file +CreationTool.cxx.s: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/CreationTool.cxx.s +.PHONY : CreationTool.cxx.s + +main.o: main.cpp.o +.PHONY : main.o + +# target to build an object file +main.cpp.o: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) -f CMakeFiles/interoperating_Baby.dir/build.make CMakeFiles/interoperating_Baby.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... interoperating_Baby" + @echo "... rebuild_cache" + @echo "... CreationTool.o" + @echo "... CreationTool.i" + @echo "... CreationTool.s" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/ModuleCall/bbSlicerDummy.dummy_cxx b/ModuleCall/bbSlicerDummy.dummy_cxx new file mode 100644 index 0000000..462fdea --- /dev/null +++ b/ModuleCall/bbSlicerDummy.dummy_cxx @@ -0,0 +1,50 @@ +#include "bbSlicerDummy.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, Dummy ) + BBTK_BLACK_BOX_IMPLEMENTATION ( Dummy, bbtk::AtomicBlackBox ); + + void Dummy::Process ( ) { + + // GENERATED +_33333_ + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void Dummy::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 Dummy::bbUserSetDefaultValues ( ) { + } + + void Dummy::bbUserInitializeProcessing ( ) { + } + + void Dummy::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + diff --git a/ModuleCall/bbSlicerDummy.dummy_h b/ModuleCall/bbSlicerDummy.dummy_h new file mode 100644 index 0000000..1dd4d56 --- /dev/null +++ b/ModuleCall/bbSlicerDummy.dummy_h @@ -0,0 +1,53 @@ +#ifndef __bbSlicerDummy_h_INCLUDED__ +#define __bbSlicerDummy_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 Dummy + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( Dummy , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + _11111_ + // EO GENERATED ARGS + + BBTK_PROCESS ( Process ) ; + void Process ( ) ; + private: + void execute ( std::string lib , int _argc , char * _argv[] ) ; + } ; + + BBTK_BEGIN_DESCRIBE_BLACK_BOX ( Dummy , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "_NNNNN_" ) ; + BBTK_AUTHOR ( "_AAAAA_" ) ; + BBTK_DESCRIPTION ( "_DDDDD_" ) ; + BBTK_CATEGORY ( "_CCCCC_" ) ; + + // GENERATED DESCRPTION + _22222_ + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( Dummy ) ; +} + +#endif // __bbSlicerDummy_h_INCLUDED__ + diff --git a/ModuleCall/bbSlicerDummyBackUp.h b/ModuleCall/bbSlicerDummyBackUp.h new file mode 100644 index 0000000..3287b72 --- /dev/null +++ b/ModuleCall/bbSlicerDummyBackUp.h @@ -0,0 +1,34 @@ +#ifndef __bbSlicerDummy_h_INCLUDED__ +#define __bbSlicerDummy_h_INCLUDED__ + +#include "bbSlicer_EXPORT.h" +#include "bbtkAtomicBlackBox.h" + +#include +#include +#include + +namespace bbSlicer +{ +class bbSlicer_EXPORT Dummy:public bbtk::AtomicBlackBox{ + BBTK_BLACK_BOX_INTERFACE(Dummy,bbtk::AtomicBlackBox); +// GENERATED + BBTK_DECLARE_INPUT(In,double); +// EO GENERATED + BBTK_PROCESS(Process); + void Process(); +}; + +BBTK_BEGIN_DESCRIBE_BLACK_BOX(Dummy,bbtk::AtomicBlackBox); +BBTK_NAME("_NNNN"); +BBTK_AUTHOR("_AAAA"); +BBTK_DESCRIPTION("_DDDD"); +BBTK_CATEGORY("_CCCC"); +// GENERATED +BBTK_INPUT(Dummy,In,"input",double,""); +// EO GENERATED +BBTK_END_DESCRIBE_BLACK_BOX(Dummy); +} + +#endif // __bbSlicerDummy_h_INCLUDED__ + diff --git a/ModuleCall/bbSlicerGaussianBlur.cxx b/ModuleCall/bbSlicerGaussianBlur.cxx new file mode 100644 index 0000000..bb99921 --- /dev/null +++ b/ModuleCall/bbSlicerGaussianBlur.cxx @@ -0,0 +1,57 @@ +#include "bbSlicerGaussianBlur.h" +#include "bbSlicerPackage.h" + +namespace bbSlicer { + BBTK_ADD_BLACK_BOX_TO_PACKAGE ( Slicer, GaussianBlur ) + BBTK_BLACK_BOX_IMPLEMENTATION ( GaussianBlur, bbtk::AtomicBlackBox ); + + void GaussianBlur::Process ( ) { + + // GENERATED + +int _argc =3; +std::string lib = "/home/riveros/.slicer/Slicer4-bin/Slicer-build/lib/Slicer-4.0/cli-modules/libGaussianBlurImageFilterLib.so"; +char * _argv[ ] = { Mthd::Aux::toCharArrray( Mthd::Aux::toString( "-s" ) + Mthd::Aux::toString( bbGetInputsigma( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputinputVolume( ) ) ), +Mthd::Aux::toCharArrray( Mthd::Aux::toString( bbGetInputoutputVolume( ) ) ) }; + + // EO GENERATED + this->execute( lib, _argc, _argv ); + + } + + void GaussianBlur::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 GaussianBlur::bbUserSetDefaultValues ( ) { + } + + void GaussianBlur::bbUserInitializeProcessing ( ) { + } + + void GaussianBlur::bbUserFinalizeProcessing ( ) { + } +} +// EO namespace bbSlicer + + diff --git a/ModuleCall/bbSlicerGaussianBlur.h b/ModuleCall/bbSlicerGaussianBlur.h new file mode 100644 index 0000000..98aa7bf --- /dev/null +++ b/ModuleCall/bbSlicerGaussianBlur.h @@ -0,0 +1,62 @@ +#ifndef __bbSlicerGaussianBlur_h_INCLUDED__ +#define __bbSlicerGaussianBlur_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 GaussianBlur + : + public bbtk::AtomicBlackBox { + BBTK_BLACK_BOX_INTERFACE ( GaussianBlur , bbtk::AtomicBlackBox ) ; + + // GENERATED ARGS + +BBTK_DECLARE_INPUT ( sigma , double ); +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 ( GaussianBlur , bbtk::AtomicBlackBox ) ; + BBTK_NAME ( "GaussianBlur" ) ; + BBTK_AUTHOR ( "Julien Jomier and Stephen Aylward" ) ; + BBTK_DESCRIPTION ( "Apply a gaussian blurr to an image" ) ; + BBTK_CATEGORY ( "Filtering.Denoising" ) ; + + // GENERATED DESCRPTION + +BBTK_INPUT(GaussianBlur , sigma , "sigma" , double, ""); +BBTK_INPUT(GaussianBlur , inputVolume , "inputVolume" , std::string, ""); +BBTK_INPUT(GaussianBlur , outputVolume , "outputVolume" , std::string, ""); + + // EO GENERATED DESCRIPTION + + BBTK_END_DESCRIBE_BLACK_BOX ( GaussianBlur ) ; +} + +#endif // __bbSlicerGaussianBlur_h_INCLUDED__ + + diff --git a/ModuleCall/cmake_install.cmake b/ModuleCall/cmake_install.cmake new file mode 100644 index 0000000..754308a --- /dev/null +++ b/ModuleCall/cmake_install.cmake @@ -0,0 +1,44 @@ +# Install script for directory: /home/riveros/NetBeansProjects/ModuleCall + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr/local") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Debug") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +ELSE(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +ENDIF(CMAKE_INSTALL_COMPONENT) + +FILE(WRITE "/home/riveros/NetBeansProjects/ModuleCall/${CMAKE_INSTALL_MANIFEST}" "") +FOREACH(file ${CMAKE_INSTALL_MANIFEST_FILES}) + FILE(APPEND "/home/riveros/NetBeansProjects/ModuleCall/${CMAKE_INSTALL_MANIFEST}" "${file}\n") +ENDFOREACH(file) diff --git a/ModuleCall/interoperating_Baby b/ModuleCall/interoperating_Baby new file mode 100755 index 0000000000000000000000000000000000000000..72882e86731fb5acfd82e01787413dcccef7bc0d GIT binary patch literal 183304 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

2|@4i`EPqOME3V}(y88l$(uL{>Pon? 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 WMJ~*Bjgk;&mn6Bd7bwhO8~=ZJW*1ff literal 0 HcmV?d00001 diff --git a/ModuleCall/main.cpp b/ModuleCall/main.cpp new file mode 100644 index 0000000..9f7d71a --- /dev/null +++ b/ModuleCall/main.cpp @@ -0,0 +1,266 @@ +/* + * File: main.cpp + * Author: gabriel + * + * Created on 15 février 2012, 19:50 + */ + +#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 ); + if ( ! handle ) { + std::cerr << "CAN'T OPEN LIBRARY: " << dlerror( ) << '\n'; + return NULL; + } + typedef char* ( *method_t )( void ); + // RESET ERRORS + 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; + } + // CALLING METHOD + char* descrption = myMethod( ); + // CLOSING LIB + dlclose( handle ); + return descrption; + +} + +void 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 ERRORS + 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; + } + // CALLING METHOD + myMethod( _argc, _argv ); + // CLOSING LIB + 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( ); +} + +std::string loadFile ( std::string filename ) { + std::string line = std::string( "" ); + std::string content = std::string( "" ); + + std::ifstream infile; + infile.open( filename.c_str( ) ); + while ( ! infile.eof( ) ) { + getline( infile, line ); + content += line + "\n"; + line.clear( ); + } + infile.close( ); + return content; + +} + +std::string loadDummyBody ( ) { + return loadFile( "bbSlicerDummy.dummy_cxx" ); +} + +std::string loadDummyHeader ( ) { + 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 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 getBodyFileName ( const ModuleDescription* module ) { + std::string name = Mthd::Aux::replace_str( module->GetTitle( ), " ", "" ); + + return "bbSlicer" + name + ".cxx"; +} + +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( ), " ", "" ); + + 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"; + + _cxx_inputs_end += + "BBTK_INPUT(" + + _box_name + " , " + + mPara.GetName( ) + " , " + + "\"" + mPara.GetName( ) + "\"" + " , " + + mPara.GetCPPType( ) + ", \"\");\n"; + } + } + content = Mthd::Aux::replace_str( content, "_11111_", _cxx_inputs ); + content = Mthd::Aux::replace_str( content, "_22222_", _cxx_inputs_end ); + + 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 ++ ) { + + ModuleParameter mPara = pGroup.GetParameters( ).at( j ); + 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 ++ ) { + + ModuleParameter mPara = pGroup.GetParameters( ).at( j ); + + arg_list += "Mthd::Aux::toCharArrray( "; + if ( mPara.GetFlag( ) != "" ) { + 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( 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 ); +} + +int main ( int argc, char* argv[] ) { + + 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"; + + execute( gblib, _argc, _argv ); + + /// MODULE INFORMATION /// + const std::string des = getModuleDescription( gblib ); + + // 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; + + ModuleDescription module; + ModuleDescriptionParser parser; + + parser.Parse( des, module ); + + /// LOADING DUMMY FILES /// + std::string _body = loadDummyBody( ); + std::string _header = loadDummyHeader( ); + + /// SETTING HEADER FILE /// + _header = updateBoxName( &module, _header ); + _header = updateBoxDescription( &module, _header ); + _header = updateBoxInputs( &module, _header ); + saveFile( _header, getHeaderFileName( &module ) ); + + /// SETTING BODY FILE /// + _body = updateBoxName( &module, _body ); + _body = updateProcessMethod( &module, _body, gblib ); + saveFile( _body, getBodyFileName( &module ) ); + + + // 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; + + return EXIT_SUCCESS; +} -- 2.47.1