From 90547686164e651b7fffc8bc4351b6b3fb6413a3 Mon Sep 17 00:00:00 2001
From: Tom <tsmith35@users.noreply.github.com>
Date: Fri, 20 Sep 2024 08:33:06 -0500
Subject: [PATCH] Revert "Tsmith35 per BS PR4631 (#6709)"

This reverts commit c8216accfdc249c7c24c4ee9b461599f30590152.
---
 src/libslic3r/GCode.cpp                | 287 +++++++------------------
 src/libslic3r/GCode/GCodeProcessor.cpp |  41 ++--
 src/libslic3r/GCode/GCodeProcessor.hpp |   4 +-
 3 files changed, 94 insertions(+), 238 deletions(-)

diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index d1f813bd924..49427a1d3fd 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -602,34 +602,16 @@ static std::vector<Vec2d> get_path_of_change_filament(const Print& print)
             toolchange_gcode_str = toolchange_retract_str + toolchange_gcode_str;
             // BBS
             {
+                // BBS: current position and fan_speed is unclear after interting change_filament_gcode
                 check_add_eol(toolchange_gcode_str);
-                // BBS: gcode writer doesn't know fan speed after inserting tool change gcode
                 toolchange_gcode_str += ";_FORCE_RESUME_FAN_SPEED\n";
-                
-                // BBS: check whether custom gcode changes the axis positions. Update if changed.
-                bool position_changed = false;
-                Vec3d new_pos = gcodegen.writer().get_position();
-
-                double temp_x_after_toolchange_gcode;
-                if (GCodeProcessor::get_last_pos_from_gcode(toolchange_gcode_str, 0, temp_x_after_toolchange_gcode)) {
-                    new_pos(0) = temp_x_after_toolchange_gcode;
-                    position_changed = true;
-                }
-                
-                double temp_y_after_toolchange_gcode;
-                if (GCodeProcessor::get_last_pos_from_gcode(toolchange_gcode_str, 1, temp_y_after_toolchange_gcode)) {
-                    new_pos(1) = temp_y_after_toolchange_gcode;
-                    position_changed = true;
-                }
-                
-                double temp_z_after_toolchange_gcode;
-                if (GCodeProcessor::get_last_pos_from_gcode(toolchange_gcode_str, 2, temp_z_after_toolchange_gcode)) {
-                    new_pos(2) = temp_z_after_toolchange_gcode;
-                    position_changed = true;
-                }
-                
-                if (position_changed) {
-                    gcodegen.writer().set_position(new_pos);
+                gcodegen.writer().set_current_position_clear(false);
+                // BBS: check whether custom gcode changes the z position. Update if changed
+                double temp_z_after_tool_change;
+                if (GCodeProcessor::get_last_z_from_gcode(toolchange_gcode_str, temp_z_after_tool_change)) {
+                    Vec3d pos = gcodegen.writer().get_position();
+                    pos(2)    = temp_z_after_tool_change;
+                    gcodegen.writer().set_position(pos);
                 }
             }
 
@@ -3396,7 +3378,7 @@ namespace Skirt {
 
     static std::map<unsigned int, std::pair<size_t, size_t>> make_skirt_loops_per_extruder_1st_layer(
         const Print             				&print,
-	const ExtrusionEntityCollection &skirt,
+        const ExtrusionEntityCollection &skirt,
         const LayerTools                		&layer_tools,
         // Heights (print_z) at which the skirt has already been extruded.
         std::vector<coordf_t>  			    	&skirt_done)
@@ -3687,37 +3669,17 @@ LayerResult GCode::process_layer(
     gcode += this->change_layer(print_z);  // this will increase m_layer_index
     m_layer = &layer;
     m_object_layer_over_raft = false;
-    // insert timelapse_gcode when traditional mode is not used (smooth mode)
     if(is_BBL_Printer()){
         if (printer_structure == PrinterStructure::psI3 && !need_insert_timelapse_gcode_for_traditional && !m_spiral_vase && print.config().print_sequence == PrintSequence::ByLayer) {
-
-		        std::string timelapse_gcode = insert_timelapse_gcode();
-		        gcode += timelapse_gcode;
-		        
-		        //BBS: check whether custom gcode changes the axis positions. Update if changed.
-		        bool position_changed = false;
-		        Vec3d new_pos = m_writer.get_position();
-		        
-		        double temp_x_after_timelapse_gcode;
-		        if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 0, temp_x_after_timelapse_gcode)) {
-		            new_pos(0) = temp_x_after_timelapse_gcode;
-		            position_changed = true;
-		        }
-		        
-		        double temp_y_after_timelapse_gcode;
-		        if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 1, temp_y_after_timelapse_gcode)) {
-		            new_pos(1) = temp_y_after_timelapse_gcode;
-		            position_changed = true;
-		        }
-		        
-		        double temp_z_after_timelapse_gcode;
-		        if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 2, temp_z_after_timelapse_gcode)) {
-		            new_pos(2) = temp_z_after_timelapse_gcode;
-		            position_changed = true;
-		        }
-		        
-		        if (position_changed) {
-		            m_writer.set_position(new_pos);
+            std::string timepals_gcode = insert_timelapse_gcode();
+            gcode += timepals_gcode;
+            m_writer.set_current_position_clear(false);
+            //BBS: check whether custom gcode changes the z position. Update if changed
+            double temp_z_after_timepals_gcode;
+            if (GCodeProcessor::get_last_z_from_gcode(timepals_gcode, temp_z_after_timepals_gcode)) {
+                Vec3d pos = m_writer.get_position();
+                pos(2) = temp_z_after_timepals_gcode;
+                m_writer.set_position(pos);
             }
         }
     } else {
@@ -4065,40 +4027,21 @@ LayerResult GCode::process_layer(
     // Extrude the skirt, brim, support, perimeters, infill ordered by the extruders.
     for (unsigned int extruder_id : layer_tools.extruders)
     {
-        // insert timelapse_gcode when wipe tower is enabled and traditional mode is used
         if (has_wipe_tower) {
             if (!m_wipe_tower->is_empty_wipe_tower_gcode(*this, extruder_id, extruder_id == layer_tools.extruders.back())) {
                 if (need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode) {
-                    gcode += this->retract(false, false, LiftType::SpiralLift);
+                    gcode += this->retract(false, false, LiftType::NormalLift);
                     m_writer.add_object_change_labels(gcode);
 
-                    std::string timelapse_gcode = insert_timelapse_gcode();
-                    gcode += timelapse_gcode;
-                    
-                    //BBS: check whether custom gcode changes the axis positions. Update if changed.
-                    bool position_changed = false;
-                    Vec3d new_pos = m_writer.get_position();
-                    
-                    double temp_x_after_timelapse_gcode;
-                    if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 0, temp_x_after_timelapse_gcode)) {
-                        new_pos(0) = temp_x_after_timelapse_gcode;
-                        position_changed = true;
-                    }
-                    
-                    double temp_y_after_timelapse_gcode;
-                    if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 1, temp_y_after_timelapse_gcode)) {
-                        new_pos(1) = temp_y_after_timelapse_gcode;
-                        position_changed = true;
-                    }
-                    
-                    double temp_z_after_timelapse_gcode;
-                    if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 2, temp_z_after_timelapse_gcode)) {
-                        new_pos(2) = temp_z_after_timelapse_gcode;
-                        position_changed = true;
-                    }
-                    
-                    if (position_changed) {
-                        m_writer.set_position(new_pos);
+                    std::string timepals_gcode = insert_timelapse_gcode();
+                    gcode += timepals_gcode;
+                    m_writer.set_current_position_clear(false);
+                    //BBS: check whether custom gcode changes the z position. Update if changed
+                    double temp_z_after_timepals_gcode;
+                    if (GCodeProcessor::get_last_z_from_gcode(timepals_gcode, temp_z_after_timepals_gcode)) {
+                        Vec3d pos = m_writer.get_position();
+                        pos(2) = temp_z_after_timepals_gcode;
+                        m_writer.set_position(pos);
                     }
                     has_insert_timelapse_gcode = true;
                 }
@@ -4111,7 +4054,7 @@ LayerResult GCode::process_layer(
         // let analyzer tag generator aware of a role type change
         if (layer_tools.has_wipe_tower && m_wipe_tower)
             m_last_processor_extrusion_role = erWipeTower;
-
+        
         if (print.config().skirt_type == stCombined && !print.skirt().empty())
             gcode += generate_skirt(print, print.skirt(), Point(0,0), layer_tools, layer, extruder_id);
 
@@ -4209,22 +4152,18 @@ LayerResult GCode::process_layer(
                 if (m_config.reduce_crossing_wall)
                     m_avoid_crossing_perimeters.init_layer(*m_layer);
 
-                std::string start_str;
-                std::string start_str_a;
-                std::string temp_start_str;
                 if (this->config().gcode_label_objects) {
-                    start_str_a = std::string("; printing object ") + instance_to_print.print_object.model_object()->name +
+                    gcode += std::string("; printing object ") + instance_to_print.print_object.model_object()->name +
                              " id:" + std::to_string(instance_to_print.print_object.get_id()) + " copy " +
                              std::to_string(inst.id) + "\n";
                 }
                 // exclude objects
                 if (m_enable_exclude_object) {
                     if (is_BBL_Printer()) {
-                        start_str =
+                        m_writer.set_object_start_str(
                             std::string("; start printing object, unique label id: ") +
                             std::to_string(instance_to_print.label_object_id) + "\n" + "M624 " +
-                            _encode_label_ids_to_base64({instance_to_print.label_object_id}) + "\n";
-                            m_writer.set_object_start_str(start_str);
+                            _encode_label_ids_to_base64({instance_to_print.label_object_id}) + "\n");
                     } else {
                         const auto gflavor = print.config().gcode_flavor.value;
                         if (gflavor == gcfKlipper) {
@@ -4237,8 +4176,6 @@ LayerResult GCode::process_layer(
                         }
                     }
                 }
-                temp_start_str = start_str + start_str_a;
-                gcode += start_str_a;
 
                 if (m_config.enable_overhang_speed && !m_config.overhang_speed_classic)
                     m_extrusion_quality_estimator.set_current_object(&instance_to_print.print_object);
@@ -4325,39 +4262,20 @@ LayerResult GCode::process_layer(
                     };
 
                     //BBS: for first layer, we always print wall firstly to get better bed adhesive force
-
-                    // insert timelapse_gcode when no wipe tower, has infill and not first layer
+                    //This behaviour is same with cura
                     if (is_infill_first && !first_layer) {
                         if (!has_wipe_tower && need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode && has_infill(by_region_specific)) {
-                            gcode += this->retract(false, false, LiftType::SpiralLift);
-
-                            std::string timelapse_gcode = insert_timelapse_gcode();
-                            gcode += timelapse_gcode;
-
-                            //BBS: check whether custom gcode changes the axis positions. Update if changed.
-                            bool position_changed = false;
-                            Vec3d new_pos = m_writer.get_position();
-                            
-                            double temp_x_after_timelapse_gcode;
-                            if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 0, temp_x_after_timelapse_gcode)) {
-                                new_pos(0) = temp_x_after_timelapse_gcode;
-                                position_changed = true;
-                            }
-                            
-                            double temp_y_after_timelapse_gcode;
-                            if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 1, temp_y_after_timelapse_gcode)) {
-                                new_pos(1) = temp_y_after_timelapse_gcode;
-                                position_changed = true;
-                            }
-                            
-                            double temp_z_after_timelapse_gcode;
-                            if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 2, temp_z_after_timelapse_gcode)) {
-                                new_pos(2) = temp_z_after_timelapse_gcode;
-                                position_changed = true;
-                            }
-                            
-                            if (position_changed) {
-                                m_writer.set_position(new_pos);
+                            gcode += this->retract(false, false, LiftType::NormalLift);
+
+                            std::string timepals_gcode = insert_timelapse_gcode();
+                            gcode += timepals_gcode;
+                            m_writer.set_current_position_clear(false);
+                            //BBS: check whether custom gcode changes the z position. Update if changed
+                            double temp_z_after_timepals_gcode;
+                            if (GCodeProcessor::get_last_z_from_gcode(timepals_gcode, temp_z_after_timepals_gcode)) {
+                                Vec3d pos = m_writer.get_position();
+                                pos(2) = temp_z_after_timepals_gcode;
+                                m_writer.set_position(pos);
                             }
 
                             has_insert_timelapse_gcode = true;
@@ -4366,37 +4284,18 @@ LayerResult GCode::process_layer(
                         gcode += this->extrude_perimeters(print, by_region_specific);
                     } else {
                         gcode += this->extrude_perimeters(print, by_region_specific);
-
-                        // insert timelapse_gcode when no wipe tower, no infill and is first layer
                         if (!has_wipe_tower && need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode && has_infill(by_region_specific)) {
-                            gcode += this->retract(false, false, LiftType::SpiralLift);
-                            std::string timelapse_gcode = insert_timelapse_gcode();
-                            gcode += timelapse_gcode;
-
-                            //BBS: check whether custom gcode changes the axis positions. Update if changed.
-                            bool position_changed = false;
-                            Vec3d new_pos = m_writer.get_position();
-                            
-                            double temp_x_after_timelapse_gcode;
-                            if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 0, temp_x_after_timelapse_gcode)) {
-                                new_pos(0) = temp_x_after_timelapse_gcode;
-                                position_changed = true;
-                            }
-                            
-                            double temp_y_after_timelapse_gcode;
-                            if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 1, temp_y_after_timelapse_gcode)) {
-                                new_pos(1) = temp_y_after_timelapse_gcode;
-                                position_changed = true;
-                            }
-                            
-                            double temp_z_after_timelapse_gcode;
-                            if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 2, temp_z_after_timelapse_gcode)) {
-                                new_pos(2) = temp_z_after_timelapse_gcode;
-                                position_changed = true;
-                            }
-                            
-                            if (position_changed) {
-                                m_writer.set_position(new_pos);
+                            gcode += this->retract(false, false, LiftType::NormalLift);
+
+                            std::string timepals_gcode = insert_timelapse_gcode();
+                            gcode += timepals_gcode;
+                            m_writer.set_current_position_clear(false);
+                            //BBS: check whether custom gcode changes the z position. Update if changed
+                            double temp_z_after_timepals_gcode;
+                            if (GCodeProcessor::get_last_z_from_gcode(timepals_gcode, temp_z_after_timepals_gcode)) {
+                                Vec3d pos = m_writer.get_position();
+                                pos(2) = temp_z_after_timepals_gcode;
+                                m_writer.set_position(pos);
                             }
 
                             has_insert_timelapse_gcode = true;
@@ -4463,41 +4362,22 @@ LayerResult GCode::process_layer(
     BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z <<
     log_memory_info();
 
-    // insert timelapse_gcode when no wipe tower and no infill
     if (!has_wipe_tower && need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode) {
         if (m_support_traditional_timelapse)
             m_support_traditional_timelapse = false;
 
-        gcode += this->retract(false, false, LiftType::SpiralLift);
+        gcode += this->retract(false, false, LiftType::NormalLift);
         m_writer.add_object_change_labels(gcode);
 
-        std::string timelapse_gcode = insert_timelapse_gcode();
-        gcode += timelapse_gcode;
-
-        //BBS: check whether custom gcode changes the axis positions. Update if changed.
-        bool position_changed = false;
-        Vec3d new_pos = m_writer.get_position();
-        
-        double temp_x_after_timelapse_gcode;
-        if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 0, temp_x_after_timelapse_gcode)) {
-            new_pos(0) = temp_x_after_timelapse_gcode;
-            position_changed = true;
-        }
-        
-        double temp_y_after_timelapse_gcode;
-        if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 1, temp_y_after_timelapse_gcode)) {
-            new_pos(1) = temp_y_after_timelapse_gcode;
-            position_changed = true;
-        }
-        
-        double temp_z_after_timelapse_gcode;
-        if (GCodeProcessor::get_last_pos_from_gcode(timelapse_gcode, 2, temp_z_after_timelapse_gcode)) {
-            new_pos(2) = temp_z_after_timelapse_gcode;
-            position_changed = true;
-        }
-        
-        if (position_changed) {
-            m_writer.set_position(new_pos);
+        std::string timepals_gcode = insert_timelapse_gcode();
+        gcode += timepals_gcode;
+        m_writer.set_current_position_clear(false);
+        //BBS: check whether custom gcode changes the z position. Update if changed
+        double temp_z_after_timepals_gcode;
+        if (GCodeProcessor::get_last_z_from_gcode(timepals_gcode, temp_z_after_timepals_gcode)) {
+            Vec3d pos = m_writer.get_position();
+            pos(2) = temp_z_after_timepals_gcode;
+            m_writer.set_position(pos);
         }
     }
 
@@ -6530,33 +6410,16 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z, bool b
 
         //BBS
         {
-            //BBS: gcode writer doesn't know fan speed after inserting tool change gcode
+            //BBS: gcode writer doesn't know where the extruder is and whether fan speed is changed after inserting tool change gcode
+            //Set this flag so that normal lift will be used the first time after tool change.
             gcode += ";_FORCE_RESUME_FAN_SPEED\n";
-
-            //BBS: check whether custom gcode changes the axis positions. Update if changed.
-            bool position_changed = false;
-            Vec3d new_pos = m_writer.get_position();
-            
-            double temp_x_after_toolchange_gcode;
-            if (GCodeProcessor::get_last_pos_from_gcode(toolchange_gcode_parsed, 0, temp_x_after_toolchange_gcode)) {
-                new_pos(0) = temp_x_after_toolchange_gcode;
-                position_changed = true;
-            }
-            
-            double temp_y_after_toolchange_gcode;
-            if (GCodeProcessor::get_last_pos_from_gcode(toolchange_gcode_parsed, 1, temp_y_after_toolchange_gcode)) {
-                new_pos(1) = temp_y_after_toolchange_gcode;
-                position_changed = true;
-            }
-            
-            double temp_z_after_toolchange_gcode;
-            if (GCodeProcessor::get_last_pos_from_gcode(toolchange_gcode_parsed, 2, temp_z_after_toolchange_gcode)) {
-                new_pos(2) = temp_z_after_toolchange_gcode;
-                position_changed = true;
-            }
-            
-            if (position_changed) {
-                m_writer.set_position(new_pos);
+            m_writer.set_current_position_clear(false);
+            //BBS: check whether custom gcode changes the z position. Update if changed
+            double temp_z_after_tool_change;
+            if (GCodeProcessor::get_last_z_from_gcode(toolchange_gcode_parsed, temp_z_after_tool_change)) {
+                Vec3d pos = m_writer.get_position();
+                pos(2) = temp_z_after_tool_change;
+                m_writer.set_position(pos);
             }
         }
     }
@@ -6804,4 +6667,4 @@ void GCode::ObjectByExtruder::Island::Region::append(const Type type, const Extr
 // a single object, or for possibly multiple objects with multiple instances.
 
 
-} /* slic3r_GCode_cpp_ */
+} // namespace Slic3r
diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp
index 28746c6e26c..757939637ed 100644
--- a/src/libslic3r/GCode/GCodeProcessor.cpp
+++ b/src/libslic3r/GCode/GCodeProcessor.cpp
@@ -2185,14 +2185,13 @@ int GCodeProcessor::get_gcode_last_filament(const std::string& gcode_str)
     return out_filament;
 }
 
-//BBS: get last position from gcode for specified axis
-//axis index is the same as Vec3d (X=0, Y=1, Z=2)
-bool GCodeProcessor::get_last_pos_from_gcode(const std::string& gcode_str, int axis, double& pos)
+//BBS: get last z position from gcode
+bool GCodeProcessor::get_last_z_from_gcode(const std::string& gcode_str, double& z)
 {
     int str_size = gcode_str.size();
     int start_index = 0;
     int end_index = 0;
-    bool is_axis_changed = false;
+    bool is_z_changed = false;
     while (end_index < str_size) {
         //find a full line
         if (gcode_str[end_index] != '\n') {
@@ -2212,32 +2211,24 @@ bool GCodeProcessor::get_last_pos_from_gcode(const std::string& gcode_str, int a
                                        || line_str.find("G2 ") == 0
                                        || line_str.find("G3 ") == 0))
             {
-                std::string axis_str;
-                if (axis == 0) {
-                    axis_str = "X";
-                } else if (axis == 1) {
-                    axis_str = "Y";
-                } else if (axis == 2) {
-                    axis_str = "Z";
-                }
-                auto axis_pos = line_str.find(" " + axis_str);
-                double temp_axis_pos = 0;
-                if (axis_pos != line_str.npos
-                    && axis_pos + 2 < line_str.size()) {
+                auto z_pos = line_str.find(" Z");
+                double temp_z = 0;
+                if (z_pos != line_str.npos
+                    && z_pos + 2 < line_str.size()) {
                     // Try to parse the numeric value.
-                    std::string axis_substr = line_str.substr(axis_pos + 2);
-                    char* start_ptr = &axis_substr[0];
-                    char* end_ptr = start_ptr + sizeof(axis_substr.c_str());
+                    std::string z_sub = line_str.substr(z_pos + 2);
+                    char* c = &z_sub[0];
+                    char* end = c + sizeof(z_sub.c_str());
 
                     auto is_end_of_word = [](char c) {
                         return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == 0 || c == ';';
                     };
 
-                    auto [parsed_ptr, error_code] = fast_float::from_chars(start_ptr, end_ptr, temp_axis_pos);
-                    if (parsed_ptr != start_ptr && is_end_of_word(*parsed_ptr)) {
+                    auto [pend, ec] = fast_float::from_chars(c, end, temp_z);
+                    if (pend != c && is_end_of_word(*pend)) {
                         // The axis value has been parsed correctly.
-                        pos = temp_axis_pos;
-                        is_axis_changed = true;
+                        z = temp_z;
+                        is_z_changed = true;
                     }
                 }
             }
@@ -2246,7 +2237,7 @@ bool GCodeProcessor::get_last_pos_from_gcode(const std::string& gcode_str, int a
         start_index = end_index + 1;
         end_index = start_index;
     }
-    return is_axis_changed;
+    return is_z_changed;
 }
 
 void GCodeProcessor::process_tags(const std::string_view comment, bool producers_enabled)
@@ -5410,4 +5401,4 @@ void GCodeProcessor::update_slice_warnings()
     m_result.warnings.shrink_to_fit();
 }
 
-} /* slic3r_GCodeProcessor_cpp_ */
+} /* namespace Slic3r */
diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp
index 937108edd31..21403cc2053 100644
--- a/src/libslic3r/GCode/GCodeProcessor.hpp
+++ b/src/libslic3r/GCode/GCodeProcessor.hpp
@@ -303,7 +303,7 @@ class Print;
         static bool contains_reserved_tags(const std::string& gcode, unsigned int max_count, std::vector<std::string>& found_tag);
 
         static int get_gcode_last_filament(const std::string &gcode_str);
-        static bool get_last_pos_from_gcode(const std::string& gcode_str, int axis, double& pos);
+        static bool get_last_z_from_gcode(const std::string& gcode_str, double& z);
 
         static const float Wipe_Width;
         static const float Wipe_Height;
@@ -984,3 +984,5 @@ class Print;
 } /* namespace Slic3r */
 
 #endif /* slic3r_GCodeProcessor_hpp_ */
+
+