diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ea4abd9aa..b34be89f9 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -295,7 +295,9 @@ static std::vector get_path_of_change_filament(const Print& print) /* Reduce feedrate a bit; travel speed is often too high to move on existing material. Too fast = ripping of existing material; too slow = short wipe path, thus more blob. */ //OrcaSlicer - double wipe_speed = gcodegen.writer().config.travel_speed.value * gcodegen.config().wipe_speed.value / 100; + double wipe_speed = gcodegen.config().role_base_wipe_speed ? gcodegen.writer().get_current_speed() / 60 : + gcodegen.writer().config.travel_speed.value * gcodegen.config().wipe_speed.value / 100; + // get the retraction length double length = toolchange @@ -4062,6 +4064,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou //BBS: avoid overhang on conditional scarf mode bool slope_has_overhang = false; + // update scarf seam if (enable_seam_slope) { // Create seam slope double start_slope_ratio; @@ -4090,7 +4093,8 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou ExtrusionLoopSloped new_loop(paths, seam_gap, slope_min_length, slope_max_segment_length, start_slope_ratio, loop.loop_role()); //BBS: clip end and start to get better seam - new_loop.clip_slope(seam_gap); + const double slope_gap = m_config.seam_slope_gap.get_abs_value(scale_(EXTRUDER_CONFIG(nozzle_diameter))); + new_loop.clip_slope(slope_gap); // BBS: slowdown speed to improve seam, to be fix, cooling need to be apply correctly //new_loop.target_speed = get_path_speed(new_loop.starts.back()); //new_loop.slowdown_slope_speed(); @@ -4101,6 +4105,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou for (const auto &p : new_loop.get_all_paths()) { gcode += this->_extrude(*p, description, speed_for_path(*p)); } + set_last_scarf_seam_flag(true); // Fix path for wipe if (!new_loop.ends.empty()) { @@ -4125,6 +4130,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou for (ExtrusionPaths::iterator path = paths.begin(); path != paths.end(); ++path) { gcode += this->_extrude(*path, description, speed_for_path(*path)); } + set_last_scarf_seam_flag(false); } //BBS: don't reset acceleration when printing first layer. During first layer, acceleration is always same value. @@ -5085,7 +5091,7 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string // generate G-code for the travel move std::string gcode; if (needs_retraction) { - if (m_config.reduce_crossing_wall && could_be_wipe_disabled) + if (m_config.reduce_crossing_wall && could_be_wipe_disabled && !m_last_scarf_seam_flag) m_wipe.reset_path(); Point last_post_before_retract = this->last_pos(); diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 6a19117bd..f3096a74b 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -151,6 +151,7 @@ public: m_layer(nullptr), m_object_layer_over_raft(false), //m_volumetric_speed(0), + m_last_scarf_seam_flag(false), m_last_pos_defined(false), m_last_extrusion_role(erNone), m_last_width(0.0f), @@ -179,6 +180,7 @@ public: void set_origin(const Vec2d &pointf); void set_origin(const coordf_t x, const coordf_t y) { this->set_origin(Vec2d(x, y)); } const Point& last_pos() const { return m_last_pos; } + const bool& last_scarf_seam_flag() const { return m_last_scarf_seam_flag; } Vec2d point_to_gcode(const Point &point) const; Point gcode_to_point(const Vec2d &point) const; const FullPrintConfig &config() const { return m_config; } @@ -332,6 +334,7 @@ private: void check_placeholder_parser_failed(); void set_last_pos(const Point &pos) { m_last_pos = pos; m_last_pos_defined = true; } + void set_last_scarf_seam_flag(bool flag) { m_last_scarf_seam_flag = flag; } bool last_pos_defined() const { return m_last_pos_defined; } void set_extruders(const std::vector &extruder_ids); std::string preamble(); @@ -476,7 +479,7 @@ private: Point m_last_pos; bool m_last_pos_defined; - + bool m_last_scarf_seam_flag; std::unique_ptr m_cooling_buffer; std::unique_ptr m_spiral_vase; #ifdef HAS_PRESSURE_EQUALIZER diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 3dcb2f0aa..f5489e521 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -315,11 +315,11 @@ std::string GCodeWriter::toolchange(unsigned int extruder_id) return gcode.str(); } -std::string GCodeWriter::set_speed(double F, const std::string &comment, const std::string &cooling_marker) const +std::string GCodeWriter::set_speed(double F, const std::string &comment, const std::string &cooling_marker) { assert(F > 0.); assert(F < 100000.); - + m_current_speed = F; GCodeG1Formatter w; w.emit_f(F); //BBS diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 26dd20c9f..bb8ddb001 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -65,7 +65,8 @@ public: // printed with the same extruder. std::string toolchange_prefix() const; std::string toolchange(unsigned int extruder_id); - std::string set_speed(double F, const std::string &comment = std::string(), const std::string &cooling_marker = std::string()) const; + std::string set_speed(double F, const std::string &comment = std::string(), const std::string &cooling_marker = std::string()); + double get_current_speed() { return m_current_speed; }; std::string travel_to_xy(const Vec2d &point, const std::string &comment = std::string()); std::string travel_to_xyz(const Vec3d &point, const std::string &comment = std::string()); std::string travel_to_z(double z, const std::string &comment = std::string()); @@ -138,7 +139,7 @@ private: //BBS: x, y offset for gcode generated double m_x_offset{ 0 }; double m_y_offset{ 0 }; - + double m_current_speed{ 0 }; std::string m_gcode_label_objects_start; std::string m_gcode_label_objects_end; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 07a981ea1..f48b2d719 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -847,7 +847,7 @@ static std::vector s_Preset_print_options { "print_flow_ratio", //Orca "exclude_object", "seam_slope_type", "seam_slope_conditional", "scarf_angle_threshold", "seam_slope_start_height", "seam_slope_entire_loop", "seam_slope_min_length", - "seam_slope_steps", "seam_slope_inner_walls"}; + "seam_slope_steps", "seam_slope_inner_walls", "role_base_wipe_speed", "seam_slope_gap"}; static std::vector s_Preset_filament_options { /*"filament_colour", */ "default_filament_colour","required_nozzle_HRC","filament_diameter", "filament_type", "filament_soluble", "filament_is_support", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 98fa6a162..a7d08165d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2906,6 +2906,14 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloatOrPercent(50, true)); + def = this->add("seam_slope_gap", coFloatOrPercent); + def->label = L("Slop gap"); + def->tooltip = L("In order to reduce the visibility of the seam in a closed loop extrusion, the loop is interrupted and shortened by a specified amount.\n" "This amount as a percentage of the current extruder diameter. The default value for this parameter is 15"); + def->sidetext = L("mm or %"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloatOrPercent(15, true)); + def = this->add("seam_slope_entire_loop", coBool); def->label = L("Scarf around entire wall"); def->tooltip = L("The scarf extends to the entire length of the wall."); @@ -2941,6 +2949,12 @@ void PrintConfigDef::init_fff_params() def->mode = comDevelop; def->set_default_value(new ConfigOptionPercent(80)); + def = this->add("role_base_wipe_speed", coBool); + def->label = L("Role base wipe speed"); + def->tooltip = L("The wipe speed is determined by speed of current extrusion role. " "e.g if a wip action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for the wipe action."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("skirt_distance", coFloat); def->label = L("Skirt distance"); def->tooltip = L("Distance from skirt to brim or object"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 872cd83be..1248fc89f 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -766,6 +766,7 @@ PRINT_CONFIG_CLASS_DEFINE( // OrcaSlicer ((ConfigOptionPercent, seam_gap)) ((ConfigOptionPercent, wipe_speed)) + ((ConfigOptionBool, role_base_wipe_speed)) ((ConfigOptionBool, precise_z_height)) // BBS ) @@ -845,6 +846,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, seam_slope_conditional)) ((ConfigOptionInt, scarf_angle_threshold)) ((ConfigOptionFloatOrPercent, seam_slope_start_height)) + ((ConfigOptionFloatOrPercent, seam_slope_gap)) ((ConfigOptionBool, seam_slope_entire_loop)) ((ConfigOptionFloat, seam_slope_min_length)) ((ConfigOptionInt, seam_slope_steps)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 88df3a477..b7cb6f421 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -899,12 +899,14 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "seam_slope_conditional" || opt_key == "scarf_angle_threshold" || opt_key == "seam_slope_start_height" + || opt_key == "seam_slope_gap" || opt_key == "seam_slope_entire_loop" || opt_key == "seam_slope_min_length" || opt_key == "seam_slope_steps" || opt_key == "seam_slope_inner_walls" || opt_key == "seam_gap" || opt_key == "wipe_speed" + || opt_key == "role_base_wipe_speed" || opt_key == "support_speed" || opt_key == "support_interface_speed" || opt_key == "smooth_speed_discontinuity_area" diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index bed402518..7095c5153 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -745,6 +745,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co toggle_line("seam_slope_conditional", has_seam_slope); toggle_line("scarf_angle_threshold", has_seam_slope && config->opt_bool("seam_slope_conditional")); toggle_line("seam_slope_start_height", has_seam_slope); + toggle_line("seam_slope_gap", has_seam_slope); toggle_line("seam_slope_entire_loop", has_seam_slope); toggle_line("seam_slope_min_length", has_seam_slope); toggle_line("seam_slope_steps", has_seam_slope); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 25a794263..fad1f9547 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1944,11 +1944,13 @@ void TabPrint::build() optgroup->append_single_option_line("seam_slope_conditional"); optgroup->append_single_option_line("scarf_angle_threshold"); optgroup->append_single_option_line("seam_slope_start_height"); + optgroup->append_single_option_line("seam_slope_gap"); optgroup->append_single_option_line("seam_slope_entire_loop"); optgroup->append_single_option_line("seam_slope_min_length"); optgroup->append_single_option_line("seam_slope_steps"); optgroup->append_single_option_line("seam_slope_inner_walls"); optgroup->append_single_option_line("wipe_speed", "Seam"); + optgroup->append_single_option_line("role_base_wipe_speed", "Seam"); optgroup = page->new_optgroup(L("Precision"), L"param_precision"); optgroup->append_single_option_line("slice_closing_radius");