ENH: CLI: add total progress of slicing

Change-Id: I05e471aa4cd76642cdd63275620a4b656c8e3327
This commit is contained in:
lane.wei 2022-11-07 22:51:17 +08:00 committed by Lane.Wei
parent 8d0f19fd6a
commit 5791ca7e8d
1 changed files with 57 additions and 10 deletions

View File

@ -140,8 +140,9 @@ std::map<int, std::string> cli_errors = {
typedef struct _cli_callback_mgr {
int m_plate_count {0};
int m_plate_index;
int m_plate_index {0};
int m_progress { 0 };
int m_total_progress { 0 };
std::string m_message;
int m_warning_step;
bool m_exit {false};
@ -165,9 +166,11 @@ typedef struct _cli_callback_mgr {
void set_plate_info(int index, int count)
{
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": index="<<index<< ", count = "<< count;
std::unique_lock<std::mutex> lck(m_mutex);
m_plate_count = count;
m_plate_index = index;
m_progress = 0;
lck.unlock();
return;
@ -182,7 +185,8 @@ typedef struct _cli_callback_mgr {
//record the headers
j["plate_index"] = m_plate_index;
j["plate_count"] = m_plate_count;
j["percent"] = m_progress;
j["plate_percent"] = m_progress;
j["total_percent"] = m_total_progress;
j["message"] = m_message;
std::string notify_message = j.dump();
@ -209,12 +213,14 @@ typedef struct _cli_callback_mgr {
lck.lock();
m_condition.wait(lck, [this](){ return m_data_ready || m_exit; });
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ": wakup.";
if (m_data_ready) {
notify();
m_data_ready = false;
}
if (m_exit) {
BOOST_LOG_TRIVIAL(info) << "cli_callback_mgr_t::thread_proc will exit.";
break;
}
notify();
m_data_ready = false;
lck.unlock();
m_condition.notify_one();
}
@ -224,7 +230,7 @@ typedef struct _cli_callback_mgr {
void update(int percent, std::string message, int warning_step)
{
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ": percent="<<percent<< ", warning_step = "<< m_warning_step<<", message="<<message;
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": percent="<<percent<< ", plate_index = "<< m_plate_index<<", plate_count="<< m_plate_count<<", message="<<message;
std::unique_lock<std::mutex> lck(m_mutex);
if (!m_started) {
lck.unlock();
@ -236,8 +242,17 @@ typedef struct _cli_callback_mgr {
lck.unlock();
return;
}
m_message = message;
m_progress = percent;
if ((m_plate_index >= 1)&&(m_plate_index <= m_plate_count)) {
if (m_plate_count <= 1)
m_total_progress = 0.9*m_progress;
else {
m_total_progress = ((float)(m_plate_index - 1)*90)/m_plate_count + ((float)m_progress*0.9)/m_plate_count;
}
}
else
m_total_progress = 0.9*m_progress;
m_message = message;
m_warning_step = warning_step;
m_data_ready = true;
lck.unlock();
@ -266,10 +281,6 @@ typedef struct _cli_callback_mgr {
{
BOOST_LOG_TRIVIAL(info) << "cli_callback_mgr_t::stop enter.";
std::unique_lock<std::mutex> lck(m_mutex);
if (m_pipe_fd > 0) {
close(m_pipe_fd);
m_pipe_fd = -1;
}
if (!m_started) {
lck.unlock();
BOOST_LOG_TRIVIAL(info) << "cli_callback_mgr_t::stop not started before, return directly.";
@ -280,6 +291,10 @@ typedef struct _cli_callback_mgr {
m_condition.notify_one();
// Wait until the worker thread exits.
m_thread.join();
if (m_pipe_fd > 0) {
close(m_pipe_fd);
m_pipe_fd = -1;
}
BOOST_LOG_TRIVIAL(info) << "cli_callback_mgr_t::stop successfully.";
}
}cli_callback_mgr_t;
@ -1429,6 +1444,12 @@ int CLI::run(int argc, char **argv)
//run_post_process_scripts(outfile, print->full_print_config());
BOOST_LOG_TRIVIAL(info) << "Slicing result exported to " << outfile << std::endl;
part_plate->update_slice_result_valid_state(true);
#if defined(__linux__) || defined(__LINUX__)
if (g_cli_callback_mgr.is_started()) {
PrintBase::SlicingStatus slicing_status{100, "Slicing finished"};
cli_status_callback(slicing_status);
}
#endif
} catch (const std::exception &ex) {
BOOST_LOG_TRIVIAL(info) << "found slicing or export error for partplate "<<index+1 << std::endl;
boost::nowide::cerr << ex.what() << std::endl;
@ -1436,6 +1457,13 @@ int CLI::run(int argc, char **argv)
flush_and_exit(CLI_SLICING_ERROR);
}
}//end for partplate
#if defined(__linux__) || defined(__LINUX__)
if (g_cli_callback_mgr.is_started()) {
int plate_count = (plate_to_slice== 0)?partplate_list.get_plate_count():1;
g_cli_callback_mgr.set_plate_info(plate_count+1, plate_count);
}
#endif
/*
print.center = ! m_config.has("center")
&& ! m_config.has("align_xy")
@ -1485,6 +1513,13 @@ int CLI::run(int argc, char **argv)
export_3mf_file = outfile_dir + "/"+export_3mf_file;
}
#if defined(__linux__) || defined(__LINUX__)
if (g_cli_callback_mgr.is_started()) {
PrintBase::SlicingStatus slicing_status{91, "Generate thumbnails"};
cli_status_callback(slicing_status);
}
#endif
// get type and color for platedata
auto* filament_types = dynamic_cast<const ConfigOptionStrings*>(m_print_config.option("filament_type"));
const ConfigOptionStrings* filament_color = dynamic_cast<const ConfigOptionStrings *>(m_print_config.option("filament_colour"));
@ -1695,6 +1730,13 @@ int CLI::run(int argc, char **argv)
}
}
#if defined(__linux__) || defined(__LINUX__)
if (g_cli_callback_mgr.is_started()) {
PrintBase::SlicingStatus slicing_status{95, "Exporting 3mf"};
cli_status_callback(slicing_status);
}
#endif
BOOST_LOG_TRIVIAL(info) << "will export 3mf to " << export_3mf_file << std::endl;
if (! this->export_project(&m_models[0], export_3mf_file, plate_data_list, project_presets, thumbnails, calibration_thumbnails, plate_bboxes, &m_print_config))
{
@ -1718,6 +1760,11 @@ int CLI::run(int argc, char **argv)
}
#if defined(__linux__) || defined(__LINUX__)
if (g_cli_callback_mgr.is_started()) {
PrintBase::SlicingStatus slicing_status{100, "All done, Success"};
cli_status_callback(slicing_status);
}
g_cli_callback_mgr.stop();
#endif