From eff10cfb4d1c210a3e17f32ec199ec098678274a Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 12 Jun 2024 14:00:58 +0200 Subject: [PATCH 1/7] Allow the infill to rotate alongside the object's z rotation. supermerill/superslicer#4304 --- resources/ui_layout/default/print.ui | 1 + src/libslic3r/Fill/Fill.cpp | 6 ++++++ src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 8 ++++++++ src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 2 +- src/slic3r/GUI/ConfigManipulation.cpp | 2 +- 7 files changed, 19 insertions(+), 2 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 039c1ddf88b..5b2c170b038 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -214,6 +214,7 @@ group:sidetext_width$5:Infill angle line:Modifiers setting:label_width$6:width$5:label$increment:fill_angle_increment setting:width$5:fill_angle_cross + setting:width$5:fill_angle_follow_model vector_line:fill_angle_template # setting:fill_angle_template group:sidetext_width$5:Advanced diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 99f5d1ec925..bd9fd9e84aa 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -542,6 +542,12 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: f->can_angle_cross = surface_fill.params.can_angle_cross; f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree; + // add object angle if needed + double z_object_angle = this->m_object->trafo().rotation().eulerAngles(0,1,2).z(); + if (this->object()->config().fill_angle_follow_model.value) { + f->angle += z_object_angle; + } + if (surface_fill.params.pattern == ipLightning) dynamic_cast(f.get())->generator = lightning_generator; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 78750f24bfc..6c7d9a6c86d 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -517,6 +517,7 @@ static std::vector s_Preset_print_options { "fill_aligned_z", "fill_angle", "fill_angle_cross", + "fill_angle_follow_model", "fill_angle_increment", "fill_angle_template", "bridge_angle", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a9444b68fab..d4d890f1818 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2336,6 +2336,13 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("fill_angle_follow_model", coBool); + def->label = L("Rotate with object"); + def->category = OptionCategory::infill; + def->tooltip = L("If your object has a z-rotation, then the infill will also be rotated by this value."); + def->mode = comAdvancedE | comSuSi; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("fill_angle_increment", coFloat); def->label = L("Fill"); def->full_label = L("Fill angle increment"); @@ -8295,6 +8302,7 @@ std::unordered_set prusa_export_to_remove_keys = { "fill_aligned_z", "fill_angle_increment", "fill_angle_cross", +"fill_angle_follow_model", "fill_angle_template", "fill_smooth_distribution", "fill_smooth_width", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index f2eba2b63db..4d43a29c97e 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -723,6 +723,7 @@ PRINT_CONFIG_CLASS_DEFINE( //((ConfigOptionBool, exact_last_layer_height)) ((ConfigOptionFloatOrPercent, extrusion_width)) ((ConfigOptionFloatOrPercent, extrusion_spacing)) + ((ConfigOptionBool, fill_angle_follow_model)) ((ConfigOptionFloatOrPercent, first_layer_acceleration_over_raft)) ((ConfigOptionFloatOrPercent, first_layer_height)) ((ConfigOptionFloatOrPercent, first_layer_extrusion_width)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index aa2a7be1fdb..18972f0dd90 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -463,7 +463,6 @@ namespace Slic3r { { // prerequisites this->prepare_infill(); - m_print->set_status(35, L("Infilling layers")); m_print->set_status(0, L("Infilling layer %s / %s"), { std::to_string(0), std::to_string(m_layers.size()) }, PrintBase::SlicingStatus::SECONDARY_STATE); if (this->set_started(posInfill)) { @@ -882,6 +881,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "fill_aligned_z" || opt_key == "fill_angle" || opt_key == "fill_angle_cross" + || opt_key == "fill_angle_follow_model" || opt_key == "fill_angle_increment" || opt_key == "fill_angle_template" || opt_key == "fill_top_flow_ratio" diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index cd9ee58b3f5..b5a95645540 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -428,7 +428,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("infill_first", (has_solid_infill || have_infill)); - for (auto el : {"fill_angle_cross","fill_angle_increment", "fill_angle_template", "fill_angle_cross", "bridge_angle", "infill_extrusion_width", + for (auto el : {"fill_angle_cross","fill_angle_follow_model","fill_angle_increment", "fill_angle_template", "bridge_angle", "infill_extrusion_width", "infill_extrusion_spacing", "infill_extrusion_change_odd_layers", "infill_speed" }) toggle_field(el, have_infill || has_solid_infill); From 7cccb98b851aef43ec12994521eed435c1da94e3 Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 12 Jun 2024 18:02:10 +0200 Subject: [PATCH 2/7] Add fill_angle to quick infill modifier supermerill/superslicer#4304 --- src/slic3r/GUI/GUI_Factories.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 096e0bee1db..1c944dc7785 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -52,7 +52,7 @@ static bool is_improper_category(const Slic3r::OptionCategory& category, const i static SettingsFactory::Bundle FREQ_SETTINGS_BUNDLE_FFF = { { OptionCategory::perimeter , { "layer_height" , "perimeters", "top_solid_layers", "bottom_solid_layers" } }, - { OptionCategory::infill , { "fill_density", "fill_pattern" } }, + { OptionCategory::infill , { "fill_density", "fill_pattern", "fill_angle" } }, { OptionCategory::support , { "support_material", "support_material_auto", "support_material_threshold", "support_material_pattern", "support_material_interface_pattern", "support_material_buildplate_only", "support_material_spacing" } }, From 3ede2204d730c4257f612de1f9b7655ea475297d Mon Sep 17 00:00:00 2001 From: supermerill Date: Thu, 13 Jun 2024 13:56:17 +0200 Subject: [PATCH 3/7] little fixes --- resources/ui_layout/default/print.ui | 2 +- src/libslic3r/GCode.cpp | 2 ++ src/libslic3r/PrintConfig.cpp | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/ui_layout/default/print.ui b/resources/ui_layout/default/print.ui index 5b2c170b038..ea3a565f88d 100644 --- a/resources/ui_layout/default/print.ui +++ b/resources/ui_layout/default/print.ui @@ -219,7 +219,7 @@ group:sidetext_width$5:Infill angle # setting:fill_angle_template group:sidetext_width$5:Advanced setting:solid_infill_every_layers - line:Solid infill is area below + line:Solid infill if area below setting:label$From region:solid_infill_below_area setting:label$From the whole layer:solid_infill_below_layer_area end_line diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 332eece4fb3..4021a09b442 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3073,7 +3073,9 @@ LayerResult GCode::process_layer( assert(l.layer() == nullptr || layer_id == l.layer()->id()); } assert(layer_id < layer_count()); + assert(object_layer != nullptr || support_layer != nullptr); const Layer &layer = (object_layer != nullptr) ? *object_layer : *support_layer; + assert(layer_id == layer.id()); LayerResult result { {}, layer.id(), false, last_layer, false}; if (layer_tools.extruders.empty()) // Nothing to extrude. diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d4d890f1818..0001c6f5c19 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -8431,7 +8431,6 @@ std::unordered_set prusa_export_to_remove_keys = { "solid_infill_overlap", "start_gcode_manual", "solid_infill_below_layer_area", -"solid_infill_below_thickness", "solid_infill_below_width", "support_material_angle_height", "support_material_acceleration", From a7c4eca5c7bc783877add7a3bba2777788897662 Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 12 Jun 2024 16:38:15 +0200 Subject: [PATCH 4/7] new hidden setting: object_gcode allow to write some gcode each layer, when an object began to print. Useful for calibrations. --- src/libslic3r/Fill/Fill.cpp | 2 +- src/libslic3r/GCode.cpp | 24 ++++++++++++++++++++++-- src/libslic3r/Preset.cpp | 3 ++- src/libslic3r/PrintConfig.cpp | 15 ++++++++++++++- src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 1 + 6 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index bd9fd9e84aa..c6501214cb5 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -57,6 +57,7 @@ struct SurfaceFillParams : FillParams RETURN_COMPARE_NON_EQUAL(can_angle_cross); RETURN_COMPARE_NON_EQUAL(density); RETURN_COMPARE_NON_EQUAL(monotonic); + RETURN_COMPARE_NON_EQUAL(max_sparse_infill_spacing); RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, connection); RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust); @@ -79,7 +80,6 @@ struct SurfaceFillParams : FillParams RETURN_COMPARE_NON_EQUAL(config->bridge_speed_internal); RETURN_COMPARE_NON_EQUAL(config->gap_fill_speed); RETURN_COMPARE_NON_EQUAL(config->print_extrusion_multiplier); - RETURN_COMPARE_NON_EQUAL(max_sparse_infill_spacing); } if (config == nullptr || rhs.config == nullptr || max_sparse_infill_spacing == 0) RETURN_COMPARE_NON_EQUAL(flow.width()); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 4021a09b442..1757e577e85 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -919,6 +919,16 @@ namespace DoExport { break; } } + if (ret.size() < MAX_TAGS_COUNT) { + std::set per_object_gcodes; + for (const PrintObject *obj : print.objects()) + per_object_gcodes.insert(obj->config().object_gcode.value); + for (const std::string &gcode : per_object_gcodes) { + check(_(L("Per object G-code")), gcode); + if (ret.size() == MAX_TAGS_COUNT) + break; + } + } return ret; } @@ -1628,6 +1638,7 @@ void GCode::_do_export(Print& print_mod, GCodeOutputStream &file, ThumbnailsGene file.write("M486 T" + std::to_string(nb_items) + "\n"); } if (this->config().gcode_label_objects) { + file.write("; Total objects to print: " + std::to_string(nb_items) + "\n"); file.write_format( "; plater:{\"center\":[%f,%f,%f],\"boundingbox_center\":[%f,%f,%f],\"boundingbox_size\":[%f,%f,%f]}\n", global_bounding_box.center().x(), global_bounding_box.center().y(), 0., global_bounding_box.center().x(), global_bounding_box.center().y(), global_bounding_box.center().z(), @@ -3534,8 +3545,9 @@ LayerResult GCode::process_layer( if (m_config.avoid_crossing_perimeters) m_avoid_crossing_perimeters.init_layer(*m_layer); //print object label to help the printer firmware know where it is (for removing the objects) + m_gcode_label_objects_start = ""; if (this->config().gcode_label_objects) { - m_gcode_label_objects_start = + m_gcode_label_objects_start += std::string("; printing object ") + instance_to_print.print_object.model_object()->name + " id:" + instance_id + " copy " + instance_copy + @@ -3568,6 +3580,14 @@ LayerResult GCode::process_layer( "\n"; } } + if (!instance_to_print.print_object.config().object_gcode.value.empty()) { + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); + m_gcode_label_objects_start += this->placeholder_parser_process("object_gcode", + instance_to_print.print_object.config().object_gcode.value, m_writer.tool()->id(), &config) + + "\n"; + } // ask for a bigger lift for travel to object when moving to another object if (single_object_instance_idx == size_t(-1) && !first_object) set_extra_lift(m_last_layer_z, layer.id(), print.config(), m_writer, extruder_id); @@ -3648,7 +3668,7 @@ LayerResult GCode::process_layer( } } // Don't set m_gcode_label_objects_end if you don't had to write the m_gcode_label_objects_start. - if (m_gcode_label_objects_start != "") { + if (!m_gcode_label_objects_start.empty()) { m_gcode_label_objects_start = ""; } else if (this->config().gcode_label_objects) { m_gcode_label_objects_end = std::string("; stop printing object ") + instance_to_print.print_object.model_object()->name diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 6c7d9a6c86d..483a371b5bd 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -641,7 +641,8 @@ static std::vector s_Preset_print_options { "extruder_clearance_height", "gcode_comments", "gcode_label_objects", "output_filename_format", "post_process", "perimeter_extruder", "gcode_substitutions", "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", - "ooze_prevention", "standby_temperature_delta", "interface_shells", + "ooze_prevention", "standby_temperature_delta", "interface_shells", + "object_gcode", // width & spacing "extrusion_spacing", "extrusion_width", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 0001c6f5c19..99158214b40 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2791,7 +2791,7 @@ void PrintConfigDef::init_fff_params() def = this->add("gap_fill_flow_match_perimeter", coPercent); def->label = L("Cap with perimeter flow"); def->full_label = L("Gapfill: cap speed with perimeter flow"); - def->category = OptionCategory::output; + def->category = OptionCategory::speed; def->tooltip = L("A percentage of the perimeter flow (mm3/s) is used as a limit for the gap fill flow, and so the gapfill may reduce its speed when the gap fill extrusions became too thick." " This allow you to use a high gapfill speed, to print the thin gapfill quickly and reduce the difference in flow rate for the gapfill." "\nSet zero to deactivate."); @@ -3930,6 +3930,18 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->set_default_value(new ConfigOptionString{ "" }); + def = this->add("object_gcode", coString); + def->label = L("Per object G-code"); + def->category = OptionCategory::advanced; + def->tooltip = L("This code is inserted each layer, when the object began to print (just after the label if any)." + " It's main advantage is when you use it as a object modifer (right click on a model)." + "\nSpecial variables: 'layer_num','layer_z'"); + def->multiline = true; + def->full_width = true; + def->height = 10; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionString("")); + def = this->add("only_one_perimeter_first_layer", coBool); def->label = L("Only one perimeter on First layer"); def->category = OptionCategory::perimeter; @@ -8366,6 +8378,7 @@ std::unordered_set prusa_export_to_remove_keys = { "min_width_top_surface", "model_precision", "no_perimeter_unsupported_algo", +"object_gcode", "only_one_perimeter_top_other_algo", "only_one_perimeter_top", "only_one_perimeter_first_layer", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 4d43a29c97e..6869de004d5 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -718,6 +718,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, brim_speed)) //((ConfigOptionEnum, brim_type)) ((ConfigOptionBool, clip_multipart_objects)) + ((ConfigOptionString, object_gcode)) ((ConfigOptionBool, dont_support_bridges)) ((ConfigOptionPercent, external_perimeter_cut_corners)) //((ConfigOptionBool, exact_last_layer_height)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 18972f0dd90..e80be76fa56 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -983,6 +983,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "external_perimeters_vase" || opt_key == "gap_fill_speed" || opt_key == "infill_speed" + || opt_key == "object_gcode" || opt_key == "overhangs_speed" || opt_key == "perimeter_speed" || opt_key == "seam_position" From 51202858d676bac3c5245814201839f52eab710d Mon Sep 17 00:00:00 2001 From: supermerill Date: Wed, 12 Jun 2024 17:27:34 +0200 Subject: [PATCH 5/7] new hidden setting: region_gcode allow to write some gcode each time a region start to print something (perimeter, infill, ironing). Useful for calibrations. --- src/libslic3r/Fill/Fill.cpp | 1 + src/libslic3r/GCode.cpp | 74 ++++++++++++++++++----------------- src/libslic3r/GCode.hpp | 1 + src/libslic3r/Layer.cpp | 1 + src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 13 ++++++ src/libslic3r/PrintConfig.hpp | 1 + src/libslic3r/PrintObject.cpp | 1 + 8 files changed, 57 insertions(+), 36 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index c6501214cb5..f78bd1103a7 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -80,6 +80,7 @@ struct SurfaceFillParams : FillParams RETURN_COMPARE_NON_EQUAL(config->bridge_speed_internal); RETURN_COMPARE_NON_EQUAL(config->gap_fill_speed); RETURN_COMPARE_NON_EQUAL(config->print_extrusion_multiplier); + RETURN_COMPARE_NON_EQUAL(config->region_gcode.value); } if (config == nullptr || rhs.config == nullptr || max_sparse_infill_spacing == 0) RETURN_COMPARE_NON_EQUAL(flow.width()); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1757e577e85..b8d7c3ae555 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5375,6 +5375,41 @@ std::string GCode::extrude_path_3D(const ExtrusionPath3D &path, const std::strin return gcode; } +// Apply region-specific settings +void GCode::apply_region_config(std::string &gcode) { + // modify our fullprintconfig with it. (works as all items avaialable in the regionconfig are present in this config, ie: it write everything region-defined) + m_config.apply(m_region->config()); + // pass our region config to the gcode writer + m_writer.apply_print_region_config(m_region->config()); + // perimeter-only (but won't break anything if done also in infill & ironing): pass needed settings to seam placer. + m_seam_placer.external_perimeters_first = m_region->config().external_perimeters_first.value; + // temperature override from region + if (m_config.print_temperature > 0) { + if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.print_first_layer_temperature.value > 0) { + gcode += m_writer.set_temperature(m_config.print_first_layer_temperature.value, false, m_writer.tool()->id()); + } else { + gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); + } + } else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) { + gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, + m_writer.tool()->id()); + } else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) { // don't set it if disabled + gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, + m_writer.tool()->id()); + } + // apply region_gcode + if (!m_region->config().region_gcode.value.empty()) { + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(m_layer == nullptr ? m_last_height : m_layer->print_z)); + m_gcode_label_objects_start += this->placeholder_parser_process("region_gcode", + m_region->config().region_gcode.value, + m_writer.tool()->id(), &config) + + "\n"; + } + +} + // Extrude perimeters: Decide where to put seams (hide or align seams). std::string GCode::extrude_perimeters(const Print &print, const std::vector &by_region) { @@ -5384,20 +5419,7 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vectorconfig()); - m_writer.apply_print_region_config(m_region->config()); - m_seam_placer.external_perimeters_first = m_region->config().external_perimeters_first.value; - if (m_config.print_temperature > 0) - if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.print_first_layer_temperature.value > 0) - gcode += m_writer.set_temperature(m_config.print_first_layer_temperature.value, false, m_writer.tool()->id()); - else - gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); - else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); - else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) { // don't set it if disabled - gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, - m_writer.tool()->id()); - } + apply_region_config(gcode); ExtrusionEntitiesPtr extrusions{region.perimeters}; chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity *ee : extrusions) { @@ -5416,17 +5438,7 @@ std::string GCode::extrude_infill(const Print& print, const std::vectorconfig().infill_first == is_infill_first)) { - m_config.apply(m_region->config()); - m_writer.apply_print_region_config(m_region->config()); - if (m_config.print_temperature > 0) - if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.print_first_layer_temperature.value > 0) - gcode += m_writer.set_temperature(m_config.print_first_layer_temperature.value, false, m_writer.tool()->id()); - else - gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); - else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); - else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) // don't set it if disabled - gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); + apply_region_config(gcode); ExtrusionEntitiesPtr extrusions{ region.infills }; chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity* fill : extrusions) { @@ -5445,17 +5457,7 @@ std::string GCode::extrude_ironing(const Print& print, const std::vectorconfig()); - m_writer.apply_print_region_config(m_region->config()); - if (m_config.print_temperature > 0) - if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.print_first_layer_temperature.value > 0) - gcode += m_writer.set_temperature(m_config.print_first_layer_temperature.value, false, m_writer.tool()->id()); - else - gcode += m_writer.set_temperature(m_config.print_temperature.value, false, m_writer.tool()->id()); - else if (m_layer != nullptr && m_layer->bottom_z() < EPSILON && m_config.first_layer_temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.first_layer_temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); - else if (m_config.temperature.get_at(m_writer.tool()->id()) > 0) - gcode += m_writer.set_temperature(m_config.temperature.get_at(m_writer.tool()->id()), false, m_writer.tool()->id()); + apply_region_config(gcode); ExtrusionEntitiesPtr extrusions{ region.ironings }; chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity* fill : extrusions) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 2ff9d345c58..2399a0cdd09 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -390,6 +390,7 @@ class GCode : ExtrusionVisitorConst { // For sequential print, the instance of the object to be printing has to be defined. const size_t single_object_instance_idx); + void apply_region_config(std::string &gcode); std::string extrude_perimeters(const Print &print, const std::vector &by_region); std::string extrude_infill(const Print& print, const std::vector& by_region, bool is_infill_first); std::string extrude_ironing(const Print& print, const std::vector& by_region); diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 5e5eaec9b49..2d02c084321 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -218,6 +218,7 @@ void Layer::make_perimeters() && config.thin_walls_speed == other_config.thin_walls_speed && config.infill_overlap == other_config.infill_overlap && config.perimeter_loop == other_config.perimeter_loop + && config.region_gcode == other_config.region_gcode && config.fuzzy_skin == other_config.fuzzy_skin && config.fuzzy_skin_thickness == other_config.fuzzy_skin_thickness diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 483a371b5bd..7fafaaf9250 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -643,6 +643,7 @@ static std::vector s_Preset_print_options { "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", "ooze_prevention", "standby_temperature_delta", "interface_shells", "object_gcode", + "region_gcode", // width & spacing "extrusion_spacing", "extrusion_width", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 99158214b40..8633f4fe5ea 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -4539,6 +4539,18 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comSuSi; def->set_default_value(new ConfigOptionFloatOrPercent(0, false)); + def = this->add("region_gcode", coString); + def->label = L("Per region G-code"); + def->category = OptionCategory::output; + def->tooltip = L("This code is inserted when a region is starting to print something (infill, perimeter, ironing)." + " It's main advantage is when you use it as a object modifer(right click on a model to add it there)" + "\nSpecial variables: 'layer_num','layer_z'"); + def->multiline = true; + def->full_width = true; + def->height = 10; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionString("")); + def = this->add("resolution", coFloat); def->label = L("Slice resolution"); def->category = OptionCategory::slicing; @@ -8414,6 +8426,7 @@ std::unordered_set prusa_export_to_remove_keys = { "printhost_client_cert_password", "raft_layer_height", "raft_interface_layer_height", +"region_gcode", "remaining_times_type", "resolution_internal", "retract_lift_first_layer", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6869de004d5..6f93e406c30 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -937,6 +937,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, print_extrusion_multiplier)) ((ConfigOptionFloat, print_retract_length)) ((ConfigOptionFloat, print_retract_lift)) + ((ConfigOptionString, region_gcode)) ((ConfigOptionFloatOrPercent, small_perimeter_speed)) ((ConfigOptionFloatOrPercent, small_perimeter_min_length)) ((ConfigOptionFloatOrPercent, small_perimeter_max_length)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index e80be76fa56..300b5d30e5b 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -986,6 +986,7 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "object_gcode" || opt_key == "overhangs_speed" || opt_key == "perimeter_speed" + || opt_key == "region_gcode" || opt_key == "seam_position" || opt_key == "seam_preferred_direction" || opt_key == "seam_preferred_direction_jitter" From fb4cc66f83ae8f44b83bb717721488ccd0341f2b Mon Sep 17 00:00:00 2001 From: supermerill Date: Thu, 13 Jun 2024 10:47:49 +0200 Subject: [PATCH 6/7] Update to acceleration: move to object/region & cleaning alongside it. * fix all step invalidation incoherence * rename bridge_internal_* settings to internal_bridge (like orca) * reorder entries when they weren't sorted by alphanumeric order. --- src/libslic3r/Fill/Fill.cpp | 42 ++++-- src/libslic3r/Format/BBConfig.cpp | 2 +- src/libslic3r/GCode.cpp | 18 +-- src/libslic3r/GCode/CoolingBuffer.cpp | 4 +- src/libslic3r/Layer.cpp | 7 +- src/libslic3r/Preset.cpp | 6 +- src/libslic3r/Print.cpp | 83 ++++++------ src/libslic3r/Print.hpp | 2 + src/libslic3r/PrintConfig.cpp | 87 ++++++------ src/libslic3r/PrintConfig.hpp | 45 +++---- src/libslic3r/PrintObject.cpp | 183 ++++++++++++++++---------- src/slic3r/GUI/ConfigManipulation.cpp | 2 +- src/slic3r/GUI/PresetHints.cpp | 8 +- 13 files changed, 276 insertions(+), 213 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index f78bd1103a7..98c82035867 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -71,13 +71,19 @@ struct SurfaceFillParams : FillParams assert(this->config != nullptr); assert(rhs.config != nullptr); if (config != nullptr && rhs.config != nullptr) { + RETURN_COMPARE_NON_EQUAL(config->infill_acceleration); RETURN_COMPARE_NON_EQUAL(config->infill_speed); + RETURN_COMPARE_NON_EQUAL(config->solid_infill_acceleration); RETURN_COMPARE_NON_EQUAL(config->solid_infill_speed); + RETURN_COMPARE_NON_EQUAL(config->top_solid_infill_acceleration); RETURN_COMPARE_NON_EQUAL(config->top_solid_infill_speed); - RETURN_COMPARE_NON_EQUAL(config->ironing_speed); + RETURN_COMPARE_NON_EQUAL(config->default_acceleration); RETURN_COMPARE_NON_EQUAL(config->default_speed); + RETURN_COMPARE_NON_EQUAL(config->bridge_acceleration); RETURN_COMPARE_NON_EQUAL(config->bridge_speed); - RETURN_COMPARE_NON_EQUAL(config->bridge_speed_internal); + RETURN_COMPARE_NON_EQUAL(config->internal_bridge_acceleration); + RETURN_COMPARE_NON_EQUAL(config->internal_bridge_speed); + RETURN_COMPARE_NON_EQUAL(config->gap_fill_acceleration); RETURN_COMPARE_NON_EQUAL(config->gap_fill_speed); RETURN_COMPARE_NON_EQUAL(config->print_extrusion_multiplier); RETURN_COMPARE_NON_EQUAL(config->region_gcode.value); @@ -93,14 +99,23 @@ struct SurfaceFillParams : FillParams if ((config != nullptr) != (rhs.config != nullptr)) return false; if(config != nullptr && ( - config->infill_speed != rhs.config->infill_speed + config->infill_acceleration != rhs.config->infill_acceleration + || config->infill_speed != rhs.config->infill_speed + || config->solid_infill_acceleration != rhs.config->solid_infill_acceleration || config->solid_infill_speed != rhs.config->solid_infill_speed + || config->top_solid_infill_acceleration != rhs.config->top_solid_infill_acceleration || config->top_solid_infill_speed != rhs.config->top_solid_infill_speed - || config->ironing_speed != rhs.config->ironing_speed + || config->default_acceleration != rhs.config->default_acceleration || config->default_speed != rhs.config->default_speed + || config->bridge_acceleration != rhs.config->bridge_acceleration || config->bridge_speed != rhs.config->bridge_speed - || config->bridge_speed_internal != rhs.config->bridge_speed_internal - || config->gap_fill_speed != rhs.config->gap_fill_speed)) + || config->internal_bridge_acceleration != rhs.config->internal_bridge_acceleration + || config->internal_bridge_speed != rhs.config->internal_bridge_speed + || config->gap_fill_acceleration != rhs.config->gap_fill_acceleration + || config->gap_fill_speed != rhs.config->gap_fill_speed + || config->print_extrusion_multiplier != rhs.config->print_extrusion_multiplier + || config->region_gcode != rhs.config->region_gcode + )) return false; // then check params return this->extruder == rhs.extruder && @@ -786,6 +801,7 @@ void Layer::make_ironing() double line_spacing; // Height of the extrusion, to calculate the extrusion flow from. double height; + double acceleration; double speed; double angle; IroningType type; @@ -807,6 +823,10 @@ void Layer::make_ironing() return true; if (this->height > rhs.height) return false; + if (this->acceleration < rhs.acceleration) + return true; + if (this->acceleration > rhs.acceleration) + return false; if (this->speed < rhs.speed) return true; if (this->speed > rhs.speed) @@ -818,11 +838,12 @@ void Layer::make_ironing() return false; } - bool operator==(const IroningParams &rhs) const { + bool operator==(const IroningParams &rhs) const + { return this->extruder == rhs.extruder && this->just_infill == rhs.just_infill && - this->line_spacing == rhs.line_spacing && this->height == rhs.height && this->speed == rhs.speed && - this->angle == rhs.angle && - this->type == rhs.type; + this->line_spacing == rhs.line_spacing && this->height == rhs.height && + this->acceleration == rhs.acceleration && this->speed == rhs.speed && + this->angle == rhs.angle && this->type == rhs.type; } LayerRegion *layerm = nullptr; @@ -869,6 +890,7 @@ void Layer::make_ironing() ironing_params.just_infill = false; ironing_params.line_spacing = config.ironing_spacing; ironing_params.height = default_layer_height * 0.01 * config.ironing_flowrate; + ironing_params.acceleration = config.ironing_acceleration; ironing_params.speed = config.ironing_speed; if (config.ironing_angle.value >= 0) { ironing_params.angle = float(Geometry::deg2rad(config.ironing_angle.value)); diff --git a/src/libslic3r/Format/BBConfig.cpp b/src/libslic3r/Format/BBConfig.cpp index ffb22ab40e2..78e81ae23a8 100644 --- a/src/libslic3r/Format/BBConfig.cpp +++ b/src/libslic3r/Format/BBConfig.cpp @@ -96,7 +96,7 @@ void init() //key_translation_map["bridge_angle"] = "bridge_angle"; key_translation_map["bridge_density"] = "bridge_overlap_min"; key_translation_map["bridge_no_support"] = "dont_support_bridges"; - key_translation_map["internal_bridge_speed"] = "bridge_speed_internal"; + //key_translation_map["internal_bridge_speed"] = "internal_bridge_speed"; //key_translation_map["brim_ears"] = "brim_ears"; //key_translation_map["brim_ears_detection_length"] = "brim_ears_detection_length"; //key_translation_map["brim_ears_max_angle"] = "brim_ears_max_angle"; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index b8d7c3ae555..a56dff4dc1b 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1106,7 +1106,7 @@ namespace DoExport { excluded.insert(erTopSolidInfill); if (config->option("bridge_speed") != nullptr && config->get_computed_value("bridge_speed") != 0) excluded.insert(erBridgeInfill); - if (config->option("bridge_speed_internal") != nullptr && config->get_computed_value("bridge_speed_internal") != 0) + if (config->option("internal_bridge_speed") != nullptr && config->get_computed_value("internal_bridge_speed") != 0) excluded.insert(erInternalBridgeInfill); if (config->option("support_material_speed") != nullptr && config->get_computed_value("support_material_speed") != 0) excluded.insert(erSupportMaterial); @@ -5827,8 +5827,8 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath &path, double spee speed = m_config.get_computed_value("bridge_speed"); if(comment) *comment = "bridge_speed"; } else if (path.role() == erInternalBridgeInfill) { - speed = m_config.get_computed_value("bridge_speed_internal"); - if(comment) *comment = "bridge_speed_internal"; + speed = m_config.get_computed_value("internal_bridge_speed"); + if(comment) *comment = "internal_bridge_speed"; } else if (path.role() == erOverhangPerimeter) { speed = m_config.get_computed_value("overhangs_speed"); if(comment) *comment = "overhangs_speed"; @@ -5906,8 +5906,8 @@ double_t GCode::_compute_speed_mm_per_sec(const ExtrusionPath &path, double spee speed = m_config.bridge_speed.get_abs_value(vol_speed); if(comment) *comment = std::string("bridge_speed ") + *comment; } else if (path.role() == erInternalBridgeInfill) { - speed = m_config.bridge_speed_internal.get_abs_value(vol_speed); - if(comment) *comment = std::string("bridge_speed_internal ") + *comment; + speed = m_config.internal_bridge_speed.get_abs_value(vol_speed); + if(comment) *comment = std::string("internal_bridge_speed ") + *comment; } else if (path.role() == erOverhangPerimeter) { speed = m_config.overhangs_speed.get_abs_value(vol_speed); if(comment) *comment = std::string("overhangs_speed ") + *comment; @@ -6150,10 +6150,10 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string } break; case erInternalBridgeInfill: - if (m_config.bridge_internal_acceleration.value > 0) { - double bridge_internal_acceleration = m_config.get_computed_value("bridge_internal_acceleration"); - if (bridge_internal_acceleration > 0) { - acceleration = bridge_internal_acceleration; + if (m_config.internal_bridge_acceleration.value > 0) { + double internal_bridge_acceleration = m_config.get_computed_value("internal_bridge_acceleration"); + if (internal_bridge_acceleration > 0) { + acceleration = internal_bridge_acceleration; break; } } diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index f366d24d2ff..3d9d48e0893 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -902,7 +902,7 @@ std::string CoolingBuffer::apply_layer_cooldown( } //set the fan controls default_fan_speed[ExtrusionRole::erBridgeInfill] = EXTRUDER_CONFIG(bridge_fan_speed); - default_fan_speed[ExtrusionRole::erInternalBridgeInfill] = EXTRUDER_CONFIG(bridge_internal_fan_speed); + default_fan_speed[ExtrusionRole::erInternalBridgeInfill] = EXTRUDER_CONFIG(internal_bridge_fan_speed); default_fan_speed[ExtrusionRole::erTopSolidInfill] = EXTRUDER_CONFIG(top_fan_speed); default_fan_speed[ExtrusionRole::erIroning] = default_fan_speed[ExtrusionRole::erTopSolidInfill]; default_fan_speed[ExtrusionRole::erSupportMaterialInterface] = EXTRUDER_CONFIG(support_material_interface_fan_speed); @@ -984,7 +984,7 @@ std::string CoolingBuffer::apply_layer_cooldown( fan_speeds[ExtrusionRole::erBridgeInfill] = fan_speeds[0]; } - // if bridge_internal_fan is disabled, it takes the value of bridge_fan + // if internal_bridge_fan is disabled, it takes the value of bridge_fan if (!fan_control[ExtrusionRole::erInternalBridgeInfill] && fan_control[ExtrusionRole::erBridgeInfill]) { fan_control[ExtrusionRole::erInternalBridgeInfill] = true; fan_speeds[ExtrusionRole::erInternalBridgeInfill] = fan_speeds[ExtrusionRole::erBridgeInfill]; diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 2d02c084321..c406ed76e7d 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -171,6 +171,7 @@ void Layer::make_perimeters() /// if you don't do that, objects will share the same region, and the same settings. if (config.perimeter_extruder == other_config.perimeter_extruder && config.perimeters == other_config.perimeters + && config.external_perimeter_acceleration == other_config.external_perimeter_acceleration && config.external_perimeter_extrusion_width == other_config.external_perimeter_extrusion_width && config.external_perimeter_overlap == other_config.external_perimeter_overlap && config.external_perimeter_speed == other_config.external_perimeter_speed // it os mandatory? can't this be set at gcode.cpp? @@ -182,6 +183,7 @@ void Layer::make_perimeters() && config.extra_perimeters_overhangs == other_config.extra_perimeters_overhangs && config.gap_fill_enabled == other_config.gap_fill_enabled && ((config.gap_fill_speed == other_config.gap_fill_speed) || !config.gap_fill_enabled) + && config.gap_fill_acceleration == other_config.gap_fill_acceleration && config.gap_fill_last == other_config.gap_fill_last && config.gap_fill_flow_match_perimeter == other_config.gap_fill_flow_match_perimeter && config.gap_fill_extension == other_config.gap_fill_extension @@ -196,10 +198,12 @@ void Layer::make_perimeters() && (this->id() == 0 || config.only_one_perimeter_first_layer == other_config.only_one_perimeter_first_layer) && config.only_one_perimeter_top == other_config.only_one_perimeter_top && config.only_one_perimeter_top_other_algo == other_config.only_one_perimeter_top_other_algo + && config.overhangs_acceleration == other_config.overhangs_acceleration && config.overhangs_width_speed == other_config.overhangs_width_speed && config.overhangs_width == other_config.overhangs_width && config.overhangs_reverse == other_config.overhangs_reverse && config.overhangs_reverse_threshold == other_config.overhangs_reverse_threshold + && config.perimeter_acceleration == other_config.perimeter_acceleration && config.perimeter_extrusion_width == other_config.perimeter_extrusion_width && config.perimeter_loop == other_config.perimeter_loop && config.perimeter_loop_seam == other_config.perimeter_loop_seam @@ -211,11 +215,12 @@ void Layer::make_perimeters() && config.small_perimeter_min_length == other_config.small_perimeter_min_length && config.small_perimeter_max_length == other_config.small_perimeter_max_length && config.thin_walls == other_config.thin_walls + && config.thin_walls_acceleration == other_config.thin_walls_acceleration && config.thin_walls_min_width == other_config.thin_walls_min_width && config.thin_walls_overlap == other_config.thin_walls_overlap + && config.thin_walls_speed == other_config.thin_walls_speed && config.thin_perimeters == other_config.thin_perimeters && config.thin_perimeters_all == other_config.thin_perimeters_all - && config.thin_walls_speed == other_config.thin_walls_speed && config.infill_overlap == other_config.infill_overlap && config.perimeter_loop == other_config.perimeter_loop && config.region_gcode == other_config.region_gcode diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 7fafaaf9250..668257eea6f 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -532,7 +532,7 @@ static std::vector s_Preset_print_options { // speeds "default_speed", "bridge_speed", - "bridge_speed_internal", + "internal_bridge_speed", "brim_speed", "external_perimeter_speed", "first_layer_speed", @@ -568,7 +568,6 @@ static std::vector s_Preset_print_options { "fuzzy_skin_thickness", // acceleration "bridge_acceleration", - "bridge_internal_acceleration", "brim_acceleration", "default_acceleration", "external_perimeter_acceleration", @@ -576,6 +575,7 @@ static std::vector s_Preset_print_options { "first_layer_acceleration_over_raft", "gap_fill_acceleration", "infill_acceleration", + "internal_bridge_acceleration", "ironing_acceleration", "overhangs_acceleration", "perimeter_acceleration", @@ -770,10 +770,10 @@ static std::vector s_Preset_filament_options { "default_fan_speed", "max_fan_speed", "bridge_fan_speed", - "bridge_internal_fan_speed", "external_perimeter_fan_speed", "gap_fill_fan_speed", "infill_fan_speed", + "internal_bridge_fan_speed", "overhangs_fan_speed", "perimeter_fan_speed", "solid_infill_fan_speed", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 73921321f5d..cbf6f656965 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -61,27 +61,25 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne if (opt_keys.empty()) return false; + // Cache the plenty of parameters, which influence the G-code generator only, // or they are only notes not influencing the generated G-code. static std::unordered_set steps_gcode = { + "allow_empty_layers", "avoid_crossing_perimeters", "avoid_crossing_perimeters_max_detour", "avoid_crossing_not_first_layer", - "avoid_crossing_top", "bed_shape", "bed_temperature", "before_layer_gcode", "between_objects_gcode", - "bridge_acceleration", - "bridge_internal_acceleration", "bridge_fan_speed", - "bridge_internal_fan_speed", - "brim_acceleration", "chamber_temperature", + "color_change_gcode", "colorprint_heights", "complete_objects_sort", - "cooling", - "default_acceleration", + "complete_objects_one_brim", + //"cooling", "default_fan_speed", "deretract_speed", "disable_fan_first_layers", @@ -89,8 +87,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "enforce_retract_first_layer", "end_gcode", "end_filament_gcode", - "external_perimeter_acceleration", - "external_perimeter_cut_corners", "external_perimeter_fan_speed", "extrusion_axis", "extruder_clearance_height", @@ -105,62 +101,59 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "fan_kickstart", "fan_speedup_overhangs", "fan_speedup_time", + "feature_gcode", "fan_percentage", "fan_printer_min_speed", "filament_colour", "filament_custom_variables", "filament_diameter", "filament_density", + "filament_load_time", "filament_notes", "filament_cost", "filament_spool_weight", - "first_layer_acceleration", - "first_layer_acceleration_over_raft", + "filament_unload_time", + "filament_wipe_advanced_pigment", "first_layer_bed_temperature", - "first_layer_flow_ratio", - "first_layer_speed", // ? delete y prusa here in 2.4 - "first_layer_speed_over_raft", - "first_layer_infill_speed", - "first_layer_min_speed", "full_fan_speed_layer", - "gap_fill_acceleration", "gap_fill_fan_speed", - "gap_fill_flow_match_perimeter", - "gap_fill_speed", "gcode_ascii", "gcode_comments", "gcode_filename_illegal_char", "gcode_label_objects", "gcode_precision_xyz", "gcode_precision_e", - "infill_acceleration", + "gcode_substitutions", "infill_fan_speed", - "ironing_acceleration", + "internal_bridge_fan_speed", "layer_gcode", + "lift_min", "max_fan_speed", "max_gcode_per_second", "max_print_height", "max_print_speed", + "max_speed_reduction", "max_volumetric_speed", "min_length", "min_print_speed", + "milling_diameter", "milling_toolchange_end_gcode", "milling_toolchange_start_gcode", - "milling_offset", - "milling_z_offset", - "milling_z_lift", "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", "notes", "only_retract_when_crossing_perimeters", "output_filename_format", - "overhangs_acceleration", "overhangs_fan_speed", - "perimeter_acceleration", + "parallel_objects_step", + "pause_print_gcode", "post_process", - "gcode_substitutions", + "print_custom_variables", + "printer_custom_variables", "perimeter_fan_speed", "printer_notes", + "remaining_times", + "remaining_times_type", "retract_before_travel", "retract_before_wipe", "retract_layer_change", @@ -175,9 +168,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "retract_restart_extra", "retract_restart_extra_toolchange", "retract_speed", + "silent_mode", "single_extruder_multi_material_priming", "slowdown_below_layer_time", - "solid_infill_acceleration", "solid_infill_fan_speed", "support_material_acceleration", "support_material_fan_speed", @@ -187,8 +180,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "start_gcode", "start_gcode_manual", "start_filament_gcode", - "thin_walls_acceleration", - "thin_walls_speed", + "template_custom_gcode", "thumbnails", "thumbnails_color", "thumbnails_custom_color", @@ -203,17 +195,16 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne "tool_name", "toolchange_gcode", "top_fan_speed", - "top_solid_infill_acceleration", "threads", - "travel_acceleration", - "travel_deceleration_use_target", - "travel_speed", - "travel_speed_z", "use_firmware_retraction", "use_relative_e_distances", "use_volumetric_e", "variable_layer_height", "wipe", + "wipe_advanced", + "wipe_advanced_algo", + "wipe_advanced_multiplier", + "wipe_advanced_nozzle_melted_volume", "wipe_extra_perimeter", "wipe_inside_depth", "wipe_inside_end", @@ -229,6 +220,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne bool invalidated = false; for (const t_config_option_key &opt_key : opt_keys) { + //this one isn't even use in slicing, only for import. + if (opt_key == "init_z_rotate") + continue; if (steps_gcode.find(opt_key) != steps_gcode.end()) { // These options only affect G-code export or they are just notes without influence on the generated G-code, // so there is nothing to invalidate. @@ -241,10 +235,11 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "min_skirt_length" || opt_key == "ooze_prevention" || opt_key == "skirts" - || opt_key == "skirt_height" || opt_key == "skirt_brim" || opt_key == "skirt_distance" || opt_key == "skirt_distance_from_brim" + || opt_key == "skirt_extrusion_width" + || opt_key == "skirt_height" || opt_key == "wipe_tower_x" || opt_key == "wipe_tower_y" || opt_key == "wipe_tower_rotation_angle" @@ -253,12 +248,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne } else if ( opt_key == "bridge_precision" || opt_key == "filament_shrink" - || opt_key == "first_layer_height" || opt_key == "nozzle_diameter" - || opt_key == "model_precision" || opt_key == "resolution" || opt_key == "resolution_internal" - || opt_key == "slice_closing_radius" // Spiral Vase forces different kind of slicing than the normal model: // In Spiral Vase mode, holes are closed and only the largest area contour is kept at each layer. // Therefore toggling the Spiral Vase on / off requires complete reslicing. @@ -268,14 +260,13 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne } else if ( opt_key == "complete_objects" || opt_key == "filament_type" - || opt_key == "filament_soluble" - || opt_key == "first_layer_temperature" || opt_key == "filament_loading_speed" || opt_key == "filament_loading_speed_start" || opt_key == "filament_unloading_speed" || opt_key == "filament_unloading_speed_start" || opt_key == "filament_toolchange_delay" || opt_key == "filament_cooling_moves" + || opt_key == "filament_max_wipe_tower_speed" || opt_key == "filament_minimal_purge_on_wipe_tower" || opt_key == "filament_cooling_initial_speed" || opt_key == "filament_cooling_final_speed" @@ -293,9 +284,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "filament_toolchange_part_fan_speed" || opt_key == "filament_dip_insertion_speed" || opt_key == "filament_dip_extraction_speed" //skinnydip params end + || opt_key == "first_layer_temperature" || opt_key == "gcode_flavor" || opt_key == "high_current_on_filament_swap" - || opt_key == "infill_first" || opt_key == "single_extruder_multi_material" || opt_key == "temperature" || opt_key == "wipe_tower" @@ -303,8 +294,10 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "wipe_tower_brim_width" || opt_key == "wipe_tower_bridging" || opt_key == "wipe_tower_no_sparse_layers" + || opt_key == "wipe_tower_per_color_wipe" || opt_key == "wipe_tower_speed" || opt_key == "wipe_tower_wipe_starting_speed" + || opt_key == "wiping_volumes_extruders" || opt_key == "wiping_volumes_matrix" || opt_key == "parking_pos_retraction" || opt_key == "cooling_tube_retraction" @@ -312,7 +305,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne || opt_key == "extra_loading_move" || opt_key == "travel_speed" || opt_key == "travel_speed_z" - || opt_key == "first_layer_speed" || opt_key == "z_offset") { steps.emplace_back(psWipeTower); steps.emplace_back(psSkirtBrim); @@ -323,8 +315,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne //FIXME Killing supports on any change of "filament_soluble" is rough. We should check for each object whether that is necessary. osteps.emplace_back(posSupportMaterial); } else if ( - opt_key == "first_layer_extrusion_width" - || opt_key == "arc_fitting" + opt_key == "arc_fitting" || opt_key == "arc_fitting_tolerance" || opt_key == "min_layer_height" || opt_key == "max_layer_height" @@ -335,6 +326,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver& /* ne osteps.emplace_back(posSimplifyPath); osteps.emplace_back(posSupportMaterial); steps.emplace_back(psSkirtBrim); + } else if (opt_key == "seam_gap" || opt_key == "seam_gap_external") { + osteps.emplace_back(posInfill); } else if (opt_key == "posSlice") osteps.emplace_back(posSlice); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index a353f0b8d0f..ba6e9fe0136 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -46,6 +46,7 @@ namespace FillLightning { using GeneratorPtr = std::unique_ptr; }; // namespace FillLightning + // Print step IDs for keeping track of the print state. // The Print steps are applied in this order. enum PrintStep { @@ -59,6 +60,7 @@ enum PrintStep { // should be refreshed. psSlicingFinished = psSkirtBrim, psGCodeExport, + //TODO: psGCodeLoader (for params that are only used for time display and such) psCount, }; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 8633f4fe5ea..e0a16ddcaf6 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -712,20 +712,6 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comPrusa; def->set_default_value(new ConfigOptionFloatOrPercent(0,false)); - def = this->add("bridge_internal_acceleration", coFloatOrPercent); - def->label = L("Internal bridges "); - def->full_label = L("Internal bridges acceleration"); - def->category = OptionCategory::speed; - def->tooltip = L("This is the acceleration your printer will use for internal bridges. " - "\nCan be a % of the default acceleration" - "\nSet zero to use bridge acceleration for internal bridges."); - def->sidetext = L("mm/s² or %"); - def->ratio_over = "bridge_acceleration"; - def->min = 0; - def->max_literal = { -200, false }; - def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionFloatOrPercent(0,false)); - def = this->add("bridge_angle", coFloat); def->label = L("Bridging"); def->full_label = L("Bridging angle"); @@ -751,19 +737,6 @@ void PrintConfigDef::init_fff_params() def->is_vector_extruder = true; def->set_default_value(new ConfigOptionInts{ 100 }); - def = this->add("bridge_internal_fan_speed", coInts); - def->label = L("Infill bridges fan speed"); - def->category = OptionCategory::cooling; - def->tooltip = L("This fan speed is enforced during all infill bridges. It won't slow down the fan if it's currently running at a higher speed." - "\nSet to -1 to disable this override (Internal bridges will use Bridges fan speed)." - "\nCan be disabled by disable_fan_first_layers and increased by low layer time."); - def->sidetext = L("%"); - def->min = -1; - def->max = 100; - def->mode = comAdvancedE | comSuSi; - def->is_vector_extruder = true; - def->set_default_value(new ConfigOptionInts{ -1 }); - def = this->add("bridge_type", coEnum); def->label = L("Bridge flow baseline"); def->category = OptionCategory::width; @@ -865,17 +838,6 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvancedE | comPrusa; def->set_default_value(new ConfigOptionFloatOrPercent(60, true)); - def = this->add("bridge_speed_internal", coFloatOrPercent); - def->label = L("Internal bridges"); - def->full_label = L("Internal bridge speed"); - def->category = OptionCategory::speed; - def->tooltip = L("Speed for printing the bridges that support the top layer.\nCan be a % of the bridge speed."); - def->sidetext = L("mm/s or %"); - def->ratio_over = "bridge_speed"; - def->min = 0; - def->mode = comExpert | comSuSi; - def->set_default_value(new ConfigOptionFloatOrPercent(150,true)); - def = this->add("brim_inside_holes", coBool); def->label = L("Brim inside holes"); def->category = OptionCategory::skirtBrim; @@ -3313,6 +3275,47 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert | comPrusa; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("internal_bridge_acceleration", coFloatOrPercent); + def->label = L("Internal bridges "); + def->full_label = L("Internal bridges acceleration"); + def->category = OptionCategory::speed; + def->tooltip = L("This is the acceleration your printer will use for internal bridges. " + "\nCan be a % of the default acceleration" + "\nSet zero to use bridge acceleration for internal bridges."); + def->sidetext = L("mm/s² or %"); + def->ratio_over = "bridge_acceleration"; + def->min = 0; + def->max_literal = { -200, false }; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionFloatOrPercent(0,false)); + def->aliases = { "bridge_internal_acceleration" }; + + def = this->add("internal_bridge_fan_speed", coInts); + def->label = L("Infill bridges fan speed"); + def->category = OptionCategory::cooling; + def->tooltip = L("This fan speed is enforced during all infill bridges. It won't slow down the fan if it's currently running at a higher speed." + "\nSet to -1 to disable this override (Internal bridges will use Bridges fan speed)." + "\nCan be disabled by disable_fan_first_layers and increased by low layer time."); + def->sidetext = L("%"); + def->min = -1; + def->max = 100; + def->mode = comAdvancedE | comSuSi; + def->is_vector_extruder = true; + def->set_default_value(new ConfigOptionInts{ -1 }); + def->aliases = { "bridge_internal_fan_speed" }; + + def = this->add("internal_bridge_speed", coFloatOrPercent); + def->label = L("Internal bridges"); + def->full_label = L("Internal bridge speed"); + def->category = OptionCategory::speed; + def->tooltip = L("Speed for printing the bridges that support the top layer.\nCan be a % of the bridge speed."); + def->sidetext = L("mm/s or %"); + def->ratio_over = "bridge_speed"; + def->min = 0; + def->mode = comExpert | comSuSi; + def->set_default_value(new ConfigOptionFloatOrPercent(150,true)); + def->aliases = { "bridge_speed_internal" }; + def = this->add("mmu_segmented_region_max_width", coFloat); def->label = L("Maximum width of a segmented region"); def->tooltip = L("Maximum width of a segmented region. Zero disables this feature."); @@ -3332,7 +3335,7 @@ void PrintConfigDef::init_fff_params() def = this->add("ironing_acceleration", coFloatOrPercent); def->label = L("Ironing"); def->full_label = L("Ironing acceleration"); - def->category = OptionCategory::speed; + def->category = OptionCategory::ironing; def->tooltip = L("This is the acceleration your printer will use for ironing. " "\nCan be a % of the top solid infill acceleration" "\nSet zero to use top solid infill acceleration for ironing."); @@ -8257,12 +8260,9 @@ std::unordered_set prusa_export_to_remove_keys = { "avoid_crossing_not_first_layer", "avoid_crossing_top", "bridge_fill_pattern", -"bridge_internal_acceleration", -"bridge_internal_fan_speed", "bridge_precision", "bridge_overlap", "bridge_overlap_min", -"bridge_speed_internal", "bridge_type", "bridged_infill_margin", "brim_acceleration", @@ -8369,6 +8369,9 @@ std::unordered_set prusa_export_to_remove_keys = { "infill_extrusion_spacing", "infill_fan_speed", "init_z_rotate", +"internal_bridge_acceleration", +"internal_bridge_fan_speed", +"internal_bridge_speed", "ironing_acceleration", "ironing_angle", "lift_min", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6f93e406c30..5cca571ff41 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -706,6 +706,7 @@ protected: \ PRINT_CONFIG_CLASS_DEFINE( PrintObjectConfig, + ((ConfigOptionFloatOrPercent, brim_acceleration)) ((ConfigOptionBool, brim_inside_holes)) ((ConfigOptionFloat, brim_width)) ((ConfigOptionFloat, brim_width_interior)) @@ -725,12 +726,16 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, extrusion_width)) ((ConfigOptionFloatOrPercent, extrusion_spacing)) ((ConfigOptionBool, fill_angle_follow_model)) + ((ConfigOptionFloatOrPercent, first_layer_acceleration)) ((ConfigOptionFloatOrPercent, first_layer_acceleration_over_raft)) ((ConfigOptionFloatOrPercent, first_layer_height)) ((ConfigOptionFloatOrPercent, first_layer_extrusion_width)) ((ConfigOptionFloatOrPercent, first_layer_extrusion_spacing)) + ((ConfigOptionFloatOrPercent, first_layer_infill_speed)) + ((ConfigOptionFloat, first_layer_min_speed)) ((ConfigOptionFloat, first_layer_size_compensation)) /* elefant_foot_compensation */ ((ConfigOptionInt, first_layer_size_compensation_layers)) + ((ConfigOptionFloatOrPercent, first_layer_speed)) ((ConfigOptionFloatOrPercent, first_layer_speed_over_raft)) ((ConfigOptionFloat, hole_size_compensation)) ((ConfigOptionFloat, hole_size_threshold)) @@ -817,6 +822,7 @@ PRINT_CONFIG_CLASS_DEFINE( PrintRegionConfig, ((ConfigOptionBool, avoid_crossing_top)) + ((ConfigOptionFloatOrPercent, bridge_acceleration)) ((ConfigOptionFloat, bridge_angle)) ((ConfigOptionEnum, bridge_fill_pattern)) ((ConfigOptionEnum, bridge_type)) @@ -829,15 +835,16 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionEnum, bottom_fill_pattern)) ((ConfigOptionFloatOrPercent, bridged_infill_margin)) ((ConfigOptionFloatOrPercent, bridge_speed)) - ((ConfigOptionFloatOrPercent, bridge_speed_internal)) ((ConfigOptionFloat, curve_smoothing_precision)) ((ConfigOptionFloat, curve_smoothing_cutoff_dist)) ((ConfigOptionFloat, curve_smoothing_angle_convex)) ((ConfigOptionFloat, curve_smoothing_angle_concave)) + ((ConfigOptionFloatOrPercent, default_acceleration)) ((ConfigOptionFloatOrPercent, default_speed)) ((ConfigOptionBool, ensure_vertical_shell_thickness)) ((ConfigOptionBool, enforce_full_fill_volume)) ((ConfigOptionFloatOrPercent, external_infill_margin)) + ((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) ((ConfigOptionFloatOrPercent, external_perimeter_extrusion_width)) ((ConfigOptionFloatOrPercent, external_perimeter_extrusion_spacing)) ((ConfigOptionFloatOrPercent, external_perimeter_extrusion_change_odd_layers)) @@ -867,6 +874,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, fill_top_flow_ratio)) ((ConfigOptionPercent, fill_smooth_distribution)) ((ConfigOptionFloatOrPercent, fill_smooth_width)) + ((ConfigOptionFloatOrPercent, gap_fill_acceleration)) ((ConfigOptionBool, gap_fill_enabled)) ((ConfigOptionFloatOrPercent, gap_fill_extension)) ((ConfigOptionPercent, gap_fill_flow_match_perimeter)) @@ -882,6 +890,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, hole_to_polyhole)) ((ConfigOptionFloatOrPercent, hole_to_polyhole_threshold)) ((ConfigOptionBool, hole_to_polyhole_twisted)) + ((ConfigOptionFloatOrPercent, infill_acceleration)) ((ConfigOptionInt, infill_extruder)) ((ConfigOptionFloatOrPercent, infill_extrusion_width)) ((ConfigOptionFloatOrPercent, infill_extrusion_spacing)) @@ -897,8 +906,11 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, infill_dense)) ((ConfigOptionEnum, infill_dense_algo)) ((ConfigOptionBool, infill_first)) + ((ConfigOptionFloatOrPercent, internal_bridge_acceleration)) + ((ConfigOptionFloatOrPercent, internal_bridge_speed)) // Ironing options ((ConfigOptionBool, ironing)) + ((ConfigOptionFloatOrPercent, ironing_acceleration)) ((ConfigOptionFloat, ironing_angle)) ((ConfigOptionEnum, ironing_type)) ((ConfigOptionPercent, ironing_flowrate)) @@ -911,6 +923,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, milling_speed)) ((ConfigOptionFloatOrPercent, min_width_top_surface)) // Detect bridging perimeters + ((ConfigOptionFloatOrPercent, overhangs_acceleration)) ((ConfigOptionFloatOrPercent, overhangs_max_slope)) ((ConfigOptionFloat, overhangs_bridge_threshold)) ((ConfigOptionInt, overhangs_bridge_upper_layers)) @@ -921,6 +934,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, overhangs_reverse)) ((ConfigOptionFloatOrPercent, overhangs_reverse_threshold)) ((ConfigOptionEnum, no_perimeter_unsupported_algo)) + ((ConfigOptionFloatOrPercent, perimeter_acceleration)) ((ConfigOptionBool, perimeter_round_corners)) ((ConfigOptionInt, perimeter_extruder)) ((ConfigOptionFloatOrPercent, perimeter_extrusion_width)) @@ -942,6 +956,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, small_perimeter_min_length)) ((ConfigOptionFloatOrPercent, small_perimeter_max_length)) ((ConfigOptionEnum, solid_fill_pattern)) + ((ConfigOptionFloatOrPercent, solid_infill_acceleration)) ((ConfigOptionFloat, solid_infill_below_area)) ((ConfigOptionFloat, solid_infill_below_layer_area)) ((ConfigOptionFloatOrPercent, solid_infill_below_width)) @@ -958,6 +973,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, thin_perimeters)) ((ConfigOptionPercent, thin_perimeters_all)) ((ConfigOptionBool, thin_walls)) + ((ConfigOptionFloatOrPercent, thin_walls_acceleration)) ((ConfigOptionFloatOrPercent, thin_walls_min_width)) ((ConfigOptionFloatOrPercent, thin_walls_overlap)) ((ConfigOptionFloatOrPercent, thin_walls_speed)) @@ -966,10 +982,12 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloatOrPercent, top_infill_extrusion_spacing)) ((ConfigOptionInt, top_solid_layers)) ((ConfigOptionFloat, top_solid_min_thickness)) + ((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) ((ConfigOptionPercent, top_solid_infill_overlap)) ((ConfigOptionFloatOrPercent, top_solid_infill_speed)) + ((ConfigOptionFloatOrPercent, travel_acceleration)) + ((ConfigOptionBool, travel_deceleration_use_target)) ((ConfigOptionBool, wipe_into_infill)) - ) PRINT_CONFIG_CLASS_DEFINE( @@ -1174,12 +1192,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, avoid_crossing_perimeters_max_detour)) ((ConfigOptionPoints, bed_shape)) ((ConfigOptionInts, bed_temperature)) - ((ConfigOptionFloatOrPercent, bridge_acceleration)) - ((ConfigOptionFloatOrPercent, bridge_internal_acceleration)) ((ConfigOptionInts, bridge_fan_speed)) - ((ConfigOptionInts, bridge_internal_fan_speed)) ((ConfigOptionFloatOrPercent, bridge_precision)) - ((ConfigOptionFloatOrPercent, brim_acceleration)) ((ConfigOptionInts, chamber_temperature)) ((ConfigOptionBool, complete_objects)) ((ConfigOptionFloat, parallel_objects_step)) @@ -1188,13 +1202,11 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionEnum, complete_objects_sort)) ((ConfigOptionFloats, colorprint_heights)) //((ConfigOptionBools, cooling)) - ((ConfigOptionFloatOrPercent, default_acceleration)) ((ConfigOptionInts, disable_fan_first_layers)) ((ConfigOptionInts, default_fan_speed)) ((ConfigOptionEnum, draft_shield)) ((ConfigOptionFloat, duplicate_distance)) ((ConfigOptionBool, enforce_retract_first_layer)) - ((ConfigOptionFloatOrPercent, external_perimeter_acceleration)) ((ConfigOptionInts, external_perimeter_fan_speed)) ((ConfigOptionFloat, extruder_clearance_height)) ((ConfigOptionFloat, extruder_clearance_radius)) @@ -1207,18 +1219,12 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionStrings, filament_notes)) ((ConfigOptionPercents, filament_max_overlap)) ((ConfigOptionPercents, filament_shrink)) - ((ConfigOptionFloatOrPercent, first_layer_acceleration)) ((ConfigOptionInts, first_layer_bed_temperature)) - ((ConfigOptionFloatOrPercent, first_layer_speed)) - ((ConfigOptionFloatOrPercent, first_layer_infill_speed)) - ((ConfigOptionFloat, first_layer_min_speed)) ((ConfigOptionInts, first_layer_temperature)) ((ConfigOptionInts, full_fan_speed_layer)) - ((ConfigOptionFloatOrPercent, gap_fill_acceleration)) ((ConfigOptionInts, gap_fill_fan_speed)) - ((ConfigOptionFloatOrPercent, infill_acceleration)) ((ConfigOptionInts, infill_fan_speed)) - ((ConfigOptionFloatOrPercent, ironing_acceleration)) + ((ConfigOptionInts, internal_bridge_fan_speed)) ((ConfigOptionFloat, lift_min)) ((ConfigOptionInts, max_fan_speed)) ((ConfigOptionFloatsOrPercents, max_layer_height)) @@ -1227,8 +1233,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloats, milling_diameter)) ((ConfigOptionStrings, milling_toolchange_end_gcode)) ((ConfigOptionStrings, milling_toolchange_start_gcode)) - //((ConfigOptionPoints, milling_offset)) - //((ConfigOptionFloats, milling_z_offset)) //((ConfigOptionInts, min_fan_speed)) // now fan_printer_min_speed ((ConfigOptionFloatsOrPercents, min_layer_height)) ((ConfigOptionFloats, min_print_speed)) @@ -1238,9 +1242,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBool, only_retract_when_crossing_perimeters)) ((ConfigOptionBool, ooze_prevention)) ((ConfigOptionString, output_filename_format)) - ((ConfigOptionFloatOrPercent, overhangs_acceleration)) ((ConfigOptionInts, overhangs_fan_speed)) - ((ConfigOptionFloatOrPercent, perimeter_acceleration)) ((ConfigOptionInts, perimeter_fan_speed)) ((ConfigOptionStrings, post_process)) ((ConfigOptionString, print_custom_variables)) @@ -1262,7 +1264,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionInt, skirts)) ((ConfigOptionFloats, slowdown_below_layer_time)) ((ConfigOptionBool, spiral_vase)) - ((ConfigOptionFloatOrPercent, solid_infill_acceleration)) ((ConfigOptionInts, solid_infill_fan_speed)) ((ConfigOptionInt, standby_temperature_delta)) ((ConfigOptionFloatOrPercent, support_material_acceleration)) @@ -1270,7 +1271,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, support_material_interface_acceleration)) ((ConfigOptionInts, support_material_interface_fan_speed)) ((ConfigOptionInts, temperature)) - ((ConfigOptionFloatOrPercent, thin_walls_acceleration)) ((ConfigOptionInt, threads)) ((ConfigOptionPoints, thumbnails)) ((ConfigOptionString, thumbnails_color)) @@ -1284,9 +1284,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, time_start_gcode)) ((ConfigOptionFloat, time_toolchange)) ((ConfigOptionInts, top_fan_speed)) - ((ConfigOptionFloatOrPercent, top_solid_infill_acceleration)) - ((ConfigOptionFloatOrPercent, travel_acceleration)) - ((ConfigOptionBool, travel_deceleration_use_target)) ((ConfigOptionBools, wipe)) ((ConfigOptionBool, wipe_tower)) ((ConfigOptionFloatOrPercent, wipe_tower_brim_width)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 300b5d30e5b..c029b894982 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -706,7 +706,7 @@ FillLightning::GeneratorPtr PrintObject::prepare_lightning_infill_data() // Called by Print::apply(). // This method only accepts PrintObjectConfig and PrintRegionConfig option keys. -bool PrintObject::invalidate_state_by_config_options( + bool PrintObject::invalidate_state_by_config_options( const ConfigOptionResolver &old_config, const ConfigOptionResolver &new_config, const std::vector &opt_keys) { if (opt_keys.empty()) @@ -716,13 +716,13 @@ bool PrintObject::invalidate_state_by_config_options( bool invalidated = false; for (const t_config_option_key& opt_key : opt_keys) { if ( - opt_key == "gap_fill_enabled" - || opt_key == "gap_fill_extension" + opt_key == "gap_fill_extension" || opt_key == "gap_fill_last" || opt_key == "gap_fill_max_width" || opt_key == "gap_fill_min_area" || opt_key == "gap_fill_min_length" || opt_key == "gap_fill_min_width" + || opt_key == "min_width_top_surface" || opt_key == "only_one_perimeter_first_layer" || opt_key == "only_one_perimeter_top" || opt_key == "only_one_perimeter_top_other_algo" @@ -731,22 +731,21 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "overhangs_reverse" || opt_key == "overhangs_reverse_threshold" || opt_key == "overhangs_speed_enforce" + || opt_key == "perimeter_bonding" || opt_key == "perimeter_extrusion_change_odd_layers" || opt_key == "perimeter_extrusion_spacing" || opt_key == "perimeter_extrusion_width" || opt_key == "perimeter_reverse" - || opt_key == "infill_overlap" + || opt_key == "perimeter_round_corners" || opt_key == "thin_perimeters" || opt_key == "thin_perimeters_all" - || opt_key == "thin_walls" + || opt_key == "thin_walls_merge" || opt_key == "thin_walls_min_width" || opt_key == "thin_walls_overlap" || opt_key == "external_perimeters_first" || opt_key == "external_perimeters_hole" || opt_key == "external_perimeters_nothole" || opt_key == "external_perimeter_extrusion_change_odd_layers" - || opt_key == "external_perimeter_extrusion_spacing" - || opt_key == "external_perimeter_extrusion_width" || opt_key == "external_perimeters_vase" || opt_key == "perimeter_loop" || opt_key == "perimeter_loop_seam") { @@ -773,34 +772,49 @@ bool PrintObject::invalidate_state_by_config_options( steps.emplace_back(posSlice); steps.emplace_back(posPerimeters); } else if ( - opt_key == "layer_height" - || opt_key == "first_layer_height" - || opt_key == "mmu_segmented_region_max_width" // || opt_key == "exact_last_layer_height" - || opt_key == "raft_contact_distance" - || opt_key == "raft_interface_layer_height" - || opt_key == "raft_layers" - || opt_key == "raft_layer_height" + opt_key == "bridge_type" || opt_key == "clip_multipart_objects" + || opt_key == "curve_smoothing_angle_concave" + || opt_key == "curve_smoothing_angle_convex" + || opt_key == "curve_smoothing_cutoff_dist" + || opt_key == "curve_smoothing_precision" + || opt_key == "dont_support_bridges" + || opt_key == "elephant_foot_min_width" //sla ? || opt_key == "first_layer_size_compensation" || opt_key == "first_layer_size_compensation_layers" - || opt_key == "elephant_foot_min_width" - || opt_key == "dont_support_bridges" + || opt_key == "first_layer_height" + || opt_key == "hole_size_compensation" + || opt_key == "hole_size_threshold" + || opt_key == "hole_to_polyhole" + || opt_key == "hole_to_polyhole_threshold" + || opt_key == "hole_to_polyhole_twisted" + || opt_key == "layer_height" + || opt_key == "min_bead_width" + || opt_key == "min_feature_size" + || opt_key == "mmu_segmented_region_max_width" + || opt_key == "model_precision" || opt_key == "overhangs_max_slope" || opt_key == "overhangs_bridge_threshold" || opt_key == "overhangs_bridge_upper_layers" + || opt_key == "raft_contact_distance" + || opt_key == "raft_interface_layer_height" + || opt_key == "raft_layers" + || opt_key == "raft_layer_height" + || opt_key == "perimeter_generator" || opt_key == "slice_closing_radius" || opt_key == "slicing_mode" || opt_key == "support_material_contact_distance_type" - || opt_key == "support_material_contact_distance_top" - || opt_key == "support_material_contact_distance_bottom" + || opt_key == "support_material_contact_distance" + || opt_key == "support_material_bottom_contact_distance" || opt_key == "support_material_interface_layer_height" || opt_key == "support_material_layer_height" - || opt_key == "xy_size_compensation" - || opt_key == "hole_size_compensation" - || opt_key == "hole_size_threshold" - || opt_key == "hole_to_polyhole" - || opt_key == "hole_to_polyhole_threshold") { + || opt_key == "wall_transition_length" + || opt_key == "wall_transition_filter_deviation" + || opt_key == "wall_transition_angle" + || opt_key == "wall_distribution_count" + || opt_key == "xy_inner_size_compensation" + || opt_key == "xy_size_compensation") { steps.emplace_back(posSlice); } else if (opt_key == "support_material") { steps.emplace_back(posSupportMaterial); @@ -822,17 +836,15 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "support_material_enforce_layers" || opt_key == "support_material_extruder" || opt_key == "support_material_extrusion_width" - || opt_key == "support_material_bottom_contact_distance" || opt_key == "support_material_interface_layers" || opt_key == "support_material_bottom_interface_layers" || opt_key == "support_material_interface_angle" || opt_key == "support_material_interface_angle_increment" - || opt_key == "support_material_interface_pattern" || opt_key == "support_material_interface_contact_loops" || opt_key == "support_material_interface_extruder" + || opt_key == "support_material_interface_pattern" || opt_key == "support_material_interface_spacing" || opt_key == "support_material_pattern" - || opt_key == "support_material_interface_pattern" || opt_key == "support_material_style" || opt_key == "support_material_xy_spacing" || opt_key == "support_material_spacing" @@ -843,8 +855,7 @@ bool PrintObject::invalidate_state_by_config_options( steps.emplace_back(posSupportMaterial); } else if (opt_key == "bottom_solid_layers") { steps.emplace_back(posPrepareInfill); - if (m_print->config().spiral_vase - || opt_key == "z_step") { + if (m_print->config().spiral_vase) { // Changing the number of bottom layers when a spiral vase is enabled requires re-slicing the object again. // Otherwise, holes in the bottom layers could be filled, as is reported in GH #5528. steps.emplace_back(posSlice); @@ -860,9 +871,10 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_every_layers" || opt_key == "infill_dense" || opt_key == "infill_dense_algo" - || opt_key == "infill_not_connected" || opt_key == "infill_only_where_needed" + || opt_key == "ironing" || opt_key == "ironing_type" + || opt_key == "over_bridge_flow_ratio" || opt_key == "solid_infill_below_area" || opt_key == "solid_infill_below_layer_area" || opt_key == "solid_infill_below_width" @@ -873,10 +885,10 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "top_solid_min_thickness") { steps.emplace_back(posPrepareInfill); } else if ( - opt_key == "top_fill_pattern" - || opt_key == "bottom_fill_pattern" + opt_key == "bottom_fill_pattern" || opt_key == "bridge_fill_pattern" - || opt_key == "solid_fill_pattern" + || opt_key == "bridge_overlap" + || opt_key == "bridge_overlap_min" || opt_key == "enforce_full_fill_volume" || opt_key == "fill_aligned_z" || opt_key == "fill_angle" @@ -894,17 +906,20 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "infill_connection_bridge" || opt_key == "infill_connection_solid" || opt_key == "infill_connection_top" - || opt_key == "seam_gap" - || opt_key == "seam_gap_external" + || opt_key == "ironing_angle" + || opt_key == "ironing_flowrate" + || opt_key == "ironing_spacing" + || opt_key == "solid_fill_pattern" + || opt_key == "top_fill_pattern" || opt_key == "top_infill_extrusion_spacing" || opt_key == "top_infill_extrusion_width" ) { steps.emplace_back(posInfill); - } else if (opt_key == "fill_pattern") { - steps.emplace_back(posInfill); + } else if (opt_key == "fill_pattern") { + steps.emplace_back(posInfill); - const auto *old_fill_pattern = old_config.option>(opt_key); - const auto *new_fill_pattern = new_config.option>(opt_key); - assert(old_fill_pattern && new_fill_pattern); + const auto *old_fill_pattern = old_config.option>(opt_key); + const auto *new_fill_pattern = new_config.option>(opt_key); + assert(old_fill_pattern && new_fill_pattern); // We need to recalculate infill surfaces when infill_only_where_needed is enabled, and we are switching from // the Lightning infill to another infill or vice versa. if (m_config.infill_only_where_needed && (new_fill_pattern->value == ipLightning || old_fill_pattern->value == ipLightning)) @@ -926,37 +941,35 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "bridged_infill_margin" || opt_key == "extra_perimeters" || opt_key == "extra_perimeters_odd_layers" + || opt_key == "extra_perimeters_overhangs" || opt_key == "external_infill_margin" || opt_key == "external_perimeter_overlap" || opt_key == "gap_fill_overlap" + || opt_key == "infill_overlap" || opt_key == "no_perimeter_unsupported_algo" - || opt_key == "filament_max_overlap" || opt_key == "perimeters" || opt_key == "perimeters_hole" || opt_key == "perimeter_overlap" || opt_key == "solid_infill_extrusion_change_odd_layers" || opt_key == "solid_infill_extrusion_spacing" - || opt_key == "solid_infill_extrusion_width") { + || opt_key == "solid_infill_extrusion_width" + || opt_key == "solid_infill_overlap" + || opt_key == "top_solid_infill_overlap") { steps.emplace_back(posPerimeters); steps.emplace_back(posPrepareInfill); - } else if (opt_key == "solid_infill_extrusion_change_odd_layers" - || opt_key == "solid_infill_extrusion_spacing" - || opt_key == "solid_infill_extrusion_width") { - // This value is used for calculating perimeter - infill overlap, thus perimeters need to be recalculated. - steps.emplace_back(posPerimeters); - steps.emplace_back(posPrepareInfill); } else if ( - opt_key == "external_perimeter_extrusion_width" - || opt_key == "perimeter_extruder" - || opt_key == "fuzzy_skin" - || opt_key == "fuzzy_skin_thickness" - || opt_key == "fuzzy_skin_point_dist" - || opt_key == "overhangs" - || opt_key == "thin_walls" - || opt_key == "thick_bridges") { + opt_key == "external_perimeter_extrusion_width" + || opt_key == "external_perimeter_extrusion_spacing" + || opt_key == "perimeter_extruder" + || opt_key == "fuzzy_skin" + || opt_key == "fuzzy_skin_thickness" + || opt_key == "fuzzy_skin_point_dist" + || opt_key == "thin_walls") { steps.emplace_back(posPerimeters); steps.emplace_back(posSupportMaterial); } else if (opt_key == "bridge_flow_ratio" + || opt_key == "extrusion_spacing" + || opt_key == "extrusion_width" || opt_key == "first_layer_extrusion_spacing" || opt_key == "first_layer_extrusion_width") { //if (m_config.support_material_contact_distance > 0.) { @@ -966,30 +979,51 @@ bool PrintObject::invalidate_state_by_config_options( steps.emplace_back(posInfill); steps.emplace_back(posSupportMaterial); //} - } else if ( - opt_key == "perimeter_generator" - || opt_key == "wall_transition_length" - || opt_key == "wall_transition_filter_deviation" - || opt_key == "wall_transition_angle" - || opt_key == "wall_distribution_count" - || opt_key == "min_feature_size" - || opt_key == "min_bead_width") { - steps.emplace_back(posSlice); } else if ( opt_key == "avoid_crossing_top" + || opt_key == "bridge_acceleration" || opt_key == "bridge_speed" - || opt_key == "bridge_speed_internal" + || opt_key == "brim_acceleration" + || opt_key == "brim_speed" || opt_key == "external_perimeter_speed" - || opt_key == "external_perimeters_vase" + || opt_key == "default_acceleration" + || opt_key == "default_speed" + || opt_key == "external_perimeter_acceleration" + || opt_key == "external_perimeter_cut_corners" + || opt_key == "first_layer_acceleration" + || opt_key == "first_layer_acceleration_over_raft" + || opt_key == "first_layer_flow_ratio" + || opt_key == "first_layer_infill_speed" + || opt_key == "first_layer_min_speed" + || opt_key == "first_layer_speed" + || opt_key == "first_layer_speed_over_raft" + || opt_key == "gap_fill_acceleration" + || opt_key == "gap_fill_flow_match_perimeter" || opt_key == "gap_fill_speed" + || opt_key == "infill_acceleration" || opt_key == "infill_speed" + || opt_key == "internal_bridge_acceleration" + || opt_key == "internal_bridge_speed" + || opt_key == "ironing_acceleration" + || opt_key == "ironing_speed" + || opt_key == "milling_after_z" + || opt_key == "milling_extra_size" + || opt_key == "milling_post_process" + || opt_key == "milling_speed" || opt_key == "object_gcode" + || opt_key == "overhangs_acceleration" || opt_key == "overhangs_speed" + || opt_key == "perimeter_acceleration" || opt_key == "perimeter_speed" + || opt_key == "print_extrusion_multiplier" + || opt_key == "print_first_layer_temperature" + || opt_key == "print_retract_length" + || opt_key == "print_retract_lift" + || opt_key == "print_temperature" || opt_key == "region_gcode" || opt_key == "seam_position" - || opt_key == "seam_preferred_direction" - || opt_key == "seam_preferred_direction_jitter" + //|| opt_key == "seam_preferred_direction" + //|| opt_key == "seam_preferred_direction_jitter" || opt_key == "seam_angle_cost" || opt_key == "seam_notch_all" || opt_key == "seam_notch_angle" @@ -1000,14 +1034,20 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "small_perimeter_speed" || opt_key == "small_perimeter_min_length" || opt_key == "small_perimeter_max_length" + || opt_key == "solid_infill_acceleration" || opt_key == "solid_infill_speed" || opt_key == "support_material_interface_speed" || opt_key == "support_material_speed" + || opt_key == "thin_walls_acceleration" || opt_key == "thin_walls_speed" - || opt_key == "top_solid_infill_speed") { + || opt_key == "top_solid_infill_acceleration" + || opt_key == "top_solid_infill_speed" + || opt_key == "travel_acceleration" + || opt_key == "travel_deceleration_use_target") { invalidated |= m_print->invalidate_step(psGCodeExport); } else if ( - opt_key == "wipe_into_infill" + opt_key == "infill_first" + || opt_key == "wipe_into_infill" || opt_key == "wipe_into_objects") { invalidated |= m_print->invalidate_step(psWipeTower); invalidated |= m_print->invalidate_step(psGCodeExport); @@ -1018,7 +1058,8 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "brim_ears_max_angle" || opt_key == "brim_ears_pattern" || opt_key == "brim_per_object" - || opt_key == "brim_separation") { + || opt_key == "brim_separation" + || opt_key == "brim_type") { invalidated |= m_print->invalidate_step(psSkirtBrim); // Brim is printed below supports, support invalidates brim and skirt. steps.emplace_back(posSupportMaterial); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index b5a95645540..e5d7d5273ad 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -579,7 +579,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("support_material_acceleration", have_default_acceleration && (have_support_material || have_brim || have_skirt)); toggle_field("support_material_interface_acceleration", have_default_acceleration && have_support_material && have_support_interface); toggle_field("brim_acceleration", have_default_acceleration && (have_brim || have_skirt)); - for (auto el : { "bridge_acceleration", "bridge_internal_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) + for (auto el : { "bridge_acceleration", "internal_bridge_acceleration", "overhangs_acceleration", "gap_fill_acceleration", "travel_acceleration", "travel_deceleration_use_target", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); // for default speed, it needs at least a dependent field with a % diff --git a/src/slic3r/GUI/PresetHints.cpp b/src/slic3r/GUI/PresetHints.cpp index 305e7b642a5..2b2937bbf90 100644 --- a/src/slic3r/GUI/PresetHints.cpp +++ b/src/slic3r/GUI/PresetHints.cpp @@ -108,7 +108,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre const int support_fan_speed = preset_fil.config.opt_int("support_material_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("support_material_fan_speed"); const int supp_inter_fan_speed = preset_fil.config.opt_int("support_material_interface_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("support_material_interface_fan_speed"); const int bridge_fan_speed = preset_fil.config.opt_int("bridge_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("bridge_fan_speed"); - const int bridge_internal_fan_speed = preset_fil.config.opt_int("bridge_internal_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("bridge_internal_fan_speed"); + const int internal_bridge_fan_speed = preset_fil.config.opt_int("internal_bridge_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("internal_bridge_fan_speed"); const int overhangs_fan_speed = preset_fil.config.opt_int("overhangs_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("overhangs_fan_speed"); const int gap_fill_fan_speed = preset_fil.config.opt_int("gap_fill_fan_speed", 0) == 1 ? 0 : preset_fil.config.get_int("gap_fill_fan_speed"); const int disable_fan_first_layers = preset_fil.config.opt_int("disable_fan_first_layers", 0); @@ -133,7 +133,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre format_simple_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Solid surfaces"), solid_fan_speed); format_simple_fan_speed(out, min_fan_speed, default_fan_speed, _L("Top surfaces"), top_fan_speed); format_double_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Supports"), support_fan_speed, _L("Support interfaces"), supp_inter_fan_speed); - format_double_fan_speed(out, min_fan_speed, default_fan_speed, _L("Bridges"), bridge_fan_speed, _L("Internal bridges"), bridge_internal_fan_speed); + format_double_fan_speed(out, min_fan_speed, default_fan_speed, _L("Bridges"), bridge_fan_speed, _L("Internal bridges"), internal_bridge_fan_speed); format_simple_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Perimeter overhangs"), overhangs_fan_speed); format_simple_fan_min_speed(out, min_fan_speed, default_fan_speed, _L("Gap fills"), gap_fill_fan_speed); @@ -160,7 +160,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre surface_list += ","; surface_list += _L("Bridges"); } - if (bridge_internal_fan_speed > 0) { + if (internal_bridge_fan_speed > 0) { surface_list += ","; surface_list += _L("Internal bridges"); } @@ -243,7 +243,7 @@ std::string PresetHints::cooling_description(const Preset &preset_fil, const Pre out += "\n\n" + _L("! 1 for the External perimeters fan speed is Deprecated, please set it to 0 to stop the fan!"); if (preset_fil.config.opt_int("bridge_fan_speed", 0) == 1) out += "\n\n" + _L("! 1 for the Bridge fan speed is Deprecated, please set it to 0 to stop the fan!"); - if (preset_fil.config.opt_int("bridge_internal_fan_speed", 0) == 1) + if (preset_fil.config.opt_int("internal_bridge_fan_speed", 0) == 1) out += "\n\n" + _L("! 1 for the Infill bridge fan speed is Deprecated, please set it to 0 to stop the fan!"); return out.ToStdString(); From 4a125a07765a1cd066c6026193076595c0a156e5 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sat, 10 Feb 2024 14:51:14 +0100 Subject: [PATCH 7/7] pressure advance calibration tool tested with fair few combinations of nozzle sizes, layer height, base layer height, extrusion role widths. seems solid on that part now. added "verify" extended feature, this is just for users to see what ER roles need a new PA value TODO: bug test, for any values that get used if percent/float ect TODO: find calculation for external/internal bridges, overhang, ironing, support material/interface TODO: add more info to .html file. TODO: needed a more clear description of path when reading code, TODO: considering adding a "wave 90 bend" model, the "wave" style should make it more obvious between PA values instead of focusing on the corner. --- resources/calibration/filament_pressure/0.3mf | Bin 0 -> 1846 bytes resources/calibration/filament_pressure/1.3mf | Bin 0 -> 1645 bytes resources/calibration/filament_pressure/2.3mf | Bin 0 -> 1981 bytes resources/calibration/filament_pressure/3.3mf | Bin 0 -> 1994 bytes resources/calibration/filament_pressure/4.3mf | Bin 0 -> 1904 bytes resources/calibration/filament_pressure/5.3mf | Bin 0 -> 2002 bytes resources/calibration/filament_pressure/6.3mf | Bin 0 -> 2009 bytes resources/calibration/filament_pressure/7.3mf | Bin 0 -> 1737 bytes resources/calibration/filament_pressure/8.3mf | Bin 0 -> 2042 bytes resources/calibration/filament_pressure/9.3mf | Bin 0 -> 2003 bytes .../filament_pressure/base_plate.3mf | Bin 0 -> 1663 bytes .../filament_pressure/filament_pressure.html | 41 + .../filament_pressure/pa_border.3mf | Bin 0 -> 1672 bytes .../calibration/filament_pressure/point.3mf | Bin 0 -> 1642 bytes .../scaled_with_nozzle_size/90_bend_0.10.3mf | Bin 0 -> 1882 bytes .../scaled_with_nozzle_size/90_bend_0.20.3mf | Bin 0 -> 1880 bytes .../scaled_with_nozzle_size/90_bend_0.30.3mf | Bin 0 -> 1875 bytes .../scaled_with_nozzle_size/90_bend_0.40.3mf | Bin 0 -> 1868 bytes .../scaled_with_nozzle_size/90_bend_0.50.3mf | Bin 0 -> 1891 bytes .../scaled_with_nozzle_size/90_bend_0.60.3mf | Bin 0 -> 1896 bytes .../scaled_with_nozzle_size/90_bend_0.70.3mf | Bin 0 -> 1896 bytes .../scaled_with_nozzle_size/90_bend_0.80.3mf | Bin 0 -> 1891 bytes .../scaled_with_nozzle_size/90_bend_0.90.3mf | Bin 0 -> 1899 bytes .../scaled_with_nozzle_size/90_bend_1.00.3mf | Bin 0 -> 1895 bytes .../scaled_with_nozzle_size/90_bend_1.10.3mf | Bin 0 -> 1908 bytes .../scaled_with_nozzle_size/90_bend_1.20.3mf | Bin 0 -> 1904 bytes .../scaled_with_nozzle_size/90_bend_1.30.3mf | Bin 0 -> 1905 bytes .../scaled_with_nozzle_size/90_bend_1.40.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_1.50.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_1.60.3mf | Bin 0 -> 1895 bytes .../scaled_with_nozzle_size/90_bend_1.70.3mf | Bin 0 -> 1898 bytes .../scaled_with_nozzle_size/90_bend_1.80.3mf | Bin 0 -> 1904 bytes .../scaled_with_nozzle_size/90_bend_1.90.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_2.00.3mf | Bin 0 -> 1890 bytes resources/localization/list.txt | 1 + src/slic3r/CMakeLists.txt | 2 + .../GUI/CalibrationPressureAdvDialog.cpp | 823 ++++++++++++++++++ .../GUI/CalibrationPressureAdvDialog.hpp | 37 + src/slic3r/GUI/GUI_App.cpp | 5 + src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 2 + 41 files changed, 912 insertions(+) create mode 100644 resources/calibration/filament_pressure/0.3mf create mode 100644 resources/calibration/filament_pressure/1.3mf create mode 100644 resources/calibration/filament_pressure/2.3mf create mode 100644 resources/calibration/filament_pressure/3.3mf create mode 100644 resources/calibration/filament_pressure/4.3mf create mode 100644 resources/calibration/filament_pressure/5.3mf create mode 100644 resources/calibration/filament_pressure/6.3mf create mode 100644 resources/calibration/filament_pressure/7.3mf create mode 100644 resources/calibration/filament_pressure/8.3mf create mode 100644 resources/calibration/filament_pressure/9.3mf create mode 100644 resources/calibration/filament_pressure/base_plate.3mf create mode 100644 resources/calibration/filament_pressure/filament_pressure.html create mode 100644 resources/calibration/filament_pressure/pa_border.3mf create mode 100644 resources/calibration/filament_pressure/point.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.20.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.30.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.50.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.00.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.70.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.90.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf create mode 100644 src/slic3r/GUI/CalibrationPressureAdvDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationPressureAdvDialog.hpp diff --git a/resources/calibration/filament_pressure/0.3mf b/resources/calibration/filament_pressure/0.3mf new file mode 100644 index 0000000000000000000000000000000000000000..f18107e0e8281f4ecefcd353be1ad3d275b1cf12 GIT binary patch literal 1846 zcmWIWW@gc4U|`??Vg`mI^2aLwLxBK;2!pYUzHv%!eoAVN9++fg5MYSn0V`!lW`@vn z!(;Pj8;I1tTk@Cvi7m5Pd?UxL=_@bAsrg3NHyHYzKH|=zmi7I0`Fca&OIJ;1ewvUV zKfm~0`^((A?|013Ir1gnEoV)XQ|)`>5`Xn>vZLD8;^3n4-#>%zeVdvi!%&{=IB&|W z{MvdE|4mO9U%!_0;&|P1n~U4)BDU_CT^6$}7dN zCowyo%RLk|cJ|^aX1njkpWH0}D@%y$QsRtBM*}NWgEcE} z7c9+M`1t;dAL+r@pB3craH7f}@=-KlxV_u$f`ed^Sb*8m3EYU(Bwn zkolGQ{z|ALlWy6a!Y_4>`|hZJ;C%nS(|-OJ|Ne8{wLhb|mS##Ank|e>@7`s7@X@!2 z4{u*@>QK4YS|q+((YIBawXxu`#^k)1u!(1Gw1sB!ytpY;Q$DpukE6C!{kXa=m*2yz z1jgqbd1snx${5b?DG(0kQj6ny6r}I@aiT^2gi|w>BdrCiCaV3oFC544NaM%GD?4{y zZFYaLG;rFY$nU{Lh(xBFxk8z*h9OsA$AGS<9U$CLLso7rX zc$@uUS7W}Q_L_pjx)wJa?V2~gJ~Ugt(1W|?!@aE^4xZyYx30U9N&XVkd|SR7mIrT^ zUY4AGwua}0E?XhDq_~Ppp0iZ$61M&`^JMNgonzg(DDTyw3DTb7Mk!vOxwgJe)=@a` zQ+mV8C*no$irD)hLMQdKE;7Y%o>UPL^vL8t@uZk>-I6-TN9NBi&#Mydzqn7qo%@pC z&M%kRKh9V+JFmScGU}Yjr3Y^gc^~w>;E=C)MYr+myouVqi8`~gk}u!X@D=41s=CKy z5)M=&$IHj-!0JC~^6%5yXM1EUl4cgFe1ERUkv{p3z4W$EMXP4NDrHzSY13Q|r|DA* zpScAdy6f|yS9;^5V}&y|m^3T;@n>$GwAT3ZBO4aa=w%v`r!6LEmS?J#=c$}N<7+Nj zD(q!mcv5-BqDz$tr)zcjTONr04{V69XAD5eq#Pl7mtmPy7???;o%8cbQu9jULn;eW zi(~aFa&tiWG=vF~Ki@$phPgp!y^a_N*lGXZQw+}x7Ij%t%D*oE0e4Hutu$Y?g){Z; zZZE$S>bOyCPpZ-9zr4Zk)7~EuJeI<2_G#IgB@8ADx85)>TC}cW!tUj(PyhNVqR1(C z?8=Eo4Lhx=XBgs^8@V{VD@pt^Yllp==+?^1wkvM0+7+&*z!>B>)7j{@>)v)h|Gp!q z&&=KYP0>mJ=;una)25exo!Mw|#p;c{hI~|k{gslQb5g#0I7^Rg`?B&!N8r7!agVQL zI$u69TXV-bmg{q()>(D`*uDABelDqlOL^n(U;q1b;>7OnCO2mMD|0g_7PxWY=DGhT zCttpjWhq#w!p6P;oOt!e}!zs8ajSavd@dXgSZd z&-upgyH}bzB=%N()T(WqkXOIqr=q9p{d>9^8gk`n-;$pdRNV-?qq*#$HEXJ(;{@Y< zk}=B@PQ9&SU;a3&a>u0=#_2)!Eh;}wsu{D zzT>g;=#R4u%k=6tEUIJs)qLxq%lw+z+>dp`daveXZ9N(Mr0a~X_LQergEW=q95k zKXj9^CPoR2#JCh%d7vAP8d2zmqePnoMzq~vfw(!qn~hBe>U>C;KsZo48DKOIG}=$F d!u7F(SXbB}e2{d2H!GOO4Accu4+=d71^`pQ`E39I literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/1.3mf b/resources/calibration/filament_pressure/1.3mf new file mode 100644 index 0000000000000000000000000000000000000000..dd8f331777cdd958faca0ed394aaf231542546ae GIT binary patch literal 1645 zcmWIWW@gc4U|`??Vg`m&Y1cXaLxBK;2!pYUzHv%!eoAVN9++fg5Man=2P^4?_Rr~^m|payI=5lFmrB|pJV+- zQ}#&nrJ5Tr!oHMk=)KLcI#bKkJo#{|baleQL*Kg80{1KpY`T~c6`pvvEOzzOVB2qV ze)s(@I5lDS{DTQ?d-oaiJUejh(>ochj=S=DPb|NL^&N7wOk4J5$%=gwR))ot-`N?~ z^5^q}|0=I8N%7tFVRAj=U&U6qaDijz#_&T@%X>cG6g5eb*i{|sq`%`ypYq|Yt3Is1 zR?4OPy`*8f{QZM%7Z-*%zv@ru__$TFly~~FCF;iyFmYIabK?ES>+$_i*|z=f-&Q!R zT~i>`G}k}CV*Q8dw|VSdzSUheSv_`_pIY?)utTh~B+eT>Oq?WhCllrm`{*j{x4$D zX@T`N|2RW0h4X62^6cFCUQE_9@`52>uZ7ybu0_dF4@)9B-C-B_0Lb4ykA03#!TV!hU)HqbA6xs} z`t|JB>_*|A=Ds$1yue01#?$}rjPwid=TzExTjjFauTibtSbM4}$NJ|U!7PbiN9)Bmrj)zvqki;qlUWsin;KZ=UH8&4o|bFr8N7}oInpufhT4*w zX+c*uoh#x1K&0p34l(fweqIVgVwuOOdJK8xvuOv0EBtE3FAhkGF zuOc@Gl)OWr$@(26bu-KjI_q`BK)_D>2cKeiX0WKsl2ZP4`46~TN^Yh3sx6$UcXxaF zrBKI>VtZ1JKL6znexLUKh~TjlX0uPr)+}K#S-ACvdC{VE6%%$ZUw!)5R}n={xnoyO zG-}vsO+CX9x7^6Z;ay4MmsvYxsztX}UbbCvd)2ORH3h~X$C=JXw_W$P`}y}BIeljC z=5LBl`bR%knw>Vi^y|z^0=03hb|x^qiCO-NRXWWZRdOKRN>MZH;?;CDZxx ziP@Sv&aqsd6SdB&`^WChfA(`p9bC#AfB*X5rxPc3e>b@?<6oJZL9xJ%3pdaGKRNmG zl`Koay1mS(K~{Y2@ibVFaRY-az9==PSYHoBf`W>h5fVn5p+S|}f0pZzfk4Z7u6@oo zcHh0y)FH9A;-gk=GSt+w^*w)+sPPcl@!rW2$(7HzSiS1Fiy42I{c}APou!%;Hc2qd0_WVL&$-HTj{N zj5RSzU?j#n(8P&uIBG+he&C!M0;jM;6#aC7Hh5Vo!5_9QOPnbf@g70q*Hm}ArFJ^y;`2v zx8z>-RCRBfvwYg(Id2X>-~Y9_&Z<;8)rv2NH{X8Amd(pQyUqJ-abX$M;)oHEj>h_E6|#e|=uX%*w>mus?`r@1(tlUi1}C5?t|aI#brc z>~$3vKKo63GT&|MB$ijdCF}ltRku+-SUF{~jQ)p)N$daK3B6$An!{_#t7UH^um0gZf1bylh-2HAonE}~S2)+wObx?4CwpDJ zSMONF{m-AT{}VTd3dXMW# zIcdk|_fP+n{8adAg6qt%PhX#TJ!0oxKjmCpnT=lTmyRjtlbS=MQg_wY2CiLtO)PF@ zsnxZ%`R0>>!dH|JC+cq9_QP{kN4-Q`Ym<1&|6BKbjDM@_2(aCw$8)^8z|(uuJ-6M5 z4xZ%YYx{6KB|W(I|#)vH|VU_5d#4`?H_!K;hDjrE=x-J*X2LpZYjBy=Bu`FrrzD{<(EPoH;U~^ zHTwLQH~4+p`y+zKQkcy?EnBmM!DQjq8|Foe)>TZ{y?piQUtdKOIpvOBInk(Lr#1Bq zL)>yB7l(HxiC<>zkf|2kT6x)a#qCwQ!qpTQgB)i%8{Kx@+wSMzcjWY$xtqT!I_V$% zTxoXN^wO_08%?fQy|LGjk1DXgQqpry%6AWE>5*+;R{rP+ytg&(@s&*H%O_@Q?l{MC zeNNOmtL`7WH~-nsC3SEqZ~Xo1f1ggA*!|t)#*BYuZU)5yH!j>f_y6SN%U7~21?%=Q zqXt>=wa3$7LBhi# z-inV}wT%<<>NosU^mM&{Pgg@jt~~8q^0R`f8-aH;mmRcbO;vQ9V7yN1e_}uZw=8mc20p5&Ex(v7~6d9<;8h|t?95AaF35@Cms)YgFWYpw`ZZg)yD1ng} zbyy(AqZ^JIQRs%FM4JRgw8gW+3}s`}fjS=&CJ+v^-eiE$JkV(OXM^iw2eG2TBm)CT TI>4J1EXxek1yTGVY>3RFEycMpm8FtL~ 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/5.3mf b/resources/calibration/filament_pressure/5.3mf new file mode 100644 index 0000000000000000000000000000000000000000..37135fa686054839c97f3b2ca723f1f731a187c8 GIT binary patch literal 2002 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 T9pKFh<}m|xfz*RSkAVRI<&(vC literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/8.3mf b/resources/calibration/filament_pressure/8.3mf new file mode 100644 index 0000000000000000000000000000000000000000..8804502d5dc5a843e711f7cce55469b7cb8a139c GIT binary patch literal 2042 zcmZ{l3pCW}8^?bJ!xB5zRJ6k^V>8Se*OfG`Gn_Wc7`K|Dq9K#UU1k~~l64&+cMiGV zV%-h7tSlK*7?<27`cp`hajSo#JxBfjzjJ=i^Lu~q`#$G=KhJZ%58i~APYD13!Ot%M zbWZl5KJ7ga01Bw%l+~|XcfCS#L4UD400eLl`?3^}=iBvZXS*oVno!$3{Z9s$25F3Y zq%MY|W)Lt2MGn&gOwIok(m9|L!J_*u<(xeKB)AgOVK2Kp>dE$F2+416jC0sVtJwZ3 z$xJ(aSkJrC{Ncd}Q-?X}jzQ(7Pxm!#Wyk`}3yhc=cMROmf6_IpQ{Z8N?}Ui$aazN* zt+K1{d=x!(&*+qK8(!ae3aVe>HBK!kX^+sbvbBknFfwDToPC9qC$7!F*R!Oex`WhC zi@I3ZO=M?3pI$de_nbH=4$p*zDGWrN`B5zmH_lntvc53el(7CZSGr^hkNOGu!fsQN z8x#U=$+LS~DrI!S-sev^j<0?*&QSTCEZj4%`{$S#|Dy6kZIVqHQ&US#lTz;NMhTpM z;NdvBbKWc;Hg-cB{}+&zLPLY;pkBn%e5wBebMB3$k#QoFS)%2kgYd`v^Hy9}PuxFh zH6e4QXmK@T@>F;e~Y6;G42lO@)XOE@|%jW&vMKqGi2?K z8i6ujJ^yKIrP3aNUA!Gpxnmf^_{=7X$xtNT2B{CpqfJ}q%hn1 zicajdLt?ZTIc~pTbfDIgi3DOw1sH5cZ?3F%B8B_vlTD5f5MB!waq4Z3C6_d2ji=k6 zt6n2ZEqBcp2i9QRK(1!9#gxPhgfxRFzqZa-nlm8gqi~!yKq#7vzzCfXb?U#jjOn=c zA0I!|J!;v^1Gzd^uKG(K@{NU$E3}7ly0|U5_zk#dwO4So(hHLZrUzujV9gRr5(K zaZ>#i4@x-o+~G&ZLW9f=bcI&ILA8}Q!`Y+Ry~gC18ixfE7#0Yn`9fuAT?~gH)1Qpu z6i1&6!dQ)E-cK#-G08W&Se0sT(xaH4sF)*i6$xzxNW%e(4RzM0-eHRQj{%F4dv7M= zldjz{IU9)Lxad1Z;m3aSBtp+O1yEGnnyiy8Wt2(?^IEDSA*T>aW?_cO!eM0}5(+0KCd>GE_>zQ6H<059OdZYQ9=9 zykBG5B})7GBpmP~yf<9TAd`Z^<<-tT-TNs_z#!AIvJ~LO>%G zk&AxfukXgTU7$8jyKh}iXGPlFoqpe}y2&}Y3dA`kXnR}9sYAMzv@2DTHa3>{z1Lcq zx%CM-AL&20nGok6Qqty}3+G?Z#3T3~xSJ-SZr6G}$Qor*lT>PuRM<0FC)o_wW;5sC z!`hRm%l3kOIS*sYLlM&8R*?^?HxTBq(V&2TRIXgE4Zn?rgs#sfZxE#Ef#dRo}6?JXAhsyjQ-OlLX zkFkm;Wa!y*_NUI+J`VY~*sVt1{m48Artg16Cj1%MMGumTr!soS?w}Ip*=1C*hl&*4 zE!3(434SW{2s^|aUKwyJLgNqPO?W^`!2jz;u)T`~eD*sWzVA&E-}R=wEx@;t_m|(d zk^g5gN_v!k@z<&V~31(pc literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/9.3mf b/resources/calibration/filament_pressure/9.3mf new file mode 100644 index 0000000000000000000000000000000000000000..58fe1bbf199caf3c2ad2101b58878f2098fd9815 GIT binary patch literal 2003 zcmZ{l3p~^N8^?df=CU|DHCh*A|3=C^w~^diN|+Iaa-3TKnhax@bU|q|Ws+7de`lCQ z<&q}3bqF09P6gpWDh{-1)DR+(8UBqevTKw^#R_dj6<8>#Q35VZzpXA|n)(!+z_gK=y zh>3M*A(XZ$#zyG6;D7l5Qj{FKF!P9&yMg%B3Yg+vu5qS{KF>D>I6cxX36fy;KD3XC zeLZ($YQL=pf+beav(dl~U665|(?qw6EbgEW3MyPT=OYx!Q+|o$+^C%SL&#}CUA1Sy z;oo~oXATm>BG1&Mjbl_kwrS-%8gu&c-nbR)DJ>@8&130j?lnHJqJ*e$y;JR0NA=~< z2marQmRKvdoU}*HYX(S!n;pm+o1kHRu2hPYDC5L4V*o z%PN@2W6x?;`XAHrAdU4kakketeGv#!Y+dl2eH0pT%$w3C!UWPYIn+Tc)!8IfpvPX- zdDG?H^JlMk==$f|jcfIC2e%|c)Iu-5w%-9OQ5h^;J9%02ES;)L-w=H~F@P>M#9IcT z&7p55bu#7xpoVf`@Hv0tL{|4Z^_UDrP?^r8_Av`P47FM zes@ZZE2mzYjZ6wH%tY8%2~B76l@=b3?sJZ|pXr!v3NFaOY_1ada$zM=7Fs9XrOELyyZ*$&cq9GFz<_wK}hctcNzz4VAV#I+oxO%gd1`OK|P))AljbhC@B zg;|@e9eg@)4B4$*FIBoj%ih9<6aTrHn4zvv)(tDVteTN_eiv&o%r5F~xTH*QQ$wOA z))6D^cJi2q%k*kar43VRKPlL&uBtLA&L~TKv7cv%zy`t;Zbt zv!20wuIlCS1N&J?*rfIY)UdpG#5D41m+7w_s?}jv-v07aE9l;8%GjMjCbk;G2ais) z_(&Mm67b7c?#k~5LU1b-M8V5I@J&J1EGmefV+bjNK#Bultto@IzwWs0#m?FbZtj;FTideBXHX7?O=7Bft6A4aDGghHt2?Fe15qy=#pkrLkhVP(t%~$vZSGJnkrXoVlg4UG7$~N*_YAORK}mCz1QX=u}0yr-p=Rk3;Z;JkZAey=~~&9$ijPuuYN-YT|^c@CY%U2 zG+44rsGu^-jLM~`2q{mL8jN7)I+W@hd#n3}@iatj^!u%+;+Ui}rJqo{cMiPN*U>>n z9i2Hm78=v*A=*++Q?BiG z_vSXpli%L8@y-5}tPTk#Rc#VE-*1vU0SXLGm*$>^%qH~JJLSY?LWlLeFLslNJig~h zQk%Z+mC;+D6R|MfC3OOLf41$f?<)*0f{Ha|#_c8LwDh$&7a5Q~@NZ*gqx8qlF8U=7 zKMozl4?{<~1^7Pm%J%y{^FKBt;)iB*kWRMmldmk)_sLh34e>+SDB$HY<6IyRJ?Zh6 rnJmA^O22*ctE6QoK>pq*zw{LL)dIj$80P~18kGfPfu;3J^Z?*5BsNjL literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/base_plate.3mf b/resources/calibration/filament_pressure/base_plate.3mf new file mode 100644 index 0000000000000000000000000000000000000000..4815007b066426f9d35d8fd4537465b549689bd0 GIT binary patch literal 1663 zcmWIWW@gc4U|`??Vg?3}Yguvsp+JB^gu&QF-#8^VKP5Fs4@@#L2rx`x2PK?oZT&Fg{|glx9*x464M=aH@sq#?}W#*U!R|UDvtZ6B7=7DL-y=; zX2mx96Z2-q-v1ORefNg!b=ywY^H;7IP-dQ{t>r5HlvS#)tz$OHx^$D??xqVYhu_6b-5~B`aC$=0-ZdZA zUn>(*{%vyL!SV7LhchIWPJAq==2R1VAxf)J;!jpuil-lov9!WhlcLN!94Gi=%B%Ls ze>GVU7Gg2WH9qXZp16nl+cj$*-;VZ~=CO${c3H_^_af`dEjMnLiq-K4yiPy=xsdgI z`|jQO@!DrxrBbJCbT|?ysIrH%S&2U~;Cbtb&uYGprOrLuP|>_x=+nkSUv4fl;ooc( z(YE_hS&8S{Q~oF1pM2OoV;8@h|2r*F*Nx@P`}11eKJYcGZVWH{FFm1h=XcR_b8Bth z@uo{#&e2{|{6FBptxIkV-#?jcQdw`dY|91SE4ABit-Q=*)%H$caq^QsC97k3tHZ5} z+nT3}>fJl?R$Qip`}p*nM+rwiR?5UYn=V|qjN425&hCFU@;h!kDDG_1m^?BAu=Naj_oNZDQ(ecFrIHxLuA|jpJUvi}ML%PPzV14e%{D)nw!hOCyZ4VV0423^gy>y{ zrFLOpYL9l#&nrpID~S)OEJ!Vm)vL(O0VVhlXhMGnN$(7EgU)&#F%YoR{=ugho*69a zvZR!MUH${^mXcd(zG@3+>fPO5eks&(qu8EQqtAbNgWspUKO%T6h1u-WvNcN>Ocrjv zVP3RoUB!gm%U7TN^;JZXQ|{Q66O9^nT2s$3#4R^+ad=mf_+{1(nQGCkm6vT-++MXS zTup&7$Z@8#(QVhg?SB4!M^2xayZM`;dB|Yb) zeD`pc9@+L~<&TcQdt2ikU&(a7d}6ldj&m&6=R~cu>i)5N^Pl}(QU{mv#^1mG_vyrm z-QP`a%=lO4W>73}9iYLFFQdpr#mWZb|Yi!VyeDc08mk)WXB zW`u;%W@u2Q_MhcCWFXLTo@<};joo*zG<8Vqt@x-_+c+Vwe#1{iPuKhRbTu^O%G16j zKP#xZ5qL*)*+Fa8R7J-L#``2=mM5HgTgAToaaQGyODl}igX~*WewxT7S&CA+) zGWbc?8C~ruPuKiza}(IwC!5L|G1orn<2JosrgaL8&mDhk?wBeb;LXUS%Yds$l!1Dz z0Z4I*DY8J^9N^8y vrUP|8BupS2W~dm9=7C1LAS+xSxRQ`%gYZGp0p6@&9y0?o14un6^cWZbKij29 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/filament_pressure.html b/resources/calibration/filament_pressure/filament_pressure.html new file mode 100644 index 00000000000..019e9cee723 --- /dev/null +++ b/resources/calibration/filament_pressure/filament_pressure.html @@ -0,0 +1,41 @@ + + + + + Pressure Advance Calibration + + + + + + + + + + + +
+

Pressure/Linear Advance

+
+ + +
Needs:Bed Leveling and Layer Squish to be perfect
+
+
+ +

this test is still in development, beta should work "ok" for now though.
your current print settings will need to be saved before clicking "generate" since it uses the saved values to create the model

+

note: this test will auto pull all your currently loaded config parameters and generate a model for you to print!
for to help with firmware speed/processing limitations it's reccomended to have most extrusion roles similar set to speeds.

+ +

How to tune your printer for Pressure/Linear Advance

+

todo add detaisl here

+

Advice

+

Before doing this test, it's preferable to tune everything else first!
i would reccomended setting XXXX to the same speeds, XXX to a slow speed, and everything else you can send it with.

+

note: having large variance with ER speeds can reduce print quality/dimensional accuracy this is effect is mainly caused by the inner perimeter getting pulled closer to the external perimeter as it cools down, since each perimeter would be at different temperatues.

+

TODO add things about PA and setting first layer correctly
add notes about fan speed and disabling fan speed for this test, or do i have check box in GUI that would auto change relavent UI tab?

+
    +
  • bullet points
  • +
+

Notes

+

TODO: add cred for andrew ellis testing method

+ + diff --git a/resources/calibration/filament_pressure/pa_border.3mf b/resources/calibration/filament_pressure/pa_border.3mf new file mode 100644 index 0000000000000000000000000000000000000000..baf634479558412f218141813812dac189bc5bcc GIT binary patch literal 1672 zcmWIWW@gc4U|`??Vg?4SLTAqZP$0k{!eH#8Z=8~wpOTuR2PPRA1Q=GbgOxIDWrEO4 zLr>@3HW08`?(n}c;k?n;I*FhnO{OnF3o?rNenhBisRT~YP=0y6T=U{aSqIO#w+wP7 zZZ_V$`^m07m08l8+7s85hF?s09LzNL%BpvAT2?dXPQN_+_4)ay!n89uns#qo)PL+t z^f9-e9J=!6xw`DOujbzLxVyz>(VF|#rq#MHhr=zM8z`KhQH96q~iTj}L1x)KsA zp58ILbIS4g-M@3hcNN}_)3{uevbwT(%B-__zqu=aIj;7U(rHij;_o}s>cdoVyC6Bs z^7;I;KlPXCt$ldILP#g6?1S+sZr)yn<%~<-@su1(3pcP|cH{19q3VO8=5tE+w08Yl z<;y%}#&bFOx|-vrUcVUKB);tsxbXUr_yx^FAC-S_s9Fo0$?3RqSs`(YzsJ6*yDlC+ zykPmfE2|bg)Tz3o__@w?|D9z&`ttHMqm^!EzSy+nX#Rw>Wt=NE-~L>^ke&7L-wFfU z`Qave_wN4vZR?_yJgpv^E(BK|*=zCakoKlUA3~-SF}hAlXOufvXV`v!ZqxFvU;1{5 zHFKU`G>#LyeMxn@_I3t;mXC1~Ig6C~x%ar9pRsJe=Ar}qA6Wi6Zt{I`TU^z>I}bKdu2YU2-{5D?W0q?K4r7bFQ@I_ z>c#8-vId|edyWvj%dliG3{3XX&iQ#Isd**wA(aKG#j$!7xjCSe9|BGB?;r`EVQ$b_ zuOkKmcG^Gq6vH!vMO~JZ@~_K(z}-@EE6rDJ;Y_`|+siM7I&Ku(lWO$&FK_VswD(5@ zkEJl1eOk6=34_VPtvAez7Okt8uzUIH)4#roD00djyK}cFa|l!bT+!}y0_iWzwgNDGjlh8Q*_cl`nl5VwCSZ^XEvH# zv3g^#Asf2E}7oRse#&e9{>zO4Mw5qNKF+~X^m&X-Tj*4%N9<@%hcbynR!c5nW( zpG)fCQr`Ic*Z)49II;V?$&DHR%G?Z!1#VopdG7zo$(OHWSqj$eWkwCM;%kqm!Geq% z7-aE9sX4{^dLR-MRNRb^Fxm_as?`3oT!#z}_|-)(LJTl-{FStI7!Cw<(e*UPj{f$_QHkIfxZ z#RI$jT#oYHScbNIJlq70hF1U}gZR J2ZbI30|3(Lw_gAN literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/point.3mf b/resources/calibration/filament_pressure/point.3mf new file mode 100644 index 0000000000000000000000000000000000000000..5a5e03157c1d3fb073decf0736c6d68a94c3d130 GIT binary patch literal 1642 zcmWIWW@gc4U|`??Vg`mgN;%5^p+JB^gu&QF-#8^VKP5Fs4@@#L2ry)`gOxH&XM)gE zLr>@3HW08`?(n}c;k=P*;I+dOCV2}kn9k%nn}5NH&_zy4ter-a>T0J~9Vv@mx{>#W znB|6%6cN7L7U3+mas znUkAqn!v z?DK_!etcWLf2fVRaCqU~pk<;b!n&WSn9j5<3I9~GH*oQm8GWsqak5jxjixHxa*K#Q zt@$sdtKO_Mm#;ld@t}&@>iLdwnHdb0-xPYcEm+&Fmt5zvahJK}H7AWk){Bc;oBplH zWu9_lI-mT$+M}jkyX4qj^zRV35N*3nHE!0Nwe0F*E;BYxH`t-BV(W2v#=ni`$?jR9 z7Yc-|-%iNfzhM5m~=t~0AV zm3E4s45>_A(K4MSF{pLssfr`dubt24)}2{-x8MN7wTX-VtXcEN;Oiotz#odq{tWl4 zIj0D;drnvyYU;mXj_;=z+;?}?`~CSU9e|RsIYRUUR2HNb z$Ldw&=77?62sBNWju;5oY5(9;49^S}by-r%zb^j)cT35wG+(uaGxhFn zFTWJ(xKV6Rs?q1ayut6&-X9S>mcnfIY1x`33?>V=-Y_p(w60>p?&Ygb|N1JT$SHU1 z%85n|JFTf_7~+;2xj4KlN>vhfKBT*2>GaD{ima6|Sbh800w9+32?G-gZC#z9Xm4 z%-#G=(MkX4=Ss8Frk8%5*=Tab>W#gId{lw`m6D!wQoegQOOI^(vhqhq;JvMJkFR7p zUp_HgbH_QB>vN*kS#|%|z4_06E~$e{dE@V2|NC^}#P07VH)i}Rb2BIwxN+g;x&J38 zU%rxMDOk6c88yg?uRWdy3o>qCki{3J<`nDefk;qLaWg`~XfrgZQv1(x9WoGTInTAv z`NrqNnTqd%7ALa^-2?lAje+-3Yv+x$K}dYpSB-1mk^@ zG0PK9y{%$j{y3|0$E6j<=|T1_DnCxDveuqU?4RM|AGZ7ud(oRMc2RSG_QR^k9EU(ujXZKJsJF@>x{1Ul&5Qcx48*y?UPMq zjhJhn^l_VBFVi{&#^;VdHg`-F5AbGW(q+I^`pG~&)&QhI;ec5dN???QP%RATCZi@l zbd#|rMhT3>coUj9(G5q9D0IV7qD=xL+IUzXZVvEfW7B~;9}*@I4l`5?M)N?U{SQJP cxIW-ugD3<^2Y9oBdCUyV3?TKO&|_c#0Kv7TrT_o{ literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf new file mode 100644 index 0000000000000000000000000000000000000000..a43b1d3d8476e2212aa3c787c2b41fdef9ec84b0 GIT binary patch literal 1882 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf new file mode 100644 index 0000000000000000000000000000000000000000..70dd9d8936527328a3bb1f27409bc21009aaf436 GIT binary patch literal 1868 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 ZBbWrzKz4vPD;r3R83;k@L7~UM003nI5as{? literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf new file mode 100644 index 0000000000000000000000000000000000000000..d4414a24389a793e637f5b0ed36bf9a32f15a823 GIT binary patch literal 1896 zcmWIWW@gc4U|`??Vg?4=wUt5tp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|W8%Wrom8 z!*Ay;u@I=8H}#qPgzq!EcV2FqIX!eqtz_ob$GS>(=bGlO>j?z2J6|?T=XW-1+L4^Q<#dbC*APJ^g(Ble+<(*O&_I zMW48ydVH`{{hyMRnPu$ZkM0&@=r3y7tY$*Qlzmg!dk1` zXlhfb?&M7mz5kt@^gk;rpLcoKL$U>WR|~`SR>c|Gs860@sI1TO-Z`1S$}?3YE?pTrZR>`^Q;wN+KV;{3IaL#t zTE}5q6?6AsdVJ^gri%2%NmY?w4w}r7ymQlZr~j+gimeR(!s=X)E;OI}$(UK?CsrZo z+xe9(rtkej@r~D>l)2Q&F!?A5SvZOXaXkxsT=!&|^z1ahNlPQQWyRS3^!a^{wmB>RN>lFyj0KsnNdz#&a-F1>R-Nf=C-{NsJ?ziUi@*` zo7fY}X6&sju?xH1_tRCc{QlfKF^A^&{@c0N>eR2^(nY5;t$tR#j9kvZcWY~>w9J~A zhYQ~7vHxKcUu&^LW`e%SqXgEUB7AwZ%<^}%J5Gn$8S{m$D@cpwYA^S6N#&{IJ*6eQ zs^P&Eh9lLP3y(-SUeZWx$|~h$EfNk1?O4R0VtV~gj)U{r+Z`tzEHAPZ=7zo&D|KL*$&kPoISyIZsF8={{OUbP?U$uoZ z_3myjzZB}YQEX4D(dWOs!SB=F9}zs3!ff_w*_tH`CJVRTFfUrPu42OO<*QHs`YNKx zDR=D3iAD`Ot*K`i;+7k^IJ_%K{4#5YOtt9N%FDJZZm-%EuBN~kI-TY0_N&o2QO0(0ZmwuhuXmZ8sjlG6^RDu1KlAd!?zI!-Jk8Jz0@<&JDy{&PN zuVgx3J~3N!$2pekbE4K+b^qAC`OkhXse?;-Gc>4D`_FP6G7xAv z&$Z9_#_qdUnmQ!*R(#Z|ZJdx-zu~8%r|bQDx*8gCwKTfK$)}Bl3pW)*lw)_x#(VH!HQFDLx$g<_; z?NYwuvGeGUvkc4h>NYH@WBb*7>!8d0n%Ufsb;EkE=4EX?8T_Q{jIQ>Sr)z$evl=Z-%%cT5!z@MdJvWx!ST%RoKW0Hi_TfLRkrVAKRqEez-; zqb5Ield&d735>*e9a`O>8;%-L=!T<2n*>I*aj`<&9N^8yrUP|8BupS2sGSTjng<%~ gzYzM^K`Pn6Bm)CTI>4Ki4J5`4gdp{x&|_c#0PLa}@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf new file mode 100644 index 0000000000000000000000000000000000000000..e3f3e98bab214395290973607fe5ed9693fcb892 GIT binary patch literal 1896 zcmWIWW@gc4U|`??Vj##oxAH#}2r!5+7`x~jr{w0Rq~_>>Nk#?%26kSE(y7c4dTF?C z{t^oT+w)$Z)4%NFn_08+-+ZO7kJ*D@bwp32BST(sevi!WI<*QS^C$H(-<%x1#v|-Uz=nx%PE?s`jpA)g^X(2OgcS3#fC5d~>f_4S_wPx4HMy3bb>>fN z+9Q^ldYL6sA30UNZOZ@ku<}Je`*OWvA)iarWz%n+KRKV@`UkJPT!+2;uj>mx2gUzc zzGPm8gyFK@-e80a)smxW1ePY356|OrPUCidbmkvGES>k%6 zQczuUL3;Uz?b=tf{a)N$Ar-GyYrtF1=3nObZgOP6dcFrY&pqb!Wh(f{d})asf99En zAG|yEG(6%jeD=i5rB24EyG5?Q^3X!_fX8)DR!L7U)PJb?eDkrZm*2Z6Jn%d5-{8aS z3s-Kxos_};eok-ugH2m6^k;J`UT}Ku6+7=uY6NfOS>1#@5n%?I;m1lGZ$5aZ@w;h@c&+99-LH+W*8RQU%bnb=bm89N9j%;_ zOa6*%tk$!rPM4ZvDfuQPdb8w{oj1c4ENd0h2sz_cbvx%<$+Er!Vn&^}t(o~haAhnv zF^!j4=&q|a{hjHhj8w<8f1lEflLh=5(p*mcsdPJBsrflS?cf@VYrd6or^;+Pz2~Xr zsW#nc&Chu$rZ{<>&Z$jFg{+%HEc_E9*M`16v&Ukw2cKeiX0WKsl2ZP4`46~TN^Yh3sx6$U zcXxaFrBKI>VtZ1JKL6znexLUKh~TjlX0uPr)+}K#S-ACvdC{VE6%%$ZUw!)5R}n={ zxnoyOG-}vsO+CX9x7^6Z;ay4MmsvYxsztX}UbbCvd)2ORH3h~X$C=JXw_W$P`}y}B zIeljC=5LBl`bR%knw>Vi^y|z^0=03hb|x^qiCO-NRXWWZRdOKRN>MZH;?; zCDZxxiP@Sv&aqsd6SdB&`^WChfA(`p9bC#AfB*X5rxPc3e>b@?<6oJZL9xJ%3pdaG zKRNmGl`Koay1mS(K~{Y2@ibVFaRY-az9==PSYHoBf`W>h5fVn5p+S|}f0pZzfk4Z7 zu6@oocHh0y)FH9A;-gk=GSt+w^*w)+sPPcl@!rW2$(7HzSiS1Fo`P2I{c}APou!%$h&~qb7iAVL&$- zHTj{Nj5RSzU?j%t(CP-=aMXxGHykC}Bru|lixuML0B<%n9jNmmVFKYm?PP$_JkV(W fh0wgal07K! literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf new file mode 100644 index 0000000000000000000000000000000000000000..802393609ddc39bd5e04f48e1f2e00e191996db1 GIT binary patch literal 1891 zcmWIWW@gc4U|`??Vg?4q^Y3T>hXMfx5e8!yedCne{FKxjJuu10Ai%)R3s%Z7ff+(C z4L_Z?#6l#t-1{^CiOp;|_oghUzT9OpdzzbZr2DZQLQyte30^O2YVUKGt(w$1(`l|w z(1XXt=W1`12G`WSi+Zkee5K^CNe2Bw?%$GD%>K7gWwX^T$)CTT_Mdk(zp|;6;f}v* zWzegV4}U#vPWJi7UGFHI(YE;0kqbW)?|!VaD_ZzWFrvn==Muk0cde8_`a9{+N$WCi zFPrSu$70E^>uz~-_xJxg`oCUYcsu2##Rk(odp&g1_?OSMSzfpzeW8NvEKS3{Rdao& zK8Za&HS35_{jMYXXWg28c;!`<2}iE{n0ds{d9ui7jiVQ|Z)*4Geb01Ruxmco3fA>I zANifPj+|64ebwvHiuvjlKYm;9Q9hSBWwOlq4^0#GEo)b##QXFA{qX71srHqX6N4X0 z&uSI^aM*^+@}aPY%#jOxj~`o{QD45&TS({9bkX!k{gd;{Isdekmmi5Q|8+h3dbsmf zXRfUm3>Nuj`}1Epy`Ve%z4z^=?}z{Xjlb^|#HnUN)&u&3pt?BI>3nG0ETX4NJ zv`$*G+WN=s>z{V2e7U+}&OEVN1KxBt?cHqOJ@-#I&-Wnmk*kPg=V#$VOXB1%%}6~` z$*8Bl;D_@Z(;c$b_V<{46oe`Z1>7TdWZmhzQ}TGz9q-RN=fitftMjCIvxw!l{Ap|a ze{)u)=Oj1IJC@en4>qk`E8l)LNT2s*_A)*HZzef;H+yswF2w&nVz&K_K=t)A^6HP* z-q@`>JL%oCi$5cBtIyXz;rf5~q^?L!?w9_zR|C!R=NLyz{grvJ^!c2_lMZn1mbqhY z5wY`->#m_l=o&XgI-98#(|0gLk%JUGO5RWj)XbL3mgdeejj-;9#32-x0oIM-{FS=qeh zIj46s=iaSP*fRRvy_2I3E{T;q%$nM}Tk$PhrvI*$=g?K8X07P5UpqtmgRCHb?@%ALC;c*Du6pgKK)aeYIX z*WBX69JX18nY+Th7mGIQ)D$znGUQNquvHTMXSMj@o{%5;X$Ke0n!RlwPpamb*hr~e zrJ>yBLONx}a@X{HX9`44_@Hq~IO3wlO-pV4a~TutjBjpK@ZK?H!_-YzdUtrl$~|`v zPYIQCJ$q4*~U#djS2pY`CfegI02<_OWd49n5Nz#JXzoS#>cnpYAZQdy8% z9IIE6n*++!Axx0W{0>4f%nds0b;LlxPWuO+Vt8h-sLPU4{&o2exLZnYrTMBYoT+zr zd-NX zX71*1icb1RKUbQaHof%g%tn(dR&VSzNzx&;36+ z`SO)4OToIm%&0+DeC_cxSdei8gDk!%HK$l#4@823iklGyUv!%XzMS z&Np`7z0%YnvA5!*R&C>iy!s746+K<=-_zC5kSkC7mi(-s>PFxl&1DCzSyL4qCm8RO zj9H#=>TMPK^2b?~J1(s-P7ktgQTcIFm9_R>&f6JU1xN)r#xNryUk5tYoBZ? zYs6gpq>tP5dYRTKFg|zuvAJWacz`z}lP&|UVqXU8u?8Rw3J1(eKmwx@fNEhtHyJhg zp__~~F-l-0#!Jwe2HkMfh(b3UCE6q~qK%am;^qKvHZ~oo^C4jZ;Xv(VfYChAX#a}P d#|~1-2qu9vkR9O7$_5f+211Z}Q0Or*003^_7100y literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf new file mode 100644 index 0000000000000000000000000000000000000000..c8915c80977dcc3a4485b422480f4b11b70164eb GIT binary patch literal 1899 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf new file mode 100644 index 0000000000000000000000000000000000000000..06f9975daba62563824c4693b908708ea447b795 GIT binary patch literal 1908 zcmZ{l3p|s17{}km<}zcG9J$3QQrOsbgf1*pTICwaWiE|~5fe&s?dsa0NF!>dNXm5# z(U3MPquiSklT+)$aSey)d_L-&_w#w5=Y2o_|MR^6_xn7*&tr)f64nL)Ky>j2fNLi* zr508$I3NRHOi`F)e*VXZzR2$u1i%3i*!QhKj?l8F+OtS^^ktkw@MBU>ONQNaEK^mw zOMh?8qqZG*m7-e|i%61Aw>Bj3CZj32TwQ0Xx$KtSX8z6DVphv1LT{5ni(BDrkxB>j z;>PW5_Q8`*$>vIZO7yzf!4t11(tH(x5D%P7s-fWQIT_TWq1&CW+((+{Z|!KSh_EeV zWJ)^adjqnB@tE-^kxdbBX|GYA!^!2O8&zrhC4~(pVS5d_=}8Ohwf&X;{;A#u#V;8K z_*T!!W`(ds6T-pWI76(ByJFflblTMlnEgH3pl|OL7u-i*DJCYUM{UY$dagmjV)yI9 ztj8%=DGeiNBUj;jvuYQPe!i?JAT!dy(-n3Jn-XVE#@6$AZi)KMxWqvHdSSH?htIap zisZAa=0Dy~vGABvZ|>WM#cUp!^@ayB5&J%v@y4Hwy|CCzD-xIHaQW-JTu@K5rNqAN zk&Y+w1n*@da8&Wh+wr4nyrmHMq8x6m@<3(9}mTW=HXsqg7cJYe~>!doS`G(0TJq`RHnagqGnw8tk!bG+TG?|a(ZK8 zGJhe8=i47k}T(Dw$k ze3iByCRozWPXBoI7^v=XBUG~1E;-5JWN~!3yhufDoRnZ4v%V%S{FGv0VZbS8#tyzQ znK{szTevYtUi6T*v3Pg-7TvwB(rUhzw@J5*Nim}mR^w5H6F2J=bS%%T*OlA1xyP83 zu){knrj##+k5MA~wZL8|CtYhQjW(}FpNBq^4>9Y3akI!a*#%=5enj<1Rop`p#PLsV zP7RS*u8Y}+EDYy$hCEF(hT?ldFCpB&9F|W~6^e`R-iOL;Rp#^|x^^1|obhr6*&A=C za_DZc%4O-;{sL;-W!!Kry?Y!ZN{F1flsd~&fbsD3b6;fHth=OplY2AtnP^066+%<< zI#o9~tTEm3Yw4YnwujA+AW_8(yGOyYF5$OvGi(;}P{U;mf^OvmK^B<4739LRLR5#M z%|v83jC{>v&p9ZEM>&3b0NFJsY`IF}qPEEP9}-`?C~-#ok8dMb>->zo@(Nx3qK?Mk0NwMQoi-u0rJv(WNqdxwt!BBDlUHL{>rgV%l_gDxT? z1QLCNP{<{_gbE5;W>m6*ikQ?Y-k<}IeJ);W(pBBx5q(jvCiKhJvr);UbH&rD=4QOt z+8P?lA)XT+!vUwetopX()o%wARdLCf+VxH}*JmG3i_ivr!YaA>7%yw1*iBO{YT&aR zx1{s~7Iw4-k-!h7yN*((4O_2UkYV&&gL8>gVLE$|mI|TA?oXFCX^mhvYOUssc@b^`r#i*tIOY{KXA5u>xSpWb4 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf new file mode 100644 index 0000000000000000000000000000000000000000..2ba7117cff7141d8adcdfdd3f2ff69b18684ad9e GIT binary patch literal 1904 zcmWIWW@gc4U|`??Vg?3*`TRWpp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|WANWrom8 z!+rDT7zo&I5Bkqsbe@eT&Mxdi%qow)A**i9QNC6otYsIL5awA|n||P)YNk*5)w7BR z>*jq=dp2`!in+h;kty%U)27>|aPlwP<0a<`&jm67^Em)d)U%l^)(+1L9(ea~Lido`D$<>pS` zbvIx0ib$KFZdCTJ^gIT=d0YLrvA(^%dv|_(aS&T(Oi|pW+8JD@{w`UtyH+G{UQWf# zH;-F7g)VHi`f+#KCr$N#o-1VJ)awLz%h{~0)xSIHpHOH2(6hUT-BC*Dx#XoUcTK*S z>nNV%KEhP^L-E|4JEH3M?U^Pvs1!X`;cPm4rqHq|ls9#y^m5Nx=VZFoeNuW^%=BCS zv^Uht_}nW~4i6r^oUg|@<8l7A&0 zc%Qdyvuw1k-M3?X!G_HT8sF+z>{#5Z)*AvN?`>^SL7oipty*98H%^h)@>j6fs+oXdV!d*!+si@JeIgTT^>ZgMeyj z!|W4ssR?JMT4h!>Z@JDH-ORdo%Tu)pNJ4O^!Eu9xSJew~@M z|6WOMVu=RRTe)MpJ|4<%V_m+_DJ)CRn)8mw>Smf*ug%O{)>XPG3jz$IFI-RCyxiE5 zNq33xc57zo9SpaeU(K4`@gT6<<8hpCZxD~s=QGj){f-uluLLzeKa=ErzVuABDRMz->+J(jvNuPF-ep+!76xYT zXy^RAlGMDC_>jti)Z$pZirgGf4i901Rax2YOZQ)G4yW7hzg*t8&+mmYa`7dwq`?U8*1dpXKn|)fgW(kAI!mT&Vix#b` zn6P{K>eIiziYRi*9lLU(QNvDa>KTT(?Q_1d`|g#d4vD=LAGK;5C*;*{_^IgWdjFoThK5{u+PCCq1ywf! z?`SSNXw90c=s3Z6pJdGPgi~*;*q1-fs@!pDg>ib2eT&MEld7z>=Mwv8`1pq{Kg3@2 zW{X|a+@C$NY`J;6l<#=#Jo@7-!!o_P4U6j7el_1Z=rX@%Huq!Qu->bASzAvAKj}K7 zt3BoEn%`}10$clJQ&}VC+9!S7rq|1~PJ!{c(eLX;3&| z)(8?9H3C!%1G>qm$q(IRtcg(qBQf5GRy*j1qec|E;V982fe~#&tPnQ`c(bwTK%EZ> r69@-tCj*S;fkrzM8(bedh{Xpc85ls)0p6@&S!SRvka|$)F)#oCM}ige literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf new file mode 100644 index 0000000000000000000000000000000000000000..31490cbc46d2c2185875806be680d8025ddc6106 GIT binary patch literal 1905 zcmZ`)3pmqj82`_*xg?X@ER<8EFxo^exrERnO;VQDZO)mrXs!_^r*e&kCR-x4dV1NREw$(?UICc62!3X(Wf&dr*mHBQ8Tn8`e9Cr>Wdz*r%&|yxNT>|mxOt}$? zjy23k+sQv@Ur&pcyS$o)HN|%cqw;Q69LMH3Ds6iGY>57)h|^G0Q>*Tr!&na zM$@eMYJiYVb#x2dQ4>BhYyWCG$43_kI_`Wp#Z>)Jkb?gGfm{4n$A+KPU=xRNt@^l5 zCq-p%L}Z=f+&a(8_n+se7c&d?n-D)R^Kg0nR!N_p`=(GCbE0wc=7fvW&gp4j94{lT z#b?^LiaNASFt9-(+XiiS_g1enbH`*^&#srp5-qRy;dj5ycv{@NA&C_{g^o3oNx<$t zuW&B+M6N+aOAd(gKD_aUQdNH}PVF?oxu*3_G7D>&XdoI|!Knj)+$ETd^A2Y&`eTT)=O>!=VS42nco8TFH|`HY*-~ zeG2xw$`}j$fO@I?%`wXhvGW0O^j(aJh5tnFITG$;cyQS4mqNNN!GUU+IKsxz)L4GU zayJP_V?(dwB@S!qf&{&*z6R!m@g%peN$un0%QAboM+jHDE#67ac!RFbIK%Db#P6(y zX$4?2FF4FX4kg-8Ts(mB4H^lHkT#$=jEJ%_QSck}qij!OBMf7k(+mIRws?!x<+T?t z%*uk-`Z&?GW6w*B(aqwHlvLjvA4>bvdBm0dGQUhE9bF2d)bfU(A}46_E@zP(yAIv5 zN`i56t62nbP)IGVB)D@sx0{aN9UY%>LXsm)%G09?6UNHhRR;pnEGQ)V7GW zYJYH`L84s2N!CVQySQ>RTS<9;H++^ADeC>oEdomZAU#ti--WEQ1@5r1!>Wm4PMlFB zHp!+O^R{6HE}0<>WmTD;V}Y2qciw10<}lU7zb^6kT*7jD+YN>v2Zr#Ttd zaj$WfT>S~K(IhiJ8!*f&Z8JV|vmiLBGWRa$^OS;yq&PCZ;jrkuH zTzjM%s#qGr-+ue`oeFoYbs(&Dx(({JUG+uhJ&7z1mr*jUu|vP^Q-~2~>x<9aV#5~G z5lij09=?_>{_#x+rz*(+R+%7AbZKvA>EXT>q79#&vFTCMidMQufoYtmvSjwL6rwgq z2H({>H;|khCp2uMeGS}cK!&wFZ*Th6K;^f1o5+P%gO@`_e$|)u12XA($na+fK4g95 zf?R+~8nlQ}$r4nA%RH$k2C(SArD|;2D&Mw5U4mB!Pi#I%Ng_oQ&1g8}#YpVx& zO&=fhJ=?bT%_e58nK(hiItg8)awzvm7F~7u^hpd_Lb%YnvICA>F69Kj9_GyR^Zz zKbEVflQNM1<-$%_X`&iI`~bu9*hCpJL9AdMXvkVraw%2W1p^Y(1OBfGs4jgha$Yas z@M}we|I!kcT!5b=FE78JBmZYH!hb2o?xnu-bMWPf`Z@Trw84K#o4okqn_Vyvi0;z! s7cp7fEZqtG&?}eH4u<^e2VGdnewP5SaO{E+|9%Rd_gb)DKo0=^0h|^qr2qf` literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf new file mode 100644 index 0000000000000000000000000000000000000000..317d409fc190a3fb257d5aecb8f1f4214eef36b4 GIT binary patch literal 1894 zcmZ`)3pkW%6#k7nnQ@EBeF}{-LuTA_ncP_!5}`)5Gg_@E_gmyrgrSIBQzD}zOoQBt z5Mj2M+;eGY?37z$?Xa8HM9)5I_xqpkoag($bI$ku?>X;(uy))$2mk;CHYNZ(oGC0 zCMC%5;LYh`8Qnb-Pd|U6%)W3B246~eqO4&n4{0_@mL6sefABa!WDUU`QkoP8j1&)x zNHftGNzaswW$u@!3;EjgMIP?6nFu~HYNxU{_5eiQ%0Ry^EgC8OJaRUqZ&|L0(%9gH zI1PDGa3Qt-SYdpu|E%>@N9VZ|XPfbm<7F=DtEG194@gbg`G)d5N!c<+ z4uEaJLgem?GGepyH$mYozgE|<4Kw?1tw0bE@UGo#7)FD%j zx#|s_7&ll&*ZTP*BPG193bL2bg8Fm`tX$g=v7d#$m3r9Yrt&e;BSUJnXS%1NI6EE! zY4dbgtF;;|sao?8qQsvvPaep^hfx4)fR4(o(IWijDVfrqcbfx+HGhq8s)4 znK`mnXxrFg+uVIT%lE>^k*NY!Y@oron-Lw z*N`VCQ+I=-Tr_d`_7k+0KuJx+Y;Am+mgalQ0(28*cw7J zY#K(7iz!yNIJirMQPLW%D=hVwHDmEyn98vq+S)<%@ALI;pFyHBV+S54#bYi-2s ztt>iP9Wqd-cNeqTgLgfuZKn)5u7IZzofPViwu{&L;-xHi&bW<~v+z?I%eRGT@1nIA z=M=HqNG;%u?Egk;i49VFnECkz5_|(aox{!(0!|=9&-rk8?F`!F^Zcd)3Y>av+cZUu z_p`w;SMMV`&5MH|6@HV#@qr^=_NsSskZ)^4`i^3%q#6lYtj{7x7Q7bP#5(ZYI-l;9 z7X#=!lp$UJqKeRK4W$pd*Zz=%2`Y5ZI%D9*`!ag~T&b41>3ra+<=i^Ch@F(Mek0Q8 z{d!kbB`zmSj+xe|MN`6Iht#(2o&xd;?2tw~D@>6CKAXI6BSStiLl)t&YkwnD1U;kj!o%|NT@*rlmy0b7JuG%=PQZf1-!7 z*MluJ14M^j4O72#W%Sd|>Wf7+ac_q#V1Sk$UOZCJ^>m?j^sck%(aOTc?&8+ zTCY&6rfB?cLd|AF4R2|&iO{CdrF|D;uK7k+uEK0ACdLtPxI&26%Fpl5hYvZ9soiTa zjb|Knq0_kz_F zdA@VL^?SywpR}`kfqTfP%AzQ~wYZTM^TNnHVLHNv_{R4vrR&IaQV(MPjhXVlu2_mv zQsoJ}#|lhNFV!H4pb8}}28K;e%#_C3ae)xP|NZ&pwm$6AhUVb#V;_M2&rCLA-m#T- f_P>7o97~?B5&$^cSUX-m&O7dnhhxt{4*>oF{>U30 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf new file mode 100644 index 0000000000000000000000000000000000000000..6992e6a0a3aca4061d2962db035dbddefd64fe9d GIT binary patch literal 1894 zcmWIWW@gc4U|`??Vg`m8)tPetp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|W8%W`@v9 z!%yeUF%XH}9`v7aXSUokQ-h|mVAog6g07~?Hs%Ux$tfEwHi^GqeQ=(;)MZCsG08I@ zEuY)H*?H2=etU1J$l-|Zv3@Ha3woEVd0zT`#$?a1GAFzGUmxtUtM#O~58RzGSzVLA z`nv4R$r;@jGqcUUB*%NUe_bp6VcUyks}hQ&8jhy^RfxI2c;f4yM`rDcdbVWk>}7ea zBFv8GYJ(TddGY4A{AVZgcei_uav5_&)f;X#ZBJh8q0njlHa$g}x3|f+IiXhFRo!scm9I`rS8Jy`>T<=MIP|J3 z?8%dKU1>+1pT8OS@9#e-wUMt`;%Gq&tC!u;zvgGHpWVHqAEfWx6)eB`GA=K6+OJR36N;8C zbeS18Pi}>QC zb>2{=Zf4EY9$lw$6i#hiNmOWq6D1NaeLjSeUS@}@UFxepDSn4vO}l!d=2go*vyE4ErH{m!e!hKjhgkL2 z)X+0=wpRJ8*S`PhtydgB_m0n@>u%p~#K@%XO_F_CGpo-ouIifM3D1JeM_lardIcBC zo-^0Ac8kfx@SPBsD*V9qQ-m+CmRbIec89mPoiX3NmFAR9BQ+&dC4}+d zN=6SwX=BxA98GSV!Xc}(H73knpye!5tFYSgxjM5{mYy;j^Gg@$6FVoVtFE8;%qB5& zLvx<)PPSQ(124@8Gsp}(R^S-tmKAPG&cvpf%$aWVJxlD&sg-#@GBvbMo%+67VN30- zBV{|fnXNfj9ZH+(K6zD-)~t?HrqfxPQP~fVO7dP>u5PX06MRf7Z}}Y2vKeeE=c+Mo z*Ph2A*EaR}@tT?H#^ux4;~$9qU)|_m&k%r;sX0RQF2gdlFfda`JLl(>q~?{xhg24% z7RTyU0YEb6kPlz(0R1MZfRTWP*(3uo%x z-Clkv)N!NOo>ZgHe|dx7r@cQScr1n4?9;L}OBhTRZoOe%v}j$$gx$+mpZ@h#M3GbO z*p(BF8g^P!&oIO-H*#@!SCaT;)()9!(XEx2ZCBi0wJTgrficK&rnAv)*S+n2{(VPI zpP9S)o1&Bc(a)7;r%f;YIv3v8M{ajK9m-5Enzy9~>#EISCO>WHiSLS9=EO6t(&2#@x zPQH94%TlmzFEeV86<>Qi4HjhFz#xk+O3f+O*8`EDpyFnPgwbYbP^I>t^fsq)mLMt0|!%-s&-Efp>lfZ~J4pxYp1H9STbfC_Mgb9QLwUYrx^FX8h f2SOh^NF@uHWMBYE2Y9oxfy9`B5TqUydJGHzDGdu= literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf new file mode 100644 index 0000000000000000000000000000000000000000..71c89d2145c7b2dc8fa07ecb4fecccf83f8349c6 GIT binary patch literal 1895 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf new file mode 100644 index 0000000000000000000000000000000000000000..6ce9f6fc688a43c7dfe7f38fcde02a19c96d26d0 GIT binary patch literal 1904 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf new file mode 100644 index 0000000000000000000000000000000000000000..31df1df8cc034555643c82d67c8cb1c597174d2f GIT binary patch literal 1890 zcmZ`)2{hDQ6#v^s4KhlStXZ-RKFTD*M6yO?IU`DDgkuTApbwEEsv%3ZIU*XQIreR+ zA!IBwV$=w26Iu)@%UBwpiOzTA``$b6-t&L&zWd()ckl0AJ1ZVuC;$LE)&~F>WMhx6 zZ8iuX3h0<>>LC3CktjcnUy=)e0DMBfOaUyy9pIs*|M&B+9$K zxmgya-c@1=Q_MGt3eSh(QfhhLg(-KX*(cy;gjX$e{l4WSEsphPbTix-rwTooF4}}n z>1I~**J2qEn!zs@)LCcG=Tp{1kSImk_D>SL%n!LPvY*%V?;?6B+B_qJK*D#MS)6? zJ1Juyh;@)6Il{aV=-Mlp9w~CWE_T9&%PpNT&^zMglj)QBV~<%?J9jSZ1lxpUWbL47 zQ5VFGp>(S@pviO03ZFzrL)4d5r0ugp@5qt&TN z|EiN|PrHKGh8p|!u6oyC=R4rKYLwK|{?UT7-640*zzeN}oR88QN$^1&b#d=5!oK!a zEOXO05QS#Mu!wZs}7 z&jwO?5UglSmT3W-Z`3n#n7)@xa23}Vja`uLgbJF=GacKf^%zsQ(x4`7I=Rkku*;zu zY8)!CUm4juG1oLa_1;=47Fxtpj{%8&d@riWQNSdLM<3vxgM2W}cUc;ZxNqh1w&Xv1)BvVV+r}(ezWP#GU)cvypJb_Xu{kn&N>= z3(0#Vim1JzK8+%&>YgyQ>u5&Ht#frM^#M6rnb!}FwsjlWOt4Lbn~b4sd~9G0V7G

J8509%7&^Ly?{Gj+thd(?J<|rAbDkPZN%X5l993|XC+xK zdw8~q_Q=VWgwwWn+IxC&)eCYbG&_Do==K~LSnjPnOglDZq%4EDY(zufqDa^@?+k6P zn=54{o_SO2&Y=0240h$JG*Eb7OvRF%#mTpCpvub97_SA-iOZ4nGovaGTlM)+a_|(L zC;QLgFLW~_`SA?jh=zd@olEvc@d_-mB3~561Dj=S>x6IP51y(qMBtWgNrC(Wn&d~# z8#`Eiz(bAbio$5n^0n8krul#83NWBfw}%3JYsn5DlX{_Q>Eq=qH_RZlccf5!E;yr$ zvvnG`xe2mdlW +#include +#include +#include "wxExtensions.hpp" +#include "Jobs/ArrangeJob.hpp" +#include + +#pragma optimize("", off) +#if ENABLE_SCROLLABLE +static wxSize get_screen_size(wxWindow* window) +{ + const auto idx = wxDisplay::GetFromWindow(window); + wxDisplay display(idx != wxNOT_FOUND ? idx : 0u); + return display.GetClientArea().GetSize(); +} +#endif // ENABLE_SCROLLABLE + +namespace Slic3r { +namespace GUI { + +void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons){ + + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; //there a better way to only load the flavor ? + + wxString choices_first_layerPA[] = { + "0.025", + "0.030", + "0.035", + "0.040", + "0.045", + "0.050" + }; + firstPa = new wxComboBox(this, wxID_ANY, wxString{ "0.040" }, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); + firstPa->SetToolTip(_L("Select the first layer PA value to be used for the first layer only.")); + firstPa->SetSelection(3);// starting at 0! + + + wxString choices_start_PA[] = { + "0.0", + "0.010", + "0.020", + "0.030", + "0.040", + "0.050" + }; + startPa = new wxComboBox(this, wxID_ANY, wxString{ "0.0" }, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); + startPa->SetToolTip(_L("Select the starting PA value to be used.")); + startPa->SetSelection(0); + + wxString choices_end_PA[] = { + "0.10", + "0.20", + "0.30", + "0.40", + "0.50", + "0.60", + "0.70", + "0.80", + "0.90", + "1.00" + }; + endPa = new wxComboBox(this, wxID_ANY, wxString{ "0.10" }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); + endPa->SetToolTip(_L("Select the ending PA value to be used.")); + endPa->SetSelection(0); + + wxString choices_increment_PA[] = { + "0.0010",///1000 hits + "0.0025", + "0.0035", + "0.005", //200 hits + "0.006", + "0.007", + "0.01",//100 hits + "0.1"//10 hits + }; + paIncrement = new wxComboBox(this, wxID_ANY, wxString{ "0.0025" }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); + paIncrement->SetToolTip(_L("Select the PA increment amount.")); + paIncrement->SetSelection(1); + + wxString choices_extrusion_role[] = { + "InternalInfill", + "BridgeInfill", + "ExternalPerimeter", + "GapFill", + "InternalBridgeInfill", + "Ironing", + "OverhangPerimeter", + "Perimeter", + "SolidInfill", + "SupportMaterial", + "SupportMaterialInterface", + "ThinWall", + "TopSolidInfill", + "FirstLayer", + // "Verify"//if this selected, disable/hide other buttons? + // 'verify' this choice will require the user to manually add in the PA numbers with the GUI from their realworld tests. + // the code will then load a 90_bend for each ER role, and give each bend seperate ER speed/width/ect values + // when printed and user added in the PA numbers correctly. it should make it easy to spot what ER roles need adjusting. + //TODO: once the main pressure advance feature is added, this can pull that values and insert here to save the manual adding in the numbers. + // supermerill: i don't understand, so I deactivated the feature for now. + }; + erPa = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 14, choices_extrusion_role); + erPa->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); + erPa->SetSelection(0); + + + wxString number_of_runs[] = {"1","2","3","4","5"}; + nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 5, number_of_runs); + nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is reccomended due to bed size limits")); + nbRuns->SetSelection(0); + + enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize ); + enableST->SetToolTip(_L("generate smooth time values")); + enableST->SetValue(false); + + // TODO : add another row of boxes for the 2nd/3rd ect of tests to create, user adjust parameters of new row for the 2nd/3rd test + // this will allow multi plate PA tests to be run + + + std::string prefix = (gcfMarlinFirmware == flavor || gcfMarlinLegacy == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); + + if (prefix != "unsupported firmware type"){ + wxBoxSizer* vertical =new wxBoxSizer(wxVERTICAL); + wxBoxSizer* hsizer_common =new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* hsizer_pa =new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* hsizer_speed =new wxBoxSizer(wxHORIZONTAL); + vertical->Add(hsizer_common); + vertical->Add(hsizer_pa); + vertical->Add(hsizer_speed); + + hsizer_common->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); + hsizer_common->Add(nbRuns); + + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); + hsizer_pa->Add(firstPa); + hsizer_pa->AddSpacer(15); + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); + hsizer_pa->Add(startPa); + hsizer_pa->AddSpacer(15); + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); + hsizer_pa->Add(endPa); + hsizer_pa->AddSpacer(15); + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); + hsizer_pa->Add(paIncrement); + + hsizer_speed->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); + hsizer_speed->Add(erPa); + if (gcfKlipper == flavor) { + hsizer_speed->AddSpacer(15); + hsizer_speed->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); + hsizer_speed->Add(enableST); + } + hsizer_speed->AddSpacer(25); + + wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); + bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); + + vertical->Add(bt); + + buttons->Add(vertical); + } else { + buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix))); + } +} + +void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { + /* + firstPa + startPa + endPa + paIncrement + erPa + enableST + */ + double first_pa, start_pa, end_pa, pa_increment = 0.01; + bool smooth_time = enableST->IsChecked(); + size_t nb_runs = nbRuns->GetSelection(); + nb_runs=nb_runs+1; + first_pa = firstPa->GetValue().ToDouble(&first_pa); + + if (!firstPa->GetValue().ToDouble(&first_pa)) { + first_pa = 0.025; + } + start_pa = startPa->GetValue().ToDouble(&start_pa); + if (!startPa->GetValue().ToDouble(&start_pa)) { + start_pa = 0.0; + } + end_pa = endPa->GetValue().ToDouble(&end_pa); + if (!endPa->GetValue().ToDouble(&end_pa)) { + end_pa = 1.0; + } + pa_increment = paIncrement->GetValue().ToDouble(&pa_increment); + if (!paIncrement->GetValue().ToDouble(&pa_increment)) { + pa_increment = 0.05; + } + + std::string extrusion_role = erPa->GetValue().ToStdString(); + std::string choice_extrusion_role[] = { + "InternalInfill", + "BridgeInfill", + "ExternalPerimeter", + "GapFill", + "InternalBridgeInfill", + "Ironing", + "OverhangPerimeter", + "Perimeter", + "SolidInfill", + "SupportMaterial", + "SupportMaterialInterface", + "ThinWall", + "TopSolidInfill", + "FirstLayer"//i've got added them all right? + }; + + std::unordered_map er_width_ToOptionKey = { + {"InternalInfill", "infill_extrusion_width"}, + //{"BridgeInfill", "placeholder"},//special calc required + {"ExternalPerimeter", "external_perimeter_extrusion_width"}, + //{"GapFill", "placeholder"},//special calc required + //{"InternalBridgeInfill", "placeholder"},//special calc required, TODO:find out where/how this is calculated + {"Ironing", "top_infill_extrusion_width"}, + {"OverhangPerimeter", "overhangs_width"}, + {"Perimeter", "perimeter_extrusion_width"}, + {"SolidInfill", "solid_infill_extrusion_width"}, + {"SupportMaterial", "support_material_extrusion_width"}, + {"SupportMaterialInterface", "support_material_extrusion_width"}, + {"ThinWall", "external_perimeter_extrusion_width"}, + {"TopSolidInfill", "top_infill_extrusion_width"}, + {"FirstLayer", "first_layer_extrusion_width"} + + }; + + std::unordered_map er_accel_ToOptionKey = { + {"InternalInfill", "infill_acceleration"}, + {"BridgeInfill", "bridge_acceleration"}, + {"ExternalPerimeter", "external_perimeter_acceleration"}, + {"GapFill", "gap_fill_acceleration"}, + {"InternalBridgeInfill", "bridge_internal_acceleration"}, + {"Ironing", "ironing_acceleration"}, + {"OverhangPerimeter", "overhangs_acceleration"}, + {"Perimeter", "perimeter_acceleration"}, + {"SolidInfill", "solid_infill_acceleration"}, + {"SupportMaterial", "support_material_acceleration"}, + {"SupportMaterialInterface", "support_material_interface_acceleration"}, + {"ThinWall", "top_solid_infill_acceleration"}, + {"TopSolidInfill", "top_solid_infill_acceleration"}, + {"FirstLayer", "first_layer_acceleration"} + }; + + std::unordered_map er_spacing_ToOptionKey = { + {"InternalInfill", "infill_extrusion_spacing"}, + //{"BridgeInfill", "placeholder"}, + {"ExternalPerimeter", "external_perimeter_extrusion_spacing"}, + //{"GapFill", "placeholder"},//special calc required for commented ones + //{"InternalBridgeInfill", "placeholder"}, + //{"Ironing", "ironing_spacing"}, TOFIX? TYPE: coFloat + {"Ironing", "top_infill_extrusion_spacing"}, + {"OverhangPerimeter", "external_perimeter_extrusion_spacing"}, + {"Perimeter", "perimeter_extrusion_spacing"}, + {"SolidInfill", "solid_infill_extrusion_spacing"}, + {"SupportMaterial", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat + {"SupportMaterialInterface", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat + {"ThinWall", "external_perimeter_extrusion_spacing"}, + {"TopSolidInfill", "top_infill_extrusion_spacing"}, + {"FirstLayer", "first_layer_extrusion_spacing"} + }; + + std::unordered_map er_speed_ToOptionKey = { + {"InternalInfill", "infill_speed"}, + {"BridgeInfill", "bridge_speed"}, + {"ExternalPerimeter", "external_perimeter_speed"}, + {"GapFill", "gap_fill_speed"}, + {"InternalBridgeInfill", "bridge_speed_internal"}, + {"Ironing", "ironing_speed"}, + {"OverhangPerimeter", "overhangs_speed"}, + {"Perimeter", "perimeter_speed"}, + {"SolidInfill", "solid_infill_speed"}, + {"SupportMaterial", "support_material_speed"}, + {"SupportMaterialInterface", "support_material_interface_speed"}, + {"ThinWall", "thin_walls_speed"}, + {"TopSolidInfill", "top_solid_infill_speed"}, + {"FirstLayer", "first_layer_speed"} + }; + +/* +struct ExtrusionSettings {// think a struct is better instead of all the maps ? + std::string extrusionWidth; + std::string acceleration; + std::string speed; +}; + + std::unordered_map extrusionRoleToOptionKey = { + {"InternalInfill", {"infill_extrusion_width", "infill_acceleration", "placeholder"}}, + //{"BridgeInfill", {"placeholder", "bridge_acceleration", "placeholder"}},//special calc required + {"ExternalPerimeter", {"external_perimeter_extrusion_width", "external_perimeter_acceleration"}}, + //{"GapFill", {"placeholder", "gap_fill_acceleration"}},//special calc required + //{"InternalBridgeInfill", {"placeholder", "bridge_internal_acceleration"}},//special calc required + {"Ironing", {"top_infill_extrusion_width", "ironing_acceleration"}}, + {"OverhangPerimeter", {"overhangs_width", "overhangs_acceleration"}}, + {"Perimeter", {"perimeter_extrusion_width", "perimeter_acceleration"}}, + {"SolidInfill", {"solid_infill_extrusion_width", "solid_infill_acceleration"}}, + {"SupportMaterial", {"support_material_extrusion_width", "support_material_acceleration"}}, + {"SupportMaterialInterface", {"support_material_extrusion_width", "support_material_interface_acceleration"}}, + {"ThinWall", {"external_perimeter_extrusion_width", "thin_walls_acceleration"}}, + {"TopSolidInfill", {"top_infill_extrusion_width", "top_solid_infill_acceleration"}} + };*/ + + int countincrements = 0; + int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers + std::vector pa_values(sizeofarray); + std::vector c_pa_values_c(sizeofarray); + + double incremented_pa_value = start_pa; + while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. + if (incremented_pa_value <= end_pa) { + double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; + pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. + c_pa_values_c[countincrements] = rounded_Pa; + countincrements++; + incremented_pa_value += pa_increment; + } + else { + pa_values[countincrements] = end_pa; + countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. + break; } + + }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... + + bool has_to_arrange = false; + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + if (!plat->new_project(L("Pressure calibration"))) + return; + + bool autocenter = gui_app->app_config->get("autocenter") == "1"; + if (autocenter) { + //disable auto-center for this calibration. + gui_app->app_config->set("autocenter", "0"); + } + + std::vector items; + for (size_t i = 0; i < nb_runs; i++){ + items.emplace_back((boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "base_plate.3mf").string()); + } + std::vector objs_idx = plat->load_files(items, true, false, false, false); + assert(objs_idx.size() == nb_runs); + const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->get_config(); + const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FFF_FILAMENT)->get_config(); + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + + // --- scale --- + //models is created for nozzles from 0.1-2mm walls should be nozzle_size*4 spaced, scale xy model by widths down is futher + const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); + assert(nozzle_diameter_config->values.size() > 0); + double nozzle_diameter = nozzle_diameter_config->values[0];//get extruderID too? + double first_layer_height = print_config->get_abs_value("first_layer_height", nozzle_diameter); + double base_layer_height = print_config->get_computed_value("layer_height",0); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; + + double er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); + double er_accel = print_config->get_abs_value("solid_infill_acceleration", nozzle_diameter); + double er_speed = print_config->get_abs_value("solid_infill_speed", nozzle_diameter); + double er_spacing = print_config->get_abs_value("external_perimeter_extrusion_spacing",1.0); + + double default_er_width = print_config->get_abs_value("extrusion_width", nozzle_diameter); + double default_er_speed = print_config->get_abs_value("default_speed", nozzle_diameter); + double default_er_accel = print_config->get_abs_value("default_acceleration", nozzle_diameter); + double default_er_spacing = print_config->get_abs_value("extrusion_spacing", nozzle_diameter); + double spacing_ratio = print_config->get_abs_value("perimeter_overlap",1.0); + double spacing_ratio_external = print_config->get_abs_value("external_perimeter_overlap",1.0); + double filament_max_overlap = filament_config->get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? + + if (extrusion_role == "Verify") { + countincrements = 13; + er_width = default_er_width; + er_spacing = default_er_spacing; + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + } + else{ + for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + + if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { + + er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps at match speed/width ect to the selecter ER role + er_speed = print_config->get_abs_value(er_speed_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? + er_accel = print_config->get_abs_value(er_accel_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + + //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? + if(er_width == 0){er_width =default_er_width; } + if(er_speed == 0){er_speed =default_er_speed; } + if(er_accel == 0){er_accel =default_er_accel; } + if(er_spacing == 0){er_spacing = default_er_spacing; } + + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; + } else { + er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. TODO: add the bits for this here since gapfill/bridges need special calculations + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + + } + + } + } + + + //-- magical scaling is done here :) + //the 90_bend models need to be scaled correctly so there is no 'gapfill' since gapfill will effect results. + double xyzScale = nozzle_diameter / 0.4; + double er_width_to_scale = magical_scaling(nozzle_diameter,er_width,filament_max_overlap,spacing_ratio,spacing_ratio_external,base_layer_height,er_spacing); + //-- magical scaling + std::vector < std::vector> pressure_tower; + + std::string nozzle_diameter_str = std::to_string(nozzle_diameter); + nozzle_diameter_str.erase(nozzle_diameter_str.find_last_not_of('0') + 2, std::string::npos); + + + if (nozzle_diameter_str.back() == '.') {//if nozzle_diameter_str broke fix it by adding '0' to end, prob not needed? + nozzle_diameter_str += '0'; + } + + /*size_t decimal_pos = nozzle_diameter_str.find('.'); + // maybe adjust for this ? + // some users might have 0.0x nozzle size. if that's the case then they should just need to create the file and it should load. ie; 90_bend_0.450.3mf + if (decimal_pos != std::string::npos) { + size_t non_zero_pos = nozzle_diameter_str.find_first_not_of('0', decimal_pos + 2); + nozzle_diameter_str.erase(non_zero_pos, std::string::npos); + }*/ + + std::string bend_90_nozzle_size_3mf = "90_bend_" + nozzle_diameter_str + ".3mf"; + + for (size_t id_item = 0; id_item < nb_runs; id_item++) { + + pressure_tower.emplace_back(); + + double initial_model_height = 0.2; + double initial_90_bend_x = 41.20;//fusion=41.200 mm + double initial_90_bend_y = 20.93;//fusion=20.930 mm + double initial_number_x = 2.06;//fusion=2.063 mm + double initial_number_y = 4.12;//fusion=4.125 mm + double initial_border_x = 1.6;//fusion= 1.6mm + double initial_point_xy = 0.69;//fusion = 0.687 mm + + double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); + double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; + double xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale; + double xy_scaled_x = initial_border_x * er_width_to_scale; + double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; + double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; + double xy_scaled_point_xy = initial_point_xy * xyzScale * er_width_to_scale; + + + double thickness_offset = nozzle_diameter * er_width_to_scale * 2; + double z_scale_90_bend = xyzScale * 1.8 / initial_model_height; + double z_scale_factor = 0.0; + double new_z_world_coords = first_layer_height / 2.0 -base_layer_height; + + if(base_layer_height <= first_layer_height){//normal conditions firstlayer is greater than base + z_scale_factor = first_layer_height / initial_model_height; + }else{ + z_scale_factor = first_layer_height + first_layer_height; + } + // BUG: output error if first layer height is lower than base layer height + // this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. + // ie; first_layer_height=0.1 and base_layer_height =0.20 + //BUG: if first/base layer height are both .02 numbers don't show up when sliced. doesn't happen with windows, it did for linux ? + + + + std::vector bend_90_positions; + std::vector number_positions; + + if (extrusion_role == "Verify") { + + int nb_bends = 0; + for (const std::string& role : choice_extrusion_role) {//dynamic add and scale each 90bend model per extrusion role. + + if (er_width_ToOptionKey.find(role) != er_width_ToOptionKey.end()) { + + er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[role].c_str(), nozzle_diameter); + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + thickness_offset = nozzle_diameter * er_width_to_scale * 2; + + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); + + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + nb_bends++; + } + else{ + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = default_er_spacing; + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + thickness_offset = nozzle_diameter * er_width_to_scale * 2; + + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); + + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + nb_bends++; + + } + + } + } + else{//not verify + for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){ + //const double magical_transformation_y_pos = 10.47; + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); + + Eigen::Vector3d modelPosition(-0.8, (double(nb_bends) * (thickness_offset*2) *2) , xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + } + } + + for (int nb_bends = 0; nb_bends < countincrements;nb_bends++){ + + if(nb_bends == 1 && extrusion_role != "Verify") {//only load once. this onyl determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! + + const double extra_size_y = xy_scaled_90_bend_y / 4; + const double extra_size_x = xy_scaled_number_x; + + const double magical_transformation_x_pos = 20.6;//what is this, and how is this calculated ? >:( + const double magical_transformation_y_pos = 10.47;//load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size + Eigen::Vector3d bend_pos_first = bend_90_positions[0]; + Eigen::Vector3d bend_pos_mid = bend_90_positions[countincrements/2]; + Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; + + Eigen::Vector3d number_pos_first = number_positions[0]; + Eigen::Vector3d number_pos_mid = number_positions[3]; + Eigen::Vector3d number_pos_last = number_positions[6]; + double numbers_total_width = (number_pos_last.x() + (xy_scaled_number_x / 2)) - (number_pos_first.x() - (xy_scaled_number_x / 2)); + + double scaled_r_border_x_percentage = ((numbers_total_width + extra_size_x) / initial_border_x) * 100; + double scaled_r_border_x_mm = (scaled_r_border_x_percentage / 100) * initial_border_x; + double scaled_tb_border_x = scaled_r_border_x_mm + xy_scaled_90_bend_x; + double scaled_tb_border_x_percentage = ((scaled_tb_border_x /* + extra_size_x*/) / initial_border_x) * 100; + + + double total_height = (bend_pos_last.y() + (xy_scaled_90_bend_y / 2)) - (bend_pos_first.y() - (xy_scaled_90_bend_y / 2)); + double scaled_border_y_percentage = ((total_height + extra_size_y) / initial_90_bend_y) * 100; + double border_scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y;//need to fix for larger nozzle sizes. + + + double right_border_pos_x = number_pos_mid.x(); + double top_border_x_pos = ((number_pos_last.x() + (xy_scaled_number_x / 2)) + (bend_pos_first.x() - (xy_scaled_90_bend_x / 2))) / 2; + double left_border_pos_x = bend_pos_first.x() - (xy_scaled_90_bend_x / 2); + + //---------- + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y_percentage*0.01, z_scale_factor }); // Left border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ right_border_pos_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, + /*scale*/Vec3d{ scaled_r_border_x_percentage*0.01 , scaled_border_y_percentage*0.01 , z_scale_factor });// right border + + bool enable_top_bottom = true; + if(enable_top_bottom == true){//remove later + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y /1.8), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//bottom border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y /1.8) , new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//top border + } + + // position in printer coords are half of scaled size! + // scale model in percentage from original models xy values! + //---------- + } + //} + + if (extrusion_role != "Verify") {// possible to load the words for each ER role? + + if (nb_bends % 2 == 1) { // Skip generating every second number + continue; + } + + Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; + const double magical_transformation_y_pos = 10.47; + const double magical_transformation_num_x_pos = 1.03; + const double magical_transformation_num_y_pos = 2.06;// -2.03 + const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border this might be dependant on z_scale_factor + + double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_90_bend_y/2); + double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; + double xpos_initial = bend_90_x + (xy_scaled_90_bend_x/2) - xy_scaled_number_x + nozzle_diameter; + double ypos_inital = bend_90_y /*+ (xy_scaled_number_y/2)*/; + double ypos_point = bend_90_y - (xy_scaled_number_y/2) - nozzle_diameter; + + double xpos = xpos_initial; + double ypos = ypos_inital; + + std::string pa_values_string = std::to_string(pa_values[nb_bends]); + std::string threemf =".3mf"; + + for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file + + std::string numered3mfpath = pa_values_string[j] + threemf; + + if (pa_values_string[j] == '.') { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale+(xyzScale/2), z_scale_factor }); + + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos_point, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_point_xy + (nozzle_diameter * 2 ); + } + else if (std::isdigit(pa_values_string[j])) { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor }); + + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_number_x + nozzle_diameter; + } + } + } + } + } + + + /// --- translate --- + //bool autocenter = gui_app->app_config->get("autocenter") == "1"; + has_to_arrange = true; + /*if (!autocenter) { + const ConfigOptionPoints* bed_shape = printer_config->option("bed_shape"); + Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); + Vec2d bed_min = BoundingBoxf(bed_shape->values).min; + model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, 5 * xyzScale - 5 }); + }*/ + + std::string set_advance_prefix =""; + if (gcfKlipper == flavor) { + if(smooth_time == false){ + set_advance_prefix = "SET_PRESSURE_ADVANCE ADVANCE="; + } + else{ + set_advance_prefix = "SET_PRESSURE_ADVANCE SMOOTH_TIME="; + } + } + else if (gcfMarlinFirmware == flavor) { + set_advance_prefix = "M900 K"; + } + else if(gcfRepRap == flavor){ + set_advance_prefix = "M572 S"; + } + + /// --- main config, modify object config when possible --- + DynamicPrintConfig new_print_config = *print_config; + DynamicPrintConfig new_printer_config = *printer_config; + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. + new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing + new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); + new_print_config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); + new_print_config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); + new_print_config.set_key_value("fill_density", new ConfigOptionPercent(0)); + new_print_config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); + new_print_config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill)); + new_print_config.set_key_value("seam_position", new ConfigOptionEnum(spRear));//BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. + new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); + new_print_config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); + new_print_config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); + + for (size_t i = 0; i < nb_runs; i++) { + /* + gcfRepRap, + gcfSprinter, + gcfRepetier, + gcfTeacup, + gcfMakerWare, + gcfMarlinLegacy, + gcfMarlinFirmware, + gcfLerdge, + gcfKlipper, + gcfSailfish, + gcfMach3, + gcfMachinekit, + gcfSmoothie, + gcfNoExtrusion*/ + + size_t num_part = 0; + const int extra_vol = 1; + for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers + + std::string er_role =""; + if (extrusion_role == "Verify") { + er_role = choice_extrusion_role[num_part]; + if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()) { + + er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = print_config->get_abs_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); + er_accel = print_config->get_abs_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); + } + else{ + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = default_er_speed; + er_accel = default_er_accel; + } + } + + + er_width = (er_width == 0) ? std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0 : er_width; + er_speed = (er_speed == 0) ? default_er_speed : er_speed; + er_accel = (er_accel == 0) ? default_er_accel : er_accel; + + /// --- custom config --- // this is for forcing each model to have x print modifiers + + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + if (extrusion_role == "Verify") { + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values + } + else{//add '\n' in? answer: you can, not mandatory as it's verified. + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); + } + num_part++; + } + } + + //update plater + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); + plat->on_config_change(new_printer_config); + plat->changed_objects(objs_idx); + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->update_dirty(); + this->gui_app->get_tab(Preset::TYPE_PRINTER)->update_dirty(); + plat->is_preview_shown(); + //update everything, easier to code. + ObjectList* obj = this->gui_app->obj_list(); + obj->update_after_undo_redo(); + + + // arrange if needed, after new settings, to take them into account + if (has_to_arrange) { + //update print config (done at reslice but we need it here) + if (plat->printer_technology() == ptFFF) + plat->fff_print().apply(plat->model(), *plat->config()); + std::shared_ptr fake_statusbar = std::make_shared(); + ArrangeJob arranger(std::dynamic_pointer_cast(fake_statusbar), plat); + arranger.prepare_all(); + arranger.process(); + arranger.finalize(); + } + + + if (extrusion_role != "Verify") {//don't auto slice so user can manual add PA values + //plat->reslice(); //forces a slice of plater. + } + + if (autocenter) { + //re-enable auto-center after this calibration. + gui_app->app_config->set("autocenter", "1"); + } +} + +double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, double er_width, double filament_max_overlap, double spacing_ratio, double spacing_ratio_external, double base_layer_height, double er_spacing ){ + + double xyzScale = nozzle_diameter / 0.4; + double er_width_decimal = er_width * nozzle_diameter / 100.0;//models are generated to be default width of x4 lines for the walls ie; 0.4mm nozzle is 1.6mm thick walls + double er_width_to_scale =1.0; + double overlap_ratio = 1; + if (filament_max_overlap) {overlap_ratio = filament_max_overlap;} + + spacing_ratio = std::min(overlap_ratio * 0.5f, spacing_ratio_external / 2.0); + double new_scale_spacing = er_width_decimal-base_layer_height*float(1. -0.25 *PI)* spacing_ratio; + double spacing_value = std::round((new_scale_spacing / nozzle_diameter) * 100); //spacing_value = Round((Spacing / Max Nozzle Diameter) * 100) + er_spacing = (std::round(spacing_value * 10000) / 10000) *0.01; + + + if (xyzScale > 4 ) { + er_width_to_scale = 1.0; + } + else{ + er_width_to_scale = er_spacing -(nozzle_diameter/2*0.01);//need to scale slightly under to help with models being correct TODO: test more configurations of nozzle sizes/layer heights + //if use has the 'wrong' min layer height for a nozzle size, the model will get filled with "gapfill" not a normal extrusion, need to test more for what variables 'break' it + } + + return er_width_to_scale; +} + +} // namespace GUI +} // namespace Slic3r +#pragma optimize("", on) \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp new file mode 100644 index 00000000000..4521e07daba --- /dev/null +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -0,0 +1,37 @@ +#ifndef slic3r_GUI_CalibrationPressureAdvDialog_hpp_ +#define slic3r_GUI_CalibrationPressureAdvDialog_hpp_ + +#include "CalibrationAbstractDialog.hpp" +//pressure advance PressureAdv +namespace Slic3r { +namespace GUI { + +class CalibrationPressureAdvDialog : public CalibrationAbstractDialog +{ + +public: + CalibrationPressureAdvDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Pressure calibration") + { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1600, 600)); Centre(wxBOTH);} + virtual ~CalibrationPressureAdvDialog(){ } + +protected: + void create_buttons(wxStdDialogButtonSizer* sizer) override; + void create_geometry(wxCommandEvent& event_args); + double magical_scaling(double, double, double, double, double, double, double ); + + //i've set choice boxes for now just to save me typing numbers in when i want to test it :) + wxComboBox* firstPa; //first layer PA -user manual entry + wxComboBox* startPa; //starting PA value -user manual entry + //wxTextCtrl* firstPa; //edit to suit for manual data entry, + wxComboBox* endPa; //ending PA value -user manual entry + wxComboBox* paIncrement;//increment PA by this value -user manual entry~~ or have drop down box ? + wxComboBox* erPa; //extrusion role Pressure/Linear Advance -user choice select + wxComboBox* nbRuns; + wxCheckBox* enableST; // checkbox for "smooth_time" - klipper only feature? + +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index ab46ddf558c..4e40b329444 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -66,6 +66,7 @@ #include "CalibrationOverBridgeDialog.hpp" #include "CalibrationTempDialog.hpp" #include "CalibrationRetractionDialog.hpp" +#include "CalibrationPressureAdvDialog.hpp" #include "ConfigSnapshotDialog.hpp" #include "CreateMMUTiledCanvas.hpp" #include "FreeCADDialog.hpp" @@ -1981,6 +1982,10 @@ void GUI_App::calibration_retraction_dialog() { change_calibration_dialog(nullptr, new CalibrationRetractionDialog(this, mainframe)); } +void GUI_App::calibration_pressureadv_dialog() +{ + change_calibration_dialog(nullptr, new CalibrationPressureAdvDialog(this, mainframe)); +} void GUI_App::freecad_script_dialog() { change_calibration_dialog(nullptr, new FreeCADDialog(this, mainframe)); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 3dc7f0c9081..25654af8e90 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -253,6 +253,7 @@ class GUI_App : public wxApp void over_bridge_dialog(); void calibration_cube_dialog(); void calibration_retraction_dialog(); + void calibration_pressureadv_dialog(); void freecad_script_dialog(); void tiled_canvas_dialog(); //void support_tuning(); //have to do multiple, in a submenu diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 0307adeed63..b1deae00296 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1960,6 +1960,8 @@ void MainFrame::init_menubar_as_editor() [this](wxCommandEvent&) { wxGetApp().filament_temperature_dialog(); }); append_menu_item(m_calibration_menu, wxID_ANY, _(L("Extruder retraction calibration")), _(L("Create a test print to help you to set your retraction length.")), [this](wxCommandEvent&) { wxGetApp().calibration_retraction_dialog(); }); + append_menu_item(m_calibration_menu, wxID_ANY, _(L("Pressure calibration")), _(L("Create a model for tuning Pressure Linear advance.")), + [this](wxCommandEvent&) { wxGetApp().calibration_pressureadv_dialog(); }); m_calibration_menu->AppendSeparator(); append_menu_item(m_calibration_menu, wxID_ANY, _(L("Bridge flow calibration")), _(L("Create a test print to help you to set your bridge flow ratio.")), [this](wxCommandEvent&) { wxGetApp().bridge_tuning_dialog(); });