/*========================================================================= Program: bbtk Module: $RCSfile: bbtkComplexBlackBox.h,v $ Language: C++ Date: $Date: 2008/01/22 15:02:00 $ Version: $Revision: 1.1.1.1 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ /** * \file * \brief class bbtk::ComplexBlackBox : user defined complex black boxes */ /** * \class bbtk::ComplexBlackBox * \brief Abstract user defined black boxes */ #ifndef __bbtkComplexBlackBox_h__ #define __bbtkComplexBlackBox_h__ #include "bbtkBlackBox.h" #include "bbtkComplexBlackBoxDescriptor.h" //#include "bbtkComplexBlackBoxInputDescriptor.h" //#include "bbtkComplexBlackBoxOutputDescriptor.h" #include namespace bbtk { //================================================================== class BBTK_EXPORT ComplexBlackBox : public bbtk::BlackBox { friend class ComplexBlackBoxDescriptor; public: //================================================================== // PUBLIC PART : ACCESSIBLE TO THE END-USER /// Returns the pointer on the box' descriptor BlackBoxDescriptor* bbGetDescriptor() const { return mDescriptor; } /// Returns a pointer on a clone of the box with name BlackBox* bbClone(const std::string& name); void bbExecute(bool force = false); Data bbGetOutput( const std::string &label ); Data bbGetInput ( const std::string &label ); void bbSetOutput( const std::string &name, Data data); void bbSetInput ( const std::string &name, Data data, bool setModified = true); void bbBruteForceSetInputPointer( const std::string &name, void* data, bool setModified = true); ~ComplexBlackBox(); BlackBox* bbGetBlackBox( const std::string& name ); const std::map& bbGetBlackBoxMap() { return mBlackBoxMap; } void bbPrintBlackBoxes(); /// Generates a png image representing the pipeline graph of the /// complex box and writes html code to insert it /// into the output file stream. /// detail : /// level : depth of nested complex boxes graph development /// (0:only this box level /// output_dir is the directory in which to write the files void bbInsertHTMLGraph( std::ofstream& s, int detail, int level, bool instanceOrtype, const std::string& output_dir, bool relative_link ); /// Writes Graphviz-dot description in file. /// Generates own description and recursively calls itself /// on internal boxes with level-1 virtual void bbWriteDotFileBlackBox(FILE *ff, BlackBox *parentblackbox, int detail, int level, bool instanceOrtype, bool relative_link ); virtual void bbWriteDotInputOutputName(FILE *ff, bool inputoutput, int detail, int level); virtual BlackBox *bbFindBlackBox(const std::string &blackboxname); protected: //================================================================== // PROTECTED PART : ACCESSIBLE TO ComplexBlackBoxDescriptor /// Constructor that takes the ComplexBlackBox name ComplexBlackBox(const std::string &name, ComplexBlackBoxDescriptor* desc); /// Constructor from an existing box (copy) with a new name ComplexBlackBox(ComplexBlackBox& from, const std::string &name); public: IOStatus bbBackwardUpdate(Connection* caller); // void bbForwardUpdate(Connection* caller); void bbSetModifiedStatus(BlackBoxInputConnector* c); protected: void bbAddBlackBox( BlackBox* ); void bbAddToExecutionList( const std::string& name ); void bbUnsafeAddBlackBox( BlackBox* ); void bbRemoveBlackBox( const std::string& name ); void bbAddConnection( Connection* ); // void RemoveConnection( ); BlackBox* bbUnsafeGetBlackBox( const std::string& name ); /// void bbAllocateConnectors(); void bbDesallocateConnectors(); private: //================================================================== // PRIVATE PART : MEMBERS AND USEFULL INTERNAL METHODS /// Default constructor : derived classes must use the constructor with the ComplexBlackBox's name ComplexBlackBox() : BlackBox("") {} /// The descriptor pointer ComplexBlackBoxDescriptor* mDescriptor; /// The type of map of black boxes typedef std::map BlackBoxMapType; /// The map of black boxes BlackBoxMapType mBlackBoxMap; /// The type of list of connections typedef std::list ConnectionListType; /// The list of connections ConnectionListType mConnectionList; /// The execution list std::vector mExecutionList; }; // Class ComplexBlackBox //=========================================================================== } // namespace bbtk //#include "bbtkComplexBlackBoxMacros.h" #endif