From 83346aaffa4e993b3d7fff2e9a88fa250a0b35b0 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Sun, 18 Aug 2024 12:54:33 +0300 Subject: [PATCH] Configure skirt start point --- src/libslic3r/GCode.cpp | 32 +++++++++++++++++++++++++++ src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 1 + src/libslic3r/PrintConfig.cpp | 9 ++++++++ src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/ConfigManipulation.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 10 ++++++++- 8 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 0fa6bbcbba..4e01dd7bd6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3425,6 +3425,33 @@ namespace Skirt { return skirt_loops_per_extruder_out; } + static Point find_start_point(ExtrusionLoop& loop, float start_angle) { + coord_t min_x = std::numeric_limits::max(); + coord_t max_x = std::numeric_limits::min(); + coord_t min_y = min_x; + coord_t max_y = max_x; + + Points pts; + loop.collect_points(pts); + for (Point pt: pts) { + if (pt.x() < min_x) + min_x = pt.x(); + else if (pt.x() > max_x) + max_x = pt.x(); + if (pt.y() < min_y) + min_y = pt.y(); + else if (pt.y() > max_y) + max_y = pt.y(); + } + + Point center((min_x + max_x)/2., (min_y + max_y)/2.); + double r = center.distance_to(Point(min_x, min_y)); + double deg = start_angle * PI / 180; + double shift_x = r * std::cos(deg); + double shift_y = r * std::sin(deg); + return Point(center.x()+shift_x, center.y() + shift_y); + } + } // namespace Skirt // Orca: Klipper can't parse object names with spaces and other spetical characters @@ -3995,6 +4022,11 @@ LayerResult GCode::process_layer( path.height = layer_skirt_flow.height(); path.mm3_per_mm = mm3_per_mm; } + + //set skirt start point location + if (first_layer && i==loops.first) + this->set_last_pos(Skirt::find_start_point(loop, layer.object()->config().skirt_start_angle)); + //FIXME using the support_speed of the 1st object printed. gcode += this->extrude_loop(loop, "skirt", m_config.support_speed.value); } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index cbab85b88a..947c0c3288 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -774,7 +774,7 @@ static std::vector s_Preset_print_options { "inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", "top_surface_speed", "support_speed", "support_object_xy_distance", "support_interface_speed", "bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", - "outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_height", "draft_shield", + "outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height", "draft_shield", "brim_width", "brim_object_gap", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "enforce_support_layers", "raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion", "support_base_pattern", "support_base_pattern_spacing", "support_expansion", "support_style", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index bfc70d4063..62a4001c7e 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -225,6 +225,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "min_skirt_length" || opt_key == "draft_shield" || opt_key == "skirt_distance" + || opt_key == "skirt_start_angle" || opt_key == "ooze_prevention" || opt_key == "wipe_tower_x" || opt_key == "wipe_tower_y" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d7dcc1ecda..a152e7ac55 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3992,6 +3992,15 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(2)); + def = this->add("skirt_start_angle", coFloat); + def->label = L("Skirt start point"); + def->tooltip = L("Angle from the object center to skirt start point. Zero is the most right position, counter clockwise is positive angle."); + def->sidetext = L("°"); + def->min = -180; + def->max = 180; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(-135)); + def = this->add("skirt_height", coInt); def->label = L("Skirt height"); //def->label = "Skirt height"; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 4944c2d17a..d601c13f47 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1220,6 +1220,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloats, retraction_minimum_travel)) ((ConfigOptionBools, retract_when_changing_layer)) ((ConfigOptionFloat, skirt_distance)) + ((ConfigOptionFloat, skirt_start_angle)) ((ConfigOptionInt, skirt_height)) ((ConfigOptionInt, skirt_loops)) ((ConfigOptionFloat, skirt_speed)) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 02c82e06bb..c79810f34a 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -569,7 +569,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co bool have_skirt = config->opt_int("skirt_loops") > 0; toggle_field("skirt_height", have_skirt && config->opt_enum("draft_shield") != dsEnabled); - for (auto el : { "skirt_distance", "draft_shield"}) + for (auto el : { "skirt_distance", "skirt_start_angle", "draft_shield"}) toggle_field(el, have_skirt); bool have_brim = (config->opt_enum("brim_type") != btNoBrim); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7950f9a669..4d2ebb95fa 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2770,7 +2770,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({ "printable_area", "bed_exclude_area", "bed_custom_texture", "bed_custom_model", "print_sequence", "extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", - "nozzle_height", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", + "nozzle_height", "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_volume", "extruder_colour", "filament_colour", "material_colour", "printable_height", "printer_model", "printer_technology", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index f529b09c13..bb23a435a2 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -61,7 +61,7 @@ namespace GUI { #define DISABLE_UNDO_SYS -static const std::vector plate_keys = { "curr_bed_type", "first_layer_print_sequence", "first_layer_sequence_choice", "other_layers_print_sequence", "other_layers_sequence_choice", "print_sequence", "spiral_mode"}; +static const std::vector plate_keys = { "curr_bed_type", "skirt_start_angle", "first_layer_print_sequence", "first_layer_sequence_choice", "other_layers_print_sequence", "other_layers_sequence_choice", "print_sequence", "spiral_mode"}; void Tab::Highlighter::set_timer_owner(wxEvtHandler* owner, int timerid/* = wxID_ANY*/) { @@ -2321,6 +2321,7 @@ page = add_options_page(L("Others"), "custom-gcode_other"); // ORCA: icon only v optgroup->append_single_option_line("skirt_loops"); optgroup->append_single_option_line("min_skirt_length"); optgroup->append_single_option_line("skirt_distance"); + optgroup->append_single_option_line("skirt_start_angle"); optgroup->append_single_option_line("skirt_height"); optgroup->append_single_option_line("skirt_speed"); optgroup->append_single_option_line("draft_shield"); @@ -2789,6 +2790,7 @@ void TabPrintPlate::build() auto page = add_options_page(L("Plate Settings"), "empty"); auto optgroup = page->new_optgroup(""); optgroup->append_single_option_line("curr_bed_type"); + optgroup->append_single_option_line("skirt_start_angle"); optgroup->append_single_option_line("print_sequence"); optgroup->append_single_option_line("spiral_mode"); optgroup->append_single_option_line("first_layer_sequence_choice"); @@ -2837,6 +2839,8 @@ void TabPrintPlate::on_value_change(const std::string& opt_key, const boost::any auto plate = dynamic_cast(plate_item.first); if (k == "curr_bed_type") plate->reset_bed_type(); + if (k == "skirt_start_angle") + plate->config()->erase("skirt_start_angle"); if (k == "print_sequence") plate->set_print_seq(PrintSequence::ByDefault); if (k == "first_layer_sequence_choice") @@ -2860,6 +2864,10 @@ void TabPrintPlate::on_value_change(const std::string& opt_key, const boost::any bed_type = m_config->opt_enum("curr_bed_type"); plate->set_bed_type(BedType(bed_type)); } + if (k == "skirt_start_angle") { + float angle = m_config->opt_float("skirt_start_angle"); + plate->config()->set_key_value("skirt_start_angle", new ConfigOptionFloat(angle)); + } if (k == "print_sequence") { print_seq = m_config->opt_enum("print_sequence"); plate->set_print_seq(print_seq);