X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2Fbash%2FInteractivePipelineCreator.cxx.d;fp=appli%2Fbash%2FInteractivePipelineCreator.cxx.d;h=0a72019106d56845cee46c52c1c3d3598951108d;hb=2e142df11d6f312a2a2b5097b8da73571ed523e8;hp=0000000000000000000000000000000000000000;hpb=61b3659afe961ed248f30e26f9ca8f28fcfafddc;p=cpPlugins.git diff --git a/appli/bash/InteractivePipelineCreator.cxx.d b/appli/bash/InteractivePipelineCreator.cxx.d new file mode 100644 index 0000000..0a72019 --- /dev/null +++ b/appli/bash/InteractivePipelineCreator.cxx.d @@ -0,0 +1,319 @@ +// ========================================================================= +// @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co) +// ========================================================================= + +$cmd=help;list;exit;create;describe;define;save;load;connect + +#include +#include +#include + +// ------------------------------------------------------------------------- +class Console + : public TinyCon::CompletionConsole +{ +public: + typedef Console Self; + typedef TinyCon::CompletionConsole Superclass; + + typedef cpPlugins::Manager TManager; + typedef cpPlugins::Pipeline TPipeline; + typedef cpPlugins::ProcessObject TProcessObject; + typedef cpPlugins::Filter TFilter; + typedef cpPlugins::Functor TFunctor; + typedef TManager::TPlugins TPlugins; + +public: + Console( const std::string& prompt ); + virtual ~Console( ); + + virtual int trigger( const std::vector< std::string >& args ) override; + + bool _cmd_help( const std::vector< std::string >& args ); + bool _cmd_list( const std::vector< std::string >& args ); + bool _cmd_exit( const std::vector< std::string >& args ); + bool _cmd_create( const std::vector< std::string >& args ); + bool _cmd_describe( const std::vector< std::string >& args ); + bool _cmd_define( const std::vector< std::string >& args ); + bool _cmd_save( const std::vector< std::string >& args ); + bool _cmd_load( const std::vector< std::string >& args ); + bool _cmd_connect( const std::vector< std::string >& args ); + +protected: + TTrie* m_CommandsTrie; + TTrie* m_PluginsTrie; + TTrie* m_InputsTrie; + TTrie* m_OutputsTrie; + + TManager m_Manager; + TPipeline::SharedPtr m_Pipeline; +}; + +// ------------------------------------------------------------------------- +int main( int argc, char* argv[] ) +{ + std::cout << "Welcome to cpPlugins' interactive creator" << std::endl; + Console console( "> " ); + console.run( ); + return( 0 ); +} + +// ------------------------------------------------------------------------- +Console:: +Console( const std::string& prompt ) + : Superclass( prompt ) +{ + + // Add base commands and prepare help + this->m_CommandsTrie = new TTrie( ); + {{#cmd}} + this->addCommand( "{{cmd}}" ); + this->m_CommandsTrie->insert( "{{cmd}}" ); + {{/cmd}} + this->addCommand( "help", this->m_CommandsTrie ); + + // Add "create" options + this->m_PluginsTrie = new TTrie( ); + this->m_Manager.Configure( ); + for( const TPlugins::value_type& p: this->m_Manager.GetPlugins( ) ) + this->m_PluginsTrie->insert( p.first ); + this->addCommand( "create", this->m_PluginsTrie ); + + // Add "connect" options + this->m_InputsTrie = new TTrie( ); + this->m_OutputsTrie = new TTrie( ); + this->addCommand( "connect", this->m_OutputsTrie ); + + // Prepare pipeline + this->m_Pipeline = TPipeline::New( ); +} + +// ------------------------------------------------------------------------- +Console:: +~Console( ) +{ + /* TODO + delete this->m_CommandsTrie; + delete this->m_PluginsTrie; + delete this->m_InputsTrie; + delete this->m_OutputsTrie; + */ +} + +// ------------------------------------------------------------------------- +int Console:: +trigger( const std::vector< std::string >& args ) +{ + {{#cmd}} + if( args[ 0 ] == "{{cmd}}" ) + return( ( this->_cmd_{{cmd}}( args ) )? 0: 1 ); + else + {{/cmd}} + return( 0 ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_help( const std::vector< std::string >& args ) +{ + return( true ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_list( const std::vector< std::string >& args ) +{ + std::cout << this->m_Manager << std::endl; + return( true ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_exit( const std::vector< std::string >& args ) +{ + this->quit( ); + return( false ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_create( const std::vector< std::string >& args ) +{ + // Get arguments + std::string nClass = ""; + std::string nName = ""; + if( args.size( ) > 1 ) + { + nClass = args[ 1 ]; + if( args.size( ) > 2 ) + nName = args[ 2 ]; + + TProcessObject* p = + this->m_Pipeline->Cast< cpPlugins::Pipeline >( )-> + CreateNode( nClass, nName ); + if( p != NULL ) + { + // Prepare "describe" command + this->addCommand( "describe", p->GetName( ) ); + + // Prepare "connect" command + std::set< std::string > iNames = p->GetAllInputsNames( ); + for( const std::string& s: iNames ) + this->m_InputsTrie->insert( p->GetName( ) + "%" + s ); + std::set< std::string > oNames = p->GetAllOutputsNames( ); + for( const std::string& s: oNames ) + this->m_OutputsTrie->insert( p->GetName( ) + "%" + s )-> + setExtension( this->m_InputsTrie ); + + // Show some information + std::cout + << "Node \"" << p->GetName( ) << "\" of type \"" + << p->GetClassName( ) << "\" created." << std::endl; + } + else + std::cout << "Could not create node." << std::endl; + } + else + std::cout + << "Invalid \"create\" command: create nClass [nName]" + << std::endl; + return( true ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_describe( const std::vector< std::string >& args ) +{ + if( args.size( ) > 1 ) + { + TProcessObject* p = + this->m_Pipeline->Cast< cpPlugins::Pipeline >( )->GetNode( args[ 1 ] ); + if( p != NULL ) + p->Print( std::cout ); + else + std::cout + << "Node \"" << args[ 1 ] << "\" does not exists." + << std::endl; + } + else + std::cout + << "Invalid \"describe\" command: describe nName" + << std::endl; + return( true ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_define( const std::vector< std::string >& args ) +{ + if( args.size( ) > 3 ) + { + if( args[ 1 ] == "input" ) + { + std::cout << "TODO input" << std::endl; + } + else if( args[ 1 ] == "output" ) + { + std::cout << "TODO output" << std::endl; + } + else + std::cout + << "Invalid \"define\" command: define [input/output] Port%Node node" + << std::endl; + /* TODO + TProcessObject* p = + this->m_Pipeline->Cast< cpPlugins::Pipeline >( )->GetNode( args[ 1 ] ); + if( p != NULL ) + p->Print( std::cout ); + else + std::cout + << "Node \"" << args[ 1 ] << "\" does not exists." + << std::endl; + */ + } + else + std::cout + << "Invalid \"define\" command: define [input/output] Port%Node node" + << std::endl; + return( true ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_save( const std::vector< std::string >& args ) +{ + if( args.size( ) > 1 ) + { + try + { + this->m_Pipeline->Cast< TPipeline >( )->SaveXML( args[ 1 ] ); + } + catch( std::exception& err ) + { + std::cout << "Error caught: " << err.what( ) << std::endl; + } // end try + } + else + std::cout + << "Invalid \"save\" command: save filename" + << std::endl; + return( true ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_load( const std::vector< std::string >& args ) +{ + if( args.size( ) > 1 ) + { + try + { + this->m_Pipeline->Cast< TPipeline >( )->LoadXML( args[ 1 ] ); + + // TODO: update tries!!! + } + catch( std::exception& err ) + { + std::cout << "Error caught: " << err.what( ) << std::endl; + } // end try + } + else + std::cout + << "Invalid \"save\" command: save filename" + << std::endl; + return( true ); +} + +// ------------------------------------------------------------------------- +bool Console:: +_cmd_connect( const std::vector< std::string >& args ) +{ + std::size_t oPos = args[ 1 ].find_first_of( "%" ); + std::size_t dPos = args[ 2 ].find_first_of( "%" ); + std::string oObj = args[ 1 ].substr( 0, oPos ); + std::string dObj = args[ 2 ].substr( 0, dPos ); + std::string oPort = args[ 1 ].substr( oPos + 1 ); + std::string dPort = args[ 2 ].substr( dPos + 1 ); + + try + { + this->m_Pipeline->Cast< TPipeline >( )->Connect( + args[ 1 ].substr( 0, oPos ), + args[ 2 ].substr( 0, dPos ), + args[ 1 ].substr( oPos + 1 ), + args[ 2 ].substr( dPos + 1 ) + ); + } + catch( std::exception& err ) + { + std::cout << "Error caught: " << err.what( ) << std::endl; + } // end try + std::cout + << "Connection between \"" << args[ 1 ] + << "\" and \"" << args[ 2 ] << "\" done!" + << std::endl; + + return( true ); +} + +// eof - $RCSfile$