From 1687c5d624274fd09c2973c526a83a5a09293ce1 Mon Sep 17 00:00:00 2001 From: sunsets <845944018@qq.com> Date: Thu, 21 Sep 2023 19:45:51 +0800 Subject: [PATCH] exclude_object --- src/libslic3r/GCode.cpp | 26 ++++++++++++++++++++-- src/libslic3r/GCodeWriter.cpp | 42 +++++++++++++++++------------------ src/libslic3r/GCodeWriter.hpp | 20 ++++++++--------- 3 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index d986ecb..aac1560 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1487,6 +1487,13 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Write end commands to file. file.write(this->retract()); + //B38 + { + std::string gcode; + m_writer.add_object_change_labels(gcode); + file.write(gcode); + } + file.write(m_writer.set_fan(0)); @@ -2458,7 +2465,8 @@ void GCode::process_layer_single_object( ++ object_id; gcode += std::string("; printing object ") + print_object.model_object()->name + " id:" + std::to_string(object_id) + " copy " + std::to_string(print_instance.instance_id) + "\n"; //B38 - gcode += std::string("EXCLUDE_OBJECT_START NAME=") + print_object.model_object()->name + "\n"; + //gcode += std::string("EXCLUDE_OBJECT_START NAME=") + print_object.model_object()->name + "\n"; + m_writer.set_object_start_str(std::string("EXCLUDE_OBJECT_START NAME=") + print_object.model_object()->name + "\n"); } } }; @@ -2636,7 +2644,12 @@ void GCode::process_layer_single_object( gcode += std::string("; stop printing object ") + print_object.model_object()->name + " id:" + std::to_string(object_id) + " copy " + std::to_string(print_instance.instance_id) + "\n"; //B38 - gcode += std::string("EXCLUDE_OBJECT_END NAME=") + print_object.model_object()->name + "\n"; + //gcode += std::string("EXCLUDE_OBJECT_END NAME=") + print_object.model_object()->name + "\n"; + if (!m_writer.is_object_start_str_empty()) { + m_writer.set_object_start_str(""); + } else { + m_writer.set_object_end_str(std::string("EXCLUDE_OBJECT_END NAME=") + print_object.model_object()->name + "\n"); + } } } @@ -2719,6 +2732,10 @@ std::string GCode::change_layer(coordf_t print_z) gcode += this->retract(); } + //B38 + m_writer.add_object_change_labels(gcode); + + { std::ostringstream comment; comment << "move to next layer (" << m_layer_index << ")"; @@ -3011,6 +3028,8 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de gcode += this->travel_to(path.first_point(), path.role(), comment); } + //B38 + m_writer.add_object_change_labels(gcode); // compensate retraction gcode += this->unretract(); @@ -3311,6 +3330,9 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string // Reset the wipe path when traveling, so one would not wipe along an old path. m_wipe.reset_path(); + //B38 + m_writer.add_object_change_labels(gcode); + // use G1 because we rely on paths being straight (G0 may make round paths) if (travel.size() >= 2) { diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index aebd558..52080c7 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -601,27 +601,27 @@ std::string GCodeWriter::set_fan(unsigned int speed) const //B38 -//void GCodeWriter::add_object_start_labels(std::string &gcode) -//{ -// if (!m_gcode_label_objects_start.empty()) { -// gcode += m_gcode_label_objects_start; -// m_gcode_label_objects_start = ""; -// } -//} -// -//void GCodeWriter::add_object_end_labels(std::string &gcode) -//{ -// if (!m_gcode_label_objects_end.empty()) { -// gcode += m_gcode_label_objects_end; -// m_gcode_label_objects_end = ""; -// } -//} -// -//void GCodeWriter::add_object_change_labels(std::string &gcode) -//{ -// add_object_end_labels(gcode); -// add_object_start_labels(gcode); -//} +void GCodeWriter::add_object_start_labels(std::string &gcode) +{ + if (!m_gcode_label_objects_start.empty()) { + gcode += m_gcode_label_objects_start; + m_gcode_label_objects_start = ""; + } +} + +void GCodeWriter::add_object_end_labels(std::string &gcode) +{ + if (!m_gcode_label_objects_end.empty()) { + gcode += m_gcode_label_objects_end; + m_gcode_label_objects_end = ""; + } +} + +void GCodeWriter::add_object_change_labels(std::string &gcode) +{ + add_object_end_labels(gcode); + add_object_start_labels(gcode); +} void GCodeFormatter::emit_axis(const char axis, const double v, size_t digits) { diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index ccbf7b8..4420007 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -102,13 +102,13 @@ public: void set_is_first_layer(bool bval) { m_is_first_layer = bval; } //B38 - //void set_object_start_str(std::string start_string) { m_gcode_label_objects_start = start_string; } - //bool empty_object_start_str() { return m_gcode_label_objects_start.empty(); } - //void set_object_end_str(std::string end_string) { m_gcode_label_objects_end = end_string; } - //bool empty_object_end_str() { return m_gcode_label_objects_end.empty(); } - //void add_object_start_labels(std::string &gcode); - //void add_object_end_labels(std::string &gcode); - //void add_object_change_labels(std::string &gcode); + void set_object_start_str(std::string start_string) { m_gcode_label_objects_start = start_string; } + bool is_object_start_str_empty() { return m_gcode_label_objects_start.empty(); } + void set_object_end_str(std::string end_string) { m_gcode_label_objects_end = end_string; } + bool is_object_end_str_empty() { return m_gcode_label_objects_end.empty(); } + void add_object_start_labels(std::string &gcode); + void add_object_end_labels(std::string &gcode); + void add_object_change_labels(std::string &gcode); private: @@ -135,9 +135,9 @@ private: //B36 bool m_is_first_layer = true; - ////B38 - //std::string m_gcode_label_objects_start; - //std::string m_gcode_label_objects_end; + //B38 + std::string m_gcode_label_objects_start; + std::string m_gcode_label_objects_end; enum class Acceleration { Travel,