/*========================================================================= Program: bbtk Module: $RCSfile: bbtkComplexBlackBox.h,v $ Language: C++ Date: $Date: 2008/04/18 12:59:15 $ Version: $Revision: 1.3 $ 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 { BBTK_OBJECT_INTERFACE(ComplexBlackBox); friend class ComplexBlackBoxDescriptor; typedef BlackBox Superclass; public: //================================================================== // PUBLIC PART : ACCESSIBLE TO THE END-USER /// Returns the pointer on the box' descriptor BlackBoxDescriptor::Pointer bbGetDescriptor() const { return mDescriptor.lock(); } /// Returns a pointer on a new instance with name //BlackBox* bbNew(const std::string& name); /// Returns a pointer on a clone of the box with name BlackBox::Pointer bbClone(const std::string& name); /// Clear void Clear(); /// Set as prototype void SetAsPrototype() { mLockedDescriptor.reset(); } /// Returns true if it is a prototype bool IsAPrototype() const { return (!mLockedDescriptor); } std::string bbGetNameWithParent() const; 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); /// Connects the input to the connection c virtual void bbConnectInput( const std::string& name, Connection::Pointer c); /// Connects the output to the connection c virtual void bbConnectOutput( const std::string& name, Connection::Pointer c); BlackBox::Pointer bbGetBlackBox( const std::string& name ); /// The type of map of black boxes typedef std::map BlackBoxMapType; const BlackBoxMapType& 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::Pointer parentblackbox, int detail, int level, bool instanceOrtype, bool relative_link ); virtual void bbWriteDotInputOutputName(FILE *ff, bool inputoutput, int detail, int level); virtual BlackBox::Pointer bbFindBlackBox(const std::string &blackboxname); void Check(bool recursive=true); protected: //================================================================== // PROTECTED PART : ACCESSIBLE TO ComplexBlackBoxDescriptor static ComplexBlackBox::Pointer New(const std::string &name, ComplexBlackBoxDescriptor::Pointer desc); private: /// Constructor that takes the ComplexBlackBox name ComplexBlackBox(const std::string &name, ComplexBlackBoxDescriptor::Pointer desc); /// Constructor from an existing box (copy) with a new name ComplexBlackBox(ComplexBlackBox& from, const std::string &name); public: IOStatus bbBackwardUpdate(Connection::Pointer caller); // void bbForwardUpdate(Connection* caller); void bbSetModifiedStatus(BlackBoxInputConnector* c); protected: void bbAddBlackBox( BlackBox::Pointer ); void bbAddToExecutionList( const std::string& name ); void bbUnsafeAddBlackBox( BlackBox::Pointer ); void bbRemoveBlackBox( const std::string& name, bool remove_connections = true); void bbAddConnection( Connection::Pointer ); // void RemoveConnection( ); BlackBox::Pointer 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("") {} // true if the box is a prototype of a ComplexBlackBoxDescriptor // bool mIsAPrototype; /// The descriptor pointer : is 0 if the box is a prototype ComplexBlackBoxDescriptor::Pointer mLockedDescriptor; /// The descriptor pointer ComplexBlackBoxDescriptor::WeakPointer mDescriptor; /// 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