add seam_gap for hiding seam on loops

also finish coFloatsOrPercents, as it's the first setting to use this.
supermerill/SuperSlicer#1534
supermerill/SuperSlicer#1606
This commit is contained in:
supermerill 2021-10-02 23:04:43 +02:00
parent a4caa5d1c3
commit 1e7bd53668
16 changed files with 169 additions and 57 deletions

View File

@ -34,6 +34,7 @@ group:Retraction wipe
setting:idx:wipe_speed
setting:idx:retract_before_wipe
setting:idx:wipe_extra_perimeter
setting:idx:seam_gap
group:Retraction when tool is disabled (advanced settings for multi-extruder setups)
setting:idx:retract_length_toolchange
setting:idx:retract_restart_extra_toolchange

View File

@ -159,7 +159,7 @@ public:
};
// Type of a configuration value.
enum ConfigOptionType {
enum ConfigOptionType : uint16_t{
coVectorType = 0x4000,
coNone = 0,
// single float
@ -1113,7 +1113,7 @@ struct FloatOrPercent
private:
friend class cereal::access;
template<class Archive> void serialize(Archive & ar) { ar(this->flags); ar(this->value); ar(this->percent); }
template<class Archive> void serialize(Archive & ar) {ar(this->value); ar(this->percent); }
};
inline bool operator==(const FloatOrPercent &l, const FloatOrPercent &r)
@ -1717,6 +1717,7 @@ public:
case coFloats: { auto opt = new ConfigOptionFloatsNullable(); archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
case coInts: { auto opt = new ConfigOptionIntsNullable(); archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
case coPercents: { auto opt = new ConfigOptionPercentsNullable();archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
case coFloatsOrPercents:{ auto opt = new ConfigOptionFloatsOrPercentsNullable();archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
case coBools: { auto opt = new ConfigOptionBoolsNullable(); archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
default: throw ConfigurationError(std::string("ConfigOptionDef::load_option_from_archive(): Unknown nullable option type for option ") + this->opt_key);
}
@ -1731,6 +1732,7 @@ public:
case coPercent: { auto opt = new ConfigOptionPercent(); archive(*opt); return opt; }
case coPercents: { auto opt = new ConfigOptionPercents(); archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
case coFloatOrPercent: { auto opt = new ConfigOptionFloatOrPercent(); archive(*opt); return opt; }
case coFloatsOrPercents:{ auto opt = new ConfigOptionFloatsOrPercents();archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
case coPoint: { auto opt = new ConfigOptionPoint(); archive(*opt); return opt; }
case coPoints: { auto opt = new ConfigOptionPoints(); archive(*opt); opt->set_is_extruder_size(this->is_vector_extruder); return opt; }
case coPoint3: { auto opt = new ConfigOptionPoint3(); archive(*opt); return opt; }
@ -1748,6 +1750,7 @@ public:
case coFloats: archive(*static_cast<const ConfigOptionFloatsNullable*>(opt)); break;
case coInts: archive(*static_cast<const ConfigOptionIntsNullable*>(opt)); break;
case coPercents: archive(*static_cast<const ConfigOptionPercentsNullable*>(opt));break;
case coFloatsOrPercents:archive(*static_cast<const ConfigOptionFloatsOrPercentsNullable*>(opt));break;
case coBools: archive(*static_cast<const ConfigOptionBoolsNullable*>(opt)); break;
default: throw ConfigurationError(std::string("ConfigOptionDef::save_option_to_archive(): Unknown nullable option type for option ") + this->opt_key);
}
@ -1762,6 +1765,7 @@ public:
case coPercent: archive(*static_cast<const ConfigOptionPercent*>(opt)); break;
case coPercents: archive(*static_cast<const ConfigOptionPercents*>(opt)); break;
case coFloatOrPercent: archive(*static_cast<const ConfigOptionFloatOrPercent*>(opt)); break;
case coFloatsOrPercents:archive(*static_cast<const ConfigOptionFloatsOrPercents*>(opt));break;
case coPoint: archive(*static_cast<const ConfigOptionPoint*>(opt)); break;
case coPoints: archive(*static_cast<const ConfigOptionPoints*>(opt)); break;
case coPoint3: archive(*static_cast<const ConfigOptionPoint3*>(opt)); break;

View File

@ -422,14 +422,15 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
// Maximum length of the perimeter segment linking two infill lines.
f->link_max_length = (coord_t)scale_(link_max_length);
// Used by the concentric infill pattern to clip the loops to create extrusion paths.
f->loop_clipping = coord_t(scale_(surface_fill.params.flow.nozzle_diameter) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER);
//give the overlap size to let the infill do his overlap
//add overlap if at least one perimeter
const LayerRegion* layerm = this->m_regions[surface_fill.region_id];
const float perimeter_spacing = layerm->flow(frPerimeter).spacing();
// Used by the concentric infill pattern to clip the loops to create extrusion paths.
f->loop_clipping = scale_t(layerm->region()->config().get_computed_value("seam_gap", surface_fill.params.extruder - 1) * surface_fill.params.flow.nozzle_diameter);
// apply half spacing using this flow's own spacing and generate infill
//FillParams params;
//params.density = float(0.01 * surface_fill.params.density);

View File

@ -513,7 +513,7 @@ std::vector<GCode::LayerToPrint> GCode::collect_layers_to_print(const PrintObjec
//FIXME should we use the printing extruders instead?
double gap_over_supports = object.config().support_material_contact_distance_top;
// FIXME should we test object.config().support_material_synchronize_layers ? IN prusa code, the support layers are synchronized with object layers iff soluble supports.
assert(!object.config().support_material || gap_over_supports != 0. || object.config().support_material_synchronize_layers);
//assert(!object.config().support_material || gap_over_supports != 0. || object.config().support_material_synchronize_layers);
if (gap_over_supports != 0.) {
gap_over_supports = std::max(0., gap_over_supports);
// Not a soluble support,
@ -2870,9 +2870,9 @@ std::string GCode::extrude_loop_vase(const ExtrusionLoop &original_loop, const s
// clip the path to avoid the extruder to get exactly on the first point of the loop;
// if polyline was shorter than the clipping distance we'd get a null polyline, so
// we discard it in that case
double clip_length = m_enable_loop_clipping ?
scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter,0)) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER :
0;
double clip_length = 0;
if (m_enable_loop_clipping && m_writer.tool_is_extruder())
clip_length = m_config.seam_gap.get_abs_value(m_writer.tool()->id(), scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
// get paths
ExtrusionPaths paths;
@ -3187,9 +3187,9 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
// clip the path to avoid the extruder to get exactly on the first point of the loop;
// if polyline was shorter than the clipping distance we'd get a null polyline, so
// we discard it in that case
double clip_length = m_enable_loop_clipping ?
scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter,0)) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER :
0;
double clip_length = 0;
if (m_enable_loop_clipping && m_writer.tool_is_extruder())
clip_length = m_config.seam_gap.get_abs_value(m_writer.tool()->id(), scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
// get paths
ExtrusionPaths paths;

View File

@ -902,6 +902,13 @@ namespace client
break;
} else
ctx->throw_exception("Unknown scalar variable type", opt.it_range);
case coFloatsOrPercents:
opt_def = print_config_def.get(opt_key);
if (opt_def->is_vector_extruder) {
output.set_d(ctx->get_computed_value(opt_key));
break;
} else
ctx->throw_exception("Unknown scalar variable type", opt.it_range);
case coStrings:
opt_def = print_config_def.get(opt_key);
if (opt_def->is_vector_extruder) {
@ -942,6 +949,7 @@ namespace client
case coInts: output.set_i(static_cast<const ConfigOptionInts *>(opt.opt)->values[idx]); break;
case coStrings: output.set_s(static_cast<const ConfigOptionStrings *>(opt.opt)->values[idx]); break;
case coPercents: output.set_d(static_cast<const ConfigOptionPercents*>(opt.opt)->values[idx]); break;
case coFloatsOrPercents: output.set_d(static_cast<const ConfigOptionFloatsOrPercents*>(opt.opt)->values[idx].value); break;
case coPoints: output.set_s(to_string(static_cast<const ConfigOptionPoints *>(opt.opt)->values[idx])); break;
case coBools: output.set_b(static_cast<const ConfigOptionBools *>(opt.opt)->values[idx] != 0); break;
default:

View File

@ -688,7 +688,9 @@ const std::vector<std::string>& Preset::filament_options()
"external_perimeter_fan_speed",
// Retract overrides
"filament_retract_length", "filament_retract_lift", "filament_retract_lift_above", "filament_retract_lift_below", "filament_retract_speed", "filament_deretract_speed", "filament_retract_restart_extra", "filament_retract_before_travel",
"filament_retract_layer_change", "filament_wipe", "filament_wipe_speed", "filament_wipe_extra_perimeter", "filament_retract_before_wipe",
"filament_retract_layer_change", "filament_retract_before_wipe",
"filament_seam_gap",
"filament_wipe", "filament_wipe_extra_perimeter", "filament_wipe_speed",
// Profile compatibility
"filament_vendor", "compatible_prints", "compatible_prints_condition", "compatible_printers", "compatible_printers_condition", "inherits"
//merill adds
@ -1465,6 +1467,7 @@ inline t_config_option_keys deep_diff(const ConfigBase &config_this, const Confi
case coFloats: add_correct_opts_to_diff<ConfigOptionFloats >(opt_key, diff, config_other, config_this); break;
case coStrings: add_correct_opts_to_diff<ConfigOptionStrings >(opt_key, diff, config_other, config_this); break;
case coPercents:add_correct_opts_to_diff<ConfigOptionPercents >(opt_key, diff, config_other, config_this); break;
case coFloatsOrPercents:add_correct_opts_to_diff<ConfigOptionFloatsOrPercents>(opt_key, diff, config_other, config_this); break;
case coPoints: add_correct_opts_to_diff<ConfigOptionPoints >(opt_key, diff, config_other, config_this); break;
default: diff.emplace_back(opt_key); break;
}

View File

@ -3425,6 +3425,17 @@ void PrintConfigDef::init_fff_params()
def->mode = comExpert;
def->set_default_value(new ConfigOptionPercent(100));
def = this->add("seam_gap", coFloatsOrPercents);
def->label = L("Seam gap");
def->category = OptionCategory::extruders;
def->tooltip = L("To avoid visible seam, the extrusion can be stoppped a bit before the end of the loop."
"\nCan be a mm or a % of the current extruder diameter.");
def->sidetext = L("mm or %");
def->min = 0;
def->mode = comExpert;
def->is_vector_extruder = true;
def->set_default_value(new ConfigOptionFloatsOrPercents{ FloatOrPercent{15,true} });
#if 0
def = this->add("seam_preferred_direction", coFloat);
// def->gui_type = "slider";
@ -4657,7 +4668,9 @@ void PrintConfigDef::init_fff_params()
// bools
"retract_layer_change", "wipe",
// percents
"retract_before_wipe"}) {
"retract_before_wipe",
// floatsOrPercents
"seam_gap"}) {
auto it_opt = options.find(opt_key);
assert(it_opt != options.end());
def = this->add_nullable(std::string("filament_") + opt_key, it_opt->second.type);
@ -4669,6 +4682,7 @@ void PrintConfigDef::init_fff_params()
switch (def->type) {
case coFloats : def->set_default_value(new ConfigOptionFloatsNullable (static_cast<const ConfigOptionFloats* >(it_opt->second.default_value.get())->values)); break;
case coPercents : def->set_default_value(new ConfigOptionPercentsNullable(static_cast<const ConfigOptionPercents*>(it_opt->second.default_value.get())->values)); break;
case coFloatsOrPercents : def->set_default_value(new ConfigOptionFloatsOrPercentsNullable(static_cast<const ConfigOptionFloatsOrPercents*>(it_opt->second.default_value.get())->values)); break;
case coBools : def->set_default_value(new ConfigOptionBoolsNullable (static_cast<const ConfigOptionBools* >(it_opt->second.default_value.get())->values)); break;
default: assert(false);
}
@ -4679,32 +4693,33 @@ void PrintConfigDef::init_extruder_option_keys()
{
// ConfigOptionFloats, ConfigOptionPercents, ConfigOptionBools, ConfigOptionStrings
m_extruder_option_keys = {
"nozzle_diameter",
"min_layer_height",
"max_layer_height",
"extruder_colour",
"extruder_offset",
"extruder_fan_offset",
"extruder_temperature_offset",
"tool_name",
"default_filament_profile",
"deretract_speed",
"max_layer_height",
"min_layer_height",
"nozzle_diameter",
"retract_before_travel",
"retract_before_wipe",
"retract_layer_change",
"retract_length",
"retract_length_toolchange",
"retract_lift",
"retract_lift_above",
"retract_lift_below",
"retract_lift_first_layer",
"retract_lift_top",
"retract_speed",
"deretract_speed",
"retract_before_wipe",
"retract_restart_extra",
"retract_before_travel",
"retract_restart_extra_toolchange",
"retract_speed",
"seam_gap",
"tool_name",
"wipe",
"wipe_extra_perimeter",
"wipe_speed",
"retract_layer_change",
"retract_length_toolchange",
"retract_restart_extra_toolchange",
"extruder_colour",
"default_filament_profile"
};
m_extruder_retract_keys = {
@ -4718,6 +4733,7 @@ void PrintConfigDef::init_extruder_option_keys()
"retract_lift_below",
"retract_restart_extra",
"retract_speed",
"seam_gap",
"wipe",
"wipe_extra_perimeter",
"wipe_speed",
@ -5779,6 +5795,7 @@ std::unordered_set<std::string> prusa_export_to_remove_keys = {
"retract_lift_first_layer",
"retract_lift_top",
"seam_angle_cost",
"seam_gap",
"seam_travel_cost",
"skirt_brim",
"skirt_distance_from_brim",
@ -6632,6 +6649,13 @@ std::string FullPrintConfig::validate()
break;
}
break;
case coFloatsOrPercents:
for (FloatOrPercent v : static_cast<const ConfigOptionVector<FloatOrPercent>*>(opt)->values)
if (v.value < optdef->min || v.value > optdef->max) {
out_of_range = true;
break;
}
break;
case coInt:
{
auto *iopt = static_cast<const ConfigOptionInt*>(opt);

View File

@ -1349,6 +1349,7 @@ public:
ConfigOptionInt skirt_height;
ConfigOptionFloatOrPercent skirt_extrusion_width;
ConfigOptionBool draft_shield;
ConfigOptionFloatsOrPercents seam_gap;
ConfigOptionInt skirts;
ConfigOptionInts slowdown_below_layer_time;
ConfigOptionBool spiral_vase;
@ -1445,6 +1446,7 @@ protected:
OPT_PTR(resolution);
OPT_PTR(retract_before_travel);
OPT_PTR(retract_layer_change);
OPT_PTR(seam_gap);
OPT_PTR(skirt_brim);
OPT_PTR(skirt_distance);
OPT_PTR(skirt_distance_from_brim);

View File

@ -851,6 +851,7 @@ namespace Slic3r {
|| opt_key == "infill_connection_solid"
|| opt_key == "infill_connection_top"
|| opt_key == "infill_connection_bottom"
|| opt_key == "seam_gap"
|| opt_key == "top_infill_extrusion_spacing"
|| opt_key == "top_infill_extrusion_width" ) {
steps.emplace_back(posInfill);

View File

@ -64,7 +64,7 @@ static constexpr coord_t SCALED_RESOLUTION = coord_t(0.0125 * UNSCALING_FACTOR);
#define POLY_SIDES 24
#define PI 3.141592653589793238
// When extruding a closed loop, the loop is interrupted and shortened a bit to reduce the seam.
static constexpr double LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER = 0.15;
//static constexpr double LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER = 0.15; now seam_gap
// Maximum perimeter length for the loop to apply the small perimeter speed.
//#define SMALL_PERIMETER_LENGTH ((6.5 / SCALING_FACTOR) * 2 * PI)
static constexpr double INSET_OVERLAP_TOLERANCE = 0.4;

View File

@ -95,6 +95,7 @@ void Field::PostInitialize()
{
case coPercents:
case coFloats:
case coFloatsOrPercents:
case coStrings:
case coBools:
case coPoints:
@ -296,8 +297,11 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
break; }
case coString:
case coStrings:
m_value = std::string(str.ToUTF8().data());
break;
case coFloatsOrPercents:
case coFloatOrPercent: {
if (m_opt.type == coFloatOrPercent && !str.IsEmpty() && str.Last() != '%')
if (!str.IsEmpty() && str.Last() != '%')
{
double val = 0.;
// Replace the first occurence of comma in decimal number.
@ -364,8 +368,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
if ((!infill_anchors || val > 100) && dialog.ShowModal() == wxID_YES) {
set_value(from_u8((boost::format("%s%%") % stVal).str()), false/*true*/);
str += "%%";
}
else
} else
set_value(stVal, false); // it's no needed but can be helpful, when inputted value contained "," instead of "."
}
}
@ -480,6 +483,14 @@ void TextCtrl::BUILD() {
m_last_meaningful_value = text_value;
break;
}
case coFloatsOrPercents:
{
const ConfigOptionFloatsOrPercents* cofop = m_opt.get_default_value<ConfigOptionFloatsOrPercents>();
text_value = double_to_string(cofop->get_at(m_opt_idx).value, m_opt.precision);
if (cofop->get_at(m_opt_idx).percent)
text_value += "%";
break;
}
case coString:
text_value = m_opt.get_default_value<ConfigOptionString>()->value;
break;
@ -605,6 +616,7 @@ bool TextCtrl::value_was_changed()
case coString:
case coStrings:
case coFloatOrPercent:
case coFloatsOrPercents:
return boost::any_cast<std::string>(m_value) != boost::any_cast<std::string>(val);
default:
return true;

View File

@ -117,6 +117,17 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
double val = stod(str);
config.set_key_value(opt_key, new ConfigOptionFloatOrPercent(val, percent));
break; }
case coFloatsOrPercents: {
std::string str = boost::any_cast<std::string>(value);
bool percent = false;
if (str.back() == '%') {
str.pop_back();
percent = true;
}
double val = stod(str);
ConfigOptionFloatsOrPercents* vec_new = new ConfigOptionFloatsOrPercents{ boost::any_cast<FloatOrPercent>(FloatOrPercent{val, percent}) };
config.option<ConfigOptionFloatsOrPercents>(opt_key)->set_at(vec_new, opt_index, opt_index);
break; }
case coPercent:
config.set_key_value(opt_key, new ConfigOptionPercent(boost::any_cast<double>(value)));
break;

View File

@ -48,6 +48,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
case coFloats:
case coPercent:
case coPercents:
case coFloatsOrPercents:
case coString:
case coStrings:
m_fields.emplace(id, std::move(TextCtrl::Create<TextCtrl>(this->ctrl_parent(), opt, id)));
@ -860,6 +861,18 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
ret = double_to_string(val, opt->precision); }
}
break;
case coFloatsOrPercents: {
if (config.option(opt_key)->is_nil())
ret = _(L("N/A"));
else {
FloatOrPercent float_percent = config.option<ConfigOptionFloatsOrPercentsNullable>(opt_key)->get_at(idx);
text_value = double_to_string(float_percent.value, opt->precision);
if (float_percent.percent)
text_value += "%";
ret = text_value;
}
}
break;
case coBools:
ret = config.option<ConfigOptionBoolsNullable>(opt_key)->values[idx];
break;
@ -884,6 +897,16 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
ret = text_value;
break;
}
case coFloatsOrPercents:{
const ConfigOptionFloatsOrPercents &value = *config.option<ConfigOptionFloatsOrPercents>(opt_key);
text_value = double_to_string(value.get_at(idx).value, opt->precision);
if (value.get_at(idx).percent)
text_value += "%";
ret = text_value;
break;
}
case coPercent:{
double val = config.option<ConfigOptionPercent>(opt_key)->value;
text_value = double_to_string(val, opt->precision);

View File

@ -63,6 +63,16 @@ void change_opt_key(std::string& opt_key, DynamicPrintConfig* config, int& cnt)
opt_key += "#" + std::to_string(0);
}
void change_opt_keyFoP(std::string& opt_key, DynamicPrintConfig* config, int& cnt)
{
ConfigOptionFloatsOrPercents* opt_cur = static_cast<ConfigOptionFloatsOrPercents*>(config->option(opt_key));
cnt = opt_cur->values.size();
return;
if (opt_cur->values.size() > 0)
opt_key += "#" + std::to_string(0);
}
void OptionsSearcher::append_options(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode)
{
auto emplace = [this, type](const std::string opt_key, const wxString& label)
@ -102,6 +112,8 @@ void OptionsSearcher::append_options(DynamicPrintConfig* config, Preset::Type ty
case coFloats: change_opt_key<ConfigOptionFloats >(opt_key, config, cnt); break;
case coStrings: change_opt_key<ConfigOptionStrings >(opt_key, config, cnt); break;
case coPercents:change_opt_key<ConfigOptionPercents >(opt_key, config, cnt); break;
//case coFloatsOrPercents:change_opt_key<ConfigOptionFloatsOrPercents >(opt_key, config, cnt); break;
case coFloatsOrPercents:change_opt_keyFoP(opt_key, config, cnt); break;
case coPoints: change_opt_key<ConfigOptionPoints >(opt_key, config, cnt); break;
default: break;
}

View File

@ -724,6 +724,7 @@ void TabPrinter::init_options_list()
case coFloats: add_correct_opts_to_options_list<ConfigOptionFloats >(opt_key, m_options_list, this, m_opt_status_value); break;
case coStrings: add_correct_opts_to_options_list<ConfigOptionStrings >(opt_key, m_options_list, this, m_opt_status_value); break;
case coPercents:add_correct_opts_to_options_list<ConfigOptionPercents >(opt_key, m_options_list, this, m_opt_status_value); break;
case coFloatsOrPercents:add_correct_opts_to_options_list<ConfigOptionFloatsOrPercents>(opt_key, m_options_list, this, m_opt_status_value); break;
case coPoints: add_correct_opts_to_options_list<ConfigOptionPoints >(opt_key, m_options_list, this, m_opt_status_value); break;
default: m_options_list.emplace(opt_key, m_opt_status_value); break;
}
@ -776,6 +777,7 @@ void TabSLAMaterial::init_options_list()
case coFloats: add_correct_opts_to_options_list<ConfigOptionFloats >(opt_key, m_options_list, this, m_opt_status_value); break;
case coStrings: add_correct_opts_to_options_list<ConfigOptionStrings >(opt_key, m_options_list, this, m_opt_status_value); break;
case coPercents:add_correct_opts_to_options_list<ConfigOptionPercents >(opt_key, m_options_list, this, m_opt_status_value); break;
case coFloatsOrPercents:add_correct_opts_to_options_list<ConfigOptionFloatsOrPercents >(opt_key, m_options_list, this, m_opt_status_value); break;
case coPoints: add_correct_opts_to_options_list<ConfigOptionPoints >(opt_key, m_options_list, this, m_opt_status_value); break;
default: m_options_list.emplace(opt_key, m_opt_status_value); break;
}
@ -2286,7 +2288,8 @@ void TabFilament::add_filament_overrides_page()
const int extruder_idx = 0; // #ys_FIXME
for (const std::string opt_key : { "filament_retract_length",
for (const std::string opt_key : { "filament_retract_before_wipe",
"filament_retract_length",
"filament_retract_lift",
"filament_retract_lift_above",
"filament_retract_lift_below",
@ -2295,10 +2298,10 @@ void TabFilament::add_filament_overrides_page()
"filament_retract_restart_extra",
"filament_retract_before_travel",
"filament_retract_layer_change",
"filament_seam_gap",
"filament_wipe",
"filament_wipe_speed",
"filament_wipe_extra_perimeter",
"filament_retract_before_wipe"
"filament_wipe_extra_perimeter"
})
append_single_option_line(opt_key, extruder_idx);
}
@ -2314,7 +2317,8 @@ void TabFilament::update_filament_overrides_page()
return;
ConfigOptionsGroupShp optgroup = *og_it;
std::vector<std::string> opt_keys = { "filament_retract_length",
std::vector<std::string> opt_keys = { "filament_retract_before_wipe",
"filament_retract_length",
"filament_retract_lift",
"filament_retract_lift_above",
"filament_retract_lift_below",
@ -2323,10 +2327,10 @@ void TabFilament::update_filament_overrides_page()
"filament_retract_restart_extra",
"filament_retract_before_travel",
"filament_retract_layer_change",
"filament_seam_gap",
"filament_wipe",
"filament_wipe_speed",
"filament_wipe_extra_perimeter",
"filament_retract_before_wipe"
"filament_wipe_extra_perimeter"
};
const int extruder_idx = 0; // #ys_FIXME

View File

@ -942,6 +942,12 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig&
out = double_to_string(float_percent->value, opt->precision) + (float_percent->percent ? "%" : "");
return out;
}
case coFloatsOrPercents: {
const ConfigOptionFloatsOrPercents* floats_percents = config.opt<ConfigOptionFloatsOrPercents>(opt_key);
if (floats_percents)
out = double_to_string(floats_percents->get_at(opt_idx).value, opt->precision) + (floats_percents->get_at(opt_idx).percent ? "%" : "");
return out;
}
case coEnum: {
if (opt_key == "top_fill_pattern" ||
opt_key == "bottom_fill_pattern" ||