From 7c20ef5b6b9bcfe07f7b8e887360b70fc399962c Mon Sep 17 00:00:00 2001 From: guigues Date: Thu, 26 Feb 2009 12:04:10 +0000 Subject: [PATCH] Message manager can now be observed (to get messages) with a boost::signal/slot mechanism. --- src/CMakeLists.txt | 1 + src/creaMessageManager.cxx | 198 +++++++++++++++++-------------------- src/creaMessageManager.h | 194 ++++++++++++++---------------------- src/creaVtk.h | 7 +- src/creaVtk.txx | 74 ++++++++++---- 5 files changed, 228 insertions(+), 246 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b1f7cdb..f077378 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,6 +50,7 @@ ADD_LIBRARY(crea ${CREA_BUILD_SHARED} ${SRCS}) TARGET_LINK_LIBRARIES(crea ${WXWIDGETS_LIBRARIES} ${VTK_LIBRARIES} + ${BOOST_LIBRARIES} ) # ${GDCM_LIBRARIES} # ${SQLITE_LIBRARIES}) diff --git a/src/creaMessageManager.cxx b/src/creaMessageManager.cxx index dc18710..c880e9c 100644 --- a/src/creaMessageManager.cxx +++ b/src/creaMessageManager.cxx @@ -3,8 +3,8 @@ Program: crea Module: $RCSfile: creaMessageManager.cxx,v $ Language: C++ - Date: $Date: 2008/09/26 14:09:55 $ - Version: $Revision: 1.1 $ + Date: $Date: 2009/02/26 12:04:10 $ + Version: $Revision: 1.2 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -24,15 +24,30 @@ namespace crea { + //=========================================================================== MessageManager::MessageManager() - : mMaxMessageLength(8)//, mAllLevel(0), mMaxLevel(9) - + : mMaxMessageLength(8), + mSendToCout(true) { std::string key; + key ="all"; - mMessageLevel[key] = 0; - mMessageHelp[key] = "Minimum level for all kind of messages"; + mMessageMap[key] = new MessageType(0,"Minimum level for all kind of messages"); if (mMaxMessageLengthsecond; + } } - + //=========================================================================== + //=========================================================================== MessageManager* MessageManager::GetInstance() { static MessageManager* m = 0; if (!m) m = new MessageManager(); return m; } + //=========================================================================== - void MessageManager::RegisterMessageType(std::string key, - std::string help, - unsigned char default_level) + //=========================================================================== + void MessageManager::RegisterMessageType(const std::string& key, + const std::string& help, + unsigned char default_level) { - GetInstance()->mMessageLevel[key] = default_level; - GetInstance()->mMessageHelp[key] = help; + GetInstance()->mMessageMap[key] = new MessageType(default_level,help); + if (GetInstance()->mMaxMessageLengthmMaxMessageLength = key.length(); } + //=========================================================================== - - - void MessageManager::SetMessageLevel(std::string key, - unsigned char level) + //=========================================================================== + void MessageManager::SetMessageLevel(const std::string& key, + unsigned char level) { - std::map::iterator i; - i = GetInstance()->mMessageLevel.find(key); - if (i!=GetInstance()->mMessageLevel.end()) + MessageMapType::iterator i; + i = GetInstance()->mMessageMap.find(key); + if (i!=GetInstance()->mMessageMap.end()) { - (*i).second = level; + (*i).second->Level = level; } else { @@ -162,24 +126,48 @@ namespace crea } } + //=========================================================================== - - - int MessageManager::GetMessageLevel(std::string key) + //=========================================================================== + int MessageManager::GetMessageLevel(const std::string& key) { - int l = GetInstance()->mMessageLevel["all"]; - std::map::iterator i = - GetInstance()->mMessageLevel.find(key); - if (i!=GetInstance()->mMessageLevel.end()) { - if ( (*i).second > l ) l = (*i).second; + int l = GetInstance()->mMessageMap["all"]->Level; + MessageMapType::iterator i = GetInstance()->mMessageMap.find(key); + if (i!=GetInstance()->mMessageMap.end()) { + if ( (*i).second->Level > l ) l = (*i).second->Level; } - int m = GetInstance()->mMessageLevel["max"]; + int m = GetInstance()->mMessageMap["max"]->Level; if (l>m) l=m; return l; } + //=========================================================================== + //=========================================================================== + void MessageManager::SendMessagesToCout(bool v) + { + GetInstance()->mSendToCout = v; + } + //=========================================================================== + //=========================================================================== + void MessageManager::SendMessage(const std::string& key, const std::string& mess) + { + if (GetInstance()->mSendToCout) + { + std::cout << mess; + } + GetInstance()->mMessageMap[key]->Signal(mess); + } + //=========================================================================== + //=========================================================================== + void MessageManager::AddMessageObserver( const std::string& key, MessageCallbackType callback ) + { + GetInstance()->mMessageMap[key]->Signal.connect(callback); + } + //=========================================================================== + + //=========================================================================== void MessageManager::PrintInfo() { creaMessage("info",1,"================ Messages =================" @@ -192,23 +180,23 @@ namespace crea creaMessageCont("info",1," "); } creaMessageCont("info",1,"Level Nature" << creaendl); - std::map::iterator i; - std::map::iterator j; - for (i=GetInstance()->mMessageLevel.begin(), - j=GetInstance()->mMessageHelp.begin(); - i!=GetInstance()->mMessageLevel.end();++i,++j) { - creaMessage("info",1, (*i).first); - for (int k=0; - k<(int)(GetInstance()->mMaxMessageLength+2-(*i).first.length()); - k++) { - creaMessageCont("info",1," "); - } - creaMessageCont("info",1, (*i).second << "\t" - << (*j).second << creaendl); + MessageMapType::iterator i; + for (i=GetInstance()->mMessageMap.begin(); + i!=GetInstance()->mMessageMap.end(); + ++i) + { + creaMessage("info",1, (*i).first); + for (int k=0; + k<(int)(GetInstance()->mMaxMessageLength+2-(*i).first.length()); + k++) { + creaMessageCont("info",1," "); + } + creaMessageCont("info",1, (*i).second->Level << "\t" + << (*i).second->Help << creaendl); } creaMessage("info",1,"===========================================" << creaendl); } - + //=========================================================================== } diff --git a/src/creaMessageManager.h b/src/creaMessageManager.h index 690f56d..0fe8110 100644 --- a/src/creaMessageManager.h +++ b/src/creaMessageManager.h @@ -91,7 +91,7 @@ #define creaMessageTab "" #endif -#define CREA_PREPEND_MESSAGE_WITH_SPACE +//#define CREA_PREPEND_MESSAGE_WITH_SPACE #ifdef CREA_PREPEND_MESSAGE_WITH_SPACE #define creaMessageSpace(value) \ crea::MessageManager::GetSpace(value) @@ -108,54 +108,60 @@ do { \ creaOnMessageLevel(key,value) \ { \ - std::cout << creaMessageCode \ - << creaMessageTab \ - << creaMessageSpace(value) \ - << MESSAGE; \ + std::ostringstream s; \ + s << creaMessageCode \ + << creaMessageTab \ + << creaMessageSpace(value) \ + << MESSAGE; \ + crea::MessageManager::SendMessage(key,s.str()); \ } \ } \ while (0) // Macro for continuing a message (when one wants to split the macro // call into multiple lines) -#define creaMessageCont(key,value,MESSAGE) \ - do \ - { \ - creaOnMessageLevel(key,value) \ - { \ - std::cout << MESSAGE; \ - } \ - } \ - while (0) - -#define creaMessageInc(key,value,MESSAGE) \ +#define creaMessageCont(key,value,MESSAGE) \ do \ { \ creaOnMessageLevel(key,value) \ { \ - std::cout << creaMessageCode \ - << creaMessageTab \ - << creaMessageSpace(value) \ - << MESSAGE; \ - crea::MessageManager::IncTab(); \ + std::ostringstream s; \ + s << MESSAGE; \ + crea::MessageManager::SendMessage(key,s.str()); \ } \ } \ while (0) -#define creaMessageDec(key,value,MESSAGE) \ +#define creaMessageInc(key,value,MESSAGE) \ do \ { \ - creaOnMessageLevel(key,value) \ - { \ - crea::MessageManager::DecTab(); \ - std::cout << creaMessageCode \ - << creaMessageTab \ - << creaMessageSpace(value) \ - << MESSAGE; \ + std::ostringstream s; \ + s << creaMessageCode \ + << creaMessageTab \ + << creaMessageSpace(value) \ + << MESSAGE; \ + crea::MessageManager::SendMessage(key,s.str()); \ + crea::MessageManager::IncTab(); \ } \ } \ while (0) +#define creaMessageDec(key,value,MESSAGE) \ + do \ + { \ + creaOnMessageLevel(key,value) \ + { \ + crea::MessageManager::DecTab(); \ + std::ostringstream s; \ + s << creaMessageCode \ + << creaMessageTab \ + << creaMessageSpace(value) \ + << MESSAGE; \ + crea::MessageManager::SendMessage(key,s.str()); \ + } \ + } \ + while (0) + #define creaDecTab(key,value) \ do \ { \ @@ -197,89 +203,15 @@ //=========================================================== +// Macros for debug messages #ifdef CREA_COMPILE_DEBUG_MESSAGES - -// Macro for debug messages -#define creaDebugMessage(key,value,MESSAGE) \ - do \ - { \ - creaOnMessageLevel(key,value) \ - { \ - std::cout << creaMessageCode \ - << creaMessageTab \ - << creaMessageSpace(value) \ - << MESSAGE; \ - } \ - } \ - while (0) - -// Macro for continuing a debug message (when one wants to split the -// macro call into multiple lines) -#define creaDebugMessageCont(key,value,MESSAGE) \ - do \ - { \ - creaOnMessageLevel(key,value) \ - { \ - std::cout << MESSAGE; \ - } \ - } \ - while (0) - -#define creaDebugMessageInc(key,value,MESSAGE) \ - do \ - { \ - creaOnMessageLevel(key,value) \ - { \ - std::cout << creaMessageCode \ - << creaMessageTab \ - << creaMessageSpace(value) \ - << MESSAGE; \ - crea::MessageManager::IncTab(); \ - } \ - } \ - while (0) - -#define creaDebugMessageDec(key,value,MESSAGE) \ - do \ - { \ - creaOnMessageLevel(key,value) \ - { \ - crea::MessageManager::DecTab(); \ - std::cout << creaMessageCode \ - << creaMessageTab \ - << creaMessageSpace(value) \ - << MESSAGE; \ - } \ - } \ - while (0) - -#define creaDebugDecTab(key,value) \ - do \ - { \ - creaOnMessageLevel(key,value) \ - { \ - crea::MessageManager::DecTab(); \ - } \ - } \ - while (0) - -#define creaDebugIncTab(key,value) \ - do \ - { \ - creaOnMessageLevel(key,value) \ - { \ - crea::MessageManager::IncTab(); \ - } \ - } \ - while (0) - -#define creaDebugResetTab() \ - do \ - { \ - crea::MessageManager::ResetTab(); \ - } \ - while (0) - +#define creaDebugMessage(key,value,MESSAGE) creaMessage(key,value,MESSAGE) +#define creaDebugMessageCont(key,value,MESSAGE) creaMessageCont(key,value,MESSAGE) +#define creaDebugMessageInc(key,value,MESSAGE) creaMessageInc(key,value,MESSAGE) +#define creaDebugMessageDec(key,value,MESSAGE) creaMessageDec(key,value,MESSAGE) +#define creaDebugDecTab(key,value) creaDecTab(key,value) +#define creaDebugIncTab(key,value) creaIncTab(key,value) +#define creaDebugResetTab() creaResetTab() #else #define creaDebugMessage(key,value,MESSAGE) #define creaDebugMessageCont(key,value,MESSAGE) @@ -295,7 +227,7 @@ #define creaWarning(MESSAGE) \ do \ { \ - int lev = crea::MessageManager::GetMessageLevel("Warning"); \ + int lev = crea::MessageManager::GetMessageLevel("warning"); \ if (lev >0) \ { \ std::cerr << "!! WARNING !! " << MESSAGE << std::endl; \ @@ -373,13 +305,20 @@ #define creaendl std::endl //=========================================================== +// Signal/slot mechanism for message events +#include +#include namespace crea { - + class CREA_EXPORT MessageManager { public: + //============================================= + typedef boost::signal MessageSignalType; + typedef MessageSignalType::slot_function_type MessageCallbackType; + //============================================= /// MessageManager(); /// @@ -387,14 +326,20 @@ namespace crea /// static MessageManager* GetInstance(); /// - static void RegisterMessageType(std::string key, - std::string help, + static void RegisterMessageType(const std::string& key, + const std::string& help, unsigned char default_level = 9); /// - static void SetMessageLevel(std::string key, unsigned char level); + static void SetMessageLevel(const std::string& key, unsigned char level); /// - static int GetMessageLevel(std::string key); + static int GetMessageLevel(const std::string& key); /// + static void SendMessage(const std::string& key, const std::string& mess); + /// + static void AddMessageObserver(const std::string& key, MessageCallbackType callback ); + /// + static void SendMessagesToCout(bool v = true); + /// static std::string& GetTab() { static std::string s; return s; } /// static std::string GetSpace(int n) { @@ -407,11 +352,20 @@ namespace crea static void ResetTab() { GetTab() = std::string(""); } /// static void PrintInfo(); - + /// + private: - std::map mMessageLevel; - std::map mMessageHelp; + struct MessageType + { + MessageType(int l, const std::string& h) : Level(l), Help(h) {} + int Level; + std::string Help; + MessageSignalType Signal; + }; + typedef std::map MessageMapType; + MessageMapType mMessageMap; unsigned int mMaxMessageLength; + bool mSendToCout; }; //=========================================================== diff --git a/src/creaVtk.h b/src/creaVtk.h index 3b205d1..7eb5b18 100644 --- a/src/creaVtk.h +++ b/src/creaVtk.h @@ -15,11 +15,13 @@ namespace crea int ny, int nz); + /* + // Already provided by vtkTypeTraits::VTKTypeID() template - vtkIdType GetVtkIdType(T&) { return VTK_VOID; } + int GetVtkType(T&) { return VTK_VOID; } #define SPECIALIZE_GETVTKIDTYPE(T,R) \ - template <> vtkIdType GetVtkIdType(T&) { return R; } + template <> int GetVtkType(T&) { return R; } SPECIALIZE_GETVTKIDTYPE(char,VTK_CHAR) SPECIALIZE_GETVTKIDTYPE(signed char,VTK_SIGNED_CHAR) @@ -34,6 +36,7 @@ namespace crea SPECIALIZE_GETVTKIDTYPE(double,VTK_DOUBLE) #undef SPECIALIZE_GETVTKIDTYPE + */ } #include diff --git a/src/creaVtk.txx b/src/creaVtk.txx index 4d39387..bbebc1d 100644 --- a/src/creaVtk.txx +++ b/src/creaVtk.txx @@ -1,6 +1,20 @@ #include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include -#include +#include +#include namespace crea { @@ -10,30 +24,52 @@ namespace crea int ny, int nz) { - std::cout << "NV "<::SizedName() << std::endl; vtkImageData *image = vtkImageData::New(); image->SetNumberOfScalarComponents(1); - image->SetScalarType(GetVtkIdType(*data)); + int vtktype = vtkTypeTraits::VTKTypeID(); + image->SetScalarType(vtktype); image->SetDimensions(nx,ny,nz); image->SetSpacing(1,1,1); - std::cout << "alloc"<AllocateScalars(); - std::cout << "alloc ok"<* array - = (vtkDataArrayTemplate*)vtkDataArrayTemplate::New(); - std::cout << "data array alloc ok"<SetNumberOfComponents( 1 ); - std::cout << "nb compo ok"<::SizedName() + <<" non implemented"); + } + vtkDataArrayTemplate* tarray + = dynamic_cast*>(array); + array->SetNumberOfComponents( 1 ); size_t size = (long)nx*(long)ny*(long)nz; - std::cout << "SetArray"<SetArray( data, size, 1 ); - //Pay attention in particular to the last param of SetArray: - //http://www.vtk.org/doc/nightly/html/classvtkUnsignedShortArray.html#z798_0 - std::cout << "SetScalars"<GetPointData( )->SetScalars( array ); - std::cout << "Delete"<SetArray( data, size, 1 ); + image->GetPointData( )->SetScalars( tarray ); array->Delete( ); return image; } -- 2.45.1