diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 8891f41182..c092129fe1 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -99,7 +99,6 @@ static const std::string lift_gcode_after_printing_object = "{if toolchange_coun Vec2d travel_point_1; Vec2d travel_point_2; Vec2d travel_point_3; -static bool is_used_travel_avoid_perimeter = true; static std::vector get_path_of_change_filament(const Print& print) { // give safe value in case there is no start_end_points in config @@ -730,6 +729,8 @@ static std::vector get_path_of_change_filament(const Print& print) // Otherwise, leave control to the user completely. std::string change_filament_gcode = gcodegen.config().change_filament_gcode.value; + bool is_used_travel_avoid_perimeter = gcodegen.m_config.prime_tower_skip_points.value; + // add nozzle change gcode into change filament gcode std::string prefix_gcode = lift_gcode_after_printing_object; std::string nozzle_change_gcode_trans; @@ -6876,7 +6877,7 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo dyn_config.set_key_value("travel_point_2_y", new ConfigOptionFloat(float(travel_point_2.y()))); dyn_config.set_key_value("travel_point_3_x", new ConfigOptionFloat(float(travel_point_3.x()))); dyn_config.set_key_value("travel_point_3_y", new ConfigOptionFloat(float(travel_point_3.y()))); - dyn_config.set_key_value("wipe_avoid_perimeter", new ConfigOptionBool(is_used_travel_avoid_perimeter)); + dyn_config.set_key_value("wipe_avoid_perimeter", new ConfigOptionBool(false)); dyn_config.set_key_value("wipe_avoid_pos_x", new ConfigOptionFloat(wipe_avoid_pos_x)); dyn_config.set_key_value("flush_length", new ConfigOptionFloat(wipe_length)); diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index ffe17a8f96..1759f64fac 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -16,7 +16,6 @@ namespace Slic3r { static const double wipe_tower_wall_infill_overlap = 0.0; static const double wipe_tower_wall_infill_overlap_new = -0.2; -static bool is_used_gap_wall = true; inline float align_round(float value, float base) { return std::round(value / base) * base; @@ -679,7 +678,8 @@ WipeTower::WipeTower(const PrintConfig& config, int plate_idx, Vec3d plate_origi m_enable_timelapse_print(config.timelapse_type.value == TimelapseType::tlSmooth), m_nozzle_change_length(config.extruder_change_length.get_at(0)), m_is_multi_extruder(config.nozzle_diameter.size() > 1), - m_is_print_outer_first(config.prime_tower_outer_first.value) + m_is_print_outer_first(config.prime_tower_outer_first.value), + m_use_gap_wall(config.prime_tower_skip_points.value) { // Read absolute value of first layer speed, if given as percentage, // it is taken over following default. Speeds from config are not @@ -807,7 +807,7 @@ Vec2f WipeTower::get_next_pos(const WipeTower::box_coordinates &cleaning_box, fl Vec2f res; int index = m_cur_layer_id % 4; - Vec2f offset = is_used_gap_wall ? Vec2f(5 * m_perimeter_width, 0) : Vec2f{0, 0}; + Vec2f offset = m_use_gap_wall ? Vec2f(5 * m_perimeter_width, 0) : Vec2f{0, 0}; switch (index % 4) { case 0: res = offset +cleaning_box.ld + pos_offset; @@ -2242,7 +2242,7 @@ WipeTower::ToolChangeResult WipeTower::finish_layer_new(bool extrude_perimeter, box_coordinates wt_box(Vec2f(0.f, 0.f), m_wipe_tower_width, wipe_tower_depth); wt_box = align_perimeter(wt_box); if (extrude_perimeter) { - if (is_used_gap_wall) + if (m_use_gap_wall) generate_support_wall(writer, wt_box, feedrate, first_layer); else writer.rectangle(wt_box, feedrate); @@ -2518,7 +2518,7 @@ void WipeTower::toolchange_wipe_new(WipeTowerWriter &writer, const box_coordinat } float ironing_length = 3.; - if (i == 0 && is_used_gap_wall) { // BBS: add ironing after extruding start + if (i == 0 && m_use_gap_wall) { // BBS: add ironing after extruding start if (m_left_to_right) { float dx = xr + wipe_tower_wall_infill_overlap_new * m_perimeter_width - writer.pos().x(); if (abs(dx) < ironing_length) ironing_length = abs(dx); @@ -3207,7 +3207,7 @@ WipeTower::ToolChangeResult WipeTower::only_generate_out_wall(bool is_new_mode) wipe_tower_depth = m_wipe_tower_width; box_coordinates wt_box(Vec2f(0.f, (m_current_shape == SHAPE_REVERSED ? m_layer_info->toolchanges_depth() : 0.f)), m_wipe_tower_width, wipe_tower_depth); wt_box = align_perimeter(wt_box); - if (is_used_gap_wall) + if (m_use_gap_wall) generate_support_wall(writer, wt_box, feedrate, first_layer); else writer.rectangle(wt_box, feedrate); diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 2bc67f1ab5..9604a27dad 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -393,6 +393,7 @@ private: bool m_has_tpu_filament{false}; bool m_is_multi_extruder{false}; bool m_is_print_outer_first{false}; + bool m_use_gap_wall{false}; // G-code generator parameters. float m_cooling_tube_retraction = 0.f; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 4204a596f5..441a401393 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -815,7 +815,7 @@ static std::vector s_Preset_print_options { "skin_infill_line_width","skeleton_infill_line_width", "top_surface_line_width", "support_line_width", "infill_wall_overlap","top_bottom_infill_wall_overlap", "bridge_flow", "internal_bridge_flow", "elefant_foot_compensation", "elefant_foot_compensation_layers", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower", - "prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first", "prime_volume", + "prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first", "prime_tower_skip_points", "prime_volume", "wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits", "flush_into_infill", "flush_into_objects", "flush_into_support", "tree_support_branch_angle", "tree_support_angle_slow", "tree_support_wall_count", "tree_support_top_rate", "tree_support_branch_distance", "tree_support_tip_diameter", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 310f28ba4c..458d919a65 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -298,6 +298,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "prime_tower_width" || opt_key == "prime_tower_brim_width" || opt_key == "prime_tower_outer_first" + || opt_key == "prime_tower_skip_points" || opt_key == "first_layer_print_sequence" || opt_key == "other_layers_print_sequence" || opt_key == "other_layers_print_sequence_nums" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 91735d0924..0b24c1c1f0 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -6024,6 +6024,12 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("prime_tower_skip_points", coBool); + def->label = L("Skip points"); + def->tooltip = L("The wall of prime tower will skip the start points of wipe path"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("flush_into_infill", coBool); def->category = L("Flush options"); def->label = L("Flush into objects' infill"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index cc3f04be15..299893db4c 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1444,6 +1444,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, wipe_tower_rotation_angle)) ((ConfigOptionFloat, prime_tower_brim_width)) ((ConfigOptionBool, prime_tower_outer_first)) + ((ConfigOptionBool, prime_tower_skip_points)) ((ConfigOptionFloat, wipe_tower_bridging)) ((ConfigOptionPercent, wipe_tower_extra_flow)) ((ConfigOptionFloats, flush_volumes_matrix)) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index e92ac0d022..4913e78198 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -758,7 +758,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co toggle_line("preheat_steps", have_ooze_prevention && (preheat_steps > 0)); bool have_prime_tower = config->opt_bool("enable_prime_tower"); - for (auto el : {"prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first"}) + for (auto el : {"prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first", "prime_tower_skip_points"}) toggle_line(el, have_prime_tower); for (auto el : {"wall_filament", "sparse_infill_filament", "solid_infill_filament", "wipe_tower_filament"}) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index fcc38c2de7..6296dcb375 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3631,7 +3631,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", "nozzle_height", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "brim_width", "brim_object_gap", "brim_type", "nozzle_diameter", "single_extruder_multi_material", "preferred_orientation", - "enable_prime_tower", "wipe_tower_x", "wipe_tower_y", "prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first", "prime_volume", + "enable_prime_tower", "wipe_tower_x", "wipe_tower_y", "prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first", "prime_tower_skip_points", "prime_volume", "extruder_colour", "filament_colour", "material_colour", "printable_height", "extruder_printable_height", "printer_model", "printer_technology", // These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor. "layer_height", "initial_layer_print_height", "min_layer_height", "max_layer_height", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index da15c66888..1cf4092a92 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2442,6 +2442,7 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Prime tower"), L"param_tower"); optgroup->append_single_option_line("enable_prime_tower", "multimaterial_settings_prime_tower"); optgroup->append_single_option_line("prime_tower_outer_first", "parameter/prime-tower"); + optgroup->append_single_option_line("prime_tower_skip_points", "parameter/prime-tower"); optgroup->append_single_option_line("prime_tower_width", "multimaterial_settings_prime_tower#width"); optgroup->append_single_option_line("prime_volume", "multimaterial_settings_prime_tower"); optgroup->append_single_option_line("prime_tower_brim_width", "multimaterial_settings_prime_tower#brim-width");