OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::ExportLines Class Reference
Collaboration diagram for Slic3r::ExportLines:

Classes

struct  Backtrace
struct  LineData
class  Statistics

Public Types

enum class  EWriteType { BySize , ByTime }

Public Member Functions

 ExportLines (EWriteType type, const std::array< GCodeProcessor::TimeMachine, static_cast< size_t >(PrintEstimatedStatistics::ETimeMode::Count)> &machines, GCodeFileWriter &writer)
unsigned int update (const std::string &line, size_t lines_counter, size_t g1_lines_counter)
void append_line (const std::string &line, const bool ignore_from_move=false)
void insert_lines (const Backtrace &backtrace, const std::string &cmd, std::function< std::string(unsigned int, const std::vector< float > &)> line_inserter, std::function< std::string(const std::string &)> line_replacer)
void write (float backtrace_time)
void flush ()
void synchronize_moves (GCodeProcessorResult &result) const
unsigned int remap_gcode_id (unsigned int gcode_id) const
size_t get_size () const
void reserve (size_t lines_count)

Private Types

enum  ETimeMode { Normal = static_cast<int>(PrintEstimatedStatistics::ETimeMode::Normal) , Stealth = static_cast<int>(PrintEstimatedStatistics::ETimeMode::Stealth) }

Private Attributes

Statistics m_statistics
EWriteType m_write_type {EWriteType::BySize}
const std::array< GCodeProcessor::TimeMachine, static_cast< size_t >(PrintEstimatedStatistics::ETimeMode::Count)> & m_machines
GCodeFileWriter & m_writer
std::array< float, static_cast< size_t >(PrintEstimatedStatistics::ETimeMode::Count)> m_times {0.0f, 0.0f}
size_t m_size {0}
std::deque< LineData > m_lines
size_t m_added_lines_counter {0}
std::vector< std::pair< size_t, size_t > > m_gcode_lines_map
size_t m_times_cache_id {0}

Detailed Description


Class Documentation

◆ Slic3r::ExportLines::LineData

struct Slic3r::ExportLines::LineData
Collaboration diagram for Slic3r::ExportLines::LineData:
Class Members
string line
array< float, static_cast< size_t >(Count)> times {0.0f, 0.0f}

Member Enumeration Documentation

◆ ETimeMode

Enumerator
Normal 
Stealth 
919 {
922 };
@ Stealth
Definition GCodeProcessor.cpp:921
@ Normal
Definition GCodeProcessor.cpp:920
@ Stealth
Definition GCodeProcessor.hpp:90
@ Normal
Definition GCodeProcessor.hpp:89

◆ EWriteType

Enumerator
BySize 
ByTime 
910{ BySize, ByTime };

Constructor & Destructor Documentation

◆ ExportLines()

Slic3r::ExportLines::ExportLines ( EWriteType type,
const std::array< GCodeProcessor::TimeMachine, static_cast< size_t >(PrintEstimatedStatistics::ETimeMode::Count)> & machines,
GCodeFileWriter & writer )
inline
971 : m_statistics(*this)
972 , m_write_type(type)
973 , m_machines(machines)
974 , m_writer(writer){}
Statistics m_statistics
Definition GCodeProcessor.cpp:946
const std::array< GCodeProcessor::TimeMachine, static_cast< size_t >(PrintEstimatedStatistics::ETimeMode::Count)> & m_machines
Definition GCodeProcessor.cpp:951
GCodeFileWriter & m_writer
Definition GCodeProcessor.cpp:953
EWriteType m_write_type
Definition GCodeProcessor.cpp:949

References Slic3r::PrintEstimatedStatistics::Count, m_machines, m_statistics, m_write_type, and m_writer.

Referenced by Slic3r::ExportLines::Statistics::Statistics().

Here is the caller graph for this function:

Member Function Documentation

◆ append_line()

void Slic3r::ExportLines::append_line ( const std::string & line,
const bool ignore_from_move = false )
inline
1026 {
1027 if (line.empty())
1028 return;
1029
1031 m_lines.push_back({line, m_times});
1032#ifndef NDEBUG
1033 m_statistics.add_line(line.length());
1034#endif // NDEBUG
1035 m_size += line.length();
1036 } else
1037 m_writer.append(line);
1039 if (!ignore_from_move) {
1040 assert(!m_gcode_lines_map.empty());
1042 }
1043 }
@ ByTime
Definition GCodeProcessor.cpp:910
std::deque< LineData > m_lines
Definition GCodeProcessor.cpp:960
size_t m_size
Definition GCodeProcessor.cpp:957
std::vector< std::pair< size_t, size_t > > m_gcode_lines_map
Definition GCodeProcessor.cpp:964
std::array< float, static_cast< size_t >(PrintEstimatedStatistics::ETimeMode::Count)> m_times
Definition GCodeProcessor.cpp:955
size_t m_added_lines_counter
Definition GCodeProcessor.cpp:961

References ByTime, m_added_lines_counter, m_gcode_lines_map, m_lines, m_size, m_statistics, m_times, m_write_type, and m_writer.

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the caller graph for this function:

◆ flush()

void Slic3r::ExportLines::flush ( )
inline
1122 {
1123 while (!m_lines.empty()) {
1124 m_writer.append(m_lines.front().line);
1125 m_lines.pop_front();
1126 }
1127 m_size = 0;
1128#ifndef NDEBUG
1129 m_statistics.remove_all_lines();
1130#endif // NDEBUG
1131 m_writer.flush();
1132 }

References m_lines, m_size, m_statistics, and m_writer.

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the caller graph for this function:

◆ get_size()

size_t Slic3r::ExportLines::get_size ( ) const
inline
1162{ return m_size; }

References m_size.

◆ insert_lines()

void Slic3r::ExportLines::insert_lines ( const Backtrace & backtrace,
const std::string & cmd,
std::function< std::string(unsigned int, const std::vector< float > &)> line_inserter,
std::function< std::string(const std::string &)> line_replacer )
inline
1050 {
1051 // Orca: find start pos by seaching G28/G29/PRINT_START/START_PRINT commands
1052 auto is_start_pos = [](const std::string& curr_cmd) {
1053 return ascii_iequals(curr_cmd, "G28") || ascii_iequals(curr_cmd, "G29") || ascii_iequals(curr_cmd, "PRINT_START") ||
1054 ascii_iequals(curr_cmd, "START_PRINT");
1055 };
1056 assert(!m_lines.empty());
1057 const float time_step = backtrace.time_step();
1058 size_t rev_it_dist = 0; // distance from the end of the cache of the starting point of the backtrace
1059 float last_time_insertion = 0.0f; // used to avoid inserting two lines at the same time
1060 for (int i = 0; i < backtrace.steps; ++i) {
1061 const float backtrace_time_i = (i + 1) * time_step;
1062 const float time_threshold_i = m_times[Normal] - backtrace_time_i;
1063 auto rev_it = m_lines.rbegin() + rev_it_dist;
1064 auto start_rev_it = rev_it;
1065
1066 std::string curr_cmd = GCodeReader::GCodeLine::extract_cmd(rev_it->line);
1067 // backtrace into the cache to find the place where to insert the line
1068 while (rev_it != m_lines.rend() && rev_it->times[Normal] > time_threshold_i && curr_cmd != cmd && !is_start_pos(curr_cmd)) {
1069 rev_it->line = line_replacer(rev_it->line);
1070 ++rev_it;
1071 if (rev_it != m_lines.rend())
1072 curr_cmd = GCodeReader::GCodeLine::extract_cmd(rev_it->line);
1073 }
1074
1075 // we met the previous evenience of cmd, or the start position, stop inserting lines
1076 if (rev_it != m_lines.rend() && (curr_cmd == cmd || is_start_pos(curr_cmd)))
1077 break;
1078
1079 // insert the line for the current step
1080 if (rev_it != m_lines.rend() && rev_it != start_rev_it && rev_it->times[Normal] != last_time_insertion) {
1081 last_time_insertion = rev_it->times[Normal];
1082 std::vector<float> time_diffs;
1083 time_diffs.push_back(m_times[Normal] - last_time_insertion);
1084 if (!m_machines[Stealth].g1_times_cache.empty())
1085 time_diffs.push_back(m_times[Stealth] - rev_it->times[Stealth]);
1086 const std::string out_line = line_inserter(i + 1, time_diffs);
1087 rev_it_dist = std::distance(m_lines.rbegin(), rev_it) + 1;
1088 m_lines.insert(rev_it.base(), {out_line, rev_it->times});
1089#ifndef NDEBUG
1090 m_statistics.add_line(out_line.length());
1091#endif // NDEBUG
1092 m_size += out_line.length();
1093 // synchronize gcode lines map
1094 for (auto map_it = m_gcode_lines_map.rbegin(); map_it != m_gcode_lines_map.rbegin() + rev_it_dist - 1; ++map_it) {
1095 ++map_it->second;
1096 }
1097
1099 }
1100 }
1101 }
static std::string extract_cmd(const std::string &gcode_line)
Definition GCodeReader.hpp:96
bool ascii_iequals(std::string_view a, std::string_view b)
Definition Utils.hpp:306

References Slic3r::ascii_iequals(), Slic3r::GCodeReader::GCodeLine::extract_cmd(), m_added_lines_counter, m_gcode_lines_map, m_lines, m_machines, m_size, m_statistics, m_times, Normal, Stealth, Slic3r::ExportLines::Backtrace::steps, and Slic3r::ExportLines::Backtrace::time_step().

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remap_gcode_id()

unsigned int Slic3r::ExportLines::remap_gcode_id ( unsigned int gcode_id) const
inline
1152 {
1153 if (gcode_id == static_cast<unsigned int>(-1))
1154 return gcode_id;
1155 auto it = std::lower_bound(m_gcode_lines_map.begin(), m_gcode_lines_map.end(), static_cast<size_t>(gcode_id),
1156 [](const std::pair<size_t, size_t>& e, size_t v) { return e.first < v; });
1157 if (it != m_gcode_lines_map.end() && it->first == static_cast<size_t>(gcode_id))
1158 return static_cast<unsigned int>(it->second);
1159 return gcode_id;
1160 }

References m_gcode_lines_map.

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the caller graph for this function:

◆ reserve()

void Slic3r::ExportLines::reserve ( size_t lines_count)
inline
1164{ m_gcode_lines_map.reserve(lines_count); }

References m_gcode_lines_map.

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the caller graph for this function:

◆ synchronize_moves()

void Slic3r::ExportLines::synchronize_moves ( GCodeProcessorResult & result) const
inline
1135 {
1136 auto it = m_gcode_lines_map.begin();
1137 for (GCodeProcessorResult::MoveVertex& move : result.moves) {
1138 while (it != m_gcode_lines_map.end() && it->first < move.gcode_id) {
1139 ++it;
1140 }
1141 if (it != m_gcode_lines_map.end() && it->first == move.gcode_id)
1142 move.gcode_id = it->second;
1143 }
1144 }

References Slic3r::GCodeProcessorResult::MoveVertex::gcode_id, m_gcode_lines_map, Slic3r::GCodeProcessorResult::moves, and Slic3r::GCodeProcessor::result().

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update()

unsigned int Slic3r::ExportLines::update ( const std::string & line,
size_t lines_counter,
size_t g1_lines_counter )
inline
982 {
983 unsigned int ret = 0;
984 m_gcode_lines_map.push_back({lines_counter, 0});
985
986 if (GCodeReader::GCodeLine::cmd_is(line, "G0") || GCodeReader::GCodeLine::cmd_is(line, "G1") ||
989 ++g1_lines_counter;
990 else
991 return ret;
992
993 auto init_it = m_machines[Normal].g1_times_cache.begin() + m_times_cache_id;
994 auto it = init_it;
995 while (it != m_machines[Normal].g1_times_cache.end() && it->id < g1_lines_counter) {
996 ++it;
998 }
999
1000 if (it == m_machines[Normal].g1_times_cache.end() || it->id > g1_lines_counter)
1001 return ret;
1002
1003 // search for internal G1 lines
1004 if (GCodeReader::GCodeLine::cmd_is(line, "G2") || GCodeReader::GCodeLine::cmd_is(line, "G3")) {
1005 while (it != m_machines[Normal].g1_times_cache.end() && it->remaining_internal_g1_lines > 0) {
1006 ++it;
1008 ++g1_lines_counter;
1009 ++ret;
1010 }
1011 }
1012
1013 if (it != m_machines[Normal].g1_times_cache.end() && it->id == g1_lines_counter) {
1014 m_times[Normal] = it->elapsed_time;
1015 if (!m_machines[Stealth].g1_times_cache.empty())
1016 m_times[Stealth] = (m_machines[Stealth].g1_times_cache.begin() +
1017 std::distance(m_machines[Normal].g1_times_cache.begin(), it))
1018 ->elapsed_time;
1019 }
1020
1021 return ret;
1022 }
size_t m_times_cache_id
Definition GCodeProcessor.cpp:966
bool cmd_is(const char *cmd_test) const
Definition GCodeReader.hpp:58

References Slic3r::GCodeReader::GCodeLine::cmd_is(), m_gcode_lines_map, m_machines, m_times, m_times_cache_id, Normal, and Stealth.

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ write()

void Slic3r::ExportLines::write ( float backtrace_time)
inline
1105 {
1107 return;
1108
1109 while (!m_lines.empty() && m_lines.front().times[Normal] < m_times[Normal] - backtrace_time) {
1110 const LineData& data = m_lines.front();
1111 m_writer.append(data.line);
1112 m_size -= data.line.length();
1113 m_lines.pop_front();
1114#ifndef NDEBUG
1115 m_statistics.remove_line();
1116#endif // NDEBUG
1117 }
1118 }
Definition GCodeProcessor.cpp:914

References ByTime, Slic3r::ExportLines::LineData::line, m_lines, m_size, m_statistics, m_times, m_write_type, m_writer, and Normal.

Referenced by Slic3r::GCodeProcessor::run_post_process().

Here is the caller graph for this function:

Member Data Documentation

◆ m_added_lines_counter

size_t Slic3r::ExportLines::m_added_lines_counter {0}
private
961{0};

Referenced by append_line(), and insert_lines().

◆ m_gcode_lines_map

std::vector<std::pair<size_t, size_t> > Slic3r::ExportLines::m_gcode_lines_map
private

◆ m_lines

std::deque<LineData> Slic3r::ExportLines::m_lines
private

◆ m_machines

const std::array<GCodeProcessor::TimeMachine, static_cast<size_t>(PrintEstimatedStatistics::ETimeMode::Count)>& Slic3r::ExportLines::m_machines
private

Referenced by ExportLines(), insert_lines(), and update().

◆ m_size

size_t Slic3r::ExportLines::m_size {0}
private
957{0};

Referenced by append_line(), flush(), get_size(), insert_lines(), and write().

◆ m_statistics

Statistics Slic3r::ExportLines::m_statistics
private

◆ m_times

std::array<float, static_cast<size_t>(PrintEstimatedStatistics::ETimeMode::Count)> Slic3r::ExportLines::m_times {0.0f, 0.0f}
private
955{0.0f, 0.0f};

Referenced by append_line(), insert_lines(), update(), and write().

◆ m_times_cache_id

size_t Slic3r::ExportLines::m_times_cache_id {0}
private
966{0};

Referenced by update().

◆ m_write_type

EWriteType Slic3r::ExportLines::m_write_type {EWriteType::BySize}
private
@ BySize
Definition GCodeProcessor.cpp:910

Referenced by ExportLines(), append_line(), and write().

◆ m_writer

GCodeFileWriter& Slic3r::ExportLines::m_writer
private

Referenced by ExportLines(), append_line(), flush(), and write().


The documentation for this class was generated from the following file: