19#ifndef BIMHOMEBASE_CONSOLE_H
20#define BIMHOMEBASE_CONSOLE_H
35# pragma clang diagnostic push
36# pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
44# undef FC_LOGPYOBJECTS
46# define FC_LOGFEATUREUPDATE
48# undef FC_LOGUPDATECHAIN
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
282#define _FC_LOG_LEVEL_INIT(_name,_tag,...) \
283 static Base::LogLevel _name(_tag,## __VA_ARGS__);
285#ifndef FC_LOG_INSTANCE
286# define FC_LOG_INSTANCE _s_fclvl
289#define FC_LOG_LEVEL_INIT(_tag,...) \
290 _FC_LOG_LEVEL_INIT(FC_LOG_INSTANCE, _tag, ## __VA_ARGS__)
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) \
298 Base::Console()._func(_str.str().c_str());\
299 if(_instance.refresh) Base::Console().Refresh();\
303#define _FC_PRINT(_instance,_l,_func,_msg) __FC_PRINT(_instance,_l,_func,_msg,__FILE__,__LINE__)
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)
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)
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<<')'
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>
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
331# define _FC_DURATION_PRINT(_l,_d,_msg) \
332 FC_##_l(_msg<< " time: " << _d.count()<<'s');
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)
338# define _FC_TIME_PRINT(_l,_t,_msg) \
339 _FC_DURATION_PRINT(_l,Base::GetDuration(_t),_msg);
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)
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
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)
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)
357# define FC_DURATION_PLUS(_d,_t) _d += Base::GetDuration(_t)
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)
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)
384 class ConsoleSingleton;
392#ifndef FC_LOG_NO_TIMING
395 auto tnow = std::chrono::FC_TIME_CLOCK::now();
396 auto d = std::chrono::duration_cast<FC_DURATION>(tnow - t);
429 ILogger() :bErr(true), bMsg(true), bLog(true), bWrn(true) {}
445 virtual const char*
Name() {
return nullptr; }
529 virtual void Error(
const char* pMsg, ...);
535 virtual void Log(
const char* pMsg, ...);
635 _defaultLogLevel = level;
646 return level < 0 ? _defaultLogLevel : level;
746 static const unsigned int BufferSize = 4024;
759 friend class ConsoleOutput;
807 LogLevel(
const char* tag,
bool print_tag =
true,
int print_src = 0,
bool print_time =
false,
bool add_eol =
true,
bool refresh =
false)
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)
841 std::stringstream&
prefix(std::stringstream& str,
const char* src,
int line);
856#if defined(__clang__)
857# pragma clang diagnostic pop
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
virtual ~ConsoleSingleton()
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
获取观察者
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
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