new retraction calibration

had to add an override from region to ~gcode writer (and gcode),
     maybe I have to think about a better system that the current system that will began to transform into a spaghetti monster
This commit is contained in:
supermerill 2020-08-03 23:48:59 +02:00
parent 06d2b9b2d0
commit dd2e3241f8
19 changed files with 393 additions and 24 deletions

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Retraction Calibration</title>
</head>
<body>
<table width="100%">
<tbody>
<tr>
<td style="text-align: center;">
<h1>Retraction Calibration</h1>
</td>
<td style="text-align: right;"><strong>
<table><tr><td>needs:</td><td style="text-align: left;">Flow</td><td style="text-align: left;">Temp</td></tr>
</table>
</strong>
</tr>
</tbody>
</table>
<p>it's preferable to have done the flow and temperature calibration.
This calibration will help you to choose the right retraction legnth for your extrudr and the current filament.</p>
<p>This test will print some retraction test patches</h2>
<p>The goal is to choose the highest temperature possible that doesn't produce artifacts.</p>
<p>First, you have to analyse the tower. Each floor has the according temperature written on it.</p>
<h2>Notes</h2>
<p>The retraction speed should be set to the maximum value your extruder/drivers/firmware can reliably support.</p>
</body>
</html>

View File

@ -234,9 +234,12 @@ std::string Wipe::wipe(GCode &gcodegen, bool toolchange)
double wipe_speed = gcodegen.writer().config.travel_speed.value * 0.8;
// get the retraction length
double length = toolchange
? gcodegen.writer().tool()->retract_length_toolchange()
: gcodegen.writer().tool()->retract_length();
double length = gcodegen.writer().tool()->retract_length();
if (toolchange) {
length = gcodegen.writer().tool()->retract_length_toolchange();
} else if (gcodegen.writer().config_region && gcodegen.writer().config_region->print_retract_length.value >= 0) {
length = gcodegen.writer().config_region->print_retract_length.value;
}
// Shorten the retraction length by the amount already retracted before wipe.
length *= (1. - gcodegen.writer().tool()->retract_before_wipe());
@ -2501,7 +2504,7 @@ void GCode::process_layer(
m_layer = layers[instance_to_print.layer_id].layer();
}
for (ObjectByExtruder::Island &island : instance_to_print.object_by_extruder.islands) {
const auto& by_region_specific =
const std::vector<ObjectByExtruder::Island::Region>& by_region_specific =
is_anything_overridden ?
island.by_region_per_copy(by_region_per_copy_cache,
static_cast<unsigned int>(instance_to_print.instance_id),
@ -3732,8 +3735,9 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vector<Obje
{
std::string gcode;
for (const ObjectByExtruder::Island::Region &region : by_region)
if (! region.perimeters.empty()) {
if (!region.perimeters.empty()) {
m_config.apply(print.regions()[&region - &by_region.front()]->config());
m_writer.apply_print_region_config(print.regions()[&region - &by_region.front()]->config());
for (const ExtrusionEntity *ee : region.perimeters)
gcode += this->extrude_entity(*ee, "", -1., &lower_layer_edge_grid);
}
@ -3745,8 +3749,9 @@ std::string GCode::extrude_infill(const Print &print, const std::vector<ObjectBy
{
std::string gcode;
for (const ObjectByExtruder::Island::Region &region : by_region) {
if (print.regions()[&region - &by_region.front()]->config().infill_first == is_infill_first) {
if (!region.infills.empty() && print.regions()[&region - &by_region.front()]->config().infill_first == is_infill_first) {
m_config.apply(print.regions()[&region - &by_region.front()]->config());
m_writer.apply_print_region_config(print.regions()[&region - &by_region.front()]->config());
ExtrusionEntitiesPtr extrusions { region.infills };
chain_and_reorder_extrusion_entities(extrusions, &m_last_pos);
for (const ExtrusionEntity *fill : extrusions) {

View File

@ -26,6 +26,11 @@ void GCodeWriter::apply_print_config(const PrintConfig &print_config)
print_config.machine_max_acceleration_extruding.values.front() : 0);
}
void GCodeWriter::apply_print_region_config(const PrintRegionConfig& print_region_config)
{
config_region = &print_region_config;
}
void GCodeWriter::set_extruders(std::vector<uint16_t> extruder_ids)
{
std::sort(extruder_ids.begin(), extruder_ids.end());
@ -474,6 +479,14 @@ std::string GCodeWriter::retract(bool before_wipe)
{
double factor = before_wipe ? m_tool->retract_before_wipe() : 1.;
assert(factor >= 0. && factor <= 1. + EPSILON);
//check for override
if (config_region && config_region->print_retract_length >= 0) {
return this->_retract(
factor * config_region->print_retract_length,
factor * m_tool->retract_restart_extra(),
"retract"
);
}
return this->_retract(
factor * m_tool->retract_length(),
factor * m_tool->retract_restart_extra(),

View File

@ -15,6 +15,8 @@ public:
static std::string PausePrintCode;
GCodeConfig config;
bool multiple_extruders;
// override from region
const PrintRegionConfig* config_region = nullptr;
GCodeWriter() :
multiple_extruders(false), m_extrusion_axis("E"), m_tool(nullptr),
@ -28,6 +30,7 @@ public:
std::string extrusion_axis() const { return m_extrusion_axis; }
void apply_print_config(const PrintConfig &print_config);
void apply_print_region_config(const PrintRegionConfig& print_region_config);
// Extruders are expected to be sorted in an increasing order.
void set_extruders(std::vector<uint16_t> extruder_ids);
const std::vector<Extruder>& extruders() const { return m_extruders; }

View File

@ -2463,6 +2463,7 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("Retraction is not triggered when travel moves are shorter than this length.");
def->sidetext = L("mm");
def->mode = comAdvanced;
def->min = 0;
def->set_default_value(new ConfigOptionFloats { 2. });
def = this->add("retract_before_wipe", coPercents);
@ -2488,8 +2489,16 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("When retraction is triggered, filament is pulled back by the specified amount "
"(the length is measured on raw filament, before it enters the extruder).");
def->sidetext = L("mm (zero to disable)");
def->min = 0;
def->set_default_value(new ConfigOptionFloats { 2. });
def = this->add("print_retract_length", coFloat);
def->label = L("Retraction length");
def->category = OptionCategory::width;
def->tooltip = L("Override the retract_length settign from the printer config. Used for calibration. Set negative to disable");
def->mode = comExpert;
def->set_default_value(new ConfigOptionFloat( -1.f));
def = this->add("retract_length_toolchange", coFloats);
def->label = L("Length");
def->full_label = L("Retraction Length (Toolchange)");
@ -2498,6 +2507,7 @@ void PrintConfigDef::init_fff_params()
"the extruder).");
def->sidetext = L("mm (zero to disable)");
def->mode = comExpert;
def->min = 0;
def->set_default_value(new ConfigOptionFloats { 10. });
def = this->add("retract_lift", coFloats);

View File

@ -681,6 +681,7 @@ public:
// Total number of perimeters.
ConfigOptionInt perimeters;
ConfigOptionPercent print_extrusion_multiplier;
ConfigOptionFloat print_retract_length;
ConfigOptionFloatOrPercent small_perimeter_speed;
ConfigOptionEnum<InfillPattern> solid_fill_pattern;
ConfigOptionFloat solid_infill_below_area;
@ -768,6 +769,7 @@ protected:
OPT_PTR(perimeter_speed);
OPT_PTR(perimeters);
OPT_PTR(print_extrusion_multiplier);
OPT_PTR(print_retract_length);
OPT_PTR(small_perimeter_speed);
OPT_PTR(solid_fill_pattern);
OPT_PTR(solid_infill_below_area);

View File

@ -154,16 +154,30 @@ SVG::draw_outline(const Surfaces &surfaces, std::string stroke_outer, std::strin
}
void
SVG::draw(const SurfacesPtr &surfaces, std::string fill, const float fill_opacity)
SVG::draw(const SurfacesPtr& surfaces, std::string fill, const float fill_opacity)
{
for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
this->draw(*(*it), fill, fill_opacity);
}
void
SVG::draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
void
SVG::draw_outline(const SurfacesPtr& surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
{
for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it)
for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
draw_outline(*(*it), stroke_outer, stroke_holes, stroke_width);
}
void
SVG::draw(const SurfacesConstPtr& surfaces, std::string fill, const float fill_opacity)
{
for (SurfacesConstPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
this->draw(*(*it), fill, fill_opacity);
}
void
SVG::draw_outline(const SurfacesConstPtr& surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
{
for (SurfacesConstPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
draw_outline(*(*it), stroke_outer, stroke_holes, stroke_width);
}

View File

@ -53,8 +53,10 @@ public:
void draw_outline(const Surface &surface, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
void draw(const Surfaces &surfaces, std::string fill = "grey", const float fill_opacity=1.f);
void draw_outline(const Surfaces &surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
void draw(const SurfacesPtr &surfaces, std::string fill = "grey", const float fill_opacity=1.f);
void draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
void draw(const SurfacesPtr& surfaces, std::string fill = "grey", const float fill_opacity = 1.f);
void draw_outline(const SurfacesPtr& surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
void draw(const SurfacesConstPtr& surfaces, std::string fill = "grey", const float fill_opacity = 1.f);
void draw_outline(const SurfacesConstPtr& surfaces, std::string stroke_outer = "black", std::string stroke_holes = "blue", coordf_t stroke_width = 0);
void draw(const Polygon &polygon, std::string fill = "grey");
void draw_outline(const Polygon &polygon, std::string stroke = "black", coordf_t stroke_width = 0);

View File

@ -32,6 +32,8 @@ set(SLIC3R_GUI_SOURCES
GUI/CalibrationOverBridgeDialog.hpp
GUI/CalibrationTempDialog.cpp
GUI/CalibrationTempDialog.hpp
GUI/CalibrationRetractionDialog.cpp
GUI/CalibrationRetractionDialog.hpp
GUI/ConfigSnapshotDialog.cpp
GUI/ConfigSnapshotDialog.hpp
GUI/3DScene.cpp

View File

@ -41,11 +41,11 @@ void CalibrationOverBridgeDialog::create_geometry(wxCommandEvent& event_args) {
assert(objs_idx.size() == 6);
const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config();
const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config();
const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config();
/// --- scale ---
// model is created for a 0.4 nozzle, scale xy with nozzle size.
const ConfigOptionFloats* nozzle_diameter_config = printerConfig->option<ConfigOptionFloats>("nozzle_diameter");
const ConfigOptionFloats* nozzle_diameter_config = printer_config->option<ConfigOptionFloats>("nozzle_diameter");
assert(nozzle_diameter_config->values.size() > 0);
float nozzle_diameter = nozzle_diameter_config->values[0];
float xyz_scale = (0.2 + nozzle_diameter) / 0.6;
@ -68,7 +68,7 @@ void CalibrationOverBridgeDialog::create_geometry(wxCommandEvent& event_args) {
/// --- translate ---;
const ConfigOptionFloat* extruder_clearance_radius = print_config->option<ConfigOptionFloat>("extruder_clearance_radius");
const ConfigOptionPoints* bed_shape = printerConfig->option<ConfigOptionPoints>("bed_shape");
const ConfigOptionPoints* bed_shape = printer_config->option<ConfigOptionPoints>("bed_shape");
const float brim_width = print_config->option<ConfigOptionFloat>("brim_width")->getFloat();
Vec2d bed_size = BoundingBoxf(bed_shape->values).size();
Vec2d bed_min = BoundingBoxf(bed_shape->values).min;

View File

@ -0,0 +1,248 @@
#include "CalibrationRetractionDialog.hpp"
#include "I18N.hpp"
#include "libslic3r/Utils.hpp"
#include "GUI.hpp"
#include "GUI_ObjectList.hpp"
#include "Tab.hpp"
#include <wx/scrolwin.h>
#include <wx/display.h>
#include <wx/file.h>
#include "wxExtensions.hpp"
#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 CalibrationRetractionDialog::create_buttons(wxStdDialogButtonSizer* buttons){
wxString choices_steps[] = { "0.1","0.2","0.5","1" };
steps = new wxComboBox(this, wxID_ANY, wxString{ "0.2" }, wxDefaultPosition, wxDefaultSize, 4, choices_steps);
steps->SetToolTip(_(L("Each militer add this value to the retraction value. ")));
steps->SetSelection(1);
wxString choices_nb[] = { "2","4","6","8","10","15","20","25" };
nb_steps = new wxComboBox(this, wxID_ANY, wxString{ "10" }, wxDefaultPosition, wxDefaultSize, 8, choices_nb);
nb_steps->SetToolTip(_(L("Select the number milimeters for the tower.")));
nb_steps->SetSelection(4);
//wxString choices_start[] = { "current","260","250","240","230","220","210" };
//start_step = new wxComboBox(this, wxID_ANY, wxString{ "current" }, wxDefaultPosition, wxDefaultSize, 7, choices_start);
//start_step->SetToolTip(_(L("Select the highest temperature to test for.")));
//start_step->SetSelection(0);
//wxString choices_decr[] = { "one test","2x10°","3x10°","4x10°","3x5°","5x5°" };
//decr_temp = new wxComboBox(this, wxID_ANY, wxString{ "current" }, wxDefaultPosition, wxDefaultSize, 6, choices_decr);
//decr_temp->SetToolTip(_(L("Select the number tower to print, and by how many degrees C to decrease each time.")));
//decr_temp->SetSelection(0);
buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "step:" }));
buttons->Add(steps);
buttons->AddSpacer(15);
buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "height:" }));
buttons->Add(nb_steps);
buttons->AddSpacer(20);
//buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "start temp:" }));
//buttons->Add(start_step);
//buttons->AddSpacer(15);
//buttons->Add(new wxStaticText(this, wxID_ANY, wxString{ "temp decr:" }));
//buttons->Add(decr_temp);
//buttons->AddSpacer(20);
wxButton* bt = new wxButton(this, wxID_FILE1, _(L("Remove fil. slowdown")));
bt->Bind(wxEVT_BUTTON, &CalibrationRetractionDialog::remove_slowdown, this);
buttons->Add(bt);
buttons->AddSpacer(30);
bt = new wxButton(this, wxID_FILE1, _(L("Generate")));
bt->Bind(wxEVT_BUTTON, &CalibrationRetractionDialog::create_geometry, this);
buttons->Add(bt);
}
void CalibrationRetractionDialog::remove_slowdown(wxCommandEvent& event_args) {
const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config();
DynamicPrintConfig new_filament_config = *filament_config; //make a copy
const ConfigOptionInts *fil_conf = filament_config->option<ConfigOptionInts>("slowdown_below_layer_time");
ConfigOptionInts *new_fil_conf = new ConfigOptionInts();
new_fil_conf->default_value = 5;
new_fil_conf->values = fil_conf->values;
new_fil_conf->values[0] = 0;
new_filament_config.set_key_value("slowdown_below_layer_time", new_fil_conf);
fil_conf = filament_config->option<ConfigOptionInts>("fan_below_layer_time"); new_fil_conf = new ConfigOptionInts();
new_fil_conf->default_value = 60;
new_fil_conf->values = fil_conf->values;
new_fil_conf->values[0] = 0;
new_filament_config.set_key_value("fan_below_layer_time", new_fil_conf);
this->gui_app->get_tab(Preset::TYPE_FILAMENT)->load_config(new_filament_config);
this->main_frame->plater()->on_config_change(new_filament_config);
this->gui_app->get_tab(Preset::TYPE_FILAMENT)->update_dirty();
}
void CalibrationRetractionDialog::create_geometry(wxCommandEvent& event_args) {
Plater* plat = this->main_frame->plater();
Model& model = plat->model();
plat->reset();
size_t nb_retract = nb_steps->GetSelection() < 4 ? ((int(nb_steps->GetSelection()) + 1) * 2) : ((int(nb_steps->GetSelection()) - 2) * 5);
size_t nb_items = 1;
//if (start_step->GetSelection() == 1) {
// nb_items = 2;
//} else if (start_step->GetSelection() == 2 || start_step->GetSelection() == 4) {
// nb_items = 3;
//} else if (start_step->GetSelection() == 3) {
// nb_items = 4;
//} else if (start_step->GetSelection() == 5) {
// nb_items = 5;
//}
std::vector<std::string> items;
items.emplace_back(Slic3r::resources_dir() + "/calibration/retraction/retraction_calibration.amf");
std::vector<size_t> objs_idx = plat->load_files(items, true, false, false);
assert(objs_idx.size() == nb_items);
const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config();
const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config();
const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config();
double retraction_start = 0;
int temp = filament_config->option<ConfigOptionInts>("temperature")->get_at(0);
double retraction_steps = 0.01;
if (steps->GetSelection() == 0)
retraction_steps = 0.1;
if (steps->GetSelection() == 1)
retraction_steps = 0.2;
if (steps->GetSelection() == 2)
retraction_steps = 0.5;
if (steps->GetSelection() == 3)
retraction_steps = 1;
if (steps->GetSelection() == 4)
retraction_steps = 2;
/// --- scale ---
// model is created for a 0.4 nozzle, scale xy with nozzle size.
const ConfigOptionFloats* nozzle_diameter_config = printer_config->option<ConfigOptionFloats>("nozzle_diameter");
assert(nozzle_diameter_config->values.size() > 0);
float nozzle_diameter = nozzle_diameter_config->values[0];
float xyScale = nozzle_diameter / 0.4;
//scale z to have 6 layers
const ConfigOptionFloatOrPercent* first_layer_height_setting = print_config->option<ConfigOptionFloatOrPercent>("first_layer_height");
double first_layer_height = first_layer_height_setting->get_abs_value(nozzle_diameter);
first_layer_height = nozzle_diameter / 2; //TODO remove and use the user's first_layer_height
double layer_height = nozzle_diameter / 2.;
first_layer_height = std::max(first_layer_height, nozzle_diameter / 2.);
float scale = nozzle_diameter / 0.4;
//do scaling
if (scale < 0.9 || 1.2 < scale) {
for (size_t i = 0; i < nb_items; i++)
model.objects[objs_idx[i]]->scale(scale, scale, scale);
}
//add sub-part after scale
float zshift = (1 - scale) / 2 + 0.4 * scale;
float zscale_number = (first_layer_height + layer_height) / 0.4;
std::vector<ModelObject*> part_tower;
//add_part(model.objects[objs_idx[0]], Slic3r::resources_dir()+"/calibration/filament_temp/t215.amf", Vec3d{ 0,0,zshift-5.2*scale }, Vec3d{ scale,scale,scale });
//model.objects[objs_idx[0]]->volumes[1]->rotate(PI/2, Vec3d(0, 0, 1));
//model.objects[objs_idx[0]]->volumes[1]->rotate(-PI / 2, Vec3d(1, 0, 0));
for (size_t num_retract = 0; num_retract < nb_retract; num_retract++) {
part_tower.push_back(add_part(model.objects[objs_idx[0]], Slic3r::resources_dir()+"/calibration/retraction/retraction_calibration_pillar.amf", Vec3d{ 0,0,zshift + scale * num_retract }, Vec3d{ scale,scale,scale }));
}
/// --- translate ---;
const ConfigOptionFloat* extruder_clearance_radius = print_config->option<ConfigOptionFloat>("extruder_clearance_radius");
const ConfigOptionPoints* bed_shape = printer_config->option<ConfigOptionPoints>("bed_shape");
const float brim_width = std::max(print_config->option<ConfigOptionFloat>("brim_width")->value, nozzle_diameter * 5.);
Vec2d bed_size = BoundingBoxf(bed_shape->values).size();
Vec2d bed_min = BoundingBoxf(bed_shape->values).min;
float offsety = 2 + 22 * 1 + extruder_clearance_radius->value + brim_width + (brim_width > extruder_clearance_radius->value ? brim_width - extruder_clearance_radius->value : 0);
model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, 0 });
/// --- custom config ---
for (size_t i = 0; i < nb_items; i++) {
//speed
double perimeter_speed = print_config->option<ConfigOptionFloat>("perimeter_speed")->value;
double external_perimeter_speed = print_config->option<ConfigOptionFloatOrPercent>("external_perimeter_speed")->get_abs_value(perimeter_speed);
//filament test
//const ConfigOptionInts* fil_conf = filament_config->option<ConfigOptionInts>("slowdown_below_layer_time");
//ConfigOptionInts* new_fil_conf = new ConfigOptionInts();
//new_fil_conf->default_value = 5;
//new_fil_conf->values = fil_conf->values;
//new_fil_conf->values[0] = 0;
//model.objects[objs_idx[i]]->config.set_key_value("slowdown_below_layer_time", new_fil_conf);
//fil_conf = filament_config->option<ConfigOptionInts>("temperature");
//new_fil_conf = new ConfigOptionInts();
//new_fil_conf->values = fil_conf->values;
//new_fil_conf->values[0] = 150;
//model.objects[objs_idx[i]]->config.set_key_value("temperature", new_fil_conf);
//brim to have some time to build up pressure in the nozzle
model.objects[objs_idx[i]]->config.set_key_value("brim_width", new ConfigOptionFloat(0));
model.objects[objs_idx[i]]->config.set_key_value("perimeters", new ConfigOptionInt(2));
model.objects[objs_idx[i]]->config.set_key_value("external_perimeters_first", new ConfigOptionBool(false));
model.objects[objs_idx[i]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(0));
model.objects[objs_idx[i]]->volumes[0]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(2));
//model.objects[objs_idx[i]]->volumes[1]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(2));
model.objects[objs_idx[i]]->config.set_key_value("top_solid_layers", new ConfigOptionInt(0));
model.objects[objs_idx[i]]->config.set_key_value("fill_density", new ConfigOptionPercent(0));
//model.objects[objs_idx[i]]->config.set_key_value("fill_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
model.objects[objs_idx[i]]->config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false));
model.objects[objs_idx[i]]->config.set_key_value("overhangs", new ConfigOptionBool(false));
model.objects[objs_idx[i]]->config.set_key_value("thin_walls", new ConfigOptionBool(true));
model.objects[objs_idx[i]]->config.set_key_value("thin_walls_min_width", new ConfigOptionFloatOrPercent(2,true));
model.objects[objs_idx[i]]->config.set_key_value("gap_fill", new ConfigOptionBool(false));
model.objects[objs_idx[i]]->config.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(nozzle_diameter / 2., false));
model.objects[objs_idx[i]]->config.set_key_value("layer_height", new ConfigOptionFloat(nozzle_diameter / 2.));
//set retraction override
int num_part = 0;
for (ModelObject* part : part_tower) {
model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("print_retract_length", new ConfigOptionFloat(retraction_start + num_part * retraction_steps));
model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("small_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false));
model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("perimeter_speed", new ConfigOptionFloat(std::min(external_perimeter_speed, perimeter_speed)));
model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false));
model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("small_perimeter_speed", new ConfigOptionFloatOrPercent(external_perimeter_speed, false));
//model.objects[objs_idx[i]]->volumes[num_part + 1]->config.set_key_value("infill_speed", new ConfigOptionFloat(std::min(print_config->option<ConfigOptionFloat>("infill_speed")->value, 10.*scale)));
num_part++;
}
}
/// --- main config, please modify object config when possible ---
if (nb_items > 1) {
DynamicPrintConfig new_print_config = *print_config; //make a copy
new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true));
//if skirt, use only one
if (print_config->option<ConfigOptionInt>("skirts")->getInt() > 0 && print_config->option<ConfigOptionInt>("skirt_height")->getInt() > 0) {
new_print_config.set_key_value("complete_objects_one_skirt", new ConfigOptionBool(true));
}
this->gui_app->get_tab(Preset::TYPE_PRINT)->load_config(new_print_config);
plat->on_config_change(new_print_config);
this->gui_app->get_tab(Preset::TYPE_PRINT)->update_dirty();
}
//update plater
plat->changed_objects(objs_idx);
//update everything, easier to code.
ObjectList* obj = this->gui_app->obj_list();
obj->update_after_undo_redo();
plat->reslice();
plat->select_view_3D("Preview");
}
} // namespace GUI
} // namespace Slic3r

View File

@ -0,0 +1,30 @@
#ifndef slic3r_GUI_CalibrationRetractionDialog_hpp_
#define slic3r_GUI_CalibrationRetractionDialog_hpp_
#include "CalibrationAbstractDialog.hpp"
namespace Slic3r {
namespace GUI {
class CalibrationRetractionDialog : public CalibrationAbstractDialog
{
public:
CalibrationRetractionDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Flow calibration") { create("/calibration/retraction/retraction.html", wxSize(900, 500)); }
virtual ~CalibrationRetractionDialog() {}
protected:
void create_buttons(wxStdDialogButtonSizer* sizer) override;
void remove_slowdown(wxCommandEvent& event_args);
void create_geometry(wxCommandEvent& event_args);
wxComboBox* steps;
wxComboBox* nb_steps;
wxComboBox* start_step;
wxComboBox* decr_temp;
};
} // namespace GUI
} // namespace Slic3r
#endif

View File

@ -57,12 +57,12 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) {
Slic3r::resources_dir()+"/calibration/filament_temp/Smart_compact_temperature_calibration_item.amf"}, true, false, false);
assert(objs_idx.size() == 1);
const DynamicPrintConfig* printConfig = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config();
const DynamicPrintConfig* filamentConfig = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config();
const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config();
const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config();
const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FILAMENT)->get_config();
const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config();
// -- get temps
const ConfigOptionInts* temperature_config = filamentConfig->option<ConfigOptionInts>("temperature");
const ConfigOptionInts* temperature_config = filament_config->option<ConfigOptionInts>("temperature");
assert(temperature_config->values.size() >= 1);
int idx_steps = steps->GetSelection();
int idx_up = nb_up->GetSelection();
@ -76,7 +76,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) {
/// --- scale ---
//model is created for a 0.4 nozzle, scale xy with nozzle size.
const ConfigOptionFloats* nozzle_diameter_config = printerConfig->option<ConfigOptionFloats>("nozzle_diameter");
const ConfigOptionFloats* nozzle_diameter_config = printer_config->option<ConfigOptionFloats>("nozzle_diameter");
assert(nozzle_diameter_config->values.size() > 0);
float nozzle_diameter = nozzle_diameter_config->values[0];
float xyzScale = nozzle_diameter / 0.4;
@ -107,13 +107,13 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) {
/// --- translate ---
const ConfigOptionPoints* bed_shape = printerConfig->option<ConfigOptionPoints>("bed_shape");
const ConfigOptionPoints* bed_shape = printer_config->option<ConfigOptionPoints>("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, 0 });
/// --- main config, please modify object config when possible ---
DynamicPrintConfig new_print_config = *printConfig; //make a copy
DynamicPrintConfig new_print_config = *print_config; //make a copy
new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false));
/// -- generate the heat change gcode
@ -129,7 +129,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) {
//new_printer_config.set_key_value("layer_gcode", new ConfigOptionString(str_layer_gcode));
/// --- custom config ---
float brim_width = printConfig->option<ConfigOptionFloat>("brim_width")->value;
float brim_width = print_config->option<ConfigOptionFloat>("brim_width")->value;
if (brim_width < nozzle_diameter * 8) {
model.objects[objs_idx[0]]->config.set_key_value("brim_width", new ConfigOptionFloat(nozzle_diameter * 8));
}
@ -152,7 +152,7 @@ void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) {
//plat->on_config_change(new_printer_config);
plat->changed_objects(objs_idx);
this->gui_app->get_tab(Preset::TYPE_PRINT)->update_dirty();
this->gui_app->get_tab(Preset::TYPE_PRINTER)->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();

View File

@ -46,6 +46,7 @@
#include "CalibrationFlowDialog.hpp"
#include "CalibrationOverBridgeDialog.hpp"
#include "CalibrationTempDialog.hpp"
#include "CalibrationRetractionDialog.hpp"
#include "ConfigSnapshotDialog.hpp"
#include "FreeCADDialog.hpp"
#include "FirmwareDialog.hpp"
@ -602,6 +603,10 @@ void GUI_App::calibration_cube_dialog()
{
change_calibration_dialog(nullptr, new CalibrationCubeDialog(this, mainframe));
}
void GUI_App::calibration_retraction_dialog()
{
change_calibration_dialog(nullptr, new CalibrationRetractionDialog(this, mainframe));
}
void GUI_App::freecad_script_dialog()
{
change_calibration_dialog(nullptr, new FreeCADDialog(this, mainframe));

View File

@ -139,6 +139,7 @@ public:
void bridge_tuning_dialog();
void over_bridge_dialog();
void calibration_cube_dialog();
void calibration_retraction_dialog();
void freecad_script_dialog();
//void support_tuning(); //have to do multiple, in a submenu
void load_project(wxWindow *parent, wxString& input_file) const;

View File

@ -780,6 +780,8 @@ void MainFrame::init_menubar()
[this](wxCommandEvent&) { wxGetApp().bridge_tuning_dialog(); });
append_menu_item(calibrationMenu, wxID_ANY, _(L("Ironing pattern calibration")), _(L("Create a test print to help you to set your over-bridge flow ratio and ironing pattern.")),
[this](wxCommandEvent&) { wxGetApp().over_bridge_dialog(); });
append_menu_item(calibrationMenu, 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(); });
calibrationMenu->AppendSeparator();
append_menu_item(calibrationMenu, wxID_ANY, _(L("Calibration cube")), _(L("Print a calibration cube, for various calibration goals.")),
[this](wxCommandEvent&) { wxGetApp().calibration_cube_dialog(); });

View File

@ -539,6 +539,7 @@ const std::vector<std::string>& Preset::print_options()
, "curve_smoothing_angle_convex"
, "curve_smoothing_angle_concave",
"print_extrusion_multiplier",
"print_retract_length",
"external_perimeter_cut_corners",
"external_perimeter_overlap",
"perimeter_bonding",