BIMHome v1.0.0
BIMHome接口文档说明
Console.h
浏览该文件的文档.
1/************************************************************************
2* @file Console.h
3*
4* @brief 控制相关类
5*
6* @details 控制相关类
7*
8* @author wukx
9*
10* @version v1.0
11*
12* @date 2016.9.29
13*
14* @license 北京华科软科技有限公司
15*
16*************************************************************************/
17
18
19#ifndef BIMHOMEBASE_CONSOLE_H
20#define BIMHOMEBASE_CONSOLE_H
21
22#include <chrono>
23#include <map>
24#include <set>
25#include <string>
26#include <sstream>
27#include "BHGlobal.h"
28
29// Python 相关定义
30typedef struct _object PyObject;
31typedef struct PyMethodDef PyMethodDef;
32
33// FIXME: ISO C++11 要求变参宏的 "..." 至少有一个参数
34#if defined(__clang__)
35# pragma clang diagnostic push
36# pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
37#endif
38
39//**************************************************************************
40// 日志级别
41
42#ifdef FC_DEBUG
44# undef FC_LOGPYOBJECTS
46# define FC_LOGFEATUREUPDATE
48# undef FC_LOGUPDATECHAIN
49#endif
50
52
54
275#define FC_LOGLEVEL_DEFAULT -1
276#define FC_LOGLEVEL_ERR 0
277#define FC_LOGLEVEL_WARN 1
278#define FC_LOGLEVEL_MSG 2
279#define FC_LOGLEVEL_LOG 3
280#define FC_LOGLEVEL_TRACE 4
281
282#define _FC_LOG_LEVEL_INIT(_name,_tag,...) \
283 static Base::LogLevel _name(_tag,## __VA_ARGS__);
284
285#ifndef FC_LOG_INSTANCE
286# define FC_LOG_INSTANCE _s_fclvl
287#endif
288
289#define FC_LOG_LEVEL_INIT(_tag,...) \
290 _FC_LOG_LEVEL_INIT(FC_LOG_INSTANCE, _tag, ## __VA_ARGS__)
291
292#define __FC_PRINT(_instance,_l,_func,_msg,_file,_line) do{\
293 if(_instance.isEnabled(_l)) {\
294 std::stringstream _str;\
295 _instance.prefix(_str,_file,_line) << _msg;\
296 if(_instance.add_eol) \
297 _str<<std::endl;\
298 Base::Console()._func(_str.str().c_str());\
299 if(_instance.refresh) Base::Console().Refresh();\
300 }\
301}while(0)
302
303#define _FC_PRINT(_instance,_l,_func,_msg) __FC_PRINT(_instance,_l,_func,_msg,__FILE__,__LINE__)
304
305#define FC_MSG(_msg) _FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_MSG,NotifyMessage,_msg)
306#define FC_WARN(_msg) _FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_WARN,NotifyWarning,_msg)
307#define FC_ERR(_msg) _FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_ERR,NotifyError,_msg)
308#define FC_LOG(_msg) _FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_LOG,NotifyLog,_msg)
309#define FC_TRACE(_msg) _FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_TRACE,NotifyLog,_msg)
310
311#define _FC_MSG(_file,_line,_msg) __FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_MSG,NotifyMessage,_msg,_file,_line)
312#define _FC_WARN(_file,_line,_msg) __FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_WARN,NotifyWarning,_msg,_file,_line)
313#define _FC_ERR(_file,_line,_msg) __FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_ERR,NotifyError,_msg,_file,_line)
314#define _FC_LOG(_file,_line,_msg) __FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_LOG,NotifyLog,_msg,_file,_line)
315#define _FC_TRACE(_file,_line,_msg) __FC_PRINT(FC_LOG_INSTANCE,FC_LOGLEVEL_TRACE,NotifyLog,_msg,_file,_line)
316
317#define FC_XYZ(_pt) '('<<(_pt).X()<<", " << (_pt).Y()<<", " << (_pt).Z()<<')'
318#define FC_xy(_pt) '('<<(_pt).x<<", " << (_pt).y<<')'
319#define FC_xyz(_pt) '('<<(_pt).x<<", " << (_pt).y<<", " << (_pt).z<<')'
320
321#ifndef FC_LOG_NO_TIMING
322# define FC_TIME_CLOCK high_resolution_clock
323# define FC_TIME_POINT std::chrono::FC_TIME_CLOCK::time_point
324# define FC_DURATION std::chrono::duration<double>
325
326# define _FC_TIME_INIT(_t) _t=std::chrono::FC_TIME_CLOCK::now()
327# define FC_TIME_INIT(_t) FC_TIME_POINT _FC_TIME_INIT(_t)
328# define FC_TIME_INIT2(_t1,_t2) FC_TIME_INIT(_t1),_t2=_t1
329# define FC_TIME_INIT3(_t1,_t2,_t3) FC_TIME_INIT(_t1),_t2=_t1,_t3=_t1
330
331# define _FC_DURATION_PRINT(_l,_d,_msg) \
332 FC_##_l(_msg<< " time: " << _d.count()<<'s');
333
334# define FC_DURATION_MSG(_d,_msg) _FC_DURATION_PRINT(MSG,_d,_msg)
335# define FC_DURATION_LOG(_d,_msg) _FC_DURATION_PRINT(LOG,_d,_msg)
336# define FC_DURATION_TRACE(_d,_msg) _FC_DURATION_PRINT(TRACE,_d,_msg)
337
338# define _FC_TIME_PRINT(_l,_t,_msg) \
339 _FC_DURATION_PRINT(_l,Base::GetDuration(_t),_msg);
340
341# define FC_TIME_MSG(_t,_msg) _FC_TIME_PRINT(MSG,_t,_msg)
342# define FC_TIME_LOG(_t,_msg) _FC_TIME_PRINT(LOG,_t,_msg)
343# define FC_TIME_TRACE(_t,_msg) _FC_TIME_PRINT(TRACE,_t,_msg)
344
345# define FC_DURATION_DECLARE(_d) FC_DURATION _d
346# define FC_DURATION_DECLARE2(_d,_d1) FC_DURATION_DECLARE(_d),_d1
347# define FC_DURATION_DECLARE3(_d,_d1) FC_DURATION_DECLARE2(_d,_d1),_d2
348
349# define FC_DURATION_INIT(_d) _d=FC_DURATION(0)
350# define FC_DURATION_INIT2(_d,_d1) _d=_d1=FC_DURATION(0)
351# define FC_DURATION_INIT3(_d,_d1,_d2) _d=_d1=_d2=FC_DURATION(0)
352
353# define FC_DURATION_DECL_INIT(_d) FC_DURATION _d(0)
354# define FC_DURATION_DECL_INIT2(_d,_d1) FC_DURATION_DECL_INIT(_d),_d1(0)
355# define FC_DURATION_DECL_INIT3(_d,_d1) FC_DURATION_DECL_INIT2(_d,_d1),_d3(0)
356
357# define FC_DURATION_PLUS(_d,_t) _d += Base::GetDuration(_t)
358
359#else //FC_LOG_NO_TIMING
360# define FC_TIME_POINT
361# define _FC_TIME_INIT(...) do{}while(0)
362# define FC_TIME_INIT(...) do{}while(0)
363# define FC_TIME_INIT2(...) do{}while(0)
364# define FC_TIME_INIT3(...) do{}while(0)
365# define _FC_DURATION_PRINT(...) do{}while(0)
366# define _FC_TIME(_t) do{}while(0)
367# define FC_DURATION_PRINT(...) do{}while(0)
368# define FC_DURATION
369# define FC_DURATION_INIT(...) do{}while(0)
370# define FC_DURATION_INIT1(...) do{}while(0)
371# define FC_DURATION_INIT2(...) do{}while(0)
372# define FC_DURATION_DECLARE(...)
373# define FC_DURATION_DECLARE1(...)
374# define FC_DURATION_DECLARE2(...)
375# define FC_DURATION_DECL_INIT(...) do{}while(0)
376# define FC_DURATION_DECL_INIT2(...) do{}while(0)
377# define FC_DURATION_DECL_INIT3(...) do{}while(0)
378# define FC_DURATION_PLUS(...) do{}while(0)
379
380#endif //FC_LOG_NO_TIMING
381
382namespace Base
383{
384 class ConsoleSingleton;
385} // namespace Base
386
387typedef unsigned int ConsoleMsgFlags;
388
389namespace Base
390{
391
392#ifndef FC_LOG_NO_TIMING
394 {
395 auto tnow = std::chrono::FC_TIME_CLOCK::now();
396 auto d = std::chrono::duration_cast<FC_DURATION>(tnow - t);
397 t = tnow;
398 return d;
399 }
400#endif
401
411 enum class LogStyle
412 {
413 Warning,
414 Message,
415 Error,
416 Log
417 };
418
426 class BaseExport ILogger
427 {
428 public:
429 ILogger() :bErr(true), bMsg(true), bLog(true), bWrn(true) {}
430 virtual ~ILogger() = 0;
431
438 virtual void SendLog(const std::string& msg, LogStyle level) = 0;
439
445 virtual const char* Name() { return nullptr; }
446
447 public:
448 bool bErr, bMsg, bLog, bWrn;//控制是否记录错误日志、普通消息日志、一般日志、警告日志;
449 };
450
451
467 class BaseExport ConsoleSingleton
468 {
469 public:
470
478 {
479 Verbose = 1,
480 };
481
490 {
491 Direct = 0,
492 Queued = 1
493 };
494
505 {
506 MsgType_Txt = 1,
507 MsgType_Log = 2,
508 MsgType_Wrn = 4,
509 MsgType_Err = 8
510 };
511
517 virtual void Message(const char* pMsg, ...);
523 virtual void Warning(const char* pMsg, ...);
529 virtual void Error(const char* pMsg, ...);
535 virtual void Log(const char* pMsg, ...);
536
542 void NotifyMessage(const char* sMsg);
543
549 void NotifyWarning(const char* sMsg);
550
556 void NotifyError(const char* sMsg);
557
563 void NotifyLog(const char* sMsg);
564
570 void AttachObserver(ILogger* pcObserver);
571
577 void DetachObserver(ILogger* pcObserver);
578
585
592
601 ConsoleMsgFlags SetEnabledMsgType(const char* sObs, ConsoleMsgFlags type, bool b);
602
610 bool IsMsgTypeEnabled(const char* sObs, BIMHome_ConsoleMsgType type) const;
611
618
626 int* GetLogLevel(const char* tag, bool create = true);
627
633 void SetDefaultLogLevel(int level)
634 {
635 _defaultLogLevel = level;
636 }
637
644 inline int LogLevel(int level) const
645 {
646 return level < 0 ? _defaultLogLevel : level;
647 }
648
655
662 ILogger* Get(const char* Name) const;
663
668 static PyMethodDef Methods[];
669
675 void Refresh();
676
682 void EnableRefresh(bool enable);
683
684 protected:
685
688
696 static PyObject* sPyLog(PyObject* self, PyObject* args);
704 static PyObject* sPyMessage(PyObject* self, PyObject* args);
712 static PyObject* sPyWarning(PyObject* self, PyObject* args);
720 static PyObject* sPyError(PyObject* self, PyObject* args);
728 static PyObject* sPySetStatus(PyObject* self, PyObject* args);
736 static PyObject* sPyGetStatus(PyObject* self, PyObject* args);
737
738 private:
743 static void Destruct();
744
745 public:
746 static const unsigned int BufferSize = 4024;
747
748 protected:
752
753 private:
755 std::set<ILogger* > _aclObservers;
756 std::map<std::string, int> _logLevels;
758
759 friend class ConsoleOutput;
760 };
761
768 {
770 }
771
777 class BaseExport ConsoleRefreshDisabler
778 {
779 public:
785 {
786 Console().EnableRefresh(false);
787 }
788
794 {
795 Console().EnableRefresh(true);
796 }
797 };
798
804 class BaseExport LogLevel
805 {
806 public:
807 LogLevel(const char* tag, bool print_tag = true, int print_src = 0,bool print_time = false, bool add_eol = true, bool refresh = false)
808 :tag(tag),
809 lvl(*Console().GetLogLevel(tag)),
810 print_tag(print_tag), print_src(print_src),
811 print_time(print_time),
812 add_eol(add_eol), refresh(refresh)
813 {}
820 bool isEnabled(int l)
821 {
822 return l <= level();
823 }
829 int level() const
830 {
831 return Console().LogLevel(lvl);
832 }
841 std::stringstream& prefix(std::stringstream& str, const char* src, int line);
842
843 public:
844 std::string tag;
845 int& lvl;
849 bool add_eol;
850 bool refresh;
851 };
852
853
854} // namespace Base
855
856#if defined(__clang__)
857# pragma clang diagnostic pop
858#endif
859
860#endif // BIMHOMEBASE_CONSOLE_H
struct PyMethodDef PyMethodDef
Definition Console.h:31
#define FC_TIME_POINT
Definition Console.h:323
#define FC_DURATION
Definition Console.h:324
unsigned int ConsoleMsgFlags
Definition Console.h:387
struct _object PyObject
Definition Console.h:30
ConsoleRefreshDisabler()
构造函数
Definition Console.h:784
~ConsoleRefreshDisabler()
析构函数
Definition Console.h:793
禁用控制台刷新的工具类
Definition Console.h:778
ConsoleMsgFlags SetEnabledMsgType(const char *sObs, ConsoleMsgFlags type, bool b)
设置启用的消息类型
BIMHome_ConsoleMsgType
BIMHome 控制台消息类型
Definition Console.h:505
void NotifyError(const char *sMsg)
通知错误
bool _bVerbose
Definition Console.h:749
static ConsoleSingleton * _pcSingleton
Definition Console.h:754
void SetConsoleMode(ConsoleMode m)
设置控制台模式
void NotifyLog(const char *sMsg)
通知日志
std::map< std::string, int > _logLevels
Definition Console.h:756
void DetachObserver(ILogger *pcObserver)
移除观察者
void NotifyMessage(const char *sMsg)
通知消息
static PyObject * sPyGetStatus(PyObject *self, PyObject *args)
Python 获取状态
static ConsoleSingleton & Instance()
获取单例实例
bool _bCanRefresh
Definition Console.h:750
bool IsMsgTypeEnabled(const char *sObs, BIMHome_ConsoleMsgType type) const
检查消息类型是否启用
static PyObject * sPyWarning(PyObject *self, PyObject *args)
Python 警告
virtual void Log(const char *pMsg,...)
打印日志消息
ConnectionMode
连接模式
Definition Console.h:490
int _defaultLogLevel
Definition Console.h:757
virtual void Error(const char *pMsg,...)
打印错误消息
void SetConnectionMode(ConnectionMode mode)
设置连接模式
int LogLevel(int level) const
获取日志级别
Definition Console.h:644
ConsoleMode
控制台模式
Definition Console.h:478
static PyObject * sPyError(PyObject *self, PyObject *args)
Python 错误
void EnableRefresh(bool enable)
获取 Python 方法定义
virtual void Warning(const char *pMsg,...)
打印警告消息
void SetDefaultLogLevel(int level)
设置默认日志级别
Definition Console.h:633
virtual void Message(const char *pMsg,...)
打印消息
void NotifyWarning(const char *sMsg)
通知警告
std::set< ILogger * > _aclObservers
Definition Console.h:755
ILogger * Get(const char *Name) const
获取观察者
void Refresh()
启用刷新
static PyObject * sPyLog(PyObject *self, PyObject *args)
Python 日志
static void Destruct()
Python 导出
static PyObject * sPyMessage(PyObject *self, PyObject *args)
Python 消息
static PyObject * sPySetStatus(PyObject *self, PyObject *args)
Python 设置状态
ConnectionMode connectionMode
Definition Console.h:751
void AttachObserver(ILogger *pcObserver)
添加观察者
int * GetLogLevel(const char *tag, bool create=true)
获取日志级别
void UnsetConsoleMode(ConsoleMode m)
取消设置控制台模式
控制台类
Definition Console.h:468
virtual const char * Name()
获取日志器名称
Definition Console.h:445
virtual ~ILogger()=0
bool bErr
Definition Console.h:448
ILogger()
Definition Console.h:429
virtual void SendLog(const std::string &msg, LogStyle level)=0
发送日志消息
日志接口类
Definition Console.h:427
int level() const
获取当前日志级别
Definition Console.h:829
bool add_eol
是否添加换行符
Definition Console.h:849
bool print_tag
是否打印标签
Definition Console.h:846
int print_src
打印源代码位置的级别
Definition Console.h:847
LogLevel(const char *tag, bool print_tag=true, int print_src=0, bool print_time=false, bool add_eol=true, bool refresh=false)
Definition Console.h:807
bool isEnabled(int l)
检查日志级别是否启用
Definition Console.h:820
bool refresh
是否刷新
Definition Console.h:850
std::stringstream & prefix(std::stringstream &str, const char *src, int line)
生成日志前缀
bool print_time
是否打印时间
Definition Console.h:848
int & lvl
日志级别引用
Definition Console.h:845
std::string tag
日志标签
Definition Console.h:844
日志级别辅助类
Definition Console.h:805
FC_DURATION GetDuration(FC_TIME_POINT &t)
Definition Console.h:393
LogStyle
用于标识日志级别
Definition Console.h:412
ConsoleSingleton & Console()
获取控制台实例
Definition Console.h:767
Definition BaseFigureFactory.h:24