From 45c16e53188826536effade704cf279ab72dc1c3 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sun, 16 Aug 2020 13:37:58 +0200 Subject: [PATCH] Option for realtime logging with -vv --- src/ifcconvert/IfcConvert.cpp | 28 +++++++++++++++++++++++----- src/ifcparse/IfcLogger.cpp | 9 ++++++--- src/ifcparse/IfcLogger.h | 2 +- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index f1c6b7de09..9d1dd4866a 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -174,6 +174,11 @@ std::vector setup_filters(const std::vector&, co bool init_input_file(const std::string& filename, IfcParse::IfcFile*& ifc_file, bool no_progress, bool mmap); +// from https://stackoverflow.com/questions/31696328/boost-program-options-using-zero-parameter-options-multiple-times +struct verbosity_counter { + int count; +}; + #if defined(_MSC_VER) && defined(_UNICODE) int wmain(int argc, wchar_t** argv) { typedef po::wcommand_line_parser command_line_parser; @@ -197,10 +202,11 @@ int main(int argc, char** argv) { std::string log_format; po::options_description generic_options("Command line options"); + verbosity_counter vcounter; generic_options.add_options() ("help,h", "display usage information") ("version", "display version information") - ("verbose,v", "more verbose log messages") + ("verbose,v", po::value(&vcounter)->zero_tokens(), "more verbose log messages") ("quiet,q", "less status and progress output") ("stderr-progress", "output progress to stderr stream") ("yes,y", "answer 'yes' automatically to possible confirmation queries (e.g. overwriting an existing output file)") @@ -403,7 +409,6 @@ int main(int argc, char** argv) { po::notify(vmap); const bool mmap = vmap.count("mmap") != 0; - const bool verbose = vmap.count("verbose") != 0; const bool no_progress = vmap.count("no-progress") != 0; const bool quiet = vmap.count("quiet") != 0; const bool stderr_progress = vmap.count("stderr-progress") != 0; @@ -539,8 +544,13 @@ int main(int argc, char** argv) { } } - Logger::SetOutput(quiet ? nullptr : &cout_, &log_stream); - Logger::Verbosity(verbose ? Logger::LOG_NOTICE : Logger::LOG_ERROR); + Logger::SetOutput(quiet ? nullptr : &cout_, vcounter.count > 1 ? &cout_ : &log_stream); + Logger::Verbosity(vcounter.count + ? (vcounter.count > 1 + ? Logger::LOG_DEBUG + : Logger::LOG_NOTICE) + : Logger::LOG_ERROR + ); path_t output_temp_filename = output_filename + IfcUtil::path::from_utf8(TEMP_FILE_EXTENSION); @@ -757,7 +767,7 @@ int main(int argc, char** argv) { Logger::Status("Creating geometry..."); } - Logger::SetOutput(quiet ? nullptr : &cout_, &log_stream); + Logger::SetOutput(quiet ? nullptr : &cout_, vcounter.count > 1 ? &cout_ : &log_stream); if (model_rotation) { std::array &rotation = settings.rotation; @@ -913,6 +923,9 @@ int main(int argc, char** argv) { cout_ << std::flush; if (stderr_progress) cerr_ << std::flush; + } else if (vcounter.count == 2) { + const int progress = context_iterator.progress(); + Logger::Message(Logger::LOG_DEBUG, "Progress " + boost::lexical_cast(progress)); } else { const int progress = context_iterator.progress() / 2; if (old_progress != progress) Logger::ProgressBar(progress); @@ -1119,6 +1132,11 @@ void parse_filter(geom_filter &filter, const std::vector& values) filter.values.insert(values.begin() + (filter.type == geom_filter::ENTITY_ARG ? 2 : 1), values.end()); } +void validate(boost::any& v, const std::vector& values, verbosity_counter*, long) { + if (v.empty()) v = verbosity_counter{ 1 }; + else ++boost::any_cast(v).count; +} + void validate(boost::any& v, const std::vector& values, inclusion_filter*, int) { /// @todo For now only single --include, --include+, --exclude, or --exclude+ supported. Support having multiple. diff --git a/src/ifcparse/IfcLogger.cpp b/src/ifcparse/IfcLogger.cpp index 9ab29e74a4..37c60a1ac9 100644 --- a/src/ifcparse/IfcLogger.cpp +++ b/src/ifcparse/IfcLogger.cpp @@ -37,14 +37,14 @@ namespace { template struct severity_strings { - static const std::array, 3> value; + static const std::array, 4> value; }; template <> - const std::array, 3> severity_strings::value = { "Notice", "Warning", "Error" }; + const std::array, 4> severity_strings::value = { "Debug", "Notice", "Warning", "Error" }; template <> - const std::array, 3> severity_strings::value = { L"Notice", L"Warning", L"Error" }; + const std::array, 4> severity_strings::value = { L"Debug", L"Notice", L"Warning", L"Error" }; template void plain_text_message(T& os, const boost::optional& current_product, Logger::Severity type, const std::string& message, const IfcUtil::IfcBaseClass* instance) { @@ -93,6 +93,9 @@ namespace { } void Logger::SetProduct(boost::optional product) { + if (verbosity == LOG_DEBUG && product) { + Message(LOG_DEBUG, "Begin processing", *product); + } current_product = product; } diff --git a/src/ifcparse/IfcLogger.h b/src/ifcparse/IfcLogger.h index 9ae7f49e39..1d2a69ebd2 100644 --- a/src/ifcparse/IfcLogger.h +++ b/src/ifcparse/IfcLogger.h @@ -35,7 +35,7 @@ class IFC_PARSE_API Logger { public: - typedef enum { LOG_NOTICE, LOG_WARNING, LOG_ERROR } Severity; + typedef enum { LOG_DEBUG, LOG_NOTICE, LOG_WARNING, LOG_ERROR } Severity; typedef enum { FMT_PLAIN, FMT_JSON } Format; private: